@vibgrate/cli 2026.817.2 → 2026.818.2
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/activity-MF2GNYAI.js +5 -0
- package/dist/activity-MF2GNYAI.js.map +1 -0
- package/dist/agent-X6VYCE63.js +30 -0
- package/dist/{agent-UQC7QN77.js.map → agent-X6VYCE63.js.map} +1 -1
- package/dist/{approvals-ASPJQUZK.js → approvals-TPQFQSWG.js} +5 -5
- package/dist/{approvals-ASPJQUZK.js.map → approvals-TPQFQSWG.js.map} +1 -1
- package/dist/attach-G5JUIWIT.js +10 -0
- package/dist/attach-G5JUIWIT.js.map +1 -0
- package/dist/baseline-DXI64VLW.js +9 -0
- package/dist/{baseline-FIV6PR2M.js.map → baseline-DXI64VLW.js.map} +1 -1
- package/dist/{chunk-AXZZ5CCG.js → chunk-2C33WR5O.js} +38 -19
- package/dist/chunk-2C33WR5O.js.map +1 -0
- package/dist/chunk-4NTNMT6T.js +6 -0
- package/dist/{chunk-PRG2ULPK.js.map → chunk-4NTNMT6T.js.map} +1 -1
- package/dist/chunk-5IQBIXHS.js +23 -0
- package/dist/chunk-5IQBIXHS.js.map +1 -0
- package/dist/{chunk-6K3XK7C5.js → chunk-6ABMV74F.js} +6 -3
- package/dist/chunk-6ABMV74F.js.map +1 -0
- package/dist/chunk-6BEBJCK4.js +467 -0
- package/dist/chunk-6BEBJCK4.js.map +1 -0
- package/dist/{chunk-E2FAQREZ.js → chunk-6PFHDHOL.js} +174 -401
- package/dist/chunk-6PFHDHOL.js.map +1 -0
- package/dist/chunk-6WRG7VDO.js +118 -0
- package/dist/chunk-6WRG7VDO.js.map +1 -0
- package/dist/{chunk-3NJUOIZQ.js → chunk-AEJYA6HZ.js} +5 -5
- package/dist/{chunk-3NJUOIZQ.js.map → chunk-AEJYA6HZ.js.map} +1 -1
- package/dist/{chunk-O2DL2Q55.js → chunk-B4EXD5LK.js} +5 -5
- package/dist/{chunk-O2DL2Q55.js.map → chunk-B4EXD5LK.js.map} +1 -1
- package/dist/{chunk-EXV4QSAD.js → chunk-BMOFJIMG.js} +3 -3
- package/dist/{chunk-EXV4QSAD.js.map → chunk-BMOFJIMG.js.map} +1 -1
- package/dist/chunk-DBX3DL27.js +26 -0
- package/dist/chunk-DBX3DL27.js.map +1 -0
- package/dist/{chunk-KNGAZDGF.js → chunk-E3O5UKNA.js} +151 -42
- package/dist/chunk-E3O5UKNA.js.map +1 -0
- package/dist/{chunk-RBIRXQR6.js → chunk-E53WBVUQ.js} +7 -14
- package/dist/chunk-E53WBVUQ.js.map +1 -0
- package/dist/{chunk-C3LMWZKF.js → chunk-FFXGWFAE.js} +4 -4
- package/dist/{chunk-C3LMWZKF.js.map → chunk-FFXGWFAE.js.map} +1 -1
- package/dist/chunk-H5Q4JUY4.js +47 -0
- package/dist/chunk-H5Q4JUY4.js.map +1 -0
- package/dist/{chunk-LHKQGVRF.js → chunk-HF6R73UC.js} +100 -11
- package/dist/chunk-HF6R73UC.js.map +1 -0
- package/dist/{chunk-K6DXETMC.js → chunk-JGA63RGF.js} +13 -12
- package/dist/chunk-JGA63RGF.js.map +1 -0
- package/dist/{chunk-3FMRFECC.js → chunk-KU7FI5EV.js} +3 -3
- package/dist/{chunk-3FMRFECC.js.map → chunk-KU7FI5EV.js.map} +1 -1
- package/dist/{chunk-5OL2TSHK.js → chunk-L2OS4WHT.js} +4 -4
- package/dist/{chunk-5OL2TSHK.js.map → chunk-L2OS4WHT.js.map} +1 -1
- package/dist/chunk-LJSJX6U4.js +38 -0
- package/dist/chunk-LJSJX6U4.js.map +1 -0
- package/dist/{chunk-Q4G2BWE3.js → chunk-MRZHNUN7.js} +12 -6
- package/dist/chunk-MRZHNUN7.js.map +1 -0
- package/dist/chunk-NDNNOAS6.js +16 -0
- package/dist/chunk-NDNNOAS6.js.map +1 -0
- package/dist/chunk-NJQZRM55.js +100 -0
- package/dist/chunk-NJQZRM55.js.map +1 -0
- package/dist/{chunk-DVW3SVCW.js → chunk-NKLYDSB7.js} +29 -9
- package/dist/chunk-NKLYDSB7.js.map +1 -0
- package/dist/{chunk-TVDMNIUT.js → chunk-O5IJDMTB.js} +4 -4
- package/dist/{chunk-TVDMNIUT.js.map → chunk-O5IJDMTB.js.map} +1 -1
- package/dist/chunk-POOL355F.js +237 -0
- package/dist/chunk-POOL355F.js.map +1 -0
- package/dist/{chunk-XLXJC7H3.js → chunk-PRHH4DVO.js} +5 -118
- package/dist/chunk-PRHH4DVO.js.map +1 -0
- package/dist/{chunk-3H3SVJUY.js → chunk-RHKOUPWT.js} +107 -542
- package/dist/chunk-RHKOUPWT.js.map +1 -0
- package/dist/{chunk-WAKP7SK7.js → chunk-V2UGRUTL.js} +225 -48
- package/dist/chunk-V2UGRUTL.js.map +1 -0
- package/dist/{chunk-2FEB5KJS.js → chunk-V6WONSIK.js} +5 -4
- package/dist/chunk-V6WONSIK.js.map +1 -0
- package/dist/{chunk-WVMOGIPC.js → chunk-VMAIDM4K.js} +3 -3
- package/dist/{chunk-WVMOGIPC.js.map → chunk-VMAIDM4K.js.map} +1 -1
- package/dist/{chunk-GOGMS3ST.js → chunk-VQ5KMHW6.js} +860 -65
- package/dist/chunk-VQ5KMHW6.js.map +1 -0
- package/dist/{chunk-M7IO3DXH.js → chunk-X2MQ7UFL.js} +250 -30
- package/dist/chunk-X2MQ7UFL.js.map +1 -0
- package/dist/{chunk-OZ3IFXRD.js → chunk-YENM3HT7.js} +5 -4
- package/dist/chunk-YENM3HT7.js.map +1 -0
- package/dist/{chunk-KJT2R6WW.js → chunk-YF54UMOU.js} +3 -3
- package/dist/{chunk-KJT2R6WW.js.map → chunk-YF54UMOU.js.map} +1 -1
- package/dist/{chunk-Q3M6K3HY.js → chunk-ZUOBPKVK.js} +3 -3
- package/dist/{chunk-Q3M6K3HY.js.map → chunk-ZUOBPKVK.js.map} +1 -1
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +711 -463
- package/dist/cli.js.map +1 -1
- package/dist/client-UQIELEEZ.js +8 -0
- package/dist/client-UQIELEEZ.js.map +1 -0
- package/dist/daemon-GUMWMKCA.js +31 -0
- package/dist/{daemon-FPTRHO5N.js.map → daemon-GUMWMKCA.js.map} +1 -1
- package/dist/embed-worker-main.js +3 -3
- package/dist/ensure-map-FHDJTO7Y.js +41 -0
- package/dist/{ensure-map-342G2IV3.js.map → ensure-map-FHDJTO7Y.js.map} +1 -1
- package/dist/graph-backend-W2D3HRRD.js +16 -0
- package/dist/{graph-backend-RNWQBT3P.js.map → graph-backend-W2D3HRRD.js.map} +1 -1
- package/dist/index.d.ts +633 -4
- package/dist/index.js +26 -17
- package/dist/index.js.map +1 -1
- package/dist/{interactive-SR7TMF6M.js → interactive-2MK4TLRD.js} +42 -34
- package/dist/interactive-2MK4TLRD.js.map +1 -0
- package/dist/load-4R4HYMBB.js +11 -0
- package/dist/{load-AYFECIQB.js.map → load-4R4HYMBB.js.map} +1 -1
- package/dist/parse-worker.js +3 -2
- package/dist/parse-worker.js.map +1 -1
- package/dist/publish-7YHRTBRA.js +9 -0
- package/dist/publish-7YHRTBRA.js.map +1 -0
- package/dist/{run-outcome-YQQJG3LW.js → run-outcome-H5GVDDZJ.js} +5 -5
- package/dist/{run-outcome-YQQJG3LW.js.map → run-outcome-H5GVDDZJ.js.map} +1 -1
- package/dist/runtime-session-JBIHHH5N.js +27 -0
- package/dist/{runtime-session-CNJ4DAV5.js.map → runtime-session-JBIHHH5N.js.map} +1 -1
- package/dist/semantic-status-2JFLIQQJ.js +4 -0
- package/dist/semantic-status-2JFLIQQJ.js.map +1 -0
- package/dist/{session-H34HUV2Y.js → session-N5IU4K5Q.js} +8 -8
- package/dist/{session-H34HUV2Y.js.map → session-N5IU4K5Q.js.map} +1 -1
- package/dist/slot-subscription-25GOARW5.js +95 -0
- package/dist/slot-subscription-25GOARW5.js.map +1 -0
- package/dist/{stream-json-55YDNAFX.js → stream-json-4WLSUF6I.js} +18 -15
- package/dist/stream-json-4WLSUF6I.js.map +1 -0
- package/dist/version-DTEU3SQD.js +4 -0
- package/dist/{version-WSE3QOPK.js.map → version-DTEU3SQD.js.map} +1 -1
- package/dist/{vg-mcp-bridge-2CNLHNEL.js → vg-mcp-bridge-KDVYIMFX.js} +12 -11
- package/dist/vg-mcp-bridge-KDVYIMFX.js.map +1 -0
- package/dist/{vgd-URUZQORN.js → vgd-M7UOPWLB.js} +15 -10
- package/dist/vgd-M7UOPWLB.js.map +1 -0
- package/package.json +1 -1
- package/dist/agent-UQC7QN77.js +0 -27
- package/dist/baseline-FIV6PR2M.js +0 -9
- package/dist/chunk-2FEB5KJS.js.map +0 -1
- package/dist/chunk-3H3SVJUY.js.map +0 -1
- package/dist/chunk-6K3XK7C5.js.map +0 -1
- package/dist/chunk-AXZZ5CCG.js.map +0 -1
- package/dist/chunk-DVW3SVCW.js.map +0 -1
- package/dist/chunk-E2FAQREZ.js.map +0 -1
- package/dist/chunk-GOGMS3ST.js.map +0 -1
- package/dist/chunk-K6DXETMC.js.map +0 -1
- package/dist/chunk-KNGAZDGF.js.map +0 -1
- package/dist/chunk-LHKQGVRF.js.map +0 -1
- package/dist/chunk-M7IO3DXH.js.map +0 -1
- package/dist/chunk-OZ3IFXRD.js.map +0 -1
- package/dist/chunk-PRG2ULPK.js +0 -6
- package/dist/chunk-Q4G2BWE3.js.map +0 -1
- package/dist/chunk-RBIRXQR6.js.map +0 -1
- package/dist/chunk-WAKP7SK7.js.map +0 -1
- package/dist/chunk-XLXJC7H3.js.map +0 -1
- package/dist/daemon-FPTRHO5N.js +0 -26
- package/dist/ensure-map-342G2IV3.js +0 -33
- package/dist/graph-backend-RNWQBT3P.js +0 -15
- package/dist/interactive-SR7TMF6M.js.map +0 -1
- package/dist/load-AYFECIQB.js +0 -11
- package/dist/runtime-session-CNJ4DAV5.js +0 -22
- package/dist/stream-json-55YDNAFX.js.map +0 -1
- package/dist/version-WSE3QOPK.js +0 -4
- package/dist/vg-mcp-bridge-2CNLHNEL.js.map +0 -1
- package/dist/vgd-URUZQORN.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/grounding/pack.ts","../src/engine/graph-model.ts","../src/engine/paths.ts","../src/engine/test-query.ts","../src/reporting/utils/gitignore.ts","../src/reporting/commands/dsn.ts","../src/reporting/credentials.ts","../src/reporting/utils/compact-evidence.ts","../src/reporting/utils/compact-artifact.ts","../src/reporting/utils/upload.ts","../src/reporting/commands/push.ts","../src/mcp/vuln-data.ts","../src/mcp/attribution.ts","../src/engine/tokens.ts","../src/engine/selection-weights.ts","../src/engine/select.ts","../src/engine/quality.ts","../src/engine/hosted.ts","../src/engine/hosted-cache.ts","../src/mcp/response.ts","../src/mcp/tools.ts"],"names":["path","path2","fs2","path3","fs3","gzip","chalk","Command","path5","path6","fs4","full","path7","fs5","obj","uniqueNames","path8","fs6"],"mappings":"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","file":"chunk-NKLYDSB7.js","sourcesContent":["import type { GroundingKind } from '../schema.js';\n\n/**\n * The free knowledge pack shipped in the open CLI (VG-PACKAGE-AND-SCHEMA §6):\n * our own paraphrased guidance + openly-licensed standards (OWASP Top 10 2021,\n * CWE). Never verbatim proprietary text; every entry cites a public source.\n * Matching is deterministic (imports / called APIs / identifier keywords).\n */\n\nexport interface MatchRule {\n imports?: string[]; // module/package signals (substring match on import source)\n calls?: string[]; // called-API signals (callee short name)\n keywords?: string[]; // identifier/name signals (word part of the node name)\n}\n\nexport interface PackEntry {\n id: string;\n topic: string;\n summary: string;\n citation: { title: string; url: string };\n kind: GroundingKind;\n rationale: 'recommended' | 'conjectured';\n match: MatchRule;\n}\n\nexport interface KnowledgePack {\n id: string;\n version: string;\n license: string;\n entries: PackEntry[];\n}\n\nexport const FREE_PACK: KnowledgePack = {\n id: 'vibgrate-free',\n version: '2026.06',\n license: 'CC-BY (standards summaries) + Apache-2.0 (own content)',\n entries: [\n {\n id: 'owasp-a01-access-control',\n topic: 'access-control',\n summary:\n 'Enforce authorization on every request server-side; deny by default and check the user’s role and ownership, not just authentication.',\n citation: { title: 'OWASP Top 10 2021 A01: Broken Access Control', url: 'https://owasp.org/Top10/A01_2021-Broken_Access_Control/' },\n kind: 'should_follow',\n rationale: 'recommended',\n match: {\n keywords: ['auth', 'authorize', 'authorization', 'permission', 'role', 'access', 'acl', 'rbac', 'tenant'],\n imports: ['casl', 'accesscontrol', 'next-auth'],\n },\n },\n {\n id: 'owasp-a07-auth-failures',\n topic: 'authentication',\n summary:\n 'Use vetted auth libraries, hash passwords with a strong adaptive function, rate-limit logins, and keep sessions short and rotated.',\n citation: { title: 'OWASP Top 10 2021 A07: Identification & Authentication Failures', url: 'https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/' },\n kind: 'should_follow',\n rationale: 'recommended',\n match: {\n keywords: ['login', 'authenticate', 'signin', 'session', 'jwt', 'password', 'credential'],\n imports: ['passport', 'jsonwebtoken', 'bcrypt', 'argon2', 'next-auth', 'lucia'],\n },\n },\n {\n id: 'owasp-a02-crypto-failures',\n topic: 'cryptography',\n summary:\n 'Prefer well-reviewed primitives; never roll your own crypto; use authenticated encryption and a strong KDF; never hardcode keys.',\n citation: { title: 'OWASP Top 10 2021 A02: Cryptographic Failures', url: 'https://owasp.org/Top10/A02_2021-Cryptographic_Failures/' },\n kind: 'should_follow',\n rationale: 'recommended',\n match: { keywords: ['encrypt', 'decrypt', 'cipher', 'hash', 'hmac', 'crypto', 'sign', 'verify'], imports: ['crypto', 'bcrypt', 'argon2', 'node:crypto', 'tweetnacl'], calls: ['createCipheriv', 'createHash', 'randomBytes'] },\n },\n {\n id: 'owasp-a03-injection',\n topic: 'input-validation',\n summary:\n 'Validate and parameterize all untrusted input; use parameterized queries and schema validation rather than string concatenation.',\n citation: { title: 'OWASP Top 10 2021 A03: Injection', url: 'https://owasp.org/Top10/A03_2021-Injection/' },\n kind: 'should_follow',\n rationale: 'recommended',\n match: { keywords: ['validate', 'sanitize', 'escape', 'schema', 'parse'], imports: ['zod', 'joi', 'yup', 'ajv', 'validator', 'class-validator'] },\n },\n {\n id: 'cwe-89-sql-injection',\n topic: 'sql-injection',\n summary:\n 'Use parameterized queries / prepared statements or a query builder; never build SQL by concatenating user input.',\n citation: { title: 'CWE-89: SQL Injection', url: 'https://cwe.mitre.org/data/definitions/89.html' },\n kind: 'relevant_to',\n rationale: 'recommended',\n match: { keywords: ['sql', 'query', 'where', 'select'], imports: ['pg', 'mysql', 'mysql2', 'sqlite3', 'better-sqlite3', 'knex', 'sequelize', 'typeorm', 'prisma', 'drizzle'], calls: ['query', 'execute', 'raw'] },\n },\n {\n id: 'cwe-798-hardcoded-credentials',\n topic: 'secrets',\n summary:\n 'Do not embed secrets/API keys/passwords in source; load them from a secrets manager or environment and keep them out of version control.',\n citation: { title: 'CWE-798: Use of Hard-coded Credentials', url: 'https://cwe.mitre.org/data/definitions/798.html' },\n kind: 'smells_like',\n rationale: 'conjectured',\n match: { keywords: ['secret', 'apikey', 'apikeys', 'token', 'credential', 'password', 'privatekey'] },\n },\n {\n id: 'cwe-502-deserialization',\n topic: 'deserialization',\n summary:\n 'Avoid deserializing untrusted data and never eval it; prefer safe parsers and explicit schemas.',\n citation: { title: 'CWE-502: Deserialization of Untrusted Data', url: 'https://cwe.mitre.org/data/definitions/502.html' },\n kind: 'smells_like',\n rationale: 'conjectured',\n match: { keywords: ['deserialize', 'unserialize', 'eval'], calls: ['eval', 'Function', 'deserialize'] },\n },\n {\n id: 'owasp-a10-ssrf',\n topic: 'ssrf',\n summary:\n 'Validate and allowlist outbound URLs built from user input to prevent server-side request forgery.',\n citation: { title: 'OWASP Top 10 2021 A10: Server-Side Request Forgery', url: 'https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/' },\n kind: 'relevant_to',\n rationale: 'recommended',\n match: { keywords: ['fetch', 'request', 'webhook', 'proxy'], imports: ['axios', 'node-fetch', 'got', 'undici', 'superagent'], calls: ['fetch', 'request', 'get', 'post'] },\n },\n {\n id: 'owasp-a09-logging',\n topic: 'logging',\n summary:\n 'Log security-relevant events with enough context to detect and investigate, but never log secrets or PII.',\n citation: { title: 'OWASP Top 10 2021 A09: Security Logging & Monitoring Failures', url: 'https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/' },\n kind: 'relevant_to',\n rationale: 'recommended',\n match: { keywords: ['log', 'logger', 'audit', 'trace'], imports: ['winston', 'pino', 'bunyan', 'log4js'] },\n },\n ],\n};\n","import Graph from 'graphology';\nimport type { GraphEdge, GraphNode } from '../schema.js';\n\n/**\n * Build the in-memory graphology multigraph from the schema nodes/edges. This is\n * the model the analysis (centrality, clustering), query, and path commands run\n * over. A directed multigraph: multiple typed edges may connect the same pair\n * (e.g. a `call` and an `import`), each keyed by its content id.\n */\nexport function buildGraphologyGraph(nodes: GraphNode[], edges: GraphEdge[]): Graph {\n const g = new Graph({ type: 'directed', multi: true, allowSelfLoops: true });\n for (const n of nodes) {\n g.addNode(n.id, { kind: n.kind, name: n.name });\n }\n for (const e of edges) {\n // Edges can reference nodes that exist; src/dst always come from node ids we\n // created, so both endpoints are present. Guard anyway for robustness.\n if (!g.hasNode(e.src) || !g.hasNode(e.dst)) continue;\n if (g.hasEdge(e.id)) continue;\n g.addDirectedEdgeWithKey(e.id, e.src, e.dst, { kind: e.kind, weight: e.confidence });\n }\n return g;\n}\n","import { bidirectional } from 'graphology-shortest-path/unweighted.js';\nimport { buildGraphologyGraph } from './graph-model.js';\nimport { indexFor } from './relations.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Shortest connection between two nodes (`vg path`). Uses graphology's\n * bidirectional BFS over the directed graph; falls back to the reverse direction\n * so \"how does A connect to B\" still answers when the dependency arrow runs B→A.\n */\nexport interface PathResult {\n ids: string[];\n direction: 'forward' | 'reverse';\n}\n\nexport function shortestPath(graph: VgGraph, srcId: string, dstId: string): PathResult | null {\n const g = buildGraphologyGraph(graph.nodes, graph.edges);\n if (!g.hasNode(srcId) || !g.hasNode(dstId)) return null;\n const forward = bidirectional(g, srcId, dstId);\n if (forward) return { ids: forward, direction: 'forward' };\n const reverse = bidirectional(g, dstId, srcId);\n if (reverse) return { ids: reverse.slice().reverse(), direction: 'reverse' };\n return null;\n}\n\n/** One-hop usage neighbors used when endpoints are not connected. */\nexport interface EndpointNeighborhood {\n name: string;\n calls: string[];\n calledBy: string[];\n imports: string[];\n importedBy: string[];\n}\n\n/**\n * Actionable disconnect context for `vg path` / `find_path` when BFS finds no\n * route. Agents otherwise treat a bare \"no path\" as a dead end; neighbors make\n * the next query (`show` / `impact` / a different endpoint) obvious.\n */\nexport interface PathDisconnect {\n connected: false;\n from: EndpointNeighborhood;\n to: EndpointNeighborhood;\n hint: string;\n}\n\nconst NEIGHBOR_CAP = 6;\n\nexport function pathDisconnect(graph: VgGraph, srcId: string, dstId: string): PathDisconnect {\n const idx = indexFor(graph);\n const from = neighborhood(idx, srcId);\n const to = neighborhood(idx, dstId);\n const hint =\n from.calls.length || from.calledBy.length || to.calls.length || to.calledBy.length\n ? 'No direct call/import chain links these symbols. Try `vg show` / `vg impact` on each end, or path via a shared hub.'\n : 'Neither endpoint has call/import neighbors in the map — they may be isolated docs/externals, or the link needs a more precise build.';\n return { connected: false, from, to, hint };\n}\n\nfunction neighborhood(\n idx: ReturnType<typeof indexFor>,\n id: string,\n): EndpointNeighborhood {\n const node = idx.node(id);\n const name = node?.qualifiedName ?? id;\n const calls = uniqueNames(idx.callees(id).map((x) => x.node.qualifiedName));\n const calledBy = uniqueNames(idx.callers(id).map((x) => x.node.qualifiedName));\n const imports = uniqueNames(\n idx\n .out(id, 'import')\n .map((e) => idx.node(e.dst)?.qualifiedName)\n .filter((n): n is string => !!n),\n );\n const importedBy = uniqueNames(\n idx\n .in(id, 'import')\n .map((e) => idx.node(e.src)?.qualifiedName)\n .filter((n): n is string => !!n),\n );\n return { name, calls, calledBy, imports, importedBy };\n}\n\nfunction uniqueNames(names: string[]): string[] {\n return [...new Set(names)].sort((a, b) => a.localeCompare(b)).slice(0, NEIGHBOR_CAP);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { GraphIndex, indexFor } from './relations.js';\nimport { impactOf } from './impact.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Answering the wedge questions: \"which tests cover X\" (`vg tests`) and \"which\n * tests must I run if I change X\" (`vg impact --tests`). Deterministic, from the\n * `test` edges + coverage produced at build time.\n */\n\nexport interface CoveringTest {\n file: string; // test file (relative)\n basis: 'call' | 'coverage';\n confidence: number;\n}\n\nexport function coveringTests(graph: VgGraph, node: GraphNode, index?: GraphIndex): CoveringTest[] {\n const idx = index ?? indexFor(graph);\n const byId = idx.nodeById;\n const out = new Map<string, CoveringTest>();\n for (const e of idx.in(node.id, 'test')) {\n const testNode = byId.get(e.src);\n if (!testNode) continue;\n out.set(testNode.file, { file: testNode.file, basis: 'call', confidence: e.confidence });\n }\n // Runtime coverage is a signal even without a specific test attribution.\n if (typeof node.coverage === 'number' && node.coverage > 0 && out.size === 0) {\n out.set('(coverage)', { file: '(coverage report)', basis: 'coverage', confidence: node.coverage });\n }\n return [...out.values()].sort((a, b) => b.confidence - a.confidence || a.file.localeCompare(b.file));\n}\n\nexport interface TestImpact {\n affectedTestFiles: string[];\n untestedAffected: { id: string; name: string; file: string }[];\n}\n\n/** The test files that exercise any node in the impact set of `rootId`. */\nexport function testsToRun(graph: VgGraph, rootId: string, depth = 4): TestImpact {\n const idx = indexFor(graph);\n const impact = impactOf(graph, rootId, { depth });\n const affectedIds = new Set<string>([rootId, ...impact.affected.map((a) => a.id)]);\n\n const testFiles = new Set<string>();\n const untested: { id: string; name: string; file: string }[] = [];\n for (const id of affectedIds) {\n const node = idx.node(id);\n if (!node) continue;\n const covers = coveringTests(graph, node, idx).filter((c) => c.basis === 'call');\n for (const c of covers) testFiles.add(c.file);\n if ((node.kind === 'function' || node.kind === 'method') && node.tested === false) {\n untested.push({ id: node.id, name: node.qualifiedName, file: node.file });\n }\n }\n return {\n affectedTestFiles: [...testFiles].sort(),\n untestedAffected: untested.sort((a, b) => a.name.localeCompare(b.name)),\n };\n}\n\n// --- runner detection ---\n\nexport interface Runner {\n name: string;\n command: (testFiles: string[]) => string;\n}\n\nexport function detectRunner(root: string, lang?: string): Runner {\n const pkgPath = path.join(root, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as { devDependencies?: Record<string, string>; dependencies?: Record<string, string> };\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps.vitest) return { name: 'vitest', command: (f) => `npx vitest run ${f.join(' ')}`.trim() };\n if (deps.jest) return { name: 'jest', command: (f) => `npx jest ${f.join(' ')}`.trim() };\n if (deps.mocha) return { name: 'mocha', command: (f) => `npx mocha ${f.join(' ')}`.trim() };\n } catch {\n /* fall through */\n }\n }\n if (lang === 'py' || fs.existsSync(path.join(root, 'pyproject.toml')) || fs.existsSync(path.join(root, 'pytest.ini'))) {\n return { name: 'pytest', command: (f) => `pytest ${f.join(' ')}`.trim() };\n }\n if (lang === 'go' || fs.existsSync(path.join(root, 'go.mod'))) {\n return { name: 'go test', command: () => 'go test ./...' };\n }\n if (lang === 'cs' || hasFile(root, /\\.csproj$/) || hasFile(root, /\\.sln$/)) {\n return { name: 'dotnet test', command: () => 'dotnet test' };\n }\n if (lang === 'rb') return { name: 'rspec', command: (f) => `bundle exec rspec ${f.join(' ')}`.trim() };\n return { name: 'tests', command: (f) => (f.length ? f.join(' ') : '(no runner detected)') };\n}\n\nfunction hasFile(root: string, re: RegExp): boolean {\n try {\n return fs.readdirSync(root).some((f) => re.test(f));\n } catch {\n return false;\n }\n}\n","/**\n * Keep credential files out of version control automatically.\n *\n * `login` stores a DSN (a credential) and `dsn create --write` writes one to a\n * file. GUARDRAILS §1.1 (\"secrets are git-ignored and never committed\") makes\n * keeping those files out of git a hard requirement — so rather than relying on\n * the user to remember, the CLI adds the file to the project `.gitignore` for\n * them. This module locates the git work tree and appends the entry idempotently,\n * creating `.gitignore` when the repo doesn't have one yet.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Walk up from `startDir` to the git work-tree root — the nearest ancestor that\n * contains a `.git` entry (a directory for a normal clone, a file for a worktree\n * or submodule). Returns `null` when there is no git repo above `startDir`.\n */\nexport function findGitRoot(startDir: string = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n // Walk up until we hit a `.git`, or run out of parents.\n for (;;) {\n if (fs.existsSync(path.join(dir, '.git'))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport type GitignoreStatus = 'added' | 'created' | 'present' | 'not-a-repo';\n\nexport interface GitignoreResult {\n /**\n * - `created` — `.gitignore` did not exist and was created with the entry.\n * - `added` — the entry was appended to an existing `.gitignore`.\n * - `present` — the entry was already there; nothing was written.\n * - `not-a-repo` — `startDir` is not inside a git work tree; nothing was done.\n */\n status: GitignoreStatus;\n entry: string;\n /** The `.gitignore` that was (or would have been) touched; absent when not a repo. */\n gitignorePath?: string;\n}\n\n/** Normalize a `.gitignore` line for comparison: trim, drop `./` and trailing `/`. */\nfunction normalizeEntry(line: string): string {\n return line.trim().replace(/^\\.\\//, '').replace(/\\/+$/, '');\n}\n\n/**\n * Ensure `entry` is listed in the git repo's root `.gitignore`.\n *\n * Defense-in-depth for credential files (see module docstring). The behaviour is:\n * - Not inside a git work tree → `not-a-repo`, no filesystem change. Git isn't\n * tracking anything here, so there is nothing to protect against.\n * - `.gitignore` missing → it is created containing the entry (`created`).\n * - Entry already present (exact match, ignoring `./` and trailing `/`) →\n * `present`, no write. The operation is idempotent — running `login` twice\n * never duplicates the line.\n * - Otherwise the entry is appended (`added`), preserving existing content and\n * fixing a missing trailing newline first.\n */\nexport function ensureGitignored(\n entry: string,\n startDir: string = process.cwd(),\n): GitignoreResult {\n const root = findGitRoot(startDir);\n if (!root) return { status: 'not-a-repo', entry };\n\n const gitignorePath = path.join(root, '.gitignore');\n const target = normalizeEntry(entry);\n\n let existing = '';\n let fileExisted = true;\n try {\n existing = fs.readFileSync(gitignorePath, 'utf8');\n } catch {\n fileExisted = false;\n }\n\n const alreadyPresent = existing\n .split(/\\r?\\n/)\n .some((line) => normalizeEntry(line) === target);\n if (alreadyPresent) return { status: 'present', entry, gitignorePath };\n\n // Keep the file tidy: ensure the prior content ends with a newline before we\n // append, so we never glue our entry onto an existing last line.\n const needsLeadingNewline = existing.length > 0 && !existing.endsWith('\\n');\n fs.appendFileSync(gitignorePath, `${needsLeadingNewline ? '\\n' : ''}${entry}\\n`, 'utf8');\n\n return { status: fileExisted ? 'added' : 'created', entry, gitignorePath };\n}\n","import * as crypto from 'node:crypto';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { writeTextFile } from '../utils/fs.js';\nimport { findGitRoot, ensureGitignored } from '../utils/gitignore.js';\nimport { availableRegionIds, resolveIngestHost } from '../regions.js';\n\n// Re-exported for backwards compatibility with existing importers/tests.\nexport { resolveIngestHost };\n\n/** A freshly provisioned workspace and the credential needed to ingest into it. */\nexport interface ProvisionedWorkspace {\n /** The full DSN string (`vibgrate+https://<keyId>:<secret>@<host>/<workspaceId>`). */\n dsn: string;\n keyId: string;\n workspaceId: string;\n /** The ingest host the workspace was provisioned against (the \"ingest URL\"). */\n ingestHost: string;\n /** The pinned region, or `undefined` for a custom `--ingest` host. */\n region?: string;\n}\n\n/** Mint a fresh keyId/secret pair (keyId: 12 bytes = 24 hex, matches API validation). */\nfunction generateKeyMaterial(): { keyId: string; secret: string } {\n return {\n keyId: crypto.randomBytes(12).toString('hex'),\n secret: crypto.randomBytes(32).toString('hex'),\n };\n}\n\n/** Build a DSN string from its parts. */\nexport function buildDsn(keyId: string, secret: string, ingestHost: string, workspaceId: string): string {\n return `vibgrate+https://${keyId}:${secret}@${ingestHost}/${workspaceId}`;\n}\n\n/**\n * Provision a DSN by calling the API to register the key.\n * This is required when using --workspace new to auto-provision a workspace.\n */\nasync function provisionDsn(\n keyId: string,\n secret: string,\n workspaceId: string,\n ingestHost: string,\n region?: string\n): Promise<{ success: boolean; error?: string }> {\n const url = `https://${ingestHost}/v1/provision`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Connection': 'close', // Prevent keep-alive delays on exit\n },\n // Pin the workspace to the selected region. The API rejects the request\n // if `region` doesn't match the endpoint host (residency guard). For a\n // custom --ingest host we omit it and let the API derive it from the host.\n body: JSON.stringify(region ? { keyId, secret, workspaceId, region } : { keyId, secret, workspaceId }),\n });\n\n if (!response.ok) {\n const result = await response.json() as { error?: string };\n return { success: false, error: result.error || `HTTP ${response.status}` };\n }\n\n return { success: true };\n } catch (e: unknown) {\n return { success: false, error: e instanceof Error ? e.message : String(e) };\n }\n}\n\n/**\n * Provision a brand-new workspace and mint its DSN in the chosen region.\n *\n * Shared by `dsn create --workspace new` and by `login`, which calls this\n * automatically when a freshly-created account has no workspace/DSN yet — so a\n * first-time user is never required to run `dsn create` by hand. Throws an Error\n * with an actionable message (GUARDRAILS §1.3) when resolution or provisioning\n * fails; the caller decides how to surface it.\n */\nexport async function createWorkspaceDsn(opts: { region?: string; ingest?: string }): Promise<ProvisionedWorkspace> {\n const ingestHost = resolveIngestHost(opts.region, opts.ingest);\n const { keyId, secret } = generateKeyMaterial();\n // 16 hex char workspace ID (8 bytes).\n const workspaceId = crypto.randomBytes(8).toString('hex');\n // For a known region we pin it explicitly; for a custom --ingest host the\n // region is left to the API to derive from the host.\n const region = opts.ingest ? undefined : (opts.region ?? 'us').toLowerCase();\n\n const result = await provisionDsn(keyId, secret, workspaceId, ingestHost, region);\n if (!result.success) {\n throw new Error(`Failed to provision workspace: ${result.error}`);\n }\n\n return { dsn: buildDsn(keyId, secret, ingestHost, workspaceId), keyId, workspaceId, ingestHost, region };\n}\n\nexport const dsnCommand = new Command('dsn')\n .description('Manage DSN tokens');\n\ndsnCommand\n .command('create')\n .description('Create a new DSN token')\n .option('--ingest <url>', 'Ingest API URL (overrides --region)')\n .option('--region <region>', `Data residency region (${availableRegionIds().join(', ')})`, 'us')\n .requiredOption('--workspace <id>', 'Workspace ID (use \"new\" to auto-generate)')\n .option('--write <path>', 'Write DSN to file')\n .action(async (opts: { ingest?: string; region: string; workspace: string; write?: string }) => {\n // Generate credentials\n // keyId: 12 bytes = 24 hex chars (matches API validation)\n const keyId = crypto.randomBytes(12).toString('hex');\n const secret = crypto.randomBytes(32).toString('hex');\n\n let ingestHost: string;\n try {\n ingestHost = resolveIngestHost(opts.region, opts.ingest);\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n // Handle --workspace new: auto-generate a workspace ID\n let workspaceId = opts.workspace;\n const isNewWorkspace = opts.workspace.toLowerCase() === 'new';\n \n if (isNewWorkspace) {\n // Generate a 16 hex char workspace ID (8 bytes)\n workspaceId = crypto.randomBytes(8).toString('hex');\n console.log(chalk.dim(`Provisioning new workspace ${workspaceId}...`));\n }\n\n // For a known region we pin it explicitly; for a custom --ingest host the\n // region is left to the API to derive from the host.\n const region = opts.ingest ? undefined : opts.region.toLowerCase();\n\n // When using 'new', we must call the provision API\n if (isNewWorkspace) {\n const result = await provisionDsn(keyId, secret, workspaceId, ingestHost, region);\n if (!result.success) {\n console.error(chalk.red(`Failed to provision DSN: ${result.error}`));\n process.exit(1);\n }\n }\n\n const dsn = buildDsn(keyId, secret, ingestHost, workspaceId);\n\n console.log(chalk.green('✔') + ' DSN created');\n console.log('');\n console.log(chalk.bold('Region:'));\n console.log(` ${region ?? 'custom'} (${ingestHost})`);\n console.log('');\n console.log(chalk.bold('DSN:'));\n console.log(` ${dsn}`);\n console.log('');\n console.log(chalk.bold('Key ID:'));\n console.log(` ${keyId}`);\n if (isNewWorkspace) {\n console.log('');\n console.log(chalk.bold('Workspace ID:'));\n console.log(` ${workspaceId}`);\n }\n console.log('');\n console.log(chalk.dim('Set this as VIBGRATE_DSN in your CI environment.'));\n if (!isNewWorkspace) {\n console.log(chalk.dim('The secret must be registered on your Vibgrate ingest API.'));\n }\n\n if (opts.write) {\n const writePath = path.resolve(opts.write);\n await writeTextFile(writePath, dsn + '\\n');\n console.log('');\n console.log(chalk.green('✔') + ` DSN written to ${opts.write}`);\n\n // The DSN is a credential — keep it out of version control automatically\n // (GUARDRAILS §1.1) rather than relying on the user to remember.\n const root = findGitRoot(path.dirname(writePath));\n const rel = root ? path.relative(root, writePath).split(path.sep).join('/') : '';\n if (root && rel && !rel.startsWith('..')) {\n const res = ensureGitignored(rel, path.dirname(writePath));\n if (res.status === 'created') {\n console.log(chalk.green('✔') + ` Created .gitignore and ignored ${rel}`);\n } else if (res.status === 'added') {\n console.log(chalk.green('✔') + ` Added ${rel} to .gitignore`);\n } else if (res.status === 'present') {\n console.log(chalk.dim(` ${rel} is already in .gitignore`));\n }\n } else {\n console.log(\n chalk.yellow('⚠') +\n ' Add this file to .gitignore to keep the DSN out of version control.',\n );\n }\n }\n });\n","/**\n * Local credential storage for `vibgrate login`.\n *\n * The DSN minted by the browser login flow is cached so subsequent\n * `scan`/`push` runs are authenticated without re-pasting a secret. Two stores\n * are supported; the file location resolves in this precedence:\n * 1. the `VIBGRATE_CREDENTIALS` environment variable — an explicit file path\n * (CI / automation / custom setups)\n * 2. the project-local store `<project>/.vibgrate/credentials.json` when the\n * caller opts in (`vg login --local`)\n * 3. an *existing* project-local store — once you have logged in `--local`,\n * later commands in that project pick it up automatically\n * 4. the home store `~/.vibgrate/credentials.json` — the default, matching the\n * usual convention for CLI credentials (`~/.aws/credentials`, `~/.npmrc`)\n *\n * DSN resolution precedence (which credential a command uses) is separate:\n * 1. an explicit `--dsn` flag\n * 2. the `VIBGRATE_DSN` environment variable (CI / automation)\n * 3. the stored login credential (resolved via the file precedence above)\n */\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { findGitRoot } from './utils/gitignore.js';\n\nexport interface StoredCredentials {\n dsn: string;\n workspaceId?: string;\n keyId?: string;\n ingestHost?: string;\n savedAt: string;\n}\n\n/** Options selecting which credential store a call operates on. */\nexport interface CredentialsLocationOpts {\n /**\n * Force the project-local store (`vg login --local`). Without this, writes go\n * to the home store unless `VIBGRATE_CREDENTIALS` is set.\n */\n local?: boolean;\n /**\n * Base directory used to locate the project-local store. Defaults to the git\n * work-tree root above `process.cwd()`, or `process.cwd()` when not in a repo.\n */\n cwd?: string;\n}\n\nconst STORE_DIRNAME = '.vibgrate';\nconst STORE_FILENAME = 'credentials.json';\n\n/** The home-directory store, `~/.vibgrate/credentials.json` (the default). */\nexport function homeCredentialsPath(): string {\n return path.join(os.homedir(), STORE_DIRNAME, STORE_FILENAME);\n}\n\n/**\n * The project-local store, `<project>/.vibgrate/credentials.json`, where\n * `<project>` is the git work-tree root above `cwd` (or `cwd` itself when not\n * inside a repo). Anchoring at the repo root means a `--local` login done at the\n * repo root is still found when a later command runs from a subdirectory.\n */\nexport function projectCredentialsPath(cwd: string = process.cwd()): string {\n const root = findGitRoot(cwd) ?? cwd;\n return path.join(root, STORE_DIRNAME, STORE_FILENAME);\n}\n\n/** Resolve the credentials file to use, honoring the file precedence above. */\nexport function credentialsPath(opts: CredentialsLocationOpts = {}): string {\n const override = process.env.VIBGRATE_CREDENTIALS?.trim();\n if (override) return path.resolve(override);\n const local = projectCredentialsPath(opts.cwd);\n if (opts.local) return local;\n if (fs.existsSync(local)) return local;\n return homeCredentialsPath();\n}\n\nexport function credentialsDir(opts: CredentialsLocationOpts = {}): string {\n return path.dirname(credentialsPath(opts));\n}\n\n/**\n * The `.gitignore` line that keeps a credentials file out of version control,\n * expressed relative to `repoRoot`. Callers only apply this when the file\n * actually lives inside the repo (the project-local store), so the relative\n * path is well-defined; the fallback covers unusual layouts and is intentionally\n * specific — it must NOT shadow `.vibgrate/graph.json`, which `vg share` commits.\n */\nexport function gitignoreEntryForCredentials(\n repoRoot: string,\n credsFile: string = credentialsPath(),\n): string {\n const rel = path.relative(repoRoot, credsFile);\n if (rel && !rel.startsWith('..') && !path.isAbsolute(rel)) {\n return rel.split(path.sep).join('/');\n }\n return `${STORE_DIRNAME}/${STORE_FILENAME}`;\n}\n\nexport function readStoredCredentials(opts: CredentialsLocationOpts = {}): StoredCredentials | null {\n try {\n const raw = fs.readFileSync(credentialsPath(opts), 'utf8');\n const parsed = JSON.parse(raw) as StoredCredentials;\n return parsed && typeof parsed.dsn === 'string' && parsed.dsn ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function writeStoredCredentials(\n creds: StoredCredentials,\n opts: CredentialsLocationOpts = {},\n): void {\n const file = credentialsPath(opts);\n fs.mkdirSync(path.dirname(file), { recursive: true });\n // Created 0600 from the first byte — a default-umask write would leave the\n // token world-readable until the later chmod lands.\n fs.writeFileSync(file, JSON.stringify(creds, null, 2) + '\\n', { encoding: 'utf8', mode: 0o600 });\n // Best-effort: restrict to the owner (no-op on platforms without POSIX perms).\n try {\n fs.chmodSync(file, 0o600);\n } catch {\n /* ignore */\n }\n}\n\nexport function clearStoredCredentials(opts: CredentialsLocationOpts = {}): boolean {\n try {\n fs.rmSync(credentialsPath(opts));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve the DSN to use for an authenticated operation, honoring the precedence\n * above. Returns undefined when no credential is available anywhere.\n */\nexport function resolveDsn(explicitDsn?: string): string | undefined {\n if (explicitDsn) return explicitDsn;\n if (process.env.VIBGRATE_DSN) return process.env.VIBGRATE_DSN;\n return readStoredCredentials()?.dsn ?? undefined;\n}\n","/**\n * Compact UI purpose evidence for efficient LLM inference\n *\n * Reduces token usage by ~80-90% through:\n * 1. Semantic categorization (pricing, auth, dashboard, etc.)\n * 2. Stem-based deduplication\n * 3. Route normalization\n * 4. Top-N sampling per category\n */\n\nimport type { UiPurposeResult, CompactUiPurpose } from '../types.js';\n\n/** Semantic category patterns for grouping evidence */\nconst CATEGORY_PATTERNS: Array<{ category: string; pattern: RegExp }> = [\n { category: 'pricing', pattern: /price|pricing|billing|subscri|trial|credit|plan|tier|upgrade|premium|pro|enterprise/i },\n { category: 'auth', pattern: /sign[- ]?in|sign[- ]?up|log[- ]?in|log[- ]?out|auth|sso|oauth|password|register|invite|onboard/i },\n { category: 'dashboard', pattern: /dashboard|overview|home|main|summary|stats/i },\n { category: 'settings', pattern: /setting|config|preference|option|profile|account/i },\n { category: 'users', pattern: /user|member|team|role|permission|access|admin|owner/i },\n { category: 'integrations', pattern: /integrat|connect|webhook|api[- ]?key|sync|import|export/i },\n { category: 'reports', pattern: /report|analy|metric|chart|graph|insight|track/i },\n { category: 'workflows', pattern: /workflow|automat|schedule|trigger|action|job|task|pipeline/i },\n { category: 'projects', pattern: /project|workspace|organization|folder|repo/i },\n { category: 'navigation', pattern: /menu|nav|sidebar|header|footer|breadcrumb/i },\n];\n\n/**\n * Compact raw UI evidence into a smaller payload for LLM inference\n */\nexport function compactUiPurpose(result: UiPurposeResult, maxSamplesPerCategory = 3): CompactUiPurpose {\n const evidence = result.topEvidence;\n\n // Extract special kinds\n const dependencies = evidence\n .filter((e) => e.kind === 'dependency')\n .map((e) => e.value)\n .slice(0, 10);\n\n const routes = dedupeRoutes(\n evidence.filter((e) => e.kind === 'route').map((e) => e.value),\n ).slice(0, 15);\n\n // Process text evidence\n const textEvidence = evidence.filter(\n (e) => e.kind !== 'dependency' && e.kind !== 'route' && e.kind !== 'feature_flag',\n );\n\n const byCategory = new Map<string, Set<string>>();\n const categoryCounts: Record<string, number> = {};\n\n for (const item of textEvidence) {\n const category = categorize(item.value);\n if (!byCategory.has(category)) {\n byCategory.set(category, new Set());\n }\n const normalized = normalizeValue(item.value);\n if (normalized.length >= 3) {\n byCategory.get(category)!.add(normalized);\n }\n }\n\n // Build samples\n const samples: Array<{ kind: string; value: string; category: string }> = [];\n\n for (const [category, values] of byCategory) {\n const deduped = dedupeStrings([...values]);\n categoryCounts[category] = deduped.length;\n\n for (const value of deduped.slice(0, maxSamplesPerCategory)) {\n samples.push({ kind: 'text', value, category });\n }\n }\n\n // Add feature flag indicator\n const featureFlags = evidence.filter((e) => e.kind === 'feature_flag');\n if (featureFlags.length > 0) {\n categoryCounts['feature_flags'] = featureFlags.length;\n samples.push({ kind: 'feature_flag', value: 'feature flags detected', category: 'feature_flags' });\n }\n\n return {\n samples,\n categoryCounts,\n originalCount: evidence.length,\n dependencies,\n routes,\n detectedFrameworks: result.detectedFrameworks,\n };\n}\n\n/** Categorize a value into semantic buckets */\nfunction categorize(value: string): string {\n for (const { category, pattern } of CATEGORY_PATTERNS) {\n if (pattern.test(value)) return category;\n }\n return 'general';\n}\n\n/** Normalize a value for deduplication */\nfunction normalizeValue(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, 60);\n}\n\n/** Dedupe strings by prefix/stem similarity */\nfunction dedupeStrings(values: string[]): string[] {\n const sorted = values.sort((a, b) => b.length - a.length);\n const kept: string[] = [];\n\n for (const value of sorted) {\n const isDupe = kept.some((k) => {\n const stem = value.slice(0, 6);\n return k.startsWith(stem) || k.includes(value) || value.includes(k);\n });\n if (!isDupe) {\n kept.push(value);\n }\n }\n\n return kept;\n}\n\n/** Dedupe routes by normalized path structure */\nfunction dedupeRoutes(routes: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n\n for (const route of routes) {\n const normalized = route\n .replace(/:[a-z_]+/gi, ':param')\n .replace(/\\[\\[*\\.*\\.*[a-z_]+\\]*\\]/gi, ':param')\n .replace(/\\/+$/, '')\n .toLowerCase();\n\n if (!seen.has(normalized)) {\n seen.add(normalized);\n result.push(route);\n }\n }\n\n return result;\n}\n","/**\n * Compact scan artifact for efficient upload\n *\n * Reduces artifact size by:\n * 1. Extracting only DB object names (not full CREATE statements)\n * 2. Simplifying API integrations to domains only\n * 3. Using compacted UI purpose evidence\n * 4. Including only first favicon, no logos\n * 5. Capping unbounded arrays\n */\n\nimport * as zlib from 'node:zlib';\nimport { promisify } from 'node:util';\nimport type {\n ScanArtifact,\n DataStoresResult,\n ApiSurfaceResult,\n AssetBrandingResult,\n DatabaseSchemaResult,\n DatabaseSchemaUploadCaps,\n ExtendedScanResults,\n} from '../types.js';\nimport { compactUiPurpose } from './compact-evidence.js';\n\nconst gzip = promisify(zlib.gzip);\n\n/** Max items per array field to prevent bloat */\nconst MAX_ITEMS = 50;\n\n/** Default caps for the `databaseSchema` scanner — a large monorepo can carry\n * hundreds of tables and thousands of columns, so this scanner gets its own\n * (more generous, but still bounded) limits rather than the generic\n * `MAX_ITEMS`. Overridable per-field via `scanners.databaseSchema` in\n * `vibgrate.config.ts` (see DOCS.md § Database Schema), up to\n * `DB_UPLOAD_HARD_CEILING` below. */\nconst MAX_DB_MODELS = 300;\nconst MAX_DB_FIELDS_PER_MODEL = 100;\nconst MAX_DB_MODEL_FILES = 5;\nconst MAX_DB_FILES_SCANNED = 500;\n\n/** Absolute ceiling on the `databaseSchema` upload caps, regardless of what a\n * user configures — mirrored server-side in vibgrate-api's ingest zod schema\n * as a hard `.max()` so a payload can never exceed these bounds even from a\n * misconfigured or non-CLI client. */\nexport const DB_UPLOAD_HARD_CEILING = {\n maxModels: 2000,\n maxFieldsPerModel: 500,\n maxFilesPerModel: 20,\n maxFilesScanned: 5000,\n} as const;\n\nfunction clampCap(configured: number | undefined, fallback: number, ceiling: number): number {\n if (typeof configured !== 'number' || !Number.isFinite(configured) || configured <= 0) return fallback;\n return Math.min(Math.floor(configured), ceiling);\n}\n\n/**\n * Extract just the object name from a \"name (file)\" formatted string\n */\nfunction extractName(entry: string): string {\n const match = entry.match(/^(.+?)\\s*\\(/);\n return match ? match[1].trim() : entry.trim();\n}\n\n/**\n * Compact DataStores result - extract only object names, cap arrays\n */\nexport function compactDataStores(result: DataStoresResult): DataStoresResult {\n return {\n databaseTechnologies: result.databaseTechnologies.slice(0, 10),\n connectionStrings: [], // Don't include connection strings in upload\n connectionPoolSettings: result.connectionPoolSettings.slice(0, MAX_ITEMS),\n replicationSettings: result.replicationSettings.slice(0, 20),\n readReplicaSettings: result.readReplicaSettings.slice(0, 20),\n failoverSettings: result.failoverSettings.slice(0, 20),\n collationAndEncoding: result.collationAndEncoding.slice(0, 20),\n queryTimeoutDefaults: result.queryTimeoutDefaults.slice(0, 20),\n manualIndexes: result.manualIndexes.map(extractName).slice(0, MAX_ITEMS),\n tables: result.tables.map(extractName).slice(0, MAX_ITEMS),\n views: result.views.map(extractName).slice(0, MAX_ITEMS),\n storedProcedures: result.storedProcedures.map(extractName).slice(0, MAX_ITEMS),\n triggers: result.triggers.map(extractName).slice(0, MAX_ITEMS),\n rowLevelSecurityPolicies: result.rowLevelSecurityPolicies.slice(0, 20),\n otherServices: result.otherServices.slice(0, 20),\n };\n}\n\n/**\n * Compact ApiSurface result - simplify to domains, cap arrays\n */\nexport function compactApiSurface(result: ApiSurfaceResult): ApiSurfaceResult {\n // Dedupe integrations by provider domain\n const seenProviders = new Set<string>();\n const uniqueIntegrations = result.integrations.filter((i) => {\n const domain = i.provider.split(':')[0];\n if (seenProviders.has(domain)) return false;\n seenProviders.add(domain);\n return true;\n }).slice(0, MAX_ITEMS).map((i) => ({\n provider: i.provider,\n endpoint: '', // Don't include full endpoints\n version: i.version,\n parameters: [], // Don't include params\n configOptions: [],\n authHints: [],\n files: [], // Don't include file paths\n }));\n\n return {\n integrations: uniqueIntegrations,\n openApiSpecifications: result.openApiSpecifications.slice(0, 10),\n webhookUrls: result.webhookUrls.slice(0, 20),\n callbackEndpoints: result.callbackEndpoints.slice(0, 20),\n apiVersionPins: result.apiVersionPins.slice(0, 20),\n tokenExpirationPolicies: result.tokenExpirationPolicies.slice(0, 20),\n rateLimitOverrides: result.rateLimitOverrides.slice(0, 20),\n customHeaders: result.customHeaders.slice(0, 20),\n corsPolicies: result.corsPolicies.slice(0, 20),\n oauthScopes: result.oauthScopes.slice(0, 20),\n apiTokens: [], // Don't include token references\n };\n}\n\n/**\n * Compact AssetBranding result - first favicon only, no logos\n */\nexport function compactAssetBranding(result: AssetBrandingResult): AssetBrandingResult {\n return {\n faviconFiles: result.faviconFiles.slice(0, 1),\n productLogos: [], // Don't include logos\n };\n}\n\n/**\n * Compact DatabaseSchemaResult — cap models, fields-per-model, and files so a\n * schema-heavy monorepo can't dominate the upload payload. Structural facts\n * only are ever present here to begin with (see `database-schema.ts`); this\n * only trims *how many* of those facts survive, never adds anything new.\n *\n * `caps` lets `scanners.databaseSchema` in `vibgrate.config.ts` raise (or\n * lower) the defaults per-field; each override is clamped to\n * `DB_UPLOAD_HARD_CEILING` so local config can never produce a payload the\n * ingest API's own hard limit would reject outright.\n */\nexport function compactDatabaseSchema(result: DatabaseSchemaResult, caps?: DatabaseSchemaUploadCaps): DatabaseSchemaResult {\n const maxModels = clampCap(caps?.maxModels, MAX_DB_MODELS, DB_UPLOAD_HARD_CEILING.maxModels);\n const maxFieldsPerModel = clampCap(caps?.maxFieldsPerModel, MAX_DB_FIELDS_PER_MODEL, DB_UPLOAD_HARD_CEILING.maxFieldsPerModel);\n const maxFilesPerModel = clampCap(caps?.maxFilesPerModel, MAX_DB_MODEL_FILES, DB_UPLOAD_HARD_CEILING.maxFilesPerModel);\n const maxFilesScanned = clampCap(caps?.maxFilesScanned, MAX_DB_FILES_SCANNED, DB_UPLOAD_HARD_CEILING.maxFilesScanned);\n\n return {\n providers: result.providers.slice(0, MAX_ITEMS),\n models: result.models.slice(0, maxModels).map((model) => ({\n ...model,\n fields: model.fields.slice(0, maxFieldsPerModel),\n files: model.files.slice(0, maxFilesPerModel),\n })),\n enums: result.enums.slice(0, MAX_ITEMS),\n filesScanned: result.filesScanned.slice(0, maxFilesScanned),\n projects: result.projects.slice(0, MAX_ITEMS).map((project) => ({\n project: project.project,\n filesScanned: project.filesScanned.slice(0, MAX_ITEMS),\n models: project.models.slice(0, MAX_ITEMS),\n enums: project.enums.slice(0, MAX_ITEMS),\n })),\n };\n}\n\nexport interface PrepareArtifactForUploadOptions {\n /** Overrides for the `databaseSchema` scanner's upload caps, sourced from\n * `scanners.databaseSchema` in `vibgrate.config.ts`. */\n databaseSchemaCaps?: DatabaseSchemaUploadCaps;\n}\n\n/**\n * Prepare artifact for upload by compacting all extended results\n */\nexport function prepareArtifactForUpload(artifact: ScanArtifact, opts?: PrepareArtifactForUploadOptions): ScanArtifact {\n const compacted = { ...artifact };\n\n if (compacted.extended) {\n const ext: ExtendedScanResults = { ...compacted.extended };\n\n // Compact DataStores\n if (ext.dataStores) {\n ext.dataStores = compactDataStores(ext.dataStores);\n }\n\n // Compact ApiSurface\n if (ext.apiSurface) {\n ext.apiSurface = compactApiSurface(ext.apiSurface);\n }\n\n // Compact AssetBranding\n if (ext.assetBranding) {\n ext.assetBranding = compactAssetBranding(ext.assetBranding);\n }\n\n // Convert UiPurpose to compacted version\n if (ext.uiPurpose) {\n // Replace full UiPurposeResult with CompactUiPurpose structure\n // We store it under the same key but with compacted data\n const compactedUi = compactUiPurpose(ext.uiPurpose);\n // Store as a minimal structure\n ext.uiPurpose = {\n enabled: ext.uiPurpose.enabled,\n detectedFrameworks: compactedUi.detectedFrameworks,\n evidenceCount: compactedUi.originalCount,\n capped: ext.uiPurpose.capped,\n topEvidence: [], // Clear full evidence\n unknownSignals: [],\n // Add compacted data under extended properties\n ...({ compacted: compactedUi } as Record<string, unknown>),\n };\n }\n\n // Cap other potentially large arrays\n if (ext.runtimeConfiguration) {\n ext.runtimeConfiguration = {\n ...ext.runtimeConfiguration,\n environmentVariables: ext.runtimeConfiguration.environmentVariables.slice(0, 100),\n hiddenConfigFiles: ext.runtimeConfiguration.hiddenConfigFiles.slice(0, MAX_ITEMS),\n startupArguments: ext.runtimeConfiguration.startupArguments.slice(0, 100),\n };\n }\n\n if (ext.operationalResilience) {\n const ops = ext.operationalResilience;\n ext.operationalResilience = {\n implicitTimeouts: ops.implicitTimeouts.slice(0, 30),\n defaultPaginationSize: ops.defaultPaginationSize.slice(0, 30),\n implicitRetryLogic: ops.implicitRetryLogic.slice(0, 30),\n defaultLocale: ops.defaultLocale.slice(0, 20),\n defaultCurrency: ops.defaultCurrency.slice(0, 20),\n implicitTimezone: ops.implicitTimezone.slice(0, 20),\n defaultCharacterEncoding: ops.defaultCharacterEncoding.slice(0, 20),\n sessionStores: ops.sessionStores.slice(0, 20),\n distributedLocks: ops.distributedLocks.slice(0, 20),\n jobSchedulers: ops.jobSchedulers.slice(0, 30),\n idempotencyKeys: ops.idempotencyKeys.slice(0, 20),\n rateLimitingCounters: ops.rateLimitingCounters.slice(0, 20),\n circuitBreakerState: ops.circuitBreakerState.slice(0, 20),\n abTestToggles: ops.abTestToggles.slice(0, 20),\n regionalEnablementRules: ops.regionalEnablementRules.slice(0, 20),\n betaAccessGroups: ops.betaAccessGroups.slice(0, 20),\n licensingEnforcementLogic: ops.licensingEnforcementLogic.slice(0, 20),\n killSwitches: ops.killSwitches.slice(0, 20),\n connectorRetryLogic: ops.connectorRetryLogic.slice(0, 20),\n apiPollingIntervals: ops.apiPollingIntervals.slice(0, 20),\n fieldMappings: ops.fieldMappings.slice(0, 20),\n schemaRegistryRules: ops.schemaRegistryRules.slice(0, 20),\n deadLetterQueueBehavior: ops.deadLetterQueueBehavior.slice(0, 20),\n dataMaskingRules: ops.dataMaskingRules.slice(0, 20),\n transformationLogic: ops.transformationLogic.slice(0, 20),\n timezoneHandling: ops.timezoneHandling.slice(0, 20),\n encryptionSettings: ops.encryptionSettings.slice(0, 30),\n hardcodedSecretSignals: ops.hardcodedSecretSignals.slice(0, 20),\n };\n }\n\n // Cap dependencyGraph phantom details\n if (ext.dependencyGraph) {\n ext.dependencyGraph = {\n ...ext.dependencyGraph,\n phantomDependencies: ext.dependencyGraph.phantomDependencies.slice(0, MAX_ITEMS),\n phantomDependencyDetails: ext.dependencyGraph.phantomDependencyDetails?.slice(0, MAX_ITEMS),\n duplicatedPackages: ext.dependencyGraph.duplicatedPackages.slice(0, MAX_ITEMS),\n };\n }\n\n // Cap databaseSchema (models/fields/files) — see compactDatabaseSchema.\n if (ext.databaseSchema) {\n ext.databaseSchema = compactDatabaseSchema(ext.databaseSchema, opts?.databaseSchemaCaps);\n }\n\n compacted.extended = ext;\n }\n\n return compacted;\n}\n\n/**\n * Compress artifact JSON with gzip\n */\nexport async function compressArtifact(artifact: ScanArtifact): Promise<Buffer> {\n const json = JSON.stringify(artifact);\n return gzip(json, { level: 9 });\n}\n\n/**\n * Prepare and compress artifact for upload\n */\nexport async function prepareCompressedUpload(\n artifact: ScanArtifact,\n opts?: PrepareArtifactForUploadOptions,\n): Promise<{ body: Buffer; contentEncoding: 'gzip' }> {\n const compacted = prepareArtifactForUpload(artifact, opts);\n const compressed = await compressArtifact(compacted);\n return { body: compressed, contentEncoding: 'gzip' };\n}\n","/**\n * Scan-artifact upload transport.\n *\n * Centralises the POST /v1/ingest/scan call shared by the `push` and\n * `scan --push` commands, including residency-aware retry: a workspace is\n * pinned to exactly one region, but the DSN (or default) host the CLI uploads\n * to may belong to a different region. When that happens the API rejects the\n * upload with HTTP 409 `REGION_MISMATCH` and names the correct regional\n * endpoint, so we transparently retry against it instead of failing the scan.\n */\n\nimport chalk from 'chalk';\nimport { ingestHostForRegionId } from '../regions.js';\n\nexport interface ScanUploadInput {\n scheme: string;\n host: string;\n keyId: string;\n secret: string;\n body: Buffer;\n contentEncoding: string;\n timestamp: string;\n /** Force a fresh ingest server-side even when the repo is unchanged (skips the\n * duplicate-vcsSha reuse). Set for scheduled and dashboard-triggered scans. */\n force?: boolean;\n /**\n * Run-attribution pair for an automated caller acting on the workspace's\n * behalf (e.g. a Vibgrate-hosted remediation run), read from\n * `VIBGRATE_SCAN_RUN_ID`/`VIBGRATE_SCAN_RUN_TOKEN`. The server verifies the\n * token against the run it minted before granting any exemption — sending\n * an arbitrary or stale value here has no effect, it just fails\n * verification and the scan is billed normally.\n */\n runId?: string;\n runToken?: string;\n}\n\nexport interface ScanUploadResult {\n response: Response;\n /** The host the (final) request was sent to — differs from input.host on a region redirect. */\n host: string;\n}\n\nfunction postOnce(input: ScanUploadInput, host: string): Promise<Response> {\n const url = input.force\n ? `${input.scheme}://${host}/v1/ingest/scan?force=1`\n : `${input.scheme}://${host}/v1/ingest/scan`;\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Encoding': input.contentEncoding,\n 'X-Vibgrate-Timestamp': input.timestamp,\n 'Authorization': `VibgrateDSN ${input.keyId}:${input.secret}`,\n 'Connection': 'close', // Prevent keep-alive delays on exit\n ...(input.runId && input.runToken\n ? { 'X-Vibgrate-Run-Id': input.runId, 'X-Vibgrate-Run-Token': input.runToken }\n : {}),\n },\n body: input.body,\n });\n}\n\n/**\n * Inspect a 409 response for a residency redirect. Returns the correct ingest\n * host only when the response is a `REGION_MISMATCH` that names a region we\n * recognise — we never follow an arbitrary host from the response body.\n */\nasync function regionRedirectHost(response: Response): Promise<string | undefined> {\n try {\n const payload = (await response.clone().json()) as {\n code?: string;\n region?: string;\n };\n if (payload?.code !== 'REGION_MISMATCH' || !payload.region) return undefined;\n return ingestHostForRegionId(payload.region);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Upload a compressed scan artifact, transparently retrying against the\n * workspace's pinned region if the first endpoint reports a residency mismatch.\n */\nexport async function uploadScanArtifact(input: ScanUploadInput): Promise<ScanUploadResult> {\n let host = input.host;\n let response = await postOnce(input, host);\n\n if (response.status === 409) {\n const target = await regionRedirectHost(response);\n if (target && target !== host) {\n console.log(\n chalk.yellow(\n `↻ Workspace is pinned to a different region — retrying upload to ${target}...`,\n ),\n );\n host = target;\n response = await postOnce(input, host);\n }\n }\n\n return { response, host };\n}\n","import * as crypto from 'node:crypto';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { pathExists, readJsonFile } from '../utils/fs.js';\nimport { resolveIngestHost } from './dsn.js';\nimport { resolveDsn } from '../credentials.js';\nimport { availableRegionIds, dashHostForIngestHost } from '../regions.js';\nimport { prepareCompressedUpload } from '../utils/compact-artifact.js';\nimport { uploadScanArtifact } from '../utils/upload.js';\nimport { loadConfig } from '../../core-open/index.js';\nimport type { ScanArtifact } from '../types.js';\n\ninterface ParsedDsn {\n keyId: string;\n secret: string;\n host: string;\n workspaceId: string;\n scheme: 'https' | 'http';\n}\n\nexport function parseDsn(dsn: string): ParsedDsn | null {\n // vibgrate+https://<key_id>:<secret>@<host>/<workspace_id>\n // vibgrate+http://... allowed for local development\n // Strip invisible/control characters (CR, LF, BOM, zero-width, etc.) that may\n // sneak in from Windows .env files, clipboard pastes, or editor artifacts\n const cleaned = dsn\n .replace(/[\\x00-\\x1F\\x7F\\uFEFF\\u200B-\\u200D\\u2060]/g, '') // control chars, BOM, zero-width\n .trim();\n const match = cleaned.match(/^vibgrate\\+(https?):?\\/\\/([^:]+):([^@]+)@([^/]+)\\/(.+)$/);\n if (!match) return null;\n return {\n scheme: match[1] as 'https' | 'http',\n keyId: match[2]!,\n secret: match[3]!,\n host: match[4]!,\n workspaceId: match[5]!,\n };\n}\n\nexport function computeHmac(body: string, secret: string): string {\n return crypto.createHmac('sha256', secret).update(body).digest('base64');\n}\n\nexport const pushCommand = new Command('push')\n .description('Push scan results to Vibgrate API')\n .option('--dsn <dsn>', 'DSN token (or use VIBGRATE_DSN env)')\n .option('--region <region>', `Override data residency region (${availableRegionIds().join(', ')})`)\n .option('--file <file>', 'Scan artifact file', '.vibgrate/scan_result.json')\n .option('--strict', 'Fail on upload errors')\n .action(async (opts: { dsn?: string; region?: string; file: string; strict?: boolean }) => {\n const dsn = resolveDsn(opts.dsn);\n\n if (!dsn) {\n console.error(chalk.red('No DSN provided.'));\n console.error(chalk.dim('Run \"vibgrate login\", set VIBGRATE_DSN, or use the --dsn flag.'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n const parsed = parseDsn(dsn);\n if (!parsed) {\n console.error(chalk.red('Invalid DSN format.'));\n console.error(chalk.dim('Expected: vibgrate+https://<key_id>:<secret>@<host>/<workspace_id>'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n const filePath = path.resolve(opts.file);\n if (!(await pathExists(filePath))) {\n console.error(chalk.red(`Scan artifact not found: ${filePath}`));\n console.error(chalk.dim('Run \"vibgrate scan\" first.'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n // Load artifact, compact it, and compress for upload. `databaseSchemaCaps`\n // lets `scanners.databaseSchema` in vibgrate.config.ts (read from the\n // current directory, same as `vg scan`) raise/lower the default upload\n // caps (see DOCS.md § Database Schema).\n const artifact = await readJsonFile<ScanArtifact>(filePath);\n const config = await loadConfig(process.cwd());\n const databaseSchemaCaps = config.scanners !== false ? config.scanners?.databaseSchema : undefined;\n const { body, contentEncoding } = await prepareCompressedUpload(artifact, { databaseSchemaCaps });\n const timestamp = String(Date.now());\n\n // Allow --region to override the host baked into the DSN\n let host = parsed.host;\n if (opts.region) {\n try {\n host = resolveIngestHost(opts.region);\n } catch (e: unknown) {\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n if (opts.strict) process.exit(1);\n return;\n }\n }\n\n const originalSize = JSON.stringify(artifact).length;\n const compressedSize = body.length;\n const ratio = ((1 - compressedSize / originalSize) * 100).toFixed(0);\n console.log(chalk.dim(`Uploading to ${host}... (${(compressedSize / 1024).toFixed(0)} KB, ${ratio}% smaller)`));\n\n try {\n // Auto-retries against the workspace's pinned region on a 409 REGION_MISMATCH.\n const { response, host: uploadedHost } = await uploadScanArtifact({\n scheme: parsed.scheme,\n host,\n keyId: parsed.keyId,\n secret: parsed.secret,\n body,\n contentEncoding,\n timestamp,\n // Set only by an automated caller running the scan on the workspace's\n // behalf (e.g. a Vibgrate-hosted remediation run) — never a customer flag.\n runId: process.env.VIBGRATE_SCAN_RUN_ID,\n runToken: process.env.VIBGRATE_SCAN_RUN_TOKEN,\n });\n host = uploadedHost;\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`HTTP ${response.status}: ${text}`);\n }\n\n const result = await response.json() as { status: string; ingestId?: string };\n console.log(chalk.green('✔') + ` Scan queued for processing (${result.ingestId ?? 'ok'})`);\n \n // Display feedback prompt\n console.log();\n console.log(chalk.dim('Processing continues in the background. Results available shortly.'));\n console.log();\n \n // Show scan report link\n if (result.ingestId) {\n const dashHost = dashHostForIngestHost(host);\n const reportUrl = `https://${dashHost}/${parsed.workspaceId}/scan/${result.ingestId}`;\n console.log(chalk.dim('View report: ') + chalk.underline(reportUrl));\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(chalk.red(`Upload failed: ${msg}`));\n if (opts.strict) process.exit(1);\n }\n });\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { projectTypeToVulnEcosystem, severityRank, type ScanArtifact, type VulnEcosystem, type VulnerabilityScanResult, type VulnSeverity } from '../core-open/index.js';\nimport { inventory } from '../engine/drift.js';\n\n/**\n * Offline access to vulnerability data for the local MCP server.\n *\n * The local server never touches the network, so it surfaces whatever the last\n * `vg scan --vulns` wrote to `.vibgrate/scan_result.json`. Absent data means\n * \"not scanned\", never \"no vulnerabilities\".\n */\n\n/** Read the most recent local scan artifact, or null if none/unreadable. */\nexport function readScanArtifact(root: string): ScanArtifact | null {\n try {\n const file = path.join(root, '.vibgrate', 'scan_result.json');\n return JSON.parse(fs.readFileSync(file, 'utf8')) as ScanArtifact;\n } catch {\n return null;\n }\n}\n\n/** The vulnerability scan result from the last scan, or null when not scanned. */\nexport function loadVulnerabilities(root: string): VulnerabilityScanResult | null {\n return readScanArtifact(root)?.extended?.vulnerabilities ?? null;\n}\n\n/** The drift target for a package: ecosystem + installed/latest versions. */\nexport interface PackageTarget {\n ecosystem: VulnEcosystem | 'unknown';\n currentVersion: string | null;\n latestVersion: string | null;\n majorsBehind: number | null;\n}\n\n/**\n * Resolve a package's version/drift target — preferring the last scan artifact\n * (richest: resolved + latest + majors behind), falling back to the offline\n * dependency inventory (installed version + ecosystem).\n */\nexport function resolvePackageTarget(root: string, pkg: string): PackageTarget {\n const artifact = readScanArtifact(root);\n for (const project of artifact?.projects ?? []) {\n const dep = project.dependencies?.find((d) => d.package === pkg);\n if (dep) {\n return {\n ecosystem: projectTypeToVulnEcosystem(project.type) ?? 'unknown',\n currentVersion: dep.resolvedVersion,\n latestVersion: dep.latestStable,\n majorsBehind: dep.majorsBehind,\n };\n }\n }\n const rec = inventory(root).records.find((r) => r.name === pkg);\n if (rec) {\n const ecosystem: VulnEcosystem | 'unknown' = rec.ecosystem === 'npm' ? 'npm' : rec.ecosystem === 'pypi' ? 'pypi' : 'unknown';\n return { ecosystem, currentVersion: rec.installed ?? null, latestVersion: rec.latest ?? null, majorsBehind: null };\n }\n return { ecosystem: 'unknown', currentVersion: null, latestVersion: null, majorsBehind: null };\n}\n\n/** Open advisory ids (with a published fix) for a package, from the last scan. */\nexport function openFixableAdvisories(root: string, pkg: string): string[] {\n const vulns = loadVulnerabilities(root);\n const match = vulns?.packages.find((p) => p.package === pkg);\n return (match?.advisories ?? []).filter((a) => a.fixedVersions.length).map((a) => a.id);\n}\n\n/** Filter a result to advisories at or above a minimum severity (packages with none are dropped). */\nexport function filterBySeverity(result: VulnerabilityScanResult, minSeverity?: VulnSeverity): VulnerabilityScanResult {\n if (!minSeverity || minSeverity === 'unknown') return result;\n const floor = severityRank(minSeverity);\n const packages = result.packages\n .map((p) => ({ ...p, advisories: p.advisories.filter((a) => severityRank(a.severity) >= floor) }))\n .filter((p) => p.advisories.length > 0);\n const totalAdvisories = packages.reduce((n, p) => n + p.advisories.length, 0);\n return { ...result, packages, totalAdvisories };\n}\n","import {\n buildVersionTimelines,\n findPackageTimeline,\n gitHistoryAvailable,\n type GitCommitRef,\n type VulnEcosystem,\n} from '../core-open/index.js';\nimport { inventory, type DriftInventory, type DepRecord, type Ecosystem } from '../engine/drift.js';\n\n/**\n * Git-attribution enrichment for the local MCP server.\n *\n * Adds \"who added this dependency / who set the current version\" to the offline\n * drift inventory by replaying each ecosystem's version timeline. It never writes\n * (no cache) so the MCP stays read-only, and degrades to a plain inventory when\n * git history is unavailable.\n */\n\n/** Bounded history depth for the MCP path (no cache writes, so keep first-call cost in check). */\nconst MCP_MAX_COMMITS = 300;\n\n/** Map the inventory's ecosystem to the timeline/advisory ecosystem (where they differ). */\nconst ECOSYSTEM_MAP: Partial<Record<Ecosystem, VulnEcosystem>> = {\n npm: 'npm',\n pypi: 'pypi',\n go: 'go',\n rust: 'cargo',\n ruby: 'rubygems',\n php: 'composer',\n dotnet: 'nuget',\n dart: 'pub',\n // swift (no advisory ecosystem) and java (no resolved lockfile) have no timeline.\n};\n\ninterface CommitBrief {\n sha: string;\n author: string;\n date: string;\n subject: string;\n}\n\nexport interface AttributedDepRecord extends DepRecord {\n /** Commit that first introduced this dependency (git required). */\n addedBy?: CommitBrief;\n /** Commit that set the currently-installed version. */\n currentVersionBy?: CommitBrief;\n}\n\nfunction brief(commit: GitCommitRef): CommitBrief {\n return { sha: commit.shortSha, author: commit.authorName, date: commit.date, subject: commit.subject };\n}\n\n/**\n * Offline drift inventory, optionally enriched with git attribution.\n * `attribution` reports whether git data was actually applied.\n */\nexport async function attributedInventory(\n root: string,\n opts: { attribute?: boolean } = {},\n): Promise<DriftInventory & { records: AttributedDepRecord[]; attribution: 'git' | 'unavailable' | 'off' }> {\n const inv = inventory(root);\n if (!opts.attribute) return { ...inv, attribution: 'off' };\n if (!(await gitHistoryAvailable(root))) return { ...inv, attribution: 'unavailable' };\n\n const timelines = await buildVersionTimelines(root, { maxCommits: MCP_MAX_COMMITS });\n if (!timelines) return { ...inv, attribution: 'unavailable' };\n\n const records: AttributedDepRecord[] = inv.records.map((r) => {\n const ecosystem = ECOSYSTEM_MAP[r.ecosystem];\n if (!ecosystem) return r;\n const pt = findPackageTimeline(timelines, ecosystem, r.name);\n if (!pt || !pt.changes.length) return r;\n return {\n ...r,\n addedBy: brief(pt.changes[0].commit),\n currentVersionBy: brief(pt.changes[pt.changes.length - 1].commit),\n };\n });\n return { ...inv, records, attribution: 'git' };\n}\n","import { encode, decode } from 'gpt-tokenizer/encoding/cl100k_base';\n\n/**\n * Deterministic, offline, no-key token accounting (VG-LIB-SUPERSET-PLAN D5).\n *\n * Uses the `cl100k_base` BPE (gpt-tokenizer, MIT, zero-dep). This is a *budgeting\n * proxy* — not the target model's exact tokenizer (Claude's isn't public) — which\n * is fine because budgets are enforced against this same counter, deterministically.\n */\n\n/** Exact token count under cl100k_base. */\nexport function countTokens(text: string): number {\n return encode(text).length;\n}\n\nexport interface Truncation {\n text: string;\n truncated: boolean;\n /** Token count of the returned `text` (always ≤ budget when truncated). */\n tokens: number;\n}\n\n/**\n * Truncate `text` to at most `budget` tokens — token-accurate, replacing the old\n * `slice(0, budget * 4)` byte heuristic that under-counted tokens and cut entities\n * mid-line. We decode the kept token prefix, then snap back to the last newline so a\n * code block / entity is never left half-emitted, and append `marker` within budget.\n */\nexport function truncateToTokens(text: string, budget: number, marker = '\\n…(truncated)'): Truncation {\n if (!Number.isFinite(budget) || budget <= 0) return { text, truncated: false, tokens: countTokens(text) };\n const tokens = encode(text);\n if (tokens.length <= budget) return { text, truncated: false, tokens: tokens.length };\n\n const markerTokens = encode(marker).length;\n const keep = Math.max(0, budget - markerTokens);\n let slice = decode(tokens.slice(0, keep));\n // Snap to the last line boundary so we never cut an entity mid-line.\n const lastNl = slice.lastIndexOf('\\n');\n if (lastNl > 0) slice = slice.slice(0, lastNl);\n\n const out = slice + marker;\n return { text: out, truncated: true, tokens: countTokens(out) };\n}\n","/**\n * Weights for the deterministic README/doc section selector (engine/select.ts).\n *\n * These are STATIC NUMBERS applied by plain arithmetic at runtime — no ML, no LLM,\n * no network, no key. They are tuned OFFLINE (scripts/tune-selection.mjs) against a\n * corpus of real READMEs with an oracle, then re-cut into this file per release and\n * version-stamped, so a given CLI version selects byte-deterministically. The corpus\n * and tuner stay server-side (the moat); only the resulting weights ship.\n */\nexport interface SelectionWeights {\n headingUsage: number; // heading looks like usage/example/getting-started/api\n headingPreamble: number; // heading looks like install/license/contributing/badges (negative)\n hasCode: number; // section contains a fenced code block\n codeDensity: number; // per additional code block\n queryOverlap: number; // per distinct query term present\n symbolMatch: number; // per exported symbol name present (from the .d.ts surface)\n position: number; // per section index (negative → earlier slightly preferred)\n linkDensity: number; // link/badge-heavy section (negative)\n}\n\n/** Stamp the weights so output is reproducible per CLI version and tunes are auditable. */\nexport const SELECTION_WEIGHTS_VERSION = '2026.06.26-hand-v1';\n\n/** Hand-set v1 baseline. Superseded by tuned weights once the harness runs on the corpus. */\nexport const DEFAULT_SELECTION_WEIGHTS: SelectionWeights = {\n headingUsage: 4,\n headingPreamble: -6,\n hasCode: 3,\n codeDensity: 0.5,\n queryOverlap: 5,\n symbolMatch: 2,\n position: -0.1,\n linkDensity: -3,\n};\n","import { countTokens, truncateToTokens } from './tokens.js';\nimport { DEFAULT_SELECTION_WEIGHTS, type SelectionWeights } from './selection-weights.js';\n\n/**\n * Deterministic, budget-aware doc selection (VG-LIB-SUPERSET-PLAN §7 / S1.x).\n *\n * Replaces naive prefix truncation — which misses the critical chunk when a long\n * README front-loads badges/TOC/install — with priority-layered, relevance-ranked\n * assembly: the typed API surface leads (it's compact + high-value and must survive\n * a tight budget), then README sections are picked by a deterministic score and\n * emitted in reading order, up to the token budget. No LLM, no network, no key; the\n * scoring weights are static (selection-weights.ts), tuned offline.\n */\n\nexport interface Section {\n heading: string;\n level: number;\n body: string;\n}\n\nconst STOPWORDS = new Set(['the', 'a', 'an', 'to', 'of', 'in', 'for', 'and', 'or', 'is', 'how', 'do', 'i', 'use', 'using', 'with', 'on', 'my']);\nconst USAGE_RE = /\\b(usage|example|examples|quick ?start|getting started|api|guide|how to|reference|tutorial|basic)\\b/i;\nconst PREAMBLE_RE = /\\b(install|installation|license|licence|contributing|contributors?|sponsors?|table of contents|toc|changelog|funding|code of conduct|security|acknowledge)\\b/i;\n\n/** Split markdown at ATX headings; content before the first heading is a level-0 section. */\nexport function splitSections(md: string): Section[] {\n const out: Section[] = [];\n let cur: Section = { heading: '', level: 0, body: '' };\n let buf: string[] = [];\n const flush = (): void => {\n const body = buf.join('\\n').trim();\n if (cur.heading || body) out.push({ heading: cur.heading, level: cur.level, body });\n buf = [];\n };\n for (const line of md.split('\\n')) {\n const h = /^(#{1,6})\\s+(.*\\S)\\s*$/.exec(line);\n if (h) {\n flush();\n cur = { heading: h[2].trim(), level: h[1].length, body: '' };\n } else {\n buf.push(line);\n }\n }\n flush();\n return out;\n}\n\n/**\n * Split a section body into paragraph/code-block units (blank-line separated, fences\n * kept intact). Used to sub-select within a heading-less or oversized section so a\n * buried critical paragraph is still recoverable, not just the prefix.\n */\nexport function chunkBody(body: string): string[] {\n const chunks: string[] = [];\n let cur: string[] = [];\n let inFence = false;\n const flush = (): void => {\n const c = cur.join('\\n').trim();\n if (c) chunks.push(c);\n cur = [];\n };\n for (const line of body.split('\\n')) {\n if (/^\\s*```/.test(line)) inFence = !inFence;\n if (!inFence && line.trim() === '') {\n flush();\n continue;\n }\n cur.push(line);\n }\n flush();\n return chunks;\n}\n\n/** Drop badge/shield-only lines (pure `` image rows) — noise, never the answer. */\nexport function stripNoise(body: string): string {\n return body\n .split('\\n')\n .filter((l) => !/^\\s*(?:!\\[[^\\]]*\\]\\([^)]*\\)\\s*)+$/.test(l))\n .join('\\n')\n .trim();\n}\n\nexport function tokenizeQuery(q?: string): string[] {\n if (!q) return [];\n return [...new Set(q.toLowerCase().split(/[^a-z0-9]+/).filter((w) => w.length > 1 && !STOPWORDS.has(w)))];\n}\n\n/** Exported identifier names from a `.d.ts` API surface, used as relevance signal. */\nexport function symbolsFromApi(api?: string): string[] {\n if (!api) return [];\n const out = new Set<string>();\n const re = /\\b(?:function|class|interface|type|const|enum|namespace)\\s+([A-Za-z_$][\\w$]*)/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(api))) out.add(m[1]);\n return [...out];\n}\n\nexport function scoreSection(s: Section, idx: number, queryTerms: string[], symbols: string[], w: SelectionWeights): number {\n const text = `${s.heading}\\n${s.body}`.toLowerCase();\n let score = 0;\n if (USAGE_RE.test(s.heading)) score += w.headingUsage;\n if (PREAMBLE_RE.test(s.heading)) score += w.headingPreamble;\n const codeBlocks = Math.floor((s.body.match(/```/g) ?? []).length / 2);\n if (codeBlocks > 0) score += w.hasCode + Math.min(codeBlocks, 5) * w.codeDensity;\n for (const t of queryTerms) if (text.includes(t)) score += w.queryOverlap;\n for (const sym of symbols) if (sym.length > 2 && text.includes(sym.toLowerCase())) score += w.symbolMatch;\n score += idx * w.position;\n const links = (s.body.match(/\\]\\(|https?:\\/\\//g) ?? []).length;\n const lineCount = Math.max(1, s.body.split('\\n').filter((l) => l.trim()).length);\n if (links / lineCount > 0.5) score += w.linkDensity;\n return score;\n}\n\nexport interface SelectInput {\n readme: string;\n query?: string;\n /** Verbatim `.d.ts` API surface (leads the payload, survives tight budgets). */\n apiSurface?: string;\n budget?: number;\n weights?: SelectionWeights;\n}\n\nexport interface SelectResult {\n text: string;\n tokens: number;\n truncated: boolean;\n}\n\nconst apiBlock = (api?: string): string => (api ? `## API (types)\\n\\n\\`\\`\\`ts\\n${api}\\n\\`\\`\\`` : '');\n\n/**\n * Assemble docs to a token budget. Unbudgeted → README then API (familiar full\n * output). Budgeted → API surface first (priority), then README sections ranked by\n * score and emitted in reading order, until the budget is hit.\n */\nexport function selectForBudget(input: SelectInput): SelectResult {\n const w = input.weights ?? DEFAULT_SELECTION_WEIGHTS;\n const api = apiBlock(input.apiSurface);\n const readme = input.readme.trim();\n\n if (!input.budget || !Number.isFinite(input.budget)) {\n const full = [readme, api].filter(Boolean).join('\\n\\n');\n return { text: full, tokens: countTokens(full), truncated: false };\n }\n const budget = input.budget;\n const queryTerms = tokenizeQuery(input.query);\n const symbols = symbolsFromApi(input.apiSurface);\n\n const render = (s: Section): string => {\n const body = stripNoise(s.body);\n if (!body) return ''; // heading-only / badge-only sections carry no answer\n return `${s.heading ? `## ${s.heading}\\n` : ''}${body}`.trim();\n };\n\n // Drop preamble (install/license/TOC/contributing/badges) ALWAYS — never the answer.\n const sections = splitSections(readme).filter((s) => !PREAMBLE_RE.test(s.heading));\n\n // If everything that matters (API + non-preamble, noise-stripped sections) fits the\n // budget, return it whole in reading order — preamble-trimmed, but NOT \"truncated\".\n const full = [api, ...sections.map(render)].filter(Boolean).join('\\n\\n').trim();\n if (countTokens(full) <= budget) {\n return { text: full, tokens: countTokens(full), truncated: false };\n }\n\n // Over budget → relevance-ranked assembly. Expand oversized / heading-less sections into\n // paragraph units so a buried critical paragraph is still recoverable (not just the prefix).\n const units: Section[] = [];\n for (const s of sections) {\n if (countTokens(s.body) > budget) {\n chunkBody(s.body).forEach((p, i) => units.push({ heading: i === 0 ? s.heading : '', level: s.level, body: p }));\n } else {\n units.push(s);\n }\n }\n const ranked = units\n .map((s, idx) => ({ s, idx, score: scoreSection(s, idx, queryTerms, symbols, w) }))\n .sort((a, b) => b.score - a.score || a.idx - b.idx);\n\n const out: string[] = [];\n let used = 0;\n const add = (chunk: string): boolean => {\n const t = countTokens(chunk);\n if (used + t <= budget) {\n out.push(chunk);\n used += t;\n return true;\n }\n return false;\n };\n\n // Layer 1: API surface leads (truncate only if it alone exceeds the budget).\n if (api && !add(api) && used < budget) {\n out.push(truncateToTokens(api, budget - used).text);\n used = budget;\n }\n\n // Layer 2: greedily pick top-scored units within budget, emit in document order.\n const picked: number[] = [];\n for (const { s, idx } of ranked) {\n const chunk = render(s);\n if (!chunk) continue;\n if (used + countTokens(`\\n${chunk}`) <= budget) {\n picked.push(idx);\n used += countTokens(`\\n${chunk}`);\n }\n }\n picked.sort((a, b) => a - b);\n for (const idx of picked) out.push(render(units[idx]));\n\n // Use leftover budget on a truncated head of the top-ranked unpicked unit.\n if (used < budget - 20) {\n const next = ranked.find((r) => !picked.includes(r.idx) && render(r.s));\n if (next) {\n const head = truncateToTokens(render(next.s), budget - used).text;\n if (head.trim()) out.push(head);\n }\n }\n\n const text = out.join('\\n\\n').trim();\n return { text, tokens: countTokens(text), truncated: true };\n}\n","import { countTokens } from './tokens.js';\nimport { tokenizeQuery } from './select.js';\n\n/**\n * Deterministic quality gate for locally-extracted docs (VG-LIB-SUPERSET-PLAN D1/D18).\n *\n * Decides whether the on-disk extraction is good enough to serve, or whether we should\n * **fall through to the hosted catalog** (S2) for a better answer. Pure regex/keyword\n * checks — no LLM, no network — so the decision is free and deterministic. A doc is\n * \"sufficient\" when it shows a runnable example, isn't a stub, and is on-topic for the\n * query; otherwise it's a candidate for hosted escalation.\n *\n * Focused API queries are strict: identifier-shaped terms (camelCase / PascalCase /\n * snake_case) must appear verbatim, and multi-term queries need a majority of terms.\n * That stops a generic README with one overlapping word (e.g. \"middleware\") from being\n * marked sufficient for \"JWT middleware\" or \"createMiddleware\".\n */\nexport interface DocQuality {\n score: number;\n sufficient: boolean;\n reasons: string[]; // why it fell short (empty when sufficient)\n}\n\nexport interface QualityOpts {\n name?: string;\n query?: string;\n symbols?: string[];\n minTokens?: number;\n /**\n * When true, the payload is only a package README (no typed API surface, no\n * package docs/). Focused API queries against README-only sources are never\n * treated as sufficient — agents should fall through to hosted or read types.\n */\n readmeOnly?: boolean;\n}\n\n/** camelCase / PascalCase / snake_case / kebab identifiers long enough to be API-shaped. */\nconst IDENT_RE = /^(?:[A-Za-z][a-z0-9]*[A-Z][A-Za-z0-9]*|[a-z][a-z0-9]*(?:_[a-z0-9]+)+|[a-z][a-z0-9]*(?:-[a-z0-9]+)+)$/;\n\n/** Tokens that look like real API symbols (not generic prose words). */\nexport function identifierTerms(query?: string): string[] {\n if (!query) return [];\n // Keep original casing tokens before lowercasing so we can detect camelCase.\n const raw = [...new Set(query.split(/[^A-Za-z0-9_-]+/).filter((w) => w.length > 2))];\n return raw.filter((t) => IDENT_RE.test(t) || (t.length >= 6 && /[A-Z]/.test(t) && /[a-z]/.test(t)));\n}\n\nexport function assessDocQuality(content: string, opts: QualityOpts = {}): DocQuality {\n const minTokens = opts.minTokens ?? 60;\n const lc = content.toLowerCase();\n const reasons: string[] = [];\n let score = 0;\n\n // 1. Has a runnable example (fenced or indented code) — docs without one are low-value.\n const hasCode = /```/.test(content) || /(^|\\n)( {4}|\\t)\\S/.test(content);\n if (hasCode) score += 2;\n else reasons.push('no code example');\n\n // 2. Not a stub.\n const tokens = countTokens(content);\n if (tokens >= minTokens) score += 1;\n else reasons.push(`thin (${tokens} tokens)`);\n\n // 3. Mentions the library itself.\n const bareName = opts.name?.toLowerCase().replace(/^@[^/]+\\//, '');\n if (bareName && bareName.length > 1) {\n if (lc.includes(bareName)) score += 1;\n else reasons.push('library name absent');\n }\n\n // 4. On-topic for the query (if one was given).\n const qt = tokenizeQuery(opts.query);\n const idents = identifierTerms(opts.query);\n let onTopic = qt.length === 0;\n if (qt.length) {\n // Identifier-shaped query terms must appear (case-insensitive). A single\n // overlapping prose word must not green-light an API lookup.\n const missingIdents = idents.filter((id) => !lc.includes(id.toLowerCase()));\n if (missingIdents.length) {\n reasons.push(`API symbol(s) absent: ${missingIdents.join(', ')}`);\n onTopic = false;\n } else {\n const hits = qt.filter((t) => lc.includes(t)).length;\n // Strict majority of terms (2-of-2, 2-of-3, 3-of-4, …) — a single shared word\n // like \"middleware\" must not green-light \"JWT middleware\".\n const need = Math.max(1, Math.floor(qt.length / 2) + 1);\n if (hits >= need) {\n score += Math.min(hits, 2);\n onTopic = true;\n } else {\n reasons.push(hits === 0 ? 'query terms absent' : `query terms weak (${hits}/${qt.length})`);\n onTopic = false;\n }\n }\n }\n\n // 5. Surfaces at least one real API symbol (when we have a .d.ts surface).\n if (opts.symbols?.length) {\n if (opts.symbols.some((s) => s.length > 2 && lc.includes(s.toLowerCase()))) score += 1;\n else reasons.push('no API symbols present');\n }\n\n // 6. README-only + focused API query → never sufficient. A package README rarely\n // answers createMiddleware / refine / useQuery; agents must not trust score ≥ 6.\n if (opts.readmeOnly && (idents.length > 0 || qt.length >= 2)) {\n onTopic = false;\n if (!reasons.includes('README-only source cannot answer a focused API query')) {\n reasons.push('README-only source cannot answer a focused API query');\n }\n score = Math.min(score, 4); // cap so agents don't treat this as high-confidence\n }\n\n // Gate: a usable doc has an example, isn't a stub, and is on-topic.\n const sufficient = hasCode && tokens >= minTokens && onTopic;\n return { score, sufficient, reasons };\n}\n","/**\n * Hosted catalog fall-through client (VG-LIB-SUPERSET-PLAN D7/D18, S2.4).\n *\n * The CLI is local-first: it serves the on-disk answer for free, offline, no key. This\n * client is the OPT-IN escalation seam — only consulted when (a) the user passed `--online`\n * (and not `--local`), AND (b) the deterministic quality gate (engine/quality.ts) judged the\n * local extraction insufficient. It calls the public hosted catalog (the §4 canonical shape\n * over HTTP) and returns a better answer, or `null`.\n *\n * Hard guarantees: it NEVER throws and NEVER blocks the local path — any failure (offline,\n * timeout, non-200, unparseable, not-yet-deployed) resolves to `null`, so `vg lib` always\n * still prints the best local answer. No key is sent; the public catalog is anonymous (the\n * no-key funnel, D7).\n *\n * Endpoint: the SAME regional ingest host the CLI already uses for `scan`/`push`\n * (`us.ingest.vibgrate.com` by default, region-aware), resolved via `resolveIngestHost` —\n * the lib catalog rides the existing API surface rather than a separate host. Overridable\n * by `--region`/`--ingest` (like scans) or `VIBGRATE_LIB_HOST`.\n */\nimport { resolveIngestHost } from '../reporting/regions.js';\n\nexport interface HostedDocsRequest {\n name?: string;\n targetId?: string;\n query?: string;\n verbosity?: 'concise' | 'balanced' | 'exhaustive';\n maxTokens?: number;\n}\n\nexport interface HostedDocsResult {\n content: string;\n version: string | null;\n source: 'hosted';\n metadata?: Record<string, unknown>;\n}\n\nexport interface HostedOptions {\n /** Raw base URL override; else VIBGRATE_LIB_HOST env; else the resolved ingest host. */\n base?: string;\n /** Data-residency region (us/eu/…), same as scans. Defaults to us. */\n region?: string;\n /** Explicit ingest URL override (host extracted), same as scans (wins over region). */\n ingest?: string;\n /** Optional DSN identity — sends the `VibgrateDSN` header so the call gets the workspace tier. */\n auth?: { keyId: string; secret: string };\n timeoutMs?: number;\n /** Injectable for tests; defaults to global fetch (undefined → disabled, returns null). */\n fetchImpl?: typeof fetch;\n}\n\n/** Resolve the hosted base URL: explicit base / env → the regional ingest host (default us). */\nexport function hostedBase(opts: { base?: string; region?: string; ingest?: string } = {}): string {\n const explicit = opts.base || process.env.VIBGRATE_LIB_HOST;\n if (explicit) return explicit.replace(/\\/+$/, '');\n let host: string;\n try {\n host = resolveIngestHost(opts.region, opts.ingest); // same host the CLI uses for scan/push\n } catch {\n host = 'us.ingest.vibgrate.com'; // fail safe to the default region\n }\n return `https://${host}`;\n}\n\n/**\n * Ask the hosted catalog for docs. Returns the hosted answer, or `null` on ANY failure\n * (so the caller keeps the local answer). Never throws.\n */\nexport async function fetchHostedDocs(req: HostedDocsRequest, opts: HostedOptions = {}): Promise<HostedDocsResult | null> {\n const f = opts.fetchImpl ?? (globalThis.fetch as typeof fetch | undefined);\n if (!f) return null; // no fetch available → stay local\n const url = `${hostedBase(opts)}/v1/lib/docs`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), opts.timeoutMs ?? 4000);\n const headers: Record<string, string> = { 'content-type': 'application/json' };\n if (opts.auth) {\n // Identify the workspace for higher rate limits + tracking (same DSN auth as scan/push).\n headers['Authorization'] = `VibgrateDSN ${opts.auth.keyId}:${opts.auth.secret}`;\n headers['X-Vibgrate-Timestamp'] = String(Date.now());\n }\n try {\n const res = await f(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n name: req.name,\n targetId: req.targetId,\n query: req.query,\n verbosity: req.verbosity,\n max_tokens: req.maxTokens,\n }),\n signal: ctrl.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { content?: unknown; docs?: unknown; version?: unknown; metadata?: unknown };\n const content = typeof data.content === 'string' ? data.content : typeof data.docs === 'string' ? data.docs : '';\n if (!content.trim()) return null;\n return {\n content,\n version: typeof data.version === 'string' ? data.version : null,\n source: 'hosted',\n metadata: (data.metadata as Record<string, unknown> | undefined) ?? undefined,\n };\n } catch {\n return null; // offline / timeout / parse error — fail closed to local\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport interface PublishRequest {\n name: string;\n version: string;\n readme?: string;\n dts?: string;\n compliance?: string[];\n language?: string;\n sourceUrl?: string;\n}\nexport interface PublishOk {\n ok: true;\n targetId: string;\n ecosystem: string;\n entities: number;\n indexedTokens: number;\n}\nexport interface PublishErr {\n ok: false;\n status: number;\n error?: string;\n message?: string;\n}\n\n/**\n * Publish a PRIVATE library to the hosted catalog (`POST /v1/lib/private`, S6). Unlike the read\n * path, this is an explicit user write, so it SURFACES errors (no fail-closed): a DSN is required\n * (workspace identity), the workspace must be on a paid plan (402), and the result reports the\n * indexed token cost charged to the MCP-token meter.\n */\nexport async function publishPrivateLibrary(req: PublishRequest, opts: HostedOptions = {}): Promise<PublishOk | PublishErr> {\n const f = opts.fetchImpl ?? (globalThis.fetch as typeof fetch | undefined);\n if (!f) return { ok: false, status: 0, message: 'no network available' };\n if (!opts.auth) return { ok: false, status: 401, message: 'a DSN is required to publish a private library (run `vibgrate login` or set VIBGRATE_DSN)' };\n const url = `${hostedBase(opts)}/v1/lib/private`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), opts.timeoutMs ?? 15000);\n try {\n const res = await f(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n Authorization: `VibgrateDSN ${opts.auth.keyId}:${opts.auth.secret}`,\n 'X-Vibgrate-Timestamp': String(Date.now()),\n },\n body: JSON.stringify({\n name: req.name,\n version: req.version,\n readme: req.readme,\n dts: req.dts,\n compliance: req.compliance,\n language: req.language,\n sourceUrl: req.sourceUrl,\n }),\n signal: ctrl.signal,\n });\n const data = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) return { ok: false, status: res.status, error: typeof data.error === 'string' ? data.error : undefined, message: typeof data.message === 'string' ? data.message : undefined };\n return {\n ok: true,\n targetId: String(data.targetId ?? ''),\n ecosystem: String(data.ecosystem ?? ''),\n entities: Number(data.entities) || 0,\n indexedTokens: Number(data.indexedTokens) || 0,\n };\n } catch (err) {\n return { ok: false, status: 0, message: err instanceof Error ? err.message : 'request failed' };\n } finally {\n clearTimeout(timer);\n }\n}\n","/**\n * On-disk TTL cache for hosted `/v1/lib/docs` answers, so repeat lookups of the same library\n * docs are instant and offline-tolerant. Lives under `.vibgrate/cache/` (gitignored, like the\n * parse cache) and is a pure performance layer: a cache miss falls through to `fetchHostedDocs`,\n * every failure path degrades to \"no cache\" (never throws, never blocks the local-first answer),\n * and entries expire after `ttlMs` so version bumps and catalog refreshes surface within a day.\n *\n * Keying is exact-request: name/targetId/query/verbosity/budget PLUS the resolved host and the\n * caller's DSN key id — a workspace-tier answer (which may include PRIVATE docs) is never served\n * to a different identity or an anonymous call from the cache.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { cacheDir } from './cache.js';\nimport { fetchHostedDocs, hostedBase, type HostedDocsRequest, type HostedDocsResult, type HostedOptions } from './hosted.js';\n\nconst CACHE_VERSION = 'vg-hosted-docs/1';\n/** Default freshness window — hosted docs change at most with catalog re-ingests. */\nexport const HOSTED_DOCS_TTL_MS = 24 * 60 * 60 * 1000;\n/** Bounded file size: oldest entries are evicted beyond this. */\nconst MAX_ENTRIES = 64;\n\ninterface CacheEntry {\n at: number;\n result: HostedDocsResult;\n}\ninterface CacheFile {\n version: string;\n entries: Record<string, CacheEntry>;\n}\n\nfunction cachePath(root: string): string {\n return path.join(cacheDir(root), 'hosted-docs.json');\n}\n\n/** Deterministic cache key over the request identity (see module doc for why auth is included). */\nexport function hostedDocsCacheKey(req: HostedDocsRequest, opts: HostedOptions = {}): string {\n const material = JSON.stringify([\n req.name ?? '',\n req.targetId ?? '',\n req.query ?? '',\n req.verbosity ?? '',\n req.maxTokens ?? 0,\n hostedBase(opts),\n opts.auth?.keyId ?? 'anon',\n ]);\n return createHash('sha256').update(material).digest('hex');\n}\n\nfunction loadFile(root: string): CacheFile {\n try {\n const parsed = JSON.parse(fs.readFileSync(cachePath(root), 'utf8')) as CacheFile;\n if (parsed && parsed.version === CACHE_VERSION && parsed.entries && typeof parsed.entries === 'object') return parsed;\n } catch {\n /* missing or corrupt — start fresh */\n }\n return { version: CACHE_VERSION, entries: {} };\n}\n\nfunction saveFile(root: string, file: CacheFile): void {\n try {\n // Evict oldest beyond the cap so the file stays small.\n const keys = Object.keys(file.entries);\n if (keys.length > MAX_ENTRIES) {\n for (const k of keys.sort((a, b) => file.entries[a].at - file.entries[b].at).slice(0, keys.length - MAX_ENTRIES)) {\n delete file.entries[k];\n }\n }\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(cachePath(root), JSON.stringify(file));\n } catch {\n /* a failed cache write must never fail the lookup */\n }\n}\n\nexport interface HostedCacheOptions extends HostedOptions {\n /** Freshness window; entries older than this re-fetch. Default HOSTED_DOCS_TTL_MS. */\n ttlMs?: number;\n /** Injectable clock for tests. */\n now?: () => number;\n /** Skip reading (still writes) — e.g. an explicit refresh. */\n bypass?: boolean;\n}\n\n/**\n * `fetchHostedDocs` behind the disk cache: a fresh hit answers instantly (flagged\n * `metadata.cached: true`); a miss fetches and caches only REAL answers (nulls — offline,\n * rate-capped, not found — are never cached, so the next call retries).\n */\nexport async function fetchHostedDocsCached(root: string, req: HostedDocsRequest, opts: HostedCacheOptions = {}): Promise<HostedDocsResult | null> {\n const now = opts.now ?? Date.now;\n const ttl = opts.ttlMs ?? HOSTED_DOCS_TTL_MS;\n const key = hostedDocsCacheKey(req, opts);\n const file = loadFile(root);\n\n if (!opts.bypass) {\n const hit = file.entries[key];\n if (hit && now() - hit.at < ttl && hit.result?.content) {\n return { ...hit.result, metadata: { ...(hit.result.metadata ?? {}), cached: true } };\n }\n }\n\n const result = await fetchHostedDocs(req, opts);\n if (result) {\n file.entries[key] = { at: now(), result };\n saveFile(root, file);\n }\n return result;\n}\n","/**\n * Centralised rendering for local `vg serve` MCP tool results.\n *\n * Token economy (why this module exists): a tool result is not paid for once.\n * It is sent to the model when the tool returns, then re-sent inside the\n * conversation context on *every subsequent assistant turn* for the rest of the\n * session. So a few hundred wasted tokens in one response are paid dozens of\n * times over. Cheap, mostly-lossless levers live here:\n *\n * 1. **Compact serialisation** (`toolResult`). The text block has no\n * pretty-print indentation — pure whitespace the model never reasons over.\n * Byte-for-byte lossless; see `response.test.ts` for the measured reduction.\n *\n * 2. **Empty-field compaction** (`compactResult`). Drops `null`/empty fields the\n * model can't use — the upload path's redundancy-stripping applied to MCP.\n *\n * 3. **Token ceiling** (`clampToBudget`). The offline counterpart of the hosted\n * server's 25k-token budget, so no single result can flood the window.\n *\n * 4. **Honest list bounds** (`boundList`). Caps an array while always reporting\n * the true total, so elision is visible and the model can ask for more.\n *\n * `renderToolResult` runs 1–3 together; tools opt into `boundList` where needed.\n *\n * Determinism: compact `JSON.stringify` preserves key insertion order; pruning\n * and trimming keep stable prefixes, so output stays stable for equal input.\n */\n\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { countTokens } from '../engine/tokens.js';\n\n/**\n * Hard token ceiling for any single local tool result — the offline counterpart\n * of the hosted MCP's 25,000-token budget (GUARDRAILS §2.3). The local server\n * had no ceiling, so a hub `get_node` or a monorepo-wide `check_drift` could\n * return an unbounded payload. `clampToBudget` enforces this for every tool.\n */\nexport const MAX_RESULT_TOKENS = 25_000;\n\n/**\n * Render a handler's return value into the MCP tool-result shape, applying the\n * full token-economy pipeline: drop empty/absent fields (`compactResult`),\n * enforce the token ceiling (`clampToBudget`), then serialise compactly. The\n * text block and `structuredContent` are the *same* shaped object, so a\n * structured-aware host and a text-only host see identical data.\n */\nexport function renderToolResult(result: unknown, maxTokens = MAX_RESULT_TOKENS): CallToolResult {\n return toolResult(clampToBudget(compactResult(result), maxTokens));\n}\n\n/**\n * Low-level renderer: compact JSON in the text block (token-lean);\n * `structuredContent` carries the same object for programmatic hosts. Prefer\n * `renderToolResult`, which also compacts and clamps.\n */\nexport function toolResult(result: unknown): CallToolResult {\n return {\n content: [{ type: 'text', text: JSON.stringify(result) }],\n structuredContent: asStructured(result),\n };\n}\n\n/**\n * Drop fields that carry no information for the model — `null`/`undefined`,\n * empty strings, empty arrays, and empty objects — recursively. This is the\n * upload path's \"don't ship empties / cap redundancy\" philosophy applied to\n * MCP responses (the upload's scan-artifact compactors target data the local\n * server never serves, so the *technique*, not that code, is what transfers).\n *\n * Lossless for an AI consumer: an absent field reads identically to an explicit\n * `null`/empty. Meaningful falsy values (`false`, `0`) are preserved.\n */\nexport function compactResult<T>(value: T): T {\n return prune(value) as T;\n}\n\nfunction prune(v: unknown): unknown {\n if (Array.isArray(v)) return v.map(prune);\n if (v && typeof v === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, raw] of Object.entries(v as Record<string, unknown>)) {\n const pv = prune(raw);\n if (!isEmpty(pv)) out[k] = pv;\n }\n return out;\n }\n return v;\n}\n\nfunction isEmpty(v: unknown): boolean {\n if (v === null || v === undefined || v === '') return true;\n if (Array.isArray(v)) return v.length === 0;\n if (typeof v === 'object') return Object.keys(v as object).length === 0;\n return false; // false / 0 / non-empty values are meaningful\n}\n\n/**\n * Enforce a token ceiling on an object-shaped result by trimming its heaviest\n * array fields (halving the largest token contributor until under budget) and\n * recording what was elided under `_truncated`. Array-rooted results (the\n * `list_*` tools) are already bounded by their own `limit`, so they pass\n * through untouched. Deterministic: trimming keeps a stable prefix.\n */\nexport function clampToBudget<T>(value: T, maxTokens = MAX_RESULT_TOKENS): T {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value;\n if (tokensOf(value) <= maxTokens) return value;\n\n const obj: Record<string, unknown> = { ...(value as Record<string, unknown>) };\n const truncated: Record<string, { shown: number; total: number }> = {};\n // Bounded loop: each pass halves one array, so it converges quickly.\n for (let guard = 0; guard < 64 && tokensOf(obj) > maxTokens; guard++) {\n const arrays = Object.entries(obj).filter(\n (e): e is [string, unknown[]] => Array.isArray(e[1]) && e[1].length > 0,\n );\n if (arrays.length === 0) break; // nothing left to trim\n arrays.sort((a, b) => tokensOf(b[1]) - tokensOf(a[1]));\n const [field, arr] = arrays[0];\n const total = truncated[field]?.total ?? arr.length;\n const shown = Math.max(1, Math.floor(arr.length / 2));\n obj[field] = arr.slice(0, shown);\n truncated[field] = { shown, total };\n }\n if (Object.keys(truncated).length) obj._truncated = truncated;\n return obj as T;\n}\n\nfunction tokensOf(v: unknown): number {\n return countTokens(JSON.stringify(v));\n}\n\n/** structuredContent must be an object; wrap arrays/primitives so it always is. */\nexport function asStructured(result: unknown): Record<string, unknown> {\n if (result && typeof result === 'object' && !Array.isArray(result)) {\n return result as Record<string, unknown>;\n }\n return { result };\n}\n\nexport interface Bounded<T> {\n /** At most `max` items, in the input's (already deterministic) order. */\n items: T[];\n /** The true count before bounding — never silently dropped. */\n total: number;\n}\n\n/**\n * Cap a list to `max` items while reporting the real total. Callers surface\n * both `items` and `total` so truncation is always visible to the model.\n */\nexport function boundList<T>(items: T[], max: number): Bounded<T> {\n if (!Number.isFinite(max) || max < 0 || items.length <= max) {\n return { items, total: items.length };\n }\n return { items: items.slice(0, max), total: items.length };\n}\n\n/**\n * Default cap for a single node's relationship arrays (`calls`/`calledBy`). A\n * central hub can have hundreds of callers; the first N ranked entries answer\n * almost every question, and the total tells the model when to dig deeper\n * (e.g. via `impact_of`).\n */\nexport const NODE_EDGE_CAP = 50;\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { queryGraph, queryGraphSemantic } from '../engine/query.js';\nimport type { DaemonSemanticSession } from '../runtime/vgd/semantic-client.js';\nimport { analyzeQuestion } from '../engine/relevance-provider.js';\nimport { loadTopicTags } from '../engine/relevance-enrich.js';\nimport { loadEmbedder, getNodeEmbeddings, isModelReady, withTimeout, type Embedder } from '../engine/embeddings.js';\nimport { resolveOne } from '../engine/lookup.js';\nimport { indexFor } from '../engine/relations.js';\nimport { pathDisconnect, shortestPath } from '../engine/paths.js';\nimport { impactOf } from '../engine/impact.js';\nimport { coveringTests } from '../engine/test-query.js';\nimport { loadOrDiscoverFederation } from '../runtime/federation.js';\nimport { highConfidenceBridges } from '../runtime/bridge-edges.js';\nimport { repositoryIdFromRoot } from '../runtime/paths.js';\nimport { parseGraph } from '../engine/serialize.js';\nimport { loadVulnerabilities, filterBySeverity, resolvePackageTarget, openFixableAdvisories } from './vuln-data.js';\nimport { attributedInventory } from './attribution.js';\nimport { computeUpgradeImpact, getChangelogSignals, type VulnSeverity } from '../core-open/index.js';\nimport { discoverModels } from '../engine/models.js';\nimport { FREE_PACK } from '../grounding/pack.js';\nimport { loadCatalog, resolveLib, readDoc, driftFor, resolveVersion, localPackageDocs, localApiSurface } from '../engine/lib.js';\nimport { selectForBudget, symbolsFromApi } from '../engine/select.js';\nimport { assessDocQuality } from '../engine/quality.js';\nimport { fetchHostedDocsCached } from '../engine/hosted-cache.js';\nimport { resolveDsn } from '../reporting/credentials.js';\nimport { parseDsn } from '../reporting/commands/push.js';\nimport { boundList, NODE_EDGE_CAP } from './response.js';\nimport { searchSymbols } from '../engine/search.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * The read-only tool set for the LOCAL `vg serve` MCP. Every tool is\n * side-effect-free and `readOnlyHint: true` (auto-approvable), and independent of\n * Vibgrate's hosted cloud MCP. The server is local-first; network access is\n * limited to the embedder's one-time model fetch, `upgrade_impact`'s `changelog`\n * option, and `library_docs`' hosted-catalog fall-through on a thin/missing local\n * doc — all disabled under `--local` (the hard airgap).\n *\n * Phase 2/3 add `tests_for`, `get_facts`, `guide_node`, `check_drift`,\n * `list_models`, `resolve_library`, `library_docs`.\n */\n\nexport interface ToolContext {\n /** Project root (for filesystem-backed tools: drift, models). */\n root: string;\n /** `--local`: keep the server air-gapped — no model download, lexical only. */\n local?: boolean;\n /** `--dedup`: collapse a node's heavy relation lists on repeat reads this session. */\n dedup?: boolean;\n /** Per-session set of node ids already returned in full (drives `--dedup`). */\n seen?: Set<string>;\n /** Path the served graph was loaded from (locates its tags sidecar). */\n graphPath?: string;\n /**\n * The local runtime's semantic index, when one is reachable. Held for the\n * life of the server: attaching once and sending only the question per call\n * is what removes this process's own model load and vector scan.\n */\n semanticSession?: DaemonSemanticSession;\n}\n\nexport interface VgTool {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (graph: VgGraph, args: Record<string, unknown>, ctx: ToolContext) => unknown | Promise<unknown>;\n}\n\n/**\n * Embedder shared across calls of a long-running `vg serve` — loaded once\n * (model fetched on first use, then cached/offline), so semantic queries don't\n * re-init the model per request. `null` once we know the backend is unavailable\n * (unsupported platform / no model) so we stop retrying and use lexical.\n */\n/**\n * In-memory embedder, loaded from the on-disk cache only (never a network\n * download on the request path). Resolved once and reused; `null` while the\n * model is not yet available.\n */\nlet warmEmbedder: Promise<Embedder | null> | null = null;\nlet bgWarmStarted = false;\n\n/**\n * Kick a one-time background model download so future navigation calls can go\n * semantic — without ever blocking the current call on it. Safe to call\n * repeatedly (single-flight) and from server startup. No-op under `--local`.\n */\nexport function warmEmbedderInBackground(local?: boolean): void {\n if (local || bgWarmStarted || isModelReady()) return;\n bgWarmStarted = true;\n // Allows the network fetch; populates the shared disk cache + the machine\n // readiness marker. Failure just leaves us on the lexical floor.\n loadEmbedder({})\n .then((e) => {\n if (e) warmEmbedder = Promise.resolve(e);\n })\n .catch(() => {\n bgWarmStarted = false; // let a later call retry the warm\n });\n}\n\n/**\n * The embedder IF it can be had without a network download — cached in memory,\n * or loadable from the on-disk model cache. When the model isn't ready, returns\n * `null` immediately and starts a background warm. A cold model download can\n * take tens of seconds; blocking a navigation call on it is what made `orient`\n * hang and return nothing in CI, so the request path never waits for it.\n */\nfunction readyEmbedder(local?: boolean): Promise<Embedder | null> {\n if (warmEmbedder) return warmEmbedder;\n if (local) return (warmEmbedder = loadEmbedder({ local, noDownload: true }));\n if (isModelReady()) return (warmEmbedder = loadEmbedder({ noDownload: true }));\n warmEmbedderInBackground(local);\n return Promise.resolve(null);\n}\n\n/**\n * Resolve a question to ranked matches: semantic when the embedder is warm, else\n * the deterministic lexical floor.\n *\n * Two guarantees keep this from ever hard-failing a navigation call — the\n * failure mode that made the agent abandon the graph and re-discover by grep\n * (observed in CI: `orient` returned nothing, so the model paid for both):\n * 1. it never waits on a cold model download (readyEmbedder is non-blocking);\n * 2. any fault in the semantic path (embedding, vector I/O) degrades to lexical.\n * Lexical always answers, so orient/query_graph always return content.\n */\nasync function retrieve(graph: VgGraph, question: string, budget: number, ctx: ToolContext) {\n let mode = 'lexical';\n // Optional relevance provider: widens seed vocabulary on both the semantic\n // and lexical paths when installed; null (the default) changes nothing.\n // analyzeQuestion never throws and the provider is memoized, so this adds\n // no meaningful latency to the navigation path.\n const relevance = await analyzeQuestion(question);\n const topicTags = relevance ? await loadTopicTags(graph, ctx.root, ctx.graphPath) : null;\n // The daemon first: it already holds vectors for this slot, so it answers the\n // semantic half without this process loading the model at all. `null` means\n // \"rank it yourself\" — the same path taken when no daemon is running.\n if (ctx.semanticSession && !ctx.local) {\n try {\n const ranked = await withTimeout(\n ctx.semanticSession.rank(question, graph.provenance?.corpusHash),\n SEMANTIC_BUDGET_MS,\n 'daemon ranking over budget',\n );\n if (ranked) {\n const q = await queryGraphSemantic(graph, question, {\n budget,\n semanticRanked: ranked.ranked,\n relevance,\n topicTags,\n });\n return { q, mode: `semantic (vgd${ranked.model ? `, ${ranked.model}` : ''})` };\n }\n } catch {\n // Over budget or the socket died — fall through to the local path.\n }\n }\n try {\n const q = await withTimeout(\n (async () => {\n const embedder = await readyEmbedder(ctx.local);\n if (!embedder) return null;\n // First call on a fresh repo embeds every node here; withTimeout does not\n // cancel it, so the work continues in the background and caches to disk —\n // this call answers lexically, the next hits the warm cache and is fast.\n const nodeVectors = await getNodeEmbeddings(graph, embedder, ctx.root);\n const r = await queryGraphSemantic(graph, question, { budget, embedder, nodeVectors, relevance, topicTags });\n mode = `semantic (${embedder.id})`;\n return r;\n })(),\n SEMANTIC_BUDGET_MS,\n 'semantic path over budget',\n );\n if (q) return { q, mode };\n } catch {\n // Over the latency budget or a semantic fault — answer from the lexical floor.\n }\n return { q: queryGraph(graph, question, { budget, relevance, topicTags }), mode: 'lexical' };\n}\n\n/**\n * Hard latency ceiling for the semantic path on a navigation call. If loading\n * the model into memory + embedding the corpus + the query doesn't finish inside\n * this, we answer lexically now and let the (uncancelled) embedding warm the\n * on-disk cache for the next call. Prevents the first `orient` on a fresh,\n * un-embedded repo from blocking past the MCP client timeout (which surfaced as\n * a zero-length result and made the agent fall back to grep). Override via\n * VG_SEMANTIC_BUDGET_MS.\n */\nconst SEMANTIC_BUDGET_MS = (() => {\n const n = Number(process.env.VG_SEMANTIC_BUDGET_MS);\n return Number.isFinite(n) && n > 0 ? n : 4000;\n})();\n\n// Schema bytes are billed to the agent on EVERY model step, so this surface is\n// kept deliberately lean: short descriptions, param notes only where they\n// disambiguate, and no empty `required` arrays. Back-compat alias keys stay in\n// the schemas (additionalProperties is false) but carry no descriptions.\nconst obj = (properties: Record<string, unknown>, required: string[] = []) => ({\n type: 'object',\n properties,\n ...(required.length ? { required } : {}),\n additionalProperties: false,\n});\n\n/** Concise-by-default response shaping (plan P2): ids/names/counts first;\n * bodies, full context blocks and long relation lists are opt-in per call. */\nconst RESPONSE_FORMAT = { type: 'string', enum: ['concise', 'detailed'] };\nconst isDetailed = (args: Record<string, unknown>): boolean => args.response_format === 'detailed';\n/** Top-N default for ranked lists under concise (opt up via limit). */\nconst CONCISE_MATCHES = 5;\n\n/** Evidence tiers an agent can filter edges by (schema.ts EpistemicTier). */\nconst EPISTEMIC_TIERS = ['observed', 'name-matched', 'declared'] as const;\n/** Shared schema fragment: the two optional edge-assurance filters. */\nconst EDGE_FILTER_SCHEMA = {\n min_edge_confidence: { type: 'number', description: '0..1 — drop edges below this confidence' },\n epistemic: { type: 'string', enum: EPISTEMIC_TIERS, description: 'keep only edges of this evidence tier' },\n};\n/**\n * Predicate over `{edge}` records for `get_node`'s call/calledBy filtering. Reads\n * `min_edge_confidence` / `epistemic` defensively; absent → keep everything\n * (unchanged behaviour). Lets an agent request only high-assurance edges, e.g.\n * `epistemic:\"observed\"` for resolver-confirmed calls only.\n */\nfunction edgeRecordFilter(args: Record<string, unknown>): (x: { edge: { confidence: number; epistemic?: string } }) => boolean {\n const min = numOrU(args.min_edge_confidence);\n const tier = (EPISTEMIC_TIERS as readonly string[]).includes(String(args.epistemic)) ? String(args.epistemic) : undefined;\n if (min == null && !tier) return () => true;\n return (x) => (min == null || x.edge.confidence >= min) && (!tier || x.edge.epistemic === tier);\n}\n\nexport const TOOLS: VgTool[] = [\n {\n name: 'orient',\n description:\n 'Start here: one call returns the map overview, ranked matches for your question, and the top hit’s blast radius — replaces summary+query+impact round-trips.',\n // `query` is a no-description back-compat alias for `question`: the sibling\n // discovery tools (search_symbols, resolve_library) take `query`, so an agent\n // naturally reaches for it here too — accepting it turns what was a wasted\n // \"question is required\" round-trip into a hit. Neither is `required` (either\n // satisfies the in-handler check), matching library_docs/resolve_library.\n inputSchema: obj({\n question: { type: 'string', maxLength: 300 },\n query: { type: 'string', maxLength: 300 },\n scope: { type: 'string', description: 'path prefix to orient within' },\n budget: { type: 'number', description: 'token budget in detailed mode (default 1500)' },\n response_format: RESPONSE_FORMAT,\n }),\n handler: async (graph, args, ctx) => {\n const question = String(args.question ?? args.query ?? '');\n if (!question) return { error: 'bad_request', message: 'question is required' };\n const budget = numOr(args.budget, 1500);\n // Semantic when available, else lexical — and never throws (see retrieve).\n const { q, mode } = await retrieve(graph, question, budget, ctx);\n // Normalise scope. An agent naturally passes \".\" (or \"./\") for \"here\" —\n // but file paths are repo-relative (\"src/…\"), so a literal startsWith(\".\")\n // matched nothing and silently zeroed the whole result. Treat \".\", \"./\"\n // and \"\" as the whole graph; strip a leading \"./\" from a real subdir.\n const rawScope = String(args.scope ?? '').trim();\n const scope = rawScope === '.' || rawScope === './' ? '' : rawScope.replace(/^\\.\\//, '');\n const scoped = scope ? q.matches.filter((m) => m.node.file.startsWith(scope)) : q.matches;\n const detailed = isDetailed(args);\n // Blast radius is a `detailed` concern. On the common \"find it → read →\n // edit\" path the concise caller needs the location, not what a change\n // there would touch — surfacing the ripple invites impact-exploration the\n // task doesn't need. Computing impactOf only when asked also skips the\n // traversal per call.\n let topImpact = null;\n const top = scoped[0]?.node;\n if (detailed && top) {\n const r = impactOf(graph, top.id, { depth: 3 });\n topImpact = { node: top.qualifiedName, direct: r.direct, transitive: r.transitive, affected: r.affected.slice(0, 10).map(stripId) };\n }\n const shown = detailed ? scoped : scoped.slice(0, CONCISE_MATCHES);\n return {\n // Concise \"find X\" calls need a one-line map (counts + languages), not the\n // full topAreas/topHubs blocks — those were ~half of every orient\n // response's tokens on the hot discovery path and the caller navigates by\n // `matches`. Detailed keeps the full overview.\n summary: detailed ? summarize(graph, 10) : conciseSummary(graph),\n mode,\n // The fact-annotated context block is detail: concise callers navigate\n // by the ranked matches and fetch nodes on demand (plan P2).\n ...(detailed ? { context: q.context } : {}),\n matches: shown.map((m) => ({ name: m.node.qualifiedName, kind: m.node.kind, file: m.node.file, line: m.node.span.start, score: m.score })),\n // A neutral availability flag, not a directive to keep querying: a\n // retrieval tool that coaches \"narrow the question / see more\" nudges the\n // over-navigation that re-bills the whole context on every extra step.\n ...(scoped.length > shown.length ? { moreAvailable: true } : {}),\n ...(detailed ? { topImpact } : {}),\n };\n },\n },\n {\n name: 'search_symbols',\n description:\n 'Find a known name or literal string fast: ranked symbol lookup, plus a complete literal file-search for any quoted, multi-word, or path-like query (config keys, routes, log lines, UI copy). Quote a single name (\"AddJwtBearer\") to sweep every occurrence of it as text. A sweep reports totalTextMatches so you know you have every occurrence — use it instead of grep. Use first for most discovery; use query_graph for meaning.',\n inputSchema: obj(\n {\n query: { type: 'string', maxLength: 120, description: 'a symbol name, or a literal phrase to sweep for every occurrence of' },\n limit: { type: 'number', description: 'default 8, max 50 (raise it to fetch a whole literal sweep in one call)' },\n },\n ['query'],\n ),\n handler: async (graph, args, ctx) => {\n const limit = Math.min(50, numOr(args.limit, 8));\n return searchSymbols(graph, ctx.root, String(args.query ?? ''), limit);\n },\n },\n {\n name: 'query_graph',\n description: 'Find code by meaning when you don’t know the name: symptoms, relationships, what-breaks-if. For a known name or literal string use search_symbols.',\n // `query` is a no-description back-compat alias for `question` (see orient):\n // sibling tools take `query`, so accept it here rather than reject the call.\n inputSchema: obj({\n question: { type: 'string', maxLength: 300 },\n query: { type: 'string', maxLength: 300 },\n limit: { type: 'number', description: 'ranked matches to return (default 5)' },\n offset: { type: 'number' },\n budget: { type: 'number', description: 'context-block token budget in detailed mode (default 2000)' },\n response_format: RESPONSE_FORMAT,\n }),\n handler: async (graph, args, ctx) => {\n const question = String(args.question ?? args.query ?? '');\n if (!question) return { mode: 'lexical', matches: [], hint: 'question (or query) is required' };\n const budget = numOr(args.budget, 2000);\n // Semantic by default (local model, cached/offline after first use); falls\n // back to the deterministic lexical floor if the backend is unavailable or\n // faults — retrieve() never throws, so the tool never hard-fails.\n const { q: r, mode } = await retrieve(graph, question, budget, ctx);\n // Structured pivot instead of an empty result (plan P2): the model should\n // switch tools, not retry the same query harder.\n if (r.matches.length === 0) {\n return { mode, matches: [], hint: 'no semantic match — for a known name or literal string use search_symbols; otherwise rephrase around the behaviour you observe' };\n }\n const limit = numOr(args.limit, CONCISE_MATCHES);\n const offset = Math.max(0, numOrU(args.offset) ?? 0);\n const page = r.matches.slice(offset, offset + limit);\n return {\n mode,\n summary: `${r.matches.length} match${r.matches.length === 1 ? '' : 'es'}; top: ${r.matches[0]!.node.qualifiedName}`,\n // The fact-annotated context block is detail (plan P2): ranked matches\n // first, fetch nodes on demand.\n ...(isDetailed(args) ? { context: r.context, tokensEstimate: r.tokensEstimate } : {}),\n matches: page.map((m) => ({ name: m.node.qualifiedName, kind: m.node.kind, file: m.node.file, line: m.node.span.start, score: m.score })),\n // Neutral pagination fact (nextOffset if the model genuinely needs more),\n // not a \"narrow the question\" nudge that invites another discovery round.\n ...(offset + page.length < r.matches.length ? { moreAvailable: true, nextOffset: offset + page.length } : {}),\n };\n },\n },\n {\n name: 'get_node',\n description: 'Inspect one symbol: signature, callers, callees, area. Accepts name, file:line, glob or id.',\n inputSchema: obj(\n {\n name: { type: 'string' },\n pick: { type: 'number', description: 'nth candidate if ambiguous' },\n ...EDGE_FILTER_SCHEMA,\n response_format: RESPONSE_FORMAT,\n },\n ['name'],\n ),\n handler: (graph, args, ctx) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''), numOrU(args.pick));\n if (!node) return unresolved(candidates);\n const index = indexFor(graph);\n // Optional edge-assurance filter: keep only calls/callers at/above a\n // confidence floor and/or of a given evidence tier, before mapping to names.\n const edgeOk = edgeRecordFilter(args);\n const calleeRecs = index.callees(node.id).filter(edgeOk);\n const callerRecs = index.callers(node.id).filter(edgeOk);\n const base = {\n name: node.qualifiedName,\n kind: node.kind,\n file: node.file,\n line: node.span.start,\n signature: node.signature ?? null,\n importance: node.importance,\n isHub: node.isHub,\n area: node.area,\n };\n // `--dedup`: if this exact node (content-addressed id) was already\n // returned in full this session, the model already has its relations —\n // re-sending them just re-bills the same tokens every turn. Return the\n // lightweight identity plus the totals and a `repeat` flag instead.\n if (ctx?.dedup && ctx.seen?.has(node.id)) {\n return { ...base, repeat: true, callsTotal: uniqueNames(calleeRecs.map((x) => x.node.qualifiedName)).length, calledByTotal: uniqueNames(callerRecs.map((x) => x.node.qualifiedName)).length };\n }\n // Bound the relationship arrays: a hub can have hundreds of callers, and\n // every one is paid for on every subsequent turn. Concise shows the top\n // CONCISE_MATCHES with true totals; detailed widens to NODE_EDGE_CAP\n // (the model can widen the blast radius further with `impact_of`).\n const edgeCap = isDetailed(args) ? NODE_EDGE_CAP : CONCISE_MATCHES;\n const calls = boundList(uniqueNames(calleeRecs.map((x) => x.node.qualifiedName)), edgeCap);\n const calledBy = boundList(uniqueNames(callerRecs.map((x) => x.node.qualifiedName)), edgeCap);\n ctx?.seen?.add(node.id);\n return {\n ...base,\n calls: calls.items,\n callsTotal: calls.total,\n calledBy: calledBy.items,\n calledByTotal: calledBy.total,\n };\n },\n },\n {\n name: 'find_path',\n description: 'Shortest connection from a to b.',\n inputSchema: obj(\n {\n a: { type: 'string' },\n b: { type: 'string' },\n pick_a: { type: 'number' },\n pick_b: { type: 'number' },\n },\n ['a', 'b'],\n ),\n handler: (graph, args) => {\n const ra = resolveOne(graph, String(args.a ?? ''), numOrU(args.pick_a));\n const rb = resolveOne(graph, String(args.b ?? ''), numOrU(args.pick_b));\n if (!ra.node) return { endpoint: 'a', ...unresolved(ra.candidates) };\n if (!rb.node) return { endpoint: 'b', ...unresolved(rb.candidates) };\n const result = shortestPath(graph, ra.node.id, rb.node.id);\n if (!result) return pathDisconnect(graph, ra.node.id, rb.node.id);\n const byId = new Map(graph.nodes.map((n) => [n.id, n] as const));\n return { connected: true, direction: result.direction, path: result.ids.map((id) => byId.get(id)?.qualifiedName ?? id) };\n },\n },\n {\n name: 'impact_of',\n description: 'Blast radius of a change: what breaks if this symbol changes — dependents, files, covering tests, risk.',\n inputSchema: obj(\n {\n name: { type: 'string' },\n change_type: { type: 'string', enum: ['modify', 'delete', 'rename', 'add_dependency'] },\n depth: { type: 'number', description: 'default 4' },\n pick: { type: 'number', description: 'nth candidate if ambiguous' },\n min_edge_confidence: { type: 'number', description: '0..1 — drop dependents below this (decayed) confidence' },\n response_format: RESPONSE_FORMAT,\n },\n ['name'],\n ),\n handler: (graph, args) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''), numOrU(args.pick));\n if (!node) return unresolved(candidates);\n const changeType = ['modify', 'delete', 'rename', 'add_dependency'].includes(String(args.change_type))\n ? String(args.change_type)\n : 'modify';\n const r = impactOf(graph, node.id, { depth: numOr(args.depth, 4) });\n // Optional assurance floor: drop dependents whose (distance-decayed) edge\n // confidence is below the requested threshold. Filtered in the handler —\n // impact.ts is unchanged. Recompute the direct/transitive tallies so the\n // decision contract (riskLevel, summary) reflects only the kept rows.\n const minConf = numOrU(args.min_edge_confidence);\n if (minConf != null) {\n const kept = r.affected.filter((a) => a.confidence >= minConf);\n r.affected = kept;\n r.direct = kept.filter((i) => i.depth === 1).length;\n r.transitive = kept.filter((i) => i.depth > 1).length;\n // Keep minEdgeConfidence consistent with the kept rows (never report a\n // confidence below the applied floor).\n r.minEdgeConfidence = kept.length ? Math.min(...kept.map((i) => i.confidence)) : 1;\n }\n const tests = coveringTests(graph, node);\n const filesAffected = [...new Set(r.affected.map((a) => a.file))];\n // Decision-shaped contract (plan P2): a rename/delete makes every\n // dependent a compile-break risk; a modify is weighted by fan-in.\n const heavyChange = changeType === 'delete' || changeType === 'rename';\n const riskLevel =\n node.isHub || r.direct >= 10 || r.transitive >= 50 || (heavyChange && r.direct >= 3)\n ? 'high'\n : r.direct >= 3 || r.transitive >= 10\n ? 'medium'\n : 'low';\n const summary =\n `${changeType} ${r.root.name}: ${r.direct} direct dependent${r.direct === 1 ? '' : 's'}, ` +\n `${r.transitive} transitive across ${filesAffected.length} file${filesAffected.length === 1 ? '' : 's'}; ` +\n `${tests.length} covering test${tests.length === 1 ? '' : 's'} — ${riskLevel} risk.`;\n return {\n root: r.root.name,\n changeType,\n directCallers: r.direct,\n transitiveCount: r.transitive,\n filesAffected: filesAffected.slice(0, 20),\n testsAffected: tests.length,\n riskLevel,\n summary,\n // The full row set is detail; concise callers act on the contract above.\n ...(isDetailed(args)\n ? { affected: r.affected.slice(0, 100).map(stripId) }\n : r.affected.length > 0\n ? { hint: 'response_format:\"detailed\" lists the affected nodes' }\n : {}),\n };\n },\n },\n {\n name: 'cross_impact_of',\n description:\n 'Blast radius ACROSS the federated workspace: impact in this repo plus which member repos consume it over confidence-scored bridges (workspace/package links). Every cross-repo hop carries confidence, evidence, and the member graph identity.',\n inputSchema: obj(\n {\n name: { type: 'string' },\n pick: { type: 'number', description: 'nth candidate if ambiguous' },\n max_members: { type: 'number', description: 'member repos to inspect (default 4)' },\n },\n ['name'],\n ),\n handler: (graph, args, ctx) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''), numOrU(args.pick));\n if (!node) return unresolved(candidates);\n const home = impactOf(graph, node.id, { depth: 4 });\n const homeSummary = `${home.direct} direct dependent${home.direct === 1 ? '' : 's'}, ${home.transitive} transitive in this repo`;\n\n let federation: ReturnType<typeof loadOrDiscoverFederation> | null = null;\n try {\n federation = loadOrDiscoverFederation(ctx.root);\n } catch {\n federation = null;\n }\n if (!federation || federation.members.length <= 1) {\n return {\n root: node.name,\n home: homeSummary,\n federation: 'single-repo workspace — no member repos declared (.vibgrate/federation.json) or discovered',\n summary: `${node.name}: ${homeSummary}; no federated members to check.`,\n };\n }\n\n const homeId = repositoryIdFromRoot(ctx.root);\n // Consumers of THIS repo: bridges whose dependency target is home —\n // changing a symbol here can break the bridge's `from` member. Only\n // high-confidence bridges qualify (the capsule rule, applied to MCP).\n const bridges = highConfidenceBridges(federation.bridges ?? []).filter((b) => b.toRepositoryId === homeId);\n const maxMembers = Math.max(1, Math.min(8, numOr(args.max_members, 4)));\n const byConsumer = new Map<string, typeof bridges>();\n for (const b of bridges) {\n const list = byConsumer.get(b.fromRepositoryId) ?? [];\n list.push(b);\n byConsumer.set(b.fromRepositoryId, list);\n }\n\n const members = federation.members.filter((m) => byConsumer.has(m.repositoryId)).slice(0, maxMembers);\n const crossRepo = members.map((m) => {\n const via = byConsumer.get(m.repositoryId)!.map((b) => ({\n kind: b.kind,\n confidence: b.confidence,\n evidence: b.evidence,\n ...(b.packageName ? { package: b.packageName } : {}),\n }));\n // Prefer the member's registered graph artifact; fall back to the\n // legacy in-repo layout. A member without a built map is still\n // reported — with the bridge evidence and how to get the answer.\n const graphFile = [m.graphPath, path.join(m.root, '.vibgrate', 'graph.json')].find((p) => p && fs.existsSync(p));\n if (!graphFile) {\n return { member: m.label, root: m.root, via, graph: null, note: `no code map built — run \\`vg\\` in ${m.root}` };\n }\n try {\n const mg = parseGraph(fs.readFileSync(graphFile, 'utf8'));\n const matches = mg.nodes\n .filter((n) => n.name === node.name && n.kind !== 'file')\n .sort((a, b) => b.importance - a.importance || (a.qualifiedName < b.qualifiedName ? -1 : 1))\n .slice(0, 10)\n .map((n) => ({ qualifiedName: n.qualifiedName, file: n.file, line: n.span.start }));\n return {\n member: m.label,\n root: m.root,\n via,\n // Reproducibility: WHICH map answered, exactly.\n graph: { corpusHash: mg.provenance.corpusHash },\n matches,\n };\n } catch {\n return { member: m.label, root: m.root, via, graph: null, note: 'member map unreadable — rebuild with `vg`' };\n }\n });\n\n const matchTotal = crossRepo.reduce((n, c) => n + ('matches' in c ? (c.matches?.length ?? 0) : 0), 0);\n return {\n root: node.name,\n home: homeSummary,\n federation: { members: federation.members.length, consumingMembers: crossRepo.length, bridgesConsidered: bridges.length },\n crossRepo,\n summary:\n `${node.name}: ${homeSummary}; ${crossRepo.length} member repo(s) consume this repo over high-confidence bridges` +\n ` (${matchTotal} same-name symbol match${matchTotal === 1 ? '' : 'es'} across members).`,\n };\n },\n },\n {\n name: 'tests_for',\n description: 'Which tests cover this symbol — is a change here tested?',\n inputSchema: obj(\n {\n name: { type: 'string' },\n pick: { type: 'number', description: 'nth candidate if ambiguous' },\n response_format: RESPONSE_FORMAT,\n },\n ['name'],\n ),\n handler: (graph, args) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''), numOrU(args.pick));\n if (!node) return unresolved(candidates);\n const covers = coveringTests(graph, node);\n return {\n node: node.qualifiedName,\n tested: node.tested,\n coverage: node.coverage ?? null,\n testCount: covers.length,\n covers: isDetailed(args) ? covers : covers.slice(0, 10),\n ...(covers.length > 10 && !isDetailed(args) ? { moreAvailable: true } : {}),\n ...(covers.length === 0 ? { hint: 'no covering tests found — a change here lands untested' } : {}),\n };\n },\n },\n {\n name: 'get_graph_summary',\n description: 'Code map overview: counts, languages, top areas and hubs.',\n inputSchema: obj({}),\n handler: (graph) => summarize(graph),\n },\n {\n name: 'list_areas',\n description: 'Code areas (communities) by size.',\n inputSchema: obj({ limit: { type: 'number' } }),\n // Strip `members` (raw content-hash id arrays): a model cannot use them and\n // on a large repo they ballooned this result past 20k tokens.\n handler: (graph, args) =>\n [...graph.areas]\n .sort((a, b) => b.size - a.size)\n .slice(0, numOr(args.limit, 30))\n .map((a) => ({ id: a.id, label: a.label, size: a.size, cohesion: a.cohesion, externalEdges: a.externalEdges })),\n },\n {\n name: 'list_hubs',\n description: 'Most-depended-on symbols (includes precomputed blast-radius counts when available).',\n inputSchema: obj({ limit: { type: 'number' } }),\n handler: (graph, args) => {\n const limit = numOr(args.limit, 20);\n if (graph.summaries?.hubs?.length) {\n return graph.summaries.hubs.slice(0, limit).map((h) => ({\n name: h.name,\n kind: h.kind,\n file: h.file,\n importance: h.importance,\n isHub: true,\n directDependents: h.direct,\n depth2Dependents: h.depth2,\n filesAffected: h.files,\n tested: h.tested,\n }));\n }\n return graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance)\n .slice(0, limit)\n .map((n) => ({\n name: n.qualifiedName,\n kind: n.kind,\n file: n.file,\n line: n.span.start,\n importance: n.importance,\n isHub: n.isHub,\n }));\n },\n },\n {\n name: 'get_facts',\n description: 'Deterministic facts for a node (contract / invariant / characterization).',\n inputSchema: obj(\n {\n name: { type: 'string' },\n pick: { type: 'number', description: 'nth candidate if ambiguous' },\n },\n ['name'],\n ),\n handler: (graph, args) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''), numOrU(args.pick));\n if (!node) return unresolved(candidates);\n if (!graph.facts) {\n return {\n node: node.qualifiedName,\n facts: [],\n note: 'map has no facts — rebuild with a current vg (facts ship on every build)',\n };\n }\n return { node: node.qualifiedName, facts: graph.facts.filter((f) => f.subjectIds.includes(node.id)) };\n },\n },\n {\n name: 'guide_node',\n description: 'Cited standards/practices for a node (OWASP/CWE).',\n inputSchema: obj(\n {\n name: { type: 'string' },\n pick: { type: 'number', description: 'nth candidate if ambiguous' },\n },\n ['name'],\n ),\n handler: (graph, args) => {\n const { node, candidates } = resolveOne(graph, String(args.name ?? ''), numOrU(args.pick));\n if (!node) return unresolved(candidates);\n const entries = new Map(FREE_PACK.entries.map((e) => [e.id, e]));\n return {\n node: node.qualifiedName,\n guidance: (graph.grounding ?? [])\n .filter((g) => g.src === node.id)\n .map((g) => ({ kind: g.kind, rationale: g.rationale, confidence: g.confidence, summary: entries.get(g.packEntryId)?.summary ?? '', citation: g.citation })),\n };\n },\n },\n {\n name: 'check_drift',\n description: 'Offline dependency inventory (npm/pypi/go); attribute:true adds git who-added attribution.',\n inputSchema: obj(\n { attribute: { type: 'boolean' } },\n [],\n ),\n handler: (_graph, args, ctx) => attributedInventory(ctx.root, { attribute: args.attribute === true }),\n },\n {\n name: 'vuln_attribution',\n description: 'Who introduced each open vulnerability, exposure windows, and CRA remediation metrics (MTTR, SLA breaches). Reads the last `vg scan --vulns`.',\n inputSchema: obj({ package: { type: 'string', description: 'restrict to one package' } }, []),\n handler: (_graph, args, ctx) => {\n const data = loadVulnerabilities(ctx.root);\n if (!data) {\n return {\n status: 'not_scanned',\n message: 'No vulnerability data found. Run `vg scan --vulns` first (attribution needs git history at scan time).',\n };\n }\n const only = args.package ? String(args.package) : null;\n const packages = (only ? data.packages.filter((p) => p.package === only) : data.packages).map((p) => ({\n ecosystem: p.ecosystem,\n package: p.package,\n installedVersion: p.version,\n advisories: p.advisories.map((a) => ({\n id: a.id,\n cve: a.aliases.find((x) => x.startsWith('CVE-')) ?? null,\n severity: a.severity,\n cvss: a.cvss,\n exposureDays: a.exposureDays ?? null,\n introduced: a.introduced ?? null,\n fixedVersions: a.fixedVersions,\n })),\n }));\n return { status: 'ok', source: data.source, cra: data.cra ?? null, packages };\n },\n },\n {\n name: 'list_vulnerabilities',\n description: 'Known vulnerabilities from the last `vg scan --vulns`: id/CVE, severity, CVSS, fixed version.',\n inputSchema: obj(\n { severity: { type: 'string', enum: ['low', 'moderate', 'high', 'critical'], description: 'minimum severity' } },\n [],\n ),\n handler: (_graph, args, ctx) => {\n const data = loadVulnerabilities(ctx.root);\n if (!data) {\n return {\n status: 'not_scanned',\n message: 'No vulnerability data found. Run `vg scan --vulns` first (online OSV, or offline with a --package-manifest carrying advisories).',\n };\n }\n const filtered = filterBySeverity(data, args.severity as VulnSeverity | undefined);\n return {\n status: 'ok',\n source: filtered.source,\n totalAdvisories: filtered.totalAdvisories,\n affectedPackages: filtered.packages.length,\n severityCounts: filtered.severityCounts,\n packages: filtered.packages.map((p) => ({\n ecosystem: p.ecosystem,\n package: p.package,\n installedVersion: p.version,\n advisories: p.advisories.map((a) => ({\n id: a.id,\n cve: a.aliases.find((x) => x.startsWith('CVE-')) ?? null,\n severity: a.severity,\n cvss: a.cvss,\n fixedVersions: a.fixedVersions,\n summary: a.summary,\n })),\n })),\n };\n },\n },\n {\n name: 'upgrade_impact',\n description: 'What breaks if you upgrade a package: major distance, import blast radius, vulns fixed, recommended posture. changelog:true adds GitHub breaking-change signals (online).',\n inputSchema: obj(\n {\n package: { type: 'string' },\n changelog: { type: 'boolean' },\n },\n ['package'],\n ),\n handler: async (_graph, args, ctx) => {\n const pkg = String(args.package ?? '');\n if (!pkg) return { error: 'bad_request', message: 'package is required' };\n const target = resolvePackageTarget(ctx.root, pkg);\n const fixesVulnerabilities = openFixableAdvisories(ctx.root, pkg);\n const impact = computeUpgradeImpact(ctx.root, { package: pkg, ...target }, { fixesVulnerabilities });\n // Online breaking-change signals are strictly opt-in and never run under --local.\n const changelog =\n args.changelog === true && !ctx.local && target.ecosystem !== 'unknown'\n ? await getChangelogSignals(target.ecosystem, pkg, target.currentVersion, target.latestVersion)\n : undefined;\n return { status: 'ok', ...impact, ...(changelog ? { changelog } : {}) };\n },\n },\n {\n name: 'list_models',\n description: 'Local models on disk (Ollama / LM Studio / gguf).',\n inputSchema: obj({}),\n handler: () => ({ models: discoverModels() }),\n },\n {\n name: 'resolve_library',\n description:\n 'Resolve a library to its canonical id and the version YOUR project uses (drift-annotated). ' +\n 'Call once per library and reuse the returned targetId for every library_docs follow-up — never guess an id.',\n // Canonical §4: `query` (+ optional `context_project`). `name` kept as a back-compat alias.\n inputSchema: obj(\n {\n query: {\n type: 'string',\n description: 'the package name as written in the dependency file. Good: \"react-hook-form\". Bad: \"forms\"',\n },\n name: { type: 'string' },\n context_project: { type: 'string' },\n },\n [],\n ),\n handler: (_graph, args, ctx) => {\n const query = String(args.query ?? args.name ?? '');\n if (!query) return { error: 'bad_request', message: 'query is required' };\n const ver = resolveVersion(ctx.root, query);\n const entry = resolveLib(loadCatalog(ctx.root), query);\n if (entry) {\n const drift = driftFor(ctx.root, entry);\n return {\n targetId: entry.id,\n id: entry.id, // back-compat\n name: entry.name,\n resolvedVersion: ver.served ?? entry.version,\n version: entry.version, // back-compat\n isInstalled: ver.installed != null,\n driftStatus: driftStatusOf(drift),\n drift,\n version_mismatch: ver.mismatch ?? null,\n source: 'catalog',\n };\n }\n const local = localPackageDocs(ctx.root, query);\n if (local) {\n return {\n targetId: query,\n name: query,\n resolvedVersion: local.version ?? ver.served ?? null,\n isInstalled: true,\n driftStatus: 'unknown',\n version_mismatch: ver.mismatch ?? null,\n source: local.source,\n };\n }\n return { error: 'not_found' };\n },\n },\n {\n name: 'library_docs',\n description:\n 'Version-correct usage docs for a library, sliced to a token budget — official content matched to ' +\n 'the version this project has installed, not web-search results. Ask a focused question via query; ' +\n 'one call usually answers. After 2 calls without the section you need, stop and read the package ' +\n 'source under node_modules instead of searching again.',\n // Canonical §4: `targetId`/`query`, `verbosity`, `max_tokens`. `name`/`tokens` kept as aliases.\n inputSchema: obj(\n {\n targetId: { type: 'string', description: 'id from resolve_library (preferred over query)' },\n query: {\n type: 'string',\n description:\n 'the library plus the specific need. Good: \"zod refine custom error message\". Bad: \"zod\" or \"docs\"',\n },\n name: { type: 'string' },\n context_project: { type: 'string' },\n verbosity: { type: 'string', enum: ['concise', 'balanced', 'exhaustive'] },\n // Tolerant on purpose: models often send budgets as strings — the\n // handler coerces, so don't fail validation over \"4000\" vs 4000.\n max_tokens: { type: ['number', 'string'], description: 'token budget (a numeric string is accepted)' },\n tokens: { type: ['number', 'string'] },\n enterprise_strict: { type: 'boolean' },\n follow_up: { type: 'boolean' },\n },\n [],\n ),\n handler: (_graph, args, ctx) => {\n const id = String(args.targetId ?? args.query ?? args.name ?? '');\n if (!id) return { error: 'bad_request', message: 'targetId or query is required' };\n const query = String(args.query ?? args.name ?? '');\n // Adaptive default: a focused question gets a `concise` slice (the ranked\n // sections that answer it); a bare \"give me the docs\" keeps `balanced` so\n // breadth isn't lost. Either is overridable via `verbosity`/`max_tokens`.\n const verbosity = ['concise', 'balanced', 'exhaustive'].includes(String(args.verbosity))\n ? (String(args.verbosity) as keyof typeof VERBOSITY_BUDGET)\n : query\n ? 'concise'\n : 'balanced';\n const budget = numOrU(args.max_tokens) ?? numOrU(args.tokens) ?? VERBOSITY_BUDGET[verbosity];\n const ver = resolveVersion(ctx.root, id);\n // Focused question for quality/API slicing: strip a leading package id so\n // \"hono createMiddleware\" still looks for createMiddleware in types.\n const focusQuery = (() => {\n const q = query.trim();\n if (!q) return q;\n const bare = id.replace(/^@[^/]+\\//, '').toLowerCase();\n const parts = q.split(/\\s+/);\n if (parts.length > 1 && parts[0].toLowerCase().replace(/^@[^/]+\\//, '') === bare) {\n return parts.slice(1).join(' ');\n }\n return q;\n })();\n const render = (readme: string, libName: string, readmeOnly?: boolean) => {\n // Query-aware .d.ts surface so focused API questions pull matching signatures.\n const apiSurface = localApiSurface(ctx.root, libName, focusQuery || undefined);\n const sel = selectForBudget({ readme, query: focusQuery || query, apiSurface, budget });\n // Quality gate (D18): assess what we actually serve (selected slice) so\n // agents are not told \"sufficient\" for a truncated README that never\n // answered the question. Escalation still uses this verdict.\n const quality = assessDocQuality(sel.text, {\n name: libName,\n query: focusQuery || query || undefined,\n symbols: symbolsFromApi(apiSurface),\n readmeOnly: readmeOnly === true && !apiSurface,\n });\n return {\n content: sel.text,\n metadata: {\n verbosity,\n tokens: sel.tokens,\n truncated: sel.truncated,\n quality: { sufficient: quality.sufficient, score: quality.score, reasons: quality.reasons },\n escalate: quality.sufficient ? null : 'hosted',\n },\n };\n };\n\n // 1. Committed catalog (drift-annotated). 2. Local-first: installed package docs on disk.\n const entry = resolveLib(loadCatalog(ctx.root), id);\n let answer: Record<string, unknown> | null = null;\n let sufficient = false;\n if (entry) {\n const r = render(readDoc(ctx.root, entry), entry.name, false);\n sufficient = r.metadata.quality.sufficient;\n answer = {\n targetId: entry.id,\n name: entry.name,\n version: entry.version,\n source: 'catalog',\n drift: driftFor(ctx.root, entry),\n version_mismatch: ver.mismatch ?? null,\n content: r.content,\n docs: r.content, // back-compat\n metadata: r.metadata,\n };\n } else {\n const local = localPackageDocs(ctx.root, id, { query: focusQuery || query || undefined });\n if (local) {\n const r = render(local.docs, id, local.readmeOnly);\n sufficient = r.metadata.quality.sufficient;\n answer = {\n targetId: id,\n name: id,\n version: local.version ?? ver.served,\n source: local.source,\n version_mismatch: ver.mismatch ?? null,\n content: r.content,\n docs: r.content, // back-compat\n metadata: r.metadata,\n };\n }\n }\n\n // Hosted escalation (S2, wired): consulted only when the local answer is missing or\n // insufficient AND the server isn't air-gapped (`--local`). Disk-cached (24h TTL under\n // .vibgrate/cache) so repeat agent lookups answer instantly; fetchHostedDocsCached fails\n // closed to null, so the best local answer (or not_found) is never broken by the\n // network. The escalation branch is the only async path — the local path stays sync.\n if (!sufficient && !ctx.local) {\n return (async () => {\n const dsn = resolveDsn();\n const parsed = dsn ? parseDsn(dsn) : null;\n const hosted = await fetchHostedDocsCached(\n ctx.root,\n { name: entry?.name ?? id, targetId: entry?.id, query: query || undefined, maxTokens: budget },\n { auth: parsed ? { keyId: parsed.keyId, secret: parsed.secret } : undefined },\n );\n if (hosted) {\n return {\n targetId: entry?.id ?? id,\n name: entry?.name ?? id,\n version: hosted.version ?? ver.served ?? null,\n source: 'hosted',\n version_mismatch: ver.mismatch ?? null,\n content: hosted.content,\n docs: hosted.content, // back-compat\n metadata: { verbosity, escalated: true, ...(hosted.metadata ?? {}) },\n };\n }\n return answer ?? { error: 'not_found' };\n })();\n }\n return answer ?? { error: 'not_found' };\n },\n },\n];\n\n/** Default token budgets by verbosity (canonical §4) when no explicit `max_tokens` is given. */\nconst VERBOSITY_BUDGET = { concise: 1500, balanced: 4000, exhaustive: 12000 } as const;\n\n/** The lean one-line map for concise `orient`: counts + languages, no top lists. */\nfunction conciseSummary(graph: VgGraph) {\n return { counts: graph.meta.counts, languages: graph.meta.languages };\n}\n\n/** Shared map overview used by both `get_graph_summary` and `orient`. */\nfunction summarize(graph: VgGraph, top = 10) {\n const topHubs = graph.summaries?.hubs?.length\n ? graph.summaries.hubs.slice(0, top).map((h) => ({\n name: h.name,\n file: h.file,\n importance: h.importance,\n directDependents: h.direct,\n depth2Dependents: h.depth2,\n }))\n : graph.nodes\n .filter((n) => n.isHub)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, top)\n .map((n) => ({ name: n.qualifiedName, file: n.file, importance: n.importance }));\n return {\n counts: graph.meta.counts,\n languages: graph.meta.languages,\n cluster: graph.meta.cluster,\n analysisTier: graph.meta.analysisTier ?? 'full',\n resolver: graph.provenance.resolver,\n generatedAt: graph.generatedAt,\n topAreas: [...graph.areas].sort((a, b) => b.size - a.size).slice(0, top).map((a) => ({ id: a.id, label: a.label, size: a.size })),\n topHubs,\n };\n}\n\n/** Drop the internal content-hash `id` from an impact item — model noise. */\nfunction stripId<T extends { id?: string }>(item: T): Omit<T, 'id'> {\n const { id: _id, ...rest } = item;\n return rest;\n}\n\n/**\n * The shared \"could not resolve to one node\" payload. Candidates carry\n * kind/file/line — bare qualified names were useless when several nodes share a\n * name (the model saw ten identical strings and had nothing to `pick` by).\n */\nfunction unresolved(candidates: { qualifiedName: string; kind: string; file: string; span: { start: number } }[]) {\n return {\n error: candidates.length ? 'ambiguous' : 'not_found',\n candidates: candidates.slice(0, 10).map((n, i) => ({ pick: i + 1, name: n.qualifiedName, kind: n.kind, file: n.file, line: n.span.start })),\n ...(candidates.length ? { hint: 'call again with pick:<n> or a file:line name' } : {}),\n };\n}\n\n/** Map the internal drift note to the canonical §4 driftStatus vocabulary. */\nfunction driftStatusOf(d: { drift: string }): string {\n if (d.drift === 'current') return 'current';\n if (d.drift === 'behind') return 'outdated';\n if (d.drift === 'ahead') return 'ahead';\n return 'unknown';\n}\n\nfunction numOr(v: unknown, def: number): number {\n const n = Number(v);\n return Number.isFinite(n) && n > 0 ? n : def;\n}\nfunction numOrU(v: unknown): number | undefined {\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\nfunction uniqueNames(xs: string[]): string[] {\n return [...new Set(xs)];\n}\n\n/**\n * The hot navigation core (plan P3, VG-NAVIGATION-PROFILE.md): the tools an\n * agent needs on the common path, kept in model context up front. Everything\n * else is discovered on demand via tool-search, so the per-step schema bill\n * drops to the core only. This is a CLIENT loading configuration over the one\n * server tool set — the server always exposes all of `TOOLS`; deferral-capable\n * hosts load the core and defer the tail. Ordered to match the TOOLS array.\n */\nexport const HOT_TOOLS = ['orient', 'search_symbols', 'query_graph', 'get_node'] as const;\n\n/** Tools deferred until a task discovers them (everything not in the hot core). */\nexport function deferredToolNames(): string[] {\n const hot = new Set<string>(HOT_TOOLS);\n return TOOLS.map((t) => t.name).filter((n) => !hot.has(n));\n}\n\n/**\n * Server-side listing surface (the complement of the client-side deferral\n * below, for hosts that cannot defer): `--surface hot` / `VG_MCP_SURFACE=hot`\n * lists only the hot core, and `--tools a,b` / `VG_MCP_TOOLS=a,b` lists an\n * explicit subset. LISTING ONLY — every tool in `TOOLS` stays callable\n * whatever is listed (dispatch always resolves against the full array), so\n * behaviour, ranking, and responses are byte-identical across surfaces; the\n * only thing that changes is which schemas the host bills per step. Unknown\n * names are dropped; an empty resolved set falls back to the full surface\n * (fail-open — a typo must never produce a toolless server).\n */\nexport interface ToolSurface {\n /** 'hot' lists only HOT_TOOLS; 'full' (default) lists everything. */\n surface?: 'hot' | 'full';\n /** Explicit tool names to list (wins over `surface`). */\n tools?: string[];\n}\n\nexport function listedToolNames(opts: ToolSurface = {}): string[] {\n const all = TOOLS.map((t) => t.name);\n if (opts.tools?.length) {\n const known = new Set(all);\n const picked = [...new Set(opts.tools.map((t) => t.trim()).filter((t) => known.has(t)))];\n if (picked.length) return all.filter((n) => picked.includes(n));\n }\n if (opts.surface === 'hot') return all.filter((n) => (HOT_TOOLS as readonly string[]).includes(n));\n return all;\n}\n\n/**\n * Suggested per-task graph-call budget, injected into `orient`'s listed\n * description so the agent sees the stop-discipline where it decides —\n * alongside the schema, not buried in server instructions. Deterministic in\n * the file count.\n */\nexport function graphCallBudget(fileCount: number): number {\n if (fileCount < 150) return 3;\n if (fileCount < 1000) return 4;\n return 5;\n}\n\nexport function budgetSuffix(fileCount: number): string {\n return ` Repo size: ~${fileCount} file(s) indexed — aim for at most ${graphCallBudget(fileCount)} graph calls for this task.`;\n}\n\n/**\n * The Anthropic `mcp_toolset` deferral block for embedding `vg serve` in an\n * agent built on the Claude API: the hot core stays loaded, the rest defer and\n * are found via tool-search. Real, measured lever on hosts that support\n * `defer_loading` (~350–450 schema tokens/step vs ~1.9k for the full 20-tool set);\n * hosts that don't support it simply serve the whole optimized set. The server\n * tool SET is one either way — the listing surface above changes what is\n * advertised, never what is callable.\n */\nexport function navigationToolsetConfig(serverName = 'vibgrate'): Record<string, unknown> {\n return {\n type: 'mcp_toolset',\n mcp_server_name: serverName,\n default_config: { defer_loading: true },\n configs: Object.fromEntries(HOT_TOOLS.map((n) => [n, { defer_loading: false }])),\n };\n}\n"]}
|