@axiom-lattice/react-sdk 8.1.0 → 8.1.2
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/{AgentDetailSideApp-J64Y7RKT.mjs → AgentDetailSideApp-ZSEYYLLD.mjs} +11 -11
- package/dist/AgentGovernanceWorkbench-NVQXK3VM.mjs +24 -0
- package/dist/{LangfuseDashboard-INSDUIPR.mjs → LangfuseDashboard-OHQOU74U.mjs} +2 -2
- package/dist/{MessageGraph-LEWE7BDE.mjs → MessageGraph-AJYUV6KO.mjs} +7 -7
- package/dist/{ReactChart-SBFZNQ2L.mjs → ReactChart-PVQCB6DJ.mjs} +7 -7
- package/dist/SkillFlow-IRNQI55E.mjs +14 -0
- package/dist/{TasksSideApp-GPD7GCPM.mjs → TasksSideApp-OJ5NHBIJ.mjs} +8 -8
- package/dist/ThreadMaintenancePanel-BGBGVU3W.mjs +12 -0
- package/dist/{TopologyRuntimeView-QHOSBVWW.mjs → TopologyRuntimeView-N7HDB2ZH.mjs} +8 -8
- package/dist/WorkflowAutomationView-TN4NHNLD.mjs +22 -0
- package/dist/{chunk-ZKYJP3RO.mjs → chunk-5RH6VC6U.mjs} +3 -3
- package/dist/{chunk-GPB3TMDZ.mjs → chunk-B7CF2V4Z.mjs} +4 -4
- package/dist/{chunk-LNTNCTWO.mjs → chunk-CBOSLYWQ.mjs} +3 -3
- package/dist/{chunk-IK53JBJ6.mjs → chunk-CEC7VWIE.mjs} +3 -3
- package/dist/{chunk-CD2UMRM5.mjs → chunk-H3WEVZMT.mjs} +2 -2
- package/dist/{chunk-5N54V24W.mjs → chunk-MCSBXLVL.mjs} +3 -3
- package/dist/{chunk-U22DSLN6.mjs → chunk-NTGALUWV.mjs} +10 -10
- package/dist/{chunk-24KHOHEI.mjs → chunk-QEZDPFJD.mjs} +2654 -2169
- package/dist/chunk-QEZDPFJD.mjs.map +1 -0
- package/dist/{chunk-XAOJDKE7.mjs → chunk-RSKPM2EX.mjs} +13 -4
- package/dist/{chunk-XAOJDKE7.mjs.map → chunk-RSKPM2EX.mjs.map} +1 -1
- package/dist/{chunk-5SGLNRLH.mjs → chunk-RSVCJORT.mjs} +4 -4
- package/dist/{chunk-OY2LSB3A.mjs → chunk-VZS7AXE2.mjs} +7 -7
- package/dist/{chunk-TLAIIWGR.mjs → chunk-WQEQWSBD.mjs} +8 -8
- package/dist/{chunk-7PNKDQYG.mjs → chunk-YMMOZ4SQ.mjs} +3 -3
- package/dist/{chunk-RON4XT5J.mjs → chunk-YYBZ2KBD.mjs} +4 -4
- package/dist/{embed-page-AgentDetailSideApp-6MHCQZ2W.js → embed-page-AgentDetailSideApp-23TCREK6.js} +1 -1
- package/dist/embed-page-AgentGovernanceWorkbench-N3F65F3W.js +1 -0
- package/dist/{embed-page-LangfuseDashboard-JWH5JGLY.js → embed-page-LangfuseDashboard-WBE7GJPU.js} +1 -1
- package/dist/{embed-page-MessageGraph-DJSV5HLH.js → embed-page-MessageGraph-T3EFAXTX.js} +1 -1
- package/dist/{embed-page-ReactChart-RSR3JSF6.js → embed-page-ReactChart-FJFQU4IV.js} +1 -1
- package/dist/{embed-page-SkillFlow-JZGJAG3O.js → embed-page-SkillFlow-2BUXCLAL.js} +1 -1
- package/dist/{embed-page-TasksSideApp-4LIXWO44.js → embed-page-TasksSideApp-VFKEYFGR.js} +1 -1
- package/dist/{embed-page-ThreadMaintenancePanel-7CWGP3ZK.js → embed-page-ThreadMaintenancePanel-EPBJ4J3L.js} +1 -1
- package/dist/{embed-page-TopologyRuntimeView-AVSCNALN.js → embed-page-TopologyRuntimeView-OWESU7IK.js} +1 -1
- package/dist/{embed-page-WorkflowAutomationView-RFYT2AIZ.js → embed-page-WorkflowAutomationView-5J2RQTZ7.js} +1 -1
- package/dist/{embed-page-chunk-U5A5D7IS.js → embed-page-chunk-2ZBEWYJQ.js} +1 -1
- package/dist/{embed-page-chunk-AICFKU43.js → embed-page-chunk-34RWKVD7.js} +1 -1
- package/dist/{embed-page-chunk-2XFJOQHZ.js → embed-page-chunk-6QLLZJVH.js} +1 -1
- package/dist/embed-page-chunk-B2KNZ3EW.js +59 -0
- package/dist/{embed-page-chunk-7CDMVSAB.js → embed-page-chunk-BFVNPGSW.js} +1 -1
- package/dist/embed-page-chunk-CKUSXUKW.js +6746 -0
- package/dist/{embed-page-chunk-PJJCN6GS.js → embed-page-chunk-CQLDPGEG.js} +1 -1
- package/dist/{embed-page-chunk-TSZQWEXD.js → embed-page-chunk-DJKD2PHO.js} +1 -1
- package/dist/{embed-page-chunk-IQ75BKOM.js → embed-page-chunk-EU32IF7M.js} +1 -1
- package/dist/{embed-page-chunk-T2HKN7ZS.js → embed-page-chunk-F7TA3LRH.js} +1 -1
- package/dist/embed-page-chunk-F7ZUYG42.js +121 -0
- package/dist/{embed-page-chunk-3VNL5M2Q.js → embed-page-chunk-GSUSX54K.js} +1 -1
- package/dist/embed-page-chunk-JMTQCORF.js +211 -0
- package/dist/{embed-page-chunk-EVZKWKMQ.js → embed-page-chunk-L7TDL27M.js} +1 -1
- package/dist/{embed-page-chunk-OIML5DX4.js → embed-page-chunk-PTKGTA4B.js} +1 -1
- package/dist/{embed-page-chunk-QJKFXJNR.js → embed-page-chunk-R7TLHZR3.js} +1 -1
- package/dist/{embed-page-chunk-KKUDX33F.js → embed-page-chunk-WKQHSEZ4.js} +1 -1
- package/dist/{embed-page-code-highlighter-DD23LJY3.js → embed-page-code-highlighter-72YW5HXH.js} +1 -1
- package/dist/embed-page-en-G5J7KW6V.js +1 -0
- package/dist/{embed-page-mermaid-IN3A3YH2.js → embed-page-mermaid-4PZJJXQU.js} +1 -1
- package/dist/embed-page-zh-72QSTYRF.js +1 -0
- package/dist/embed-page.js +1 -1
- package/dist/{en-WUCUNC4W.mjs → en-4BUDQBEG.mjs} +18 -1
- package/dist/en-4BUDQBEG.mjs.map +1 -0
- package/dist/index.d.mts +61 -34
- package/dist/index.d.ts +61 -34
- package/dist/index.js +1703 -1145
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +26 -15
- package/dist/index.mjs.map +1 -1
- package/dist/web-app.js +34 -0
- package/dist/web-app.js.map +1 -1
- package/dist/web-app.mjs +2 -2
- package/dist/{zh-YHX3NZ3D.mjs → zh-CRWCRGUL.mjs} +18 -1
- package/dist/zh-CRWCRGUL.mjs.map +1 -0
- package/package.json +3 -3
- package/dist/AgentGovernanceWorkbench-N5DMTNRS.mjs +0 -24
- package/dist/SkillFlow-U6I2VRDK.mjs +0 -14
- package/dist/ThreadMaintenancePanel-TNWSDFIP.mjs +0 -12
- package/dist/WorkflowAutomationView-5Q4ONV3C.mjs +0 -22
- package/dist/chunk-24KHOHEI.mjs.map +0 -1
- package/dist/embed-page-AgentGovernanceWorkbench-DZRR5VSK.js +0 -1
- package/dist/embed-page-chunk-A5GIM22E.js +0 -117
- package/dist/embed-page-chunk-JGFRDPYZ.js +0 -211
- package/dist/embed-page-chunk-TTFIPBIV.js +0 -6746
- package/dist/embed-page-chunk-WXMPVIXV.js +0 -59
- package/dist/embed-page-en-PQOH5CU4.js +0 -1
- package/dist/embed-page-zh-XO36BV2R.js +0 -1
- package/dist/en-WUCUNC4W.mjs.map +0 -1
- package/dist/zh-YHX3NZ3D.mjs.map +0 -1
- /package/dist/{AgentDetailSideApp-J64Y7RKT.mjs.map → AgentDetailSideApp-ZSEYYLLD.mjs.map} +0 -0
- /package/dist/{AgentGovernanceWorkbench-N5DMTNRS.mjs.map → AgentGovernanceWorkbench-NVQXK3VM.mjs.map} +0 -0
- /package/dist/{LangfuseDashboard-INSDUIPR.mjs.map → LangfuseDashboard-OHQOU74U.mjs.map} +0 -0
- /package/dist/{MessageGraph-LEWE7BDE.mjs.map → MessageGraph-AJYUV6KO.mjs.map} +0 -0
- /package/dist/{ReactChart-SBFZNQ2L.mjs.map → ReactChart-PVQCB6DJ.mjs.map} +0 -0
- /package/dist/{SkillFlow-U6I2VRDK.mjs.map → SkillFlow-IRNQI55E.mjs.map} +0 -0
- /package/dist/{TasksSideApp-GPD7GCPM.mjs.map → TasksSideApp-OJ5NHBIJ.mjs.map} +0 -0
- /package/dist/{ThreadMaintenancePanel-TNWSDFIP.mjs.map → ThreadMaintenancePanel-BGBGVU3W.mjs.map} +0 -0
- /package/dist/{TopologyRuntimeView-QHOSBVWW.mjs.map → TopologyRuntimeView-N7HDB2ZH.mjs.map} +0 -0
- /package/dist/{WorkflowAutomationView-5Q4ONV3C.mjs.map → WorkflowAutomationView-TN4NHNLD.mjs.map} +0 -0
- /package/dist/{chunk-ZKYJP3RO.mjs.map → chunk-5RH6VC6U.mjs.map} +0 -0
- /package/dist/{chunk-GPB3TMDZ.mjs.map → chunk-B7CF2V4Z.mjs.map} +0 -0
- /package/dist/{chunk-LNTNCTWO.mjs.map → chunk-CBOSLYWQ.mjs.map} +0 -0
- /package/dist/{chunk-IK53JBJ6.mjs.map → chunk-CEC7VWIE.mjs.map} +0 -0
- /package/dist/{chunk-CD2UMRM5.mjs.map → chunk-H3WEVZMT.mjs.map} +0 -0
- /package/dist/{chunk-5N54V24W.mjs.map → chunk-MCSBXLVL.mjs.map} +0 -0
- /package/dist/{chunk-U22DSLN6.mjs.map → chunk-NTGALUWV.mjs.map} +0 -0
- /package/dist/{chunk-5SGLNRLH.mjs.map → chunk-RSVCJORT.mjs.map} +0 -0
- /package/dist/{chunk-OY2LSB3A.mjs.map → chunk-VZS7AXE2.mjs.map} +0 -0
- /package/dist/{chunk-TLAIIWGR.mjs.map → chunk-WQEQWSBD.mjs.map} +0 -0
- /package/dist/{chunk-7PNKDQYG.mjs.map → chunk-YMMOZ4SQ.mjs.map} +0 -0
- /package/dist/{chunk-RON4XT5J.mjs.map → chunk-YYBZ2KBD.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Chat/AssistantContext.tsx","../src/theme/axiom-tokens.ts","../src/theme/axiom-antd-theme.ts","../src/theme/useAxiomTheme.ts","../src/components/Auth/LoginForm.tsx","../src/components/Auth/UserProfile.tsx","../src/components/Auth/TenantLogo.tsx","../src/hooks/useTenantBranding.ts","../src/components/Auth/TenantSelector.tsx","../src/components/Auth/ChangePasswordModal.tsx","../src/hooks/useTenants.ts","../src/context/WorkspaceContext.tsx","../src/components/Chat/ConversationContext.tsx","../src/components/Chat/ChatUIContext.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Assistant,\n CreateAssistantOptions,\n UpdateAssistantOptions,\n} from \"@axiom-lattice/client-sdk\";\nimport { useClient } from \"../../context\";\n\n/**\n * Assistant state interface\n */\nexport interface AssistantState {\n /**\n * List of all assistants\n */\n assistants: Assistant[];\n /**\n * Currently selected assistant\n */\n currentAssistant: Assistant | null;\n /**\n * Whether data is being loaded\n */\n isLoading: boolean;\n /**\n * Error message if any\n */\n error: Error | null;\n}\n\n/**\n * Assistant context value interface\n */\nexport interface AssistantContextValue extends AssistantState {\n /**\n * List all assistants\n */\n listAssistants: () => Promise<void>;\n /**\n * Get a single assistant by ID\n */\n getAssistant: (id: string) => Promise<Assistant>;\n /**\n * Create a new assistant\n */\n createAssistant: (options: CreateAssistantOptions) => Promise<Assistant>;\n /**\n * Update an existing assistant\n */\n updateAssistant: (\n id: string,\n options: UpdateAssistantOptions\n ) => Promise<Assistant>;\n /**\n * Delete an assistant\n */\n deleteAssistant: (id: string) => Promise<void>;\n /**\n * Select an assistant as current\n */\n selectAssistant: (id: string) => Promise<void>;\n /**\n * Clear the current assistant selection\n */\n clearCurrentAssistant: () => void;\n /**\n * Refresh the assistant list\n */\n refresh: () => Promise<void>;\n}\n\n/**\n * Assistant context\n */\nexport const AssistantContext = createContext<AssistantContextValue>({\n assistants: [],\n currentAssistant: null,\n isLoading: false,\n error: null,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n listAssistants: async () => { },\n getAssistant: async () => {\n throw new Error(\"Not implemented\");\n },\n createAssistant: async () => {\n throw new Error(\"Not implemented\");\n },\n updateAssistant: async () => {\n throw new Error(\"Not implemented\");\n },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n deleteAssistant: async () => { },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n selectAssistant: async () => { },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n clearCurrentAssistant: () => { },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n refresh: async () => { },\n});\n\n/**\n * Props for AssistantContextProvider\n */\nexport interface AssistantContextProviderProps {\n /**\n * Children components\n */\n children: React.ReactNode;\n /**\n * Whether to automatically load assistants on mount\n */\n autoLoad?: boolean;\n /**\n * Initial assistant ID to select\n */\n initialAssistantId?: string | null;\n}\n\n/**\n * Provider component for AssistantContext.\n * Manages assistant state and operations including CRUD, selection, and auto-loading.\n *\n * @description\n * Coordinates with the client SDK to provide assistant management:\n * - **Auto-load**: When `autoLoad` is `true` (default), fetches the assistant list on mount.\n * - **Auto-selection**: If `initialAssistantId` is provided, selects that assistant after loading.\n * Otherwise, auto-selects the first available assistant.\n * - **Re-selection**: If the currently selected assistant is removed from the list (e.g., deleted),\n * falls back to selecting the first available assistant.\n * - **CRUD operations**: Provides `createAssistant`, `updateAssistant`, `deleteAssistant`, and\n * `getAssistant` backed by the SDK, keeping local state in sync.\n *\n * Requires an {@link AxiomLatticeProvider} ancestor for the API client.\n *\n * @param props - {@link AssistantContextProviderProps}\n * @param props.children - React children to render within the assistant context.\n * @param props.autoLoad - Whether to automatically load assistants on mount. Defaults to `true`.\n * @param props.initialAssistantId - Optional assistant ID to auto-select on load.\n *\n * @returns A React context provider wrapping children with {@link AssistantContext.Provider}.\n *\n * @example\n * ```tsx\n * <AssistantContextProvider initialAssistantId=\"asst_123\">\n * <AssistantSelector />\n * </AssistantContextProvider>\n * ```\n */\nexport const AssistantContextProvider = ({\n children,\n autoLoad = true,\n initialAssistantId = null,\n}: AssistantContextProviderProps) => {\n // Use the client from AxiomLatticeProvider which already has tenantId configured\n const client = useClient(initialAssistantId || \"\");\n const [state, setState] = useState<AssistantState>({\n assistants: [],\n currentAssistant: null,\n isLoading: false,\n error: null,\n });\n // Use ref to access current assistants in callbacks\n const assistantsRef = useRef<Assistant[]>([]);\n useEffect(() => {\n assistantsRef.current = state.assistants;\n }, [state.assistants]);\n\n /**\n * List all assistants\n */\n const listAssistants = useCallback(async () => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const assistants = (await client.assistants.list()) ?? [];\n setState((prev) => ({\n ...prev,\n assistants,\n isLoading: false,\n currentAssistant:\n prev.currentAssistant &&\n assistants.some((assistant) => assistant.id === prev.currentAssistant?.id)\n ? prev.currentAssistant\n : prev.currentAssistant\n ? assistants[0] || null\n : null,\n }));\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n }\n }, [client]);\n\n /**\n * Get a single assistant by ID\n */\n const getAssistant = useCallback(\n async (id: string): Promise<Assistant> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const assistant = await client.assistants.get(id);\n setState((prev) => ({\n ...prev,\n // Update assistant in list if it exists\n assistants: prev.assistants.map((a) => (a.id === id ? assistant : a)),\n isLoading: false,\n }));\n return assistant;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Create a new assistant\n */\n const createAssistant = useCallback(\n async (options: CreateAssistantOptions): Promise<Assistant> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const newAssistant = await client.assistants.create(options);\n setState((prev) => ({\n ...prev,\n assistants: [...prev.assistants, newAssistant],\n isLoading: false,\n }));\n return newAssistant;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Update an existing assistant\n */\n const updateAssistant = useCallback(\n async (id: string, options: UpdateAssistantOptions): Promise<Assistant> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const updatedAssistant = await client.assistants.update(id, options);\n setState((prev) => ({\n ...prev,\n assistants: prev.assistants.map((a) =>\n a.id === id ? updatedAssistant : a\n ),\n currentAssistant:\n prev.currentAssistant?.id === id\n ? updatedAssistant\n : prev.currentAssistant,\n isLoading: false,\n }));\n return updatedAssistant;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Delete an assistant\n */\n const deleteAssistant = useCallback(\n async (id: string): Promise<void> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n await client.assistants.delete(id);\n setState((prev) => ({\n ...prev,\n assistants: prev.assistants.filter((a) => a.id !== id),\n currentAssistant:\n prev.currentAssistant?.id === id ? null : prev.currentAssistant,\n isLoading: false,\n }));\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Select an assistant as current\n */\n const selectAssistant = useCallback(\n async (id: string): Promise<void> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n // Check if assistant is already in the list using ref\n const assistant = assistantsRef.current.find((a) => a.id === id);\n\n if (!assistant) {\n // If not in list, fetch it\n const fetchedAssistant = await client.assistants.get(id);\n setState((prev) => ({\n ...prev,\n assistants: [...prev.assistants, fetchedAssistant],\n currentAssistant: fetchedAssistant,\n isLoading: false,\n }));\n } else {\n setState((prev) => ({\n ...prev,\n currentAssistant: assistant,\n isLoading: false,\n }));\n }\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Clear the current assistant selection\n */\n const clearCurrentAssistant = useCallback(() => {\n setState((prev) => ({\n ...prev,\n currentAssistant: null,\n }));\n }, []);\n\n /**\n * Refresh the assistant list\n */\n const refresh = useCallback(async () => {\n await listAssistants();\n }, [listAssistants]);\n\n // Auto-load assistants on mount if enabled\n useEffect(() => {\n if (autoLoad) {\n listAssistants();\n }\n }, [autoLoad, listAssistants]);\n\n // Select initial assistant if provided, or auto-select first assistant if not configured\n // Also re-select if currentAssistant is no longer in the assistants list\n useEffect(() => {\n console.log(\n \"[AssistantContext] selection effect fired\",\n {\n initialAssistantId,\n assistantsCount: state.assistants.length,\n currentAssistantId: state.currentAssistant?.id,\n currentAssistantName: state.currentAssistant?.name,\n }\n );\n\n if (state.assistants.length > 0) {\n const isCurrentAssistantValid =\n state.currentAssistant &&\n state.assistants.some((a) => a.id === state.currentAssistant?.id);\n\n console.log(\n \"[AssistantContext] isCurrentAssistantValid:\", isCurrentAssistantValid,\n \"initialAssistantId:\", initialAssistantId\n );\n\n if (!isCurrentAssistantValid) {\n if (initialAssistantId) {\n // Select the specified assistant\n const assistant = state.assistants.find(\n (a) => a.id === initialAssistantId\n );\n console.log(\n \"[AssistantContext] find result for\", initialAssistantId, \":\", assistant?.id ?? \"NOT FOUND\"\n );\n if (assistant) {\n setState((prev) => ({\n ...prev,\n currentAssistant: assistant,\n }));\n } else {\n // If initialAssistantId is not found, fallback to first assistant\n console.warn(\n `[AssistantContext] initialAssistantId \"${initialAssistantId}\" not found in assistant list, falling back to first assistant`,\n \"\\nassistants:\", state.assistants.map((a) => ({ id: a.id, name: a.name }))\n );\n setState((prev) => ({\n ...prev,\n currentAssistant: prev.assistants[0],\n }));\n }\n } else {\n // Auto-select the first assistant if no initialAssistantId is configured\n setState((prev) => ({\n ...prev,\n currentAssistant: prev.assistants[0],\n }));\n }\n }\n }\n }, [initialAssistantId, state.assistants, state.currentAssistant]);\n\n return (\n <AssistantContext.Provider\n value={{\n ...state,\n listAssistants,\n getAssistant,\n createAssistant,\n updateAssistant,\n deleteAssistant,\n selectAssistant,\n clearCurrentAssistant,\n refresh,\n }}\n >\n {children}\n </AssistantContext.Provider>\n );\n};\n\n/**\n * Hook to access AssistantContext\n * @returns Assistant context value\n * @throws Error if used outside of AssistantContextProvider\n */\nexport const useAssistantContext = (): AssistantContextValue => {\n const context = useContext(AssistantContext);\n\n if (!context) {\n throw new Error(\n \"useAssistantContext must be used within an AssistantContextProvider\"\n );\n }\n\n return context;\n};\n","/**\n * Axiom Theme Design Tokens\n *\n * Core design tokens for Axiom AI Design System.\n * Features: Indigo primary, medium radius, subtle shadows, slight transparency.\n */\n\n// ============================================\n// Color System\n// ============================================\n\nexport const colors = {\n // Primary - Indigo\n primary: {\n 50: '#f0f4ff',\n 100: '#e0e7ff',\n 200: '#c7d2fe',\n 300: '#a5b4fc',\n 400: '#818cf8',\n 500: '#6366f1', // main\n 600: '#4f46e5', // hover\n 700: '#4338ca',\n 800: '#3730a3',\n 900: '#312e81',\n },\n\n // Functional colors\n success: '#22c55e',\n warning: '#f59e0b',\n error: '#ef4444',\n info: '#3b82f6',\n\n // Neutral - Light Mode\n light: {\n bg: '#fafafa', // Page background\n surface: 'rgba(255, 255, 255, 1)', // Card background (slight transparency)\n surfaceHover: '#f9fafb',\n surfaceActive: '#f3f4f6',\n border: '#e5e7eb',\n borderHover: '#d1d5db',\n text: '#111827',\n textSecondary: '#6b7280',\n textMuted: '#9ca3af',\n },\n\n // Neutral - Dark Mode\n dark: {\n bg: '#0a0a0a',\n surface: 'rgba(23, 23, 23, 0.95)',\n surfaceHover: '#1f1f1f',\n surfaceActive: '#262626',\n border: '#27272a',\n borderHover: '#3f3f46',\n text: '#fafafa',\n textSecondary: '#a1a1aa',\n textMuted: '#71717a',\n },\n} as const;\n\n// ============================================\n// Border Radius - Medium\n// ============================================\n\nexport const radius = {\n none: '0',\n sm: '4px', // Small tags\n md: '10px', // Buttons, inputs\n lg: '16px', // Cards\n xl: '20px', // Large cards, modals (同步自 iOS 26)\n xxl: '28px', // Extra large containers\n xxxl: '32px', // Feature cards\n full: '9999px', // Fully rounded\n} as const;\n\n// ============================================\n// Spacing - 4px base\n// ============================================\n\nexport const spacing = {\n 0: '0',\n 1: '4px',\n 2: '8px',\n 3: '12px',\n 4: '16px',\n 5: '20px',\n 6: '24px',\n 8: '32px',\n 10: '40px',\n 12: '48px',\n} as const;\n\n// ============================================\n// Shadows - Subtle\n// ============================================\n\nexport const shadows = {\n none: 'none',\n sm: '0 1px 2px rgba(0, 0, 0, 0.04)',\n md: '0 2px 8px rgba(0, 0, 0, 0.06)', // Card default\n lg: '0 4px 12px rgba(0, 0, 0, 0.08)', // Card hover\n xl: '0 8px 24px rgba(0, 0, 0, 0.1)', // Modals\n} as const;\n\n// ============================================\n// Typography\n// ============================================\n\nexport const typography = {\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n\n sizes: {\n xs: { size: '12px', lineHeight: '16px', weight: 400 },\n sm: { size: '14px', lineHeight: '20px', weight: 400 },\n base: { size: '16px', lineHeight: '24px', weight: 400 },\n lg: { size: '18px', lineHeight: '28px', weight: 500 },\n xl: { size: '20px', lineHeight: '28px', weight: 600 },\n '2xl': { size: '24px', lineHeight: '32px', weight: 600 },\n },\n} as const;\n\n// ============================================\n// Animation\n// ============================================\n\nexport const animation = {\n duration: {\n fast: '150ms',\n normal: '250ms',\n slow: '350ms',\n },\n easing: {\n default: 'cubic-bezier(0.4, 0, 0.2, 1)',\n bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n },\n} as const;\n\n// ============================================\n// Complete Tokens Export\n// ============================================\n\nexport const axiomTokens = {\n colors,\n radius,\n spacing,\n shadows,\n typography,\n animation,\n} as const;\n\nexport default axiomTokens;\n","/**\n * Axiom Ant Design Theme Configuration\n *\n * Maps Axiom design tokens to Ant Design's theme system.\n * Used with ConfigProvider to style all antd components.\n */\n\nimport type { ThemeConfig } from 'antd';\nimport { axiomTokens } from './axiom-tokens';\n\n/**\n * Axiom Light Theme for Ant Design\n */\nexport const axiomAntdTheme: ThemeConfig = {\n token: {\n // ===== Colors =====\n colorPrimary: axiomTokens.colors.primary[500],\n colorPrimaryHover: axiomTokens.colors.primary[600],\n colorPrimaryActive: axiomTokens.colors.primary[700],\n\n colorSuccess: axiomTokens.colors.success,\n colorWarning: axiomTokens.colors.warning,\n colorError: axiomTokens.colors.error,\n colorInfo: axiomTokens.colors.info,\n\n // Text\n colorText: axiomTokens.colors.light.text,\n colorTextSecondary: axiomTokens.colors.light.textSecondary,\n colorTextTertiary: axiomTokens.colors.light.textMuted,\n\n // Backgrounds\n colorBgContainer: axiomTokens.colors.light.surface,\n colorBgElevated: axiomTokens.colors.light.surface,\n colorBgLayout: axiomTokens.colors.light.bg,\n\n // Borders\n colorBorder: axiomTokens.colors.light.border,\n colorBorderSecondary: axiomTokens.colors.light.borderHover,\n\n // ===== Typography =====\n fontFamily: axiomTokens.typography.fontFamily,\n fontSize: 16,\n fontSizeSM: 14,\n fontSizeLG: 18,\n lineHeight: 1.5,\n\n // ===== Border Radius =====\n borderRadius: 8, // md - buttons, inputs\n borderRadiusLG: 12, // lg - cards\n borderRadiusSM: 4, // sm - small elements\n borderRadiusXS: 2,\n\n // ===== Shadows =====\n boxShadow: axiomTokens.shadows.md,\n boxShadowSecondary: axiomTokens.shadows.lg,\n boxShadowTertiary: axiomTokens.shadows.xl,\n\n // ===== Animation =====\n motionDurationFast: axiomTokens.animation.duration.fast,\n motionDurationMid: axiomTokens.animation.duration.normal,\n motionDurationSlow: axiomTokens.animation.duration.slow,\n },\n\n // ===== Component Overrides =====\n components: {\n // Card - 12px radius, subtle shadow\n Card: {\n borderRadius: 12,\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.06)',\n },\n\n // Button - 8px radius, 40px height\n Button: {\n borderRadius: 8,\n controlHeight: 40,\n controlHeightLG: 44,\n controlHeightSM: 32,\n },\n\n // Input - 8px radius\n Input: {\n borderRadius: 8,\n controlHeight: 40,\n },\n\n // Modal - 16px radius\n Modal: {\n borderRadius: 16,\n },\n\n // Select - 8px radius\n Select: {\n borderRadius: 8,\n controlHeight: 40,\n },\n\n // Tag - 4px radius\n Tag: {\n borderRadius: 4,\n },\n\n // Alert\n Alert: {\n borderRadius: 8,\n },\n\n // Menu\n Menu: {\n borderRadius: 8,\n },\n\n // Dropdown\n Dropdown: {\n borderRadius: 8,\n },\n },\n};\n\n/**\n * Axiom Dark Theme for Ant Design\n */\nexport const axiomAntdThemeDark: ThemeConfig = {\n ...axiomAntdTheme,\n token: {\n ...axiomAntdTheme.token,\n // Dark mode colors\n colorText: axiomTokens.colors.dark.text,\n colorTextSecondary: axiomTokens.colors.dark.textSecondary,\n colorTextTertiary: axiomTokens.colors.dark.textMuted,\n\n colorBgContainer: axiomTokens.colors.dark.surface,\n colorBgElevated: axiomTokens.colors.dark.surface,\n colorBgLayout: axiomTokens.colors.dark.bg,\n colorBgMask: 'rgba(0, 0, 0, 0.7)',\n\n colorBorder: axiomTokens.colors.dark.border,\n colorBorderSecondary: axiomTokens.colors.dark.borderHover,\n },\n components: {\n ...axiomAntdTheme.components,\n // Modal needs explicit background override for dark mode\n Modal: {\n ...axiomAntdTheme.components?.Modal,\n colorBgElevated: axiomTokens.colors.dark.surface,\n },\n },\n};\n\n/**\n * Get Axiom theme based on dark mode preference\n */\nexport const getAxiomAntdTheme = (isDark = false): ThemeConfig => {\n return isDark ? axiomAntdThemeDark : axiomAntdTheme;\n};\n\nexport default axiomAntdTheme;\n","/**\n * useAxiomTheme Hook\n *\n * Provides access to Axiom design tokens and component styles.\n * Used for custom layouts and component-specific styling.\n * \n * Note: Ant Design components are automatically styled via ConfigProvider.\n * This hook is for custom elements and layout components only.\n */\n\nimport { createStyles } from 'antd-style';\nimport { axiomTokens } from './axiom-tokens';\n\nconst { colors, radius, spacing, shadows, typography, animation } = axiomTokens;\n\nexport const useAxiomTheme = () => {\n const { styles } = createStyles(({ css }) => ({\n // ============================================\n // Layout Containers\n // ============================================\n \n pageContainer: css`\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${spacing[8]};\n `,\n \n // ============================================\n // Card Styles (for custom cards, not antd Card)\n // ============================================\n \n card: css`\n background: ${colors.light.surface};\n border: 1px solid ${colors.light.border};\n border-radius: ${radius.lg};\n box-shadow: ${shadows.md};\n transition: all ${animation.duration.fast} ${animation.easing.default};\n \n &:hover {\n box-shadow: ${shadows.lg};\n }\n `,\n \n // ============================================\n // Header Section (for auth cards)\n // ============================================\n \n header: css`\n text-align: center;\n margin-bottom: ${spacing[8]};\n `,\n \n logo: css`\n width: 64px;\n height: 64px;\n background: ${colors.primary[500]};\n border-radius: ${radius.lg};\n margin: 0 auto ${spacing[5]};\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n \n title: css`\n margin: 0 0 ${spacing[2]} 0;\n font-size: ${typography.sizes.xl.size};\n font-weight: ${typography.sizes.xl.weight};\n color: ${colors.light.text};\n line-height: ${typography.sizes.xl.lineHeight};\n `,\n \n subtitle: css`\n font-size: ${typography.sizes.base.size};\n color: ${colors.light.textSecondary};\n margin: 0;\n line-height: ${typography.sizes.base.lineHeight};\n `,\n \n // ============================================\n // Form Elements (for custom forms, extends antd)\n // ============================================\n\n input: css`\n height: 44px;\n border-radius: ${radius.md};\n border: 1px solid ${colors.light.border};\n\n &:hover, &:focus {\n border-color: ${colors.primary[500]};\n }\n `,\n\n button: css`\n height: 44px;\n border-radius: ${radius.md};\n background: ${colors.primary[500]};\n border: none;\n\n &:hover {\n background: ${colors.primary[600]};\n }\n `,\n\n buttonGhost: css`\n height: 44px;\n border-radius: ${radius.md};\n background: transparent;\n border: 1px solid ${colors.light.border};\n color: ${colors.light.textSecondary};\n\n &:hover {\n border-color: ${colors.primary[500]};\n color: ${colors.primary[500]};\n }\n `,\n\n form: css`\n .ant-form-item {\n margin-bottom: ${spacing[4]};\n }\n\n .ant-form-item:last-child {\n margin-bottom: 0;\n }\n `,\n \n // ============================================\n // List Styles (for custom lists)\n // ============================================\n \n list: css`\n display: flex;\n flex-direction: column;\n gap: ${spacing[3]};\n margin-bottom: ${spacing[6]};\n `,\n \n listItem: css`\n display: flex;\n align-items: center;\n gap: ${spacing[4]};\n padding: ${spacing[4]};\n background: white;\n border: 1px solid ${colors.light.border};\n border-radius: ${radius.lg};\n cursor: pointer;\n transition: all ${animation.duration.fast} ${animation.easing.default};\n \n &:hover {\n border-color: ${colors.primary[500]};\n background: ${colors.light.surfaceHover};\n }\n \n &.selected {\n border-color: ${colors.primary[500]};\n background: ${colors.primary[100]}20;\n }\n `,\n \n listItemAvatar: css`\n width: 40px;\n height: 40px;\n border-radius: ${radius.md};\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${colors.light.border};\n color: ${colors.light.textSecondary};\n font-weight: 600;\n font-size: 16px;\n flex-shrink: 0;\n \n &.selected {\n background: ${colors.primary[500]};\n color: white;\n }\n `,\n \n listItemContent: css`\n flex: 1;\n min-width: 0;\n `,\n \n listItemTitle: css`\n font-size: ${typography.sizes.base.size};\n font-weight: 600;\n color: ${colors.light.text};\n margin: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n \n listItemDescription: css`\n font-size: ${typography.sizes.sm.size};\n color: ${colors.light.textSecondary};\n margin: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n \n // ============================================\n // Status & Feedback\n // ============================================\n \n alert: css`\n margin-bottom: ${spacing[5]};\n border-radius: ${radius.md};\n `,\n \n // ============================================\n // Footer\n // ============================================\n \n footer: css`\n margin-top: ${spacing[6]};\n padding-top: ${spacing[6]};\n border-top: 1px solid ${colors.light.border};\n text-align: center;\n `,\n \n // ============================================\n // Grid Layouts\n // ============================================\n \n grid: css`\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n gap: ${spacing[4]};\n `,\n \n // ============================================\n // Empty State\n // ============================================\n \n emptyIcon: css`\n width: 80px;\n height: 80px;\n border-radius: ${radius.xl};\n background: ${colors.light.surfaceHover};\n border: 1px solid ${colors.light.border};\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto ${spacing[5]};\n `,\n \n emptyTitle: css`\n font-size: ${typography.sizes.lg.size};\n font-weight: ${typography.sizes.lg.weight};\n color: ${colors.light.text};\n margin-bottom: ${spacing[1]};\n `,\n \n emptyDescription: css`\n font-size: ${typography.sizes.sm.size};\n color: ${colors.light.textSecondary};\n margin-bottom: ${spacing[5]};\n `,\n \n // ============================================\n // Create New Card (dashed border)\n // ============================================\n \n createCard: css`\n background: white;\n border: 1px dashed ${colors.light.borderHover};\n border-radius: ${radius.lg};\n transition: all ${animation.duration.fast} ${animation.easing.default};\n cursor: pointer;\n min-height: 140px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: ${spacing[3]};\n \n &:hover {\n border-color: ${colors.primary[500]};\n border-style: solid;\n background: ${colors.primary[50]};\n }\n `,\n \n createCardList: css`\n display: flex;\n align-items: center;\n gap: ${spacing[4]};\n padding: ${spacing[4]};\n background: white;\n border: 1px dashed ${colors.light.borderHover};\n border-radius: ${radius.md};\n transition: all ${animation.duration.fast} ${animation.easing.default};\n cursor: pointer;\n \n &:hover {\n border-color: ${colors.primary[500]};\n border-style: solid;\n background: ${colors.primary[50]};\n }\n `,\n \n createIconWrapper: css`\n width: 48px;\n height: 48px;\n border-radius: ${radius.md};\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${colors.light.surfaceHover};\n `,\n \n createText: css`\n font-size: ${typography.sizes.base.size};\n font-weight: 500;\n color: ${colors.light.textSecondary};\n `,\n }))();\n \n return {\n tokens: axiomTokens,\n styles,\n };\n};\n\nexport default useAxiomTheme;\n","/**\n * Login Form Components\n * Uses base styles from design system\n */\n\nimport React, { useState } from \"react\";\nimport { Button, Form, Input, Typography, Alert, Card } from \"antd\";\nimport { UserOutlined, LockOutlined, MailOutlined } from \"@ant-design/icons\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { Sparkles } from \"lucide-react\";\nimport { useAxiomTheme } from \"../../theme\";\nimport { useT } from \"../../i18n\";\n\nconst { Text } = Typography;\n\nexport interface LoginFormProps {\n onSuccess?: () => void;\n onCancel?: () => void;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n footer?: React.ReactNode;\n className?: string;\n}\n\nexport const LoginForm: React.FC<LoginFormProps> = ({\n onSuccess,\n onCancel,\n logo,\n title,\n subtitle,\n footer,\n className = \"\",\n}) => {\n // Prop defaults cannot be localized in the parameter list (it is evaluated\n // before the hook runs), so they are resolved here instead.\n const t = useT();\n const resolvedTitle = title ?? t(\"auth.login.title\");\n const resolvedSubtitle = subtitle ?? t(\"auth.login.subtitle\");\n const { styles } = useAxiomTheme();\n const { login, isLoading, error, clearError } = useAuth();\n const [form] = Form.useForm();\n\n const handleSubmit = async (values: { email: string; password: string }) => {\n clearError();\n try {\n await login(values.email, values.password);\n onSuccess?.();\n } catch { /* intentionally empty */ }\n };\n\n return (\n <Card className={`${styles.card} ${className}`} style={{ width: 400 }}>\n <div className={styles.header}>\n {logo || (\n <div className={styles.logo}>\n <Sparkles size={28} color=\"white\" />\n </div>\n )}\n <h2 className={styles.title}>{resolvedTitle}</h2>\n <p className={styles.subtitle}>{resolvedSubtitle}</p>\n </div>\n\n {error && (\n <Alert message={error} type=\"error\" showIcon className={styles.alert} />\n )}\n\n <Form form={form} onFinish={handleSubmit} layout=\"vertical\" className={styles.form}>\n <Form.Item name=\"email\" rules={[{ required: true }, { type: \"email\" }]}>\n <Input prefix={<MailOutlined />} placeholder={t(\"auth.field.email\")} className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"password\" rules={[{ required: true }]}>\n <Input.Password prefix={<LockOutlined />} placeholder={t(\"auth.field.password\")} className={styles.input} />\n </Form.Item>\n\n <Button type=\"primary\" htmlType=\"submit\" loading={isLoading} block>\n {t(\"auth.login.submit\")}\n </Button>\n\n {onCancel && (\n <Button onClick={onCancel} block className={styles.buttonGhost} style={{ marginTop: 8 }}>\n {t(\"common.cancel\")}\n </Button>\n )}\n </Form>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </Card>\n );\n};\n\nexport const LoginPage: React.FC<any> = (props) => {\n return (\n <div style={{ minHeight: '100vh', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <LoginForm {...props} />\n </div>\n );\n};\n\nexport interface RegisterFormProps {\n onSuccess?: () => void;\n onCancel?: () => void;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n footer?: React.ReactNode;\n className?: string;\n}\n\nexport const RegisterForm: React.FC<RegisterFormProps> = ({\n onSuccess,\n onCancel,\n logo,\n title,\n subtitle,\n footer,\n className = \"\",\n}) => {\n const t = useT();\n const resolvedTitle = title ?? t(\"auth.register.title\");\n const resolvedSubtitle = subtitle ?? t(\"auth.register.subtitle\");\n const { styles } = useAxiomTheme();\n const { login, register } = useAuth();\n const [form] = Form.useForm();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n\n const handleSubmit = async (values: {\n email: string;\n password: string;\n confirmPassword: string;\n name: string;\n }) => {\n setError(null);\n setSuccessMessage(null);\n\n if (values.password !== values.confirmPassword) {\n setError(t(\"auth.error.passwordMismatch\"));\n return;\n }\n\n setIsLoading(true);\n\n try {\n const result = await register(values.email, values.password, values.name);\n setSuccessMessage(result.message);\n\n if (result.token) {\n await login(values.email, values.password);\n onSuccess?.();\n } else {\n setTimeout(() => onSuccess?.(), 2000);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : t(\"auth.error.registerFailed\"));\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Card className={`${styles.card} ${className}`} style={{ width: 400 }}>\n <div className={styles.header}>\n {logo || (\n <div className={styles.logo}>\n <Sparkles size={28} color=\"white\" />\n </div>\n )}\n <h2 className={styles.title}>{resolvedTitle}</h2>\n <p className={styles.subtitle}>{resolvedSubtitle}</p>\n </div>\n\n {error && <Alert message={error} type=\"error\" showIcon className={styles.alert} />}\n {successMessage && <Alert message={successMessage} type=\"success\" showIcon className={styles.alert} />}\n\n <Form form={form} onFinish={handleSubmit} layout=\"vertical\" className={styles.form}>\n <Form.Item name=\"name\" rules={[{ required: true }]}>\n <Input prefix={<UserOutlined />} placeholder={t(\"auth.field.fullName\")} className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"email\" rules={[{ required: true }, { type: \"email\" }]}>\n <Input prefix={<MailOutlined />} placeholder={t(\"auth.field.email\")} className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"password\" rules={[{ required: true }, { min: 6 }]}>\n <Input.Password prefix={<LockOutlined />} placeholder={t(\"auth.field.password\")} className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"confirmPassword\" rules={[{ required: true }]}>\n <Input.Password prefix={<LockOutlined />} placeholder={t(\"auth.field.confirmPassword\")} className={styles.input} />\n </Form.Item>\n\n <Button type=\"primary\" htmlType=\"submit\" loading={isLoading} block>\n {t(\"auth.register.submit\")}\n </Button>\n\n {onCancel && (\n <Button onClick={onCancel} block className={styles.buttonGhost} style={{ marginTop: 8 }}>\n {t(\"common.cancel\")}\n </Button>\n )}\n </Form>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </Card>\n );\n};\n","/**\n * User Profile Components\n * Using Axiom Theme with Ant Design\n */\n\nimport React from \"react\";\nimport { Button, Avatar, Typography, Space, Card, Spin } from \"antd\";\nimport { LogOut, User, Building2 } from \"lucide-react\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { useT } from \"../../i18n\";\n\nconst { Text } = Typography;\n\nexport interface UserProfileProps {\n /** Called when user clicks logout */\n onLogout?: () => void;\n /** Show tenant information */\n showTenantSwitcher?: boolean;\n /** Custom class name */\n className?: string;\n}\n\n/**\n * User Profile Component\n */\nexport const UserProfile: React.FC<UserProfileProps> = ({\n onLogout,\n showTenantSwitcher = true,\n className = \"\",\n}) => {\n const t = useT();\n const { user, currentTenant, logout, isLoading } = useAuth();\n\n if (!user) {\n return null;\n }\n\n const handleLogout = () => {\n logout();\n onLogout?.();\n };\n\n const userInitial = user.name?.charAt(0).toUpperCase() || user.email.charAt(0).toUpperCase();\n\n return (\n <Card\n className={className}\n style={{ width: 320, borderRadius: 20 }}\n bodyStyle={{ padding: 24 }}\n >\n <Space direction=\"vertical\" size={20} style={{ width: \"100%\" }}>\n {/* User Info */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16 }}>\n <Avatar\n size={56}\n style={{\n background: `linear-gradient(135deg, ${'#6366f1'} 0%, ${'#818cf8'} 100%)`,\n color: \"white\",\n fontSize: 22,\n fontWeight: 700,\n flexShrink: 0,\n }}\n >\n {userInitial}\n </Avatar>\n \n <div style={{ flex: 1, minWidth: 0 }}>\n <Text\n style={{\n fontWeight: 600,\n marginBottom: 4,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"block\",\n fontSize: 16,\n }}\n >\n {user.name || user.email}\n </Text>\n <Text\n type=\"secondary\"\n style={{\n fontSize: 13,\n display: \"block\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {user.email}\n </Text>\n </div>\n </div>\n\n {/* Tenant Info */}\n {showTenantSwitcher && currentTenant && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: 12,\n background: '#f2f2f7',\n borderRadius: 12,\n }}\n >\n <Building2 size={18} color=\"#6366f1\" />\n <div style={{ flex: 1, minWidth: 0 }}>\n <Text\n style={{\n fontSize: 11,\n color: '#8e8e93',\n textTransform: \"uppercase\",\n letterSpacing: 0.5,\n display: \"block\",\n marginBottom: 2,\n }}\n >\n {t(\"auth.user.currentWorkspace\")}\n </Text>\n <Text\n style={{\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"block\",\n }}\n >\n {currentTenant.name}\n </Text>\n </div>\n </div>\n )}\n\n {/* Logout Button */}\n <Button\n onClick={handleLogout}\n disabled={isLoading}\n block\n icon={<LogOut size={18} />}\n danger\n size=\"large\"\n style={{ height: 48 }}\n >\n {isLoading ? t(\"auth.user.loggingOut\") : t(\"auth.user.logout\")}\n </Button>\n </Space>\n </Card>\n );\n};\n\nexport interface ProtectedRouteProps {\n children: React.ReactNode;\n /** Component to show when not authenticated */\n fallback?: React.ReactNode;\n /** Redirect URL (if using react-router) */\n redirectTo?: string;\n}\n\n/**\n * Protected Route Component\n * Shows loading state, redirects, or fallback when not authenticated\n */\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({\n children,\n fallback,\n redirectTo,\n}) => {\n const t = useT();\n const { isAuthenticated, isLoading } = useAuth();\n\n if (isLoading) {\n return (\n <div\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: '#f2f2f7',\n }}\n >\n <Card style={{ borderRadius: 20 }}>\n <div style={{ textAlign: \"center\", padding: \"32px 48px\" }}>\n <Spin size=\"large\" />\n <Text type=\"secondary\" style={{ display: 'block', marginTop: 16 }}>{t(\"common.loading\")}</Text>\n </div>\n </Card>\n </div>\n );\n }\n\n if (!isAuthenticated) {\n if (fallback) {\n return <>{fallback}</>;\n }\n if (redirectTo && typeof window !== \"undefined\") {\n window.location.href = redirectTo;\n return null;\n }\n return (\n <div\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: '#f2f2f7',\n padding: 32,\n }}\n >\n <Card style={{ textAlign: \"center\", borderRadius: 20 }}>\n <div\n style={{\n width: 64,\n height: 64,\n background: '#e5e5ea',\n borderRadius: 16,\n margin: \"0 auto 20px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <User size={28} color=\"#8e8e93\" />\n </div>\n <Typography.Title level={4} style={{ marginBottom: 8 }}>\n {t(\"auth.protected.title\")}\n </Typography.Title>\n <Text type=\"secondary\">\n {t(\"auth.protected.description\")}\n </Text>\n </Card>\n </div>\n );\n }\n\n return <>{children}</>;\n};\n","import React, { useState, useEffect } from \"react\";\nimport { Building2 } from \"lucide-react\";\nimport { useT } from \"../../i18n\";\n\nexport interface TenantLogoProps {\n /** Tenant logo URL (or null if not configured) */\n logoUrl: string | null;\n /** Logo size in pixels (default 28, matches Menu's default Cpu size) */\n size?: number;\n /** Fallback icon color (default #1677ff to match Menu's Cpu icon) */\n fallbackColor?: string;\n /** Tenant name for accessible alt text */\n tenantName?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Renders a tenant's logo image with fallback to the Building2 icon.\n *\n * On image load error, switches to Building2 icon.\n * When logoUrl changes, resets error state so the new URL is attempted.\n * When no logoUrl is provided, renders Building2 immediately.\n */\nexport const TenantLogo: React.FC<TenantLogoProps> = ({\n logoUrl,\n size = 28,\n fallbackColor = \"#1677ff\",\n tenantName,\n className,\n}) => {\n const t = useT();\n const [imgError, setImgError] = useState(false);\n\n useEffect(() => {\n setImgError(false);\n }, [logoUrl]);\n\n if (!logoUrl || imgError) {\n return <Building2 size={size} color={fallbackColor} className={className} />;\n }\n\n return (\n <img\n src={logoUrl}\n alt={\n tenantName\n ? t(\"auth.tenantLogo.alt\", { name: tenantName })\n : t(\"auth.tenantLogo.altFallback\")\n }\n width={size}\n height={size}\n referrerPolicy=\"no-referrer\"\n style={{\n borderRadius: 4,\n objectFit: \"contain\",\n display: \"block\",\n }}\n onError={() => setImgError(true)}\n className={className}\n />\n );\n};\n","import { useAuth } from \"../context/AuthContext\";\nimport { useMemo } from \"react\";\n\nexport interface TenantBrandingData {\n /** Raw logo URL from tenant metadata, or null if not configured */\n logoUrl: string | null;\n /** Current tenant name, or empty string if no tenant selected */\n tenantName: string;\n}\n\nexport const getLogoSrc = (metadata?: Record<string, unknown>): string | null => {\n const url = metadata?.logoUrl;\n return typeof url === \"string\" && url.length > 0 ? url : null;\n};\n\n/**\n * Reads the current tenant's branding information from AuthContext.\n * Extracts `metadata.logoUrl` and tenant name for use in UI components.\n *\n * @returns Tenant branding data — logo URL and name.\n */\nexport function useTenantBranding(): TenantBrandingData {\n const { currentTenant } = useAuth();\n\n return useMemo(() => {\n const logoUrl = getLogoSrc(currentTenant?.metadata as Record<string, unknown>);\n const tenantName = currentTenant?.name ?? \"\";\n\n return { logoUrl, tenantName };\n }, [currentTenant?.metadata?.logoUrl, currentTenant?.name]);\n}\n","/**\n * Tenant Selector\n *\n * Picker for choosing a tenant. Designed for the \"many tenants\" case:\n * search + a card grid in its own scroll region, and a footer that stays\n * pinned so Confirm is always reachable.\n *\n * The grid is one column for a handful of tenants and two columns once the\n * list grows (6+). The API is permission-managed and only returns tenants the\n * user may see, so there is no status filter.\n *\n * Renders correctly both inside a modal (the two Chat hosts) and standalone\n * centered on a page (apps/web), so the panel is width:100% + maxWidth rather\n * than a fixed width.\n */\n\nimport React, { useState, useEffect, useMemo, useCallback } from \"react\";\nimport { Tenant } from \"@axiom-lattice/protocols\";\nimport { Button, Input, Spin, theme } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { X, Search, ArrowRight, LogOut } from \"lucide-react\";\nimport { TenantLogo } from \"./TenantLogo\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { getLogoSrc } from \"../../hooks/useTenantBranding\";\nimport { useT } from \"../../i18n\";\n\nconst { useToken } = theme;\n\n/** Two columns once the visible list reaches this size; one below it. */\nconst TWO_COLUMN_THRESHOLD = 6;\n\nconst useStyles = createStyles(({ token, css }) => ({\n surface: css`\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: 720px;\n max-height: min(84vh, 760px);\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: 16px;\n box-shadow: ${token.boxShadowSecondary};\n overflow: hidden;\n `,\n\n closeButton: css`\n position: absolute;\n top: 12px;\n right: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: ${token.colorTextTertiary};\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n\n &:hover {\n background: ${token.colorFillSecondary};\n color: ${token.colorText};\n }\n\n &:focus-visible {\n outline: 2px solid ${token.colorPrimary};\n outline-offset: 2px;\n }\n `,\n\n // ============================================\n // Header\n // ============================================\n\n header: css`\n flex-shrink: 0;\n padding: 24px 24px 16px;\n text-align: center;\n `,\n\n logo: css`\n width: 64px;\n height: 64px;\n background: ${token.colorPrimary};\n border-radius: 16px;\n margin: 0 auto 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n\n title: css`\n margin: 0 0 4px;\n font-size: ${token.fontSizeHeading4}px;\n font-weight: 600;\n color: ${token.colorText};\n line-height: 1.4;\n `,\n\n subtitle: css`\n margin: 0;\n font-size: ${token.fontSize}px;\n color: ${token.colorTextSecondary};\n line-height: 1.5;\n `,\n\n // ============================================\n // Toolbar\n // ============================================\n\n toolbar: css`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 24px 12px;\n `,\n\n // ============================================\n // Scroll region — the list scrolls, not the panel\n // ============================================\n\n scrollRegion: css`\n flex: 1 1 auto;\n min-height: 120px;\n max-height: min(52vh, 460px);\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0 24px;\n position: relative;\n\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n &::-webkit-scrollbar-thumb {\n background: ${token.colorBorder};\n border-radius: 4px;\n }\n `,\n\n grid: css`\n display: grid;\n gap: ${token.marginSM}px;\n padding-bottom: 4px;\n `,\n\n gridOne: css`\n grid-template-columns: minmax(0, 1fr);\n `,\n\n gridTwo: css`\n grid-template-columns: repeat(2, minmax(0, 1fr));\n\n @media (max-width: 480px) {\n grid-template-columns: minmax(0, 1fr);\n }\n `,\n\n // ============================================\n // Tenant card\n // ============================================\n\n card: css`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n min-height: 64px;\n width: 100%;\n min-width: 0;\n text-align: left;\n /* A <button> does not inherit the page font by default. */\n font: inherit;\n color: inherit;\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: 12px;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n\n &:hover {\n border-color: ${token.colorPrimaryBorder};\n background: ${token.colorFillQuaternary};\n }\n\n &:focus-visible {\n outline: 2px solid ${token.colorPrimary};\n outline-offset: 2px;\n }\n\n /* The border + tint is the whole selected affordance — no check icon. */\n &[aria-pressed=\"true\"] {\n border-color: ${token.colorPrimary};\n background: ${token.colorPrimaryBg};\n }\n `,\n\n avatar: css`\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n font-size: ${token.fontSizeLG}px;\n font-weight: 600;\n `,\n\n cardBody: css`\n flex: 1;\n min-width: 0;\n `,\n\n cardName: css`\n margin: 0;\n font-size: ${token.fontSize}px;\n font-weight: 600;\n line-height: 1.4;\n color: ${token.colorText};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n\n cardDescription: css`\n margin: 2px 0 0;\n font-size: ${token.fontSizeSM}px;\n line-height: 1.4;\n color: ${token.colorTextTertiary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n\n // ============================================\n // Empty / loading states\n // ============================================\n\n centeredBody: css`\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 48px 24px;\n text-align: center;\n color: ${token.colorTextSecondary};\n `,\n\n emptyTitle: css`\n font-size: ${token.fontSizeLG}px;\n font-weight: 600;\n color: ${token.colorText};\n `,\n\n // ============================================\n // Footer — pinned\n // ============================================\n\n footer: css`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 16px 24px;\n border-top: 1px solid ${token.colorBorderSecondary};\n background: ${token.colorFillQuaternary};\n `,\n\n srOnly: css`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n `,\n}));\n\nexport interface TenantSelectorProps {\n tenants: Tenant[];\n currentTenantId?: string | null;\n onSelect: (tenant: Tenant) => void;\n /** Renders a \"Log Out\" button in the footer when no onCancel is given. */\n onLogout?: () => void;\n /**\n * When provided, renders a Cancel button and a close icon in the panel header.\n * Omit for a flow the user cannot back out of (e.g. first-run tenant selection).\n */\n onCancel?: () => void;\n isLoading?: boolean;\n className?: string;\n title?: string;\n description?: string;\n}\n\nexport const TenantSelector: React.FC<TenantSelectorProps> = ({\n tenants,\n currentTenantId,\n onSelect,\n onLogout,\n onCancel,\n isLoading = false,\n className = \"\",\n title,\n description,\n}) => {\n // Prop defaults are resolved in the body so they can be localized.\n const t = useT();\n const resolvedTitle = title ?? t(\"auth.tenant.selectTitle\");\n const resolvedDescription = description ?? t(\"auth.tenant.chooseDescription\");\n const { styles } = useStyles();\n const { token } = useToken();\n const { logout } = useAuth();\n\n const [selectedId, setSelectedId] = useState<string | null>(currentTenantId ?? null);\n const [search, setSearch] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n useEffect(() => {\n setSelectedId(currentTenantId ?? null);\n }, [currentTenantId]);\n\n const filtered = useMemo(() => {\n const query = search.trim().toLowerCase();\n if (!query) return tenants;\n return tenants.filter(\n (tenant) =>\n tenant.name.toLowerCase().includes(query) ||\n (tenant.description ?? \"\").toLowerCase().includes(query)\n );\n }, [tenants, search]);\n\n // Deliberately keyed off `tenants`, not `filtered`: a tenant hidden by the\n // search must not silently disable Confirm.\n const canConfirm = !!selectedId && tenants.some((t) => t.id === selectedId);\n const isFiltering = search.trim().length > 0;\n\n const handleContinue = useCallback(async () => {\n const tenant = tenants.find((t) => t.id === selectedId);\n if (!tenant) return;\n setIsSubmitting(true);\n try {\n await onSelect(tenant);\n } finally {\n setIsSubmitting(false);\n }\n }, [tenants, selectedId, onSelect]);\n\n const handleLogout = useCallback(() => {\n logout();\n onLogout?.();\n }, [logout, onLogout]);\n\n const handleResetSearch = useCallback(() => {\n setSearch(\"\");\n }, []);\n\n const selectedTenant = tenants.find((t) => t.id === selectedId);\n const headerLogoUrl = getLogoSrc(selectedTenant?.metadata as Record<string, unknown>);\n const hasHeaderLogo = !!headerLogoUrl;\n\n const closeButton = onCancel ? (\n <button\n type=\"button\"\n className={styles.closeButton}\n onClick={onCancel}\n aria-label={t(\"common.close\")}\n >\n <X size={16} />\n </button>\n ) : null;\n\n if (isLoading) {\n return (\n <div className={`${styles.surface} ${className}`}>\n {closeButton}\n <div className={styles.centeredBody}>\n <Spin />\n <span>{t(\"common.loading\")}</span>\n </div>\n </div>\n );\n }\n\n if (tenants.length === 0) {\n return (\n <div className={`${styles.surface} ${className}`}>\n {closeButton}\n <div className={styles.centeredBody}>\n <span className={styles.emptyTitle}>{t(\"auth.tenant.noWorkspaces\")}</span>\n <span>{t(\"auth.tenant.noWorkspacesHint\")}</span>\n </div>\n {onLogout && (\n <div className={styles.footer}>\n <Button onClick={handleLogout} icon={<LogOut size={16} />}>\n {t(\"auth.tenant.logout\")}\n </Button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={`${styles.surface} ${className}`}>\n {closeButton}\n\n <div className={styles.header}>\n <div\n className={styles.logo}\n style={hasHeaderLogo ? { background: \"transparent\" } : undefined}\n >\n <TenantLogo\n logoUrl={headerLogoUrl}\n size={hasHeaderLogo ? 48 : 28}\n fallbackColor=\"white\"\n />\n </div>\n <h2 className={styles.title}>{resolvedTitle}</h2>\n <p className={styles.subtitle}>{resolvedDescription}</p>\n </div>\n\n <div className={styles.toolbar}>\n <Input\n style={{ flex: 1, minWidth: 0 }}\n placeholder={t(\"auth.tenant.searchPlaceholder\")}\n aria-label={t(\"auth.tenant.searchAriaLabel\")}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onPressEnter={() => {\n if (canConfirm) handleContinue();\n }}\n prefix={<Search size={16} style={{ color: token.colorTextTertiary }} />}\n allowClear\n autoFocus\n />\n </div>\n\n <div className={styles.scrollRegion}>\n <span className={styles.srOnly} aria-live=\"polite\">\n {filtered.length}{\" \"}\n {filtered.length === 1\n ? t(\"auth.tenant.countOne\")\n : t(\"auth.tenant.countOther\")}\n </span>\n\n {filtered.length === 0 ? (\n <div className={styles.centeredBody}>\n <span className={styles.emptyTitle}>{t(\"auth.tenant.noMatch\")}</span>\n <span>{t(\"auth.tenant.noMatchHint\")}</span>\n {isFiltering && (\n <Button size=\"small\" onClick={handleResetSearch}>\n {t(\"auth.tenant.showAll\")}\n </Button>\n )}\n </div>\n ) : (\n <div\n data-testid=\"tenant-grid\"\n data-columns={filtered.length >= TWO_COLUMN_THRESHOLD ? 2 : 1}\n className={`${styles.grid} ${\n filtered.length >= TWO_COLUMN_THRESHOLD ? styles.gridTwo : styles.gridOne\n }`}\n >\n {filtered.map((tenant) => {\n const isSelected = selectedId === tenant.id;\n const logoSrc = getLogoSrc(tenant.metadata as Record<string, unknown>);\n\n return (\n <button\n key={tenant.id}\n type=\"button\"\n aria-pressed={isSelected}\n data-testid=\"tenant-option\"\n data-tenant-id={tenant.id}\n data-tenant-name={tenant.name}\n className={styles.card}\n onClick={() => setSelectedId(tenant.id)}\n >\n <div\n className={styles.avatar}\n style={{\n background: logoSrc\n ? \"transparent\"\n : isSelected\n ? token.colorPrimary\n : token.colorFillSecondary,\n }}\n >\n {logoSrc ? (\n <TenantLogo logoUrl={logoSrc} size={28} />\n ) : (\n <span\n style={{\n color: isSelected ? \"white\" : token.colorTextSecondary,\n }}\n >\n {tenant.name.charAt(0).toUpperCase() || \"?\"}\n </span>\n )}\n </div>\n\n <div className={styles.cardBody}>\n <p className={styles.cardName}>{tenant.name}</p>\n {tenant.description && (\n <p className={styles.cardDescription}>{tenant.description}</p>\n )}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n <div className={styles.footer}>\n {onCancel ? (\n <Button onClick={onCancel}>{t(\"common.cancel\")}</Button>\n ) : onLogout ? (\n <Button onClick={handleLogout} icon={<LogOut size={16} />}>\n {t(\"auth.tenant.logout\")}\n </Button>\n ) : (\n <span />\n )}\n\n <Button\n type=\"primary\"\n onClick={handleContinue}\n loading={isSubmitting}\n disabled={!canConfirm}\n icon={<ArrowRight size={16} />}\n >\n {t(\"common.confirm\")}\n </Button>\n </div>\n </div>\n );\n};\n\nexport default TenantSelector;\n","import React, { useState } from \"react\";\nimport { Modal, Form, Input, Button, Alert } from \"antd\";\nimport { LockOutlined } from \"@ant-design/icons\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { useT } from \"../../i18n\";\n\nexport interface ChangePasswordModalProps {\n open: boolean;\n onClose: () => void;\n onSuccess?: () => void;\n}\n\nexport const ChangePasswordModal: React.FC<ChangePasswordModalProps> = ({\n open,\n onClose,\n onSuccess,\n}) => {\n const t = useT();\n const { changePassword, isLoading } = useAuth();\n const [form] = Form.useForm();\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n\n const handleSubmit = async (values: {\n currentPassword: string;\n newPassword: string;\n confirmPassword: string;\n }) => {\n setError(null);\n setSuccess(false);\n\n if (values.newPassword !== values.confirmPassword) {\n setError(t(\"auth.error.passwordMismatch\"));\n return;\n }\n\n try {\n await changePassword(values.currentPassword, values.newPassword);\n setSuccess(true);\n form.resetFields();\n onSuccess?.();\n setTimeout(() => {\n onClose();\n setSuccess(false);\n }, 1500);\n } catch (err) {\n setError(err instanceof Error ? err.message : t(\"auth.changePassword.failed\"));\n }\n };\n\n const handleCancel = () => {\n form.resetFields();\n setError(null);\n setSuccess(false);\n onClose();\n };\n\n return (\n <Modal\n title={t(\"auth.changePassword.title\")}\n open={open}\n onCancel={handleCancel}\n footer={null}\n width={400}\n >\n {error && (\n <Alert\n message={error}\n type=\"error\"\n showIcon\n style={{ marginBottom: 16 }}\n />\n )}\n {success && (\n <Alert\n message={t(\"auth.changePassword.success\")}\n type=\"success\"\n showIcon\n style={{ marginBottom: 16 }}\n />\n )}\n\n <Form\n form={form}\n onFinish={handleSubmit}\n layout=\"vertical\"\n >\n <Form.Item\n name=\"currentPassword\"\n rules={[\n { required: true, message: t(\"auth.changePassword.currentRequired\") },\n ]}\n >\n <Input.Password\n prefix={<LockOutlined />}\n placeholder={t(\"auth.field.currentPassword\")}\n />\n </Form.Item>\n\n <Form.Item\n name=\"newPassword\"\n rules={[\n { required: true, message: t(\"auth.changePassword.newRequired\") },\n { min: 6, message: t(\"auth.changePassword.tooShort\") },\n ]}\n >\n <Input.Password\n prefix={<LockOutlined />}\n placeholder={t(\"auth.field.newPassword\")}\n />\n </Form.Item>\n\n <Form.Item\n name=\"confirmPassword\"\n rules={[\n { required: true, message: t(\"auth.changePassword.confirmRequired\") },\n ]}\n >\n <Input.Password\n prefix={<LockOutlined />}\n placeholder={t(\"auth.field.confirmNewPassword\")}\n />\n </Form.Item>\n\n <Form.Item style={{ marginBottom: 0 }}>\n <Button\n type=\"primary\"\n htmlType=\"submit\"\n loading={isLoading}\n block\n >\n {t(\"auth.changePassword.submit\")}\n </Button>\n </Form.Item>\n </Form>\n </Modal>\n );\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { Tenant } from \"@axiom-lattice/protocols\";\nimport { useT } from \"../i18n\";\n\nexport interface UseTenantsOptions {\n baseURL: string;\n token?: string;\n}\n\nexport interface UseTenantsReturn {\n tenants: Tenant[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n getTenantById: (id: string) => Tenant | undefined;\n}\n\n/**\n * Fetches and manages a list of tenants from the API.\n *\n * @param options - Configuration options\n * @param options.baseURL - The base URL of the API gateway\n * @param options.token - Optional authentication token\n * @returns Tenant list, loading state, error, refresh function, and lookup helper\n *\n * @example\n * ```tsx\n * const { tenants, isLoading, error, refresh, getTenantById } = useTenants({\n * baseURL: \"https://api.example.com\",\n * token: \"your-auth-token\",\n * });\n * ```\n */\nexport function useTenants(options: UseTenantsOptions): UseTenantsReturn {\n const { baseURL, token } = options;\n const t = useT();\n const [tenants, setTenants] = useState<Tenant[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchTenants = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(`${baseURL}/api/tenants`, { headers });\n \n if (!response.ok) {\n throw new Error(t(\"auth.error.fetchTenantsFailed\"));\n }\n\n const { data } = await response.json();\n setTenants(data || []);\n } catch (err) {\n const message = err instanceof Error ? err.message : t(\"auth.error.fetchTenantsFailed\");\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [baseURL, token, t]);\n\n useEffect(() => {\n fetchTenants();\n }, [fetchTenants]);\n\n const getTenantById = useCallback((id: string) => {\n return tenants.find(t => t.id === id);\n }, [tenants]);\n\n return {\n tenants,\n isLoading,\n error,\n refresh: fetchTenants,\n getTenantById,\n };\n}\n\nexport interface UseUsersOptions {\n baseURL: string;\n tenantId: string;\n token?: string;\n}\n\nexport interface UseUsersReturn {\n users: import(\"@axiom-lattice/protocols\").User[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n searchByEmail: (email: string) => Promise<import(\"@axiom-lattice/protocols\").User | null>;\n}\n\n/**\n * Fetches and manages a list of users within a tenant.\n *\n * @param options - Configuration options\n * @param options.baseURL - The base URL of the API gateway\n * @param options.tenantId - The tenant ID to fetch users for\n * @param options.token - Optional authentication token\n * @returns User list, loading state, error, refresh function, and email search helper\n *\n * @example\n * ```tsx\n * const { users, isLoading, error, searchByEmail } = useUsers({\n * baseURL: \"https://api.example.com\",\n * tenantId: \"tenant-123\",\n * });\n *\n * const user = await searchByEmail(\"user@example.com\");\n * ```\n */\nexport function useUsers(options: UseUsersOptions): UseUsersReturn {\n const { baseURL, tenantId, token } = options;\n const t = useT();\n const [users, setUsers] = useState<import(\"@axiom-lattice/protocols\").User[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchUsers = useCallback(async () => {\n if (!tenantId) return;\n \n setIsLoading(true);\n setError(null);\n try {\n const headers: Record<string, string> = {\n \"x-tenant-id\": tenantId,\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(`${baseURL}/api/users`, { headers });\n \n if (!response.ok) {\n throw new Error(t(\"auth.error.fetchUsersFailed\"));\n }\n\n const { data } = await response.json();\n setUsers(data || []);\n } catch (err) {\n const message = err instanceof Error ? err.message : t(\"auth.error.fetchUsersFailed\");\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [baseURL, tenantId, token, t]);\n\n useEffect(() => {\n fetchUsers();\n }, [fetchUsers]);\n\n const searchByEmail = useCallback(async (email: string) => {\n if (!tenantId || !email) return null;\n \n try {\n const headers: Record<string, string> = {\n \"x-tenant-id\": tenantId,\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(\n `${baseURL}/api/users?email=${encodeURIComponent(email)}`,\n { headers }\n );\n \n if (!response.ok) {\n return null;\n }\n\n const { data } = await response.json();\n return data?.[0] || null;\n } catch {\n return null;\n }\n }, [baseURL, tenantId, token]);\n\n return {\n users,\n isLoading,\n error,\n refresh: fetchUsers,\n searchByEmail,\n };\n}\n","/**\n * WorkspaceContext\n *\n * Context for workspace and project management\n */\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n ReactNode,\n} from \"react\";\nimport { WorkspaceClient, Client, type Workspace, type Project, type FileItem, type CreateWorkspaceRequest, type UpdateWorkspaceRequest, type CreateProjectRequest, type UpdateProjectRequest } from \"@axiom-lattice/client-sdk\";\nimport { WORKSPACE_PUBLIC_ROOM_PROJECT_PREFIX } from \"@axiom-lattice/protocols\";\nimport { readAuthItem } from \"../utils/authStorage\";\nimport { useLatticeChatShellContext } from \"../components/Chat/LatticeChatShellContext\";\nimport { useClient } from \"../context\";\nimport { useAuth } from \"@auth\";\nimport { useT } from \"../i18n\";\n\nexport interface WorkspaceContextValue {\n workspaceId: string | null;\n projectId: string | null;\n\n workspaces: Workspace[];\n projects: Project[];\n trainingProjects: Project[];\n personalProjects: Project[];\n /** Every browsable workspace project (business, public incl. the general room, training); excludes personal. */\n allProjects: Project[];\n\n loading: boolean;\n error: string | null;\n\n setWorkspace: (id: string | null) => void;\n setProject: (id: string | null) => void;\n\n createWorkspace: (data: CreateWorkspaceRequest) => Promise<Workspace>;\n updateWorkspace: (id: string, updates: UpdateWorkspaceRequest) => Promise<Workspace>;\n deleteWorkspace: (id: string) => Promise<void>;\n\n createProject: (workspaceId: string, data: CreateProjectRequest) => Promise<Project>;\n updateProject: (workspaceId: string, id: string, updates: UpdateProjectRequest) => Promise<Project>;\n deleteProject: (workspaceId: string, id: string, Promise: void) => Promise<void>;\n\n refreshWorkspaces: () => Promise<void>;\n refreshProjects: () => Promise<void>;\n listPath: (path: string, assistantId?: string) => Promise<FileItem[]>;\n listPathByFolder: (folder: string, assistantId?: string) => Promise<FileItem[]>;\n uploadFile: (path: string, file: File, assistantId?: string) => Promise<FileItem>;\n uploadFileToFolder: (folder: string, file: File, assistantId?: string) => Promise<FileItem>;\n /** Upload to an explicit project (unlike uploadFile, which targets the context-selected project). */\n uploadFileToProject: (projectId: string, path: string, file: File, assistantId?: string) => Promise<FileItem>;\n getFileViewUrl: (filePath: string, assistantId?: string) => string;\n getFileDownloadUrl: (filePath: string, assistantId?: string) => string;\n /** Download the selected project folder through authenticated SDK headers as a Blob. */\n downloadFolder: (folderPath: string, assistantId?: string) => Promise<Blob>;\n getDirectFileUrl: (filePath: string) => string;\n shareFile: (\n filePath: string,\n assistantId?: string,\n options?: {\n title?: string;\n visibility?: \"public\" | \"password\";\n password?: string;\n expiresAt?: string;\n maxAccess?: number;\n }\n ) => Promise<{ token: string; url: string }>;\n /** List all active shares for the current user */\n listShares: () => Promise<import(\"@axiom-lattice/protocols\").ShareRecord[]>;\n /** Revoke a share by token */\n unshareFile: (token: string) => Promise<void>;\n}\n\nexport const WorkspaceContext = createContext<WorkspaceContextValue | null>(null);\n\n/**\n * Hook to access the workspace context. Must be used within a {@link WorkspaceContextProvider}.\n *\n * @description\n * Provides the current workspace and project selection, plus operations to create, update,\n * delete, and refresh workspaces and projects. Also offers file browsing (`listPath`,\n * `listPathByFolder`) and file upload utilities.\n *\n * @returns The current {@link WorkspaceContextValue}.\n *\n * @throws {Error} If used outside of a {@link WorkspaceContextProvider}.\n *\n * @example\n * ```tsx\n * const {\n * workspaces, projects, workspaceId, projectId,\n * createWorkspace, deleteWorkspace, listPath,\n * } = useWorkspaceContext();\n *\n * await createWorkspace({ name: 'My Workspace' });\n * const files = await listPath('/src');\n * ```\n */\nexport const useWorkspaceContext = (): WorkspaceContextValue => {\n const context = useContext(WorkspaceContext);\n if (!context) {\n throw new Error(\"useWorkspaceContext must be used within a WorkspaceContextProvider\");\n }\n return context;\n};\n\n/** Like {@link useWorkspaceContext} but returns null when no provider is present. */\nexport const useWorkspaceContextOptional = (): WorkspaceContextValue | null =>\n useContext(WorkspaceContext);\n\nexport interface WorkspaceContextProviderProps {\n children: ReactNode;\n /** Default workspace ID when sessionStorage is empty */\n workspaceId?: string;\n /** Default project ID when sessionStorage is empty */\n projectId?: string;\n /**\n * When provided (page-level containers), workspace/project changes sync\n * to THIS Client instance's headers (instance-scoped isolation).\n * When omitted, syncs to the global static Client headers (default).\n */\n client?: import(\"@axiom-lattice/client-sdk\").Client;\n /**\n * When true, the provider does NOT read or write sessionStorage. Its\n * workspace/project state is fully scoped to this provider instance, so a\n * nested isolated app (e.g. CoSpace) cannot leak its selections into the\n * outer workspace app or vice versa.\n */\n isolated?: boolean;\n}\n\n/**\n * Workspace context provider. Wraps components that need access to workspace and project state.\n *\n * @description\n * Manages the full workspace lifecycle:\n * - **Session restoration**: Reads the previously selected `workspaceId` and `projectId` from\n * `sessionStorage` on mount to persist selections across page reloads.\n * - **Workspace CRUD**: Provides {@link createWorkspace}, {@link updateWorkspace}, and\n * {@link deleteWorkspace} backed by the workspace API client.\n * - **Project CRUD**: Project-level create, update, and delete scoped to the selected workspace.\n * - **File operations**: {@link listPath}, {@link listPathByFolder}, {@link uploadFile},\n * {@link getFileViewUrl}, and {@link getFileDownloadUrl} for workspace file management.\n * - **Auto-selection**: Automatically selects the first available workspace when the list loads\n * and no workspace is currently selected.\n * - **Global header sync**: Automatically sets the selected workspace/project as HTTP headers on\n * the shared {@link Client} instance so all outgoing API calls include the correct context.\n *\n * Requires {@link AuthProvider} and {@link LatticeChatShellContextProvider} ancestors.\n *\n * @param props - Provider props.\n * @param props.children - React children to render within the workspace context.\n *\n * @returns A React context provider wrapping children with {@link WorkspaceContext.Provider}.\n *\n * @example\n * ```tsx\n * <WorkspaceContextProvider>\n * <FileExplorer />\n * </WorkspaceContextProvider>\n * ```\n */\n/**\n * Build /f/ payload from workspace/project/tenant IDs.\n * Format: hex of 3 UUIDs without dashes (96 chars, compact).\n */\nexport const WorkspaceContextProvider: React.FC<WorkspaceContextProviderProps> = ({\n children,\n workspaceId: defaultWorkspaceId,\n projectId: defaultProjectId,\n client: scopeClient,\n isolated = false,\n}) => {\n const { currentTenant, isAuthenticated } = useAuth();\n const tenantId = currentTenant?.id || \"\";\n const { config } = useLatticeChatShellContext();\n const t = useT();\n\n // Initialize from sessionStorage or use null\n const getInitialWorkspaceId = () => {\n if (defaultWorkspaceId !== undefined) return defaultWorkspaceId;\n if (!isolated && typeof window !== 'undefined') return sessionStorage.getItem('workspaceId');\n return null;\n };\n\n const getInitialProjectId = () => {\n if (defaultProjectId !== undefined) return defaultProjectId;\n if (!isolated && typeof window !== 'undefined') return sessionStorage.getItem('projectId');\n return null;\n };\n\n\n\n const [workspaceId, setWorkspaceId] = useState<string | null>(getInitialWorkspaceId);\n const [projectId, setProjectId] = useState<string | null>(getInitialProjectId);\n\n // Apply the initial workspace context to the client family SYNCHRONOUSLY\n // (layout phase), BEFORE children's passive effects dispatch their first\n // requests (thread list, assistant fetch, ...). Passive effects fire\n // bottom-up, so a passive-effect-only sync would send the first requests\n // with the global fallback headers (or none) — the backend then scopes\n // them to the \"default\"/global project instead of the scope's project.\n useLayoutEffect(() => {\n if (scopeClient) {\n scopeClient.setWorkspaceContext(workspaceId || undefined, projectId || undefined);\n } else {\n Client.setWorkspaceContext(workspaceId || undefined, projectId || undefined);\n }\n }, [workspaceId, projectId, scopeClient]);\n\n const [workspaces, setWorkspaces] = useState<Workspace[]>([]);\n const [projects, setProjects] = useState<Project[]>([]);\n const [trainingProjects, setTrainingProjects] = useState<Project[]>([]);\n const [personalProjects, setPersonalProjects] = useState<Project[]>([]);\n const [allProjects, setAllProjects] = useState<Project[]>([]);\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const client = React.useMemo(() => {\n const authApiKey = isAuthenticated\n ? readAuthItem(\"lattice_token\") || config.apiKey || \"\"\n : config.apiKey || \"\";\n return new WorkspaceClient({\n baseURL: config.baseURL,\n apiKey: authApiKey,\n assistantId: \"\",\n transport: \"sse\",\n }, tenantId);\n }, [config.baseURL, config.apiKey, tenantId, isAuthenticated]);\n\n\n const resetSelectedWorkspace = useCallback(() => {\n\n setProjects([]);\n setTrainingProjects([]);\n setPersonalProjects([]);\n setWorkspaceId(defaultWorkspaceId ?? null);\n if (!isolated) sessionStorage.removeItem('workspaceId');\n setProjectId(defaultProjectId ?? null);\n if (!isolated) sessionStorage.removeItem('projectId');\n }, [setProjects, setWorkspaceId, setProjectId, defaultWorkspaceId, defaultProjectId, isolated]);\n const resetWS = useCallback(() => {\n setWorkspaces([]);\n resetSelectedWorkspace();\n }, [resetSelectedWorkspace, setWorkspaces]);\n\n useEffect(() => {\n\n resetWS();\n refreshWorkspaces();\n }, [tenantId]);\n const refreshWorkspaces = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const data = await client.listWorkspaces();\n setWorkspaces(data);\n } catch (e) {\n setError(e instanceof Error ? e.message : t(\"chatWorkspace.workspace.loadWorkspacesFailed\"));\n } finally {\n setLoading(false);\n }\n }, [client, t]);\n\n const refreshProjects = useCallback(async (wsId?: string) => {\n const targetWorkspaceId = wsId || workspaceId;\n if (!targetWorkspaceId) {\n setProjects([]);\n setTrainingProjects([]);\n setPersonalProjects([]);\n setAllProjects([]);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const data = await client.listProjects(targetWorkspaceId);\n setProjects(data.filter((p) => p.kind !== \"training\" && p.kind !== \"personal\" && !p.id.startsWith(WORKSPACE_PUBLIC_ROOM_PROJECT_PREFIX)));\n setTrainingProjects(data.filter((p) => p.kind === \"training\"));\n setPersonalProjects(data.filter((p) => p.kind === \"personal\"));\n // The Projects menu lists every browsable project, including public\n // (with the general public room) and training; only personal 1:1\n // projects stay out of it.\n setAllProjects(data.filter((p) => p.kind !== \"personal\"));\n } catch (e) {\n setError(e instanceof Error ? e.message : t(\"chatWorkspace.workspace.loadProjectsFailed\"));\n } finally {\n setLoading(false);\n }\n }, [client, workspaceId, t]);\n\n // Persist workspaceId to sessionStorage\n useEffect(() => {\n if (!isolated && workspaceId && typeof window !== 'undefined') {\n sessionStorage.setItem('workspaceId', workspaceId);\n }\n }, [workspaceId, isolated]);\n\n // Persist projectId to sessionStorage\n useEffect(() => {\n if (!isolated && projectId && typeof window !== 'undefined') {\n sessionStorage.setItem('projectId', projectId);\n }\n }, [projectId, isolated]);\n\n useEffect(() => {\n refreshWorkspaces().catch((err) => {\n console.warn(\"Failed to load workspaces:\", err);\n });\n }, [refreshWorkspaces]);\n\n // Auto-select first workspace only (not projects)\n useEffect(() => {\n if (workspaces.length > 0 && !workspaceId) {\n const firstWorkspace = workspaces[0];\n setWorkspaceId(firstWorkspace.id);\n }\n }, [workspaces, workspaceId]);\n\n // Workspace context is automatically synced to sessionStorage\n // Client will read from sessionStorage on each request\n\n // Track previous workspaceId to only reset project when workspace actually changes\n const prevWorkspaceId = useRef(workspaceId);\n\n useEffect(() => {\n if (workspaceId) {\n refreshProjects(workspaceId);\n } else {\n setProjects([]);\n setTrainingProjects([]);\n }\n\n // Only clear projectId when workspaceId actually changed (not on initial mount)\n if (prevWorkspaceId.current != null && prevWorkspaceId.current !== workspaceId) {\n setProjectId(defaultProjectId ?? null);\n }\n\n prevWorkspaceId.current = workspaceId;\n }, [workspaceId, refreshProjects]);\n\n const createWorkspace = useCallback(async (data: CreateWorkspaceRequest) => {\n setLoading(true);\n setError(null);\n try {\n const workspace = await client.createWorkspace(data);\n await refreshWorkspaces();\n return workspace;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.createWorkspaceFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshWorkspaces, t]);\n\n const updateWorkspace = useCallback(async (id: string, updates: UpdateWorkspaceRequest) => {\n setLoading(true);\n setError(null);\n try {\n const workspace = await client.updateWorkspace(id, updates);\n await refreshWorkspaces();\n return workspace;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.updateWorkspaceFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshWorkspaces, t]);\n\n const deleteWorkspace = useCallback(async (id: string) => {\n setLoading(true);\n setError(null);\n try {\n await client.deleteWorkspace(id);\n if (workspaceId === id) {\n resetSelectedWorkspace();\n }\n await refreshWorkspaces();\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.deleteWorkspaceFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, workspaceId, refreshWorkspaces, t]);\n\n const createProject = useCallback(async (wsId: string, data: CreateProjectRequest) => {\n setLoading(true);\n setError(null);\n try {\n const project = await client.createProject(wsId, data);\n await refreshProjects(wsId);\n return project;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.projects.createFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshProjects, t]);\n\n const updateProject = useCallback(async (wsId: string, id: string, updates: UpdateProjectRequest) => {\n setLoading(true);\n setError(null);\n try {\n const project = await client.updateProject(wsId, id, updates);\n await refreshProjects(wsId);\n return project;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.updateProjectFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshProjects, t]);\n\n const deleteProject = useCallback(async (wsId: string, id: string) => {\n setLoading(true);\n setError(null);\n try {\n await client.deleteProject(wsId, id);\n if (projectId === id) {\n setProjectId(null);\n }\n await refreshProjects(wsId);\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.deleteProjectFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, projectId, refreshProjects, t]);\n\n const listPath = useCallback(\n async (path = \"/\", assistantId?: string) => {\n if (!workspaceId || !projectId) {\n return [];\n }\n setLoading(true);\n setError(null);\n try {\n const data = await client.listPath(workspaceId, projectId, path, assistantId);\n return data;\n } catch (e) {\n setError(e instanceof Error ? e.message : t(\"chatWorkspace.workspace.loadFilesFailed\"));\n return [];\n } finally {\n setLoading(false);\n }\n },\n [client, workspaceId, projectId, t]\n );\n\n const listPathByFolder = useCallback(\n async (folder: string, assistantId?: string): Promise<FileItem[]> => {\n let normalizedPath = folder;\n // Strip legacy ~/ prefix if present\n if (normalizedPath.startsWith(\"~/\")) {\n normalizedPath = `/${normalizedPath.slice(2)}`;\n }\n if (!normalizedPath.startsWith(\"/\")) {\n normalizedPath = `/${normalizedPath}`;\n }\n return listPath(normalizedPath, assistantId);\n },\n [listPath]\n );\n\n const uploadFile = useCallback(\n async (path: string, file: File, assistantId?: string): Promise<FileItem> => {\n if (!workspaceId || !projectId) {\n throw new Error(\"Workspace and project must be selected before uploading files\");\n }\n setLoading(true);\n setError(null);\n try {\n const item = await client.uploadFile(workspaceId, projectId, file, path, assistantId);\n return item;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.uploadFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n },\n [client, workspaceId, projectId, t]\n );\n\n const uploadFileToFolder = useCallback(\n async (folder: string, file: File, assistantId?: string): Promise<FileItem> => {\n // Normalize legacy ~/ prefix\n let normalizedFolder = folder;\n if (normalizedFolder.startsWith(\"~/\")) {\n normalizedFolder = `/${normalizedFolder.slice(2)}`;\n }\n return uploadFile(normalizedFolder, file, assistantId);\n },\n [uploadFile]\n );\n\n const uploadFileToProject = useCallback(\n async (targetProjectId: string, path: string, file: File, assistantId?: string): Promise<FileItem> => {\n if (!workspaceId) {\n throw new Error(\"Workspace must be selected before uploading files\");\n }\n return client.uploadFile(workspaceId, targetProjectId, file, path, assistantId);\n },\n [client, workspaceId]\n );\n\n /** File preview — uses viewfile (backward compat). */\n const getFileViewUrl = useCallback( (filePath: string, assistantId?: string): string => {\n if (!workspaceId || !projectId) return \"\";\n return client.getFileViewUrl(workspaceId, projectId, filePath, assistantId);\n },\n [client, workspaceId, projectId]\n );\n\n /** File download — uses downloadfile so the response is served as an attachment. */\n const getFileDownloadUrl = useCallback(\n (filePath: string, assistantId?: string): string => {\n if (!workspaceId || !projectId) return \"\";\n return client.getFileDownloadUrl(workspaceId, projectId, filePath, assistantId);\n },\n [client, workspaceId, projectId]\n );\n\n /** Download a folder using the selected workspace/project scope and authenticated client. */\n const downloadFolder = useCallback(\n async (folderPath: string, assistantId?: string): Promise<Blob> => {\n if (!workspaceId || !projectId) throw new Error(\"Workspace and project must be selected\");\n return client.downloadFolder(workspaceId, projectId, folderPath, assistantId);\n },\n [client, workspaceId, projectId],\n );\n\n /** Direct file access via /f/ — for sharing, pinning, directory preview. */\n const getDirectFileUrl = useCallback(\n (filePath: string): string => {\n if (!tenantId || !workspaceId || !projectId) return \"\";\n const normalized = filePath.replace(/^\\/?project\\//, \"\").replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return `${config.baseURL}/f/${tenantId}/${workspaceId}/${projectId}/${normalized}`;\n },\n [tenantId, workspaceId, projectId, config.baseURL]\n );\n\n const shareFile = useCallback(\n async (\n filePath: string,\n assistantId?: string,\n options?: {\n title?: string;\n visibility?: \"public\" | \"password\";\n password?: string;\n expiresAt?: string;\n maxAccess?: number;\n }\n ) => {\n if (!workspaceId || !projectId) {\n throw new Error(\"Workspace and project must be selected\");\n }\n return client.resources.share({\n resourcePath: filePath,\n assistantId,\n ...options,\n });\n },\n [client, workspaceId, projectId]\n );\n\n const listShares = useCallback(\n async () => {\n return client.resources.listShares();\n },\n [client]\n );\n\n const unshareFile = useCallback(\n async (token: string) => {\n await client.resources.unshare(token);\n },\n [client]\n );\n\n const value: WorkspaceContextValue = {\n workspaceId,\n projectId,\n workspaces,\n projects,\n trainingProjects,\n personalProjects,\n allProjects,\n loading,\n error,\n setWorkspace: setWorkspaceId,\n setProject: setProjectId,\n createWorkspace,\n updateWorkspace,\n deleteWorkspace,\n createProject,\n updateProject,\n deleteProject,\n refreshWorkspaces,\n refreshProjects,\n listPath,\n listPathByFolder,\n uploadFile,\n uploadFileToFolder,\n uploadFileToProject,\n getFileViewUrl,\n getFileDownloadUrl,\n downloadFolder,\n getDirectFileUrl,\n shareFile,\n listShares,\n unshareFile,\n };\n\n // Get current workspace name\n const currentWorkspace = workspaces.find((w) => w.id === workspaceId);\n const workspaceName = currentWorkspace?.name;\n\n // Handle project selection\n const handleSelectProject = (project: Project) => {\n setProjectId(project.id);\n };\n\n // Handle project creation\n const handleCreateProject = async (name: string, description?: string) => {\n if (workspaceId) {\n await createProject(workspaceId, { name, description });\n }\n };\n\n return (\n <WorkspaceContext.Provider value={value}>\n {children}\n </WorkspaceContext.Provider>\n );\n};\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAssistantContext } from \"./AssistantContext\";\nimport { useClient } from \"../../context\";\nimport { Client, Thread, type ThreadSuperstepInput } from \"@axiom-lattice/client-sdk\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport { WorkspaceContext } from \"../../context/WorkspaceContext\";\n\n/**\n * Thread information for a conversation\n */\nexport interface ConversationThread {\n id: string;\n label: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/**\n * Conversation context value\n */\nexport interface ConversationContextValue {\n /**\n * Current assistant ID\n */\n assistantId: string | null;\n /**\n * Current thread for the assistant\n */\n thread: ConversationThread | null;\n /**\n * Current thread ID\n */\n threadId: string | null;\n /**\n * List of threads for the current assistant\n */\n threads: ConversationThread[];\n /**\n * Whether threads are being loaded\n */\n isLoading: boolean;\n /**\n * Error message if any\n */\n error: Error | null;\n /**\n * Set the current thread\n */\n setThread: (thread: ConversationThread | null) => void;\n /**\n * Select a thread by ID\n */\n selectThread: (threadId: string) => void;\n /**\n * Create a new thread for the current assistant\n */\n createThread: (\n label?: string,\n options?: { ttlSeconds?: number; supersteps?: ThreadSuperstepInput[] },\n ) => Promise<ConversationThread>;\n /**\n * List all threads for the current assistant\n */\n listThreads: () => Promise<ConversationThread[]>;\n /**\n * Update thread for the current assistant\n */\n updateThread: (thread: ConversationThread) => Promise<void>;\n /**\n * Get thread by ID\n */\n getThreadById: (threadId: string) => ConversationThread | null;\n /**\n * Delete a thread by ID\n */\n deleteThread: (threadId: string) => Promise<void>;\n /**\n * Clear the current thread\n */\n clearThread: () => void;\n /**\n * Refresh threads for the current assistant\n */\n refresh: () => Promise<void>;\n /**\n * Custom run configuration (cross-thread, assistant-level)\n * Used for metrics datasource and other assistant-wide settings\n */\n customRunConfig: Record<string, any>;\n /**\n * Update custom run configuration\n */\n updateCustomRunConfig: (config: Record<string, any>) => void;\n}\n\n/**\n * Conversation context.\n *\n * The default value is `null` so consumers can detect whether a\n * {@link ConversationContextProvider} is present (e.g. {@link AgentThreadContext}\n * falls back to local `customRunConfig` when it is not). Use\n * {@link useConversationContext} when a provider is required (throws otherwise),\n * or {@link useOptionalConversationContext} when it is optional.\n */\nexport const ConversationContext = createContext<ConversationContextValue | null>(null);\n\n/**\n * Props for ConversationContextProvider\n */\nexport interface ConversationContextProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Helper function to convert API Thread to ConversationThread\n */\nfunction convertThreadToConversationThread(\n thread: Thread,\n label?: string\n): ConversationThread {\n return {\n id: thread.id,\n label:\n label ||\n (thread.metadata?.label as string) ||\n new Date(thread.createdAt).toLocaleString(),\n createdAt: thread.createdAt?.toString(),\n updatedAt: thread.updatedAt?.toString(),\n };\n}\n\n/**\n * Helper function to convert ConversationThread to API Thread metadata\n */\nfunction getThreadMetadata(label?: string): Record<string, any> {\n return label ? { label } : {};\n}\n\n/**\n * Generate a thread label from the first message content\n * Extracts first 15 characters of text content, excluding attachments\n */\nexport function generateLabelFromMessage(message: string): string {\n // Remove attachment markers\n const cleanMessage = message.replace(/```attachments[\\s\\S]*?```/g, '').trim();\n\n // If empty after cleaning, return empty string (will fallback to date)\n if (!cleanMessage) {\n return '';\n }\n\n // If message is short, use it as-is\n if (cleanMessage.length <= 15) {\n return cleanMessage;\n }\n\n // Otherwise truncate with ellipsis\n return cleanMessage.slice(0, 15) + '...';\n}\n\n/**\n * Provider component for ConversationContext.\n * Manages conversation thread state for the currently selected assistant.\n *\n * @description\n * Coordinates with {@link AssistantContext} to load threads for the current assistant.\n * Key behaviors:\n * - **Thread loading**: Fetches threads from the API when the assistant changes. If no threads\n * exist, a new thread is automatically created.\n * - **Auto-selection**: Selects the most recently updated thread as the active thread when loading.\n * - **Cross-thread config**: Maintains an assistant-level `customRunConfig` shared across all threads\n * (useful for metrics datasource and other assistant-wide settings).\n * - **Thread operations**: Provides full CRUD operations (create, update, delete, list, select)\n * backed by the client SDK.\n *\n * Requires {@link AssistantContextProvider} ancestor and {@link LatticeChatShellContextProvider}.\n *\n * @param props - {@link ConversationContextProviderProps}\n * @param props.children - React children to render within the conversation context.\n *\n * @returns A React context provider wrapping children with {@link ConversationContext.Provider}.\n *\n * @example\n * ```tsx\n * <ConversationContextProvider>\n * <ThreadList />\n * </ConversationContextProvider>\n * ```\n */\nexport const ConversationContextProvider = ({\n children,\n}: ConversationContextProviderProps) => {\n // Get current assistant from AssistantContext\n const { currentAssistant } = useAssistantContext();\n const assistantId = currentAssistant?.id || null;\n\n // Get client for the current assistant\n const _unused = useLatticeChatShellContext(); void _unused;\n const client = useClient(assistantId || \"\");\n\n // Current threads for the current assistant\n const [threads, setThreads] = useState<ConversationThread[]>([]);\n // Current thread ID\n const [threadId, setThreadId] = useState<string | null>(null);\n // Loading state\n const [isLoading, setIsLoading] = useState<boolean>(false);\n // Error state\n const [error, setError] = useState<Error | null>(null);\n // Custom run config for assistant-level settings (cross-thread)\n const [customRunConfig, setCustomRunConfig] = useState<Record<string, any>>({});\n // Track if we've loaded threads for the current assistant (using ref to avoid re-renders)\n const loadedAssistantIdRef = useRef<string | null>(null);\n // Track previous assistantId to detect changes\n const prevAssistantIdRef = useRef<string | null>(null);\n // Track if we're currently loading to prevent concurrent loads\n const isLoadingRef = useRef<boolean>(false);\n // Ignore results from loads superseded by an assistant change or forced refresh.\n const loadRequestIdRef = useRef(0);\n // Store client in ref to avoid dependency issues\n const clientRef = useRef<Client>(client);\n // Update client ref when it changes\n useEffect(() => {\n clientRef.current = client;\n }, [client]);\n\n /**\n * Load threads for the current assistant from the API\n * If no threads exist, automatically create a new one\n */\n const loadThreads = useCallback(async (force = false) => {\n const currentClient = clientRef.current;\n if (!assistantId || !currentClient.assistantId) {\n loadRequestIdRef.current += 1;\n setThreads([]);\n setIsLoading(false);\n isLoadingRef.current = false;\n loadedAssistantIdRef.current = null;\n return;\n }\n\n // Prevent concurrent loads for the same assistant\n if (!force && isLoadingRef.current && loadedAssistantIdRef.current === assistantId) {\n return;\n }\n\n const requestId = ++loadRequestIdRef.current;\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const apiThreads = await currentClient.threads.list();\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n // Sort threads by updatedAt in descending order (most recently updated first)\n const sortedApiThreads = apiThreads.sort((a, b) => {\n const dateA = new Date(a.updatedAt).getTime();\n const dateB = new Date(b.updatedAt).getTime();\n return dateB - dateA;\n });\n const conversationThreads = sortedApiThreads.map((t) =>\n convertThreadToConversationThread(t)\n );\n\n // If no threads exist, create a new one\n if (conversationThreads.length === 0) {\n try {\n const apiThread = await currentClient.threads.create({\n metadata: getThreadMetadata(),\n });\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n const newThread = convertThreadToConversationThread(apiThread);\n setThreads([newThread]);\n setThreadId(newThread.id);\n } catch (createErr) {\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n const createError =\n createErr instanceof Error\n ? createErr\n : new Error(String(createErr));\n setError(createError);\n console.error(\"Failed to create initial thread:\", createError);\n setThreads([]);\n }\n } else {\n setThreads(conversationThreads);\n\n // Select the most recently updated thread if we haven't selected one yet\n // or if the current thread doesn't belong to this assistant's threads\n setThreadId((currentThreadId) => {\n if (!currentThreadId) {\n // Threads are sorted by updatedAt desc, so first one is most recent\n const latestThread = conversationThreads[0];\n return latestThread.id;\n }\n // Check if currentThreadId belongs to the new assistant's threads\n const threadExists = conversationThreads.some(\n (t) => t.id === currentThreadId\n );\n if (!threadExists) {\n // Current thread doesn't belong to this assistant, select the most recent\n const latestThread = conversationThreads[0];\n return latestThread.id;\n }\n return currentThreadId;\n });\n }\n\n loadedAssistantIdRef.current = assistantId;\n } catch (err) {\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n console.error(\"Failed to load threads:\", error);\n } finally {\n if (requestId === loadRequestIdRef.current) {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }\n }, [assistantId]);\n\n // Load threads when assistantId changes\n useEffect(() => {\n const currentClient = clientRef.current;\n const prevAssistantId = prevAssistantIdRef.current;\n\n // Check if assistantId actually changed\n const assistantChanged = prevAssistantId !== assistantId;\n\n if (assistantId && currentClient.assistantId === assistantId) {\n // If assistant changed, clear threadId first\n if (assistantChanged) {\n setThreadId(null);\n prevAssistantIdRef.current = assistantId;\n }\n\n // Only load if we haven't loaded for this assistant yet\n if (loadedAssistantIdRef.current !== assistantId) {\n loadThreads();\n }\n } else {\n setThreadId(null);\n setThreads([]);\n loadedAssistantIdRef.current = null;\n prevAssistantIdRef.current = null;\n }\n }, [assistantId, loadThreads]);\n\n // Reload threads when the workspace/project scope changes: the thread list\n // is filtered by the project headers, so switching projects must refresh\n // the list and drop the now-invalid active thread (a new one is selected\n // or auto-created for the new project).\n const workspaceCtx = useContext(WorkspaceContext);\n const scopeKey = `${workspaceCtx?.workspaceId ?? \"\"}:${workspaceCtx?.projectId ?? \"\"}`;\n const prevScopeKeyRef = useRef(scopeKey);\n useEffect(() => {\n const currentClient = clientRef.current;\n if (!assistantId || !currentClient.assistantId) return;\n if (prevScopeKeyRef.current === scopeKey) return;\n\n prevScopeKeyRef.current = scopeKey;\n setThreadId(null);\n loadedAssistantIdRef.current = null;\n loadThreads();\n }, [scopeKey, assistantId, loadThreads]);\n\n // Get current thread for the current assistant\n const thread = useMemo((): ConversationThread | null => {\n if (!assistantId || !threadId) {\n return null;\n }\n return threads.find((t) => t.id === threadId) || null;\n }, [assistantId, threadId, threads]);\n\n // Set thread for the current assistant\n const setThread = useCallback((newThread: ConversationThread | null) => {\n if (newThread) {\n setThreadId(newThread.id);\n } else {\n setThreadId(null);\n }\n }, []);\n\n // Select a thread by ID\n const selectThread = useCallback(\n (targetThreadId: string) => {\n const foundThread = threads.find((t) => t.id === targetThreadId);\n if (foundThread) {\n setThreadId(targetThreadId);\n }\n },\n [threads]\n );\n\n // Create a new thread for the current assistant\n const createThread = useCallback(\n async (\n label?: string,\n options?: { ttlSeconds?: number; supersteps?: ThreadSuperstepInput[] },\n ): Promise<ConversationThread> => {\n if (!assistantId || !client.assistantId) {\n throw new Error(\"No assistant selected\");\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const apiThread = await client.threads.create({\n metadata: getThreadMetadata(label),\n ...(options ?? {}),\n });\n const newThread = convertThreadToConversationThread(apiThread, label);\n\n // Reload threads to get the latest data from backend\n await loadThreads();\n setThreadId(newThread.id);\n return newThread;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [assistantId, client, loadThreads]\n );\n\n // List all threads for the current assistant\n const listThreads = useCallback(async (): Promise<ConversationThread[]> => {\n if (!assistantId || !client.assistantId) {\n return [];\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const apiThreads = await client.threads.list();\n // Sort threads by updatedAt in descending order (most recently updated first)\n const sortedApiThreads = apiThreads.sort((a, b) => {\n const dateA = new Date(a.updatedAt).getTime();\n const dateB = new Date(b.updatedAt).getTime();\n return dateB - dateA;\n });\n const conversationThreads = sortedApiThreads.map((t) =>\n convertThreadToConversationThread(t)\n );\n\n setThreads(conversationThreads);\n return conversationThreads;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n // Return current threads if available\n return threads;\n } finally {\n setIsLoading(false);\n }\n }, [assistantId, client, threads]);\n\n // Update thread for the current assistant.\n // Applies the change to local state in place instead of reloading the whole\n // list, so a rename doesn't flash a loading state or re-sort the threads.\n // The thread's existing sort position (updatedAt) is preserved; the next full\n // list load reconciles with the backend.\n const updateThread = useCallback(\n async (newThread: ConversationThread): Promise<void> => {\n if (!assistantId || !client.assistantId) {\n throw new Error(\"No assistant selected\");\n }\n\n setError(null);\n\n try {\n // Get existing thread to preserve other metadata fields\n const existingThread = await client.threads.get(newThread.id);\n const existingMetadata = existingThread.metadata || {};\n\n await client.threads.update(newThread.id, {\n metadata: {\n ...existingMetadata,\n label: newThread.label,\n },\n });\n\n // Apply the new label to local state only.\n setThreads((prev) =>\n prev.map((t) =>\n t.id === newThread.id ? { ...t, label: newThread.label } : t\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n }\n },\n [assistantId, client]\n );\n\n // Get thread by ID\n const getThreadById = useCallback(\n (targetThreadId: string): ConversationThread | null => {\n return threads.find((t) => t.id === targetThreadId) || null;\n },\n [threads]\n );\n\n // Delete a thread by ID\n const deleteThread = useCallback(\n async (targetThreadId: string): Promise<void> => {\n if (!assistantId || !client.assistantId) {\n throw new Error(\"No assistant selected\");\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await client.threads.delete(targetThreadId);\n\n // Reload threads to get the latest data from backend\n await loadThreads(true);\n\n // Keep a replacement selected by loadThreads, but clear a stale deleted selection.\n setThreadId((currentThreadId) =>\n currentThreadId === targetThreadId ? null : currentThreadId\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [assistantId, client, loadThreads]\n );\n\n // Clear the current thread\n const clearThread = useCallback(() => {\n setThreadId(null);\n }, []);\n\n // Update custom run config (assistant-level, cross-thread)\n const updateCustomRunConfig = useCallback((config: Record<string, any>) => {\n setCustomRunConfig((prev) => ({\n ...prev,\n ...config,\n }));\n }, []);\n\n return (\n <ConversationContext.Provider\n value={{\n assistantId,\n thread,\n threadId,\n threads,\n isLoading,\n error,\n setThread,\n selectThread,\n createThread,\n listThreads,\n updateThread,\n getThreadById,\n deleteThread,\n clearThread,\n refresh: loadThreads,\n customRunConfig,\n updateCustomRunConfig,\n }}\n >\n {children}\n </ConversationContext.Provider>\n );\n};\n\n/**\n * Hook to access ConversationContext. Throws when no\n * {@link ConversationContextProvider} is present — use only in components that\n * are guaranteed to render inside the shell's provider tree.\n *\n * @returns Conversation context value\n * @throws Error if used outside of ConversationContextProvider\n */\nexport const useConversationContext = (): ConversationContextValue => {\n const context = useContext(ConversationContext);\n\n if (!context) {\n throw new Error(\n \"useConversationContext must be used within a ConversationContextProvider\"\n );\n }\n\n return context;\n};\n\n/**\n * Hook to access ConversationContext without throwing. Returns `null` when no\n * {@link ConversationContextProvider} is present, letting consumers degrade\n * gracefully (e.g. GenUI elements rendering inside the architect copilot dock,\n * which lives outside the shell's ConversationContextProvider).\n *\n * @returns Conversation context value, or null if no provider is present\n */\nexport const useOptionalConversationContext = (): ConversationContextValue | null =>\n useContext(ConversationContext);\n","import React, { createContext, useCallback, useContext, useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nconst emptyHandler = () => {\n throw new Error(\"ChatUIContextProvider not found\");\n};\n\ntype PanelCardData = Record<string, unknown> & {\n component?: ReactNode;\n message?: string;\n};\n\nexport type PanelCard = {\n component_key: string;\n data: PanelCardData;\n message?: string;\n context?: {\n thread_id?: string;\n assistant_id?: string;\n };\n};\n\nexport const ChatUIContext = createContext<{\n detailVisible: boolean;\n setDetailVisible: (visible: boolean) => void;\n detailSize: \"small\" | \"middle\" | \"large\" | \"full\";\n setDetailSize: (size: \"small\" | \"middle\" | \"large\" | \"full\") => void;\n detailSelectedCard: PanelCard | null;\n setDetailSelectedCard: (card: PanelCard | null) => void;\n openDetail: (card: PanelCard) => void;\n closeDetail: () => void;\n toolsVisible: boolean;\n setToolsVisible: (visible: boolean) => void;\n toggleTools: () => void;\n toolSelectedCard: PanelCard | null;\n setToolSelectedCard: (card: PanelCard | null) => void;\n openTools: (card: PanelCard) => void;\n closeTools: () => void;\n sideAppVisible: boolean;\n setSideAppVisible: (visible: boolean) => void;\n sideAppSize: \"small\" | \"middle\" | \"large\" | \"full\";\n setSideAppSize: (size: \"small\" | \"middle\" | \"large\" | \"full\") => void;\n sideAppSelectedCard: PanelCard | null;\n setSideAppSelectedCard: (card: PanelCard | null) => void;\n openSideApp: (card: PanelCard) => void;\n closeSideApp: () => void;\n menuCollapsed: boolean | undefined;\n setMenuCollapsed: (collapsed: boolean) => void;\n openContentApp: (card: PanelCard) => void;\n closeContentApp: () => void;\n contentAppVisible: boolean;\n setcontentAppVisible: (visible: boolean) => void;\n contentAppSelectedCard: PanelCard | null;\n setContentAppSelectedCard: (card: PanelCard | null) => void;\n}>({\n detailVisible: false,\n setDetailVisible: emptyHandler,\n detailSize: \"large\",\n setDetailSize: emptyHandler,\n detailSelectedCard: null,\n setDetailSelectedCard: emptyHandler,\n openDetail: emptyHandler,\n closeDetail: emptyHandler,\n toolsVisible: false,\n setToolsVisible: emptyHandler,\n toggleTools: emptyHandler,\n toolSelectedCard: null,\n setToolSelectedCard: emptyHandler,\n openTools: emptyHandler,\n closeTools: emptyHandler,\n sideAppVisible: false,\n setSideAppVisible: emptyHandler,\n sideAppSize: \"large\",\n setSideAppSize: emptyHandler,\n sideAppSelectedCard: null,\n setSideAppSelectedCard: emptyHandler,\n openSideApp: emptyHandler,\n closeSideApp: emptyHandler,\n menuCollapsed: undefined,\n setMenuCollapsed: emptyHandler,\n openContentApp: emptyHandler,\n closeContentApp: emptyHandler,\n contentAppVisible: false,\n setcontentAppVisible: emptyHandler,\n contentAppSelectedCard: null,\n setContentAppSelectedCard: emptyHandler,\n});\n\n/**\n * Chat UI context provider. Manages visibility and selected cards for chat panel areas\n * (detail, tools, side app, content app) and the sidebar menu collapsed state.\n *\n * @description\n * Tracks the open/closed state and the currently selected {@link PanelCard} for each panel:\n * - **Detail panel**: A slide-out detail view that displays a chosen card's content.\n * - **Tools panel**: A tools sidebar/drawer for tool-specific cards.\n * - **Side app**: Aliases to the detail panel (shared state).\n * - **Content app**: An inline content area for embedded app cards.\n * - **Menu collapsed**: Whether the sidebar navigation menu is collapsed.\n *\n * Provides action helpers (`openDetail`, `closeDetail`, `openTools`, `toggleTools`, etc.)\n * that set both visibility and selected card atomically.\n *\n * @param props - Provider props.\n * @param props.children - React children to render within the UI context.\n *\n * @returns A React context provider wrapping children with {@link ChatUIContext.Provider}.\n *\n * @example\n * ```tsx\n * <ChatUIContextProvider>\n * <ChatLayout />\n * </ChatUIContextProvider>\n * ```\n */\nexport const ChatUIContextProvider = ({\n children,\n defaultMenuCollapsed,\n}: {\n children: React.ReactNode;\n /** Default collapsed state for the sidebar menu. Default: undefined (auto) */\n defaultMenuCollapsed?: boolean;\n}) => {\n const [detailVisible, setDetailVisible] = useState(false);\n const [contentAppVisible, setcontentAppVisible] = useState(false);\n const [detailSize, setDetailSize] = useState<\"small\" | \"middle\" | \"large\" | \"full\">(\"large\");\n const [detailSelectedCard, setDetailSelectedCard] = useState<PanelCard | null>(null);\n const [toolsVisible, setToolsVisible] = useState(false);\n const [toolSelectedCard, setToolSelectedCard] = useState<PanelCard | null>(null);\n const [contentAppSelectedCard, setContentAppSelectedCard] = useState<PanelCard | null>(null);\n const [menuCollapsed, setMenuCollapsed] = useState<boolean | undefined>(defaultMenuCollapsed ?? undefined);\n\n const openDetail = useCallback((card: PanelCard) => {\n setDetailSelectedCard(card);\n setDetailVisible(true);\n }, []);\n\n const closeDetail = useCallback(() => {\n setDetailSelectedCard(null);\n setDetailVisible(false);\n }, []);\n\n const openTools = useCallback((card: PanelCard) => {\n setToolSelectedCard(card);\n setToolsVisible(true);\n }, []);\n\n const closeTools = useCallback(() => {\n setToolSelectedCard(null);\n setToolsVisible(false);\n }, []);\n\n const openSideApp = useCallback((card: PanelCard) => {\n openDetail(card);\n }, [openDetail]);\n\n const openContentApp = useCallback((card: PanelCard) => {\n setContentAppSelectedCard(card);\n setcontentAppVisible(true);\n }, []);\n\n const closeSideApp = useCallback(() => {\n closeDetail();\n }, [closeDetail]);\n\n const closeContentApp = useCallback(() => {\n setContentAppSelectedCard(null);\n setcontentAppVisible(false);\n }, []);\n\n const toggleTools = useCallback(() => {\n setToolsVisible((prev) => !prev);\n }, []);\n\n return (\n <ChatUIContext.Provider\n value={{\n detailVisible,\n setDetailVisible,\n detailSize,\n setDetailSize,\n detailSelectedCard,\n setDetailSelectedCard,\n openDetail,\n closeDetail,\n toolsVisible,\n setToolsVisible,\n toggleTools,\n toolSelectedCard,\n setToolSelectedCard,\n openTools,\n closeTools,\n sideAppVisible: detailVisible,\n setSideAppVisible: setDetailVisible,\n sideAppSize: detailSize,\n setSideAppSize: setDetailSize,\n sideAppSelectedCard: detailSelectedCard,\n setSideAppSelectedCard: setDetailSelectedCard,\n openSideApp,\n closeSideApp,\n openContentApp,\n closeContentApp,\n menuCollapsed,\n setMenuCollapsed,\n contentAppVisible,\n setcontentAppVisible,\n contentAppSelectedCard,\n setContentAppSelectedCard,\n }}\n >\n {children}\n </ChatUIContext.Provider>\n );\n};\n\n/**\n * Hook to access the chat UI context. Must be used within a {@link ChatUIContextProvider}.\n *\n * @description\n * Returns panel visibility state, selected panel cards, and action functions for controlling\n * the chat interface panels (detail, tools, side app, content app) and menu collapsed state.\n *\n * @returns The current chat UI context value containing panel state and control functions.\n *\n * @example\n * ```tsx\n * const { detailVisible, openDetail, closeDetail, toggleTools, menuCollapsed } = useChatUIContext();\n *\n * const handleCardClick = (card: PanelCard) => {\n * openDetail(card);\n * };\n * ```\n */\nexport const useChatUIContext = () => {\n return useContext(ChatUIContext);\n};\n"],"mappings":"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","names":["colors","radius","spacing","shadows","typography","animation","useState","jsx","useState","Button","Typography","Card","jsx","jsxs","Text","Typography","Card","Button","useState","useEffect","Building2","jsx","useState","useEffect","Building2","useState","useEffect","useMemo","useCallback","Button","Input","Spin","createStyles","LogOut","jsx","jsxs","createStyles","useState","useEffect","useMemo","t","useCallback","Spin","Button","LogOut","Input","useState","Form","Input","Button","Alert","LockOutlined","jsx","jsxs","Form","useState","Alert","Input","LockOutlined","Button","useState","useEffect","useCallback","useState","useCallback","useEffect","t","React","createContext","useContext","useState","useCallback","useEffect","useRef","jsx","createContext","useContext","useState","React","useCallback","useEffect","useRef","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useState","useRef","useEffect","useCallback","error","useContext","useMemo","createContext","useCallback","useContext","useState","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Chat/AssistantContext.tsx","../src/theme/axiom-tokens.ts","../src/theme/axiom-antd-theme.ts","../src/theme/useAxiomTheme.ts","../src/components/Auth/LoginForm.tsx","../src/components/Auth/UserProfile.tsx","../src/components/Auth/TenantLogo.tsx","../src/hooks/useTenantBranding.ts","../src/components/Auth/TenantSelector.tsx","../src/components/Auth/ChangePasswordModal.tsx","../src/hooks/useTenants.ts","../src/context/WorkspaceContext.tsx","../src/components/Chat/ConversationContext.tsx","../src/components/Chat/ChatUIContext.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Assistant,\n CreateAssistantOptions,\n UpdateAssistantOptions,\n} from \"@axiom-lattice/client-sdk\";\nimport { useClient } from \"../../context\";\n\n/**\n * Assistant state interface\n */\nexport interface AssistantState {\n /**\n * List of all assistants\n */\n assistants: Assistant[];\n /**\n * Currently selected assistant\n */\n currentAssistant: Assistant | null;\n /**\n * Whether data is being loaded\n */\n isLoading: boolean;\n /**\n * Error message if any\n */\n error: Error | null;\n}\n\n/**\n * Assistant context value interface\n */\nexport interface AssistantContextValue extends AssistantState {\n /**\n * List all assistants\n */\n listAssistants: () => Promise<void>;\n /**\n * Get a single assistant by ID\n */\n getAssistant: (id: string) => Promise<Assistant>;\n /**\n * Create a new assistant\n */\n createAssistant: (options: CreateAssistantOptions) => Promise<Assistant>;\n /**\n * Update an existing assistant\n */\n updateAssistant: (\n id: string,\n options: UpdateAssistantOptions\n ) => Promise<Assistant>;\n /**\n * Delete an assistant\n */\n deleteAssistant: (id: string) => Promise<void>;\n /**\n * Select an assistant as current\n */\n selectAssistant: (id: string) => Promise<void>;\n /**\n * Clear the current assistant selection\n */\n clearCurrentAssistant: () => void;\n /**\n * Refresh the assistant list\n */\n refresh: () => Promise<void>;\n}\n\n/**\n * Assistant context\n */\nexport const AssistantContext = createContext<AssistantContextValue>({\n assistants: [],\n currentAssistant: null,\n isLoading: false,\n error: null,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n listAssistants: async () => { },\n getAssistant: async () => {\n throw new Error(\"Not implemented\");\n },\n createAssistant: async () => {\n throw new Error(\"Not implemented\");\n },\n updateAssistant: async () => {\n throw new Error(\"Not implemented\");\n },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n deleteAssistant: async () => { },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n selectAssistant: async () => { },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n clearCurrentAssistant: () => { },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n refresh: async () => { },\n});\n\n/**\n * Props for AssistantContextProvider\n */\nexport interface AssistantContextProviderProps {\n /**\n * Children components\n */\n children: React.ReactNode;\n /**\n * Whether to automatically load assistants on mount\n */\n autoLoad?: boolean;\n /**\n * Initial assistant ID to select\n */\n initialAssistantId?: string | null;\n}\n\n/**\n * Provider component for AssistantContext.\n * Manages assistant state and operations including CRUD, selection, and auto-loading.\n *\n * @description\n * Coordinates with the client SDK to provide assistant management:\n * - **Auto-load**: When `autoLoad` is `true` (default), fetches the assistant list on mount.\n * - **Auto-selection**: If `initialAssistantId` is provided, selects that assistant after loading.\n * Otherwise, auto-selects the first available assistant.\n * - **Re-selection**: If the currently selected assistant is removed from the list (e.g., deleted),\n * falls back to selecting the first available assistant.\n * - **CRUD operations**: Provides `createAssistant`, `updateAssistant`, `deleteAssistant`, and\n * `getAssistant` backed by the SDK, keeping local state in sync.\n *\n * Requires an {@link AxiomLatticeProvider} ancestor for the API client.\n *\n * @param props - {@link AssistantContextProviderProps}\n * @param props.children - React children to render within the assistant context.\n * @param props.autoLoad - Whether to automatically load assistants on mount. Defaults to `true`.\n * @param props.initialAssistantId - Optional assistant ID to auto-select on load.\n *\n * @returns A React context provider wrapping children with {@link AssistantContext.Provider}.\n *\n * @example\n * ```tsx\n * <AssistantContextProvider initialAssistantId=\"asst_123\">\n * <AssistantSelector />\n * </AssistantContextProvider>\n * ```\n */\nexport const AssistantContextProvider = ({\n children,\n autoLoad = true,\n initialAssistantId = null,\n}: AssistantContextProviderProps) => {\n // Use the client from AxiomLatticeProvider which already has tenantId configured\n const client = useClient(initialAssistantId || \"\");\n const [state, setState] = useState<AssistantState>({\n assistants: [],\n currentAssistant: null,\n isLoading: false,\n error: null,\n });\n // Use ref to access current assistants in callbacks\n const assistantsRef = useRef<Assistant[]>([]);\n useEffect(() => {\n assistantsRef.current = state.assistants;\n }, [state.assistants]);\n\n /**\n * List all assistants\n */\n const listAssistants = useCallback(async () => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const assistants = (await client.assistants.list()) ?? [];\n setState((prev) => ({\n ...prev,\n assistants,\n isLoading: false,\n currentAssistant:\n prev.currentAssistant &&\n assistants.some((assistant) => assistant.id === prev.currentAssistant?.id)\n ? prev.currentAssistant\n : prev.currentAssistant\n ? assistants[0] || null\n : null,\n }));\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n }\n }, [client]);\n\n /**\n * Get a single assistant by ID\n */\n const getAssistant = useCallback(\n async (id: string): Promise<Assistant> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const assistant = await client.assistants.get(id);\n setState((prev) => ({\n ...prev,\n // Update assistant in list if it exists\n assistants: prev.assistants.map((a) => (a.id === id ? assistant : a)),\n isLoading: false,\n }));\n return assistant;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Create a new assistant\n */\n const createAssistant = useCallback(\n async (options: CreateAssistantOptions): Promise<Assistant> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const newAssistant = await client.assistants.create(options);\n setState((prev) => ({\n ...prev,\n assistants: [...prev.assistants, newAssistant],\n isLoading: false,\n }));\n return newAssistant;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Update an existing assistant\n */\n const updateAssistant = useCallback(\n async (id: string, options: UpdateAssistantOptions): Promise<Assistant> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n const updatedAssistant = await client.assistants.update(id, options);\n setState((prev) => ({\n ...prev,\n assistants: prev.assistants.map((a) =>\n a.id === id ? updatedAssistant : a\n ),\n currentAssistant:\n prev.currentAssistant?.id === id\n ? updatedAssistant\n : prev.currentAssistant,\n isLoading: false,\n }));\n return updatedAssistant;\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Delete an assistant\n */\n const deleteAssistant = useCallback(\n async (id: string): Promise<void> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n await client.assistants.delete(id);\n setState((prev) => ({\n ...prev,\n assistants: prev.assistants.filter((a) => a.id !== id),\n currentAssistant:\n prev.currentAssistant?.id === id ? null : prev.currentAssistant,\n isLoading: false,\n }));\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Select an assistant as current\n */\n const selectAssistant = useCallback(\n async (id: string): Promise<void> => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n try {\n // Check if assistant is already in the list using ref\n const assistant = assistantsRef.current.find((a) => a.id === id);\n\n if (!assistant) {\n // If not in list, fetch it\n const fetchedAssistant = await client.assistants.get(id);\n setState((prev) => ({\n ...prev,\n assistants: [...prev.assistants, fetchedAssistant],\n currentAssistant: fetchedAssistant,\n isLoading: false,\n }));\n } else {\n setState((prev) => ({\n ...prev,\n currentAssistant: assistant,\n isLoading: false,\n }));\n }\n } catch (error) {\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n throw error;\n }\n },\n [client]\n );\n\n /**\n * Clear the current assistant selection\n */\n const clearCurrentAssistant = useCallback(() => {\n setState((prev) => ({\n ...prev,\n currentAssistant: null,\n }));\n }, []);\n\n /**\n * Refresh the assistant list\n */\n const refresh = useCallback(async () => {\n await listAssistants();\n }, [listAssistants]);\n\n // Auto-load assistants on mount if enabled\n useEffect(() => {\n if (autoLoad) {\n listAssistants();\n }\n }, [autoLoad, listAssistants]);\n\n // Select initial assistant if provided, or auto-select first assistant if not configured\n // Also re-select if currentAssistant is no longer in the assistants list\n useEffect(() => {\n console.log(\n \"[AssistantContext] selection effect fired\",\n {\n initialAssistantId,\n assistantsCount: state.assistants.length,\n currentAssistantId: state.currentAssistant?.id,\n currentAssistantName: state.currentAssistant?.name,\n }\n );\n\n if (state.assistants.length > 0) {\n const isCurrentAssistantValid =\n state.currentAssistant &&\n state.assistants.some((a) => a.id === state.currentAssistant?.id);\n\n console.log(\n \"[AssistantContext] isCurrentAssistantValid:\", isCurrentAssistantValid,\n \"initialAssistantId:\", initialAssistantId\n );\n\n if (!isCurrentAssistantValid) {\n if (initialAssistantId) {\n // Select the specified assistant\n const assistant = state.assistants.find(\n (a) => a.id === initialAssistantId\n );\n console.log(\n \"[AssistantContext] find result for\", initialAssistantId, \":\", assistant?.id ?? \"NOT FOUND\"\n );\n if (assistant) {\n setState((prev) => ({\n ...prev,\n currentAssistant: assistant,\n }));\n } else {\n // If initialAssistantId is not found, fallback to first assistant\n console.warn(\n `[AssistantContext] initialAssistantId \"${initialAssistantId}\" not found in assistant list, falling back to first assistant`,\n \"\\nassistants:\", state.assistants.map((a) => ({ id: a.id, name: a.name }))\n );\n setState((prev) => ({\n ...prev,\n currentAssistant: prev.assistants[0],\n }));\n }\n } else {\n // Auto-select the first assistant if no initialAssistantId is configured\n setState((prev) => ({\n ...prev,\n currentAssistant: prev.assistants[0],\n }));\n }\n }\n }\n }, [initialAssistantId, state.assistants, state.currentAssistant]);\n\n return (\n <AssistantContext.Provider\n value={{\n ...state,\n listAssistants,\n getAssistant,\n createAssistant,\n updateAssistant,\n deleteAssistant,\n selectAssistant,\n clearCurrentAssistant,\n refresh,\n }}\n >\n {children}\n </AssistantContext.Provider>\n );\n};\n\n/**\n * Hook to access AssistantContext\n * @returns Assistant context value\n * @throws Error if used outside of AssistantContextProvider\n */\nexport const useAssistantContext = (): AssistantContextValue => {\n const context = useContext(AssistantContext);\n\n if (!context) {\n throw new Error(\n \"useAssistantContext must be used within an AssistantContextProvider\"\n );\n }\n\n return context;\n};\n","/**\n * Axiom Theme Design Tokens\n *\n * Core design tokens for Axiom AI Design System.\n * Features: Indigo primary, medium radius, subtle shadows, slight transparency.\n */\n\n// ============================================\n// Color System\n// ============================================\n\nexport const colors = {\n // Primary - Indigo\n primary: {\n 50: '#f0f4ff',\n 100: '#e0e7ff',\n 200: '#c7d2fe',\n 300: '#a5b4fc',\n 400: '#818cf8',\n 500: '#6366f1', // main\n 600: '#4f46e5', // hover\n 700: '#4338ca',\n 800: '#3730a3',\n 900: '#312e81',\n },\n\n // Functional colors\n success: '#22c55e',\n warning: '#f59e0b',\n error: '#ef4444',\n info: '#3b82f6',\n\n // Neutral - Light Mode\n light: {\n bg: '#fafafa', // Page background\n surface: 'rgba(255, 255, 255, 1)', // Card background (slight transparency)\n surfaceHover: '#f9fafb',\n surfaceActive: '#f3f4f6',\n border: '#e5e7eb',\n borderHover: '#d1d5db',\n text: '#111827',\n textSecondary: '#6b7280',\n textMuted: '#9ca3af',\n },\n\n // Neutral - Dark Mode\n dark: {\n bg: '#0a0a0a',\n surface: 'rgba(23, 23, 23, 0.95)',\n surfaceHover: '#1f1f1f',\n surfaceActive: '#262626',\n border: '#27272a',\n borderHover: '#3f3f46',\n text: '#fafafa',\n textSecondary: '#a1a1aa',\n textMuted: '#71717a',\n },\n} as const;\n\n// ============================================\n// Border Radius - Medium\n// ============================================\n\nexport const radius = {\n none: '0',\n sm: '4px', // Small tags\n md: '10px', // Buttons, inputs\n lg: '16px', // Cards\n xl: '20px', // Large cards, modals (同步自 iOS 26)\n xxl: '28px', // Extra large containers\n xxxl: '32px', // Feature cards\n full: '9999px', // Fully rounded\n} as const;\n\n// ============================================\n// Spacing - 4px base\n// ============================================\n\nexport const spacing = {\n 0: '0',\n 1: '4px',\n 2: '8px',\n 3: '12px',\n 4: '16px',\n 5: '20px',\n 6: '24px',\n 8: '32px',\n 10: '40px',\n 12: '48px',\n} as const;\n\n// ============================================\n// Shadows - Subtle\n// ============================================\n\nexport const shadows = {\n none: 'none',\n sm: '0 1px 2px rgba(0, 0, 0, 0.04)',\n md: '0 2px 8px rgba(0, 0, 0, 0.06)', // Card default\n lg: '0 4px 12px rgba(0, 0, 0, 0.08)', // Card hover\n xl: '0 8px 24px rgba(0, 0, 0, 0.1)', // Modals\n} as const;\n\n// ============================================\n// Typography\n// ============================================\n\nexport const typography = {\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n\n sizes: {\n xs: { size: '12px', lineHeight: '16px', weight: 400 },\n sm: { size: '14px', lineHeight: '20px', weight: 400 },\n base: { size: '16px', lineHeight: '24px', weight: 400 },\n lg: { size: '18px', lineHeight: '28px', weight: 500 },\n xl: { size: '20px', lineHeight: '28px', weight: 600 },\n '2xl': { size: '24px', lineHeight: '32px', weight: 600 },\n },\n} as const;\n\n// ============================================\n// Animation\n// ============================================\n\nexport const animation = {\n duration: {\n fast: '150ms',\n normal: '250ms',\n slow: '350ms',\n },\n easing: {\n default: 'cubic-bezier(0.4, 0, 0.2, 1)',\n bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n },\n} as const;\n\n// ============================================\n// Complete Tokens Export\n// ============================================\n\nexport const axiomTokens = {\n colors,\n radius,\n spacing,\n shadows,\n typography,\n animation,\n} as const;\n\nexport default axiomTokens;\n","/**\n * Axiom Ant Design Theme Configuration\n *\n * Maps Axiom design tokens to Ant Design's theme system.\n * Used with ConfigProvider to style all antd components.\n */\n\nimport type { ThemeConfig } from 'antd';\nimport { axiomTokens } from './axiom-tokens';\n\n/**\n * Axiom Light Theme for Ant Design\n */\nexport const axiomAntdTheme: ThemeConfig = {\n token: {\n // ===== Colors =====\n colorPrimary: axiomTokens.colors.primary[500],\n colorPrimaryHover: axiomTokens.colors.primary[600],\n colorPrimaryActive: axiomTokens.colors.primary[700],\n\n colorSuccess: axiomTokens.colors.success,\n colorWarning: axiomTokens.colors.warning,\n colorError: axiomTokens.colors.error,\n colorInfo: axiomTokens.colors.info,\n\n // Text\n colorText: axiomTokens.colors.light.text,\n colorTextSecondary: axiomTokens.colors.light.textSecondary,\n colorTextTertiary: axiomTokens.colors.light.textMuted,\n\n // Backgrounds\n colorBgContainer: axiomTokens.colors.light.surface,\n colorBgElevated: axiomTokens.colors.light.surface,\n colorBgLayout: axiomTokens.colors.light.bg,\n\n // Borders\n colorBorder: axiomTokens.colors.light.border,\n colorBorderSecondary: axiomTokens.colors.light.borderHover,\n\n // ===== Typography =====\n fontFamily: axiomTokens.typography.fontFamily,\n fontSize: 16,\n fontSizeSM: 14,\n fontSizeLG: 18,\n lineHeight: 1.5,\n\n // ===== Border Radius =====\n borderRadius: 8, // md - buttons, inputs\n borderRadiusLG: 12, // lg - cards\n borderRadiusSM: 4, // sm - small elements\n borderRadiusXS: 2,\n\n // ===== Shadows =====\n boxShadow: axiomTokens.shadows.md,\n boxShadowSecondary: axiomTokens.shadows.lg,\n boxShadowTertiary: axiomTokens.shadows.xl,\n\n // ===== Animation =====\n motionDurationFast: axiomTokens.animation.duration.fast,\n motionDurationMid: axiomTokens.animation.duration.normal,\n motionDurationSlow: axiomTokens.animation.duration.slow,\n },\n\n // ===== Component Overrides =====\n components: {\n // Card - 12px radius, subtle shadow\n Card: {\n borderRadius: 12,\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.06)',\n },\n\n // Button - 8px radius, 40px height\n Button: {\n borderRadius: 8,\n controlHeight: 40,\n controlHeightLG: 44,\n controlHeightSM: 32,\n },\n\n // Input - 8px radius\n Input: {\n borderRadius: 8,\n controlHeight: 40,\n },\n\n // Modal - 16px radius\n Modal: {\n borderRadius: 16,\n },\n\n // Select - 8px radius\n Select: {\n borderRadius: 8,\n controlHeight: 40,\n },\n\n // Tag - 4px radius\n Tag: {\n borderRadius: 4,\n },\n\n // Alert\n Alert: {\n borderRadius: 8,\n },\n\n // Menu\n Menu: {\n borderRadius: 8,\n },\n\n // Dropdown\n Dropdown: {\n borderRadius: 8,\n },\n },\n};\n\n/**\n * Axiom Dark Theme for Ant Design\n */\nexport const axiomAntdThemeDark: ThemeConfig = {\n ...axiomAntdTheme,\n token: {\n ...axiomAntdTheme.token,\n // Dark mode colors\n colorText: axiomTokens.colors.dark.text,\n colorTextSecondary: axiomTokens.colors.dark.textSecondary,\n colorTextTertiary: axiomTokens.colors.dark.textMuted,\n\n colorBgContainer: axiomTokens.colors.dark.surface,\n colorBgElevated: axiomTokens.colors.dark.surface,\n colorBgLayout: axiomTokens.colors.dark.bg,\n colorBgMask: 'rgba(0, 0, 0, 0.7)',\n\n colorBorder: axiomTokens.colors.dark.border,\n colorBorderSecondary: axiomTokens.colors.dark.borderHover,\n },\n components: {\n ...axiomAntdTheme.components,\n // Modal needs explicit background override for dark mode\n Modal: {\n ...axiomAntdTheme.components?.Modal,\n colorBgElevated: axiomTokens.colors.dark.surface,\n },\n },\n};\n\n/**\n * Get Axiom theme based on dark mode preference\n */\nexport const getAxiomAntdTheme = (isDark = false): ThemeConfig => {\n return isDark ? axiomAntdThemeDark : axiomAntdTheme;\n};\n\nexport default axiomAntdTheme;\n","/**\n * useAxiomTheme Hook\n *\n * Provides access to Axiom design tokens and component styles.\n * Used for custom layouts and component-specific styling.\n * \n * Note: Ant Design components are automatically styled via ConfigProvider.\n * This hook is for custom elements and layout components only.\n */\n\nimport { createStyles } from 'antd-style';\nimport { axiomTokens } from './axiom-tokens';\n\nconst { colors, radius, spacing, shadows, typography, animation } = axiomTokens;\n\nexport const useAxiomTheme = () => {\n const { styles } = createStyles(({ css }) => ({\n // ============================================\n // Layout Containers\n // ============================================\n \n pageContainer: css`\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${spacing[8]};\n `,\n \n // ============================================\n // Card Styles (for custom cards, not antd Card)\n // ============================================\n \n card: css`\n background: ${colors.light.surface};\n border: 1px solid ${colors.light.border};\n border-radius: ${radius.lg};\n box-shadow: ${shadows.md};\n transition: all ${animation.duration.fast} ${animation.easing.default};\n \n &:hover {\n box-shadow: ${shadows.lg};\n }\n `,\n \n // ============================================\n // Header Section (for auth cards)\n // ============================================\n \n header: css`\n text-align: center;\n margin-bottom: ${spacing[8]};\n `,\n \n logo: css`\n width: 64px;\n height: 64px;\n background: ${colors.primary[500]};\n border-radius: ${radius.lg};\n margin: 0 auto ${spacing[5]};\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n \n title: css`\n margin: 0 0 ${spacing[2]} 0;\n font-size: ${typography.sizes.xl.size};\n font-weight: ${typography.sizes.xl.weight};\n color: ${colors.light.text};\n line-height: ${typography.sizes.xl.lineHeight};\n `,\n \n subtitle: css`\n font-size: ${typography.sizes.base.size};\n color: ${colors.light.textSecondary};\n margin: 0;\n line-height: ${typography.sizes.base.lineHeight};\n `,\n \n // ============================================\n // Form Elements (for custom forms, extends antd)\n // ============================================\n\n input: css`\n height: 44px;\n border-radius: ${radius.md};\n border: 1px solid ${colors.light.border};\n\n &:hover, &:focus {\n border-color: ${colors.primary[500]};\n }\n `,\n\n button: css`\n height: 44px;\n border-radius: ${radius.md};\n background: ${colors.primary[500]};\n border: none;\n\n &:hover {\n background: ${colors.primary[600]};\n }\n `,\n\n buttonGhost: css`\n height: 44px;\n border-radius: ${radius.md};\n background: transparent;\n border: 1px solid ${colors.light.border};\n color: ${colors.light.textSecondary};\n\n &:hover {\n border-color: ${colors.primary[500]};\n color: ${colors.primary[500]};\n }\n `,\n\n form: css`\n .ant-form-item {\n margin-bottom: ${spacing[4]};\n }\n\n .ant-form-item:last-child {\n margin-bottom: 0;\n }\n `,\n \n // ============================================\n // List Styles (for custom lists)\n // ============================================\n \n list: css`\n display: flex;\n flex-direction: column;\n gap: ${spacing[3]};\n margin-bottom: ${spacing[6]};\n `,\n \n listItem: css`\n display: flex;\n align-items: center;\n gap: ${spacing[4]};\n padding: ${spacing[4]};\n background: white;\n border: 1px solid ${colors.light.border};\n border-radius: ${radius.lg};\n cursor: pointer;\n transition: all ${animation.duration.fast} ${animation.easing.default};\n \n &:hover {\n border-color: ${colors.primary[500]};\n background: ${colors.light.surfaceHover};\n }\n \n &.selected {\n border-color: ${colors.primary[500]};\n background: ${colors.primary[100]}20;\n }\n `,\n \n listItemAvatar: css`\n width: 40px;\n height: 40px;\n border-radius: ${radius.md};\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${colors.light.border};\n color: ${colors.light.textSecondary};\n font-weight: 600;\n font-size: 16px;\n flex-shrink: 0;\n \n &.selected {\n background: ${colors.primary[500]};\n color: white;\n }\n `,\n \n listItemContent: css`\n flex: 1;\n min-width: 0;\n `,\n \n listItemTitle: css`\n font-size: ${typography.sizes.base.size};\n font-weight: 600;\n color: ${colors.light.text};\n margin: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n \n listItemDescription: css`\n font-size: ${typography.sizes.sm.size};\n color: ${colors.light.textSecondary};\n margin: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n \n // ============================================\n // Status & Feedback\n // ============================================\n \n alert: css`\n margin-bottom: ${spacing[5]};\n border-radius: ${radius.md};\n `,\n \n // ============================================\n // Footer\n // ============================================\n \n footer: css`\n margin-top: ${spacing[6]};\n padding-top: ${spacing[6]};\n border-top: 1px solid ${colors.light.border};\n text-align: center;\n `,\n \n // ============================================\n // Grid Layouts\n // ============================================\n \n grid: css`\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n gap: ${spacing[4]};\n `,\n \n // ============================================\n // Empty State\n // ============================================\n \n emptyIcon: css`\n width: 80px;\n height: 80px;\n border-radius: ${radius.xl};\n background: ${colors.light.surfaceHover};\n border: 1px solid ${colors.light.border};\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto ${spacing[5]};\n `,\n \n emptyTitle: css`\n font-size: ${typography.sizes.lg.size};\n font-weight: ${typography.sizes.lg.weight};\n color: ${colors.light.text};\n margin-bottom: ${spacing[1]};\n `,\n \n emptyDescription: css`\n font-size: ${typography.sizes.sm.size};\n color: ${colors.light.textSecondary};\n margin-bottom: ${spacing[5]};\n `,\n \n // ============================================\n // Create New Card (dashed border)\n // ============================================\n \n createCard: css`\n background: white;\n border: 1px dashed ${colors.light.borderHover};\n border-radius: ${radius.lg};\n transition: all ${animation.duration.fast} ${animation.easing.default};\n cursor: pointer;\n min-height: 140px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: ${spacing[3]};\n \n &:hover {\n border-color: ${colors.primary[500]};\n border-style: solid;\n background: ${colors.primary[50]};\n }\n `,\n \n createCardList: css`\n display: flex;\n align-items: center;\n gap: ${spacing[4]};\n padding: ${spacing[4]};\n background: white;\n border: 1px dashed ${colors.light.borderHover};\n border-radius: ${radius.md};\n transition: all ${animation.duration.fast} ${animation.easing.default};\n cursor: pointer;\n \n &:hover {\n border-color: ${colors.primary[500]};\n border-style: solid;\n background: ${colors.primary[50]};\n }\n `,\n \n createIconWrapper: css`\n width: 48px;\n height: 48px;\n border-radius: ${radius.md};\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${colors.light.surfaceHover};\n `,\n \n createText: css`\n font-size: ${typography.sizes.base.size};\n font-weight: 500;\n color: ${colors.light.textSecondary};\n `,\n }))();\n \n return {\n tokens: axiomTokens,\n styles,\n };\n};\n\nexport default useAxiomTheme;\n","/**\n * Login Form Components\n * Uses base styles from design system\n */\n\nimport React, { useState } from \"react\";\nimport { Button, Form, Input, Typography, Alert, Card } from \"antd\";\nimport { UserOutlined, LockOutlined, MailOutlined } from \"@ant-design/icons\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { Sparkles } from \"lucide-react\";\nimport { useAxiomTheme } from \"../../theme\";\nimport { useT } from \"../../i18n\";\n\nconst { Text } = Typography;\n\nexport interface LoginFormProps {\n onSuccess?: () => void;\n onCancel?: () => void;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n footer?: React.ReactNode;\n className?: string;\n}\n\nexport const LoginForm: React.FC<LoginFormProps> = ({\n onSuccess,\n onCancel,\n logo,\n title,\n subtitle,\n footer,\n className = \"\",\n}) => {\n // Prop defaults cannot be localized in the parameter list (it is evaluated\n // before the hook runs), so they are resolved here instead.\n const t = useT();\n const resolvedTitle = title ?? t(\"auth.login.title\");\n const resolvedSubtitle = subtitle ?? t(\"auth.login.subtitle\");\n const { styles } = useAxiomTheme();\n const { login, isLoading, error, clearError } = useAuth();\n const [form] = Form.useForm();\n\n const handleSubmit = async (values: { email: string; password: string }) => {\n clearError();\n try {\n await login(values.email, values.password);\n onSuccess?.();\n } catch { /* intentionally empty */ }\n };\n\n return (\n <Card className={`${styles.card} ${className}`} style={{ width: 400 }}>\n <div className={styles.header}>\n {logo || (\n <div className={styles.logo}>\n <Sparkles size={28} color=\"white\" />\n </div>\n )}\n <h2 className={styles.title}>{resolvedTitle}</h2>\n <p className={styles.subtitle}>{resolvedSubtitle}</p>\n </div>\n\n {error && (\n <Alert message={error} type=\"error\" showIcon className={styles.alert} />\n )}\n\n <Form form={form} onFinish={handleSubmit} layout=\"vertical\" className={styles.form}>\n <Form.Item name=\"email\" rules={[{ required: true }, { type: \"email\" }]}>\n <Input prefix={<MailOutlined />} placeholder={t(\"auth.field.email\")} className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"password\" rules={[{ required: true }]}>\n <Input.Password prefix={<LockOutlined />} placeholder={t(\"auth.field.password\")} className={styles.input} />\n </Form.Item>\n\n <Button type=\"primary\" htmlType=\"submit\" loading={isLoading} block>\n {t(\"auth.login.submit\")}\n </Button>\n\n {onCancel && (\n <Button onClick={onCancel} block className={styles.buttonGhost} style={{ marginTop: 8 }}>\n {t(\"common.cancel\")}\n </Button>\n )}\n </Form>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </Card>\n );\n};\n\nexport const LoginPage: React.FC<any> = (props) => {\n return (\n <div style={{ minHeight: '100vh', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <LoginForm {...props} />\n </div>\n );\n};\n\nexport interface RegisterFormProps {\n onSuccess?: () => void;\n onCancel?: () => void;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n footer?: React.ReactNode;\n className?: string;\n}\n\nexport const RegisterForm: React.FC<RegisterFormProps> = ({\n onSuccess,\n onCancel,\n logo,\n title,\n subtitle,\n footer,\n className = \"\",\n}) => {\n const t = useT();\n const resolvedTitle = title ?? t(\"auth.register.title\");\n const resolvedSubtitle = subtitle ?? t(\"auth.register.subtitle\");\n const { styles } = useAxiomTheme();\n const { login, register } = useAuth();\n const [form] = Form.useForm();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n\n const handleSubmit = async (values: {\n email: string;\n password: string;\n confirmPassword: string;\n name: string;\n }) => {\n setError(null);\n setSuccessMessage(null);\n\n if (values.password !== values.confirmPassword) {\n setError(t(\"auth.error.passwordMismatch\"));\n return;\n }\n\n setIsLoading(true);\n\n try {\n const result = await register(values.email, values.password, values.name);\n setSuccessMessage(result.message);\n\n if (result.token) {\n await login(values.email, values.password);\n onSuccess?.();\n } else {\n setTimeout(() => onSuccess?.(), 2000);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : t(\"auth.error.registerFailed\"));\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Card className={`${styles.card} ${className}`} style={{ width: 400 }}>\n <div className={styles.header}>\n {logo || (\n <div className={styles.logo}>\n <Sparkles size={28} color=\"white\" />\n </div>\n )}\n <h2 className={styles.title}>{resolvedTitle}</h2>\n <p className={styles.subtitle}>{resolvedSubtitle}</p>\n </div>\n\n {error && <Alert message={error} type=\"error\" showIcon className={styles.alert} />}\n {successMessage && <Alert message={successMessage} type=\"success\" showIcon className={styles.alert} />}\n\n <Form form={form} onFinish={handleSubmit} layout=\"vertical\" className={styles.form}>\n <Form.Item name=\"name\" rules={[{ required: true }]}>\n <Input prefix={<UserOutlined />} placeholder={t(\"auth.field.fullName\")} className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"email\" rules={[{ required: true }, { type: \"email\" }]}>\n <Input prefix={<MailOutlined />} placeholder={t(\"auth.field.email\")} className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"password\" rules={[{ required: true }, { min: 6 }]}>\n <Input.Password prefix={<LockOutlined />} placeholder={t(\"auth.field.password\")} className={styles.input} />\n </Form.Item>\n\n <Form.Item name=\"confirmPassword\" rules={[{ required: true }]}>\n <Input.Password prefix={<LockOutlined />} placeholder={t(\"auth.field.confirmPassword\")} className={styles.input} />\n </Form.Item>\n\n <Button type=\"primary\" htmlType=\"submit\" loading={isLoading} block>\n {t(\"auth.register.submit\")}\n </Button>\n\n {onCancel && (\n <Button onClick={onCancel} block className={styles.buttonGhost} style={{ marginTop: 8 }}>\n {t(\"common.cancel\")}\n </Button>\n )}\n </Form>\n\n {footer && <div className={styles.footer}>{footer}</div>}\n </Card>\n );\n};\n","/**\n * User Profile Components\n * Using Axiom Theme with Ant Design\n */\n\nimport React from \"react\";\nimport { Button, Avatar, Typography, Space, Card, Spin } from \"antd\";\nimport { LogOut, User, Building2 } from \"lucide-react\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { useT } from \"../../i18n\";\n\nconst { Text } = Typography;\n\nexport interface UserProfileProps {\n /** Called when user clicks logout */\n onLogout?: () => void;\n /** Show tenant information */\n showTenantSwitcher?: boolean;\n /** Custom class name */\n className?: string;\n}\n\n/**\n * User Profile Component\n */\nexport const UserProfile: React.FC<UserProfileProps> = ({\n onLogout,\n showTenantSwitcher = true,\n className = \"\",\n}) => {\n const t = useT();\n const { user, currentTenant, logout, isLoading } = useAuth();\n\n if (!user) {\n return null;\n }\n\n const handleLogout = () => {\n logout();\n onLogout?.();\n };\n\n const userInitial = user.name?.charAt(0).toUpperCase() || user.email.charAt(0).toUpperCase();\n\n return (\n <Card\n className={className}\n style={{ width: 320, borderRadius: 20 }}\n bodyStyle={{ padding: 24 }}\n >\n <Space direction=\"vertical\" size={20} style={{ width: \"100%\" }}>\n {/* User Info */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16 }}>\n <Avatar\n size={56}\n style={{\n background: `linear-gradient(135deg, ${'#6366f1'} 0%, ${'#818cf8'} 100%)`,\n color: \"white\",\n fontSize: 22,\n fontWeight: 700,\n flexShrink: 0,\n }}\n >\n {userInitial}\n </Avatar>\n \n <div style={{ flex: 1, minWidth: 0 }}>\n <Text\n style={{\n fontWeight: 600,\n marginBottom: 4,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"block\",\n fontSize: 16,\n }}\n >\n {user.name || user.email}\n </Text>\n <Text\n type=\"secondary\"\n style={{\n fontSize: 13,\n display: \"block\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {user.email}\n </Text>\n </div>\n </div>\n\n {/* Tenant Info */}\n {showTenantSwitcher && currentTenant && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: 12,\n background: '#f2f2f7',\n borderRadius: 12,\n }}\n >\n <Building2 size={18} color=\"#6366f1\" />\n <div style={{ flex: 1, minWidth: 0 }}>\n <Text\n style={{\n fontSize: 11,\n color: '#8e8e93',\n textTransform: \"uppercase\",\n letterSpacing: 0.5,\n display: \"block\",\n marginBottom: 2,\n }}\n >\n {t(\"auth.user.currentWorkspace\")}\n </Text>\n <Text\n style={{\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"block\",\n }}\n >\n {currentTenant.name}\n </Text>\n </div>\n </div>\n )}\n\n {/* Logout Button */}\n <Button\n onClick={handleLogout}\n disabled={isLoading}\n block\n icon={<LogOut size={18} />}\n danger\n size=\"large\"\n style={{ height: 48 }}\n >\n {isLoading ? t(\"auth.user.loggingOut\") : t(\"auth.user.logout\")}\n </Button>\n </Space>\n </Card>\n );\n};\n\nexport interface ProtectedRouteProps {\n children: React.ReactNode;\n /** Component to show when not authenticated */\n fallback?: React.ReactNode;\n /** Redirect URL (if using react-router) */\n redirectTo?: string;\n}\n\n/**\n * Protected Route Component\n * Shows loading state, redirects, or fallback when not authenticated\n */\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({\n children,\n fallback,\n redirectTo,\n}) => {\n const t = useT();\n const { isAuthenticated, isLoading } = useAuth();\n\n if (isLoading) {\n return (\n <div\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: '#f2f2f7',\n }}\n >\n <Card style={{ borderRadius: 20 }}>\n <div style={{ textAlign: \"center\", padding: \"32px 48px\" }}>\n <Spin size=\"large\" />\n <Text type=\"secondary\" style={{ display: 'block', marginTop: 16 }}>{t(\"common.loading\")}</Text>\n </div>\n </Card>\n </div>\n );\n }\n\n if (!isAuthenticated) {\n if (fallback) {\n return <>{fallback}</>;\n }\n if (redirectTo && typeof window !== \"undefined\") {\n window.location.href = redirectTo;\n return null;\n }\n return (\n <div\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: '#f2f2f7',\n padding: 32,\n }}\n >\n <Card style={{ textAlign: \"center\", borderRadius: 20 }}>\n <div\n style={{\n width: 64,\n height: 64,\n background: '#e5e5ea',\n borderRadius: 16,\n margin: \"0 auto 20px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <User size={28} color=\"#8e8e93\" />\n </div>\n <Typography.Title level={4} style={{ marginBottom: 8 }}>\n {t(\"auth.protected.title\")}\n </Typography.Title>\n <Text type=\"secondary\">\n {t(\"auth.protected.description\")}\n </Text>\n </Card>\n </div>\n );\n }\n\n return <>{children}</>;\n};\n","import React, { useState, useEffect } from \"react\";\nimport { Building2 } from \"lucide-react\";\nimport { useT } from \"../../i18n\";\n\nexport interface TenantLogoProps {\n /** Tenant logo URL (or null if not configured) */\n logoUrl: string | null;\n /** Logo size in pixels (default 28, matches Menu's default Cpu size) */\n size?: number;\n /** Fallback icon color (default #1677ff to match Menu's Cpu icon) */\n fallbackColor?: string;\n /** Tenant name for accessible alt text */\n tenantName?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Renders a tenant's logo image with fallback to the Building2 icon.\n *\n * On image load error, switches to Building2 icon.\n * When logoUrl changes, resets error state so the new URL is attempted.\n * When no logoUrl is provided, renders Building2 immediately.\n */\nexport const TenantLogo: React.FC<TenantLogoProps> = ({\n logoUrl,\n size = 28,\n fallbackColor = \"#1677ff\",\n tenantName,\n className,\n}) => {\n const t = useT();\n const [imgError, setImgError] = useState(false);\n\n useEffect(() => {\n setImgError(false);\n }, [logoUrl]);\n\n if (!logoUrl || imgError) {\n return <Building2 size={size} color={fallbackColor} className={className} />;\n }\n\n return (\n <img\n src={logoUrl}\n alt={\n tenantName\n ? t(\"auth.tenantLogo.alt\", { name: tenantName })\n : t(\"auth.tenantLogo.altFallback\")\n }\n width={size}\n height={size}\n referrerPolicy=\"no-referrer\"\n style={{\n borderRadius: 4,\n objectFit: \"contain\",\n display: \"block\",\n }}\n onError={() => setImgError(true)}\n className={className}\n />\n );\n};\n","import { useAuth } from \"../context/AuthContext\";\nimport { useMemo } from \"react\";\n\nexport interface TenantBrandingData {\n /** Raw logo URL from tenant metadata, or null if not configured */\n logoUrl: string | null;\n /** Current tenant name, or empty string if no tenant selected */\n tenantName: string;\n}\n\nexport const getLogoSrc = (metadata?: Record<string, unknown>): string | null => {\n const url = metadata?.logoUrl;\n return typeof url === \"string\" && url.length > 0 ? url : null;\n};\n\n/**\n * Reads the current tenant's branding information from AuthContext.\n * Extracts `metadata.logoUrl` and tenant name for use in UI components.\n *\n * @returns Tenant branding data — logo URL and name.\n */\nexport function useTenantBranding(): TenantBrandingData {\n const { currentTenant } = useAuth();\n\n return useMemo(() => {\n const logoUrl = getLogoSrc(currentTenant?.metadata as Record<string, unknown>);\n const tenantName = currentTenant?.name ?? \"\";\n\n return { logoUrl, tenantName };\n }, [currentTenant?.metadata?.logoUrl, currentTenant?.name]);\n}\n","/**\n * Tenant Selector\n *\n * Picker for choosing a tenant. Designed for the \"many tenants\" case:\n * search + a card grid in its own scroll region, and a footer that stays\n * pinned so Confirm is always reachable.\n *\n * The grid is one column for a handful of tenants and two columns once the\n * list grows (6+). The API is permission-managed and only returns tenants the\n * user may see, so there is no status filter.\n *\n * Renders correctly both inside a modal (the two Chat hosts) and standalone\n * centered on a page (apps/web), so the panel is width:100% + maxWidth rather\n * than a fixed width.\n */\n\nimport React, { useState, useEffect, useMemo, useCallback } from \"react\";\nimport { Tenant } from \"@axiom-lattice/protocols\";\nimport { Button, Input, Spin, theme } from \"antd\";\nimport { createStyles } from \"antd-style\";\nimport { X, Search, ArrowRight, LogOut } from \"lucide-react\";\nimport { TenantLogo } from \"./TenantLogo\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { getLogoSrc } from \"../../hooks/useTenantBranding\";\nimport { useT } from \"../../i18n\";\n\nconst { useToken } = theme;\n\n/** Two columns once the visible list reaches this size; one below it. */\nconst TWO_COLUMN_THRESHOLD = 6;\n\nconst useStyles = createStyles(({ token, css }) => ({\n surface: css`\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: 720px;\n max-height: min(84vh, 760px);\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: 16px;\n box-shadow: ${token.boxShadowSecondary};\n overflow: hidden;\n `,\n\n closeButton: css`\n position: absolute;\n top: 12px;\n right: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: ${token.colorTextTertiary};\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n\n &:hover {\n background: ${token.colorFillSecondary};\n color: ${token.colorText};\n }\n\n &:focus-visible {\n outline: 2px solid ${token.colorPrimary};\n outline-offset: 2px;\n }\n `,\n\n // ============================================\n // Header\n // ============================================\n\n header: css`\n flex-shrink: 0;\n padding: 24px 24px 16px;\n text-align: center;\n `,\n\n logo: css`\n width: 64px;\n height: 64px;\n background: ${token.colorPrimary};\n border-radius: 16px;\n margin: 0 auto 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n\n title: css`\n margin: 0 0 4px;\n font-size: ${token.fontSizeHeading4}px;\n font-weight: 600;\n color: ${token.colorText};\n line-height: 1.4;\n `,\n\n subtitle: css`\n margin: 0;\n font-size: ${token.fontSize}px;\n color: ${token.colorTextSecondary};\n line-height: 1.5;\n `,\n\n // ============================================\n // Toolbar\n // ============================================\n\n toolbar: css`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 24px 12px;\n `,\n\n // ============================================\n // Scroll region — the list scrolls, not the panel\n // ============================================\n\n scrollRegion: css`\n flex: 1 1 auto;\n min-height: 120px;\n max-height: min(52vh, 460px);\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0 24px;\n position: relative;\n\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n &::-webkit-scrollbar-thumb {\n background: ${token.colorBorder};\n border-radius: 4px;\n }\n `,\n\n grid: css`\n display: grid;\n gap: ${token.marginSM}px;\n padding-bottom: 4px;\n `,\n\n gridOne: css`\n grid-template-columns: minmax(0, 1fr);\n `,\n\n gridTwo: css`\n grid-template-columns: repeat(2, minmax(0, 1fr));\n\n @media (max-width: 480px) {\n grid-template-columns: minmax(0, 1fr);\n }\n `,\n\n // ============================================\n // Tenant card\n // ============================================\n\n card: css`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n min-height: 64px;\n width: 100%;\n min-width: 0;\n text-align: left;\n /* A <button> does not inherit the page font by default. */\n font: inherit;\n color: inherit;\n background: ${token.colorBgContainer};\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: 12px;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n\n &:hover {\n border-color: ${token.colorPrimaryBorder};\n background: ${token.colorFillQuaternary};\n }\n\n &:focus-visible {\n outline: 2px solid ${token.colorPrimary};\n outline-offset: 2px;\n }\n\n /* The border + tint is the whole selected affordance — no check icon. */\n &[aria-pressed=\"true\"] {\n border-color: ${token.colorPrimary};\n background: ${token.colorPrimaryBg};\n }\n `,\n\n avatar: css`\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n font-size: ${token.fontSizeLG}px;\n font-weight: 600;\n `,\n\n cardBody: css`\n flex: 1;\n min-width: 0;\n `,\n\n cardName: css`\n margin: 0;\n font-size: ${token.fontSize}px;\n font-weight: 600;\n line-height: 1.4;\n color: ${token.colorText};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n\n cardDescription: css`\n margin: 2px 0 0;\n font-size: ${token.fontSizeSM}px;\n line-height: 1.4;\n color: ${token.colorTextTertiary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n\n // ============================================\n // Empty / loading states\n // ============================================\n\n centeredBody: css`\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 48px 24px;\n text-align: center;\n color: ${token.colorTextSecondary};\n `,\n\n emptyTitle: css`\n font-size: ${token.fontSizeLG}px;\n font-weight: 600;\n color: ${token.colorText};\n `,\n\n // ============================================\n // Footer — pinned\n // ============================================\n\n footer: css`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 16px 24px;\n border-top: 1px solid ${token.colorBorderSecondary};\n background: ${token.colorFillQuaternary};\n `,\n\n srOnly: css`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n `,\n}));\n\nexport interface TenantSelectorProps {\n tenants: Tenant[];\n currentTenantId?: string | null;\n onSelect: (tenant: Tenant) => void;\n /** Renders a \"Log Out\" button in the footer when no onCancel is given. */\n onLogout?: () => void;\n /**\n * When provided, renders a Cancel button and a close icon in the panel header.\n * Omit for a flow the user cannot back out of (e.g. first-run tenant selection).\n */\n onCancel?: () => void;\n isLoading?: boolean;\n className?: string;\n title?: string;\n description?: string;\n}\n\nexport const TenantSelector: React.FC<TenantSelectorProps> = ({\n tenants,\n currentTenantId,\n onSelect,\n onLogout,\n onCancel,\n isLoading = false,\n className = \"\",\n title,\n description,\n}) => {\n // Prop defaults are resolved in the body so they can be localized.\n const t = useT();\n const resolvedTitle = title ?? t(\"auth.tenant.selectTitle\");\n const resolvedDescription = description ?? t(\"auth.tenant.chooseDescription\");\n const { styles } = useStyles();\n const { token } = useToken();\n const { logout } = useAuth();\n\n const [selectedId, setSelectedId] = useState<string | null>(currentTenantId ?? null);\n const [search, setSearch] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n useEffect(() => {\n setSelectedId(currentTenantId ?? null);\n }, [currentTenantId]);\n\n const filtered = useMemo(() => {\n const query = search.trim().toLowerCase();\n if (!query) return tenants;\n return tenants.filter(\n (tenant) =>\n tenant.name.toLowerCase().includes(query) ||\n (tenant.description ?? \"\").toLowerCase().includes(query)\n );\n }, [tenants, search]);\n\n // Deliberately keyed off `tenants`, not `filtered`: a tenant hidden by the\n // search must not silently disable Confirm.\n const canConfirm = !!selectedId && tenants.some((t) => t.id === selectedId);\n const isFiltering = search.trim().length > 0;\n\n const handleContinue = useCallback(async () => {\n const tenant = tenants.find((t) => t.id === selectedId);\n if (!tenant) return;\n setIsSubmitting(true);\n try {\n await onSelect(tenant);\n } finally {\n setIsSubmitting(false);\n }\n }, [tenants, selectedId, onSelect]);\n\n const handleLogout = useCallback(() => {\n logout();\n onLogout?.();\n }, [logout, onLogout]);\n\n const handleResetSearch = useCallback(() => {\n setSearch(\"\");\n }, []);\n\n const selectedTenant = tenants.find((t) => t.id === selectedId);\n const headerLogoUrl = getLogoSrc(selectedTenant?.metadata as Record<string, unknown>);\n const hasHeaderLogo = !!headerLogoUrl;\n\n const closeButton = onCancel ? (\n <button\n type=\"button\"\n className={styles.closeButton}\n onClick={onCancel}\n aria-label={t(\"common.close\")}\n >\n <X size={16} />\n </button>\n ) : null;\n\n if (isLoading) {\n return (\n <div className={`${styles.surface} ${className}`}>\n {closeButton}\n <div className={styles.centeredBody}>\n <Spin />\n <span>{t(\"common.loading\")}</span>\n </div>\n </div>\n );\n }\n\n if (tenants.length === 0) {\n return (\n <div className={`${styles.surface} ${className}`}>\n {closeButton}\n <div className={styles.centeredBody}>\n <span className={styles.emptyTitle}>{t(\"auth.tenant.noWorkspaces\")}</span>\n <span>{t(\"auth.tenant.noWorkspacesHint\")}</span>\n </div>\n {onLogout && (\n <div className={styles.footer}>\n <Button onClick={handleLogout} icon={<LogOut size={16} />}>\n {t(\"auth.tenant.logout\")}\n </Button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={`${styles.surface} ${className}`}>\n {closeButton}\n\n <div className={styles.header}>\n <div\n className={styles.logo}\n style={hasHeaderLogo ? { background: \"transparent\" } : undefined}\n >\n <TenantLogo\n logoUrl={headerLogoUrl}\n size={hasHeaderLogo ? 48 : 28}\n fallbackColor=\"white\"\n />\n </div>\n <h2 className={styles.title}>{resolvedTitle}</h2>\n <p className={styles.subtitle}>{resolvedDescription}</p>\n </div>\n\n <div className={styles.toolbar}>\n <Input\n style={{ flex: 1, minWidth: 0 }}\n placeholder={t(\"auth.tenant.searchPlaceholder\")}\n aria-label={t(\"auth.tenant.searchAriaLabel\")}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onPressEnter={() => {\n if (canConfirm) handleContinue();\n }}\n prefix={<Search size={16} style={{ color: token.colorTextTertiary }} />}\n allowClear\n autoFocus\n />\n </div>\n\n <div className={styles.scrollRegion}>\n <span className={styles.srOnly} aria-live=\"polite\">\n {filtered.length}{\" \"}\n {filtered.length === 1\n ? t(\"auth.tenant.countOne\")\n : t(\"auth.tenant.countOther\")}\n </span>\n\n {filtered.length === 0 ? (\n <div className={styles.centeredBody}>\n <span className={styles.emptyTitle}>{t(\"auth.tenant.noMatch\")}</span>\n <span>{t(\"auth.tenant.noMatchHint\")}</span>\n {isFiltering && (\n <Button size=\"small\" onClick={handleResetSearch}>\n {t(\"auth.tenant.showAll\")}\n </Button>\n )}\n </div>\n ) : (\n <div\n data-testid=\"tenant-grid\"\n data-columns={filtered.length >= TWO_COLUMN_THRESHOLD ? 2 : 1}\n className={`${styles.grid} ${\n filtered.length >= TWO_COLUMN_THRESHOLD ? styles.gridTwo : styles.gridOne\n }`}\n >\n {filtered.map((tenant) => {\n const isSelected = selectedId === tenant.id;\n const logoSrc = getLogoSrc(tenant.metadata as Record<string, unknown>);\n\n return (\n <button\n key={tenant.id}\n type=\"button\"\n aria-pressed={isSelected}\n data-testid=\"tenant-option\"\n data-tenant-id={tenant.id}\n data-tenant-name={tenant.name}\n className={styles.card}\n onClick={() => setSelectedId(tenant.id)}\n >\n <div\n className={styles.avatar}\n style={{\n background: logoSrc\n ? \"transparent\"\n : isSelected\n ? token.colorPrimary\n : token.colorFillSecondary,\n }}\n >\n {logoSrc ? (\n <TenantLogo logoUrl={logoSrc} size={28} />\n ) : (\n <span\n style={{\n color: isSelected ? \"white\" : token.colorTextSecondary,\n }}\n >\n {tenant.name.charAt(0).toUpperCase() || \"?\"}\n </span>\n )}\n </div>\n\n <div className={styles.cardBody}>\n <p className={styles.cardName}>{tenant.name}</p>\n {tenant.description && (\n <p className={styles.cardDescription}>{tenant.description}</p>\n )}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n <div className={styles.footer}>\n {onCancel ? (\n <Button onClick={onCancel}>{t(\"common.cancel\")}</Button>\n ) : onLogout ? (\n <Button onClick={handleLogout} icon={<LogOut size={16} />}>\n {t(\"auth.tenant.logout\")}\n </Button>\n ) : (\n <span />\n )}\n\n <Button\n type=\"primary\"\n onClick={handleContinue}\n loading={isSubmitting}\n disabled={!canConfirm}\n icon={<ArrowRight size={16} />}\n >\n {t(\"common.confirm\")}\n </Button>\n </div>\n </div>\n );\n};\n\nexport default TenantSelector;\n","import React, { useState } from \"react\";\nimport { Modal, Form, Input, Button, Alert } from \"antd\";\nimport { LockOutlined } from \"@ant-design/icons\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { useT } from \"../../i18n\";\n\nexport interface ChangePasswordModalProps {\n open: boolean;\n onClose: () => void;\n onSuccess?: () => void;\n}\n\nexport const ChangePasswordModal: React.FC<ChangePasswordModalProps> = ({\n open,\n onClose,\n onSuccess,\n}) => {\n const t = useT();\n const { changePassword, isLoading } = useAuth();\n const [form] = Form.useForm();\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n\n const handleSubmit = async (values: {\n currentPassword: string;\n newPassword: string;\n confirmPassword: string;\n }) => {\n setError(null);\n setSuccess(false);\n\n if (values.newPassword !== values.confirmPassword) {\n setError(t(\"auth.error.passwordMismatch\"));\n return;\n }\n\n try {\n await changePassword(values.currentPassword, values.newPassword);\n setSuccess(true);\n form.resetFields();\n onSuccess?.();\n setTimeout(() => {\n onClose();\n setSuccess(false);\n }, 1500);\n } catch (err) {\n setError(err instanceof Error ? err.message : t(\"auth.changePassword.failed\"));\n }\n };\n\n const handleCancel = () => {\n form.resetFields();\n setError(null);\n setSuccess(false);\n onClose();\n };\n\n return (\n <Modal\n title={t(\"auth.changePassword.title\")}\n open={open}\n onCancel={handleCancel}\n footer={null}\n width={400}\n >\n {error && (\n <Alert\n message={error}\n type=\"error\"\n showIcon\n style={{ marginBottom: 16 }}\n />\n )}\n {success && (\n <Alert\n message={t(\"auth.changePassword.success\")}\n type=\"success\"\n showIcon\n style={{ marginBottom: 16 }}\n />\n )}\n\n <Form\n form={form}\n onFinish={handleSubmit}\n layout=\"vertical\"\n >\n <Form.Item\n name=\"currentPassword\"\n rules={[\n { required: true, message: t(\"auth.changePassword.currentRequired\") },\n ]}\n >\n <Input.Password\n prefix={<LockOutlined />}\n placeholder={t(\"auth.field.currentPassword\")}\n />\n </Form.Item>\n\n <Form.Item\n name=\"newPassword\"\n rules={[\n { required: true, message: t(\"auth.changePassword.newRequired\") },\n { min: 6, message: t(\"auth.changePassword.tooShort\") },\n ]}\n >\n <Input.Password\n prefix={<LockOutlined />}\n placeholder={t(\"auth.field.newPassword\")}\n />\n </Form.Item>\n\n <Form.Item\n name=\"confirmPassword\"\n rules={[\n { required: true, message: t(\"auth.changePassword.confirmRequired\") },\n ]}\n >\n <Input.Password\n prefix={<LockOutlined />}\n placeholder={t(\"auth.field.confirmNewPassword\")}\n />\n </Form.Item>\n\n <Form.Item style={{ marginBottom: 0 }}>\n <Button\n type=\"primary\"\n htmlType=\"submit\"\n loading={isLoading}\n block\n >\n {t(\"auth.changePassword.submit\")}\n </Button>\n </Form.Item>\n </Form>\n </Modal>\n );\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { Tenant } from \"@axiom-lattice/protocols\";\nimport { useT } from \"../i18n\";\n\nexport interface UseTenantsOptions {\n baseURL: string;\n token?: string;\n}\n\nexport interface UseTenantsReturn {\n tenants: Tenant[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n getTenantById: (id: string) => Tenant | undefined;\n}\n\n/**\n * Fetches and manages a list of tenants from the API.\n *\n * @param options - Configuration options\n * @param options.baseURL - The base URL of the API gateway\n * @param options.token - Optional authentication token\n * @returns Tenant list, loading state, error, refresh function, and lookup helper\n *\n * @example\n * ```tsx\n * const { tenants, isLoading, error, refresh, getTenantById } = useTenants({\n * baseURL: \"https://api.example.com\",\n * token: \"your-auth-token\",\n * });\n * ```\n */\nexport function useTenants(options: UseTenantsOptions): UseTenantsReturn {\n const { baseURL, token } = options;\n const t = useT();\n const [tenants, setTenants] = useState<Tenant[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchTenants = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(`${baseURL}/api/tenants`, { headers });\n \n if (!response.ok) {\n throw new Error(t(\"auth.error.fetchTenantsFailed\"));\n }\n\n const { data } = await response.json();\n setTenants(data || []);\n } catch (err) {\n const message = err instanceof Error ? err.message : t(\"auth.error.fetchTenantsFailed\");\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [baseURL, token, t]);\n\n useEffect(() => {\n fetchTenants();\n }, [fetchTenants]);\n\n const getTenantById = useCallback((id: string) => {\n return tenants.find(t => t.id === id);\n }, [tenants]);\n\n return {\n tenants,\n isLoading,\n error,\n refresh: fetchTenants,\n getTenantById,\n };\n}\n\nexport interface UseUsersOptions {\n baseURL: string;\n tenantId: string;\n token?: string;\n}\n\nexport interface UseUsersReturn {\n users: import(\"@axiom-lattice/protocols\").User[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n searchByEmail: (email: string) => Promise<import(\"@axiom-lattice/protocols\").User | null>;\n}\n\n/**\n * Fetches and manages a list of users within a tenant.\n *\n * @param options - Configuration options\n * @param options.baseURL - The base URL of the API gateway\n * @param options.tenantId - The tenant ID to fetch users for\n * @param options.token - Optional authentication token\n * @returns User list, loading state, error, refresh function, and email search helper\n *\n * @example\n * ```tsx\n * const { users, isLoading, error, searchByEmail } = useUsers({\n * baseURL: \"https://api.example.com\",\n * tenantId: \"tenant-123\",\n * });\n *\n * const user = await searchByEmail(\"user@example.com\");\n * ```\n */\nexport function useUsers(options: UseUsersOptions): UseUsersReturn {\n const { baseURL, tenantId, token } = options;\n const t = useT();\n const [users, setUsers] = useState<import(\"@axiom-lattice/protocols\").User[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchUsers = useCallback(async () => {\n if (!tenantId) return;\n \n setIsLoading(true);\n setError(null);\n try {\n const headers: Record<string, string> = {\n \"x-tenant-id\": tenantId,\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(`${baseURL}/api/users`, { headers });\n \n if (!response.ok) {\n throw new Error(t(\"auth.error.fetchUsersFailed\"));\n }\n\n const { data } = await response.json();\n setUsers(data || []);\n } catch (err) {\n const message = err instanceof Error ? err.message : t(\"auth.error.fetchUsersFailed\");\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [baseURL, tenantId, token, t]);\n\n useEffect(() => {\n fetchUsers();\n }, [fetchUsers]);\n\n const searchByEmail = useCallback(async (email: string) => {\n if (!tenantId || !email) return null;\n \n try {\n const headers: Record<string, string> = {\n \"x-tenant-id\": tenantId,\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(\n `${baseURL}/api/users?email=${encodeURIComponent(email)}`,\n { headers }\n );\n \n if (!response.ok) {\n return null;\n }\n\n const { data } = await response.json();\n return data?.[0] || null;\n } catch {\n return null;\n }\n }, [baseURL, tenantId, token]);\n\n return {\n users,\n isLoading,\n error,\n refresh: fetchUsers,\n searchByEmail,\n };\n}\n","/**\n * WorkspaceContext\n *\n * Context for workspace and project management\n */\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n ReactNode,\n} from \"react\";\nimport { WorkspaceClient, Client, type Workspace, type Project, type FileItem, type CreateWorkspaceRequest, type UpdateWorkspaceRequest, type CreateProjectRequest, type UpdateProjectRequest } from \"@axiom-lattice/client-sdk\";\nimport { WORKSPACE_PUBLIC_ROOM_PROJECT_PREFIX } from \"@axiom-lattice/protocols\";\nimport { readAuthItem } from \"../utils/authStorage\";\nimport { useLatticeChatShellContext } from \"../components/Chat/LatticeChatShellContext\";\nimport { useClient } from \"../context\";\nimport { useAuth } from \"@auth\";\nimport { useT } from \"../i18n\";\n\nexport interface WorkspaceContextValue {\n workspaceId: string | null;\n projectId: string | null;\n\n workspaces: Workspace[];\n projects: Project[];\n trainingProjects: Project[];\n personalProjects: Project[];\n /** Every browsable workspace project (business, public incl. the general room, training); excludes personal. */\n allProjects: Project[];\n\n loading: boolean;\n error: string | null;\n\n setWorkspace: (id: string | null) => void;\n setProject: (id: string | null) => void;\n\n createWorkspace: (data: CreateWorkspaceRequest) => Promise<Workspace>;\n updateWorkspace: (id: string, updates: UpdateWorkspaceRequest) => Promise<Workspace>;\n deleteWorkspace: (id: string) => Promise<void>;\n\n createProject: (workspaceId: string, data: CreateProjectRequest) => Promise<Project>;\n updateProject: (workspaceId: string, id: string, updates: UpdateProjectRequest) => Promise<Project>;\n deleteProject: (workspaceId: string, id: string, Promise: void) => Promise<void>;\n\n refreshWorkspaces: () => Promise<void>;\n refreshProjects: () => Promise<void>;\n listPath: (path: string, assistantId?: string) => Promise<FileItem[]>;\n listPathByFolder: (folder: string, assistantId?: string) => Promise<FileItem[]>;\n uploadFile: (path: string, file: File, assistantId?: string) => Promise<FileItem>;\n uploadFileToFolder: (folder: string, file: File, assistantId?: string) => Promise<FileItem>;\n /** Upload to an explicit project (unlike uploadFile, which targets the context-selected project). */\n uploadFileToProject: (projectId: string, path: string, file: File, assistantId?: string) => Promise<FileItem>;\n getFileViewUrl: (filePath: string, assistantId?: string) => string;\n getFileDownloadUrl: (filePath: string, assistantId?: string) => string;\n /** Download the selected project folder through authenticated SDK headers as a Blob. */\n downloadFolder: (folderPath: string, assistantId?: string) => Promise<Blob>;\n getDirectFileUrl: (filePath: string) => string;\n shareFile: (\n filePath: string,\n assistantId?: string,\n options?: {\n title?: string;\n visibility?: \"public\" | \"password\";\n password?: string;\n expiresAt?: string;\n maxAccess?: number;\n }\n ) => Promise<{ token: string; url: string }>;\n /** List all active shares for the current user */\n listShares: () => Promise<import(\"@axiom-lattice/protocols\").ShareRecord[]>;\n /** Revoke a share by token */\n unshareFile: (token: string) => Promise<void>;\n}\n\nexport const WorkspaceContext = createContext<WorkspaceContextValue | null>(null);\n\n/**\n * Hook to access the workspace context. Must be used within a {@link WorkspaceContextProvider}.\n *\n * @description\n * Provides the current workspace and project selection, plus operations to create, update,\n * delete, and refresh workspaces and projects. Also offers file browsing (`listPath`,\n * `listPathByFolder`) and file upload utilities.\n *\n * @returns The current {@link WorkspaceContextValue}.\n *\n * @throws {Error} If used outside of a {@link WorkspaceContextProvider}.\n *\n * @example\n * ```tsx\n * const {\n * workspaces, projects, workspaceId, projectId,\n * createWorkspace, deleteWorkspace, listPath,\n * } = useWorkspaceContext();\n *\n * await createWorkspace({ name: 'My Workspace' });\n * const files = await listPath('/src');\n * ```\n */\nexport const useWorkspaceContext = (): WorkspaceContextValue => {\n const context = useContext(WorkspaceContext);\n if (!context) {\n throw new Error(\"useWorkspaceContext must be used within a WorkspaceContextProvider\");\n }\n return context;\n};\n\n/** Like {@link useWorkspaceContext} but returns null when no provider is present. */\nexport const useWorkspaceContextOptional = (): WorkspaceContextValue | null =>\n useContext(WorkspaceContext);\n\nexport interface WorkspaceContextProviderProps {\n children: ReactNode;\n /** Default workspace ID when sessionStorage is empty */\n workspaceId?: string;\n /** Default project ID when sessionStorage is empty */\n projectId?: string;\n /**\n * When provided (page-level containers), workspace/project changes sync\n * to THIS Client instance's headers (instance-scoped isolation).\n * When omitted, syncs to the global static Client headers (default).\n */\n client?: import(\"@axiom-lattice/client-sdk\").Client;\n /**\n * When true, the provider does NOT read or write sessionStorage. Its\n * workspace/project state is fully scoped to this provider instance, so a\n * nested isolated app (e.g. CoSpace) cannot leak its selections into the\n * outer workspace app or vice versa.\n */\n isolated?: boolean;\n}\n\n/**\n * Workspace context provider. Wraps components that need access to workspace and project state.\n *\n * @description\n * Manages the full workspace lifecycle:\n * - **Session restoration**: Reads the previously selected `workspaceId` and `projectId` from\n * `sessionStorage` on mount to persist selections across page reloads.\n * - **Workspace CRUD**: Provides {@link createWorkspace}, {@link updateWorkspace}, and\n * {@link deleteWorkspace} backed by the workspace API client.\n * - **Project CRUD**: Project-level create, update, and delete scoped to the selected workspace.\n * - **File operations**: {@link listPath}, {@link listPathByFolder}, {@link uploadFile},\n * {@link getFileViewUrl}, and {@link getFileDownloadUrl} for workspace file management.\n * - **Auto-selection**: Automatically selects the first available workspace when the list loads\n * and no workspace is currently selected.\n * - **Global header sync**: Automatically sets the selected workspace/project as HTTP headers on\n * the shared {@link Client} instance so all outgoing API calls include the correct context.\n *\n * Requires {@link AuthProvider} and {@link LatticeChatShellContextProvider} ancestors.\n *\n * @param props - Provider props.\n * @param props.children - React children to render within the workspace context.\n *\n * @returns A React context provider wrapping children with {@link WorkspaceContext.Provider}.\n *\n * @example\n * ```tsx\n * <WorkspaceContextProvider>\n * <FileExplorer />\n * </WorkspaceContextProvider>\n * ```\n */\n/**\n * Build /f/ payload from workspace/project/tenant IDs.\n * Format: hex of 3 UUIDs without dashes (96 chars, compact).\n */\nexport const WorkspaceContextProvider: React.FC<WorkspaceContextProviderProps> = ({\n children,\n workspaceId: defaultWorkspaceId,\n projectId: defaultProjectId,\n client: scopeClient,\n isolated = false,\n}) => {\n const { currentTenant, isAuthenticated } = useAuth();\n const tenantId = currentTenant?.id || \"\";\n const { config } = useLatticeChatShellContext();\n const t = useT();\n\n // Initialize from sessionStorage or use null\n const getInitialWorkspaceId = () => {\n if (defaultWorkspaceId !== undefined) return defaultWorkspaceId;\n if (!isolated && typeof window !== 'undefined') return sessionStorage.getItem('workspaceId');\n return null;\n };\n\n const getInitialProjectId = () => {\n if (defaultProjectId !== undefined) return defaultProjectId;\n if (!isolated && typeof window !== 'undefined') return sessionStorage.getItem('projectId');\n return null;\n };\n\n\n\n const [workspaceId, setWorkspaceId] = useState<string | null>(getInitialWorkspaceId);\n const [projectId, setProjectId] = useState<string | null>(getInitialProjectId);\n\n // Apply the initial workspace context to the client family SYNCHRONOUSLY\n // (layout phase), BEFORE children's passive effects dispatch their first\n // requests (thread list, assistant fetch, ...). Passive effects fire\n // bottom-up, so a passive-effect-only sync would send the first requests\n // with the global fallback headers (or none) — the backend then scopes\n // them to the \"default\"/global project instead of the scope's project.\n useLayoutEffect(() => {\n if (scopeClient) {\n scopeClient.setWorkspaceContext(workspaceId || undefined, projectId || undefined);\n } else {\n Client.setWorkspaceContext(workspaceId || undefined, projectId || undefined);\n }\n }, [workspaceId, projectId, scopeClient]);\n\n const [workspaces, setWorkspaces] = useState<Workspace[]>([]);\n const [projects, setProjects] = useState<Project[]>([]);\n const [trainingProjects, setTrainingProjects] = useState<Project[]>([]);\n const [personalProjects, setPersonalProjects] = useState<Project[]>([]);\n const [allProjects, setAllProjects] = useState<Project[]>([]);\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const client = React.useMemo(() => {\n const authApiKey = isAuthenticated\n ? readAuthItem(\"lattice_token\") || config.apiKey || \"\"\n : config.apiKey || \"\";\n return new WorkspaceClient({\n baseURL: config.baseURL,\n apiKey: authApiKey,\n assistantId: \"\",\n transport: \"sse\",\n }, tenantId);\n }, [config.baseURL, config.apiKey, tenantId, isAuthenticated]);\n\n\n const resetSelectedWorkspace = useCallback(() => {\n\n setProjects([]);\n setTrainingProjects([]);\n setPersonalProjects([]);\n setWorkspaceId(defaultWorkspaceId ?? null);\n if (!isolated) sessionStorage.removeItem('workspaceId');\n setProjectId(defaultProjectId ?? null);\n if (!isolated) sessionStorage.removeItem('projectId');\n }, [setProjects, setWorkspaceId, setProjectId, defaultWorkspaceId, defaultProjectId, isolated]);\n const resetWS = useCallback(() => {\n setWorkspaces([]);\n resetSelectedWorkspace();\n }, [resetSelectedWorkspace, setWorkspaces]);\n\n useEffect(() => {\n\n resetWS();\n refreshWorkspaces();\n }, [tenantId]);\n const refreshWorkspaces = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const data = await client.listWorkspaces();\n setWorkspaces(data);\n } catch (e) {\n setError(e instanceof Error ? e.message : t(\"chatWorkspace.workspace.loadWorkspacesFailed\"));\n } finally {\n setLoading(false);\n }\n }, [client, t]);\n\n const refreshProjects = useCallback(async (wsId?: string) => {\n const targetWorkspaceId = wsId || workspaceId;\n if (!targetWorkspaceId) {\n setProjects([]);\n setTrainingProjects([]);\n setPersonalProjects([]);\n setAllProjects([]);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const data = await client.listProjects(targetWorkspaceId);\n setProjects(data.filter((p) => p.kind !== \"training\" && p.kind !== \"personal\" && !p.id.startsWith(WORKSPACE_PUBLIC_ROOM_PROJECT_PREFIX)));\n setTrainingProjects(data.filter((p) => p.kind === \"training\"));\n setPersonalProjects(data.filter((p) => p.kind === \"personal\"));\n // The Projects menu lists every browsable project, including public\n // (with the general public room) and training; only personal 1:1\n // projects stay out of it.\n setAllProjects(data.filter((p) => p.kind !== \"personal\"));\n } catch (e) {\n setError(e instanceof Error ? e.message : t(\"chatWorkspace.workspace.loadProjectsFailed\"));\n } finally {\n setLoading(false);\n }\n }, [client, workspaceId, t]);\n\n // Persist workspaceId to sessionStorage\n useEffect(() => {\n if (!isolated && workspaceId && typeof window !== 'undefined') {\n sessionStorage.setItem('workspaceId', workspaceId);\n }\n }, [workspaceId, isolated]);\n\n // Persist projectId to sessionStorage\n useEffect(() => {\n if (!isolated && projectId && typeof window !== 'undefined') {\n sessionStorage.setItem('projectId', projectId);\n }\n }, [projectId, isolated]);\n\n useEffect(() => {\n refreshWorkspaces().catch((err) => {\n console.warn(\"Failed to load workspaces:\", err);\n });\n }, [refreshWorkspaces]);\n\n // Auto-select first workspace only (not projects)\n useEffect(() => {\n if (workspaces.length > 0 && !workspaceId) {\n const firstWorkspace = workspaces[0];\n setWorkspaceId(firstWorkspace.id);\n }\n }, [workspaces, workspaceId]);\n\n // Workspace context is automatically synced to sessionStorage\n // Client will read from sessionStorage on each request\n\n // Track previous workspaceId to only reset project when workspace actually changes\n const prevWorkspaceId = useRef(workspaceId);\n\n useEffect(() => {\n if (workspaceId) {\n refreshProjects(workspaceId);\n } else {\n setProjects([]);\n setTrainingProjects([]);\n }\n\n // Only clear projectId when workspaceId actually changed (not on initial mount)\n if (prevWorkspaceId.current != null && prevWorkspaceId.current !== workspaceId) {\n setProjectId(defaultProjectId ?? null);\n }\n\n prevWorkspaceId.current = workspaceId;\n }, [workspaceId, refreshProjects]);\n\n const createWorkspace = useCallback(async (data: CreateWorkspaceRequest) => {\n setLoading(true);\n setError(null);\n try {\n const workspace = await client.createWorkspace(data);\n await refreshWorkspaces();\n return workspace;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.createWorkspaceFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshWorkspaces, t]);\n\n const updateWorkspace = useCallback(async (id: string, updates: UpdateWorkspaceRequest) => {\n setLoading(true);\n setError(null);\n try {\n const workspace = await client.updateWorkspace(id, updates);\n await refreshWorkspaces();\n return workspace;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.updateWorkspaceFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshWorkspaces, t]);\n\n const deleteWorkspace = useCallback(async (id: string) => {\n setLoading(true);\n setError(null);\n try {\n await client.deleteWorkspace(id);\n if (workspaceId === id) {\n resetSelectedWorkspace();\n }\n await refreshWorkspaces();\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.deleteWorkspaceFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, workspaceId, refreshWorkspaces, t]);\n\n const createProject = useCallback(async (wsId: string, data: CreateProjectRequest) => {\n setLoading(true);\n setError(null);\n try {\n const project = await client.createProject(wsId, data);\n await refreshProjects(wsId);\n return project;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.projects.createFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshProjects, t]);\n\n const updateProject = useCallback(async (wsId: string, id: string, updates: UpdateProjectRequest) => {\n setLoading(true);\n setError(null);\n try {\n const project = await client.updateProject(wsId, id, updates);\n await refreshProjects(wsId);\n return project;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.updateProjectFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, refreshProjects, t]);\n\n const deleteProject = useCallback(async (wsId: string, id: string) => {\n setLoading(true);\n setError(null);\n try {\n await client.deleteProject(wsId, id);\n if (projectId === id) {\n setProjectId(null);\n }\n await refreshProjects(wsId);\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.deleteProjectFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [client, projectId, refreshProjects, t]);\n\n const listPath = useCallback(\n async (path = \"/\", assistantId?: string) => {\n if (!workspaceId || !projectId) {\n return [];\n }\n setLoading(true);\n setError(null);\n try {\n const data = await client.listPath(workspaceId, projectId, path, assistantId);\n return data;\n } catch (e) {\n setError(e instanceof Error ? e.message : t(\"chatWorkspace.workspace.loadFilesFailed\"));\n return [];\n } finally {\n setLoading(false);\n }\n },\n [client, workspaceId, projectId, t]\n );\n\n const listPathByFolder = useCallback(\n async (folder: string, assistantId?: string): Promise<FileItem[]> => {\n let normalizedPath = folder;\n // Strip legacy ~/ prefix if present\n if (normalizedPath.startsWith(\"~/\")) {\n normalizedPath = `/${normalizedPath.slice(2)}`;\n }\n if (!normalizedPath.startsWith(\"/\")) {\n normalizedPath = `/${normalizedPath}`;\n }\n return listPath(normalizedPath, assistantId);\n },\n [listPath]\n );\n\n const uploadFile = useCallback(\n async (path: string, file: File, assistantId?: string): Promise<FileItem> => {\n if (!workspaceId || !projectId) {\n throw new Error(\"Workspace and project must be selected before uploading files\");\n }\n setLoading(true);\n setError(null);\n try {\n const item = await client.uploadFile(workspaceId, projectId, file, path, assistantId);\n return item;\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : t(\"chatWorkspace.workspace.uploadFailed\");\n setError(errMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n },\n [client, workspaceId, projectId, t]\n );\n\n const uploadFileToFolder = useCallback(\n async (folder: string, file: File, assistantId?: string): Promise<FileItem> => {\n // Normalize legacy ~/ prefix\n let normalizedFolder = folder;\n if (normalizedFolder.startsWith(\"~/\")) {\n normalizedFolder = `/${normalizedFolder.slice(2)}`;\n }\n return uploadFile(normalizedFolder, file, assistantId);\n },\n [uploadFile]\n );\n\n const uploadFileToProject = useCallback(\n async (targetProjectId: string, path: string, file: File, assistantId?: string): Promise<FileItem> => {\n if (!workspaceId) {\n throw new Error(\"Workspace must be selected before uploading files\");\n }\n return client.uploadFile(workspaceId, targetProjectId, file, path, assistantId);\n },\n [client, workspaceId]\n );\n\n /** File preview — uses viewfile (backward compat). */\n const getFileViewUrl = useCallback( (filePath: string, assistantId?: string): string => {\n if (!workspaceId || !projectId) return \"\";\n return client.getFileViewUrl(workspaceId, projectId, filePath, assistantId);\n },\n [client, workspaceId, projectId]\n );\n\n /** File download — uses downloadfile so the response is served as an attachment. */\n const getFileDownloadUrl = useCallback(\n (filePath: string, assistantId?: string): string => {\n if (!workspaceId || !projectId) return \"\";\n return client.getFileDownloadUrl(workspaceId, projectId, filePath, assistantId);\n },\n [client, workspaceId, projectId]\n );\n\n /** Download a folder using the selected workspace/project scope and authenticated client. */\n const downloadFolder = useCallback(\n async (folderPath: string, assistantId?: string): Promise<Blob> => {\n if (!workspaceId || !projectId) throw new Error(\"Workspace and project must be selected\");\n return client.downloadFolder(workspaceId, projectId, folderPath, assistantId);\n },\n [client, workspaceId, projectId],\n );\n\n /** Direct file access via /f/ — for sharing, pinning, directory preview. */\n const getDirectFileUrl = useCallback(\n (filePath: string): string => {\n if (!tenantId || !workspaceId || !projectId) return \"\";\n const normalized = filePath.replace(/^\\/?project\\//, \"\").replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return `${config.baseURL}/f/${tenantId}/${workspaceId}/${projectId}/${normalized}`;\n },\n [tenantId, workspaceId, projectId, config.baseURL]\n );\n\n const shareFile = useCallback(\n async (\n filePath: string,\n assistantId?: string,\n options?: {\n title?: string;\n visibility?: \"public\" | \"password\";\n password?: string;\n expiresAt?: string;\n maxAccess?: number;\n }\n ) => {\n if (!workspaceId || !projectId) {\n throw new Error(\"Workspace and project must be selected\");\n }\n return client.resources.share({\n resourcePath: filePath,\n assistantId,\n ...options,\n });\n },\n [client, workspaceId, projectId]\n );\n\n const listShares = useCallback(\n async () => {\n return client.resources.listShares();\n },\n [client]\n );\n\n const unshareFile = useCallback(\n async (token: string) => {\n await client.resources.unshare(token);\n },\n [client]\n );\n\n const value: WorkspaceContextValue = {\n workspaceId,\n projectId,\n workspaces,\n projects,\n trainingProjects,\n personalProjects,\n allProjects,\n loading,\n error,\n setWorkspace: setWorkspaceId,\n setProject: setProjectId,\n createWorkspace,\n updateWorkspace,\n deleteWorkspace,\n createProject,\n updateProject,\n deleteProject,\n refreshWorkspaces,\n refreshProjects,\n listPath,\n listPathByFolder,\n uploadFile,\n uploadFileToFolder,\n uploadFileToProject,\n getFileViewUrl,\n getFileDownloadUrl,\n downloadFolder,\n getDirectFileUrl,\n shareFile,\n listShares,\n unshareFile,\n };\n\n // Get current workspace name\n const currentWorkspace = workspaces.find((w) => w.id === workspaceId);\n const workspaceName = currentWorkspace?.name;\n\n // Handle project selection\n const handleSelectProject = (project: Project) => {\n setProjectId(project.id);\n };\n\n // Handle project creation\n const handleCreateProject = async (name: string, description?: string) => {\n if (workspaceId) {\n await createProject(workspaceId, { name, description });\n }\n };\n\n return (\n <WorkspaceContext.Provider value={value}>\n {children}\n </WorkspaceContext.Provider>\n );\n};\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAssistantContext } from \"./AssistantContext\";\nimport { useClient } from \"../../context\";\nimport { Client, Thread, type ThreadSuperstepInput } from \"@axiom-lattice/client-sdk\";\nimport { useLatticeChatShellContext } from \"./LatticeChatShellContext\";\nimport { WorkspaceContext } from \"../../context/WorkspaceContext\";\n\n/**\n * Thread information for a conversation\n */\nexport interface ConversationThread {\n id: string;\n label: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/**\n * Conversation context value\n */\nexport interface ConversationContextValue {\n /**\n * Current assistant ID\n */\n assistantId: string | null;\n /**\n * Current thread for the assistant\n */\n thread: ConversationThread | null;\n /**\n * Current thread ID\n */\n threadId: string | null;\n /**\n * List of threads for the current assistant\n */\n threads: ConversationThread[];\n /**\n * Whether threads are being loaded\n */\n isLoading: boolean;\n /**\n * Error message if any\n */\n error: Error | null;\n /**\n * Set the current thread\n */\n setThread: (thread: ConversationThread | null) => void;\n /**\n * Select a thread by ID\n */\n selectThread: (threadId: string) => void;\n /**\n * Create a new thread for the current assistant\n */\n createThread: (\n label?: string,\n options?: { ttlSeconds?: number; supersteps?: ThreadSuperstepInput[] },\n ) => Promise<ConversationThread>;\n /**\n * List all threads for the current assistant\n */\n listThreads: () => Promise<ConversationThread[]>;\n /**\n * Update thread for the current assistant\n */\n updateThread: (thread: ConversationThread) => Promise<void>;\n /**\n * Get thread by ID\n */\n getThreadById: (threadId: string) => ConversationThread | null;\n /**\n * Delete a thread by ID\n */\n deleteThread: (threadId: string) => Promise<void>;\n /**\n * Clear the current thread\n */\n clearThread: () => void;\n /**\n * Refresh threads for the current assistant\n */\n refresh: () => Promise<void>;\n /**\n * Custom run configuration (cross-thread, assistant-level)\n * Used for metrics datasource and other assistant-wide settings\n */\n customRunConfig: Record<string, any>;\n /**\n * Update custom run configuration\n */\n updateCustomRunConfig: (config: Record<string, any>) => void;\n}\n\n/**\n * Conversation context.\n *\n * The default value is `null` so consumers can detect whether a\n * {@link ConversationContextProvider} is present (e.g. {@link AgentThreadContext}\n * falls back to local `customRunConfig` when it is not). Use\n * {@link useConversationContext} when a provider is required (throws otherwise),\n * or {@link useOptionalConversationContext} when it is optional.\n */\nexport const ConversationContext = createContext<ConversationContextValue | null>(null);\n\n/**\n * Props for ConversationContextProvider\n */\nexport interface ConversationContextProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Helper function to convert API Thread to ConversationThread\n */\nfunction convertThreadToConversationThread(\n thread: Thread,\n label?: string\n): ConversationThread {\n return {\n id: thread.id,\n label:\n label ||\n (thread.metadata?.label as string) ||\n new Date(thread.createdAt).toLocaleString(),\n createdAt: thread.createdAt?.toString(),\n updatedAt: thread.updatedAt?.toString(),\n };\n}\n\n/**\n * Helper function to convert ConversationThread to API Thread metadata\n */\nfunction getThreadMetadata(label?: string): Record<string, any> {\n return label ? { label } : {};\n}\n\n/**\n * Generate a thread label from the first message content\n * Extracts first 15 characters of text content, excluding attachments\n */\nexport function generateLabelFromMessage(message: string): string {\n // Remove attachment markers\n const cleanMessage = message.replace(/```attachments[\\s\\S]*?```/g, '').trim();\n\n // If empty after cleaning, return empty string (will fallback to date)\n if (!cleanMessage) {\n return '';\n }\n\n // If message is short, use it as-is\n if (cleanMessage.length <= 15) {\n return cleanMessage;\n }\n\n // Otherwise truncate with ellipsis\n return cleanMessage.slice(0, 15) + '...';\n}\n\n/**\n * Provider component for ConversationContext.\n * Manages conversation thread state for the currently selected assistant.\n *\n * @description\n * Coordinates with {@link AssistantContext} to load threads for the current assistant.\n * Key behaviors:\n * - **Thread loading**: Fetches threads from the API when the assistant changes. If no threads\n * exist, a new thread is automatically created.\n * - **Auto-selection**: Selects the most recently updated thread as the active thread when loading.\n * - **Cross-thread config**: Maintains an assistant-level `customRunConfig` shared across all threads\n * (useful for metrics datasource and other assistant-wide settings).\n * - **Thread operations**: Provides full CRUD operations (create, update, delete, list, select)\n * backed by the client SDK.\n *\n * Requires {@link AssistantContextProvider} ancestor and {@link LatticeChatShellContextProvider}.\n *\n * @param props - {@link ConversationContextProviderProps}\n * @param props.children - React children to render within the conversation context.\n *\n * @returns A React context provider wrapping children with {@link ConversationContext.Provider}.\n *\n * @example\n * ```tsx\n * <ConversationContextProvider>\n * <ThreadList />\n * </ConversationContextProvider>\n * ```\n */\nexport const ConversationContextProvider = ({\n children,\n}: ConversationContextProviderProps) => {\n // Get current assistant from AssistantContext\n const { currentAssistant } = useAssistantContext();\n const assistantId = currentAssistant?.id || null;\n\n // Get client for the current assistant\n const _unused = useLatticeChatShellContext(); void _unused;\n const client = useClient(assistantId || \"\");\n\n // Current threads for the current assistant\n const [threads, setThreads] = useState<ConversationThread[]>([]);\n // Current thread ID\n const [threadId, setThreadId] = useState<string | null>(null);\n // Assistant that produced `threads`; guards against showing an old thread\n // under a newly selected assistant before the new list has loaded.\n const [threadsAssistantId, setThreadsAssistantId] = useState<string | null>(null);\n // Loading state\n const [isLoading, setIsLoading] = useState<boolean>(false);\n // Error state\n const [error, setError] = useState<Error | null>(null);\n // Custom run config for assistant-level settings (cross-thread)\n const [customRunConfig, setCustomRunConfig] = useState<Record<string, any>>({});\n // Track if we've loaded threads for the current assistant (using ref to avoid re-renders)\n const loadedAssistantIdRef = useRef<string | null>(null);\n // Track previous assistantId to detect changes\n const prevAssistantIdRef = useRef<string | null>(null);\n // Track if we're currently loading to prevent concurrent loads\n const isLoadingRef = useRef<boolean>(false);\n // Ignore results from loads superseded by an assistant change or forced refresh.\n const loadRequestIdRef = useRef(0);\n // Store client in ref to avoid dependency issues\n const clientRef = useRef<Client>(client);\n // Update client ref when it changes\n useEffect(() => {\n clientRef.current = client;\n }, [client]);\n\n /**\n * Load threads for the current assistant from the API\n * If no threads exist, automatically create a new one\n */\n const loadThreads = useCallback(async (force = false) => {\n const currentClient = clientRef.current;\n if (!assistantId || !currentClient.assistantId) {\n loadRequestIdRef.current += 1;\n setThreads([]);\n setIsLoading(false);\n isLoadingRef.current = false;\n loadedAssistantIdRef.current = null;\n return;\n }\n\n // Prevent concurrent loads for the same assistant\n if (!force && isLoadingRef.current && loadedAssistantIdRef.current === assistantId) {\n return;\n }\n\n const requestId = ++loadRequestIdRef.current;\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const apiThreads = await currentClient.threads.list();\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n // Sort threads by updatedAt in descending order (most recently updated first)\n const sortedApiThreads = apiThreads.sort((a, b) => {\n const dateA = new Date(a.updatedAt).getTime();\n const dateB = new Date(b.updatedAt).getTime();\n return dateB - dateA;\n });\n const conversationThreads = sortedApiThreads.map((t) =>\n convertThreadToConversationThread(t)\n );\n\n // If no threads exist, create a new one\n if (conversationThreads.length === 0) {\n try {\n const apiThread = await currentClient.threads.create({\n metadata: getThreadMetadata(),\n });\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n const newThread = convertThreadToConversationThread(apiThread);\n setThreads([newThread]);\n setThreadId(newThread.id);\n } catch (createErr) {\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n const createError =\n createErr instanceof Error\n ? createErr\n : new Error(String(createErr));\n setError(createError);\n console.error(\"Failed to create initial thread:\", createError);\n setThreads([]);\n }\n } else {\n setThreads(conversationThreads);\n\n // Select the most recently updated thread if we haven't selected one yet\n // or if the current thread doesn't belong to this assistant's threads\n setThreadId((currentThreadId) => {\n if (!currentThreadId) {\n // Threads are sorted by updatedAt desc, so first one is most recent\n const latestThread = conversationThreads[0];\n return latestThread.id;\n }\n // Check if currentThreadId belongs to the new assistant's threads\n const threadExists = conversationThreads.some(\n (t) => t.id === currentThreadId\n );\n if (!threadExists) {\n // Current thread doesn't belong to this assistant, select the most recent\n const latestThread = conversationThreads[0];\n return latestThread.id;\n }\n return currentThreadId;\n });\n }\n\n setThreadsAssistantId(assistantId);\n loadedAssistantIdRef.current = assistantId;\n } catch (err) {\n if (requestId !== loadRequestIdRef.current) {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n console.error(\"Failed to load threads:\", error);\n } finally {\n if (requestId === loadRequestIdRef.current) {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }\n }, [assistantId]);\n\n // Load threads when assistantId changes\n useEffect(() => {\n const currentClient = clientRef.current;\n const prevAssistantId = prevAssistantIdRef.current;\n\n // Check if assistantId actually changed\n const assistantChanged = prevAssistantId !== assistantId;\n\n if (assistantId && currentClient.assistantId === assistantId) {\n // If assistant changed, clear thread state first so a render between\n // the switch and the new thread load can never pair the new assistant\n // with the old thread (which the run API rejects as THREAD_NOT_FOUND).\n if (assistantChanged) {\n setThreadId(null);\n setThreads([]);\n setThreadsAssistantId(null);\n prevAssistantIdRef.current = assistantId;\n }\n\n // Only load if we haven't loaded for this assistant yet\n if (loadedAssistantIdRef.current !== assistantId) {\n loadThreads();\n }\n } else {\n setThreadId(null);\n setThreads([]);\n setThreadsAssistantId(null);\n loadedAssistantIdRef.current = null;\n prevAssistantIdRef.current = null;\n }\n }, [assistantId, loadThreads]);\n\n // Reload threads when the workspace/project scope changes: the thread list\n // is filtered by the project headers, so switching projects must refresh\n // the list and drop the now-invalid active thread (a new one is selected\n // or auto-created for the new project).\n const workspaceCtx = useContext(WorkspaceContext);\n const scopeKey = `${workspaceCtx?.workspaceId ?? \"\"}:${workspaceCtx?.projectId ?? \"\"}`;\n const prevScopeKeyRef = useRef(scopeKey);\n useEffect(() => {\n const currentClient = clientRef.current;\n if (!assistantId || !currentClient.assistantId) return;\n if (prevScopeKeyRef.current === scopeKey) return;\n\n prevScopeKeyRef.current = scopeKey;\n setThreadId(null);\n setThreadsAssistantId(null);\n loadedAssistantIdRef.current = null;\n loadThreads();\n }, [scopeKey, assistantId, loadThreads]);\n\n // Get current thread for the current assistant\n const thread = useMemo((): ConversationThread | null => {\n if (!assistantId || !threadId) {\n return null;\n }\n // The list must belong to the current assistant. Without this guard, the\n // render that follows an assistant switch can still see the previous\n // assistant's thread and send a run to the wrong pair.\n if (threadsAssistantId !== assistantId) {\n return null;\n }\n return threads.find((t) => t.id === threadId) || null;\n }, [assistantId, threadId, threads, threadsAssistantId]);\n\n // Set thread for the current assistant\n const setThread = useCallback((newThread: ConversationThread | null) => {\n if (newThread) {\n setThreadId(newThread.id);\n } else {\n setThreadId(null);\n }\n }, []);\n\n // Select a thread by ID\n const selectThread = useCallback(\n (targetThreadId: string) => {\n const foundThread = threads.find((t) => t.id === targetThreadId);\n if (foundThread) {\n setThreadId(targetThreadId);\n }\n },\n [threads]\n );\n\n // Create a new thread for the current assistant\n const createThread = useCallback(\n async (\n label?: string,\n options?: { ttlSeconds?: number; supersteps?: ThreadSuperstepInput[] },\n ): Promise<ConversationThread> => {\n if (!assistantId || !client.assistantId) {\n throw new Error(\"No assistant selected\");\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const apiThread = await client.threads.create({\n metadata: getThreadMetadata(label),\n ...(options ?? {}),\n });\n const newThread = convertThreadToConversationThread(apiThread, label);\n\n // Reload threads to get the latest data from backend\n await loadThreads();\n setThreadId(newThread.id);\n return newThread;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [assistantId, client, loadThreads]\n );\n\n // List all threads for the current assistant\n const listThreads = useCallback(async (): Promise<ConversationThread[]> => {\n if (!assistantId || !client.assistantId) {\n return [];\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const apiThreads = await client.threads.list();\n // Sort threads by updatedAt in descending order (most recently updated first)\n const sortedApiThreads = apiThreads.sort((a, b) => {\n const dateA = new Date(a.updatedAt).getTime();\n const dateB = new Date(b.updatedAt).getTime();\n return dateB - dateA;\n });\n const conversationThreads = sortedApiThreads.map((t) =>\n convertThreadToConversationThread(t)\n );\n\n setThreads(conversationThreads);\n return conversationThreads;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n // Return current threads if available\n return threads;\n } finally {\n setIsLoading(false);\n }\n }, [assistantId, client, threads]);\n\n // Update thread for the current assistant.\n // Applies the change to local state in place instead of reloading the whole\n // list, so a rename doesn't flash a loading state or re-sort the threads.\n // The thread's existing sort position (updatedAt) is preserved; the next full\n // list load reconciles with the backend.\n const updateThread = useCallback(\n async (newThread: ConversationThread): Promise<void> => {\n if (!assistantId || !client.assistantId) {\n throw new Error(\"No assistant selected\");\n }\n\n setError(null);\n\n try {\n // Get existing thread to preserve other metadata fields\n const existingThread = await client.threads.get(newThread.id);\n const existingMetadata = existingThread.metadata || {};\n\n await client.threads.update(newThread.id, {\n metadata: {\n ...existingMetadata,\n label: newThread.label,\n },\n });\n\n // Apply the new label to local state only.\n setThreads((prev) =>\n prev.map((t) =>\n t.id === newThread.id ? { ...t, label: newThread.label } : t\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n }\n },\n [assistantId, client]\n );\n\n // Get thread by ID\n const getThreadById = useCallback(\n (targetThreadId: string): ConversationThread | null => {\n return threads.find((t) => t.id === targetThreadId) || null;\n },\n [threads]\n );\n\n // Delete a thread by ID\n const deleteThread = useCallback(\n async (targetThreadId: string): Promise<void> => {\n if (!assistantId || !client.assistantId) {\n throw new Error(\"No assistant selected\");\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await client.threads.delete(targetThreadId);\n\n // Reload threads to get the latest data from backend\n await loadThreads(true);\n\n // Keep a replacement selected by loadThreads, but clear a stale deleted selection.\n setThreadId((currentThreadId) =>\n currentThreadId === targetThreadId ? null : currentThreadId\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [assistantId, client, loadThreads]\n );\n\n // Clear the current thread\n const clearThread = useCallback(() => {\n setThreadId(null);\n }, []);\n\n // Update custom run config (assistant-level, cross-thread)\n const updateCustomRunConfig = useCallback((config: Record<string, any>) => {\n setCustomRunConfig((prev) => ({\n ...prev,\n ...config,\n }));\n }, []);\n\n return (\n <ConversationContext.Provider\n value={{\n assistantId,\n thread,\n threadId,\n threads,\n isLoading,\n error,\n setThread,\n selectThread,\n createThread,\n listThreads,\n updateThread,\n getThreadById,\n deleteThread,\n clearThread,\n refresh: loadThreads,\n customRunConfig,\n updateCustomRunConfig,\n }}\n >\n {children}\n </ConversationContext.Provider>\n );\n};\n\n/**\n * Hook to access ConversationContext. Throws when no\n * {@link ConversationContextProvider} is present — use only in components that\n * are guaranteed to render inside the shell's provider tree.\n *\n * @returns Conversation context value\n * @throws Error if used outside of ConversationContextProvider\n */\nexport const useConversationContext = (): ConversationContextValue => {\n const context = useContext(ConversationContext);\n\n if (!context) {\n throw new Error(\n \"useConversationContext must be used within a ConversationContextProvider\"\n );\n }\n\n return context;\n};\n\n/**\n * Hook to access ConversationContext without throwing. Returns `null` when no\n * {@link ConversationContextProvider} is present, letting consumers degrade\n * gracefully (e.g. GenUI elements rendering inside the architect copilot dock,\n * which lives outside the shell's ConversationContextProvider).\n *\n * @returns Conversation context value, or null if no provider is present\n */\nexport const useOptionalConversationContext = (): ConversationContextValue | null =>\n useContext(ConversationContext);\n","import React, { createContext, useCallback, useContext, useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nconst emptyHandler = () => {\n throw new Error(\"ChatUIContextProvider not found\");\n};\n\ntype PanelCardData = Record<string, unknown> & {\n component?: ReactNode;\n message?: string;\n};\n\nexport type PanelCard = {\n component_key: string;\n data: PanelCardData;\n message?: string;\n context?: {\n thread_id?: string;\n assistant_id?: string;\n };\n};\n\nexport const ChatUIContext = createContext<{\n detailVisible: boolean;\n setDetailVisible: (visible: boolean) => void;\n detailSize: \"small\" | \"middle\" | \"large\" | \"full\";\n setDetailSize: (size: \"small\" | \"middle\" | \"large\" | \"full\") => void;\n detailSelectedCard: PanelCard | null;\n setDetailSelectedCard: (card: PanelCard | null) => void;\n openDetail: (card: PanelCard) => void;\n closeDetail: () => void;\n toolsVisible: boolean;\n setToolsVisible: (visible: boolean) => void;\n toggleTools: () => void;\n toolSelectedCard: PanelCard | null;\n setToolSelectedCard: (card: PanelCard | null) => void;\n openTools: (card: PanelCard) => void;\n closeTools: () => void;\n sideAppVisible: boolean;\n setSideAppVisible: (visible: boolean) => void;\n sideAppSize: \"small\" | \"middle\" | \"large\" | \"full\";\n setSideAppSize: (size: \"small\" | \"middle\" | \"large\" | \"full\") => void;\n sideAppSelectedCard: PanelCard | null;\n setSideAppSelectedCard: (card: PanelCard | null) => void;\n openSideApp: (card: PanelCard) => void;\n closeSideApp: () => void;\n menuCollapsed: boolean | undefined;\n setMenuCollapsed: (collapsed: boolean) => void;\n openContentApp: (card: PanelCard) => void;\n closeContentApp: () => void;\n contentAppVisible: boolean;\n setcontentAppVisible: (visible: boolean) => void;\n contentAppSelectedCard: PanelCard | null;\n setContentAppSelectedCard: (card: PanelCard | null) => void;\n}>({\n detailVisible: false,\n setDetailVisible: emptyHandler,\n detailSize: \"large\",\n setDetailSize: emptyHandler,\n detailSelectedCard: null,\n setDetailSelectedCard: emptyHandler,\n openDetail: emptyHandler,\n closeDetail: emptyHandler,\n toolsVisible: false,\n setToolsVisible: emptyHandler,\n toggleTools: emptyHandler,\n toolSelectedCard: null,\n setToolSelectedCard: emptyHandler,\n openTools: emptyHandler,\n closeTools: emptyHandler,\n sideAppVisible: false,\n setSideAppVisible: emptyHandler,\n sideAppSize: \"large\",\n setSideAppSize: emptyHandler,\n sideAppSelectedCard: null,\n setSideAppSelectedCard: emptyHandler,\n openSideApp: emptyHandler,\n closeSideApp: emptyHandler,\n menuCollapsed: undefined,\n setMenuCollapsed: emptyHandler,\n openContentApp: emptyHandler,\n closeContentApp: emptyHandler,\n contentAppVisible: false,\n setcontentAppVisible: emptyHandler,\n contentAppSelectedCard: null,\n setContentAppSelectedCard: emptyHandler,\n});\n\n/**\n * Chat UI context provider. Manages visibility and selected cards for chat panel areas\n * (detail, tools, side app, content app) and the sidebar menu collapsed state.\n *\n * @description\n * Tracks the open/closed state and the currently selected {@link PanelCard} for each panel:\n * - **Detail panel**: A slide-out detail view that displays a chosen card's content.\n * - **Tools panel**: A tools sidebar/drawer for tool-specific cards.\n * - **Side app**: Aliases to the detail panel (shared state).\n * - **Content app**: An inline content area for embedded app cards.\n * - **Menu collapsed**: Whether the sidebar navigation menu is collapsed.\n *\n * Provides action helpers (`openDetail`, `closeDetail`, `openTools`, `toggleTools`, etc.)\n * that set both visibility and selected card atomically.\n *\n * @param props - Provider props.\n * @param props.children - React children to render within the UI context.\n *\n * @returns A React context provider wrapping children with {@link ChatUIContext.Provider}.\n *\n * @example\n * ```tsx\n * <ChatUIContextProvider>\n * <ChatLayout />\n * </ChatUIContextProvider>\n * ```\n */\nexport const ChatUIContextProvider = ({\n children,\n defaultMenuCollapsed,\n}: {\n children: React.ReactNode;\n /** Default collapsed state for the sidebar menu. Default: undefined (auto) */\n defaultMenuCollapsed?: boolean;\n}) => {\n const [detailVisible, setDetailVisible] = useState(false);\n const [contentAppVisible, setcontentAppVisible] = useState(false);\n const [detailSize, setDetailSize] = useState<\"small\" | \"middle\" | \"large\" | \"full\">(\"large\");\n const [detailSelectedCard, setDetailSelectedCard] = useState<PanelCard | null>(null);\n const [toolsVisible, setToolsVisible] = useState(false);\n const [toolSelectedCard, setToolSelectedCard] = useState<PanelCard | null>(null);\n const [contentAppSelectedCard, setContentAppSelectedCard] = useState<PanelCard | null>(null);\n const [menuCollapsed, setMenuCollapsed] = useState<boolean | undefined>(defaultMenuCollapsed ?? undefined);\n\n const openDetail = useCallback((card: PanelCard) => {\n setDetailSelectedCard(card);\n setDetailVisible(true);\n }, []);\n\n const closeDetail = useCallback(() => {\n setDetailSelectedCard(null);\n setDetailVisible(false);\n }, []);\n\n const openTools = useCallback((card: PanelCard) => {\n setToolSelectedCard(card);\n setToolsVisible(true);\n }, []);\n\n const closeTools = useCallback(() => {\n setToolSelectedCard(null);\n setToolsVisible(false);\n }, []);\n\n const openSideApp = useCallback((card: PanelCard) => {\n openDetail(card);\n }, [openDetail]);\n\n const openContentApp = useCallback((card: PanelCard) => {\n setContentAppSelectedCard(card);\n setcontentAppVisible(true);\n }, []);\n\n const closeSideApp = useCallback(() => {\n closeDetail();\n }, [closeDetail]);\n\n const closeContentApp = useCallback(() => {\n setContentAppSelectedCard(null);\n setcontentAppVisible(false);\n }, []);\n\n const toggleTools = useCallback(() => {\n setToolsVisible((prev) => !prev);\n }, []);\n\n return (\n <ChatUIContext.Provider\n value={{\n detailVisible,\n setDetailVisible,\n detailSize,\n setDetailSize,\n detailSelectedCard,\n setDetailSelectedCard,\n openDetail,\n closeDetail,\n toolsVisible,\n setToolsVisible,\n toggleTools,\n toolSelectedCard,\n setToolSelectedCard,\n openTools,\n closeTools,\n sideAppVisible: detailVisible,\n setSideAppVisible: setDetailVisible,\n sideAppSize: detailSize,\n setSideAppSize: setDetailSize,\n sideAppSelectedCard: detailSelectedCard,\n setSideAppSelectedCard: setDetailSelectedCard,\n openSideApp,\n closeSideApp,\n openContentApp,\n closeContentApp,\n menuCollapsed,\n setMenuCollapsed,\n contentAppVisible,\n setcontentAppVisible,\n contentAppSelectedCard,\n setContentAppSelectedCard,\n }}\n >\n {children}\n </ChatUIContext.Provider>\n );\n};\n\n/**\n * Hook to access the chat UI context. Must be used within a {@link ChatUIContextProvider}.\n *\n * @description\n * Returns panel visibility state, selected panel cards, and action functions for controlling\n * the chat interface panels (detail, tools, side app, content app) and menu collapsed state.\n *\n * @returns The current chat UI context value containing panel state and control functions.\n *\n * @example\n * ```tsx\n * const { detailVisible, openDetail, closeDetail, toggleTools, menuCollapsed } = useChatUIContext();\n *\n * const handleCardClick = (card: PanelCard) => {\n * openDetail(card);\n * };\n * ```\n */\nexport const useChatUIContext = () => {\n return useContext(ChatUIContext);\n};\n"],"mappings":"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","names":["colors","radius","spacing","shadows","typography","animation","useState","jsx","useState","Button","Typography","Card","jsx","jsxs","Text","Typography","Card","Button","useState","useEffect","Building2","jsx","useState","useEffect","Building2","useState","useEffect","useMemo","useCallback","Button","Input","Spin","createStyles","LogOut","jsx","jsxs","createStyles","useState","useEffect","useMemo","t","useCallback","Spin","Button","LogOut","Input","useState","Form","Input","Button","Alert","LockOutlined","jsx","jsxs","Form","useState","Alert","Input","LockOutlined","Button","useState","useEffect","useCallback","useState","useCallback","useEffect","t","React","createContext","useContext","useState","useCallback","useEffect","useRef","jsx","createContext","useContext","useState","React","useCallback","useEffect","useRef","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useState","useRef","useEffect","useCallback","error","useContext","useMemo","createContext","useCallback","useContext","useState","jsx"]}
|