( projectPath?: string | undefined | null | undefined, )
| 147 | } |
| 148 | |
| 149 | export async function loadPiThemeStateInHost( |
| 150 | projectPath?: string | undefined | null | undefined, |
| 151 | ): Promise<PiThemeState> { |
| 152 | const { SettingsManager, DefaultResourceLoader, getAgentDir } = await getPiModule() |
| 153 | const cwd = projectPath ?? getDesktopWorkingDirectory() |
| 154 | const agentDir = getAgentDir() |
| 155 | const settingsManager = SettingsManager.create(cwd, agentDir) |
| 156 | const resourceLoader = new DefaultResourceLoader({ |
| 157 | cwd, |
| 158 | agentDir, |
| 159 | settingsManager, |
| 160 | }) |
| 161 | await resourceLoader.reload() |
| 162 | |
| 163 | const themesResult = resourceLoader.getThemes() |
| 164 | const { |
| 165 | getResolvedThemeColors, |
| 166 | getThemeExportColors, |
| 167 | isLightTheme, |
| 168 | loadThemeFromPath, |
| 169 | setRegisteredThemes, |
| 170 | } = await getThemeHelpers() |
| 171 | const bundled = loadBundledThemes(loadThemeFromPath) |
| 172 | setRegisteredThemes([...bundled.themes, ...(themesResult.themes as unknown[])]) |
| 173 | |
| 174 | const selectedTheme = settingsManager.getTheme() ?? defaultPiSettings.theme |
| 175 | const themeEntries = getThemeEntries(bundled.entries, themesResult) |
| 176 | |
| 177 | try { |
| 178 | const colors = getResolvedThemeColors(selectedTheme) |
| 179 | const exportColors = getThemeExportColors(selectedTheme) |
| 180 | return { |
| 181 | selectedTheme, |
| 182 | themes: themeEntries, |
| 183 | colors, |
| 184 | exportColors, |
| 185 | isLight: isResolvedLightTheme(selectedTheme, colors, exportColors, isLightTheme), |
| 186 | diagnostics: themesResult.diagnostics |
| 187 | .map(asDiagnostic) |
| 188 | .filter(Boolean) |
| 189 | .concat(bundled.diagnostics) as PiThemeState['diagnostics'], |
| 190 | } |
| 191 | } catch (error) { |
| 192 | const fallbackTheme = themeEntries.some((theme) => theme.name === defaultPiSettings.theme) |
| 193 | ? defaultPiSettings.theme |
| 194 | : 'dark' |
| 195 | return { |
| 196 | selectedTheme: fallbackTheme, |
| 197 | themes: themeEntries, |
| 198 | colors: getResolvedThemeColors(fallbackTheme), |
| 199 | exportColors: getThemeExportColors(fallbackTheme), |
| 200 | isLight: fallbackTheme === 'light', |
| 201 | diagnostics: [ |
| 202 | ...themesResult.diagnostics.map(asDiagnostic).filter(Boolean), |
| 203 | ...bundled.diagnostics, |
| 204 | { |
| 205 | type: 'warning', |
| 206 | message: error instanceof Error ? error.message : String(error), |
no test coverage detected