Project Files
src / noPromotion.ts
import fs from "fs";
import path from "path";
import { type BuildVisionPromotionPartsParams } from "./promotion";
import { readChatMediaState } from "./chat-media-state";
export async function buildPromotionPartsA(params: BuildVisionPromotionPartsParams): Promise<{ promoParts: any[]; promotedFiles: string[] }> {
const { chatWd } = params;
const promoParts: any[] = [];
const promotedFiles: string[] = [];
try {
const state = await readChatMediaState(chatWd).catch(() => ({ attachments: [], variants: [] } as any));
if (Array.isArray(state.attachments) && state.attachments.length) {
for (let i = 0; i < state.attachments.length; i++) {
const a = state.attachments[i];
const rel = a.filename; // Mode A uses original, not analysis preview
const abs = path.join(chatWd, rel);
const exists = await fs.promises.stat(abs).then(() => true).catch(() => false);
if (exists) {
const toMime = (fn: string) => (
/\.jpe?g$/i.test(fn)?'image/jpeg':
/\.png$/i.test(fn)?'image/png':
/\.webp$/i.test(fn)?'image/webp':
/\.gif$/i.test(fn)?'image/gif':
/\.bmp$/i.test(fn)?'image/bmp':
/\.svg$/i.test(fn)?'image/svg+xml':
/\.tiff?$/i.test(fn)?'image/tiff':
/\.heic$/i.test(fn)?'image/heic':'image/jpeg'
);
const buf = await fs.promises.readFile(abs);
const label = state.attachments.length > 1 ? `Attachment (A${i + 1})` : 'Attachment (A)';
promoParts.push({ text: label });
promoParts.push({ inlineData: { data: buf.toString('base64'), mimeType: toMime(rel) } });
promotedFiles.push(path.basename(abs));
}
}
}
} catch (e) {
// Soft-fail: no promotion in Mode A
}
return { promoParts, promotedFiles };
}