Files
dbx/apps/desktop/src/lib/ai/promptTemplateDefaults.ts
T

59 lines
2.4 KiB
TypeScript

import type { PromptTemplate } from "@/types/promptTemplate";
import { promptTemplateCharacterCount } from "@/types/promptTemplate";
export interface AutoTemplateResolutionInput {
dbType?: string;
defaultTemplatesByDbType: Record<string, string[]>;
lastUsedTemplatesByDbType: Record<string, string[]>;
}
/**
* Template ids explicitly configured as defaults for the db_type, or empty
* when none are configured. Namespace-switch resolution must stop here:
* falling back to last-used would resurrect selections the user just cleared
* on every connection/database/schema change.
*/
export function resolveDefaultTemplateIds(dbType: string | undefined, defaultTemplatesByDbType: Record<string, string[]>): string[] {
if (!dbType) return [];
const defaults = defaultTemplatesByDbType[dbType];
return defaults && defaults.length > 0 ? [...defaults] : [];
}
/**
* Template ids to auto-select when a panel opens, keyed by the connection's
* db_type: explicit defaults win over the last-used fallback. Both records are
* scoped per db_type so a template tuned for one database never leaks into a
* namespace of another database type.
*/
export function resolveAutoTemplateIds({ dbType, defaultTemplatesByDbType, lastUsedTemplatesByDbType }: AutoTemplateResolutionInput): string[] {
const defaults = resolveDefaultTemplateIds(dbType, defaultTemplatesByDbType);
if (defaults.length > 0) return defaults;
if (!dbType) return [];
const lastUsed = lastUsedTemplatesByDbType[dbType];
return lastUsed && lastUsed.length > 0 ? [...lastUsed] : [];
}
/**
* Keep only ids that still exist among templates, deduplicated, dropping any
* single template whose content would push the combined total past maxTotal
* (same budget the manual multi-select enforces). A later smaller template is
* still applied so one oversized default cannot shadow the remaining defaults.
*/
export function capTemplateIdsToCharLimit(ids: string[], templates: PromptTemplate[], maxTotal: number): string[] {
const byId = new Map(templates.map((template) => [template.id, template]));
const kept: string[] = [];
const seen = new Set<string>();
let total = 0;
for (const id of ids) {
if (seen.has(id)) continue;
seen.add(id);
const template = byId.get(id);
if (!template) continue;
const size = promptTemplateCharacterCount(template.content);
if (total + size > maxTotal) continue;
total += size;
kept.push(id);
}
return kept;
}