File size: 1,096 Bytes
c4ae742 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | // apps/api/src/analyzers/detect.ts
// Detect whether an uploaded ZIP is an API-mode recording or an MCP-mode recording.
// Rule (matches the existing importer logic in scripts/mcp/importer.js):
// - has session.json → mcp
// - has mcp_calls.json → mcp
// - otherwise (network.json only, etc.) → api
import JSZip from "jszip";
import type { DetectedMode } from "../queue/store.js";
const MCP_MARKERS = [/(^|\/)session\.json$/i, /(^|\/)mcp_calls\.json$/i];
export async function detectModeFromZip(
buffer: Buffer
): Promise<{ mode: DetectedMode; entries: string[] }> {
let zip: JSZip;
try {
zip = await JSZip.loadAsync(buffer);
} catch (err) {
const message =
err instanceof Error ? err.message : "ZIP 解析失败(不是有效的 zip 文件)";
throw Object.assign(new Error(message), { code: 400 });
}
const entries: string[] = [];
zip.forEach((path, entry) => {
if (!entry.dir) entries.push(path);
});
const isMcp = entries.some((p) => MCP_MARKERS.some((re) => re.test(p)));
return { mode: isMcp ? "mcp" : "api", entries };
}
|