@vibgrate/cli 2026.731.1 → 2026.731.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-33BMKWJC.js → agent-6XOI7RVW.js} +5 -5
- package/dist/{agent-33BMKWJC.js.map → agent-6XOI7RVW.js.map} +1 -1
- package/dist/baseline-PY6TETA5.js +9 -0
- package/dist/{baseline-4FBHW2X2.js.map → baseline-PY6TETA5.js.map} +1 -1
- package/dist/{chunk-KGWEBM2J.js → chunk-3VSU7G75.js} +27 -54
- package/dist/chunk-3VSU7G75.js.map +1 -0
- package/dist/{chunk-SKIMUFCI.js → chunk-5IA2TA57.js} +41 -65
- package/dist/chunk-5IA2TA57.js.map +1 -0
- package/dist/chunk-5XIEVZLW.js +65 -0
- package/dist/chunk-5XIEVZLW.js.map +1 -0
- package/dist/chunk-7G5S5KZN.js +99 -0
- package/dist/chunk-7G5S5KZN.js.map +1 -0
- package/dist/{chunk-DXSEG6SZ.js → chunk-AVCBKQKA.js} +3 -3
- package/dist/{chunk-DXSEG6SZ.js.map → chunk-AVCBKQKA.js.map} +1 -1
- package/dist/{chunk-J3BQ7FIT.js → chunk-B6S2DSBS.js} +7 -7
- package/dist/{chunk-J3BQ7FIT.js.map → chunk-B6S2DSBS.js.map} +1 -1
- package/dist/chunk-BMUTNUB7.js +326 -0
- package/dist/chunk-BMUTNUB7.js.map +1 -0
- package/dist/chunk-DEKGSQHL.js +6 -0
- package/dist/{chunk-2XTPGYR2.js.map → chunk-DEKGSQHL.js.map} +1 -1
- package/dist/{chunk-NJT4CA6K.js → chunk-DT4KIVRI.js} +17 -8
- package/dist/chunk-DT4KIVRI.js.map +1 -0
- package/dist/{chunk-GPDJOCUI.js → chunk-FF5ZQ6KI.js} +4 -4
- package/dist/{chunk-GPDJOCUI.js.map → chunk-FF5ZQ6KI.js.map} +1 -1
- package/dist/{chunk-WBMMRERH.js → chunk-KLO2XBUX.js} +3 -3
- package/dist/{chunk-WBMMRERH.js.map → chunk-KLO2XBUX.js.map} +1 -1
- package/dist/{chunk-T7OFJS3X.js → chunk-LTTVCI5C.js} +13 -328
- package/dist/chunk-LTTVCI5C.js.map +1 -0
- package/dist/{chunk-476KWSFM.js → chunk-MOLBANFB.js} +3 -3
- package/dist/{chunk-476KWSFM.js.map → chunk-MOLBANFB.js.map} +1 -1
- package/dist/{chunk-SE4JMB4W.js → chunk-PHGAUWWF.js} +3 -3
- package/dist/{chunk-SE4JMB4W.js.map → chunk-PHGAUWWF.js.map} +1 -1
- package/dist/{chunk-C22ZY3FV.js → chunk-RIWLXMMT.js} +3 -3
- package/dist/{chunk-C22ZY3FV.js.map → chunk-RIWLXMMT.js.map} +1 -1
- package/dist/chunk-SCTLOFNH.js +42 -0
- package/dist/chunk-SCTLOFNH.js.map +1 -0
- package/dist/{chunk-MYM5VIJ4.js → chunk-TRKRRX2S.js} +10 -6
- package/dist/chunk-TRKRRX2S.js.map +1 -0
- package/dist/{chunk-3NP2DO4G.js → chunk-WK52LWRX.js} +3 -3
- package/dist/{chunk-3NP2DO4G.js.map → chunk-WK52LWRX.js.map} +1 -1
- package/dist/{chunk-UVMP7DFF.js → chunk-XRN7DQGR.js} +11 -11
- package/dist/{chunk-UVMP7DFF.js.map → chunk-XRN7DQGR.js.map} +1 -1
- package/dist/{chunk-CWB6H553.js → chunk-Z7VH4RPO.js} +3 -3
- package/dist/{chunk-CWB6H553.js.map → chunk-Z7VH4RPO.js.map} +1 -1
- package/dist/cli.d.ts +5 -1
- package/dist/cli.js +166 -61
- package/dist/cli.js.map +1 -1
- package/dist/ensure-map-UQL7SM34.js +28 -0
- package/dist/ensure-map-UQL7SM34.js.map +1 -0
- package/dist/fs-NTQUFCXV.js +4 -0
- package/dist/fs-NTQUFCXV.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/dist/{interactive-V6IRYZTA.js → interactive-QWT7ERXJ.js} +22 -19
- package/dist/interactive-QWT7ERXJ.js.map +1 -0
- package/dist/load-WA53B3GW.js +10 -0
- package/dist/{load-KPHH26ND.js.map → load-WA53B3GW.js.map} +1 -1
- package/dist/{run-outcome-TZ53G67B.js → run-outcome-J2IDIVYI.js} +5 -5
- package/dist/{run-outcome-TZ53G67B.js.map → run-outcome-J2IDIVYI.js.map} +1 -1
- package/dist/{runtime-session-PZKXBDJT.js → runtime-session-52P2Y5LX.js} +7 -7
- package/dist/{runtime-session-PZKXBDJT.js.map → runtime-session-52P2Y5LX.js.map} +1 -1
- package/dist/{session-3OBIQLE4.js → session-L7SJNE55.js} +4 -4
- package/dist/{session-3OBIQLE4.js.map → session-L7SJNE55.js.map} +1 -1
- package/dist/session-store-SQECEXUU.js +4 -0
- package/dist/{session-store-O4XPXKOV.js.map → session-store-SQECEXUU.js.map} +1 -1
- package/dist/{stream-json-3YOPU3LF.js → stream-json-TSGYC2MQ.js} +5 -5
- package/dist/{stream-json-3YOPU3LF.js.map → stream-json-TSGYC2MQ.js.map} +1 -1
- package/dist/{vg-mcp-bridge-7NNVIVO7.js → vg-mcp-bridge-IFAXEQMZ.js} +6 -6
- package/dist/{vg-mcp-bridge-7NNVIVO7.js.map → vg-mcp-bridge-IFAXEQMZ.js.map} +1 -1
- package/dist/{vgd-Y2YCN75V.js → vgd-PNR7UKLL.js} +6 -6
- package/dist/vgd-PNR7UKLL.js.map +1 -0
- package/package.json +1 -1
- package/dist/baseline-4FBHW2X2.js +0 -9
- package/dist/chunk-2XTPGYR2.js +0 -6
- package/dist/chunk-K3SLGULW.js +0 -50
- package/dist/chunk-K3SLGULW.js.map +0 -1
- package/dist/chunk-KGWEBM2J.js.map +0 -1
- package/dist/chunk-MYM5VIJ4.js.map +0 -1
- package/dist/chunk-NJT4CA6K.js.map +0 -1
- package/dist/chunk-SKIMUFCI.js.map +0 -1
- package/dist/chunk-T7OFJS3X.js.map +0 -1
- package/dist/fs-HF5DOHYR.js +0 -4
- package/dist/fs-HF5DOHYR.js.map +0 -1
- package/dist/interactive-V6IRYZTA.js.map +0 -1
- package/dist/load-KPHH26ND.js +0 -10
- package/dist/session-store-O4XPXKOV.js +0 -4
- package/dist/vgd-Y2YCN75V.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/code/catalog.ts","../src/code/router.ts"],"names":["locals"],"mappings":"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","file":"chunk-BMUTNUB7.js","sourcesContent":["/**\n * Live model catalog for the `vg code` guided picker (VG-CLI-CODE §8).\n *\n * The guided flow offers the developer the current top providers and models\n * without us hard-coding a list that goes stale. OpenRouter publishes a public,\n * key-free catalog at `/api/v1/models`; we fetch it, group by provider, rank\n * coding-friendly models first, and cache it per-user with a TTL so repeat runs\n * are instant and offline runs still work. If the network and cache both fail we\n * fall back to a tiny curated provider list plus the always-available\n * \"enter a model slug yourself\" escape hatch — the picker is never empty.\n *\n * Pure over its injected `fetch`, `now`, and cache, so the parse/group/rank\n * logic is unit-testable with no network.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface CatalogModel {\n /** Full slug, e.g. `anthropic/claude-3.5-sonnet`. */\n id: string;\n name: string;\n /** Provider segment, e.g. `anthropic`. */\n provider: string;\n contextLength?: number;\n /** USD per 1M prompt tokens (derived from OpenRouter's per-token price). */\n promptPricePerM?: number;\n completionPricePerM?: number;\n}\n\nexport interface ProviderGroup {\n /** Provider id, e.g. `anthropic`. */\n id: string;\n /** Friendly label, e.g. `Anthropic (Claude)`. */\n label: string;\n models: CatalogModel[];\n}\n\nexport interface Catalog {\n providers: ProviderGroup[];\n /** true when served from network, false when from cache or the curated fallback. */\n fresh: boolean;\n source: 'network' | 'cache' | 'fallback';\n}\n\n/** Provider display names + the order we surface them (the \"top providers\" list). */\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: 'Anthropic (Claude)',\n openai: 'OpenAI (GPT)',\n 'x-ai': 'xAI (Grok)',\n google: 'Google (Gemini)',\n 'meta-llama': 'Meta (Llama)',\n deepseek: 'DeepSeek',\n mistralai: 'Mistral',\n qwen: 'Qwen',\n};\nconst FEATURED_ORDER = Object.keys(PROVIDER_LABELS);\n\nconst OPENROUTER_MODELS_URL = 'https://openrouter.ai/api/v1/models';\n/** Cache freshness window: a day is plenty; model lists move slowly. */\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface FetchCatalogOptions {\n fetchImpl?: typeof fetch;\n now?: () => number;\n /** Bypass and refresh from network. */\n noCache?: boolean;\n /** Never touch the network (offline / --local): cache or curated only. */\n offline?: boolean;\n timeoutMs?: number;\n}\n\n/** The per-user catalog cache file (shared across repos, like the model cache). */\nexport function catalogCachePath(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'catalog', 'openrouter-models.json');\n}\n\nexport async function fetchCatalog(options: FetchCatalogOptions = {}): Promise<Catalog> {\n const now = options.now ?? (() => 0);\n const fetchImpl = options.fetchImpl ?? fetch;\n\n // Serve from a warm cache when allowed.\n if (!options.noCache) {\n const cached = readCache();\n if (cached && (options.offline || now() - cached.ts < CACHE_TTL_MS)) {\n return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n }\n }\n if (options.offline) {\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n\n // Fetch fresh.\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 8000);\n let raw: unknown;\n try {\n const res = await fetchImpl(OPENROUTER_MODELS_URL, { signal: controller.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n raw = await res.json();\n } finally {\n clearTimeout(timer);\n }\n const models = parseModels(raw);\n if (models.length === 0) throw new Error('empty catalog');\n writeCache(models, now());\n return { providers: groupModels(models), fresh: true, source: 'network' };\n } catch {\n // Network failed → cache → curated.\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n}\n\n/** Parse OpenRouter's `/models` payload into our shape (defensive about fields). */\nexport function parseModels(raw: unknown): CatalogModel[] {\n const data = (raw as { data?: unknown[] })?.data;\n if (!Array.isArray(data)) return [];\n const out: CatalogModel[] = [];\n for (const entry of data) {\n const e = entry as {\n id?: unknown;\n name?: unknown;\n context_length?: unknown;\n pricing?: { prompt?: unknown; completion?: unknown };\n };\n if (typeof e.id !== 'string' || !e.id.includes('/')) continue;\n const provider = e.id.split('/')[0];\n out.push({\n id: e.id,\n name: typeof e.name === 'string' ? e.name : e.id,\n provider,\n contextLength: numeric(e.context_length),\n promptPricePerM: perMillion(e.pricing?.prompt),\n completionPricePerM: perMillion(e.pricing?.completion),\n });\n }\n return out;\n}\n\n/** Group models by provider, featured providers first, coding models first within each. */\nexport function groupModels(models: CatalogModel[]): ProviderGroup[] {\n const byProvider = new Map<string, CatalogModel[]>();\n for (const m of models) {\n const list = byProvider.get(m.provider) ?? [];\n list.push(m);\n byProvider.set(m.provider, list);\n }\n const groups: ProviderGroup[] = [];\n for (const [id, list] of byProvider) {\n groups.push({ id, label: PROVIDER_LABELS[id] ?? titleCase(id), models: list.sort(rankModels) });\n }\n // Featured providers in our order first, then the rest alphabetically.\n groups.sort((a, b) => {\n const ia = FEATURED_ORDER.indexOf(a.id);\n const ib = FEATURED_ORDER.indexOf(b.id);\n if (ia !== -1 || ib !== -1) return (ia === -1 ? 1e9 : ia) - (ib === -1 ? 1e9 : ib);\n return a.label.localeCompare(b.label);\n });\n return groups;\n}\n\n/** Coding-oriented models first, then larger context, then name — a helpful default order. */\nfunction rankModels(a: CatalogModel, b: CatalogModel): number {\n const ca = isCoding(a) ? 0 : 1;\n const cb = isCoding(b) ? 0 : 1;\n if (ca !== cb) return ca - cb;\n const la = a.contextLength ?? 0;\n const lb = b.contextLength ?? 0;\n if (la !== lb) return lb - la;\n return a.id.localeCompare(b.id);\n}\n\nfunction isCoding(m: CatalogModel): boolean {\n return /cod(e|er|ing)/i.test(m.id) || /cod(e|er|ing)/i.test(m.name);\n}\n\n/** Top N providers (the guided picker's first screen). */\nexport function topProviders(catalog: Catalog, n = 6): ProviderGroup[] {\n return catalog.providers.slice(0, n);\n}\n\ninterface CacheShape {\n ts: number;\n models: CatalogModel[];\n}\n\nfunction readCache(): CacheShape | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(catalogCachePath(), 'utf8')) as CacheShape;\n if (Array.isArray(parsed.models) && typeof parsed.ts === 'number') return parsed;\n } catch {\n /* no cache */\n }\n return null;\n}\n\nfunction writeCache(models: CatalogModel[], ts: number): void {\n try {\n const file = catalogCachePath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify({ ts, models }));\n } catch {\n /* cache is best-effort */\n }\n}\n\n/**\n * A minimal, honestly-labelled offline fallback: just the provider names, so the\n * picker still works with no network and no cache. Model ids are intentionally\n * NOT hard-coded (they go stale) — the flow always offers \"enter a model slug\".\n */\nfunction curatedFallback(): ProviderGroup[] {\n return FEATURED_ORDER.map((id) => ({ id, label: PROVIDER_LABELS[id], models: [] }));\n}\n\nfunction numeric(v: unknown): number | undefined {\n const n = typeof v === 'string' ? Number(v) : typeof v === 'number' ? v : NaN;\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** OpenRouter prices are USD *per token* as strings; convert to per-million. */\nfunction perMillion(v: unknown): number | undefined {\n const n = numeric(v);\n if (n === undefined) return undefined;\n return Math.round(n * 1_000_000 * 1000) / 1000;\n}\n\nfunction titleCase(id: string): string {\n return id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (ch) => ch.toUpperCase());\n}\n","/**\n * Model routing for `vg code` (VG-CLI-CODE §5.2).\n *\n * The \"best in breed\" story is an ordered set of backends with automatic\n * fallback — the OpenRouter/LiteLLM model — expressed as a *scheduling* decision\n * the session can execute: try the preferred provider, and on a transport\n * failure fall through to the next available one. This resolver is pure over its\n * injected inputs (flags, environment, the discovered local fleet), so it is\n * fully testable, and it holds two hard rules from the guardrails:\n *\n * - **No surprise egress or install.** With no explicit selection it picks a\n * backend only from signals already present (a configured hosted key, or a\n * model already pulled locally). It never dials a default cloud endpoint you\n * didn't configure, and never triggers an install to pick a default.\n * - **`--local` stays local.** Under `--local` only on-device backends are\n * eligible; if none are available it fails with an actionable message rather\n * than silently reaching the network.\n * - **Code Modes stay on the Vibgrate manager.** When {@link RouteOptions.codeMode}\n * is set, routing is fail-closed to embedded llama.cpp (first-party GGUF).\n * Ollama / LM Studio are never auto-selected for Code Modes.\n */\n\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { discoverModels, type LocalModel } from '../engine/models.js';\nimport { resolveGgufPath } from '../runtime/resolve-gguf.js';\nimport {\n formatManagerBadgeLine,\n managerFromProviderId,\n type ModelManagerId,\n} from '../runtime/model-manager.js';\nimport {\n LocalLlamaProvider,\n MockProvider,\n OllamaProvider,\n OpenAiCompatibleProvider,\n OPENAI_COMPATIBLE,\n type OpenAiCompatibleConfig,\n} from './providers.js';\nimport type { Provider } from './types.js';\n\nexport interface RouteOptions {\n /** Explicit `--provider` (vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp). */\n provider?: string;\n /** Explicit `--model`. */\n model?: string;\n /** `--local`: on-device backends only. */\n local?: boolean;\n /** `--yes`: consent to a first-use install (only relevant to llama-cpp). */\n consent?: boolean;\n /** Path to a gguf for the llama-cpp backend. */\n modelPath?: string;\n /**\n * Prefer embedded llama.cpp when a GGUF is resolvable (Code Mode preferredInference).\n * When false, Ollama may be tried first (VG_PREFER_OLLAMA).\n */\n preferEmbedded?: boolean;\n /**\n * Code Mode path (spark|flow|forge): fail-closed to the Vibgrate model manager.\n * Never auto-routes to Ollama / LM Studio / hosted.\n */\n codeMode?: boolean;\n /** A scripted reply → force the deterministic MockProvider (tests/`--mock`). */\n mockReply?: string;\n}\n\nexport interface RouteDeps {\n env?: NodeJS.ProcessEnv;\n discover?: () => LocalModel[];\n}\n\nexport interface RouteResult {\n /** Providers to try in order; the session falls through on transport failure. */\n providers: Provider[];\n /** A short, human explanation of the choice (for the run header / --json). */\n reason: string;\n /** Manager identity for the primary provider (badge / UX). */\n manager: ModelManagerId;\n /** e.g. \"[Vibgrate] Code Mode · first-party model manager …\" */\n managerLine: string;\n}\n\nconst HOSTED_IDS = new Set(['vibgrate-relay', 'openrouter', 'litellm', 'openai', 'together']);\n\n/** Resolve the ordered provider list for a run. Throws an actionable CliError when nothing is eligible. */\nexport function resolveProviders(opts: RouteOptions, deps: RouteDeps = {}): RouteResult {\n const env = deps.env ?? process.env;\n const discover = deps.discover ?? discoverModels;\n\n // Deterministic offline floor — used by tests, the benchmark, and `--mock`.\n if (opts.mockReply !== undefined) {\n const providers = [new MockProvider(opts.model ?? 'mock-1', opts.mockReply)];\n return finish(providers, 'mock provider (scripted, offline)');\n }\n\n // Code Modes: Vibgrate manager only (embedded GGUF). No third-party auto-route.\n // Even when code.ts pins provider=llama-cpp, never chain Ollama/LM Studio — a\n // grammar or load failure must surface the real error, not \"couldn't reach Ollama\".\n if (opts.codeMode && (!opts.provider || opts.provider === 'llama-cpp' || opts.provider === 'vibgrate')) {\n const gguf = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!gguf) {\n throw new CliError(\n 'Code Mode needs the Vibgrate model manager weights on disk. Run `vg models install spark|flow|forge` (or pass --model-path to a GGUF). Custom Ollama/LM Studio backends are only used when you set --provider explicitly.',\n ExitCode.NOT_FOUND,\n );\n }\n const providers = [\n new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent),\n ];\n return finish(providers, `Code Mode → Vibgrate model manager (embedded llama.cpp · ${gguf.path})`);\n }\n\n // Explicit provider wins.\n if (opts.provider) {\n const provider = buildExplicit(opts.provider, opts, env, discover);\n // Code Mode + explicit custom backend (ollama, lmstudio, …): still no surprise chain.\n if (opts.codeMode) {\n return finish([provider], `Code Mode → explicit --provider ${opts.provider} (no auto-fallback)`);\n }\n // Custom path: only fall through to other *local* adapters when --local, never LM Studio unless chosen.\n const fallbacks =\n opts.local || provider.local\n ? localFallbacks(opts, env, discover, provider.id, { allowLmStudio: opts.provider === 'lmstudio' })\n : [];\n return finish([provider, ...fallbacks], `explicit --provider ${opts.provider}`);\n }\n\n // --local: on-device only, in preference order (embedded → ollama; no surprise LM Studio).\n if (opts.local) {\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length === 0) {\n throw new CliError(\n 'no local model backend available for --local. Install a Code Mode (`vg models install spark`), start Ollama (`ollama serve` + pull), or point --provider llama-cpp at a gguf. See `vg models`.',\n ExitCode.NOT_FOUND,\n );\n }\n return finish(locals, '--local (on-device backends only)');\n }\n\n // No explicit selection: choose from signals already present, best first.\n // 1) Vibgrate Relay — the first-party hosted router, preferred when the user\n // has signed in. Nothing is dialled without their token, so this stays inside\n // the no-surprise-egress rule above.\n if (env.VIBGRATE_RELAY_TOKEN) {\n const model = resolveHostedModel(opts, env, 'vibgrate-relay');\n const primary = buildHosted('vibgrate-relay', model);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'vibgrate-relay', { allowLmStudio: false })],\n 'VIBGRATE_RELAY_TOKEN is set → Vibgrate Relay (with local fallback)',\n );\n }\n // 2) Another configured hosted router key.\n if (env.OPENROUTER_API_KEY) {\n const model = resolveHostedModel(opts, env, 'openrouter');\n const primary = buildHosted('openrouter', model);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'openrouter', { allowLmStudio: false })],\n 'OPENROUTER_API_KEY is set → OpenRouter (with local fallback)',\n );\n }\n // 3) A locally-pulled model (embedded first; never auto LM Studio).\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length) return finish(locals, 'a local model is available → on-device (no key needed)');\n // 4) Any other configured hosted key.\n for (const id of ['litellm', 'openai', 'together'] as const) {\n const keyEnv = OPENAI_COMPATIBLE[id].apiKeyEnv;\n if (keyEnv && env[keyEnv]) {\n const model = resolveHostedModel(opts, env, id);\n return finish([buildHosted(id, model)], `${keyEnv} is set → ${OPENAI_COMPATIBLE[id].label}`);\n }\n }\n\n throw new CliError(\n 'no model backend configured. Do one of: sign in to Vibgrate Relay (VIBGRATE_RELAY_TOKEN), set OPENROUTER_API_KEY for the hosted router, run `vg models install spark` for the Vibgrate manager, run Ollama locally, or use --local with a local model. Set the model with --model or VG_CODE_MODEL.',\n ExitCode.NOT_FOUND,\n );\n}\n\nfunction finish(providers: Provider[], reason: string): RouteResult {\n const primary = providers[0];\n const manager = managerFromProviderId(primary?.id);\n return {\n providers,\n reason,\n manager,\n managerLine: formatManagerBadgeLine(manager, primary?.model),\n };\n}\n\nfunction buildExplicit(id: string, opts: RouteOptions, env: NodeJS.ProcessEnv, discover: () => LocalModel[]): Provider {\n if (id === 'ollama') return new OllamaProvider(resolveLocalModel(opts, discover, 'ollama'), env.OLLAMA_HOST);\n if (id === 'llama-cpp' || id === 'vibgrate') {\n const resolved = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!resolved) {\n throw new CliError(\n '--provider llama-cpp needs a GGUF: pass --model-path, set VG_CODE_MODEL_PATH, or run `vg models install` so the weight store has a catalogued gguf. See `vg models`.',\n ExitCode.USAGE_ERROR,\n );\n }\n return new LocalLlamaProvider(opts.model ?? basename(resolved.path), resolved.path, undefined, !!opts.consent);\n }\n if (id === 'lmstudio') return buildHosted('lmstudio', resolveHostedModel(opts, env, 'lmstudio'));\n if (id === 'foundry-local' || id === 'foundry') {\n return buildHosted('foundry-local', resolveHostedModel(opts, env, 'foundry-local'));\n }\n if (HOSTED_IDS.has(id)) return buildHosted(id, resolveHostedModel(opts, env, id));\n throw new CliError(\n `unknown --provider \"${id}\". Known: vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction buildHosted(id: string, model: string): OpenAiCompatibleProvider {\n const base = OPENAI_COMPATIBLE[id];\n const config: OpenAiCompatibleConfig = { ...base, id };\n return new OpenAiCompatibleProvider(model, config);\n}\n\ninterface LocalFallbackOpts {\n /** Only include LM Studio when the user explicitly asked for it. */\n allowLmStudio: boolean;\n}\n\n/** On-device backends in preference order, skipping the one already chosen as primary. */\nfunction localFallbacks(\n opts: RouteOptions,\n env: NodeJS.ProcessEnv,\n discover: () => LocalModel[],\n exclude: string,\n fb: LocalFallbackOpts,\n): Provider[] {\n const out: Provider[] = [];\n const models = safeDiscover(discover);\n\n // Approach B default: when a GGUF is already on disk, embedded is primary local.\n // Opt out with VG_PREFER_OLLAMA=1 if the user wants Ollama first.\n const preferOllama =\n env.VG_PREFER_OLLAMA === '1' ||\n env.VIBGRATE_PREFER_OLLAMA === '1' ||\n opts.preferEmbedded === false;\n const gguf =\n exclude === 'llama-cpp' || exclude === 'vibgrate'\n ? null\n : resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover: () => models,\n });\n\n if (gguf && !preferOllama) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n\n const ollamaModel = opts.model ?? firstOfRuntime(models, 'ollama');\n if (exclude !== 'ollama' && ollamaModel) out.push(new OllamaProvider(ollamaModel, env.OLLAMA_HOST));\n\n // LM Studio only when explicitly allowed (user chose --provider lmstudio).\n if (fb.allowLmStudio && exclude !== 'lmstudio') {\n const lmModel = opts.model ?? firstOfRuntime(models, 'lm-studio');\n if (lmModel) out.push(buildHosted('lmstudio', lmModel));\n }\n\n // Foundry Local when server/env is configured.\n if (exclude !== 'foundry-local' && exclude !== 'foundry' && (env.FOUNDRY_LOCAL_BASE_URL || env.VG_CODE_PROVIDER === 'foundry-local')) {\n try {\n const m = opts.model || env.VG_CODE_MODEL;\n if (m) out.push(buildHosted('foundry-local', m));\n } catch {\n /* skip if no model */\n }\n }\n\n // Embedded last if user forced Ollama-first but GGUF still available.\n if (gguf && !out.some((p) => p.id === 'llama-cpp')) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n return out;\n}\n\nfunction resolveLocalModel(opts: RouteOptions, discover: () => LocalModel[], runtime: LocalModel['runtime']): string {\n if (opts.model) return opts.model;\n const found = firstOfRuntime(safeDiscover(discover), runtime);\n if (found) return found;\n throw new CliError(`--provider ${runtime} needs a model. Pull one (\\`ollama pull <model>\\`) then re-run, or pass --model. See \\`vg models\\`.`, ExitCode.NOT_FOUND);\n}\n\nfunction resolveHostedModel(opts: RouteOptions, env: NodeJS.ProcessEnv, id: string): string {\n const model = opts.model || env.VG_CODE_MODEL;\n if (model) return model;\n throw new CliError(\n `${OPENAI_COMPATIBLE[id].label} needs a model id — pass --model (e.g. a current best-in-breed coding model) or set VG_CODE_MODEL. We don't hard-code a model so you always pick the current best one.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction firstOfRuntime(models: LocalModel[], runtime: LocalModel['runtime']): string | undefined {\n // Deterministic: discoverModels() already returns a sorted list.\n const m = models.find((x) => x.runtime === runtime);\n return m?.name;\n}\n\nfunction safeDiscover(discover: () => LocalModel[]): LocalModel[] {\n try {\n return discover();\n } catch {\n return [];\n }\n}\n\nfunction basename(p: string): string {\n return p.replace(/\\\\/g, '/').split('/').pop() ?? p;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";AACO,IAAM,OAAA,GAAU","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";AACO,IAAM,OAAA,GAAU","file":"chunk-DEKGSQHL.js","sourcesContent":["// Calendar version (YYYY.DDD.PATCH), shared scheme with @vibgrate/cli.\nexport const VERSION = '2026.731.3';\n"]}
|
|
@@ -201,6 +201,8 @@ var SKIP_DIRS = /* @__PURE__ */ new Set([
|
|
|
201
201
|
"Carthage",
|
|
202
202
|
// Carthage (iOS/macOS)
|
|
203
203
|
// ── Python — virtualenvs & tool caches ──
|
|
204
|
+
// Exact names only; custom-named envs (`.venv-foo`) and `site-packages`
|
|
205
|
+
// are handled by {@link isSkippedDirName}.
|
|
204
206
|
".venv",
|
|
205
207
|
"venv",
|
|
206
208
|
"virtualenv",
|
|
@@ -240,6 +242,13 @@ var SKIP_DIRS = /* @__PURE__ */ new Set([
|
|
|
240
242
|
"cdk.out",
|
|
241
243
|
".aws-sam"
|
|
242
244
|
]);
|
|
245
|
+
function isSkippedDirName(name) {
|
|
246
|
+
if (!name) return false;
|
|
247
|
+
if (SKIP_DIRS.has(name)) return true;
|
|
248
|
+
if (name.startsWith(".venv") || name.startsWith("venv-")) return true;
|
|
249
|
+
if (name === "site-packages") return true;
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
243
252
|
var SKIP_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
244
253
|
// Fonts
|
|
245
254
|
".woff",
|
|
@@ -524,7 +533,7 @@ var FileCache = class _FileCache {
|
|
|
524
533
|
const relPath = path2.relative(rootDir, absPath);
|
|
525
534
|
if (isExcluded && isExcluded(relPath)) continue;
|
|
526
535
|
if (e.isDirectory()) {
|
|
527
|
-
if (
|
|
536
|
+
if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;
|
|
528
537
|
if (isGitignored(levels, absPath, true)) continue;
|
|
529
538
|
results.push({ absPath, relPath, name: e.name, isFile: false, isDirectory: true });
|
|
530
539
|
subWalks.push(walk(absPath, levels));
|
|
@@ -770,7 +779,7 @@ async function quickTreeCount(rootDir, excludePatterns) {
|
|
|
770
779
|
const relPath = path2.relative(rootDir, absPath);
|
|
771
780
|
if (isExcluded && isExcluded(relPath)) continue;
|
|
772
781
|
if (e.isDirectory()) {
|
|
773
|
-
if (
|
|
782
|
+
if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;
|
|
774
783
|
if (isGitignored(levels, absPath, true)) continue;
|
|
775
784
|
totalDirs++;
|
|
776
785
|
subs.push(count(absPath, levels));
|
|
@@ -833,7 +842,7 @@ async function countFilesInDir(dir, recursive = true) {
|
|
|
833
842
|
for (const e of entries) {
|
|
834
843
|
if (e.isDirectory()) {
|
|
835
844
|
if (!recursive) continue;
|
|
836
|
-
if (
|
|
845
|
+
if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;
|
|
837
846
|
subs.push(walk(path2.join(currentDir, e.name)));
|
|
838
847
|
} else if (e.isFile()) {
|
|
839
848
|
const ext = path2.extname(e.name).toLowerCase();
|
|
@@ -859,7 +868,7 @@ async function bytesInDir(dir, recursive = true) {
|
|
|
859
868
|
for (const e of entries) {
|
|
860
869
|
if (e.isDirectory()) {
|
|
861
870
|
if (!recursive) continue;
|
|
862
|
-
if (
|
|
871
|
+
if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;
|
|
863
872
|
subs.push(walk(path2.join(currentDir, e.name)));
|
|
864
873
|
} else if (e.isFile()) {
|
|
865
874
|
const ext = path2.extname(e.name).toLowerCase();
|
|
@@ -891,7 +900,7 @@ async function findFiles(rootDir, predicate) {
|
|
|
891
900
|
const subDirectoryWalks = [];
|
|
892
901
|
for (const e of entries) {
|
|
893
902
|
if (e.isDirectory()) {
|
|
894
|
-
if (
|
|
903
|
+
if (isSkippedDirName(e.name)) continue;
|
|
895
904
|
subDirectoryWalks.push(walk(path2.join(dir, e.name)));
|
|
896
905
|
} else if (e.isFile() && predicate(e.name)) {
|
|
897
906
|
const ext = path2.extname(e.name).toLowerCase();
|
|
@@ -942,6 +951,6 @@ async function writeTextFile(filePath, content) {
|
|
|
942
951
|
await fs.writeFile(filePath, content, "utf8");
|
|
943
952
|
}
|
|
944
953
|
|
|
945
|
-
export { FileCache, SKIP_DIRS, SOURCE_EXCLUDE_FILES, Semaphore, bytesInDir, countFilesInDir, ensureDir, findCsprojFiles, findFiles, findPackageJsonFiles, findSolutionFiles, normalizeGlobForRipgrep, parseExcludePatterns, pathExists, quickTreeCount, readJsonFile, readTextFile, stripBom, writeJsonFile, writeTextFile };
|
|
946
|
-
//# sourceMappingURL=chunk-
|
|
947
|
-
//# sourceMappingURL=chunk-
|
|
954
|
+
export { FileCache, SKIP_DIRS, SOURCE_EXCLUDE_FILES, Semaphore, bytesInDir, countFilesInDir, ensureDir, findCsprojFiles, findFiles, findPackageJsonFiles, findSolutionFiles, isSkippedDirName, normalizeGlobForRipgrep, parseExcludePatterns, pathExists, quickTreeCount, readJsonFile, readTextFile, stripBom, writeJsonFile, writeTextFile };
|
|
955
|
+
//# sourceMappingURL=chunk-DT4KIVRI.js.map
|
|
956
|
+
//# sourceMappingURL=chunk-DT4KIVRI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core-open/utils/semaphore.ts","../src/core-open/utils/glob.ts","../src/core-open/utils/fs.ts"],"names":["resolve","path","stat"],"mappings":"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","file":"chunk-DT4KIVRI.js","sourcesContent":["// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/** Simple concurrency limiter */\nexport class Semaphore {\n private available: number;\n private queue: Array<() => void> = [];\n\n constructor(max: number) {\n this.available = max;\n }\n\n async run<T>(fn: () => Promise<T>): Promise<T> {\n await this.acquire();\n try {\n return await fn();\n } finally {\n this.release();\n }\n }\n\n private acquire(): Promise<void> {\n if (this.available > 0) {\n this.available--;\n return Promise.resolve();\n }\n return new Promise((resolve) => this.queue.push(resolve));\n }\n\n private release() {\n const next = this.queue.shift();\n if (next) next();\n else this.available++;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\n\n/**\n * Lightweight glob matcher — zero external dependencies.\n *\n * Supports the patterns most commonly used in vibgrate config `exclude`:\n * - `*` matches any sequence of non-separator chars\n * - `**` matches any sequence of chars including separators (recursive)\n * - `?` matches exactly one non-separator char\n * - `{a,b}` alternation\n * - `[abc]` character class\n * - Literal folder names like `legacy` match as a prefix (`legacy/**`)\n *\n * Paths are normalised to forward-slash before matching so patterns\n * work identically on Windows and Unix.\n */\n\n/**\n * Compile an array of glob patterns into a single predicate function\n * that tests a **relative** path (forward-slash separated).\n *\n * Returns `null` if the pattern list is empty (nothing excluded).\n */\n/**\n * Split one or more raw exclude inputs into individual glob patterns.\n *\n * Each input may contain multiple patterns separated by commas or\n * semicolons, e.g. `\"legacy/**, vendor/**; dist\"`. Surrounding\n * whitespace is trimmed and empty entries are dropped. Pass an array\n * (e.g. a repeated `--exclude` flag) and every element is expanded and\n * flattened into a single de-duplicated list.\n */\nexport function parseExcludePatterns(input: string | string[] | undefined): string[] {\n if (input === undefined) return [];\n const raw = Array.isArray(input) ? input : [input];\n const out: string[] = [];\n for (const entry of raw) {\n for (const part of entry.split(/[,;]/)) {\n const trimmed = part.trim();\n if (trimmed) out.push(trimmed);\n }\n }\n return [...new Set(out)];\n}\n\nexport function compileGlobs(patterns: string[]): ((relPath: string) => boolean) | null {\n if (patterns.length === 0) return null;\n\n const matchers = patterns.map((p) => compileOne(normalise(p)));\n\n return (relPath: string) => {\n const norm = normalise(relPath);\n return matchers.some((m) => m(norm));\n };\n}\n\nfunction normalise(p: string): string {\n // Always use forward-slash for matching\n return p.split(path.sep).join('/').replace(/\\/+$/, '');\n}\n\nfunction compileOne(pattern: string): (p: string) => boolean {\n // If the pattern has no glob metacharacters and no path separator,\n // treat it as a directory name prefix match (e.g. \"legacy\" → \"legacy/**\")\n if (!pattern.includes('/') && !hasGlobChars(pattern)) {\n const prefix = pattern + '/';\n return (p) => p === pattern || p.startsWith(prefix);\n }\n\n const re = globToRegex(pattern);\n return (p) => re.test(p);\n}\n\nfunction hasGlobChars(s: string): boolean {\n return /[*?[\\]{}]/.test(s);\n}\n\nfunction globToRegex(pattern: string): RegExp {\n let i = 0;\n let re = '^';\n const len = pattern.length;\n\n while (i < len) {\n const ch = pattern[i]!;\n\n if (ch === '*') {\n if (pattern[i + 1] === '*') {\n // ** — match everything (including separators)\n i += 2;\n if (pattern[i] === '/') {\n // **/ — matches zero or more path segments followed by /\n i++;\n re += '(?:.+/)?';\n } else {\n // ** at end of pattern — matches everything remaining\n re += '.*';\n }\n } else {\n // * — match non-separator chars\n i++;\n re += '[^/]*';\n }\n } else if (ch === '?') {\n i++;\n re += '[^/]';\n } else if (ch === '[') {\n // Character class — pass through until ]\n const start = i;\n i++; // skip [\n while (i < len && pattern[i] !== ']') i++;\n i++; // skip ]\n re += pattern.slice(start, i);\n } else if (ch === '{') {\n // Alternation {a,b,c}\n i++; // skip {\n const alternatives: string[] = [];\n let current = '';\n while (i < len && pattern[i] !== '}') {\n if (pattern[i] === ',') {\n alternatives.push(current);\n current = '';\n } else {\n current += pattern[i];\n }\n i++;\n }\n alternatives.push(current);\n i++; // skip }\n re += '(?:' + alternatives.map(escapeRegex).join('|') + ')';\n } else {\n re += escapeRegex(ch);\n i++;\n }\n }\n\n re += '$';\n return new RegExp(re);\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { execFile } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { promisify } from 'node:util';\nimport type { Dirent } from 'node:fs';\nimport ignore, { type Ignore } from 'ignore';\nimport { Semaphore } from './semaphore.js';\nimport { compileGlobs } from './glob.js';\n\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * One `.gitignore`'s compiled matcher, scoped to the directory it lives in.\n * `.gitignore` patterns are relative to their own directory (not the walk\n * root), so each level is tested independently against a path relative to\n * `dir`, and results are combined root-to-leaf so a deeper `.gitignore` can\n * re-include (negate) something an ancestor ignored — the same precedence\n * git itself uses.\n */\ninterface GitignoreLevel {\n dir: string;\n ig: Ignore;\n}\n\n/**\n * Load `dir/.gitignore` if present and return a new level list with it\n * appended. Returns `levels` unchanged (no allocation) when the directory has\n * no `.gitignore`, which is the common case.\n */\nasync function extendGitignoreLevels(dir: string, levels: GitignoreLevel[]): Promise<GitignoreLevel[]> {\n try {\n const txt = await fs.readFile(path.join(dir, '.gitignore'), 'utf8');\n return [...levels, { dir, ig: ignore().add(txt) }];\n } catch {\n return levels;\n }\n}\n\n/**\n * Test whether `absPath` is ignored by any `.gitignore` level collected while\n * walking down from the repo root. Walks levels in root-to-leaf order so a\n * later (deeper) match — ignore or negated un-ignore — wins, matching git's\n * own precedence rules.\n */\nfunction isGitignored(levels: GitignoreLevel[], absPath: string, isDir: boolean): boolean {\n if (levels.length === 0) return false;\n let ignored = false;\n for (const { dir, ig } of levels) {\n const rel = path.relative(dir, absPath);\n if (!rel || rel.startsWith('..')) continue;\n const relPosix = rel.split(path.sep).join('/');\n const testPath = isDir ? `${relPosix}/` : relPosix;\n const result = ig.test(testPath);\n if (result.ignored) ignored = true;\n else if (result.unignored) ignored = false;\n }\n return ignored;\n}\n\n/**\n * Directories pruned entirely from the walk — third-party dependency trees,\n * build/output directories, and VCS/IDE metadata. Skipping them keeps their\n * contents out of BOTH project discovery (no phantom projects) AND the billing\n * source-size signals. Matched by exact directory name at any depth.\n *\n * Correctness is load-bearing for pricing: a *missing* entry lets vendored\n * third-party code inflate the project count and size (over-billing — e.g. a\n * React Native app's `Pods/` minting hundreds of phantom C/Obj-C projects),\n * while a *wrong* entry silently drops real source (under-billing). Every name\n * here must be one that is effectively never hand-written source in its\n * ecosystem. Keep in sync with `docs/DEPENDENCY-EXCLUSIONS.md`.\n *\n * Exported so other walkers (e.g. the graph engine's discovery, which keeps\n * its own self-contained copy) can assert in tests that they cover at least\n * this set — the scanner and the graph must never disagree on what is a\n * dependency/build tree.\n */\nexport const SKIP_DIRS = new Set([\n // ── Version control, IDE & tool metadata (never billable source) ──\n '.git', '.svn', '.hg',\n '.idea', '.vscode', '.vs',\n // Claude Code agent state / worktrees (full monorepo copies under .claude/worktrees/)\n '.claude',\n '.vibgrate', '.wrangler', '.turbo', '.cache',\n\n // ── JavaScript / Node — installed dependency trees ──\n 'node_modules', // npm / pnpm / yarn classic\n 'bower_components', // Bower (legacy)\n 'jspm_packages', // jspm (legacy)\n 'web_modules', // Snowpack (legacy)\n '.pnpm-store', // pnpm content-addressable store\n '.yarn', // Yarn Berry cache / unplugged / releases\n\n // ── JS/TS meta-framework & bundler build output ──\n '.next', '.nuxt', '.output', '.svelte-kit', '.astro',\n '.vercel', '.netlify', '.angular', '.parcel-cache', '.docusaurus',\n 'storybook-static',\n\n // ── Generic build / dist / coverage output ──\n 'dist', 'build', 'out', 'coverage',\n\n // ── Vendored third-party source trees ──\n 'vendor', // Go vendor/, PHP Composer, Rails vendor/bundle\n 'Pods', // CocoaPods (iOS/macOS)\n 'Carthage', // Carthage (iOS/macOS)\n\n // ── Python — virtualenvs & tool caches ──\n // Exact names only; custom-named envs (`.venv-foo`) and `site-packages`\n // are handled by {@link isSkippedDirName}.\n '.venv', 'venv', 'virtualenv', '.tox', '.nox',\n '__pycache__', '.mypy_cache', '.pytest_cache', '.ruff_cache',\n '.eggs', '.ipynb_checkpoints',\n\n // ── Ruby ──\n '.bundle', // bundler config / vendored gems\n\n // ── Rust / Maven / sbt / Clojure — all build into target/ ──\n 'target',\n\n // ── JVM (Gradle / Maven) & .NET build output ──\n '.gradle', 'bin', 'obj', 'TestResults',\n\n // ── Swift / Xcode ──\n '.build', '.swiftpm', 'DerivedData',\n\n // ── Dart / Flutter ──\n '.dart_tool',\n\n // ── Elixir / Erlang ──\n '_build', 'deps',\n\n // ── Haskell (Cabal / Stack) ──\n 'dist-newstyle', '.stack-work',\n\n // ── Infrastructure-as-code build/state ──\n '.terraform', '.serverless', 'cdk.out', '.aws-sam',\n]);\n\n/**\n * True when a directory basename must be pruned from discovery / billing walks.\n * Covers exact {@link SKIP_DIRS} names plus custom virtualenv names\n * (`.venv-contextbench`, `venv-tools`, …) and Python install trees\n * (`site-packages`) that otherwise mint phantom nested projects.\n */\nexport function isSkippedDirName(name: string): boolean {\n if (!name) return false;\n if (SKIP_DIRS.has(name)) return true;\n if (name.startsWith('.venv') || name.startsWith('venv-')) return true;\n if (name === 'site-packages') return true;\n return false;\n}\n\n/** File extensions skipped during the walk — binary/font/media that no scanner needs to read */\nconst SKIP_EXTENSIONS = new Set([\n // Fonts\n '.woff', '.woff2', '.ttf', '.otf', '.eot',\n // Images & vector\n '.png', '.jpg', '.jpeg', '.gif', '.ico', '.bmp', '.tiff', '.tif', '.webp', '.avif', '.svg',\n '.heic', '.heif', '.jfif', '.psd', '.ai', '.eps', '.raw', '.cr2', '.nef', '.dng',\n // Video\n '.mp4', '.webm', '.avi', '.mov', '.mkv', '.wmv', '.flv', '.m4v', '.mpg', '.mpeg', '.3gp', '.ogv',\n // Audio\n '.mp3', '.wav', '.ogg', '.flac', '.aac', '.wma', '.m4a', '.opus', '.aiff', '.mid', '.midi',\n // Archives\n '.zip', '.tar', '.gz', '.bz2', '.7z', '.rar',\n // Compiled / binary\n '.exe', '.dll', '.so', '.dylib', '.o', '.a', '.class', '.pyc', '.pdb',\n // Source maps & lockfiles (large, not useful for drift analysis)\n '.map',\n]);\n\n// Folded into SKIP_DIRS above (single source of truth). Kept as an empty set\n// so the existing walk/ripgrep call sites that OR-check it stay valid.\nconst EXTRA_SKIP_DIRS = new Set<string>([]);\n\n/**\n * Lockfiles and generated dependency manifests excluded from the billing\n * source-size metrics. They are not hand-written source, and a single one\n * (e.g. a pnpm-lock.yaml) can exceed 1 MB on its own, which would otherwise\n * inflate a genuinely tiny project past the micro/small size thresholds.\n *\n * Unlike {@link SKIP_DIRS}, these files legitimately sit at a project root\n * (next to the manifest that declares the project), so they are filtered\n * per-file rather than by pruning a directory. Manifests that *define* a\n * project (package.json, go.mod, Cargo.toml, *.csproj, …) are deliberately NOT\n * here — they are the source of truth for project discovery. Compared\n * case-insensitively against the basename, so every entry must be lowercase.\n * Keep in sync with `docs/DEPENDENCY-EXCLUSIONS.md`.\n */\nexport const SOURCE_EXCLUDE_FILES = new Set([\n // JavaScript / Node\n 'package-lock.json', 'npm-shrinkwrap.json', 'yarn.lock',\n 'pnpm-lock.yaml', 'bun.lockb', 'bun.lock', 'deno.lock',\n '.pnp.cjs', '.pnp.data.json', // Yarn PnP (generated, can be large)\n // Python\n 'poetry.lock', 'pipfile.lock', 'pdm.lock', 'uv.lock',\n 'pylock.toml', // PEP 751 standard lock\n 'conda-lock.yml',\n // Ruby\n 'gemfile.lock',\n // PHP\n 'composer.lock',\n // Rust\n 'cargo.lock',\n // Go\n 'go.sum', 'go.work.sum', 'gopkg.lock', 'glide.lock',\n // .NET\n 'packages.lock.json',\n // Java / JVM (Gradle)\n 'gradle.lockfile',\n // Swift / Xcode\n 'package.resolved',\n // Dart / Flutter\n 'pubspec.lock',\n // Elixir\n 'mix.lock',\n // Haskell (Cabal / Stack)\n 'cabal.project.freeze', 'stack.yaml.lock',\n // Julia\n 'manifest.toml',\n // R\n 'renv.lock',\n // Perl (Carton)\n 'cpanfile.snapshot',\n // CocoaPods / Carthage\n 'podfile.lock', 'cartfile.resolved',\n // Terraform / IaC\n '.terraform.lock.hcl',\n // Helm\n 'chart.lock',\n // C / C++ (Conan)\n 'conan.lock',\n // Bazel\n 'module.bazel.lock',\n // Nix\n 'flake.lock',\n]);\n\n// ── Directory entry gathered in a single walk ──\n\nexport interface DirEntry {\n /** Absolute path */\n absPath: string;\n /** Path relative to the walk root */\n relPath: string;\n /** Filename (basename) */\n name: string;\n /** Whether this is a regular file */\n isFile: boolean;\n /** Whether this is a directory */\n isDirectory: boolean;\n}\n\n// ── FileCache: walk once, read once ──\n\n/**\n * Maximum file size (in bytes) that will be held in the text cache.\n * Files larger than this are read from disk but NOT stored — this prevents\n * lockfiles (pnpm-lock.yaml, package-lock.json, etc.) from consuming\n * 50-200 MB of heap. Small config files like package.json (~1-5 KB each)\n * are cached normally.\n */\nconst TEXT_CACHE_MAX_BYTES = 1_048_576; // 1 MB\n\n/**\n * Shared cache that ensures the filesystem is walked at most once per root dir\n * and every small file is read at most once across all scanners.\n *\n * Memory-conscious design:\n * - Walk results are stored once; consumers filter in-memory.\n * - File content is only cached when ≤ TEXT_CACHE_MAX_BYTES (1 MB).\n * Large files (lockfiles) pass straight through without caching.\n * - readJsonFile evicts the raw-text entry after parsing so we never\n * hold *both* the string and the parsed object for the same file.\n * - No stat caching — only file-hotspots uses stat and there's no\n * cross-scanner reuse to justify holding thousands of Stats objects.\n * - Call `clear()` after the scan to release all remaining references.\n */\nexport class FileCache {\n /** Directory walk results keyed by rootDir */\n private walkCache = new Map<string, Promise<DirEntry[]>>();\n /** File content keyed by absolute path (only files ≤ TEXT_CACHE_MAX_BYTES) */\n private textCache = new Map<string, Promise<string>>();\n /** Parsed JSON keyed by absolute path */\n private jsonCache = new Map<string, Promise<unknown>>();\n /** pathExists keyed by absolute path */\n private existsCache = new Map<string, Promise<boolean>>();\n /** User-configured exclude predicate (compiled from glob patterns) */\n private excludePredicate: ((relPath: string) => boolean) | null = null;\n /** Directories that were auto-skipped because they were stuck */\n private _stuckPaths: string[] = [];\n /** Files skipped because they exceed maxFileSizeToScan */\n private _skippedLargeFiles: string[] = [];\n /** Maximum file size (bytes) we will read. 0 = unlimited. */\n private _maxFileSize = 0;\n /** Per-project / per-directory scan timeout in ms. */\n private _projectScanTimeout = 180_000;\n /** Whether we have already shown the \"increase projectScanTimeout\" hint */\n private _timeoutHintShown = false;\n /** Root dir for relative-path computation (set by the first walkDir call) */\n private _rootDir: string | null = null;\n /** Cached tree summary captured during the shared walk */\n private walkSummary = new Map<string, TreeCount>();\n /** Fast lookup for exact filename (e.g. package.json) */\n private fileNameIndex = new Map<string, Map<string, string[]>>();\n /** Per-file byte size keyed by absolute path (memoised so nested projects don't re-stat) */\n private sizeCache = new Map<string, Promise<number>>();\n /** Concurrency limiter for size stats */\n private sizeSem = new Semaphore(64);\n\n /** Set exclude patterns from config (call once before the walk) */\n setExcludePatterns(patterns: string[]): void {\n this.excludePredicate = compileGlobs(patterns);\n }\n\n /** Set the maximum file size in bytes that readTextFile / readJsonFile will process */\n setMaxFileSize(bytes: number): void {\n this._maxFileSize = bytes;\n }\n\n /** Set the per-project scan timeout (milliseconds). Scanners use this\n * instead of a hard-coded constant so the user can override it via config. */\n setProjectScanTimeout(ms: number): void {\n this._projectScanTimeout = ms;\n }\n\n /** Current per-project scan timeout in milliseconds */\n get projectScanTimeout(): number {\n return this._projectScanTimeout;\n }\n\n /** Record a path that timed out or was stuck during scanning */\n addStuckPath(relPath: string): void {\n this._stuckPaths.push(relPath);\n }\n\n /**\n * Returns true the first time it is called, false thereafter.\n * Used by scanners to print the \"increase projectScanTimeout\" hint\n * only once per scan run.\n */\n shouldShowTimeoutHint(): boolean {\n if (this._timeoutHintShown) return false;\n this._timeoutHintShown = true;\n return true;\n }\n\n /** Get all paths that were auto-skipped due to being stuck (dirs + scanner files) */\n get stuckPaths(): readonly string[] {\n return this._stuckPaths;\n }\n\n /** @deprecated Use stuckPaths instead */\n get stuckDirs(): readonly string[] {\n return this._stuckPaths;\n }\n\n /** Get files that were skipped because they exceeded maxFileSizeToScan */\n get skippedLargeFiles(): readonly string[] {\n return this._skippedLargeFiles;\n }\n\n // ── Directory walking ──\n\n /**\n * Walk the directory tree from `rootDir` once, skipping SKIP_DIRS plus\n * common framework output dirs (.nuxt, .output, .svelte-kit).\n *\n * The result is memoised so every scanner filters the same array.\n * Consumers that need additional filtering (e.g. SOURCE_EXTENSIONS,\n * SKIP_EXTENSIONS) do so on the returned entries — no separate walk.\n */\n walkDir(rootDir: string, onProgress?: (filesFound: number, currentPath: string) => void): Promise<DirEntry[]> {\n this._rootDir = rootDir;\n const cached = this.walkCache.get(rootDir);\n if (cached) return cached;\n\n const promise = this._doWalk(rootDir, onProgress);\n this.walkCache.set(rootDir, promise);\n return promise;\n }\n\n /** Return tree summary from the cached walk, if available. */\n getWalkSummary(rootDir: string): TreeCount | undefined {\n return this.walkSummary.get(rootDir);\n }\n\n /** Additional dirs skipped only by the cached walk (framework outputs) */\n private static readonly EXTRA_SKIP = EXTRA_SKIP_DIRS;\n\n private async _doWalk(rootDir: string, onProgress?: (filesFound: number, currentPath: string) => void): Promise<DirEntry[]> {\n const results: DirEntry[] = [];\n const cores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length || 4;\n const maxConcurrentReads = Math.max(8, Math.min(64, cores * 4));\n let foundCount = 0;\n let lastReported = 0;\n const REPORT_INTERVAL = 50; // report every N files\n // Semaphore limits concurrent readdir I/O only — NOT the entire\n // recursive walk. Previously sem.run wrapped the whole walk(),\n // so parent directories held a slot while awaiting children,\n // starving deep trees into near-serial execution.\n const sem = new Semaphore(maxConcurrentReads);\n const STUCK_TIMEOUT_MS = this._projectScanTimeout;\n\n const extraSkip = FileCache.EXTRA_SKIP;\n const isExcluded = this.excludePredicate;\n const stuckDirs = this._stuckPaths;\n\n async function walk(dir: string, gitignoreLevels: GitignoreLevel[]) {\n const relDir = path.relative(rootDir, dir);\n\n // Report the directory we are ABOUT to read so the UI shows\n // where we are if this readdir gets stuck.\n if (onProgress) {\n onProgress(foundCount, relDir || '.');\n }\n\n // Extend the .gitignore chain with this directory's own file (if any)\n // BEFORE reading entries, so its rules apply to its own children —\n // matching git's precedence (deepest applicable .gitignore wins).\n const levels = await extendGitignoreLevels(dir, gitignoreLevels);\n\n // Acquire the semaphore ONLY for the readdir I/O, then release\n // immediately so parent dirs don't hold slots while awaiting children.\n let entries: Dirent[] | null;\n try {\n entries = await sem.run(async () => {\n const readPromise = fs.readdir(dir, { withFileTypes: true });\n let stuckTimer: ReturnType<typeof setTimeout>;\n const result = await Promise.race([\n readPromise.then((e) => ({ ok: true as const, entries: e })),\n new Promise<{ ok: false }>((resolve) => {\n stuckTimer = setTimeout(() => resolve({ ok: false }), STUCK_TIMEOUT_MS);\n stuckTimer.unref();\n }),\n ]);\n clearTimeout(stuckTimer!);\n if (!result.ok) {\n // Directory read timed out — record and skip\n stuckDirs.push(relDir || dir);\n return null;\n }\n return result.entries;\n });\n } catch {\n return;\n }\n if (!entries) return;\n\n const subWalks: Promise<void>[] = [];\n for (const e of entries) {\n const absPath = path.join(dir, e.name);\n const relPath = path.relative(rootDir, absPath);\n\n // Check user-configured excludes\n if (isExcluded && isExcluded(relPath)) continue;\n\n if (e.isDirectory()) {\n if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;\n // Respect .gitignore (root + any nested ones seen so far) so\n // repo-specific, non-canonically-named build/dependency/cache dirs\n // (e.g. a custom-named virtualenv) don't get walked just because\n // they aren't on the hardcoded SKIP_DIRS list.\n if (isGitignored(levels, absPath, true)) continue;\n results.push({ absPath, relPath, name: e.name, isFile: false, isDirectory: true });\n // Launch sub-walk WITHOUT wrapping in sem.run — child walks\n // acquire the semaphore independently for their own readdir.\n subWalks.push(walk(absPath, levels));\n } else if (e.isFile()) {\n // Skip binary/font/media files that no scanner needs\n const ext = path.extname(e.name).toLowerCase();\n if (SKIP_EXTENSIONS.has(ext)) continue;\n if (isGitignored(levels, absPath, false)) continue;\n results.push({ absPath, relPath, name: e.name, isFile: true, isDirectory: false });\n foundCount++;\n if (onProgress && foundCount - lastReported >= REPORT_INTERVAL) {\n lastReported = foundCount;\n onProgress(foundCount, relPath);\n }\n }\n }\n await Promise.all(subWalks);\n }\n\n await walk(rootDir, []);\n\n let totalDirs = 0;\n const rootNameIndex = new Map<string, string[]>();\n for (const entry of results) {\n if (entry.isDirectory) totalDirs++;\n if (!entry.isFile) continue;\n const bucket = rootNameIndex.get(entry.name);\n if (bucket) {\n bucket.push(entry.absPath);\n } else {\n rootNameIndex.set(entry.name, [entry.absPath]);\n }\n }\n this.walkSummary.set(rootDir, { totalFiles: foundCount, totalDirs });\n this.fileNameIndex.set(rootDir, rootNameIndex);\n\n // Final progress report\n if (onProgress && foundCount !== lastReported) {\n onProgress(foundCount, '');\n }\n return results;\n }\n\n /**\n * Find files matching a predicate from the cached walk.\n * Returns absolute paths (same contract as the standalone `findFiles`).\n */\n async findFiles(rootDir: string, predicate: (name: string) => boolean): Promise<string[]> {\n const entries = await this.walkDir(rootDir);\n return entries.filter((e) => e.isFile && predicate(e.name)).map((e) => e.absPath);\n }\n\n async findPackageJsonFiles(rootDir: string): Promise<string[]> {\n await this.walkDir(rootDir);\n return this.fileNameIndex.get(rootDir)?.get('package.json') ?? [];\n }\n\n async findCsprojFiles(rootDir: string): Promise<string[]> {\n const entries = await this.walkDir(rootDir);\n return entries.filter((e) => e.isFile && e.name.endsWith('.csproj')).map((e) => e.absPath);\n }\n\n async findSolutionFiles(rootDir: string): Promise<string[]> {\n const entries = await this.walkDir(rootDir);\n return entries.filter((e) => e.isFile && e.name.endsWith('.sln')).map((e) => e.absPath);\n }\n\n /**\n * Count files under a given directory using the cached walk data.\n * Avoids a redundant recursive readdir that can be slow on large\n * project trees (the main cause of per-project timeout hits).\n * Falls back to the standalone `countFilesInDir` if the walk hasn't\n * been populated yet.\n */\n async countFilesUnder(rootDir: string, dir: string): Promise<number> {\n const entries = this.walkCache.get(rootDir);\n if (!entries) {\n // Walk not done yet — fall back to standalone count\n return countFilesInDir(dir);\n }\n const resolved = await entries;\n const prefix = dir.endsWith(path.sep) ? dir : dir + path.sep;\n let count = 0;\n for (const e of resolved) {\n if (!e.isFile) continue;\n // File is directly in `dir` or in a subdirectory of `dir`\n if (e.absPath === dir || e.absPath.startsWith(prefix)) {\n count++;\n }\n }\n return count;\n }\n\n /** Stat a single file's byte size, memoised and concurrency-limited. */\n private statSize(absPath: string): Promise<number> {\n const cached = this.sizeCache.get(absPath);\n if (cached) return cached;\n const promise = this.sizeSem.run(async () => {\n try {\n const stat = await fs.stat(absPath);\n return stat.size;\n } catch {\n return 0;\n }\n });\n this.sizeCache.set(absPath, promise);\n return promise;\n }\n\n /**\n * Sum the byte size of every file under `dir` using the cached walk.\n * Mirrors {@link countFilesUnder}; per-file stats are memoised so nested\n * project trees are never stat-ed twice. Falls back to a standalone walk\n * when the cache has not been populated yet.\n */\n async bytesUnder(rootDir: string, dir: string): Promise<number> {\n const entries = this.walkCache.get(rootDir);\n if (!entries) {\n // Walk not done yet — fall back to a standalone size walk\n return bytesInDir(dir);\n }\n const resolved = await entries;\n const prefix = dir.endsWith(path.sep) ? dir : dir + path.sep;\n const sizes = await Promise.all(\n resolved\n .filter((e) => e.isFile && (e.absPath === dir || e.absPath.startsWith(prefix)))\n .map((e) => this.statSize(e.absPath)),\n );\n return sizes.reduce((total, size) => total + size, 0);\n }\n\n /**\n * Source-only file count and byte size under `dir`, used for billing\n * classification. Identical to {@link countFilesUnder} / {@link bytesUnder}\n * but additionally excludes lockfiles and generated dependency manifests\n * (see {@link SOURCE_EXCLUDE_FILES}); vendored and build-output directories\n * are already excluded by the shared walk. Walks the cached entries once so\n * the count and size stay consistent. Falls back to the standalone walks\n * when the cache has not been populated yet.\n */\n async sourceMetricsUnder(rootDir: string, dir: string): Promise<{ fileCount: number; sizeBytes: number }> {\n const entries = this.walkCache.get(rootDir);\n if (!entries) {\n // Walk not done yet — fall back to standalone walks.\n const [fileCount, sizeBytes] = await Promise.all([countFilesInDir(dir), bytesInDir(dir)]);\n return { fileCount, sizeBytes };\n }\n const resolved = await entries;\n const prefix = dir.endsWith(path.sep) ? dir : dir + path.sep;\n const sourceFiles = resolved.filter(\n (e) =>\n e.isFile &&\n (e.absPath === dir || e.absPath.startsWith(prefix)) &&\n !SOURCE_EXCLUDE_FILES.has(e.name.toLowerCase()),\n );\n const sizes = await Promise.all(sourceFiles.map((e) => this.statSize(e.absPath)));\n return {\n fileCount: sourceFiles.length,\n sizeBytes: sizes.reduce((total, size) => total + size, 0),\n };\n }\n\n // ── File content reading ──\n\n /**\n * Read a text file. Files ≤ 1 MB are cached so subsequent calls from\n * different scanners return the same string. Files > 1 MB (lockfiles,\n * large generated files) are read directly and never retained.\n *\n * If maxFileSizeToScan is set and the file exceeds it, the file is\n * recorded as skipped and an empty string is returned.\n */\n readTextFile(filePath: string): Promise<string> {\n const abs = path.resolve(filePath);\n const cached = this.textCache.get(abs);\n if (cached) return cached;\n\n const maxSize = this._maxFileSize;\n const skippedLarge = this._skippedLargeFiles;\n const rootDir = this._rootDir;\n\n // Read file, then decide whether to cache based on size\n const promise = (async () => {\n // Check file size before reading when a limit is configured\n if (maxSize > 0) {\n try {\n const stat = await fs.stat(abs);\n if (stat.size > maxSize) {\n const rel = rootDir ? path.relative(rootDir, abs) : abs;\n skippedLarge.push(rel);\n this.textCache.delete(abs);\n return '';\n }\n } catch {\n // If stat fails, fall through and let readFile handle it\n }\n }\n\n const content = await fs.readFile(abs, 'utf8');\n if (content.length > TEXT_CACHE_MAX_BYTES) {\n // Too large for cache — evict so we don't hold it\n this.textCache.delete(abs);\n }\n return content;\n })();\n\n // Temporarily store the promise so concurrent callers during the same\n // tick await the same read (avoids double-reads even for large files).\n this.textCache.set(abs, promise);\n return promise;\n }\n\n /**\n * Read and parse a JSON file. The parsed object is cached; the raw\n * text is evicted immediately so we never hold both representations.\n */\n readJsonFile<T>(filePath: string): Promise<T> {\n const abs = path.resolve(filePath);\n const cached = this.jsonCache.get(abs);\n if (cached) return cached as Promise<T>;\n\n const promise = this.readTextFile(abs).then((txt) => {\n // Evict raw text — we now have the parsed object\n this.textCache.delete(abs);\n return JSON.parse(stripBom(txt)) as T;\n });\n this.jsonCache.set(abs, promise);\n return promise;\n }\n\n // ── Existence checks ──\n\n pathExists(p: string): Promise<boolean> {\n const abs = path.resolve(p);\n const cached = this.existsCache.get(abs);\n if (cached) return cached;\n const promise = fs.access(abs).then(() => true, () => false);\n this.existsCache.set(abs, promise);\n return promise;\n }\n\n // ── Lifecycle ──\n\n /** Release all cached data. Call after the scan completes. */\n clear(): void {\n this.walkCache.clear();\n this.walkSummary.clear();\n this.fileNameIndex.clear();\n this.textCache.clear();\n this.jsonCache.clear();\n this.existsCache.clear();\n this.sizeCache.clear();\n }\n\n /** Number of file content entries currently held */\n get textCacheSize(): number { return this.textCache.size; }\n /** Number of parsed JSON entries currently held */\n get jsonCacheSize(): number { return this.jsonCache.size; }\n}\n\n// ── Quick tree count (fast pre-scan) ──\n\nexport interface TreeCount {\n /** Total files discovered (excluding skipped dirs) */\n totalFiles: number;\n /** Total subdirectories discovered (excluding skipped dirs) */\n totalDirs: number;\n}\n\n/**\n * Fast, lightweight traversal that only *counts* files and directories\n * without storing entries. Used before the main scan so the progress\n * bar can show an accurate percentage.\n *\n * Respects the same SKIP_DIRS as the full walk.\n */\nexport async function quickTreeCount(rootDir: string, excludePatterns?: string[]): Promise<TreeCount> {\n const native = await quickTreeCountWithRipgrep(rootDir, excludePatterns);\n if (native) return native;\n\n let totalFiles = 0;\n let totalDirs = 0;\n const cores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length || 4;\n const maxConcurrent = Math.max(8, Math.min(128, cores * 8));\n const sem = new Semaphore(maxConcurrent);\n const extraSkip = EXTRA_SKIP_DIRS;\n const isExcluded = excludePatterns ? compileGlobs(excludePatterns) : null;\n\n async function count(dir: string, gitignoreLevels: GitignoreLevel[]) {\n let entries: Dirent[];\n try {\n entries = await sem.run(() => fs.readdir(dir, { withFileTypes: true }));\n } catch {\n return;\n }\n const levels = await extendGitignoreLevels(dir, gitignoreLevels);\n const subs: Promise<void>[] = [];\n for (const e of entries) {\n const absPath = path.join(dir, e.name);\n const relPath = path.relative(rootDir, absPath);\n if (isExcluded && isExcluded(relPath)) continue;\n\n if (e.isDirectory()) {\n if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;\n if (isGitignored(levels, absPath, true)) continue;\n totalDirs++;\n subs.push(count(absPath, levels));\n } else if (e.isFile()) {\n const ext = path.extname(e.name).toLowerCase();\n if (SKIP_EXTENSIONS.has(ext)) continue;\n if (isGitignored(levels, absPath, false)) continue;\n totalFiles++;\n }\n }\n await Promise.all(subs);\n }\n\n await count(rootDir, []);\n return { totalFiles, totalDirs };\n}\n\n\n\nexport function normalizeGlobForRipgrep(pattern: string): string {\n return pattern.replace(/\\\\/g, '/');\n}\n\nasync function quickTreeCountWithRipgrep(rootDir: string, excludePatterns?: string[]): Promise<TreeCount | null> {\n // `--hidden` includes dotfiles/dot-dirs (ripgrep skips them by default);\n // deliberately NOT passing `--no-ignore` here so ripgrep applies its own\n // (correct, battle-tested) .gitignore handling — root, nested, and global\n // excludes — the same way `git status` would. This must stay in sync with\n // the manual .gitignore handling in the JS walk fallback (`_doWalk`,\n // `quickTreeCount`'s `count()`) below, which exists only for machines\n // without `rg` on PATH.\n const args = ['--files', '--hidden', '--null'];\n\n for (const dir of SKIP_DIRS) {\n args.push('-g', `!**/${dir}/**`);\n }\n for (const dir of EXTRA_SKIP_DIRS) {\n args.push('-g', `!**/${dir}/**`);\n }\n for (const ext of SKIP_EXTENSIONS) {\n args.push('-g', `!**/*${ext}`);\n }\n for (const pattern of (excludePatterns ?? [])) {\n const trimmed = pattern.trim();\n if (!trimmed) continue;\n args.push('-g', `!${normalizeGlobForRipgrep(trimmed)}`);\n }\n\n try {\n const { stdout } = await execFileAsync('rg', args, { cwd: rootDir, maxBuffer: 64 * 1024 * 1024, encoding: 'utf8' });\n if (!stdout) return { totalFiles: 0, totalDirs: 0 };\n\n const files = stdout.split('\\0').filter(Boolean);\n const dirs = new Set<string>();\n for (const file of files) {\n const dir = path.dirname(file);\n if (dir && dir !== '.') dirs.add(dir);\n }\n\n return { totalFiles: files.length, totalDirs: dirs.size };\n } catch {\n return null;\n }\n}\n\n/**\n * Count the number of source files in a directory (non-recursive by default).\n * For project-level file counting, skips binary/media files.\n */\nexport async function countFilesInDir(dir: string, recursive = true): Promise<number> {\n let count = 0;\n const extraSkip = new Set(['obj', 'bin', 'Debug', 'Release', 'TestResults']);\n\n async function walk(currentDir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n const subs: Promise<void>[] = [];\n for (const e of entries) {\n if (e.isDirectory()) {\n if (!recursive) continue;\n if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;\n subs.push(walk(path.join(currentDir, e.name)));\n } else if (e.isFile()) {\n const ext = path.extname(e.name).toLowerCase();\n if (!SKIP_EXTENSIONS.has(ext)) count++;\n }\n }\n await Promise.all(subs);\n }\n\n await walk(dir);\n return count;\n}\n\n/**\n * Sum the byte size of all source files in a directory (recursive),\n * skipping common build/output dirs and binary/media files. Standalone\n * fallback for {@link FileCache.bytesUnder} when the cached walk is cold.\n */\nexport async function bytesInDir(dir: string, recursive = true): Promise<number> {\n let bytes = 0;\n const extraSkip = new Set(['obj', 'bin', 'Debug', 'Release', 'TestResults']);\n\n async function walk(currentDir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n const subs: Promise<void>[] = [];\n for (const e of entries) {\n if (e.isDirectory()) {\n if (!recursive) continue;\n if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;\n subs.push(walk(path.join(currentDir, e.name)));\n } else if (e.isFile()) {\n const ext = path.extname(e.name).toLowerCase();\n if (SKIP_EXTENSIONS.has(ext)) continue;\n try {\n const stat = await fs.stat(path.join(currentDir, e.name));\n bytes += stat.size;\n } catch {\n // ignore unreadable files\n }\n }\n }\n await Promise.all(subs);\n }\n\n await walk(dir);\n return bytes;\n}\n\n/** Recursively find files matching a predicate, skipping common build/output dirs */\nexport async function findFiles(\n rootDir: string,\n predicate: (name: string) => boolean,\n): Promise<string[]> {\n const results: string[] = [];\n const cores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length || 4;\n const maxConcurrentReads = Math.max(8, Math.min(64, cores * 4));\n const readDirSemaphore = new Semaphore(maxConcurrentReads);\n\n async function walk(dir: string) {\n let entries: Dirent[];\n try {\n entries = await readDirSemaphore.run(() => fs.readdir(dir, { withFileTypes: true }));\n } catch {\n return;\n }\n\n const subDirectoryWalks: Promise<void>[] = [];\n\n for (const e of entries) {\n if (e.isDirectory()) {\n if (isSkippedDirName(e.name)) continue;\n subDirectoryWalks.push(walk(path.join(dir, e.name)));\n } else if (e.isFile() && predicate(e.name)) {\n const ext = path.extname(e.name).toLowerCase();\n if (!SKIP_EXTENSIONS.has(ext)) results.push(path.join(dir, e.name));\n }\n }\n\n await Promise.all(subDirectoryWalks);\n }\n\n await walk(rootDir);\n return results;\n}\n\nexport async function findPackageJsonFiles(rootDir: string): Promise<string[]> {\n return findFiles(rootDir, (name) => name === 'package.json');\n}\n\nexport async function findSolutionFiles(rootDir: string): Promise<string[]> {\n return findFiles(rootDir, (name) => name.endsWith('.sln'));\n}\n\nexport async function findCsprojFiles(rootDir: string): Promise<string[]> {\n return findFiles(rootDir, (name) => name.endsWith('.csproj'));\n}\n\n/**\n * Strip a UTF-8 byte-order mark — editors on Windows commonly save\n * manifests with a BOM, and JSON.parse rejects it, which silently\n * dropped the project from scan results.\n */\nexport function stripBom(text: string): string {\n return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const txt = await fs.readFile(filePath, 'utf8');\n return JSON.parse(stripBom(txt)) as T;\n}\n\nexport async function readTextFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf8');\n}\n\nexport async function pathExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\nexport async function writeJsonFile(filePath: string, data: unknown): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf8');\n}\n\nexport async function writeTextFile(filePath: string, content: string): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf8');\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { runCoreScan, compactUiPurpose } from './chunk-
|
|
1
|
+
import { runCoreScan, compactUiPurpose } from './chunk-XRN7DQGR.js';
|
|
2
2
|
import { writeJsonFile } from './chunk-CRAMOEBE.js';
|
|
3
|
-
import { findPackageJsonFiles, readJsonFile, findFiles, readTextFile, pathExists } from './chunk-
|
|
3
|
+
import { findPackageJsonFiles, readJsonFile, findFiles, readTextFile, pathExists } from './chunk-DT4KIVRI.js';
|
|
4
4
|
import * as path3 from 'path';
|
|
5
5
|
import { Command } from 'commander';
|
|
6
6
|
import chalk from 'chalk';
|
|
@@ -4373,5 +4373,5 @@ var baselineCommand = new Command("baseline").description("Create a drift baseli
|
|
|
4373
4373
|
});
|
|
4374
4374
|
|
|
4375
4375
|
export { baselineCommand, loadAdvancedScanHook, runBaseline };
|
|
4376
|
-
//# sourceMappingURL=chunk-
|
|
4377
|
-
//# sourceMappingURL=chunk-
|
|
4376
|
+
//# sourceMappingURL=chunk-FF5ZQ6KI.js.map
|
|
4377
|
+
//# sourceMappingURL=chunk-FF5ZQ6KI.js.map
|