@vibgrate/cli 2026.722.1 → 2026.727.1
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/DOCS.md +418 -196
- package/README.md +34 -7
- package/dist/baseline-K7YBFKZI.js +7 -0
- package/dist/{baseline-J44M7MWP.js.map → baseline-K7YBFKZI.js.map} +1 -1
- package/dist/chunk-3BVSDMHV.js +2496 -0
- package/dist/chunk-3BVSDMHV.js.map +1 -0
- package/dist/{chunk-PY3DNX5H.js → chunk-3Q7QBWFW.js} +13 -2
- package/dist/chunk-3Q7QBWFW.js.map +1 -0
- package/dist/chunk-4CQ3MGNN.js +136 -0
- package/dist/chunk-4CQ3MGNN.js.map +1 -0
- package/dist/chunk-5I4VSBWQ.js +764 -0
- package/dist/chunk-5I4VSBWQ.js.map +1 -0
- package/dist/chunk-5Q54GEHM.js +29 -0
- package/dist/chunk-5Q54GEHM.js.map +1 -0
- package/dist/{chunk-XKXKWYJF.js → chunk-65MEOA4E.js} +21 -18
- package/dist/chunk-65MEOA4E.js.map +1 -0
- package/dist/{chunk-WNIIKCNF.js → chunk-6IOQJGFT.js} +29 -238
- package/dist/chunk-6IOQJGFT.js.map +1 -0
- package/dist/{chunk-CS37OBE3.js → chunk-7JHPQ6WF.js} +791 -783
- package/dist/chunk-7JHPQ6WF.js.map +1 -0
- package/dist/chunk-BPF3YX2U.js +64 -0
- package/dist/chunk-BPF3YX2U.js.map +1 -0
- package/dist/chunk-BWPBB45M.js +88 -0
- package/dist/chunk-BWPBB45M.js.map +1 -0
- package/dist/chunk-C4CKTAZP.js +1695 -0
- package/dist/chunk-C4CKTAZP.js.map +1 -0
- package/dist/chunk-EDAAG7BL.js +612 -0
- package/dist/chunk-EDAAG7BL.js.map +1 -0
- package/dist/chunk-EDBV33B7.js +57 -0
- package/dist/chunk-EDBV33B7.js.map +1 -0
- package/dist/chunk-HABUT7HW.js +233 -0
- package/dist/chunk-HABUT7HW.js.map +1 -0
- package/dist/{chunk-EXQV26MF.js → chunk-HYZVHJ3Q.js} +3 -3
- package/dist/{chunk-EXQV26MF.js.map → chunk-HYZVHJ3Q.js.map} +1 -1
- package/dist/chunk-IS7VTH2Q.js +627 -0
- package/dist/chunk-IS7VTH2Q.js.map +1 -0
- package/dist/chunk-IZDH67DX.js +289 -0
- package/dist/chunk-IZDH67DX.js.map +1 -0
- package/dist/chunk-J7LKEB2R.js +51 -0
- package/dist/chunk-J7LKEB2R.js.map +1 -0
- package/dist/chunk-JIBOJTGS.js +313 -0
- package/dist/chunk-JIBOJTGS.js.map +1 -0
- package/dist/chunk-JZYGEZTU.js +82 -0
- package/dist/chunk-JZYGEZTU.js.map +1 -0
- package/dist/chunk-K7REHDQS.js +776 -0
- package/dist/chunk-K7REHDQS.js.map +1 -0
- package/dist/chunk-KHJO4D5N.js +108 -0
- package/dist/chunk-KHJO4D5N.js.map +1 -0
- package/dist/chunk-NDMDSPFX.js +69 -0
- package/dist/chunk-NDMDSPFX.js.map +1 -0
- package/dist/chunk-OOIG3RUM.js +276 -0
- package/dist/chunk-OOIG3RUM.js.map +1 -0
- package/dist/{chunk-6CXTPC74.js → chunk-OXQNQW5J.js} +27 -6
- package/dist/chunk-OXQNQW5J.js.map +1 -0
- package/dist/chunk-PMYWZRRS.js +62 -0
- package/dist/chunk-PMYWZRRS.js.map +1 -0
- package/dist/chunk-PXHNTC6D.js +382 -0
- package/dist/chunk-PXHNTC6D.js.map +1 -0
- package/dist/{chunk-VXT6LUGP.js → chunk-S6CYDZEW.js} +1395 -1975
- package/dist/chunk-S6CYDZEW.js.map +1 -0
- package/dist/chunk-SZLF66FJ.js +843 -0
- package/dist/chunk-SZLF66FJ.js.map +1 -0
- package/dist/chunk-VXGV6NTD.js +476 -0
- package/dist/chunk-VXGV6NTD.js.map +1 -0
- package/dist/{chunk-JSNHZCIV.js → chunk-WLETRGAC.js} +16 -9
- package/dist/chunk-WLETRGAC.js.map +1 -0
- package/dist/{chunk-2EVQKZTO.js → chunk-YDAT7LD2.js} +190 -13
- package/dist/chunk-YDAT7LD2.js.map +1 -0
- package/dist/cli.js +3451 -509
- package/dist/cli.js.map +1 -1
- package/dist/execution-env-3BN7Z737.js +3 -0
- package/dist/execution-env-3BN7Z737.js.map +1 -0
- package/dist/federation-EPZDUWCK.js +6 -0
- package/dist/federation-EPZDUWCK.js.map +1 -0
- package/dist/git-ref-HPRLUFFW.js +3 -0
- package/dist/git-ref-HPRLUFFW.js.map +1 -0
- package/dist/graph-backend-ZMSYOZMW.js +10 -0
- package/dist/graph-backend-ZMSYOZMW.js.map +1 -0
- package/dist/index.d.ts +432 -126
- package/dist/index.js +14 -7
- package/dist/index.js.map +1 -1
- package/dist/{interactive-736PBC7J.js → interactive-ICL7D7LO.js} +185 -365
- package/dist/interactive-ICL7D7LO.js.map +1 -0
- package/dist/llm-host-2RAYQSDQ.js +8 -0
- package/dist/llm-host-2RAYQSDQ.js.map +1 -0
- package/dist/load-OHVKDX4R.js +7 -0
- package/dist/load-OHVKDX4R.js.map +1 -0
- package/dist/local-runtime-OJFLX2HI.js +4 -0
- package/dist/local-runtime-OJFLX2HI.js.map +1 -0
- package/dist/model-execution-profile-MQ2QCP24.js +3 -0
- package/dist/model-execution-profile-MQ2QCP24.js.map +1 -0
- package/dist/model-orchestrator-FFTZI3U2.js +8 -0
- package/dist/model-orchestrator-FFTZI3U2.js.map +1 -0
- package/dist/parse-worker.d.ts +1 -1
- package/dist/parse-worker.js +1 -1
- package/dist/paths-MCH75O3G.js +5 -0
- package/dist/paths-MCH75O3G.js.map +1 -0
- package/dist/resolve-gguf-4UPIGPEE.js +7 -0
- package/dist/resolve-gguf-4UPIGPEE.js.map +1 -0
- package/dist/runtime-session-IDU5BDUJ.js +17 -0
- package/dist/runtime-session-IDU5BDUJ.js.map +1 -0
- package/dist/session-L2OSDRPI.js +10 -0
- package/dist/{session-POJUDFPH.js.map → session-L2OSDRPI.js.map} +1 -1
- package/dist/{stream-json-Q2JGWPHB.js → stream-json-F74W5FCK.js} +16 -6
- package/dist/stream-json-F74W5FCK.js.map +1 -0
- package/dist/{types-Jl6RJ175.d.ts → types-ZMg1mSuu.d.ts} +3 -1
- package/dist/vgd-EGBQD7BW.js +16 -0
- package/dist/vgd-EGBQD7BW.js.map +1 -0
- package/package.json +9 -6
- package/dist/baseline-J44M7MWP.js +0 -7
- package/dist/chunk-2EVQKZTO.js.map +0 -1
- package/dist/chunk-6CXTPC74.js.map +0 -1
- package/dist/chunk-CS37OBE3.js.map +0 -1
- package/dist/chunk-GGJZA3Q6.js +0 -961
- package/dist/chunk-GGJZA3Q6.js.map +0 -1
- package/dist/chunk-JBXNQCGE.js +0 -484
- package/dist/chunk-JBXNQCGE.js.map +0 -1
- package/dist/chunk-JSNHZCIV.js.map +0 -1
- package/dist/chunk-PY3DNX5H.js.map +0 -1
- package/dist/chunk-VXT6LUGP.js.map +0 -1
- package/dist/chunk-WNIIKCNF.js.map +0 -1
- package/dist/chunk-XKXKWYJF.js.map +0 -1
- package/dist/interactive-736PBC7J.js.map +0 -1
- package/dist/session-POJUDFPH.js +0 -6
- package/dist/stream-json-Q2JGWPHB.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/workspace-roots.ts","../src/runtime/bridge-edges.ts","../src/runtime/interface-bridges.ts","../src/runtime/discover-workspaces.ts","../src/runtime/federation.ts"],"names":["path","path2","fs","path3","path4","abs","nodeFs"],"mappings":"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","file":"chunk-5I4VSBWQ.js","sourcesContent":["/**\n * Pure workspace-roots helpers (Fusion Runtime / federation).\n *\n * Stream S owns the long-term pure library design; this module is the F-side\n * implementation used by federation + vgd until S lands a shared package.\n * No daemon I/O — path math only.\n *\n * @see docs/plans/coordination/FUSION-HANDOFF.md\n * @see src/runtime/federation.ts\n */\n\nimport * as path from 'node:path';\nimport { repositoryIdFromRoot } from '../runtime/paths.js';\n\nexport interface WorkspaceRoot {\n /** Absolute normalized path */\n root: string;\n /** Stable id (same as global store repository id) */\n id: string;\n /** Basename label */\n label: string;\n}\n\n/**\n * Normalize a list of roots (absolute or relative to `base`) into unique\n * WorkspaceRoot records. Deterministic order: sorted by absolute root path.\n */\nexport function normalizeWorkspaceRoots(roots: string[], base: string = process.cwd()): WorkspaceRoot[] {\n const seen = new Set<string>();\n const out: WorkspaceRoot[] = [];\n const baseAbs = path.resolve(base);\n for (const r of roots) {\n if (typeof r !== 'string' || !r.trim()) continue;\n const abs = path.resolve(baseAbs, r.trim());\n const id = repositoryIdFromRoot(abs);\n if (seen.has(id)) continue;\n seen.add(id);\n out.push({\n root: abs,\n id,\n label: path.basename(abs) || abs,\n });\n }\n return out.sort((a, b) => a.root.localeCompare(b.root));\n}\n\n/** True if `child` is equal to or nested under `parent` (path-safe). */\nexport function isPathInside(child: string, parent: string): boolean {\n const rel = path.relative(path.resolve(parent), path.resolve(child));\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n}\n\n/**\n * Pick the primary root: explicit `preferred` if present in the set, else the\n * first after sort (deterministic).\n */\nexport function selectPrimaryRoot(roots: WorkspaceRoot[], preferred?: string): WorkspaceRoot | null {\n if (!roots.length) return null;\n if (preferred?.trim()) {\n const abs = path.resolve(preferred.trim());\n const hit = roots.find((r) => r.root === abs || r.id === repositoryIdFromRoot(abs));\n if (hit) return hit;\n }\n return roots[0] ?? null;\n}\n","/**\n * Cross-workspace bridge edges (Fusion Runtime Phase 6).\n *\n * schemaVersion: bridge-edge/0\n *\n * Conservative edges between federation members when one package.json\n * depends on another member's package name (workspace:*, link:, file:, or\n * exact version). Low-confidence edges are marked so high-stakes capsules\n * can exclude them. Pure over injected package.json readers.\n */\n\nimport * as path from 'node:path';\nimport { repositoryIdFromRoot } from './paths.js';\n\nexport const BRIDGE_EDGE_SCHEMA_VERSION = 'bridge-edge/0' as const;\n\nexport type BridgeKind =\n | 'workspace-package'\n | 'path-dependency'\n | 'git-submodule'\n | 'openapi-ref'\n | 'compose-service'\n | 'protobuf-import'\n | 'graphql-ref';\n\nexport interface BridgeEdge {\n schemaVersion: typeof BRIDGE_EDGE_SCHEMA_VERSION;\n fromRepositoryId: string;\n toRepositoryId: string;\n fromRoot: string;\n toRoot: string;\n kind: BridgeKind;\n /** 0..1 — workspace:* is high; bare version match is medium. */\n confidence: number;\n /** Short, secret-free evidence string for transparency UIs. */\n evidence: string;\n packageName?: string;\n}\n\nexport interface BridgeMember {\n root: string;\n repositoryId?: string;\n}\n\nexport interface PackageManifest {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\n/**\n * Build bridge edges among `members` by reading each member's package.json.\n * Deterministic: sorted by (fromRoot, toRoot, packageName).\n */\nexport function discoverBridgeEdges(\n members: BridgeMember[],\n readPackageJson: (root: string) => PackageManifest | null,\n options: { minConfidence?: number } = {},\n): BridgeEdge[] {\n const min = options.minConfidence ?? 0;\n const packages = new Map<string, { root: string; repositoryId: string; name: string }>();\n\n for (const m of members) {\n const root = path.resolve(m.root);\n const pkg = readPackageJson(root);\n const name = typeof pkg?.name === 'string' ? pkg.name.trim() : '';\n if (!name) continue;\n const repositoryId = m.repositoryId ?? repositoryIdFromRoot(root);\n packages.set(name, { root, repositoryId, name });\n }\n\n const edges: BridgeEdge[] = [];\n const seen = new Set<string>();\n\n for (const m of members) {\n const fromRoot = path.resolve(m.root);\n const fromId = m.repositoryId ?? repositoryIdFromRoot(fromRoot);\n const pkg = readPackageJson(fromRoot);\n if (!pkg) continue;\n\n const deps = collectDeps(pkg);\n for (const [depName, range] of deps) {\n const target = packages.get(depName);\n if (!target) continue;\n if (target.root === fromRoot) continue;\n\n const { kind, confidence } = classifyDependency(range, fromRoot, target.root);\n if (confidence < min) continue;\n\n const key = `${fromId}->${target.repositoryId}:${depName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n edges.push({\n schemaVersion: BRIDGE_EDGE_SCHEMA_VERSION,\n fromRepositoryId: fromId,\n toRepositoryId: target.repositoryId,\n fromRoot,\n toRoot: target.root,\n kind,\n confidence,\n evidence: `${path.basename(fromRoot)} depends on ${depName} (${range})`,\n packageName: depName,\n });\n }\n }\n\n return edges.sort(\n (a, b) =>\n a.fromRoot.localeCompare(b.fromRoot) ||\n a.toRoot.localeCompare(b.toRoot) ||\n (a.packageName ?? '').localeCompare(b.packageName ?? ''),\n );\n}\n\n/** High-confidence bridges only (workspace:/link:/file: or confidence ≥ 0.8). */\nexport function highConfidenceBridges(edges: BridgeEdge[]): BridgeEdge[] {\n return edges.filter((e) => e.confidence >= 0.8);\n}\n\nfunction collectDeps(pkg: PackageManifest): Array<[string, string]> {\n const out: Array<[string, string]> = [];\n for (const field of ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies'] as const) {\n const block = pkg[field];\n if (!block || typeof block !== 'object') continue;\n for (const [name, range] of Object.entries(block)) {\n if (typeof name === 'string' && typeof range === 'string') out.push([name, range]);\n }\n }\n // Stable order for determinism.\n return out.sort((a, b) => a[0].localeCompare(b[0]) || a[1].localeCompare(b[1]));\n}\n\nfunction classifyDependency(\n range: string,\n fromRoot: string,\n toRoot: string,\n): { kind: BridgeKind; confidence: number } {\n const r = range.trim();\n if (r.startsWith('workspace:') || r.startsWith('link:')) {\n return { kind: 'workspace-package', confidence: 0.95 };\n }\n if (r.startsWith('file:')) {\n // Confirm the file: path resolves under the target when possible.\n const rel = r.slice('file:'.length).trim();\n try {\n const resolved = path.resolve(fromRoot, rel);\n if (path.resolve(resolved) === path.resolve(toRoot)) {\n return { kind: 'path-dependency', confidence: 0.9 };\n }\n } catch {\n /* ignore */\n }\n return { kind: 'path-dependency', confidence: 0.75 };\n }\n // Same monorepo package name without workspace protocol — medium confidence.\n return { kind: 'workspace-package', confidence: 0.55 };\n}\n\n/** Parse package.json text into a manifest (or null). */\nexport function parsePackageManifest(raw: string): PackageManifest | null {\n try {\n const o = JSON.parse(raw) as PackageManifest;\n if (!o || typeof o !== 'object') return null;\n return o;\n } catch {\n return null;\n }\n}\n","/**\n * Interface / service bridge edges (Fusion Runtime Phase 6).\n *\n * Conservative cross-member links from OpenAPI `$ref` paths, Docker Compose\n * `build` contexts, protobuf `import` statements, and GraphQL schema\n * `#import` / path references. Pure over injected file readers — no network.\n * Confidence stays modest so high-stakes capsules can filter via\n * high-confidence package edges.\n */\n\nimport * as path from 'node:path';\nimport {\n BRIDGE_EDGE_SCHEMA_VERSION,\n type BridgeEdge,\n type BridgeMember,\n} from './bridge-edges.js';\nimport { repositoryIdFromRoot } from './paths.js';\n\nexport type InterfaceBridgeKind =\n | 'openapi-ref'\n | 'compose-service'\n | 'protobuf-import'\n | 'graphql-ref';\n\nexport interface InterfaceBridgeFs {\n /** Read UTF-8 text or null if missing. */\n readFile(absPath: string): string | null;\n /** List file basenames under a directory (non-recursive). */\n readdir(absPath: string): string[];\n /** True when path is a directory. */\n isDirectory(absPath: string): boolean;\n}\n\n/**\n * Discover OpenAPI / Compose / protobuf / GraphQL bridges among federation members.\n * Deterministic sort: fromRoot, toRoot, kind, evidence.\n */\nexport function discoverInterfaceBridges(\n members: BridgeMember[],\n fs: InterfaceBridgeFs,\n options: { minConfidence?: number; maxFilesPerMember?: number } = {},\n): BridgeEdge[] {\n const min = options.minConfidence ?? 0;\n const maxFiles = options.maxFilesPerMember ?? 40;\n const resolved = members.map((m) => ({\n root: path.resolve(m.root),\n repositoryId: m.repositoryId ?? repositoryIdFromRoot(m.root),\n }));\n\n const edges: BridgeEdge[] = [];\n const seen = new Set<string>();\n\n const push = (edge: BridgeEdge): void => {\n if (edge.confidence < min) return;\n if (edge.fromRoot === edge.toRoot) return;\n const key = `${edge.fromRepositoryId}->${edge.toRepositoryId}:${edge.kind}:${edge.evidence}`;\n if (seen.has(key)) return;\n seen.add(key);\n edges.push(edge);\n };\n\n for (const from of resolved) {\n const files = listCandidateFiles(from.root, fs, maxFiles);\n for (const file of files) {\n const rel = path.relative(from.root, file).replace(/\\\\/g, '/');\n const raw = fs.readFile(file);\n if (!raw) continue;\n\n if (isOpenApiCandidate(rel, raw)) {\n for (const refPath of extractOpenApiRefs(raw)) {\n const target = resolvePathToMember(from.root, refPath, resolved);\n if (!target || target.root === from.root) continue;\n push({\n schemaVersion: BRIDGE_EDGE_SCHEMA_VERSION,\n fromRepositoryId: from.repositoryId,\n toRepositoryId: target.repositoryId,\n fromRoot: from.root,\n toRoot: target.root,\n kind: 'openapi-ref',\n confidence: 0.7,\n evidence: `openapi $ref in ${rel} → ${refPath}`,\n });\n }\n }\n\n if (isComposeCandidate(rel)) {\n for (const ctx of extractComposeBuildContexts(raw)) {\n const target = resolvePathToMember(from.root, ctx, resolved);\n if (!target || target.root === from.root) continue;\n push({\n schemaVersion: BRIDGE_EDGE_SCHEMA_VERSION,\n fromRepositoryId: from.repositoryId,\n toRepositoryId: target.repositoryId,\n fromRoot: from.root,\n toRoot: target.root,\n kind: 'compose-service',\n confidence: 0.75,\n evidence: `compose build context in ${rel} → ${ctx}`,\n });\n }\n }\n\n if (isProtoCandidate(rel)) {\n for (const imp of extractProtoImports(raw)) {\n const target = resolveProtoImportToMember(from.root, imp, resolved, fs);\n if (!target || target.root === from.root) continue;\n push({\n schemaVersion: BRIDGE_EDGE_SCHEMA_VERSION,\n fromRepositoryId: from.repositoryId,\n toRepositoryId: target.repositoryId,\n fromRoot: from.root,\n toRoot: target.root,\n kind: 'protobuf-import',\n confidence: 0.72,\n evidence: `protobuf import in ${rel} → ${imp}`,\n });\n }\n }\n\n if (isGraphqlCandidate(rel, raw)) {\n for (const refPath of extractGraphqlRefs(raw)) {\n const target = resolvePathToMember(from.root, refPath, resolved);\n if (!target || target.root === from.root) continue;\n push({\n schemaVersion: BRIDGE_EDGE_SCHEMA_VERSION,\n fromRepositoryId: from.repositoryId,\n toRepositoryId: target.repositoryId,\n fromRoot: from.root,\n toRoot: target.root,\n kind: 'graphql-ref',\n confidence: 0.68,\n evidence: `graphql import in ${rel} → ${refPath}`,\n });\n }\n }\n }\n }\n\n return edges.sort(\n (a, b) =>\n a.fromRoot.localeCompare(b.fromRoot) ||\n a.toRoot.localeCompare(b.toRoot) ||\n a.kind.localeCompare(b.kind) ||\n a.evidence.localeCompare(b.evidence),\n );\n}\n\n// ── file discovery ─────────────────────────────────────────────────────────\n\nfunction listCandidateFiles(root: string, fs: InterfaceBridgeFs, maxFiles: number): string[] {\n const out: string[] = [];\n const walk = (dir: string, depth: number): void => {\n if (out.length >= maxFiles || depth > 4) return;\n let names: string[];\n try {\n names = fs.readdir(dir);\n } catch {\n return;\n }\n for (const name of names.sort((a, b) => a.localeCompare(b))) {\n if (out.length >= maxFiles) return;\n if (\n name === 'node_modules' ||\n name === '.git' ||\n name === 'dist' ||\n name === 'build' ||\n name === 'coverage' ||\n name === '.next'\n ) {\n continue;\n }\n const abs = path.join(dir, name);\n if (fs.isDirectory(abs)) {\n walk(abs, depth + 1);\n continue;\n }\n const lower = name.toLowerCase();\n if (\n lower.endsWith('.proto') ||\n lower.endsWith('.graphql') ||\n lower.endsWith('.gql') ||\n lower.endsWith('.yaml') ||\n lower.endsWith('.yml') ||\n lower.endsWith('.json') ||\n lower.includes('openapi') ||\n lower.includes('swagger') ||\n lower.includes('compose')\n ) {\n out.push(abs);\n }\n }\n };\n walk(root, 0);\n return out.sort((a, b) => a.localeCompare(b));\n}\n\n// ── OpenAPI ────────────────────────────────────────────────────────────────\n\nfunction isOpenApiCandidate(rel: string, raw: string): boolean {\n const lower = rel.toLowerCase();\n if (lower.includes('openapi') || lower.includes('swagger')) return true;\n if (/\"openapi\"\\s*:/.test(raw) || /openapi:\\s*['\"]?\\d/.test(raw)) return true;\n if (/\"swagger\"\\s*:/.test(raw) || /swagger:\\s*['\"]?\\d/.test(raw)) return true;\n return false;\n}\n\n/** Extract relative $ref / $refs that look like file paths (not #/components). */\nexport function extractOpenApiRefs(raw: string): string[] {\n const out = new Set<string>();\n // JSON: \"$ref\": \"../other/foo.yaml\"\n const jsonRef = /\"\\$ref\"\\s*:\\s*\"([^\"#][^\"]*)\"/g;\n let m: RegExpExecArray | null;\n while ((m = jsonRef.exec(raw)) !== null) {\n if (m[1] && !m[1].startsWith('http')) out.add(m[1]);\n }\n // YAML: $ref: ../other/foo.yaml or $ref: '../other/foo.yaml'\n const yamlRef = /\\$ref:\\s*['\"]?([^'\"#\\s][^'\"\\s]*)/g;\n while ((m = yamlRef.exec(raw)) !== null) {\n if (m[1] && !m[1].startsWith('http') && !m[1].startsWith('#')) out.add(m[1]);\n }\n return [...out].sort((a, b) => a.localeCompare(b));\n}\n\n// ── Compose ────────────────────────────────────────────────────────────────\n\nfunction isComposeCandidate(rel: string): boolean {\n const base = path.basename(rel).toLowerCase();\n return (\n base === 'docker-compose.yml' ||\n base === 'docker-compose.yaml' ||\n base === 'compose.yml' ||\n base === 'compose.yaml' ||\n base.includes('docker-compose')\n );\n}\n\n/**\n * Pull `build: <path>` and `build:\\n context: <path>` from compose-ish YAML.\n * Minimal parser — no full YAML dependency.\n */\nexport function extractComposeBuildContexts(raw: string): string[] {\n const out = new Set<string>();\n const lines = raw.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n // build: ./services/api\n const simple = line.match(/^\\s*build:\\s*['\"]?([^'\"#\\s][^'\"#]*?)['\"]?\\s*(?:#.*)?$/);\n if (simple?.[1] && !simple[1].startsWith('{') && !/^\\s*$/.test(simple[1])) {\n const v = simple[1].trim();\n if (v && v !== 'null' && !v.includes(':')) out.add(v);\n continue;\n }\n // build:\n // context: ../lib\n if (/^\\s*build:\\s*$/.test(line) || /^\\s*build:\\s*\\{\\s*$/.test(line)) {\n for (let j = i + 1; j < Math.min(i + 8, lines.length); j++) {\n const ctx = (lines[j] ?? '').match(/^\\s*context:\\s*['\"]?([^'\"#\\s][^'\"#]*?)['\"]?\\s*(?:#.*)?$/);\n if (ctx?.[1]) {\n out.add(ctx[1].trim());\n break;\n }\n // left the build block\n if (/^\\S/.test(lines[j] ?? '') || /^\\s{0,2}\\w/.test(lines[j] ?? '')) {\n // allow nested keys with more indent\n if ((lines[j] ?? '').match(/^\\s{0,2}\\S/) && !(lines[j] ?? '').match(/^\\s{4,}/)) break;\n }\n }\n }\n }\n return [...out].sort((a, b) => a.localeCompare(b));\n}\n\n// ── Protobuf ───────────────────────────────────────────────────────────────\n\nfunction isProtoCandidate(rel: string): boolean {\n return rel.toLowerCase().endsWith('.proto');\n}\n\n// ── GraphQL ────────────────────────────────────────────────────────────────\n\nfunction isGraphqlCandidate(rel: string, raw: string): boolean {\n const lower = rel.toLowerCase();\n if (lower.endsWith('.graphql') || lower.endsWith('.gql')) return true;\n if (lower.includes('schema') && /#\\s*import\\b/.test(raw)) return true;\n return false;\n}\n\n/**\n * GraphQL import forms: `#import \"./user.graphql\"`, `#import * from \"../shared/x.graphql\"`.\n */\nexport function extractGraphqlRefs(raw: string): string[] {\n const out = new Set<string>();\n const re = /#\\s*import\\s+(?:\\*\\s+from\\s+)?[\"']([^\"']+)[\"']/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(raw)) !== null) {\n if (m[1] && !m[1].startsWith('http')) out.add(m[1]);\n }\n return [...out].sort((a, b) => a.localeCompare(b));\n}\n\n/** `import \"foo/bar.proto\";` and `import public \"…\"`. */\nexport function extractProtoImports(raw: string): string[] {\n const out = new Set<string>();\n const re = /^\\s*import\\s+(?:public\\s+|weak\\s+)?[\"']([^\"']+)[\"']\\s*;/gm;\n let m: RegExpExecArray | null;\n while ((m = re.exec(raw)) !== null) {\n if (m[1] && !m[1].startsWith('google/protobuf/')) out.add(m[1]);\n }\n return [...out].sort((a, b) => a.localeCompare(b));\n}\n\n// ── path → member ──────────────────────────────────────────────────────────\n\nfunction resolvePathToMember(\n fromRoot: string,\n relOrAbs: string,\n members: Array<{ root: string; repositoryId: string }>,\n): { root: string; repositoryId: string } | null {\n let abs: string;\n try {\n abs = path.isAbsolute(relOrAbs) ? path.resolve(relOrAbs) : path.resolve(fromRoot, relOrAbs);\n } catch {\n return null;\n }\n // Prefer the most specific (longest) member root containing the path.\n let best: { root: string; repositoryId: string } | null = null;\n for (const m of members) {\n if (abs === m.root || abs.startsWith(m.root + path.sep)) {\n if (!best || m.root.length > best.root.length) best = m;\n }\n }\n return best;\n}\n\nfunction resolveProtoImportToMember(\n fromRoot: string,\n importPath: string,\n members: Array<{ root: string; repositoryId: string }>,\n fs: InterfaceBridgeFs,\n): { root: string; repositoryId: string } | null {\n // Try relative to the importing package, then each member root as include path.\n const candidates = [\n path.resolve(fromRoot, importPath),\n ...members.map((m) => path.resolve(m.root, importPath)),\n ];\n for (const abs of candidates) {\n const hit = resolvePathToMember(fromRoot, abs, members);\n if (!hit) continue;\n // Prefer hits where the file exists under another member.\n if (fs.readFile(abs) !== null || pathIsUnder(abs, hit.root)) {\n if (hit.root !== path.resolve(fromRoot)) return hit;\n }\n }\n // Soft match: import path prefix equals a member basename (e.g. services/api/…)\n const parts = importPath.replace(/\\\\/g, '/').split('/');\n if (parts.length >= 2) {\n const prefix = parts[0]!;\n for (const m of members) {\n if (path.basename(m.root) === prefix && m.root !== path.resolve(fromRoot)) return m;\n }\n }\n return null;\n}\n\nfunction pathIsUnder(child: string, parent: string): boolean {\n const rel = path.relative(path.resolve(parent), path.resolve(child));\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n}\n","/**\n * Automatic workspace discovery (Fusion Runtime Phase 6).\n *\n * Finds additional package roots under a primary project without inventing\n * product names — package.json workspaces, pnpm-workspace.yaml, git\n * submodules, and VS Code `.code-workspace` folders. Pure over an injected\n * filesystem so unit tests never touch the real disk layout of the monorepo.\n *\n * Conservative: only returns paths that look like package roots (have\n * package.json or are listed explicitly). No network.\n */\n\nimport * as nodeFs from 'node:fs';\nimport * as path from 'node:path';\nimport { normalizeWorkspaceRoots, type WorkspaceRoot } from '../engine/workspace-roots.js';\n\nexport const DISCOVER_WORKSPACES_VERSION = 'discover-workspaces/0' as const;\n\nexport interface DiscoverFs {\n readFile(absPath: string): string | null;\n /** Directory entries (names only). Missing dir → []. */\n readdir(absPath: string): string[];\n isDirectory(absPath: string): boolean;\n exists(absPath: string): boolean;\n}\n\nexport type DiscoverSource =\n | 'package-workspaces'\n | 'pnpm-workspace'\n | 'git-submodule'\n | 'code-workspace'\n | 'explicit';\n\nexport interface DiscoveredRoot {\n root: string;\n label: string;\n source: DiscoverSource;\n}\n\nexport interface DiscoverWorkspacesResult {\n schemaVersion: typeof DISCOVER_WORKSPACES_VERSION;\n primaryRoot: string;\n /** Unique absolute roots including the primary. Sorted by path. */\n roots: DiscoveredRoot[];\n}\n\n/**\n * Discover workspace package roots under `primaryRoot`. Always includes the\n * primary itself as `source: 'explicit'`.\n */\nexport function discoverWorkspaceRoots(\n primaryRoot: string,\n fs: DiscoverFs,\n options: { maxDepth?: number; maxRoots?: number } = {},\n): DiscoverWorkspacesResult {\n const primary = path.resolve(primaryRoot);\n const maxDepth = options.maxDepth ?? 4;\n const maxRoots = options.maxRoots ?? 64;\n const byRoot = new Map<string, DiscoveredRoot>();\n\n const add = (abs: string, source: DiscoverSource, label?: string): void => {\n const root = path.resolve(abs);\n if (byRoot.has(root)) {\n // Prefer a more specific source label if we already have explicit.\n return;\n }\n if (byRoot.size >= maxRoots) return;\n byRoot.set(root, {\n root,\n label: label ?? (path.basename(root) || root),\n source,\n });\n };\n\n add(primary, 'explicit', path.basename(primary) || primary);\n\n // package.json \"workspaces\"\n for (const dir of expandPackageWorkspaces(primary, fs, maxDepth)) {\n add(dir, 'package-workspaces');\n }\n\n // pnpm-workspace.yaml\n for (const dir of expandPnpmWorkspace(primary, fs, maxDepth)) {\n add(dir, 'pnpm-workspace');\n }\n\n // .gitmodules\n for (const dir of expandGitSubmodules(primary, fs)) {\n add(dir, 'git-submodule');\n }\n\n // *.code-workspace next to primary or inside it\n for (const dir of expandCodeWorkspace(primary, fs)) {\n add(dir, 'code-workspace');\n }\n\n const roots = [...byRoot.values()].sort((a, b) => a.root.localeCompare(b.root));\n return {\n schemaVersion: DISCOVER_WORKSPACES_VERSION,\n primaryRoot: primary,\n roots,\n };\n}\n\n/** Convert discovery result into normalizeWorkspaceRoots-compatible paths. */\nexport function discoveredToWorkspaceRoots(result: DiscoverWorkspacesResult): WorkspaceRoot[] {\n return normalizeWorkspaceRoots(\n result.roots.map((r) => r.root),\n result.primaryRoot,\n );\n}\n\n// ── expanders ──────────────────────────────────────────────────────────────\n\nfunction expandPackageWorkspaces(primary: string, fs: DiscoverFs, maxDepth: number): string[] {\n const pkgPath = path.join(primary, 'package.json');\n const raw = fs.readFile(pkgPath);\n if (!raw) return [];\n let pkg: { workspaces?: unknown };\n try {\n pkg = JSON.parse(raw) as { workspaces?: unknown };\n } catch {\n return [];\n }\n const patterns = workspacePatterns(pkg.workspaces);\n return expandGlobPatterns(primary, patterns, fs, maxDepth);\n}\n\nfunction workspacePatterns(workspaces: unknown): string[] {\n if (Array.isArray(workspaces)) {\n return workspaces.filter((p): p is string => typeof p === 'string' && p.trim().length > 0);\n }\n if (workspaces && typeof workspaces === 'object' && Array.isArray((workspaces as { packages?: unknown }).packages)) {\n return ((workspaces as { packages: unknown[] }).packages).filter(\n (p): p is string => typeof p === 'string' && p.trim().length > 0,\n );\n }\n return [];\n}\n\nfunction expandPnpmWorkspace(primary: string, fs: DiscoverFs, maxDepth: number): string[] {\n const raw = fs.readFile(path.join(primary, 'pnpm-workspace.yaml'));\n if (!raw) return [];\n const patterns: string[] = [];\n // Minimal YAML: lines under `packages:` that look like ` - 'packages/*'`\n let inPackages = false;\n for (const line of raw.split(/\\r?\\n/)) {\n if (/^packages\\s*:/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n if (/^\\S/.test(line) && !/^\\s/.test(line)) break; // next top-level key\n const m = line.match(/^\\s*-\\s*['\"]?([^'\"]+)['\"]?\\s*$/);\n if (m?.[1]) patterns.push(m[1].trim());\n }\n }\n return expandGlobPatterns(primary, patterns, fs, maxDepth);\n}\n\nfunction expandGitSubmodules(primary: string, fs: DiscoverFs): string[] {\n const raw = fs.readFile(path.join(primary, '.gitmodules'));\n if (!raw) return [];\n const out: string[] = [];\n for (const line of raw.split(/\\r?\\n/)) {\n const m = line.match(/^\\s*path\\s*=\\s*(.+)\\s*$/);\n if (!m?.[1]) continue;\n const abs = path.resolve(primary, m[1].trim());\n if (fs.exists(abs) && fs.isDirectory(abs)) out.push(abs);\n }\n return out.sort((a, b) => a.localeCompare(b));\n}\n\nfunction expandCodeWorkspace(primary: string, fs: DiscoverFs): string[] {\n const out: string[] = [];\n const candidates = [\n ...fs.readdir(primary).filter((n) => n.endsWith('.code-workspace')).map((n) => path.join(primary, n)),\n ];\n // Also accept a single workspace file named after the folder.\n for (const file of candidates) {\n const raw = fs.readFile(file);\n if (!raw) continue;\n let doc: { folders?: Array<{ path?: string; name?: string }> };\n try {\n doc = JSON.parse(raw) as { folders?: Array<{ path?: string; name?: string }> };\n } catch {\n continue;\n }\n const base = path.dirname(file);\n for (const folder of doc.folders ?? []) {\n if (typeof folder.path !== 'string' || !folder.path.trim()) continue;\n const abs = path.resolve(base, folder.path.trim());\n if (fs.exists(abs) && fs.isDirectory(abs)) out.push(abs);\n }\n }\n return out.sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Expand simple workspace globs (star segments, double-star walk, or exact\n * relative paths). No full micromatch — keep deterministic and dependency-free.\n */\nfunction expandGlobPatterns(\n primary: string,\n patterns: string[],\n fs: DiscoverFs,\n maxDepth: number,\n): string[] {\n const out = new Set<string>();\n for (const pattern of patterns) {\n const p = pattern.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n if (!p || p.startsWith('..')) continue; // never climb out via pattern\n if (p.includes('*')) {\n for (const hit of expandSimpleGlob(primary, p, fs, maxDepth)) {\n if (looksLikePackageRoot(hit, fs)) out.add(hit);\n }\n } else {\n const abs = path.resolve(primary, p);\n if (fs.exists(abs) && fs.isDirectory(abs) && looksLikePackageRoot(abs, fs)) out.add(abs);\n }\n }\n return [...out].sort((a, b) => a.localeCompare(b));\n}\n\nfunction expandSimpleGlob(primary: string, pattern: string, fs: DiscoverFs, maxDepth: number): string[] {\n // Support: packages/*, packages/*/*, apps/**\n const parts = pattern.split('/').filter(Boolean);\n let currents = [primary];\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n const next: string[] = [];\n const isLast = i === parts.length - 1;\n for (const cur of currents) {\n if (part === '**') {\n // One-level recursive: all dirs up to maxDepth from cur.\n for (const d of walkDirs(cur, fs, Math.min(maxDepth, 3))) next.push(d);\n continue;\n }\n if (part === '*') {\n for (const name of fs.readdir(cur)) {\n const abs = path.join(cur, name);\n if (fs.isDirectory(abs)) next.push(abs);\n }\n continue;\n }\n const abs = path.join(cur, part);\n if (fs.exists(abs) && (isLast ? fs.isDirectory(abs) || fs.exists(abs) : fs.isDirectory(abs))) {\n next.push(abs);\n }\n }\n currents = next;\n if (!currents.length) break;\n }\n return currents.filter((d) => fs.isDirectory(d));\n}\n\nfunction walkDirs(root: string, fs: DiscoverFs, depth: number): string[] {\n if (depth <= 0) return [];\n const out: string[] = [];\n for (const name of fs.readdir(root)) {\n if (name === 'node_modules' || name === '.git' || name === 'dist' || name === 'build') continue;\n const abs = path.join(root, name);\n if (!fs.isDirectory(abs)) continue;\n out.push(abs);\n out.push(...walkDirs(abs, fs, depth - 1));\n }\n return out;\n}\n\nfunction looksLikePackageRoot(dir: string, fs: DiscoverFs): boolean {\n return fs.exists(path.join(dir, 'package.json'));\n}\n\n/** Node fs adapter for production callers. */\nexport function nodeDiscoverFs(): DiscoverFs {\n return {\n readFile(absPath) {\n try {\n return nodeFs.readFileSync(absPath, 'utf8');\n } catch {\n return null;\n }\n },\n readdir(absPath) {\n try {\n return nodeFs.readdirSync(absPath).sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n },\n isDirectory(absPath) {\n try {\n return nodeFs.statSync(absPath).isDirectory();\n } catch {\n return false;\n }\n },\n exists(absPath) {\n try {\n return nodeFs.existsSync(absPath);\n } catch {\n return false;\n }\n },\n };\n}\n","/**\n * Federated workspaces (Fusion Runtime Phase 6 foundation).\n *\n * A federation is a primary repository plus zero or more member roots that\n * share a local vgd session. Layout is declared in `.vibgrate/federation.json`\n * so multi-repo monorepos and sibling packages can register together without\n * inventing product names. When no file exists, {@link loadOrDiscoverFederation}\n * auto-discovers package workspaces / pnpm / submodules / `.code-workspace`\n * and attaches conservative package-dependency bridge edges.\n *\n * Schema: federation/0\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { repositoryIdFromRoot, globalGraphPath, globalGraphPathForRef } from './paths.js';\nimport { detectGitRef } from './git-ref.js';\nimport { normalizeWorkspaceRoots } from '../engine/workspace-roots.js';\nimport {\n discoverBridgeEdges,\n highConfidenceBridges,\n parsePackageManifest,\n type BridgeEdge,\n} from './bridge-edges.js';\nimport { discoverInterfaceBridges } from './interface-bridges.js';\nimport { discoverWorkspaceRoots, nodeDiscoverFs, type DiscoverFs } from './discover-workspaces.js';\n\nexport const FEDERATION_SCHEMA_VERSION = 'federation/0' as const;\n\nexport type FederationMemberRole = 'primary' | 'member';\n\nexport interface FederationMember {\n /** Absolute root path. */\n root: string;\n /** Optional human label (folder name by default). */\n label: string;\n role: FederationMemberRole;\n repositoryId: string;\n graphPath: string;\n}\n\nexport interface FederatedWorkspace {\n schemaVersion: typeof FEDERATION_SCHEMA_VERSION;\n /** Absolute path of the primary root (where the federation file lives). */\n primaryRoot: string;\n members: FederationMember[];\n /**\n * Cross-member package dependency bridges (optional). High-stakes capsules\n * should prefer {@link highConfidenceBridges} only.\n */\n bridges?: BridgeEdge[];\n}\n\nexport interface FederationFile {\n schemaVersion?: string;\n members?: Array<{ root?: string; label?: string; role?: string }>;\n bridges?: BridgeEdge[];\n}\n\n/**\n * Load `.vibgrate/federation.json` under `primaryRoot`, or synthesize a\n * single-member federation for the primary alone.\n */\nexport function loadFederation(primaryRoot: string, options: { requireFile?: boolean } = {}): FederatedWorkspace | null {\n const primary = path.resolve(primaryRoot);\n const file = federationPath(primary);\n if (!fs.existsSync(file)) {\n if (options.requireFile) return null;\n return singleMemberFederation(primary);\n }\n let raw: FederationFile;\n try {\n raw = JSON.parse(fs.readFileSync(file, 'utf8')) as FederationFile;\n } catch {\n return null;\n }\n return parseFederationFile(primary, raw);\n}\n\n/**\n * Load federation.json when present; otherwise auto-discover workspace package\n * roots and package-dependency bridges. Prefer this for host UIs / `vg code`\n * session start so monorepos work without a hand-written federation file.\n */\nexport function loadOrDiscoverFederation(\n primaryRoot: string,\n options: { discoverFs?: DiscoverFs; minBridgeConfidence?: number } = {},\n): FederatedWorkspace {\n const primary = path.resolve(primaryRoot);\n const existing = loadFederation(primary, { requireFile: true });\n if (existing) {\n // File wins for membership; still compute bridges if absent.\n if (!existing.bridges?.length) {\n existing.bridges = bridgesForMembers(existing.members, options.minBridgeConfidence);\n }\n return existing;\n }\n\n const dfs = options.discoverFs ?? nodeDiscoverFs();\n const discovered = discoverWorkspaceRoots(primary, dfs);\n const roots = discovered.roots.map((r) => r.root);\n const fed = federationFromWorkspaceRoots(roots, { preferredPrimary: primary });\n fed.bridges = bridgesForMembers(fed.members, options.minBridgeConfidence);\n return fed;\n}\n\nfunction bridgesForMembers(members: FederationMember[], minConfidence = 0.5): BridgeEdge[] {\n const memberRefs = members.map((m) => ({ root: m.root, repositoryId: m.repositoryId }));\n const pkgEdges = discoverBridgeEdges(\n memberRefs,\n (root) => {\n try {\n const raw = fs.readFileSync(path.join(root, 'package.json'), 'utf8');\n return parsePackageManifest(raw);\n } catch {\n return null;\n }\n },\n { minConfidence },\n );\n const ifaceEdges = discoverInterfaceBridges(\n memberRefs,\n {\n readFile(absPath) {\n try {\n return fs.readFileSync(absPath, 'utf8');\n } catch {\n return null;\n }\n },\n readdir(absPath) {\n try {\n return fs.readdirSync(absPath).sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n },\n isDirectory(absPath) {\n try {\n return fs.statSync(absPath).isDirectory();\n } catch {\n return false;\n }\n },\n },\n { minConfidence },\n );\n // Merge package + interface bridges; stable unique by from/to/kind/evidence.\n const seen = new Set<string>();\n const out: BridgeEdge[] = [];\n for (const e of [...pkgEdges, ...ifaceEdges].sort(\n (a, b) =>\n a.fromRoot.localeCompare(b.fromRoot) ||\n a.toRoot.localeCompare(b.toRoot) ||\n a.kind.localeCompare(b.kind) ||\n a.evidence.localeCompare(b.evidence),\n )) {\n const key = `${e.fromRepositoryId}|${e.toRepositoryId}|${e.kind}|${e.evidence}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(e);\n }\n return out;\n}\n\nexport { highConfidenceBridges, type BridgeEdge };\n\nexport function federationPath(primaryRoot: string): string {\n return path.join(path.resolve(primaryRoot), '.vibgrate', 'federation.json');\n}\n\nexport function singleMemberFederation(primaryRoot: string): FederatedWorkspace {\n const primary = path.resolve(primaryRoot);\n const [ws] = normalizeWorkspaceRoots([primary], primary);\n return {\n schemaVersion: FEDERATION_SCHEMA_VERSION,\n primaryRoot: primary,\n members: [\n memberFromRoot(ws?.root ?? primary, 'primary', ws?.label ?? (path.basename(primary) || primary)),\n ],\n };\n}\n\nexport function parseFederationFile(primaryRoot: string, raw: FederationFile): FederatedWorkspace | null {\n const primary = path.resolve(primaryRoot);\n if (!raw || typeof raw !== 'object') return null;\n const list = Array.isArray(raw.members) ? raw.members : [];\n if (!list.length) return singleMemberFederation(primary);\n\n const members: FederationMember[] = [];\n const seen = new Set<string>();\n let hasPrimary = false;\n\n for (const entry of list) {\n if (!entry || typeof entry.root !== 'string' || !entry.root.trim()) continue;\n const abs = path.resolve(primary, entry.root.trim());\n const id = repositoryIdFromRoot(abs);\n if (seen.has(id)) continue;\n seen.add(id);\n const role: FederationMemberRole = entry.role === 'primary' || abs === primary ? 'primary' : 'member';\n if (role === 'primary') hasPrimary = true;\n members.push(memberFromRoot(abs, role, typeof entry.label === 'string' && entry.label.trim() ? entry.label.trim() : path.basename(abs) || abs));\n }\n\n if (!members.length) return singleMemberFederation(primary);\n if (!hasPrimary) {\n // Ensure the primary root is present and marked primary.\n const id = repositoryIdFromRoot(primary);\n if (!seen.has(id)) {\n members.unshift(memberFromRoot(primary, 'primary', path.basename(primary) || primary));\n } else {\n const existing = members.find((m) => m.repositoryId === id);\n if (existing) existing.role = 'primary';\n }\n }\n\n members.sort((a, b) => {\n if (a.role !== b.role) return a.role === 'primary' ? -1 : 1;\n return a.root.localeCompare(b.root);\n });\n\n const fed: FederatedWorkspace = {\n schemaVersion: FEDERATION_SCHEMA_VERSION,\n primaryRoot: primary,\n members,\n };\n if (Array.isArray(raw.bridges) && raw.bridges.length) {\n fed.bridges = raw.bridges\n .filter((b) => b && typeof b === 'object' && typeof b.fromRoot === 'string' && typeof b.toRoot === 'string')\n .map((b) => ({\n ...b,\n fromRoot: path.resolve(primary, b.fromRoot),\n toRoot: path.resolve(primary, b.toRoot),\n }));\n }\n return fed;\n}\n\nfunction memberFromRoot(root: string, role: FederationMemberRole, label: string): FederationMember {\n const git = detectGitRef(root);\n const graphPath = git.kind !== 'none' && git.ref ? globalGraphPathForRef(root, git.ref) : globalGraphPath(root);\n return {\n root,\n label,\n role,\n repositoryId: repositoryIdFromRoot(root),\n graphPath,\n };\n}\n\n/**\n * Build a federation from an explicit list of workspace folder paths (e.g. VS\n * Code multi-root `workspaceFolders`). First root (or `preferredPrimary`) is\n * primary; remaining roots are members. Pure over path math + git-ref detect.\n */\nexport function federationFromWorkspaceRoots(\n roots: string[],\n options: { preferredPrimary?: string } = {},\n): FederatedWorkspace {\n const normalized = normalizeWorkspaceRoots(roots, options.preferredPrimary ?? roots[0] ?? process.cwd());\n if (!normalized.length) {\n const fallback = path.resolve(options.preferredPrimary ?? process.cwd());\n return singleMemberFederation(fallback);\n }\n const preferred = options.preferredPrimary?.trim()\n ? path.resolve(options.preferredPrimary.trim())\n : normalized[0]!.root;\n const primaryHit =\n normalized.find((r) => r.root === preferred) ??\n normalized.find((r) => r.id === repositoryIdFromRoot(preferred)) ??\n normalized[0]!;\n const primaryRoot = primaryHit.root;\n const members: FederationMember[] = normalized.map((ws) =>\n memberFromRoot(ws.root, ws.root === primaryRoot ? 'primary' : 'member', ws.label),\n );\n members.sort((a, b) => {\n if (a.role !== b.role) return a.role === 'primary' ? -1 : 1;\n return a.root.localeCompare(b.root);\n });\n return {\n schemaVersion: FEDERATION_SCHEMA_VERSION,\n primaryRoot,\n members,\n };\n}\n\n/**\n * Persist a federation under `primaryRoot/.vibgrate/federation.json`.\n * Returns the absolute path written. Creates `.vibgrate/` as needed.\n */\nexport function writeFederationFile(primaryRoot: string, federation: FederatedWorkspace): string {\n const primary = path.resolve(primaryRoot);\n const file = federationPath(primary);\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const body: FederationFile = {\n schemaVersion: FEDERATION_SCHEMA_VERSION,\n members: federation.members.map((m) => ({\n // Prefer path relative to primary when possible so the file is portable.\n root: path.relative(primary, m.root) || '.',\n label: m.label,\n role: m.role,\n })),\n };\n if (federation.bridges?.length) {\n // Persist portable roots for bridges (relative to primary when possible).\n body.bridges = federation.bridges.map((b) => ({\n ...b,\n fromRoot: path.relative(primary, b.fromRoot) || '.',\n toRoot: path.relative(primary, b.toRoot) || '.',\n }));\n }\n fs.writeFileSync(file, `${JSON.stringify(body, null, 2)}\\n`, 'utf8');\n return file;\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// src/engine/serialize.ts
|
|
2
|
+
function serializeGraph(graph) {
|
|
3
|
+
return `${stableStringify(graph, 2)}
|
|
4
|
+
`;
|
|
5
|
+
}
|
|
6
|
+
function stableStringify(value, indent = 2) {
|
|
7
|
+
return JSON.stringify(sortKeys(value), null, indent);
|
|
8
|
+
}
|
|
9
|
+
function sortKeys(value) {
|
|
10
|
+
if (Array.isArray(value)) return value.map(sortKeys);
|
|
11
|
+
if (value && typeof value === "object") {
|
|
12
|
+
const input = value;
|
|
13
|
+
const out = {};
|
|
14
|
+
for (const key of Object.keys(input).sort()) {
|
|
15
|
+
const v = input[key];
|
|
16
|
+
if (v === void 0) continue;
|
|
17
|
+
out[key] = sortKeys(v);
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
function parseGraph(json) {
|
|
24
|
+
return JSON.parse(json);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { parseGraph, serializeGraph, stableStringify };
|
|
28
|
+
//# sourceMappingURL=chunk-5Q54GEHM.js.map
|
|
29
|
+
//# sourceMappingURL=chunk-5Q54GEHM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/serialize.ts"],"names":[],"mappings":";AAWO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,OAAO,CAAA,EAAG,eAAA,CAAgB,KAAA,EAAO,CAAC,CAAC;AAAA,CAAA;AACrC;AAEO,SAAS,eAAA,CAAgB,KAAA,EAAgB,MAAA,GAAS,CAAA,EAAW;AAClE,EAAA,OAAO,KAAK,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG,MAAM,MAAM,CAAA;AACrD;AAEA,SAAS,SAAS,KAAA,EAAyB;AACzC,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,QAAQ,CAAA;AACnD,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAA;AACd,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAK,EAAG;AAC3C,MAAA,MAAM,CAAA,GAAI,MAAM,GAAG,CAAA;AACnB,MAAA,IAAI,MAAM,MAAA,EAAW;AACrB,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAW,IAAA,EAAuB;AAChD,EAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AACxB","file":"chunk-5Q54GEHM.js","sourcesContent":["import type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic serialization of `graph.json`.\n *\n * Object keys are sorted recursively and arrays are emitted in the (already\n * stable) order the engine produced them, so two runs over identical content\n * yield byte-identical output — the determinism contract (VG-CLI-SPEC §1.3).\n * Pretty-printed (2-space) and newline-terminated so the committed artifact is\n * human-diffable and plays well with the union merge driver.\n */\nexport function serializeGraph(graph: VgGraph): string {\n return `${stableStringify(graph, 2)}\\n`;\n}\n\nexport function stableStringify(value: unknown, indent = 2): string {\n return JSON.stringify(sortKeys(value), null, indent);\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === 'object') {\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(input).sort()) {\n const v = input[key];\n if (v === undefined) continue; // omit undefined for stable output\n out[key] = sortKeys(v);\n }\n return out;\n }\n return value;\n}\n\nexport function parseGraph(json: string): VgGraph {\n return JSON.parse(json) as VgGraph;\n}\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { refreshIfStale, TOOLS, renderToolResult, warmEmbedderInBackground, countTokens
|
|
2
|
-
import { VERSION } from './chunk-
|
|
3
|
-
import {
|
|
1
|
+
import { refreshIfStale, TOOLS, renderToolResult, warmEmbedderInBackground, countTokens } from './chunk-S6CYDZEW.js';
|
|
2
|
+
import { VERSION } from './chunk-WLETRGAC.js';
|
|
3
|
+
import { sanitizeClient, recordSaving, SAVINGS_TOOLS, PER_FILE_TOKENS } from './chunk-EDAAG7BL.js';
|
|
4
|
+
import { renderHtml, renderReport } from './chunk-HABUT7HW.js';
|
|
5
|
+
import { parseGraph, serializeGraph } from './chunk-5Q54GEHM.js';
|
|
4
6
|
import * as fs from 'fs';
|
|
5
7
|
import * as path from 'path';
|
|
6
8
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
@@ -10,26 +12,29 @@ import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprot
|
|
|
10
12
|
var PROBE_INTERVAL_MS = 2e3;
|
|
11
13
|
var MAX_PROBE_INTERVAL_MS = 3e4;
|
|
12
14
|
var PROBE_DUTY_FACTOR = 20;
|
|
13
|
-
var REFRESH_BUDGET_MS =
|
|
15
|
+
var REFRESH_BUDGET_MS = 100;
|
|
14
16
|
var FAILURE_COOLDOWN_MS = 6e4;
|
|
15
17
|
var GraphSource = class {
|
|
16
18
|
constructor(graphPath, refresh = false, tuning = {}) {
|
|
17
19
|
this.graphPath = graphPath;
|
|
18
20
|
this.refresh = refresh;
|
|
19
21
|
this.tuning = tuning;
|
|
20
|
-
this.root = path.dirname(path.dirname(graphPath));
|
|
22
|
+
this.root = tuning.root ?? path.dirname(path.dirname(graphPath));
|
|
23
|
+
this.refreshImpl = tuning.refreshImpl ?? refreshIfStale;
|
|
21
24
|
}
|
|
22
25
|
graphPath;
|
|
23
26
|
refresh;
|
|
24
27
|
tuning;
|
|
25
28
|
cachedMtimeMs = -1;
|
|
26
29
|
cached = null;
|
|
30
|
+
/** Project root used for freshness probes and rebuilds. */
|
|
27
31
|
root;
|
|
28
32
|
lastProbeAt = 0;
|
|
29
33
|
failedUntil = 0;
|
|
30
34
|
inflight = null;
|
|
31
|
-
/** Self-tuned: grows with measured probe cost so huge repos aren't penalized. */
|
|
35
|
+
/** Self-tuned: grows with measured probe/rebuild cost so huge repos aren't penalized. */
|
|
32
36
|
probeIntervalMs = PROBE_INTERVAL_MS;
|
|
37
|
+
refreshImpl;
|
|
33
38
|
/** Current graph: auto-refreshed if the tree drifted, reloaded if the file changed. */
|
|
34
39
|
async get() {
|
|
35
40
|
if (this.refresh) await this.maybeRefresh();
|
|
@@ -50,15 +55,13 @@ var GraphSource = class {
|
|
|
50
55
|
const interval = this.tuning.probeIntervalMs ?? this.probeIntervalMs;
|
|
51
56
|
if (now < this.failedUntil || now - this.lastProbeAt < interval) return;
|
|
52
57
|
this.lastProbeAt = now;
|
|
53
|
-
this.inflight =
|
|
58
|
+
this.inflight = this.refreshImpl(this.root, { graphPath: this.graphPath }).then((r) => {
|
|
54
59
|
if (r.status === "error") this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
);
|
|
61
|
-
}
|
|
60
|
+
const cost = r.status === "refreshed" && typeof r.ms === "number" ? Math.max(r.ms, Date.now() - now) : Date.now() - now;
|
|
61
|
+
this.probeIntervalMs = Math.min(
|
|
62
|
+
MAX_PROBE_INTERVAL_MS,
|
|
63
|
+
Math.max(PROBE_INTERVAL_MS, cost * PROBE_DUTY_FACTOR)
|
|
64
|
+
);
|
|
62
65
|
}).catch(() => {
|
|
63
66
|
this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;
|
|
64
67
|
}).finally(() => {
|
|
@@ -71,7 +74,7 @@ var GraphSource = class {
|
|
|
71
74
|
function createServer(source, opts = {}) {
|
|
72
75
|
const { savings = false, shareStats = false, local = false, dedup = false, stats } = opts;
|
|
73
76
|
const record = savings || shareStats;
|
|
74
|
-
const root =
|
|
77
|
+
const root = opts.root ?? source.root;
|
|
75
78
|
const seen = /* @__PURE__ */ new Set();
|
|
76
79
|
const server = new Server(
|
|
77
80
|
{ name: "vg", version: VERSION },
|
|
@@ -127,7 +130,7 @@ function createServer(source, opts = {}) {
|
|
|
127
130
|
return server;
|
|
128
131
|
}
|
|
129
132
|
async function serveStdio(graphPath, opts = {}) {
|
|
130
|
-
const source = new GraphSource(graphPath, opts.refresh !== false);
|
|
133
|
+
const source = new GraphSource(graphPath, opts.refresh !== false, { root: opts.root });
|
|
131
134
|
const server = createServer(source, opts);
|
|
132
135
|
warmEmbedderInBackground(opts.local);
|
|
133
136
|
await server.connect(new StdioServerTransport());
|
|
@@ -413,5 +416,5 @@ function spdx(ctx) {
|
|
|
413
416
|
}
|
|
414
417
|
|
|
415
418
|
export { GraphSource, createServer, exportGraph, formatForExt, serveStdio };
|
|
416
|
-
//# sourceMappingURL=chunk-
|
|
417
|
-
//# sourceMappingURL=chunk-
|
|
419
|
+
//# sourceMappingURL=chunk-65MEOA4E.js.map
|
|
420
|
+
//# sourceMappingURL=chunk-65MEOA4E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mcp/server.ts","../src/engine/export.ts"],"names":[],"mappings":"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","file":"chunk-65MEOA4E.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { parseGraph } from '../engine/serialize.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { TOOLS, warmEmbedderInBackground } from './tools.js';\nimport { renderToolResult } from './response.js';\nimport { recordSaving, sanitizeClient, PER_FILE_TOKENS, SAVINGS_TOOLS, type Outcome } from '../engine/savings.js';\nimport type { SessionStats } from './serve-stats.js';\nimport { countTokens } from '../engine/tokens.js';\nimport { VERSION } from '../version.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * The local `vg serve` MCP server. Self-contained and offline. Freshness is\n * two-layered, with no filesystem watcher (freshness only matters at the\n * moment of a query, so we check on read instead of watching):\n *\n * 1. **Hot reload** — `graph.json` is re-read whenever its mtime changes, so a\n * rebuild from ANY source (a foreground `vg`, another serve process, CI)\n * is picked up on the next tool call.\n * 2. **Auto-refresh** (default on) — each tool call runs a debounced, stat-only\n * freshness probe against the last build's snapshot; if the working tree\n * drifted, an incremental rebuild runs in-process (cross-process locked,\n * single-flight). The call waits only a **micro-budget** so a warm probe can\n * land without stalling MCP tools — otherwise it answers from the current\n * map while the rebuild finishes for a later call (hot-reload picks it up).\n *\n * Every tool remains read-only and auto-approvable; the refresh only rewrites\n * vg's own artifacts under `.vibgrate/`, never user code.\n */\n\n/** Min gap between freshness probes — bounds stat-walk cost under bursty tool calls. */\nconst PROBE_INTERVAL_MS = 2000;\n/** Ceiling for the self-tuned probe interval on very large repos. */\nconst MAX_PROBE_INTERVAL_MS = 30_000;\n/** Probe/rebuild may consume at most ~1/PROBE_DUTY_FACTOR of serve wall-time (20 → ≤5%). */\nconst PROBE_DUTY_FACTOR = 20;\n/**\n * How long a tool call waits for an in-flight refresh before answering from\n * the current map. Kept deliberately small: MCP tool latency is sub-10ms on\n * warm maps, and a multi-second budget (the previous 5s ceiling matched\n * `git rev-parse`'s spawn timeout) turned every sequential tool call during a\n * large-repo rebuild into a multi-second stall — measured as TypeScript p50\n * ~5.2s on the release benchmark for the `vg-cli-public` corpus entry.\n * Warm probes still finish inside this window; heavy rebuilds never should.\n */\nexport const REFRESH_BUDGET_MS = 100;\n/** After a refresh failure (e.g. read-only checkout), don't retry for this long. */\nconst FAILURE_COOLDOWN_MS = 60_000;\n\nexport type RefreshImpl = typeof refreshIfStale;\n\nexport interface GraphSourceTuning {\n probeIntervalMs?: number;\n refreshBudgetMs?: number;\n /**\n * Workspace root for freshness probes. Prefer passing this explicitly —\n * deriving it from `graphPath` via `dirname` twice only works for the legacy\n * `root/.vibgrate/graph.json` layout, not the global branch-keyed store.\n */\n root?: string;\n /** Tests only: inject a slow/fake refresh to assert the micro-budget. */\n refreshImpl?: RefreshImpl;\n}\n\nexport interface ServeOptions {\n /** Record local, counts-only usage savings (opt-in). */\n savings?: boolean;\n /**\n * Periodically upload the counts-only ledger to Vibgrate (opt-in; off by\n * default). Implies recording. The upload itself is driven by the serve\n * command (see commands/serve.ts + engine/stats-share.ts); here it just also\n * turns recording on so there's something to send.\n */\n shareStats?: boolean;\n /** Air-gapped mode (no model downloads). */\n local?: boolean;\n /** Collapse repeat heavy relation lists within a session (opt-in). */\n dedup?: boolean;\n /** Auto-refresh the map when the working tree drifts (default true). */\n refresh?: boolean;\n /**\n * Workspace root (project directory). When set, freshness probes and tools\n * use this instead of inferring root from the graph path.\n */\n root?: string;\n /**\n * In-memory session stats behind the live `vg serve` status display. Always\n * safe to pass: nothing recorded here is persisted or uploaded — it dies with\n * the process (the opt-in ledger above is a separate concern).\n */\n stats?: SessionStats;\n}\n\nexport class GraphSource {\n private cachedMtimeMs = -1;\n private cached: VgGraph | null = null;\n /** Project root used for freshness probes and rebuilds. */\n readonly root: string;\n private lastProbeAt = 0;\n private failedUntil = 0;\n private inflight: Promise<void> | null = null;\n /** Self-tuned: grows with measured probe/rebuild cost so huge repos aren't penalized. */\n private probeIntervalMs = PROBE_INTERVAL_MS;\n private readonly refreshImpl: RefreshImpl;\n\n constructor(\n readonly graphPath: string,\n private readonly refresh = false,\n /** Timing / root overrides (production passes `root`; tests may pass more). */\n private readonly tuning: GraphSourceTuning = {},\n ) {\n // Prefer an explicit root. Fallback assumes legacy `root/.vibgrate/graph.json`\n // (dirname twice); wrong for the global store — callers should pass `root`.\n this.root = tuning.root ?? path.dirname(path.dirname(graphPath));\n this.refreshImpl = tuning.refreshImpl ?? refreshIfStale;\n }\n\n /** Current graph: auto-refreshed if the tree drifted, reloaded if the file changed. */\n async get(): Promise<VgGraph> {\n if (this.refresh) await this.maybeRefresh();\n const stat = fs.statSync(this.graphPath); // throws if missing → surfaced as tool error\n if (stat.mtimeMs !== this.cachedMtimeMs || !this.cached) {\n this.cached = parseGraph(fs.readFileSync(this.graphPath, 'utf8'));\n this.cachedMtimeMs = stat.mtimeMs;\n }\n return this.cached;\n }\n\n /**\n * Debounced, single-flight refresh. Never throws — a refresh problem must\n * degrade to \"answer from the current map\", not break the tool call.\n */\n private async maybeRefresh(): Promise<void> {\n const now = Date.now();\n if (!this.inflight) {\n const interval = this.tuning.probeIntervalMs ?? this.probeIntervalMs;\n if (now < this.failedUntil || now - this.lastProbeAt < interval) return;\n this.lastProbeAt = now;\n this.inflight = this.refreshImpl(this.root, { graphPath: this.graphPath })\n .then((r) => {\n if (r.status === 'error') this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n // Self-tune off the full wall cost of *every* outcome — including a\n // multi-second incremental rebuild. Previously only probe-only\n // outcomes (fresh/no-snapshot/locked) backed off, so a 20s rebuild\n // of a large repo re-armed after the 2s floor and every sequential\n // tool call blocked on the refresh budget for the whole suite.\n const cost =\n r.status === 'refreshed' && typeof r.ms === 'number' ? Math.max(r.ms, Date.now() - now) : Date.now() - now;\n this.probeIntervalMs = Math.min(\n MAX_PROBE_INTERVAL_MS,\n Math.max(PROBE_INTERVAL_MS, cost * PROBE_DUTY_FACTOR),\n );\n })\n .catch(() => {\n this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n })\n .finally(() => {\n this.inflight = null;\n });\n }\n await Promise.race([this.inflight, sleep(this.tuning.refreshBudgetMs ?? REFRESH_BUDGET_MS)]);\n }\n}\n\nexport function createServer(source: GraphSource, opts: ServeOptions = {}): Server {\n const { savings = false, shareStats = false, local = false, dedup = false, stats } = opts;\n // Recording feeds both the local `vg savings` report and the opt-in upload, so\n // enabling either turns it on. Absent both, `vg serve` records nothing.\n const record = savings || shareStats;\n // Prefer GraphSource's explicit root (set by serve from the project cwd).\n const root = opts.root ?? source.root;\n // Per-session memory of node ids whose full detail was already returned — the\n // basis for opt-in cross-call dedup (`--dedup`). Scoped to this server\n // instance so it never leaks across sessions. Node ids are content-addressed\n // (blake3 of content), so an edited node gets a new id and is never falsely\n // treated as already-seen — dedup is stale-safe by construction.\n const seen = new Set<string>();\n const server = new Server(\n { name: 'vg', version: VERSION },\n {\n capabilities: { tools: {} },\n // Routing guidance once at the server level (hosts that surface\n // `instructions` get it at zero per-step schema cost): the flashlight\n // vs the map.\n instructions:\n 'vg is a code map. Use search_symbols to find a known name or literal string fast — ' +\n 'a multi-word/quoted phrase runs a complete literal sweep and reports totalTextMatches, ' +\n 'so reach for it instead of grep even for plain-string \"find every occurrence\" lookups. ' +\n 'Use orient/query_graph for meaning: symptoms, relationships, and what-breaks-if. ' +\n 'Responses are concise by default; pass response_format:\"detailed\" only when a node proves load-bearing. ' +\n // Stop-discipline: the failure mode on a focused task is over-navigation\n // — one more query, one more get_node — which re-bills the whole context\n // every step. One good navigation call usually locates the code.\n 'Navigate as little as possible: one good search/query usually locates the code. ' +\n 'As soon as you have the file and line, read that file and make the edit — ' +\n 'do not call further graph tools unless the edit fails or the match was wrong. ' +\n // Library docs: position against web search (version-correct beats\n // SEO results), and give a stopping rule so a thin doc doesn't turn\n // into an open-ended search loop.\n 'For how-do-I-use-this-library questions call resolve_library once, then library_docs ' +\n 'with the returned targetId and a focused query: the docs are official and matched to ' +\n 'the version THIS project has installed (drift-annotated) — prefer them over web search ' +\n 'or training-data recall when they conflict. Skip them for language built-ins or APIs ' +\n 'already shown in context. If two library_docs calls have not surfaced the section you ' +\n 'need, read the package source under node_modules instead of searching again.',\n },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n annotations: { readOnlyHint: true, openWorldHint: false },\n })),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const tool = TOOLS.find((t) => t.name === request.params.name);\n if (!tool) {\n return errorResult(`unknown tool \"${request.params.name}\"`);\n }\n let graph: VgGraph;\n try {\n graph = await source.get();\n } catch {\n return errorResult(\n 'no code map found. Run `vg` in the project to build .vibgrate/graph.json, then retry.',\n );\n }\n const startedAt = Date.now();\n try {\n const args = (request.params.arguments ?? {}) as Record<string, unknown>;\n const result = await tool.handler(graph, args, { root, local, dedup, seen });\n const ms = Date.now() - startedAt;\n // Live, in-memory session stats for the serve status display — always on\n // when a serve process passed them (nothing leaves the process).\n stats?.record({ ...measureCall(tool.name, result), client: sanitizeClient(detectClient(server)), ms });\n // Opt-in, counts-only usage ledger: one entry per navigation call, with its\n // outcome, the grep-baseline token counts, and — so `vg savings` can show\n // the command-vs-MCP split and which AI is calling — the source (`mcp`) and\n // the client detected from the initialize handshake.\n if (record) recordUsage(root, tool.name, result, detectClient(server), ms);\n // Compact → clamp to the token ceiling → compact-serialise. See ./response.ts.\n return renderToolResult(result);\n } catch (err) {\n // A failed call still counts in the live display — as a miss, so the\n // operator sees trouble instead of a silently frozen dashboard.\n stats?.record({\n tool: tool.name,\n client: sanitizeClient(detectClient(server)),\n outcome: 'miss',\n ms: Date.now() - startedAt,\n vgTokens: 0,\n baselineTokens: 0,\n });\n return errorResult(`tool \"${tool.name}\" failed: ${(err as Error).message}`);\n }\n });\n\n return server;\n}\n\nexport async function serveStdio(graphPath: string, opts: ServeOptions = {}): Promise<void> {\n const source = new GraphSource(graphPath, opts.refresh !== false, { root: opts.root });\n const server = createServer(source, opts);\n // Start the semantic-model warm-up as soon as the server boots, so the first\n // orient/query_graph doesn't pay a cold download. Non-blocking: navigation\n // answers lexically until the model is ready, then upgrades to semantic.\n warmEmbedderInBackground(opts.local);\n await server.connect(new StdioServerTransport());\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.(); // never keep the server process alive just for the budget timer\n });\n}\n\n/**\n * Append a counts-only usage entry for a navigation call: which tool, how it\n * resolved (complete/partial/miss), and — for the grep-baseline tools — the\n * tokens vg spent vs the grep/read baseline it replaced.\n *\n * `vgTokens` is the size of the payload vg ACTUALLY returned — the rendered text\n * block the model receives and re-pays on every subsequent turn — measured with\n * the same token counter the budget uses. It is deliberately NOT read from a\n * `tokensEstimate` field: only query_graph's rarely-used *detailed* mode ever\n * set that (get_node never did), so the old code recorded nothing under normal\n * concise usage and `vg savings` always reported \"recording is off\".\n */\nexport function recordUsage(root: string, tool: string, result: unknown, client?: string, ms?: number): void {\n recordSaving(\n root,\n { ...measureCall(tool, result), source: 'mcp', client: sanitizeClient(client), ...(ms !== undefined ? { ms } : {}) },\n Date.now(),\n );\n}\n\n/**\n * Measure one tool call for the ledger and the live session stats: its outcome\n * plus — for the grep-baseline tools only — the context tokens vg returned and\n * the baseline they replaced (other tools report zeros, meaning \"no baseline\").\n */\nfunction measureCall(tool: string, result: unknown): { tool: string; outcome: Outcome; vgTokens: number; baselineTokens: number } {\n const outcome = classifyOutcome(result);\n let vgTokens = 0;\n let baselineTokens = 0;\n if (SAVINGS_TOOLS.has(tool) && result && typeof result === 'object') {\n vgTokens = countTokens(renderedText(renderToolResult(result)));\n // Grep/read baseline: ~PER_FILE_TOKENS per distinct file the answer points\n // at — the files a grep/read agent would have had to open to learn the same\n // thing. query_graph surfaces them as `matches[].file`; get_node as its own\n // `file` plus the files of the callers/callees it returned in one call.\n baselineTokens = referencedFiles(result).size * PER_FILE_TOKENS;\n }\n return { tool, outcome, vgTokens, baselineTokens };\n}\n\n/**\n * The coarse client label from the MCP `initialize` handshake, if the host sent\n * `clientInfo`. Read defensively — `getClientVersion()` exists on the SDK Server\n * once initialized, but we never want telemetry bookkeeping to throw. Returns\n * undefined when unknown (then sanitized to `'unknown'`).\n */\nfunction detectClient(server: Server): string | undefined {\n try {\n const info = (server as { getClientVersion?: () => { name?: string } | undefined }).getClientVersion?.();\n return typeof info?.name === 'string' ? info.name : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Bucket a tool result into complete / partial / miss. A `miss` is an answer\n * that found nothing (no match, not-found, not-connected, or an empty listing);\n * a `partial` found results but capped or paginated some of them; everything\n * else is `complete`. Note that a legitimately empty `affected`/`covers` (e.g.\n * \"nothing depends on this\") is a successful answer, not a miss — only the\n * primary discovery signals below mark a miss.\n */\nfunction classifyOutcome(result: unknown): Outcome {\n if (Array.isArray(result)) return result.length === 0 ? 'miss' : 'complete';\n if (!result || typeof result !== 'object') return 'miss';\n const r = result as Record<string, unknown>;\n if (typeof r.error === 'string' && r.error) return 'miss'; // not_found / ambiguous / unresolved\n if (r.connected === false) return 'miss'; // find_path\n if (Array.isArray(r.matches) && r.matches.length === 0) return 'miss'; // query_graph / search_symbols\n return isPartial(r) ? 'partial' : 'complete';\n}\n\n/** True when a hit left results on the table: paginated, or a capped relation list. */\nfunction isPartial(r: Record<string, unknown>): boolean {\n if (r.moreAvailable === true) return true;\n if (r._truncated && typeof r._truncated === 'object') return true;\n // A `<name>Total` greater than the length of its sibling `<name>` array means\n // the array was capped (e.g. get_node's callsTotal vs the shown calls).\n for (const [key, value] of Object.entries(r)) {\n if (typeof value !== 'number' || !key.endsWith('Total')) continue;\n const base = key.slice(0, -'Total'.length);\n const shown = Array.isArray(r[base]) ? (r[base] as unknown[]).length : 0;\n if (value > shown) return true;\n }\n return false;\n}\n\n/** The text block of a rendered tool result — what the model is billed for. */\nfunction renderedText(rendered: CallToolResult): string {\n const block = rendered.content?.find((b) => b.type === 'text');\n return block && 'text' in block && typeof block.text === 'string' ? block.text : '';\n}\n\n/** Distinct files a navigation result points at (its grep/read baseline set). */\nfunction referencedFiles(result: unknown): Set<string> {\n const r = result as { file?: unknown; matches?: unknown; calls?: unknown; calledBy?: unknown };\n const files = new Set<string>();\n if (typeof r.file === 'string' && r.file) files.add(r.file);\n for (const m of asArray(r.matches)) {\n const f = (m as { file?: unknown }).file;\n if (typeof f === 'string' && f) files.add(f);\n }\n // get_node's calls/calledBy are qualified names of the form `path:symbol`; the\n // path prefix is the file a grep/read agent would open to inspect that edge.\n for (const name of [...asArray(r.calls), ...asArray(r.calledBy)]) {\n if (typeof name !== 'string') continue;\n const i = name.indexOf(':');\n if (i > 0) files.add(name.slice(0, i));\n }\n return files;\n}\n\nfunction asArray(v: unknown): unknown[] {\n return Array.isArray(v) ? v : [];\n}\n\nfunction errorResult(message: string) {\n return { content: [{ type: 'text', text: message }], isError: true };\n}\n","import { serializeGraph } from './serialize.js';\nimport { renderReport } from './report.js';\nimport { renderHtml } from './html.js';\nimport type { DepRecord } from './drift.js';\nimport type { LocalModel } from './models.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic exporters (VG-CLI-SPEC §4.2). One `vg export <file>` verb, format\n * inferred from the extension. Live graph-DB push is deliberately out (a file\n * import covers the same need offline). CycloneDX/SPDX power the SBOM/AI-BOM seam\n * (VG-LOCAL-MODELS §9.4).\n */\n\nexport type ExportFormat =\n | 'json'\n | 'ndjson'\n | 'graphml'\n | 'dot'\n | 'cypher'\n | 'sql'\n | 'md'\n | 'html'\n | 'cyclonedx'\n | 'spdx';\n\nexport function formatForExt(ext: string): ExportFormat | null {\n switch (ext.toLowerCase()) {\n case '.json':\n return 'json';\n case '.ndjson':\n return 'ndjson';\n case '.graphml':\n return 'graphml';\n case '.dot':\n case '.gv':\n return 'dot';\n case '.cypher':\n return 'cypher';\n case '.sql':\n return 'sql';\n case '.md':\n return 'md';\n case '.html':\n return 'html';\n default:\n return null;\n }\n}\n\nexport interface ExportContext {\n graph: VgGraph;\n deps?: DepRecord[];\n models?: LocalModel[];\n generatedAt: string;\n}\n\nexport function exportGraph(format: ExportFormat, ctx: ExportContext): string {\n switch (format) {\n case 'json':\n return serializeGraph(ctx.graph);\n case 'md':\n return renderReport(ctx.graph);\n case 'html':\n return renderHtml(ctx.graph);\n case 'ndjson':\n return ndjson(ctx.graph);\n case 'graphml':\n return graphml(ctx.graph);\n case 'dot':\n return dot(ctx.graph);\n case 'cypher':\n return cypher(ctx.graph);\n case 'sql':\n return sql(ctx);\n case 'cyclonedx':\n return cyclonedx(ctx);\n case 'spdx':\n return spdx(ctx);\n }\n}\n\nfunction ndjson(graph: VgGraph): string {\n // Facts stream if present, else the node stream — one JSON object per line.\n const rows = graph.facts && graph.facts.length ? graph.facts : graph.nodes;\n return rows.map((r) => JSON.stringify(r)).join('\\n') + '\\n';\n}\n\nfunction esc(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nfunction graphml(graph: VgGraph): string {\n const lines: string[] = [];\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n lines.push('<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\">');\n lines.push(' <key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"/>');\n lines.push(' <key id=\"kind\" for=\"node\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <key id=\"file\" for=\"node\" attr.name=\"file\" attr.type=\"string\"/>');\n lines.push(' <key id=\"ekind\" for=\"edge\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <graph edgedefault=\"directed\">');\n for (const n of graph.nodes) {\n lines.push(` <node id=\"${esc(n.id)}\"><data key=\"name\">${esc(n.qualifiedName)}</data><data key=\"kind\">${esc(n.kind)}</data><data key=\"file\">${esc(n.file)}</data></node>`);\n }\n for (const e of graph.edges) {\n lines.push(` <edge source=\"${esc(e.src)}\" target=\"${esc(e.dst)}\"><data key=\"ekind\">${esc(e.kind)}</data></edge>`);\n }\n lines.push(' </graph>');\n lines.push('</graphml>');\n return lines.join('\\n') + '\\n';\n}\n\nfunction dot(graph: VgGraph): string {\n const lines: string[] = ['digraph vg {'];\n for (const n of graph.nodes) lines.push(` \"${n.id}\" [label=\"${dotEsc(n.qualifiedName)}\"];`);\n for (const e of graph.edges) lines.push(` \"${e.src}\" -> \"${e.dst}\" [label=\"${e.kind}\"];`);\n lines.push('}');\n return lines.join('\\n') + '\\n';\n}\nfunction dotEsc(s: string): string {\n return s.replace(/\"/g, '\\\\\"');\n}\n\nfunction cypher(graph: VgGraph): string {\n const lines: string[] = [];\n for (const n of graph.nodes) {\n lines.push(\n `CREATE (:\\`${cypherLabel(n.kind)}\\` {id:${q(n.id)}, name:${q(n.qualifiedName)}, file:${q(n.file)}});`,\n );\n }\n for (const e of graph.edges) {\n lines.push(\n `MATCH (a {id:${q(e.src)}}),(b {id:${q(e.dst)}}) CREATE (a)-[:\\`${cypherLabel(e.kind)}\\`]->(b);`,\n );\n }\n return lines.join('\\n') + '\\n';\n}\nfunction cypherLabel(s: string): string {\n return s.replace(/[^A-Za-z0-9_]/g, '_');\n}\nfunction q(s: string): string {\n return JSON.stringify(s);\n}\n\n/**\n * Portable SQL fact-DB (VG-CLI-SPEC §4.2, agent-consumption). Emits deterministic\n * DDL + INSERT text — NOT a native driver — that loads identically into BOTH\n * sqlite3 and duckdb (`sqlite3 map.db < map.sql` / `duckdb map.db < map.sql`).\n * Text keeps the CLI dependency-free, offline, and byte-diffable; an identical\n * graph yields identical bytes. An agent can then run e.g.\n * SELECT src, dst FROM edges WHERE epistemic = 'observed' AND confidence >= 0.9;\n * Determinism: single transaction, `CREATE TABLE IF NOT EXISTS`, rows emitted in\n * the graph's own (already-sorted) array order, single quotes doubled, NULL for\n * absent optionals, booleans as 0/1, and no timestamp but the graph's generatedAt.\n */\nfunction sql(ctx: ExportContext): string {\n const graph = ctx.graph;\n const lines: string[] = [];\n lines.push('BEGIN;');\n\n // meta — provenance / toolchain fingerprint (key/value; agent can read the corpus hash).\n lines.push('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT);');\n const meta: [string, string | null][] = [\n ['schemaVersion', graph.schemaVersion],\n ['generatedAt', ctx.generatedAt],\n ['corpusHash', graph.provenance.corpusHash],\n ['tool', graph.provenance.tool],\n ['toolVersion', graph.provenance.version],\n ['resolver', graph.provenance.resolver.join(',')],\n ['fingerprint', graph.provenance.toolchain?.fingerprint ?? null],\n ];\n for (const [k, v] of meta) lines.push(`INSERT INTO meta VALUES (${sqlStr(k)}, ${sqlStr(v)});`);\n\n // nodes\n lines.push(\n 'CREATE TABLE IF NOT EXISTS nodes (id TEXT PRIMARY KEY, kind TEXT, name TEXT, qualified_name TEXT, file TEXT, span_start INTEGER, span_end INTEGER, lang TEXT, visibility TEXT, signature TEXT, importance REAL, area INTEGER, is_hub INTEGER, tested INTEGER, coverage REAL);',\n );\n for (const n of graph.nodes) {\n lines.push(\n `INSERT INTO nodes VALUES (${sqlStr(n.id)}, ${sqlStr(n.kind)}, ${sqlStr(n.name)}, ${sqlStr(n.qualifiedName)}, ${sqlStr(n.file)}, ${sqlNum(n.span.start)}, ${sqlNum(n.span.end)}, ${sqlStr(n.lang)}, ${sqlStr(n.visibility)}, ${sqlStr(n.signature)}, ${sqlNum(n.importance)}, ${sqlNum(n.area)}, ${sqlBool(n.isHub)}, ${sqlBool(n.tested)}, ${sqlNum(n.coverage)});`,\n );\n }\n\n // edges — the epistemic column is the point: SELECT ... WHERE epistemic='observed'.\n lines.push(\n 'CREATE TABLE IF NOT EXISTS edges (id TEXT PRIMARY KEY, kind TEXT, src TEXT, dst TEXT, resolution TEXT, confidence REAL, epistemic TEXT, surprise REAL, \"count\" INTEGER);',\n );\n for (const e of graph.edges) {\n lines.push(\n `INSERT INTO edges VALUES (${sqlStr(e.id)}, ${sqlStr(e.kind)}, ${sqlStr(e.src)}, ${sqlStr(e.dst)}, ${sqlStr(e.resolution)}, ${sqlNum(e.confidence)}, ${sqlStr(e.epistemic)}, ${sqlNum(e.surprise)}, ${sqlNum(e.count)});`,\n );\n }\n\n // areas (+ members)\n lines.push('CREATE TABLE IF NOT EXISTS areas (id INTEGER PRIMARY KEY, label TEXT, size INTEGER, cohesion REAL, external_edges INTEGER);');\n lines.push('CREATE TABLE IF NOT EXISTS area_members (area_id INTEGER, node_id TEXT);');\n for (const a of graph.areas) {\n lines.push(`INSERT INTO areas VALUES (${sqlNum(a.id)}, ${sqlStr(a.label)}, ${sqlNum(a.size)}, ${sqlNum(a.cohesion)}, ${sqlNum(a.externalEdges)});`);\n for (const m of a.members) lines.push(`INSERT INTO area_members VALUES (${sqlNum(a.id)}, ${sqlStr(m)});`);\n }\n\n // facts (+ subjects, evidence) — only with a --deep build.\n if (graph.facts && graph.facts.length) {\n lines.push('CREATE TABLE IF NOT EXISTS facts (id TEXT PRIMARY KEY, kind TEXT, predicate_json TEXT, derived_by TEXT, confidence TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_subjects (fact_id TEXT, node_id TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_evidence (fact_id TEXT, file TEXT, span_start INTEGER, span_end INTEGER);');\n for (const f of graph.facts) {\n lines.push(`INSERT INTO facts VALUES (${sqlStr(f.id)}, ${sqlStr(f.kind)}, ${sqlStr(JSON.stringify(f.predicate))}, ${sqlStr(f.derivedBy)}, ${sqlStr(f.confidence)});`);\n for (const s of f.subjectIds) lines.push(`INSERT INTO fact_subjects VALUES (${sqlStr(f.id)}, ${sqlStr(s)});`);\n for (const ev of f.evidence) lines.push(`INSERT INTO fact_evidence VALUES (${sqlStr(f.id)}, ${sqlStr(ev.file)}, ${sqlNum(ev.span.start)}, ${sqlNum(ev.span.end)});`);\n }\n }\n\n lines.push('COMMIT;');\n return lines.join('\\n') + '\\n';\n}\n\n/** SQL string literal (single quotes doubled) or NULL for absent values. */\nfunction sqlStr(v: string | null | undefined): string {\n if (v == null) return 'NULL';\n return `'${v.replace(/'/g, \"''\")}'`;\n}\n/** Numeric literal or NULL for absent values. */\nfunction sqlNum(v: number | null | undefined): string {\n return v == null || !Number.isFinite(v) ? 'NULL' : String(v);\n}\n/** Boolean as 0/1, NULL when unknown (e.g. an unanalyzable node's `tested`). */\nfunction sqlBool(v: boolean | null | undefined): string {\n return v == null ? 'NULL' : v ? '1' : '0';\n}\n\nfunction cyclonedx(ctx: ExportContext): string {\n // CycloneDX 1.6 JSON — dependencies as library components + local models as\n // machine-learning-model components (AI-BOM). Deterministic ordering; no\n // timestamps beyond the pinned generatedAt.\n const components: unknown[] = [];\n for (const d of ctx.deps ?? []) {\n components.push({\n type: 'library',\n name: d.name,\n version: d.installed ?? d.declared,\n purl: d.ecosystem === 'npm' ? `pkg:npm/${d.name}@${d.installed ?? ''}` : undefined,\n });\n }\n for (const m of ctx.models ?? []) {\n components.push({ type: 'machine-learning-model', name: m.name, properties: [{ name: 'vg:runtime', value: m.runtime }] });\n }\n const bom = {\n bomFormat: 'CycloneDX',\n specVersion: '1.6',\n metadata: { timestamp: ctx.generatedAt, tools: [{ name: 'vg', version: ctx.graph.provenance.version }] },\n components,\n };\n return JSON.stringify(bom, null, 2) + '\\n';\n}\n\nfunction spdx(ctx: ExportContext): string {\n const packages = (ctx.deps ?? []).map((d) => ({\n SPDXID: `SPDXRef-Package-${cypherLabel(d.name)}`,\n name: d.name,\n versionInfo: d.installed ?? d.declared,\n downloadLocation: 'NOASSERTION',\n }));\n const doc = {\n spdxVersion: 'SPDX-2.3',\n dataLicense: 'CC0-1.0',\n SPDXID: 'SPDXRef-DOCUMENT',\n name: 'vg-sbom',\n creationInfo: { created: ctx.generatedAt, creators: [`Tool: vg-${ctx.graph.provenance.version}`] },\n packages,\n };\n return JSON.stringify(doc, null, 2) + '\\n';\n}\n"]}
|