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 };
}