feat: Add normalized types and utility functions for handling chat formats

- Introduced `NormalizedContentBlock`, `NormalizedUsage`, and related types for structured data handling.
- Implemented utility functions for creating and merging normalized usage statistics.
- Added a new module for shared transformers to manage chat formats.

feat: Implement app local state management

- Created functions to clear application installation state and manage local storage keys.
- Added constants for theme and user profile storage keys.

test: Add tests for BrandIcon component rendering

- Implemented tests to ensure BrandIcon does not force a colored background for recognized brands.

test: Enhance ModelAnalysisPanel tests

- Added tests for rendering token summaries with compact units in ModelAnalysisPanel.

test: Add tests for ModernSelect component

- Implemented tests to verify icon rendering for selected options in ModernSelect.

test: Add number formatting tests

- Created tests for `formatCompactTokenMetric` to validate token formatting logic.

feat: Implement account creation intent handling

- Added logic to handle session and API key creation intents in the Accounts page.

test: Add tests for dashboard performance card

- Implemented tests to verify rendering of performance metrics in the dashboard.

feat: Implement default connection segment resolution

- Added logic to determine initial connection segments based on platform types.

test: Add tests for settings factory reset functionality

- Implemented tests to verify the factory reset process and local state clearing.

test: Add tests for site creation redirect logic

- Implemented tests to verify redirection based on site capabilities during creation.

test: Add tests for token routes refresh decision action

- Implemented tests to verify refresh decision actions in TokenRoutes.

test: Add tests for token routes snapshot load

- Implemented tests to verify loading of cached snapshot data in TokenRoutes.
This commit is contained in:
cita
2026-03-08 12:08:57 +08:00
parent ed05b37626
commit 23922a5965
115 changed files with 18597 additions and 4411 deletions
@@ -0,0 +1,64 @@
import { eq, inArray } from 'drizzle-orm';
import { db, schema } from '../db/index.js';
import { formatUtcSqlDateTime } from './localTimeService.js';
function serializeSnapshot(snapshot: unknown): string | null {
if (snapshot == null) return null;
return JSON.stringify(snapshot);
}
export function parseRouteDecisionSnapshot(value: string | null | undefined): unknown | null {
if (typeof value !== 'string' || value.trim().length === 0) return null;
try {
return JSON.parse(value);
} catch {
return null;
}
}
export async function saveRouteDecisionSnapshot(routeId: number, snapshot: unknown): Promise<void> {
const refreshedAt = formatUtcSqlDateTime(new Date());
await db.update(schema.tokenRoutes)
.set({
decisionSnapshot: serializeSnapshot(snapshot),
decisionRefreshedAt: refreshedAt,
})
.where(eq(schema.tokenRoutes.id, routeId))
.run();
}
export async function saveRouteDecisionSnapshots(entries: Array<{ routeId: number; snapshot: unknown }>): Promise<void> {
for (const entry of entries) {
await saveRouteDecisionSnapshot(entry.routeId, entry.snapshot);
}
}
export async function clearRouteDecisionSnapshot(routeId: number): Promise<void> {
await clearRouteDecisionSnapshots([routeId]);
}
export async function clearRouteDecisionSnapshots(routeIds: number[]): Promise<void> {
const normalizedRouteIds = Array.from(new Set(
routeIds
.map((routeId) => Math.trunc(routeId))
.filter((routeId) => routeId > 0),
));
if (normalizedRouteIds.length === 0) return;
await db.update(schema.tokenRoutes)
.set({
decisionSnapshot: null,
decisionRefreshedAt: null,
})
.where(inArray(schema.tokenRoutes.id, normalizedRouteIds))
.run();
}
export async function clearAllRouteDecisionSnapshots(): Promise<void> {
await db.update(schema.tokenRoutes)
.set({
decisionSnapshot: null,
decisionRefreshedAt: null,
})
.run();
}