@vibgrate/cli 2026.826.1 → 2026.829.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/DOCS.md +204 -9
  2. package/README.md +2 -0
  3. package/dist/{agent-4RHH2FR2.js → agent-5GW7C7EB.js} +14 -14
  4. package/dist/{agent-4RHH2FR2.js.map → agent-5GW7C7EB.js.map} +1 -1
  5. package/dist/{approvals-XDFM346D.js → approvals-ISJFILVK.js} +5 -5
  6. package/dist/{approvals-XDFM346D.js.map → approvals-ISJFILVK.js.map} +1 -1
  7. package/dist/{attach-LGTCYNKC.js → attach-JUSALQ75.js} +3 -3
  8. package/dist/{attach-LGTCYNKC.js.map → attach-JUSALQ75.js.map} +1 -1
  9. package/dist/baseline-YL2IZZ4Y.js +9 -0
  10. package/dist/{baseline-PRY5HKL5.js.map → baseline-YL2IZZ4Y.js.map} +1 -1
  11. package/dist/{chunk-ZRDTI67N.js → chunk-5RW5PIBH.js} +3 -3
  12. package/dist/{chunk-ZRDTI67N.js.map → chunk-5RW5PIBH.js.map} +1 -1
  13. package/dist/{chunk-TUVB6Q6F.js → chunk-65YN3BG3.js} +1207 -40
  14. package/dist/chunk-65YN3BG3.js.map +1 -0
  15. package/dist/{chunk-TKUWEJZJ.js → chunk-B5VCPIKT.js} +7 -6
  16. package/dist/chunk-B5VCPIKT.js.map +1 -0
  17. package/dist/{chunk-WU2DVESP.js → chunk-BA6YBVNT.js} +3 -3
  18. package/dist/{chunk-WU2DVESP.js.map → chunk-BA6YBVNT.js.map} +1 -1
  19. package/dist/{chunk-IM7HME2T.js → chunk-BODXEZEY.js} +9 -9
  20. package/dist/{chunk-IM7HME2T.js.map → chunk-BODXEZEY.js.map} +1 -1
  21. package/dist/{chunk-PIB3YNJU.js → chunk-D3SV3JWB.js} +3 -3
  22. package/dist/{chunk-PIB3YNJU.js.map → chunk-D3SV3JWB.js.map} +1 -1
  23. package/dist/chunk-EGMBHPXV.js +127 -0
  24. package/dist/chunk-EGMBHPXV.js.map +1 -0
  25. package/dist/{chunk-7KOEEEIZ.js → chunk-FHSEK64W.js} +7 -7
  26. package/dist/{chunk-7KOEEEIZ.js.map → chunk-FHSEK64W.js.map} +1 -1
  27. package/dist/{chunk-PEHMRPYM.js → chunk-FKCN653F.js} +3 -3
  28. package/dist/{chunk-PEHMRPYM.js.map → chunk-FKCN653F.js.map} +1 -1
  29. package/dist/{chunk-K2IWOZEQ.js → chunk-FPIMNVLI.js} +12 -4
  30. package/dist/chunk-FPIMNVLI.js.map +1 -0
  31. package/dist/{chunk-BHDP7EVJ.js → chunk-HHMWE52J.js} +10 -135
  32. package/dist/chunk-HHMWE52J.js.map +1 -0
  33. package/dist/{chunk-5UG4UHKU.js → chunk-HUJZO4K5.js} +281 -106
  34. package/dist/chunk-HUJZO4K5.js.map +1 -0
  35. package/dist/{chunk-TQ75FB52.js → chunk-JWQ2JCQS.js} +4 -4
  36. package/dist/{chunk-TQ75FB52.js.map → chunk-JWQ2JCQS.js.map} +1 -1
  37. package/dist/{chunk-WGA4KUGS.js → chunk-K7QR7U3V.js} +12 -11
  38. package/dist/chunk-K7QR7U3V.js.map +1 -0
  39. package/dist/{chunk-E44I7635.js → chunk-KCKG3EEJ.js} +3 -3
  40. package/dist/{chunk-E44I7635.js.map → chunk-KCKG3EEJ.js.map} +1 -1
  41. package/dist/{chunk-WGSLN73L.js → chunk-MMIIVRQC.js} +7 -7
  42. package/dist/chunk-MMIIVRQC.js.map +1 -0
  43. package/dist/chunk-N6R4XPLX.js +27 -0
  44. package/dist/chunk-N6R4XPLX.js.map +1 -0
  45. package/dist/{chunk-WPQCJADP.js → chunk-NQQT75AN.js} +62 -22
  46. package/dist/chunk-NQQT75AN.js.map +1 -0
  47. package/dist/{chunk-TOHNVUDD.js → chunk-NSC7ZK62.js} +3 -3
  48. package/dist/{chunk-TOHNVUDD.js.map → chunk-NSC7ZK62.js.map} +1 -1
  49. package/dist/{chunk-LAYDXJEQ.js → chunk-OAYSRM7J.js} +12 -14
  50. package/dist/chunk-OAYSRM7J.js.map +1 -0
  51. package/dist/{chunk-R5BGRJ6X.js → chunk-QMROD7MI.js} +15 -8
  52. package/dist/chunk-QMROD7MI.js.map +1 -0
  53. package/dist/{chunk-SHD5TCZ5.js → chunk-R2FX4USU.js} +7 -7
  54. package/dist/chunk-R2FX4USU.js.map +1 -0
  55. package/dist/{chunk-7S4ELKK6.js → chunk-RL7JYG3D.js} +3 -3
  56. package/dist/{chunk-7S4ELKK6.js.map → chunk-RL7JYG3D.js.map} +1 -1
  57. package/dist/{chunk-QLNJ3VWO.js → chunk-RRSUNTZI.js} +3 -3
  58. package/dist/{chunk-QLNJ3VWO.js.map → chunk-RRSUNTZI.js.map} +1 -1
  59. package/dist/{chunk-QONHVC4H.js → chunk-TWFPHXPN.js} +3 -3
  60. package/dist/{chunk-QONHVC4H.js.map → chunk-TWFPHXPN.js.map} +1 -1
  61. package/dist/chunk-UGRUG2FA.js +6 -0
  62. package/dist/{chunk-JQ7OL4XG.js.map → chunk-UGRUG2FA.js.map} +1 -1
  63. package/dist/{chunk-XW4FCBL4.js → chunk-VOEEYCR3.js} +6 -6
  64. package/dist/{chunk-XW4FCBL4.js.map → chunk-VOEEYCR3.js.map} +1 -1
  65. package/dist/{chunk-WHNB3443.js → chunk-WBDRBP22.js} +4 -4
  66. package/dist/{chunk-WHNB3443.js.map → chunk-WBDRBP22.js.map} +1 -1
  67. package/dist/{chunk-NQU6E6OG.js → chunk-YL332BU2.js} +20 -15
  68. package/dist/chunk-YL332BU2.js.map +1 -0
  69. package/dist/{chunk-IEZCFMNL.js → chunk-ZQY5TWCB.js} +3 -3
  70. package/dist/{chunk-IEZCFMNL.js.map → chunk-ZQY5TWCB.js.map} +1 -1
  71. package/dist/cli.d.ts +16 -1
  72. package/dist/cli.js +2359 -340
  73. package/dist/cli.js.map +1 -1
  74. package/dist/{daemon-2YMCH7R2.js → daemon-NRIIDMX2.js} +10 -10
  75. package/dist/{daemon-2YMCH7R2.js.map → daemon-NRIIDMX2.js.map} +1 -1
  76. package/dist/embed-worker-main.js +3 -3
  77. package/dist/{ensure-map-S2GBW2UC.js → ensure-map-VAIYCCEJ.js} +17 -16
  78. package/dist/{ensure-map-S2GBW2UC.js.map → ensure-map-VAIYCCEJ.js.map} +1 -1
  79. package/dist/explain-EXPJTCB5.js +126 -0
  80. package/dist/explain-EXPJTCB5.js.map +1 -0
  81. package/dist/{graph-backend-QDEU5RIR.js → graph-backend-V5A2H5ZB.js} +7 -7
  82. package/dist/{graph-backend-QDEU5RIR.js.map → graph-backend-V5A2H5ZB.js.map} +1 -1
  83. package/dist/index.d.ts +217 -13
  84. package/dist/index.js +17 -16
  85. package/dist/index.js.map +1 -1
  86. package/dist/{interactive-GMGWUEQO.js → interactive-VQM2CTE2.js} +32 -31
  87. package/dist/interactive-VQM2CTE2.js.map +1 -0
  88. package/dist/load-UAVA732M.js +11 -0
  89. package/dist/{load-JXCTAAEI.js.map → load-UAVA732M.js.map} +1 -1
  90. package/dist/parse-worker.js +2 -2
  91. package/dist/{rules-ASYEUNB5.js → rules-TLRGB5L4.js} +12 -4
  92. package/dist/rules-TLRGB5L4.js.map +1 -0
  93. package/dist/{run-outcome-5NA7PI52.js → run-outcome-EATWIKLR.js} +5 -5
  94. package/dist/{run-outcome-5NA7PI52.js.map → run-outcome-EATWIKLR.js.map} +1 -1
  95. package/dist/{runtime-session-IEM6DZDP.js → runtime-session-Y2BRBXUW.js} +9 -9
  96. package/dist/{runtime-session-IEM6DZDP.js.map → runtime-session-Y2BRBXUW.js.map} +1 -1
  97. package/dist/{session-VYFLJ7KL.js → session-N2FTYIHQ.js} +9 -9
  98. package/dist/{session-VYFLJ7KL.js.map → session-N2FTYIHQ.js.map} +1 -1
  99. package/dist/{stream-json-2ISQLKPD.js → stream-json-GCZAHORX.js} +14 -14
  100. package/dist/{stream-json-2ISQLKPD.js.map → stream-json-GCZAHORX.js.map} +1 -1
  101. package/dist/version-XNZ4GLMQ.js +4 -0
  102. package/dist/{version-B62ELJRY.js.map → version-XNZ4GLMQ.js.map} +1 -1
  103. package/dist/{vg-mcp-bridge-CJIK5U56.js → vg-mcp-bridge-VDZWFEO2.js} +22 -11
  104. package/dist/vg-mcp-bridge-VDZWFEO2.js.map +1 -0
  105. package/dist/{vgd-4EB6SKFB.js → vgd-3A2TRNP5.js} +8 -8
  106. package/dist/vgd-3A2TRNP5.js.map +1 -0
  107. package/package.json +2 -2
  108. package/dist/baseline-PRY5HKL5.js +0 -9
  109. package/dist/chunk-5UG4UHKU.js.map +0 -1
  110. package/dist/chunk-BHDP7EVJ.js.map +0 -1
  111. package/dist/chunk-JQ7OL4XG.js +0 -6
  112. package/dist/chunk-K2IWOZEQ.js.map +0 -1
  113. package/dist/chunk-LAYDXJEQ.js.map +0 -1
  114. package/dist/chunk-NQU6E6OG.js.map +0 -1
  115. package/dist/chunk-R5BGRJ6X.js.map +0 -1
  116. package/dist/chunk-SHD5TCZ5.js.map +0 -1
  117. package/dist/chunk-TKUWEJZJ.js.map +0 -1
  118. package/dist/chunk-TUVB6Q6F.js.map +0 -1
  119. package/dist/chunk-WGA4KUGS.js.map +0 -1
  120. package/dist/chunk-WGSLN73L.js.map +0 -1
  121. package/dist/chunk-WPQCJADP.js.map +0 -1
  122. package/dist/chunk-YENM3HT7.js +0 -23
  123. package/dist/chunk-YENM3HT7.js.map +0 -1
  124. package/dist/interactive-GMGWUEQO.js.map +0 -1
  125. package/dist/load-JXCTAAEI.js +0 -11
  126. package/dist/rules-ASYEUNB5.js.map +0 -1
  127. package/dist/version-B62ELJRY.js +0 -4
  128. package/dist/vg-mcp-bridge-CJIK5U56.js.map +0 -1
  129. package/dist/vgd-4EB6SKFB.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/review/schemas.ts","../src/review/push.ts","../src/reporting/commands/push.ts","../src/mcp/vuln-data.ts","../src/mcp/attribution.ts","../src/review/auth.ts","../src/review/dimensions.ts","../src/review/routes.ts","../src/review/similarity.ts","../src/review/assess.ts","../src/review/dominance.ts","../src/review/git.ts","../src/review/intent.ts","../src/review/mcp-assess.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","chalk","path3","fs3","gzip","path5","fs4","Command","path6","path7","fs5","numstat","status","hunks","path8","fs6","path9","fs7","full","path10","fs8","obj","uniqueNames","path11","fs9"],"mappings":"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","file":"chunk-65YN3BG3.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","/**\n * Vibgrate Review — the three wire schemas.\n *\n * These TypeScript shapes are normative for:\n * - `vg.analysis.capsule.v1` — the bounded evidence packet (internal; never\n * uploaded by default)\n * - `vg.review.findings.v1` — what scanners (and, later, a local model)\n * produce. **No `decision` field** — findings never decide.\n * - `vg.review.receipt.v1` — the public machine result: the `--format json`\n * document and the Cloud ingest payload. `decision` is written *only* here,\n * and only by policy.\n *\n * Layer ownership (spec §1) is enforced by the type system as far as it can be:\n * a `ReviewFindings` value has nowhere to put a decision, so a model that\n * emits one is rejected by {@link verifyFindings} rather than silently obeyed.\n */\n\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { canonicalize } from '../engine/hash.js';\n\nexport const CAPSULE_SCHEMA = 'vg.analysis.capsule.v1' as const;\nexport const FINDINGS_SCHEMA = 'vg.review.findings.v1' as const;\nexport const RECEIPT_SCHEMA = 'vg.review.receipt.v1' as const;\n\n/** The policy module version stamped into every receipt (`versions.policy`). */\nexport const REVIEW_POLICY_VERSION = 'vg-policy-0.1.0' as const;\n\n// ─── Capsule ────────────────────────────────────────────────────────────────\n\n/** Capsule budget profile. Interactive is narrower than a PR/CI run. */\nexport type CapsuleProfile = 'interactive-narrow' | 'ci-wide';\n\n/**\n * Token budgets (spec §4.1). These are medians for the compiled capsule, with a\n * hard cap that the compiler trims to regardless of profile.\n */\nexport const CAPSULE_BUDGETS: Record<CapsuleProfile, { median: number; cap: number }> = {\n 'interactive-narrow': { median: 3_000, cap: 16_000 },\n 'ci-wide': { median: 10_000, cap: 16_000 },\n};\n\n/** At most this many role-equivalent peers per role (spec §4.1). */\nexport const MAX_ROLE_PEERS = 5;\n\nexport type EvidenceKind =\n | 'graph_edge'\n | 'graph_node'\n | 'role'\n | 'policy'\n | 'dependency'\n | 'source_span';\n\nexport interface CapsuleEvidence {\n /** Stable, capsule-local id — `edge:1842`, `role:handler:17`, `policy:layering:4`. */\n id: string;\n kind: EvidenceKind;\n path?: string;\n start_line?: number;\n end_line?: number;\n /**\n * A deterministic fact policy may not let a model bless away: an unguarded\n * entrypoint, a validated taint flow, a known-vulnerable dependency.\n */\n protected_finding: boolean;\n /** Free-form, bounded detail (never source text). */\n note?: string;\n}\n\nexport interface CapsuleIdentity {\n repo_pseudonym: string;\n language: string;\n graph_schema: string;\n analyzer_versions: { graph: string; scanners: string };\n profile: CapsuleProfile;\n}\n\nexport interface CapsuleChangeSymbol {\n /** Graph node id, when the changed span resolved to one. */\n node_id?: string;\n name: string;\n kind: string;\n path: string;\n start_line: number;\n end_line: number;\n}\n\nexport type ChangeOp = 'added' | 'modified' | 'removed' | 'renamed';\n\nexport interface CapsuleChangeEdge {\n /** Capsule evidence id for the edge. */\n evidence_id: string;\n kind: string;\n from_path: string;\n to_path: string;\n from_layer?: string;\n to_layer?: string;\n}\n\nexport interface CapsuleChange {\n base_sha: string;\n head_sha: string;\n dirty: boolean;\n dirty_tree_hash: string | null;\n symbols: CapsuleChangeSymbol[];\n ops: { path: string; op: ChangeOp; added_lines: number; removed_lines: number }[];\n added_edges: CapsuleChangeEdge[];\n removed_edges: CapsuleChangeEdge[];\n contract_changes: { path: string; symbol: string; before: string; after: string }[];\n}\n\nexport interface CapsuleRole {\n /** Capsule evidence id (`role:handler:17`). */\n evidence_id: string;\n path: string;\n role: string;\n layer: string;\n confidence: number;\n /** Whether this file is inside the change set. */\n changed: boolean;\n}\n\nexport interface CapsuleArea {\n id: number;\n label: string;\n size: number;\n changed_members: number;\n}\n\nexport interface CapsulePatterns {\n /** The layering shape the repository actually exhibits, when one dominates. */\n observed_dominant_pattern: string | null;\n /** The shape the repository *said* it wants (`.vibgrate/review.toml`). */\n declared_target_pattern: string | null;\n approved_exceptions: string[];\n legacy_pattern: string | null;\n /**\n * True when neither an observed majority nor a declared target could be\n * established. Mandatory even when false — majority is never silently\n * treated as correctness (spec §4.1).\n */\n unknown: boolean;\n}\n\nexport interface CapsulePath {\n /** Capsule evidence id for the traversal. */\n evidence_id: string;\n from: string;\n to: string;\n hops: string[];\n /** Whether a guard (auth check, validation) was observed along the path. */\n guarded: boolean | null;\n}\n\nexport interface CapsuleSecurityFact {\n evidence_id: string;\n kind: 'unguarded_entrypoint' | 'validated_taint' | 'known_vulnerable_dependency' | 'guard_removed';\n path: string;\n detail: string;\n protected_finding: boolean;\n}\n\nexport interface CapsulePolicyFact {\n evidence_id: string;\n id: string;\n rule: string;\n source: 'review.toml' | 'derived';\n}\n\nexport interface CapsuleVerificationFact {\n evidence_id: string;\n kind: 'test_covering_change' | 'no_test_covering_change';\n path: string;\n detail: string;\n}\n\nexport interface AnalysisCapsule {\n schema_version: typeof CAPSULE_SCHEMA;\n identity: CapsuleIdentity;\n change: CapsuleChange;\n roles: CapsuleRole[];\n areas: CapsuleArea[];\n patterns: CapsulePatterns;\n paths: CapsulePath[];\n security: CapsuleSecurityFact[];\n policies: CapsulePolicyFact[];\n verification: CapsuleVerificationFact[];\n evidence: CapsuleEvidence[];\n}\n\n// ─── Findings ───────────────────────────────────────────────────────────────\n\nexport type FindingSeverity = 'low' | 'medium' | 'high' | 'critical';\n\nexport type TargetAlignment =\n | 'regression'\n | 'target'\n | 'legacy_consistent'\n | 'approved_exception'\n | 'unknown';\n\nexport const TARGET_ALIGNMENTS: readonly TargetAlignment[] = [\n 'regression',\n 'target',\n 'legacy_consistent',\n 'approved_exception',\n 'unknown',\n];\n\nexport interface ReviewFinding {\n id: string;\n kind: string;\n severity: FindingSeverity;\n /** 0..1. Calibrated for deterministic scanners; model-supplied otherwise. */\n confidence: number;\n claim: string;\n /** Must all resolve against the capsule's `evidence[]`. */\n evidence_ids: string[];\n target_alignment: TargetAlignment;\n remediation: string;\n paths: string[];\n /**\n * Mirror of the protected flag on this finding's evidence. Present on the\n * finding so a receipt consumer never has to re-derive it from the capsule\n * (which is not uploaded).\n */\n protected_finding?: boolean;\n /** Which producer emitted it — deterministic scanners, or the local model. */\n source?: 'scanner' | 'model';\n}\n\nexport type ChangeClass = 'architecture' | 'security' | 'none';\n\nexport interface ReviewFindings {\n schema_version: typeof FINDINGS_SCHEMA;\n change_class: ChangeClass[];\n architecture_findings: ReviewFinding[];\n security_findings: ReviewFinding[];\n unknowns: string[];\n required_checks: string[];\n}\n\n// ─── Receipt ────────────────────────────────────────────────────────────────\n\nexport type ReviewDecision = 'pass' | 'needs_review' | 'fail' | 'undetermined';\n\nexport const REVIEW_DECISIONS: readonly ReviewDecision[] = [\n 'pass',\n 'needs_review',\n 'fail',\n 'undetermined',\n];\n\nexport type ReviewEnforcement = 'advisory' | 'enforced';\n\nexport interface ReviewReceipt {\n schema_version: typeof RECEIPT_SCHEMA;\n receipt_id: string;\n created_at: string;\n workspace_id: string | null;\n repo: { name: string | null; remote: string | null; repo_key: string };\n git: {\n base_sha: string;\n head_sha: string;\n merge_base: string | null;\n ref: string | null;\n dirty: boolean;\n dirty_tree_hash: string | null;\n };\n decision: ReviewDecision;\n enforcement: ReviewEnforcement;\n quick_path: boolean;\n change_class: ChangeClass[];\n counts: {\n architecture: number;\n security: number;\n protected: number;\n unknowns: number;\n };\n findings: ReviewFindings;\n versions: {\n cli: string;\n graph_schema: string;\n policy: string;\n model: string;\n quantization: string | null;\n capsule_schema: typeof CAPSULE_SCHEMA;\n };\n digests: {\n capsule: string;\n findings: string;\n evidence: string;\n receipt: string;\n };\n verification: {\n /**\n * True only if policy was asked to emit `pass` while an unresolved\n * protected fact was present. It never is — the invariant holds — so this\n * field exists to prove the check ran, not to record a permitted state.\n */\n protected_false_bless: boolean;\n schema_valid: boolean;\n evidence_ids_valid: boolean;\n };\n signature: string | null;\n}\n\n/** The Cloud ingest envelope (spec §6.1). */\nexport interface ReviewIngestEnvelope {\n kind: 'review';\n schema_version: typeof RECEIPT_SCHEMA;\n workspace_id: string | null;\n pushed_at: string;\n cli_version: string;\n receipt: ReviewReceipt;\n}\n\n// ─── Digests ────────────────────────────────────────────────────────────────\n\n/** `sha256:<hex>` over the canonical JSON of a value. */\nexport function digest(value: unknown): string {\n return `sha256:${bytesToHex(sha256(new TextEncoder().encode(canonicalize(value))))}`;\n}\n\n/** `sha256:<hex>` over a raw UTF-8 string (paths, tree listings, remotes). */\nexport function digestString(input: string): string {\n return `sha256:${bytesToHex(sha256(new TextEncoder().encode(input)))}`;\n}\n\n/**\n * The receipt digest covers every field *except* `digests.receipt` and\n * `signature`, so a verifier can recompute it from the receipt it holds.\n */\nexport function receiptDigest(receipt: ReviewReceipt): string {\n const { digests, signature: _signature, ...rest } = receipt;\n const { receipt: _self, ...digestsWithoutSelf } = digests;\n return digest({ ...rest, digests: digestsWithoutSelf });\n}\n\n/**\n * Lineage fingerprint for a finding (spec §6.2). Deliberately *not* an identity\n * across repositories — it exists so ingest can say \"this commit introduced it\"\n * and \"that commit resolved it\".\n */\nexport function findingFingerprint(finding: ReviewFinding): string {\n const primaryPath = [...finding.paths].sort()[0] ?? '';\n const normalizedClaim = finding.claim.trim().replace(/\\s+/g, ' ').toLowerCase();\n return digestString(`${finding.kind}\\0${primaryPath}\\0${normalizedClaim}`);\n}\n\n/**\n * A ULID-ish receipt id: `rvw_` + Crockford-base32 of the timestamp and a\n * caller-supplied entropy source. The entropy is injectable so tests (and\n * `--generated-at`) can produce byte-identical receipts.\n */\nexport function receiptId(createdAtMs: number, entropy: string): string {\n const alphabet = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n let time = '';\n let ms = Math.max(0, Math.floor(createdAtMs));\n for (let i = 0; i < 10; i++) {\n time = alphabet[ms % 32] + time;\n ms = Math.floor(ms / 32);\n }\n const tail = bytesToHex(sha256(new TextEncoder().encode(entropy)))\n .slice(0, 16)\n .toUpperCase()\n .replace(/[^0-9A-HJKMNP-TV-Z]/g, '0');\n return `rvw_${time}${tail}`;\n}\n","/**\n * `vg review --push` — send the receipt to Vibgrate Cloud.\n *\n * Reuses the existing workspace identity, DSN, and ingest host: Review does not\n * create a second cloud product. The envelope carries `kind: \"review\"` so the\n * ingest writer switches on it (spec §6.1) — drift keeps using `kind: \"scan\"`.\n *\n * **Source, prompts, and capsules are not telemetry.** By default the payload\n * is the receipt: decisions, claims, evidence ids, and paths. Line ranges are\n * opt-in (`--include-spans`); source snippets are a second, explicit opt-in\n * (`--include-snippets`) and are capped. The capsule body is never sent.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { VERSION } from '../version.js';\nimport type { AnalysisCapsule, ReviewIngestEnvelope, ReviewReceipt } from './schemas.js';\nimport { RECEIPT_SCHEMA } from './schemas.js';\n\n/** Snippet cap — a handful of lines per finding, never a file. */\nconst MAX_SNIPPET_LINES = 12;\nconst MAX_SNIPPET_FINDINGS = 20;\n\nexport interface PushPrivacy {\n includeSpans?: boolean;\n includeSnippets?: boolean;\n}\n\nexport interface ReviewSpanRef {\n evidence_id: string;\n path: string;\n start_line: number;\n end_line: number;\n /** Present only under `--include-snippets`; capped to MAX_SNIPPET_LINES. */\n snippet?: string;\n}\n\nexport interface ReviewPushBody extends ReviewIngestEnvelope {\n /** Present only under `--include-spans` / `--include-snippets`. */\n spans?: ReviewSpanRef[];\n}\n\n/**\n * `--offline` / `--local` forbids `--push`. The receipt stays on disk; an\n * upload would be a network call the user explicitly ruled out.\n */\nexport function rejectPushWhenOffline(offline: boolean | undefined): void {\n if (!offline) return;\n throw new CliError(\n '`--push` needs the network — drop `--offline` (or `--local`) to upload the receipt, or drop `--push` to keep it on disk',\n ExitCode.USAGE_ERROR,\n );\n}\n\nexport function buildEnvelope(\n receipt: ReviewReceipt,\n opts: { workspaceId?: string | null; pushedAt: string } = { pushedAt: new Date().toISOString() },\n): ReviewIngestEnvelope {\n return {\n kind: 'review',\n schema_version: RECEIPT_SCHEMA,\n workspace_id: opts.workspaceId ?? receipt.workspace_id ?? null,\n pushed_at: opts.pushedAt,\n cli_version: VERSION,\n receipt,\n };\n}\n\n/**\n * Collect the opt-in span references. Returns `undefined` when neither privacy\n * flag is set — the field is then absent from the payload rather than empty,\n * so the server can tell \"not sent\" from \"sent, none\".\n */\nexport function collectSpans(\n root: string,\n receipt: ReviewReceipt,\n capsule: AnalysisCapsule,\n privacy: PushPrivacy,\n): ReviewSpanRef[] | undefined {\n if (!privacy.includeSpans && !privacy.includeSnippets) return undefined;\n const citedIds = new Set(\n [...receipt.findings.architecture_findings, ...receipt.findings.security_findings]\n .slice(0, MAX_SNIPPET_FINDINGS)\n .flatMap((f) => f.evidence_ids),\n );\n const spans: ReviewSpanRef[] = [];\n for (const e of capsule.evidence) {\n if (!citedIds.has(e.id)) continue;\n if (!e.path || e.start_line === undefined || e.end_line === undefined) continue;\n const ref: ReviewSpanRef = {\n evidence_id: e.id,\n path: e.path,\n start_line: e.start_line,\n end_line: e.end_line,\n };\n if (privacy.includeSnippets) {\n const snippet = readSnippet(root, e.path, e.start_line, e.end_line);\n if (snippet) ref.snippet = snippet;\n }\n spans.push(ref);\n }\n return spans;\n}\n\nfunction readSnippet(root: string, rel: string, start: number, end: number): string | null {\n try {\n const abs = path.join(root, rel);\n if (!fs.existsSync(abs)) return null;\n const lines = fs.readFileSync(abs, 'utf8').split('\\n');\n return lines.slice(Math.max(0, start - 1), Math.min(lines.length, start - 1 + MAX_SNIPPET_LINES, end)).join('\\n');\n } catch {\n return null;\n }\n}\n\nexport interface ParsedDsn {\n keyId: string;\n secret: string;\n host: string;\n workspaceId: string;\n scheme: 'https' | 'http';\n}\n\nexport interface PushResult {\n ok: boolean;\n status: number;\n host: string;\n detail?: string;\n}\n\n/**\n * POST the envelope. Network failures are surfaced with the host that was\n * tried; the caller decides whether that is fatal (`--strict`) or a warning.\n */\nexport async function pushReceipt(\n dsn: ParsedDsn,\n body: ReviewPushBody,\n fetchImpl: typeof fetch = fetch,\n): Promise<PushResult> {\n const url = `${dsn.scheme}://${dsn.host}/v1/ingest/review`;\n const payload = JSON.stringify(body);\n let res: Response;\n try {\n res = await fetchImpl(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Vibgrate-Timestamp': String(Date.now()),\n Authorization: `VibgrateDSN ${dsn.keyId}:${dsn.secret}`,\n },\n body: payload,\n signal: AbortSignal.timeout(30_000),\n });\n } catch (e) {\n throw new CliError(\n `could not reach ${dsn.host}: ${e instanceof Error ? e.message : String(e)}`,\n ExitCode.ERROR,\n );\n }\n if (!res.ok) {\n const detail = await res.text().catch(() => '');\n return { ok: false, status: res.status, host: dsn.host, detail: detail.slice(0, 200) };\n }\n return { ok: true, status: res.status, host: dsn.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';\nimport { buildEnvelope, pushReceipt } from '../../review/push.js';\nimport { RECEIPT_SCHEMA, type ReviewReceipt } from '../../review/schemas.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 a scan artifact — or a `vg review` receipt — to Vibgrate Cloud')\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, or a vg.review.receipt.v1 file (auto-detected)', '.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(`Artifact not found: ${filePath}`));\n console.error(chalk.dim('Run \"vg scan\" (or \"vg review --out <file>\") first.'));\n if (opts.strict) process.exit(1);\n return;\n }\n\n // `vg push` accepts a review receipt the same way it accepts a scan\n // artifact. The two are told apart by `schema_version`, not by filename or\n // a flag: a receipt is self-describing, so pointing `--file` at one is\n // enough and there is no way to push it to the wrong writer.\n const document = await readJsonFile<{ schema_version?: string }>(filePath);\n if (document?.schema_version === RECEIPT_SCHEMA) {\n const receipt = document as unknown as ReviewReceipt;\n const envelope = buildEnvelope(receipt, {\n workspaceId: parsed.workspaceId,\n pushedAt: new Date().toISOString(),\n });\n console.log(\n chalk.dim(`Uploading review receipt (${receipt.decision}) for ${receipt.git.head_sha.slice(0, 8)}...`),\n );\n const result = await pushReceipt(parsed, envelope);\n if (!result.ok) {\n console.error(chalk.red(`Upload failed (${result.status}): ${result.detail ?? ''}`));\n if (opts.strict) process.exit(1);\n return;\n }\n console.log(chalk.green('✔') + ` Review receipt pushed to ${result.host}`);\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 = document as unknown as ScanArtifact;\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","/**\n * Route authorization classification — the protected-finding engine.\n *\n * Replaces \"does this file contain a word that looks like a guard?\" with an\n * actual model of routes and the guards that reach them. The difference matters\n * because `unguarded_entrypoint` is a **protected** finding: policy cannot emit\n * `pass` while one is unresolved, so a false positive here blocks a merge and a\n * false negative ships an open endpoint. Neither is acceptable, and a regex\n * over a whole file produces both — it fires on a handler whose only \"auth\" is\n * the word `canonical`, and misses a route guarded by a router-level middleware\n * three lines above.\n *\n * The design rule that makes it safe: **there are three answers, not two.**\n * A route is `auth`, `not-auth`, or `unsure`, and `unsure` is never promoted to\n * either. An ambiguous route contributes nothing to the vote and produces no\n * protected finding — it becomes an honest unknown instead. Claiming a route is\n * guarded when we could not tell is the one failure mode that would make the\n * protected-finding invariant a lie.\n */\n\n/** Below this many classified peers, a deviation is advisory and cannot gate. */\nexport const MIN_SECURITY_PEERS = 4;\n\n/** Share of peers that must be guarded before an unguarded one is a deviation. */\nexport const AUTH_DOMINANCE_SHARE = 0.75;\n\n/** Methods that change state. An unguarded GET is a different (lesser) problem. */\nexport const MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE', 'ALL']);\n\nexport type AuthVerdict = 'auth' | 'not-auth' | 'unsure';\n\nexport interface Route {\n path: string;\n /** Repo-relative file the route is declared in. */\n file: string;\n line: number;\n method: string;\n /** Route-level guard expressions found on the declaration itself. */\n inlineGuards: string[];\n /** Guards inherited from a router/group/controller the route sits inside. */\n inheritedGuards: string[];\n /** True when the declaration explicitly opts out (`@public`, allowlist). */\n explicitlyPublic: boolean;\n /** True when the file could not be parsed with confidence. */\n unreadable: boolean;\n}\n\nexport interface ClassifiedRoute extends Route {\n verdict: AuthVerdict;\n /** Which rule decided it — carried into the finding's evidence. */\n rule: string;\n}\n\n/**\n * Guard vocabulary. Recognition is generous and the *absence* claim is narrow:\n * an unrecognised call makes a route `unsure`, never `not-auth`, so a bespoke\n * in-house guard degrades to \"we could not tell\" rather than \"it is open\".\n */\nconst GUARD_CALL =\n /\\b(authorize|authorise|authenticate|requireAuth|requireUser|requireLogin|requireRole|requireScope|requirePermission|ensureAuth|ensureLoggedIn|checkPermission|checkAccess|hasPermission|hasRole|verifyToken|verifyJwt|verifySession|assertScope|assertPermission|isAuthenticated|withAuth|protect|guard)\\b/i;\n\nconst GUARD_ATTRIBUTE =\n /(\\[\\s*Authorize\\b)|(@(?:PreAuthorize|PostAuthorize|Secured|RolesAllowed|UseGuards|login_required|permission_required|requires_auth|authenticated))\\b/;\n\nconst GUARD_MIDDLEWARE = /\\b(passport|jwt|oauth|session|clerk|auth0|nextAuth|authMiddleware|isAuth)\\b/i;\n\n/**\n * Explicit opt-outs. A route that says it is public is not a finding.\n * Exported so the extractor and the classifier cannot drift apart — two copies\n * of a safety-critical pattern is how a suppression stops working silently.\n */\nexport const PUBLIC_MARKER =\n /(@vibgrate-public|@public\\b|\\[\\s*AllowAnonymous\\s*\\]|@AnonymousAllowed|permit_all|public\\s*:\\s*true)/i;\n\nexport function looksLikeGuard(expression: string): boolean {\n return (\n GUARD_CALL.test(expression) || GUARD_ATTRIBUTE.test(expression) || GUARD_MIDDLEWARE.test(expression)\n );\n}\n\n/**\n * Classify one route, by a fixed precedence. The order is the safety property:\n * an explicit public marker beats everything (a human said so), unreadability\n * beats a guess, and a guard has to be *visible* to count.\n *\n * 1. explicitly public → `not-auth` (declared, not inferred — no finding)\n * 2. unreadable → `unsure` (we could not parse it; never guess)\n * 3. inline guard → `auth`\n * 4. inherited guard → `auth`\n * 5. otherwise → `not-auth` for a readable route with no guard at all\n *\n * Rule 5 is the only one that can produce a protected finding, and it requires\n * the file to have parsed cleanly *and* no guard to be present anywhere in\n * scope. Everything short of that lands on `unsure`.\n */\nexport function classifyRoute(route: Route): ClassifiedRoute {\n const decide = (verdict: AuthVerdict, rule: string): ClassifiedRoute => ({ ...route, verdict, rule });\n\n if (route.explicitlyPublic) return decide('not-auth', 'explicit-public-marker');\n if (route.unreadable) return decide('unsure', 'unreadable');\n if (route.inlineGuards.some(looksLikeGuard)) return decide('auth', 'inline-guard');\n if (route.inheritedGuards.some(looksLikeGuard)) return decide('auth', 'inherited-guard');\n // A guard-shaped expression we do not recognise: present but unclassifiable.\n if (route.inlineGuards.length > 0 || route.inheritedGuards.length > 0) {\n return decide('unsure', 'unrecognised-guard-expression');\n }\n return decide('not-auth', 'no-guard-in-scope');\n}\n\nexport interface AuthVote {\n /** Peer group — the directory the routes are declared in. */\n group: string;\n /** Routes that reached a verdict (`unsure` excluded). */\n classified: number;\n guarded: number;\n share: number;\n /** True once `classified >= MIN_SECURITY_PEERS`. */\n aboveFloor: boolean;\n /** Mutating routes with no guard, when the group is dominantly guarded. */\n deviators: ClassifiedRoute[];\n /** Routes we could not classify — reported as unknowns, never as safe. */\n unsure: ClassifiedRoute[];\n}\n\n/**\n * Vote a group of routes on whether guarding is the convention here.\n *\n * Only **mutating** methods vote. A codebase that guards writes and leaves\n * reads open is making a deliberate choice, and counting the GETs would dilute\n * the share until the writes stop being a convention at all.\n *\n * The peer floor is what stops this being noise on a small surface: below\n * {@link MIN_SECURITY_PEERS} classified routes, \"most routes here are guarded\"\n * is not a claim three files can support, so findings are reported as advisory\n * and are not allowed to gate.\n */\nexport function voteAuth(group: string, routes: readonly ClassifiedRoute[]): AuthVote {\n const mutating = routes.filter((r) => MUTATING_METHODS.has(r.method.toUpperCase()));\n const unsure = mutating.filter((r) => r.verdict === 'unsure');\n const decided = mutating.filter((r) => r.verdict !== 'unsure');\n const guarded = decided.filter((r) => r.verdict === 'auth');\n const share = decided.length > 0 ? guarded.length / decided.length : 0;\n const aboveFloor = decided.length >= MIN_SECURITY_PEERS;\n\n const dominantlyGuarded = share >= AUTH_DOMINANCE_SHARE && guarded.length > 0;\n return {\n group,\n classified: decided.length,\n guarded: guarded.length,\n share,\n aboveFloor,\n deviators: dominantlyGuarded ? decided.filter((r) => r.verdict === 'not-auth') : [],\n unsure,\n };\n}\n\n/** Group routes by the directory they are declared in, then vote each group. */\nexport function voteAllAuth(routes: readonly ClassifiedRoute[]): AuthVote[] {\n const groups = new Map<string, ClassifiedRoute[]>();\n for (const r of routes) {\n const dir = r.file.split('/').slice(0, -1).join('/') || '.';\n let bucket = groups.get(dir);\n if (!bucket) groups.set(dir, (bucket = []));\n bucket.push(r);\n }\n return [...groups.entries()].sort((a, b) => (a[0] < b[0] ? -1 : 1)).map(([dir, rs]) => voteAuth(dir, rs));\n}\n","/**\n * Voting dimensions — the questions a peer vote can actually answer.\n *\n * A dimension turns a file into one label, so peers can be compared. Review\n * votes only on dimensions that are *architectural*: how a file reaches its\n * data, and whether an entrypoint is guarded. Naming, import order, comment\n * style and TODO density are style questions a linter already owns, and putting\n * them in the receipt would drown the two findings that matter (the crib's\n * \"do not do this\" list, item 4 — hygiene linters stay out of Review).\n *\n * Every label here is derived from the code map, never from a filename.\n */\n\nimport type { ArchitectureLayer } from '../core-open/types.js';\n\nexport type Dimension = 'data_access';\n\n/**\n * How a file reaches persistence.\n *\n * - `direct-persistence` — it imports/calls data-access or infrastructure itself\n * - `via-service` — it goes through the services layer\n * - `via-domain` — it only touches domain/entities\n * - `no-data-access` — it reaches neither (a pure view, a util)\n */\nexport type DataAccessPattern =\n | 'direct-persistence'\n | 'via-service'\n | 'via-domain'\n | 'no-data-access';\n\n/** Layers that are not tiers, and so never define a file's data-access shape. */\nconst EXEMPT = new Set<ArchitectureLayer>(['config', 'shared', 'testing']);\n\nconst PERSISTENCE = new Set<ArchitectureLayer>(['data-access', 'infrastructure']);\n\n/**\n * Label one file from the layers it depends on.\n *\n * Precedence is deliberate and not a max/min: reaching persistence *directly*\n * is the fact that matters, and it is not cancelled out by also going through a\n * service. A handler that calls both the service and the repository has still\n * bypassed the boundary once.\n */\nexport function classifyDataAccess(\n fileLayer: ArchitectureLayer,\n dependsOnLayers: readonly ArchitectureLayer[],\n): DataAccessPattern | null {\n // A file that *is* the persistence layer cannot bypass it.\n if (PERSISTENCE.has(fileLayer) || EXEMPT.has(fileLayer)) return null;\n\n const targets = dependsOnLayers.filter((l) => !EXEMPT.has(l) && l !== fileLayer);\n if (targets.some((l) => PERSISTENCE.has(l))) return 'direct-persistence';\n if (targets.includes('services')) return 'via-service';\n if (targets.includes('domain')) return 'via-domain';\n return 'no-data-access';\n}\n\n/**\n * Is deviating from `dominant` toward `actual` a step away from the declared\n * architecture, or merely different?\n *\n * Only `direct-persistence` is inherently a bypass. Moving from\n * `direct-persistence` to `via-service` is a file getting *better* than its\n * peers — Review must not flag the first file to modernise, which is precisely\n * the failure mode of treating a majority as correct.\n */\nexport function isRegression(actual: DataAccessPattern, dominant: DataAccessPattern | null): boolean {\n if (actual !== 'direct-persistence') return false;\n return dominant !== null && dominant !== 'direct-persistence';\n}\n\n/** Human-readable label for a pattern, used in claims and the context file. */\nexport function describePattern(pattern: string): string {\n switch (pattern) {\n case 'direct-persistence':\n return 'reaches persistence directly';\n case 'via-service':\n return 'goes through the service layer';\n case 'via-domain':\n return 'touches only domain types';\n case 'no-data-access':\n return 'does not reach data';\n default:\n return pattern;\n }\n}\n","/**\n * Route extraction — finding the entrypoints a change exposes.\n *\n * Deliberately a *line-oriented* extractor over the changed files rather than a\n * second AST pass: `vg build` already paid for the parse, and a full\n * framework-aware route model per language is a much larger project than the\n * protected-finding rule needs. What it must get right is narrower:\n *\n * - find the route declarations,\n * - find the guards that reach them, **including ones declared above** the\n * route (router-level middleware, a class attribute, a decorator stack),\n * - and say \"I could not tell\" whenever it is not sure.\n *\n * That last part is why this is safe to hang a protected finding on. The\n * extractor's failure mode is `unreadable: true` → `unsure` → no finding, never\n * a confident \"unguarded\".\n */\n\nimport { PUBLIC_MARKER, looksLikeGuard, type Route } from './auth.js';\n\n/**\n * Express / Koa / Fastify / Hono: `router.post('/x', guard, handler)`.\n * The captured tail is everything between the path and the closing paren, which\n * is where inline middleware lives.\n */\nconst JS_ROUTE =\n /\\b(?:app|router|api|server|r)\\s*\\.\\s*(get|post|put|patch|delete|all|use)\\s*\\(\\s*(['\"`])([^'\"`]*)\\2\\s*(,[^)]*)?/i;\n\n/** NestJS / Spring / FastAPI / Flask decorators: `@Post('/x')`, `@app.post(\"/x\")`. */\nconst DECORATOR_ROUTE =\n /@(?:app\\.|router\\.)?(Get|Post|Put|Patch|Delete|RequestMapping|GetMapping|PostMapping|PutMapping|DeleteMapping|route)\\s*\\(\\s*(['\"`])?([^'\"`)]*)\\2?/i;\n\n/** ASP.NET attributes: `[HttpPost(\"x\")]`. */\nconst DOTNET_ROUTE = /\\[\\s*Http(Get|Post|Put|Patch|Delete)\\s*(?:\\(\\s*\"([^\"]*)\"\\s*\\))?\\s*\\]/i;\n\n/** Go: `mux.HandleFunc(\"/x\", h)` / `r.POST(\"/x\", h)`. */\nconst GO_ROUTE =\n /\\b\\w+\\s*\\.\\s*(?:(GET|POST|PUT|PATCH|DELETE)|Handle(?:Func)?)\\s*\\(\\s*\"([^\"]*)\"\\s*(,[^)]*)?/;\n\n/**\n * Router-level middleware registration — a guard that genuinely applies to\n * every route declared after it.\n *\n * Decorator and attribute forms are deliberately **absent** here. `@UseGuards`\n * and `[Authorize]` attach to the one declaration below them; treating them as\n * scope-wide lets a guarded route shield every unguarded route after it in the\n * same file, which is the worst error this module can make. They are picked up\n * as *attached* guards instead, and only the class-level case below widens.\n */\nconst SCOPE_GUARD =\n /\\b(?:use|Use|UseMiddleware|beforeEach|before_request|AddAuthorization|RequireAuthorization)\\s*\\(/;\n\n/** A guard attribute/decorator sitting directly above a class declaration. */\nconst CLASS_DECLARATION = /\\b(?:public\\s+|export\\s+|abstract\\s+)*class\\s+\\w/;\n\n/** How many lines above a route can still contribute an inherited guard. */\nconst INHERIT_WINDOW = 12;\n\n/** Extensions this extractor understands. Anything else yields no routes. */\nconst SUPPORTED = /\\.(ts|tsx|js|jsx|mjs|cjs|mts|cts|cs|py|go|java|kt|rb|php)$/i;\n\nfunction methodOf(raw: string): string {\n const m = raw.toUpperCase().replace(/MAPPING$/, '').replace(/^REQUEST$/, 'ALL');\n return m === 'ROUTE' || m === 'HANDLE' || m === 'HANDLEFUNC' ? 'ALL' : m;\n}\n\n/**\n * Extract routes from one file's text.\n *\n * `unreadable` is set when the file looks like it declares routes but in a\n * shape this extractor does not model — a framework it does not know, or a\n * generated/minified file. Those routes become `unsure` and never produce a\n * protected finding.\n */\nexport function extractRoutes(file: string, text: string): Route[] {\n if (!SUPPORTED.test(file)) return [];\n const lines = text.split('\\n');\n const routes: Route[] = [];\n\n // A guard attribute above a *class* declaration really does cover every\n // action in that class, so it is the one decorator form that widens scope.\n const classGuards: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n if (!CLASS_DECLARATION.test(lines[i])) continue;\n for (let j = i - 1; j >= 0; j--) {\n const above = lines[j].trim();\n if (!above.startsWith('@') && !above.startsWith('[')) break;\n if (looksLikeGuard(above)) classGuards.push(above);\n }\n }\n\n // Guards that apply to everything below them, with the line they came from.\n const scopeGuards: { line: number; text: string }[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (SCOPE_GUARD.test(line)) scopeGuards.push({ line: i, text: line.trim() });\n\n const js = JS_ROUTE.exec(line);\n const decorator = js ? null : DECORATOR_ROUTE.exec(line);\n const dotnet = js || decorator ? null : DOTNET_ROUTE.exec(line);\n const go = js || decorator || dotnet ? null : GO_ROUTE.exec(line);\n if (!js && !decorator && !dotnet && !go) continue;\n\n let method: string;\n let routePath: string;\n let inlineTail = '';\n if (js) {\n // `.use(...)` registers middleware, not a route.\n if (js[1].toLowerCase() === 'use') continue;\n method = methodOf(js[1]);\n routePath = js[3] ?? '';\n inlineTail = js[4] ?? '';\n } else if (decorator) {\n method = methodOf(decorator[1]);\n routePath = decorator[3] ?? '';\n // The declaration line is the *route*, not a guard candidate. Treating it\n // as one makes every decorator route carry a non-empty, unrecognised\n // \"guard expression\", so a plainly unguarded `[HttpDelete]` degrades to\n // `unsure` and can never produce the finding it should. It counts only if\n // it independently carries a guard (`@Post('/x') @UseGuards(...)`).\n inlineTail = looksLikeGuard(line) ? line : '';\n } else if (dotnet) {\n method = methodOf(dotnet[1]);\n routePath = dotnet[2] ?? '';\n inlineTail = looksLikeGuard(line) ? line : '';\n } else {\n method = methodOf(go![1] ?? 'ALL');\n routePath = go![2] ?? '';\n inlineTail = go![3] ?? '';\n }\n\n // The decorator/attribute stack *directly attached* to this declaration:\n // the contiguous run of `@…` / `[…]` lines immediately above it.\n //\n // This must not be a fixed window of surrounding lines. A window swallows\n // the previous route's guard, so an unguarded route declared right below a\n // guarded one reads as guarded — a false negative on a protected finding,\n // which is the single worst outcome this module can produce. It also\n // swallows router-level `use()` calls, collapsing the inline/inherited\n // distinction that makes the classifier's precedence meaningful.\n const attached: string[] = [];\n for (let j = i - 1; j >= 0; j--) {\n const above = lines[j].trim();\n if (above.startsWith('@') || above.startsWith('[')) attached.unshift(above);\n else break;\n }\n\n // For a call-style route the tail is `, middleware…, handler`. The final\n // argument is the handler and is never a guard, so counting it would leave\n // every route carrying a non-empty unrecognised \"guard expression\" — and a\n // plainly unguarded route would degrade to `unsure` instead of being found.\n const tailArgs = inlineTail\n .replace(/^\\s*,/, '')\n .split(',')\n .map((a) => a.trim())\n .filter((a) => a.length > 0);\n const middlewareArgs = tailArgs.slice(0, -1);\n\n const inline = [...middlewareArgs, ...attached].filter((t) => t.trim().length > 0);\n routes.push({\n path: routePath,\n file,\n line: i + 1,\n method,\n inlineGuards: inline,\n inheritedGuards: [\n ...classGuards,\n ...scopeGuards.filter((g) => i - g.line <= INHERIT_WINDOW || g.line < 20).map((g) => g.text),\n ],\n explicitlyPublic: [line, ...attached].some((t) => PUBLIC_MARKER.test(t)),\n unreadable: false,\n });\n }\n\n return routes;\n}\n\n/**\n * Does this file look like it serves HTTP at all? Used to decide whether the\n * *absence* of extracted routes is meaningful (a plain util file) or suspicious\n * (a controller written in a framework we do not model).\n */\nexport function looksLikeRouteFile(text: string): boolean {\n return /\\b(app|router|route|controller|handler|endpoint|@Get|@Post|HttpGet|HttpPost|HandleFunc)\\b/i.test(\n text,\n );\n}\n\n/**\n * Routes for a file, marking them unreadable when the file advertises HTTP but\n * nothing could be extracted — that is the case where silence would be a lie.\n */\nexport function routesForFile(file: string, text: string): Route[] {\n const routes = extractRoutes(file, text);\n if (routes.length > 0) return routes;\n if (!SUPPORTED.test(file) || !looksLikeRouteFile(text)) return [];\n // It talks about routing but we could not parse a single declaration. Emit one\n // `unreadable` placeholder so the file is counted as \"not classified\" rather\n // than silently treated as having no entrypoints.\n return [\n {\n path: '',\n file,\n line: 1,\n method: 'ALL',\n inlineGuards: [],\n inheritedGuards: [],\n explicitlyPublic: false,\n unreadable: true,\n },\n ];\n}\n","/**\n * Near-duplicate detection — \"does this already exist?\"\n *\n * The question an AI coding agent is worst at. It cannot see the rest of the\n * repository while it writes, so it re-implements what is already there, in a\n * slightly different shape, under a different name. That is the single most\n * common way agent-written code degrades a codebase, and no linter catches it\n * because each copy is individually fine.\n *\n * MinHash over normalized token shingles, banded into an LSH index for\n * candidate generation, then an LCS check to reject the false positives LSH\n * lets through. Deterministic throughout — the permutation seeds are fixed, so\n * the same corpus always produces the same digests and the receipt stays\n * byte-stable.\n *\n * Cost note: this is O(functions) hashing and O(candidates) verification, not\n * O(functions²) comparison. The band index is what keeps it linear.\n */\n\n/** Tokens per shingle. Long enough to be meaningful, short enough to survive edits. */\nexport const SHINGLE_SIZE = 5;\n\n/** MinHash permutations. More = tighter Jaccard estimate, linearly more work. */\nexport const MINHASH_PERMUTATIONS = 128;\n\n/** LSH bands × rows must multiply to MINHASH_PERMUTATIONS. 16×8 ≈ 0.5 threshold. */\nexport const LSH_BANDS = 16;\nexport const LSH_ROWS = 8;\n\n/** Minimum LCS ratio for a candidate pair to count as a duplicate. */\nexport const LCS_THRESHOLD = 0.6;\n\n/** Never verify more than this many candidates for one query. */\nexport const MAX_CANDIDATES = 20;\n\n/**\n * Minimum overlap between two bodies' *call vocabularies* before they can be\n * called duplicates.\n *\n * Structural similarity alone is not enough. Sibling CRUD handlers — the\n * `ProductsController.GetById` / `OrdersController.GetById` shape that every\n * layered codebase has — score 0.92 on LCS because their control flow really is\n * identical: log, dispatch, 404 or Ok. They are not a duplication defect; they\n * are the framework's shape, and reporting them buries the findings that matter.\n *\n * What separates them from a real copy is *what they call*. Measured on a\n * Clean Architecture repository: sibling controllers share only framework\n * plumbing (`LogInformation`, `NotFound`, `Ok`) and their domain calls are\n * disjoint — `GetProductByIdQuery` vs `GetByIdWithItemsAsync` — giving 0.69. A\n * genuine renamed re-implementation calls the same collaborators and scores\n * 1.00. The gate sits between, with margin on both sides.\n */\nexport const MIN_CALL_OVERLAP = 0.8;\n\n/** A body shorter than this has no meaningful shape to compare. */\nexport const MIN_TOKENS = 12;\n\n/** Punctuation carries no shape on its own — it is not counted toward substance. */\nconst PUNCTUATION = /^[{}()[\\];,.]$|^=>$|^[=!<>]=+$|^[+\\-*/%&|^!<>?:]+$/;\n\n/**\n * Does this body contain enough actual logic to be worth comparing?\n *\n * The token floor alone is not enough. A one-line delegator\n * (`function a(id: string): string { return b(id); }`) clears twelve tokens\n * purely on punctuation and type annotations, and every delegator that forwards\n * to the same function then looks like a 100% duplicate of every other. They\n * are not duplicates — they are the intended shape of a thin wrapper.\n *\n * So substance requires real content: enough non-punctuation tokens, plus\n * either a branch or more than one distinct call. A body that only forwards\n * somewhere has neither.\n */\nexport function hasSubstance(tokens: readonly string[]): boolean {\n const meaningful = tokens.filter((t) => !PUNCTUATION.test(t));\n if (meaningful.length < MIN_TOKENS) return false;\n\n const BRANCHING = new Set(['if', 'else', 'for', 'while', 'do', 'switch', 'case', 'try', 'catch', 'elif']);\n const branches = meaningful.filter((t) => BRANCHING.has(t)).length;\n const distinctCalls = new Set(meaningful.filter((t) => t.startsWith('CALL:'))).size;\n return branches > 0 || distinctCalls > 1;\n}\n\nexport interface FunctionBody {\n id: string;\n name: string;\n file: string;\n startLine: number;\n endLine: number;\n text: string;\n}\n\nexport interface SimilarityHit {\n id: string;\n name: string;\n file: string;\n startLine: number;\n endLine: number;\n /** LCS ratio, 0..1. */\n score: number;\n}\n\n/**\n * Normalize a body to its *shape*: keep call names and control flow, discard\n * identifiers, literals, comments and whitespace.\n *\n * Discarding local names is the point — two functions that do the same thing\n * with different variable names are exactly what we are looking for. Call names\n * are kept because they carry the semantics: `charge(stripe)` and\n * `refund(stripe)` should not look identical just because their control flow\n * matches.\n */\nexport function normalizeTokens(text: string): string[] {\n const withoutComments = text\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, ' ')\n .replace(/\\/\\/[^\\n]*/g, ' ')\n .replace(/#[^\\n]*/g, ' ');\n\n const tokens: string[] = [];\n // Call sites (`foo(`) keep their name; bare identifiers collapse to `ID`.\n const pattern = /([A-Za-z_$][\\w$]*)\\s*\\(|([A-Za-z_$][\\w$]*)|([\"'`])(?:\\\\.|(?!\\3)[^\\\\])*\\3|(\\d[\\d._]*)|([{}()[\\];,.]|=>|[=!<>]=+|[+\\-*/%&|^!<>?:]+)/g;\n\n const KEYWORDS = new Set([\n 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'return', 'try', 'catch',\n 'finally', 'throw', 'await', 'async', 'function', 'const', 'let', 'var', 'new',\n 'class', 'def', 'elif', 'except', 'raise', 'yield', 'match', 'foreach', 'using',\n ]);\n\n // A name directly after a declaration keyword is the function's *own* name,\n // not a call. It must collapse: renaming is precisely the transformation this\n // detector exists to see through, and leaving the declaration name in would\n // make every renamed copy differ from its original by exactly that token.\n const DECLARATORS = new Set(['function', 'def', 'class', 'fn', 'func', 'sub', 'method']);\n\n let m: RegExpExecArray | null;\n while ((m = pattern.exec(withoutComments)) !== null) {\n const previous = tokens[tokens.length - 1];\n if (m[1] !== undefined) {\n if (KEYWORDS.has(m[1])) tokens.push(m[1]);\n else if (previous !== undefined && DECLARATORS.has(previous)) tokens.push('DECL');\n else tokens.push(`CALL:${m[1]}`);\n } else if (m[2] !== undefined) {\n tokens.push(KEYWORDS.has(m[2]) ? m[2] : 'ID');\n } else if (m[3] !== undefined) {\n tokens.push('STR');\n } else if (m[4] !== undefined) {\n tokens.push('NUM');\n } else if (m[5] !== undefined) {\n tokens.push(m[5]);\n }\n }\n return tokens;\n}\n\n/** Contiguous k-token shingles. */\nexport function shingles(tokens: readonly string[], k: number = SHINGLE_SIZE): string[] {\n if (tokens.length < k) return tokens.length > 0 ? [tokens.join(' ')] : [];\n const out: string[] = [];\n for (let i = 0; i + k <= tokens.length; i++) out.push(tokens.slice(i, i + k).join(' '));\n return out;\n}\n\n/** FNV-1a, 32-bit. Deterministic across platforms — no `Math.random`, no seeds from the clock. */\nfunction fnv1a(input: string, seed: number): number {\n let h = (2166136261 ^ seed) >>> 0;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 16777619) >>> 0;\n }\n return h >>> 0;\n}\n\n/** MinHash signature: the minimum hash per permutation. */\nexport function minhash(\n shingleSet: readonly string[],\n permutations: number = MINHASH_PERMUTATIONS,\n): number[] {\n const signature = new Array<number>(permutations).fill(0xffffffff);\n for (const shingle of shingleSet) {\n for (let p = 0; p < permutations; p++) {\n const h = fnv1a(shingle, p);\n if (h < signature[p]) signature[p] = h;\n }\n }\n return signature;\n}\n\n/** The distinct call names a token stream invokes. */\nfunction callVocabulary(tokens: readonly string[]): Set<string> {\n return new Set(tokens.filter((t) => t.startsWith('CALL:')));\n}\n\n/** Jaccard overlap of two call vocabularies. Empty on both sides counts as no evidence. */\nexport function callOverlap(a: readonly string[], b: readonly string[]): number {\n const x = callVocabulary(a);\n const y = callVocabulary(b);\n if (x.size === 0 && y.size === 0) return 0;\n let shared = 0;\n for (const call of x) if (y.has(call)) shared++;\n return shared / new Set([...x, ...y]).size;\n}\n\n/** Estimated Jaccard similarity: the fraction of matching signature slots. */\nexport function jaccard(a: readonly number[], b: readonly number[]): number {\n if (a.length === 0 || a.length !== b.length) return 0;\n let same = 0;\n for (let i = 0; i < a.length; i++) if (a[i] === b[i]) same++;\n return same / a.length;\n}\n\n/** LSH band keys. Two bodies sharing any band key are candidates. */\nexport function bandKeys(\n signature: readonly number[],\n bands: number = LSH_BANDS,\n rows: number = LSH_ROWS,\n): string[] {\n const keys: string[] = [];\n for (let b = 0; b < bands; b++) {\n const slice = signature.slice(b * rows, (b + 1) * rows);\n if (slice.length === 0) break;\n keys.push(`${b}:${fnv1a(slice.join(','), 0)}`);\n }\n return keys;\n}\n\n/**\n * Length-normalized LCS ratio over token sequences.\n *\n * LSH gives candidates cheaply but generously; this is the check that decides.\n * It is order-sensitive where Jaccard is not, so two functions built from the\n * same token vocabulary in a different order — genuinely different logic — are\n * rejected here rather than reported as duplicates.\n *\n * Bounded: sequences are truncated so one pathological body cannot make the\n * O(n·m) table explode.\n */\nexport function lcsRatio(a: readonly string[], b: readonly string[], cap = 400): number {\n const x = a.slice(0, cap);\n const y = b.slice(0, cap);\n if (x.length === 0 || y.length === 0) return 0;\n\n // Rolling two-row table — the full matrix is never allocated.\n let previous = new Array<number>(y.length + 1).fill(0);\n let current = new Array<number>(y.length + 1).fill(0);\n for (let i = 1; i <= x.length; i++) {\n for (let j = 1; j <= y.length; j++) {\n current[j] = x[i - 1] === y[j - 1] ? previous[j - 1] + 1 : Math.max(previous[j], current[j - 1]);\n }\n [previous, current] = [current, previous];\n current.fill(0);\n }\n return previous[y.length] / Math.max(x.length, y.length);\n}\n\ninterface IndexedBody extends FunctionBody {\n tokens: string[];\n signature: number[];\n}\n\n/**\n * A searchable index over a corpus of function bodies.\n *\n * Build once per review; query per changed function. Bodies below\n * {@link MIN_TOKENS} are excluded — a three-line getter matches every other\n * three-line getter, and reporting that is noise, not a finding.\n */\nexport class SimilarityIndex {\n private readonly bodies = new Map<string, IndexedBody>();\n private readonly bands = new Map<string, string[]>();\n\n add(body: FunctionBody): void {\n const tokens = normalizeTokens(body.text);\n if (!hasSubstance(tokens)) return;\n const signature = minhash(shingles(tokens));\n const indexed: IndexedBody = { ...body, tokens, signature };\n this.bodies.set(body.id, indexed);\n for (const key of bandKeys(signature)) {\n let bucket = this.bands.get(key);\n if (!bucket) this.bands.set(key, (bucket = []));\n bucket.push(body.id);\n }\n }\n\n get size(): number {\n return this.bodies.size;\n }\n\n /**\n * Bodies similar to `query`, best first. `excludeIds` drops the query's own\n * entry (and anything else the caller knows is the same thing).\n */\n find(query: FunctionBody, excludeIds: ReadonlySet<string> = new Set()): SimilarityHit[] {\n const tokens = normalizeTokens(query.text);\n if (!hasSubstance(tokens)) return [];\n const signature = minhash(shingles(tokens));\n\n const candidateIds = new Set<string>();\n for (const key of bandKeys(signature)) {\n for (const id of this.bands.get(key) ?? []) {\n if (id !== query.id && !excludeIds.has(id)) candidateIds.add(id);\n }\n }\n\n // Order candidates by the cheap estimate before paying for LCS, so the cap\n // keeps the most promising ones rather than an arbitrary slice.\n const ranked = [...candidateIds]\n .map((id) => this.bodies.get(id)!)\n .sort((a, b) => jaccard(signature, b.signature) - jaccard(signature, a.signature))\n .slice(0, MAX_CANDIDATES);\n\n const hits: SimilarityHit[] = [];\n for (const candidate of ranked) {\n const score = lcsRatio(tokens, candidate.tokens);\n if (score < LCS_THRESHOLD) continue;\n // Same shape is not the same work. Two handlers can share every control\n // structure and still call entirely different collaborators.\n if (callOverlap(tokens, candidate.tokens) < MIN_CALL_OVERLAP) continue;\n hits.push({\n id: candidate.id,\n name: candidate.name,\n file: candidate.file,\n startLine: candidate.startLine,\n endLine: candidate.endLine,\n score,\n });\n }\n return hits.sort((a, b) => b.score - a.score || (a.file < b.file ? -1 : 1));\n }\n}\n\n/**\n * Files whose contents should never count as a duplicate: tests (repetition is\n * the point), generated code, and vendored dependencies.\n */\nexport function isComparable(file: string): boolean {\n const p = file.replace(/\\\\/g, '/');\n if (/(^|\\/)(__tests__|__mocks__|tests?|spec|fixtures?|vendor|node_modules|dist|build|generated)\\//i.test(p)) {\n return false;\n }\n return !/\\.(test|spec|d)\\.[^.]+$|\\.min\\.[^.]+$|\\.generated\\.[^.]+$/i.test(p);\n}\n","/**\n * `assess_change` — in-loop prevention, before the code is written.\n *\n * `vg review` answers \"was that change sound?\" after the fact. This answers\n * \"would this be sound?\" *while* an agent is deciding, which is the only point\n * at which the fix is free. Same graph, same votes, same protected rules — one\n * question asked earlier.\n *\n * **Transport-free by design.** Nothing here imports an MCP type, a Commander\n * type, or anything from `node:process`. The MCP server is a thin adapter over\n * this function, and so is any future hook or editor integration; keeping the\n * logic on this side is what stops three copies of the rules drifting apart.\n *\n * **One tool, not eight.** A consistency scanner exposes a family of\n * fine-grained questions (`get_dominant_pattern`, `check_file_drift`,\n * `find_similar_function`, …) and leaves the agent to orchestrate them. That\n * pushes the judgement into the model, which is exactly what Review's\n * architecture says must not happen. One call returns facts and a verdict the\n * policy owns.\n */\n\nimport { classifyRoute } from './auth.js';\nimport { describePattern, isRegression, type DataAccessPattern } from './dimensions.js';\nimport type { DominanceVote } from './dominance.js';\nimport { routesForFile } from './routes.js';\nimport { isComparable, SimilarityIndex, type FunctionBody } from './similarity.js';\n\n/**\n * Envelope status. A tool must never throw for \"no data\" — an agent mid-edit\n * cannot recover from an exception, and a hard failure teaches it to stop\n * calling. Degraded states are values.\n */\nexport type AssessStatus = 'ok' | 'partial' | 'no_baseline';\n\nexport interface AssessConflict {\n kind: 'peer_deviation' | 'unguarded_route' | 'boundary_bypass';\n severity: 'high' | 'medium';\n message: string;\n /** Files worth opening before deciding. */\n referenceFiles: string[];\n /** True when this maps to a protected rule — it cannot be waived later. */\n protectedRule: boolean;\n}\n\nexport interface AssessDuplicate {\n name: string;\n file: string;\n startLine: number;\n score: number;\n}\n\nexport interface AssessResult {\n status: AssessStatus;\n /** True when nothing below would block or warn. */\n ok: boolean;\n conflicts: AssessConflict[];\n duplicateOf: AssessDuplicate[];\n /** What this file's peers do, when a convention exists. */\n convention: { group: string; pattern: string; share: number; exemplars: string[] } | null;\n /** The architecture the repository declared, if any. */\n declaredTarget: string | null;\n /** Anything the assessment could not establish. Never silently omitted. */\n unknowns: string[];\n /** Calibrated 0..1 confidence in the assessment as a whole. */\n confidence: number;\n}\n\nexport interface AssessInput {\n /** Repo-relative path the code would live at. */\n file: string;\n /** The proposed body/content. */\n content: string;\n /** Peer votes from the last capsule compile. */\n votes: readonly DominanceVote[];\n /** Every known file's data-access label. */\n dataAccess: ReadonlyMap<string, DataAccessPattern>;\n /** Similarity index over the existing corpus. */\n similarity: SimilarityIndex | null;\n /** The declared target architecture, if any. */\n declaredTarget: string | null;\n /** The peer group this file belongs to, when known. */\n group?: string;\n /** Route classifications for the file's directory, for the guard convention. */\n guardedShare?: { guarded: number; classified: number } | null;\n}\n\n/**\n * Assess a proposed change. Never throws.\n *\n * The verdict is `ok` only when nothing was found *and* enough was known to\n * look — an empty result from an empty index is `no_baseline`, not approval.\n * That distinction is the whole reason the status field exists.\n */\nexport function assessChange(input: AssessInput): AssessResult {\n const conflicts: AssessConflict[] = [];\n const unknowns: string[] = [];\n\n const haveGraph = input.similarity !== null && input.votes.length > 0;\n if (!haveGraph) {\n unknowns.push('No code map was available — run `vg` to build one so this can compare against the repository.');\n }\n\n // ── Does it match what its peers do? ────────────────────────────────────\n const vote = input.group\n ? input.votes.find((v) => v.group === input.group)\n : input.votes.find((v) => v.deviators.includes(input.file) || v.exemplars.includes(input.file));\n\n const convention =\n vote && vote.reason === 'dominant' && vote.dominant\n ? {\n group: vote.group,\n pattern: vote.dominant,\n share: vote.share,\n exemplars: vote.exemplars,\n }\n : null;\n\n if (vote && vote.reason === 'no_convention') {\n unknowns.push(\n `${vote.group} has no convention — its peers are split, so there is no house style to match. `\n + 'Pick the shape that matches the declared target.',\n );\n }\n\n // The proposed content's own data-access shape, inferred from what it calls.\n const proposedPattern = inferProposedPattern(input.content, input.dataAccess);\n if (convention && proposedPattern) {\n if (isRegression(proposedPattern, convention.pattern as DataAccessPattern)) {\n conflicts.push({\n kind: 'peer_deviation',\n severity: input.declaredTarget ? 'high' : 'medium',\n message:\n `This ${describePattern(proposedPattern)}, while ${(convention.share * 100).toFixed(0)}% of its `\n + `peers in ${convention.group} ${describePattern(convention.pattern)}.`,\n referenceFiles: convention.exemplars.slice(0, 3),\n protectedRule: false,\n });\n }\n } else if (!convention && proposedPattern === 'direct-persistence') {\n unknowns.push(\n 'No peer convention could be established for this file, so reaching persistence directly is '\n + 'neither confirmed as normal here nor flagged as a deviation.',\n );\n }\n\n // ── Would it add an unguarded route? ────────────────────────────────────\n for (const route of routesForFile(input.file, input.content)) {\n const verdict = classifyRoute(route);\n if (verdict.verdict === 'unsure') {\n unknowns.push(\n `A route in this file could not be classified as guarded or open (${verdict.rule}).`,\n );\n continue;\n }\n if (verdict.verdict !== 'not-auth') continue;\n if (!/^(POST|PUT|PATCH|DELETE|ALL)$/i.test(route.method)) continue;\n\n const share = input.guardedShare;\n const dominantlyGuarded = share && share.classified > 0 && share.guarded / share.classified >= 0.75;\n if (!dominantlyGuarded) {\n unknowns.push(\n `${route.method} ${route.path || input.file} has no guard, and there are too few classified `\n + 'peer routes to say whether that is the convention here.',\n );\n continue;\n }\n conflicts.push({\n kind: 'unguarded_route',\n severity: 'high',\n message:\n `${route.method} ${route.path || input.file} would have no authorization guard, while `\n + `${share!.guarded} of ${share!.classified} mutating routes alongside it do.`,\n referenceFiles: [],\n // This maps to a protected rule: if it lands, `vg review` cannot pass it.\n protectedRule: true,\n });\n }\n\n // ── Does it already exist? ──────────────────────────────────────────────\n const duplicateOf: AssessDuplicate[] = [];\n if (input.similarity && isComparable(input.file)) {\n const query: FunctionBody = {\n id: `__proposed__:${input.file}`,\n name: '(proposed)',\n file: input.file,\n startLine: 1,\n endLine: input.content.split('\\n').length,\n text: input.content,\n };\n for (const hit of input.similarity.find(query).filter((h) => isComparable(h.file))) {\n duplicateOf.push({ name: hit.name, file: hit.file, startLine: hit.startLine, score: hit.score });\n }\n }\n\n const status: AssessStatus = !haveGraph ? 'no_baseline' : unknowns.length > 0 ? 'partial' : 'ok';\n return {\n status,\n // `ok` is about the change, not the lookup — a `no_baseline` run with no\n // conflicts is not an endorsement, and the status is what says so.\n ok: conflicts.length === 0 && duplicateOf.length === 0,\n conflicts,\n duplicateOf,\n convention,\n declaredTarget: input.declaredTarget,\n unknowns,\n confidence: confidenceOf(status, convention, conflicts.length),\n };\n}\n\n/**\n * Infer the proposed content's data-access shape from the files it imports.\n *\n * Deliberately conservative: it can only see what the text references, so it\n * returns `null` rather than guessing when nothing recognisable is imported.\n */\nfunction inferProposedPattern(\n content: string,\n dataAccess: ReadonlyMap<string, DataAccessPattern>,\n): DataAccessPattern | null {\n const imports = [...content.matchAll(/(?:from|import|require)\\s*\\(?\\s*['\"]([^'\"]+)['\"]/g)].map(\n (m) => m[1],\n );\n if (imports.length === 0) return null;\n\n let sawPersistence = false;\n let sawService = false;\n for (const specifier of imports) {\n const base = specifier.replace(/^.*\\//, '').replace(/\\.(js|ts|mjs|cjs)$/, '').toLowerCase();\n for (const [path, pattern] of dataAccess) {\n const target = path.replace(/^.*\\//, '').replace(/\\.[^.]+$/, '').toLowerCase();\n if (target !== base) continue;\n if (pattern === 'direct-persistence' && /repositor|dao|store|entity|model/.test(target)) {\n sawPersistence = true;\n }\n if (/service|usecase|application|handler/.test(target)) sawService = true;\n }\n if (/repositor|dao|persistence|entity/.test(base)) sawPersistence = true;\n if (/service|usecase/.test(base)) sawService = true;\n }\n\n if (sawPersistence) return 'direct-persistence';\n if (sawService) return 'via-service';\n return null;\n}\n\n/** Calibrated confidence: how much did we actually know when we answered? */\nfunction confidenceOf(\n status: AssessStatus,\n convention: AssessResult['convention'],\n conflictCount: number,\n): number {\n if (status === 'no_baseline') return 0.2;\n let confidence = status === 'ok' ? 0.8 : 0.6;\n if (convention) confidence += 0.1;\n if (conflictCount === 0 && !convention) confidence -= 0.2;\n return Math.max(0, Math.min(1, Number(confidence.toFixed(2))));\n}\n\n/** A compact, agent-readable rendering of the result. */\nexport function renderAssessment(result: AssessResult): string {\n const lines: string[] = [];\n if (result.conflicts.length === 0 && result.duplicateOf.length === 0) {\n lines.push(\n result.status === 'no_baseline'\n ? 'No code map, so nothing could be checked. This is not an approval — run `vg` to build one.'\n : 'No conflicts with the surrounding code.',\n );\n }\n for (const c of result.conflicts) {\n lines.push(`${c.protectedRule ? '[blocks merge] ' : ''}${c.message}`);\n if (c.referenceFiles.length > 0) lines.push(` follow: ${c.referenceFiles.join(', ')}`);\n }\n for (const d of result.duplicateOf) {\n lines.push(`Already exists: ${d.name} in ${d.file}:${d.startLine} (${(d.score * 100).toFixed(0)}% match).`);\n }\n if (result.declaredTarget) lines.push(`Declared architecture: ${result.declaredTarget}.`);\n for (const u of result.unknowns) lines.push(`Unknown: ${u}`);\n return lines.join('\\n');\n}\n","/**\n * Peer dominance voting — \"what do this file's peers actually do?\"\n *\n * The mechanic is the one convention-consistency scanners use, with one\n * deliberate difference that matters more than all the constants combined:\n *\n * **Peers are graph-area / role-equivalent symbols, not directory siblings.**\n * A directory is a filing decision; an area is a structural one. Two handlers\n * in `src/api/` may belong to different subsystems, and the right peers for a\n * repository handler are the other repository handlers wherever they live.\n * Directory scoping is the fallback for files the graph could not place, never\n * the primary definition.\n *\n * And the load-bearing product difference: **a dominant pattern is never\n * treated as correct.** This module answers \"what is the majority?\" and nothing\n * else. Whether deviating from it is a regression is decided against the\n * *declared* `target_pattern` in `.vibgrate/review.toml` — otherwise Review\n * would punish the first file to modernise and lock a repository into its own\n * legacy (spec §4.1: \"Majority is never silently treated as correctness\").\n */\n\n/** A group smaller than this cannot establish a convention. */\nexport const MIN_GROUP_SIZE = 3;\n\n/** Share of the group the leader needs before we call it dominant. */\nexport const DOMINANCE_SHARE = 0.7;\n\n/**\n * Normalized Shannon entropy above which a group has *no* convention — the\n * patterns are too evenly spread for a leader to mean anything. Without this\n * gate a 34/33/33 split reports a \"dominant\" pattern held by a third of files.\n */\nexport const ENTROPY_NO_CONVENTION = 0.8;\n\n/** A \"no convention here\" observation needs at least this many files to be worth making. */\nexport const NO_CONVENTION_MIN_FILES = 5;\n\n/** Recency half-life. A file touched today counts ~2x one untouched for a year. */\nexport const TEMPORAL_HALF_LIFE_DAYS = 90;\n\n/** Multiplier applied to a pattern a human declared in CLAUDE.md / AGENTS.md. */\nexport const INTENT_BOOST = 1.5;\n\nexport interface PeerFile {\n path: string;\n /** The pattern this file exhibits for the dimension being voted on. */\n pattern: string;\n /** Peer group key — a graph area/role id, or a directory when unplaced. */\n group: string;\n /** How the group was derived. Recorded so the capsule can be honest about it. */\n groupKind: 'area' | 'role' | 'directory';\n /** Days since last commit. `null` when git history is unavailable. */\n daysSinceCommit: number | null;\n}\n\nexport interface DominanceVote {\n group: string;\n groupKind: PeerFile['groupKind'];\n /** The winning pattern, or null when no convention could be established. */\n dominant: string | null;\n /** Weighted share held by the leader, 0..1. */\n share: number;\n /** Normalized Shannon entropy of the group, 0..1. */\n entropy: number;\n /** Number of files considered. */\n size: number;\n /** Why there is no dominant pattern, when there isn't one. */\n reason: 'dominant' | 'group_too_small' | 'no_clear_leader' | 'no_convention';\n /** Weighted tally per pattern, for evidence. */\n tally: Record<string, number>;\n /** Files that do not follow the dominant pattern. Empty when there isn't one. */\n deviators: string[];\n /** Up to three files that best exemplify the dominant pattern. */\n exemplars: string[];\n}\n\n/**\n * Recency weight: `2 * exp(-ln2 * days / halfLife)`.\n *\n * A file edited today weighs ~2, one edited a half-life ago weighs 1, one from\n * a year ago ~0.12. This is what stops a large, abandoned legacy wing from\n * out-voting the part of the codebase people actually work in — which is the\n * usual reason a naive majority vote tells you to write code like it's 2019.\n *\n * Unknown history weighs 1: neither boosted nor penalised.\n */\nexport function temporalWeight(\n daysSinceCommit: number | null,\n halfLifeDays: number = TEMPORAL_HALF_LIFE_DAYS,\n): number {\n if (daysSinceCommit === null || !Number.isFinite(daysSinceCommit)) return 1;\n const days = Math.max(0, daysSinceCommit);\n return 2 * Math.exp((-Math.LN2 * days) / halfLifeDays);\n}\n\n/** Normalized Shannon entropy of a weighted tally, 0 (one pattern) .. 1 (uniform). */\nexport function normalizedEntropy(tally: Record<string, number>): number {\n const values = Object.values(tally).filter((v) => v > 0);\n if (values.length <= 1) return 0;\n const total = values.reduce((a, b) => a + b, 0);\n if (total <= 0) return 0;\n let h = 0;\n for (const v of values) {\n const p = v / total;\n h -= p * Math.log(p);\n }\n return h / Math.log(values.length);\n}\n\nexport interface VoteOptions {\n /**\n * Patterns a human declared (CLAUDE.md / AGENTS.md / review.toml). Each gets\n * {@link INTENT_BOOST} — a stated intention outweighs a slim accidental\n * majority, but does not manufacture a convention on its own.\n */\n declaredPatterns?: readonly string[];\n minGroupSize?: number;\n dominanceShare?: number;\n}\n\n/** Vote one peer group. */\nexport function voteGroup(files: readonly PeerFile[], opts: VoteOptions = {}): DominanceVote {\n const minGroupSize = opts.minGroupSize ?? MIN_GROUP_SIZE;\n const dominanceShare = opts.dominanceShare ?? DOMINANCE_SHARE;\n const declared = new Set(opts.declaredPatterns ?? []);\n const group = files[0]?.group ?? '';\n const groupKind = files[0]?.groupKind ?? 'directory';\n\n const tally: Record<string, number> = {};\n for (const f of files) {\n const boost = declared.has(f.pattern) ? INTENT_BOOST : 1;\n tally[f.pattern] = (tally[f.pattern] ?? 0) + temporalWeight(f.daysSinceCommit) * boost;\n }\n\n const base = {\n group,\n groupKind,\n size: files.length,\n tally,\n entropy: normalizedEntropy(tally),\n exemplars: [] as string[],\n deviators: [] as string[],\n };\n\n if (files.length < minGroupSize) {\n return { ...base, dominant: null, share: 0, reason: 'group_too_small' };\n }\n\n const total = Object.values(tally).reduce((a, b) => a + b, 0);\n const ranked = Object.entries(tally).sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : 1));\n const [leader, leaderWeight] = ranked[0];\n const share = total > 0 ? leaderWeight / total : 0;\n\n // Entropy first: a group with no convention has no leader worth naming, even\n // if one pattern happens to edge ahead.\n //\n // Only meaningful once there are three or more competing patterns. Entropy is\n // normalized by log(distinct patterns), so *any* two-way split scores high —\n // a clean 75/25 lands at 0.81 and would be thrown out as \"no convention\"\n // despite being exactly the dominance we are looking for. With two patterns\n // the share threshold below is already the right and only test.\n const distinctPatterns = Object.values(tally).filter((v) => v > 0).length;\n if (distinctPatterns >= 3 && base.entropy > ENTROPY_NO_CONVENTION) {\n return {\n ...base,\n dominant: null,\n share,\n reason: files.length >= NO_CONVENTION_MIN_FILES ? 'no_convention' : 'no_clear_leader',\n };\n }\n if (share < dominanceShare) {\n return { ...base, dominant: null, share, reason: 'no_clear_leader' };\n }\n\n const following = files.filter((f) => f.pattern === leader);\n return {\n ...base,\n dominant: leader,\n share,\n reason: 'dominant',\n // Most recently touched first — the best example is a live one.\n exemplars: [...following]\n .sort((a, b) => (a.daysSinceCommit ?? 1e9) - (b.daysSinceCommit ?? 1e9))\n .slice(0, 3)\n .map((f) => f.path),\n deviators: files.filter((f) => f.pattern !== leader).map((f) => f.path).sort(),\n };\n}\n\n/** Vote every peer group in a corpus, keyed by group id. */\nexport function voteAll(files: readonly PeerFile[], opts: VoteOptions = {}): DominanceVote[] {\n const groups = new Map<string, PeerFile[]>();\n for (const f of files) {\n let bucket = groups.get(f.group);\n if (!bucket) groups.set(f.group, (bucket = []));\n bucket.push(f);\n }\n return [...groups.entries()]\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .map(([, bucket]) => voteGroup(bucket, opts));\n}\n\n/**\n * The repository-wide dominant pattern, when one exists.\n *\n * Derived from the *groups that reached a verdict*, not from a global file\n * count — otherwise one enormous directory decides the whole repository's\n * \"convention\". A pattern must lead a majority of deciding groups.\n */\nexport function repositoryDominantPattern(votes: readonly DominanceVote[]): string | null {\n const deciding = votes.filter((v) => v.reason === 'dominant' && v.dominant);\n if (deciding.length === 0) return null;\n const counts = new Map<string, number>();\n for (const v of deciding) counts.set(v.dominant!, (counts.get(v.dominant!) ?? 0) + 1);\n const ranked = [...counts.entries()].sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : 1));\n const [pattern, n] = ranked[0];\n return n / deciding.length >= 0.5 ? pattern : null;\n}\n","/**\n * The change set `vg review` reasons about.\n *\n * Two modes (spec §3):\n * - default → dirty tree + index vs HEAD\n * - `--base <ref>` → merge-base(HEAD, ref) … HEAD\n *\n * Everything here is read-only git plumbing. It never mutates the worktree and\n * never throws on a non-repo — the caller turns \"not a git repository\" into a\n * clean exit-6 message rather than a stack trace.\n */\n\nimport { spawnSync } from 'node:child_process';\nimport { digestString } from './schemas.js';\n\nexport type GitRunner = (args: string[], cwd: string) => { stdout: string; status: number };\n\nexport interface ChangedFile {\n path: string;\n op: 'added' | 'modified' | 'removed' | 'renamed';\n addedLines: number;\n removedLines: number;\n /** 1-based line ranges touched on the *new* side. Empty for a deletion. */\n hunks: { start: number; end: number }[];\n}\n\nexport interface ChangeSet {\n /**\n * The repository root. Every `path` below is relative to *this*, not to the\n * directory `vg` was invoked from — git reports repo-relative paths, so\n * resolving them against `--cwd` in a subdirectory silently reads the wrong\n * files (or none).\n */\n topLevel: string;\n baseSha: string;\n headSha: string;\n mergeBase: string | null;\n ref: string | null;\n dirty: boolean;\n dirtyTreeHash: string | null;\n files: ChangedFile[];\n remote: string | null;\n}\n\n/** The real `git` runner. Exported so auto-prep can reuse it. */\nexport function defaultRun(args: string[], cwd: string): { stdout: string; status: number } {\n const res = spawnSync('git', args, {\n cwd,\n encoding: 'utf8',\n timeout: 20_000,\n maxBuffer: 64 * 1024 * 1024,\n windowsHide: true,\n });\n return { stdout: res.stdout ?? '', status: res.status ?? 1 };\n}\n\nexport function isGitRepo(root: string, run: GitRunner = defaultRun): boolean {\n return run(['rev-parse', '--git-dir'], root).status === 0;\n}\n\n/** The repository root, or `root` when git cannot answer. */\nexport function gitTopLevel(root: string, run: GitRunner = defaultRun): string {\n const res = run(['rev-parse', '--show-toplevel'], root);\n const top = res.stdout.trim();\n return res.status === 0 && top ? top : root;\n}\n\n/**\n * Strip credentials from a remote URL before it ever reaches a receipt.\n * `https://user:token@github.com/acme/x.git` → `github.com/acme/x`.\n */\nexport function normalizeRemote(url: string): string | null {\n const raw = url.trim();\n if (!raw) return null;\n const scp = raw.match(/^[^@/]+@([^:]+):(.+)$/); // git@github.com:acme/x.git\n if (scp) return `${scp[1]}/${scp[2]}`.replace(/\\.git$/, '');\n const m = raw.match(/^[a-z+]+:\\/\\/(?:[^@/]*@)?([^/]+)\\/(.+)$/i);\n if (m) return `${m[1]}/${m[2]}`.replace(/\\.git$/, '');\n return raw.replace(/\\.git$/, '');\n}\n\n/**\n * Repo key: a stable, non-reversible identity for the repository. Derived from\n * the normalized remote when there is one, else from the resolved root path —\n * so two clones of the same repo agree, and a repo with no remote still gets a\n * key that is stable on that machine.\n */\nexport function repoKey(remote: string | null, root: string): string {\n return digestString(`vg.review.repo\\0${remote ?? `local:${root}`}`);\n}\n\nfunction parseNumstat(out: string): Map<string, { added: number; removed: number; op: ChangedFile['op'] }> {\n const map = new Map<string, { added: number; removed: number; op: ChangedFile['op'] }>();\n for (const line of out.split('\\n')) {\n if (!line.trim()) continue;\n const parts = line.split('\\t');\n if (parts.length < 3) continue;\n const added = parts[0] === '-' ? 0 : Number(parts[0]);\n const removed = parts[1] === '-' ? 0 : Number(parts[1]);\n // A rename is emitted as `added\\tremoved\\told\\tnew`.\n const path = parts.length >= 4 ? parts[3] : parts[2];\n const op: ChangedFile['op'] =\n parts.length >= 4 ? 'renamed' : removed > 0 && added === 0 ? 'modified' : 'modified';\n map.set(path, { added, removed, op });\n }\n return map;\n}\n\nfunction opFromStatusLetters(letters: string): ChangedFile['op'] {\n if (letters.includes('R')) return 'renamed';\n if (letters.includes('A') || letters.includes('?')) return 'added';\n if (letters.includes('D')) return 'removed';\n return 'modified';\n}\n\n/**\n * `git status --porcelain`: two status columns, a space, then the path\n * (`R old -> new`). Space-delimited and fixed-width.\n */\nfunction parsePorcelainStatus(out: string): Map<string, ChangedFile['op']> {\n const map = new Map<string, ChangedFile['op']>();\n for (const line of out.split('\\n')) {\n if (!line.trim()) continue;\n const letters = line.slice(0, 2);\n const rest = line.slice(3);\n const raw = rest.includes(' -> ') ? rest.split(' -> ')[1] : rest;\n map.set(raw.replace(/^\"|\"$/g, ''), opFromStatusLetters(letters));\n }\n return map;\n}\n\n/**\n * `git diff --name-status`: a status letter (`R100` for a rename), then TAB,\n * then the path — and for a rename, `old\\tnew`. A different shape from\n * porcelain entirely; parsing one with the other's rules truncates every path.\n */\nfunction parseDiffNameStatus(out: string): Map<string, ChangedFile['op']> {\n const map = new Map<string, ChangedFile['op']>();\n for (const line of out.split('\\n')) {\n if (!line.trim()) continue;\n const parts = line.split('\\t');\n if (parts.length < 2) continue;\n const letters = parts[0];\n const path = parts.length >= 3 ? parts[2] : parts[1];\n map.set(path.replace(/^\"|\"$/g, ''), opFromStatusLetters(letters));\n }\n return map;\n}\n\n/** New-side hunk ranges from a unified diff, keyed by path. */\nfunction parseHunks(diff: string): Map<string, { start: number; end: number }[]> {\n const map = new Map<string, { start: number; end: number }[]>();\n let current: string | null = null;\n for (const line of diff.split('\\n')) {\n if (line.startsWith('+++ ')) {\n const p = line.slice(4).trim();\n current = p === '/dev/null' ? null : p.replace(/^b\\//, '');\n if (current && !map.has(current)) map.set(current, []);\n continue;\n }\n if (current && line.startsWith('@@')) {\n const m = line.match(/@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,(\\d+))? @@/);\n if (m) {\n const start = Number(m[1]);\n const count = m[2] === undefined ? 1 : Number(m[2]);\n if (count > 0) map.get(current)!.push({ start, end: start + count - 1 });\n }\n }\n }\n return map;\n}\n\n/**\n * Base-side contents of changed files (`git show <baseSha>:path`).\n *\n * Only the change set is read — this is what lets Review tell a new import\n * from occupancy without building a second graph. Added files are omitted\n * (there is no before-image). A miss is a missing map entry, never empty\n * string: empty would look like \"the file existed and referenced nothing\".\n */\nexport function readBaseFileTexts(change: ChangeSet, run: GitRunner = defaultRun): Map<string, string> {\n const out = new Map<string, string>();\n const base = change.baseSha;\n if (!base) return out;\n for (const file of change.files) {\n if (file.op === 'added') continue;\n const spec = `${base}:${file.path.replace(/\\\\/g, '/')}`;\n const res = run(['show', spec], change.topLevel);\n if (res.status === 0 && res.stdout.length <= 2 * 1024 * 1024) {\n out.set(file.path.replace(/\\\\/g, '/'), res.stdout);\n }\n }\n return out;\n}\n\n/**\n * Collect the change set. `base` selects merge-base mode; omitting it reviews\n * the working tree + index against HEAD.\n */\nexport function collectChangeSet(\n root: string,\n base: string | undefined,\n run: GitRunner = defaultRun,\n): ChangeSet {\n const topLevel = gitTopLevel(root, run);\n const headSha = run(['rev-parse', 'HEAD'], root).stdout.trim();\n const refRaw = run(['rev-parse', '--abbrev-ref', 'HEAD'], root).stdout.trim();\n const ref = !refRaw || refRaw === 'HEAD' ? null : `refs/heads/${refRaw}`;\n const remoteRaw = run(['config', '--get', 'remote.origin.url'], root);\n const remote = remoteRaw.status === 0 ? normalizeRemote(remoteRaw.stdout) : null;\n\n if (base) {\n const mb = run(['merge-base', 'HEAD', base], root);\n const mergeBase = mb.status === 0 ? mb.stdout.trim() : null;\n const baseSha = mergeBase ?? run(['rev-parse', base], root).stdout.trim();\n const numstat = parseNumstat(run(['diff', '--numstat', '-M', `${baseSha}..HEAD`], root).stdout);\n const status = parseDiffNameStatus(run(['diff', '--name-status', '-M', `${baseSha}..HEAD`], root).stdout);\n const hunks = parseHunks(run(['diff', '-U0', '-M', `${baseSha}..HEAD`], root).stdout);\n return {\n topLevel,\n baseSha,\n headSha,\n mergeBase,\n ref,\n dirty: false,\n dirtyTreeHash: null,\n files: mergeFiles(numstat, status, hunks),\n remote,\n };\n }\n\n // Working tree + index vs HEAD. `--name-status` over both staged and unstaged\n // so a partially-staged change is reviewed as one change set.\n const numstat = parseNumstat(run(['diff', '--numstat', '-M', 'HEAD'], root).stdout);\n const status = parsePorcelainStatus(run(['status', '--porcelain', '-uall'], root).stdout);\n const hunks = parseHunks(run(['diff', '-U0', '-M', 'HEAD'], root).stdout);\n const files = mergeFiles(numstat, status, hunks);\n const dirty = files.length > 0;\n return {\n topLevel,\n baseSha: headSha,\n headSha,\n mergeBase: null,\n ref,\n dirty,\n // Identifies *which* dirty state was reviewed, so two reviews of the same\n // uncommitted work dedupe and a later edit produces a new receipt.\n dirtyTreeHash: dirty ? dirtyTreeHash(files) : null,\n files,\n remote,\n };\n}\n\n/**\n * Paths that are never part of a change under review: vg's own artifact\n * directory, and dependency/build output. A repo that has not gitignored\n * `.vibgrate/` would otherwise have every review dominated by cache churn.\n */\nconst NOT_REVIEWABLE = /(^|\\/)(\\.vibgrate|node_modules|dist|build|out|target|bin|obj|coverage|\\.next|\\.turbo|vendor)\\//;\n\nexport function isReviewable(path: string): boolean {\n return !NOT_REVIEWABLE.test(path.replace(/\\\\/g, '/'));\n}\n\nfunction mergeFiles(\n numstat: Map<string, { added: number; removed: number; op: ChangedFile['op'] }>,\n status: Map<string, ChangedFile['op']>,\n hunks: Map<string, { start: number; end: number }[]>,\n): ChangedFile[] {\n const paths = new Set<string>([...numstat.keys(), ...status.keys()]);\n const files: ChangedFile[] = [];\n for (const path of paths) {\n const n = numstat.get(path);\n files.push({\n path,\n op: status.get(path) ?? n?.op ?? 'modified',\n addedLines: n?.added ?? 0,\n removedLines: n?.removed ?? 0,\n hunks: hunks.get(path) ?? [],\n });\n }\n // Deterministic order — the capsule and every digest downstream depend on it.\n return files\n .filter((f) => isReviewable(f.path))\n .sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));\n}\n\n/** A digest over the change set's shape — not its contents. Never source text. */\nexport function dirtyTreeHash(files: ChangedFile[]): string {\n return digestString(\n files\n .map((f) => `${f.path}\\0${f.op}\\0${f.addedLines}\\0${f.removedLines}\\0${f.hunks.map((h) => `${h.start}-${h.end}`).join(',')}`)\n .join('\\n'),\n );\n}\n\n/**\n * Days since each tracked file was last committed, from one bounded `git log`\n * pass (not one process per file — that is O(files) subprocesses and dominates\n * the runtime on any real repository).\n *\n * Feeds the dominance vote's temporal weighting, which is what stops a large\n * abandoned wing from out-voting the code people actually work in. Files with\n * no commit inside the window are simply absent, and the vote treats an unknown\n * age as neutral rather than old.\n */\nexport function fileRecencyDays(\n root: string,\n opts: { sinceDays?: number; now?: number } = {},\n run: GitRunner = defaultRun,\n): Map<string, number> {\n const sinceDays = opts.sinceDays ?? 730;\n const nowSec = Math.floor((opts.now ?? Date.now()) / 1000);\n const out = new Map<string, number>();\n const res = run(\n ['log', `--since=${sinceDays}.days.ago`, '--name-only', '--pretty=format:%ct', '--no-merges'],\n root,\n );\n if (res.status !== 0) return out;\n\n let currentTs: number | null = null;\n for (const line of res.stdout.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (/^\\d{9,}$/.test(trimmed)) {\n currentTs = Number(trimmed);\n continue;\n }\n if (currentTs === null) continue;\n // git lists newest commits first, so the first sighting of a path is its\n // most recent touch — later (older) sightings must not overwrite it.\n if (out.has(trimmed)) continue;\n out.set(trimmed, Math.max(0, (nowSec - currentTs) / 86400));\n }\n return out;\n}\n","/**\n * Declared intent — what humans *said* this codebase should look like.\n *\n * Read from the agent-instruction files a repository already maintains\n * (`CLAUDE.md`, `AGENTS.md`, `.cursorrules`, …) plus `.vibgrate/review.toml`.\n * These are the same files an AI agent is told to obey, which is exactly why\n * Review should read them: if the repository tells an agent \"use the repository\n * pattern, never call the ORM from a handler\", a change that does the opposite\n * is a regression against a stated intention, not a matter of taste.\n *\n * Intent is a **hint, not a fact**. It seeds the dominance vote\n * (`INTENT_BOOST`) and it can name a target pattern, but it never on its own\n * produces a finding: prose in a markdown file is not evidence about code. The\n * graph and the scanners still have to show the change actually did the thing.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/** Files that conventionally carry agent/contributor instructions. */\nexport const INTENT_FILES = [\n 'CLAUDE.md',\n 'AGENTS.md',\n '.cursorrules',\n '.github/copilot-instructions.md',\n 'CONTRIBUTING.md',\n] as const;\n\n/** Cap on bytes read per file — instructions are prose, not a corpus. */\nconst MAX_INTENT_BYTES = 256 * 1024;\n\nexport interface DeclaredIntent {\n /** Architecture/layering patterns named in prose (`layered`, `clean`, …). */\n patterns: string[];\n /** The files intent was actually read from — evidence for the capsule. */\n sources: string[];\n /** Verbatim lines that produced a pattern, capped and trimmed. */\n citations: { file: string; line: number; text: string }[];\n}\n\n/**\n * Architecture vocabulary we recognise. Deliberately small: an unrecognised\n * word is left alone rather than guessed at, because a wrong `target_pattern`\n * silently changes every alignment verdict in the receipt.\n */\nconst PATTERN_VOCABULARY: readonly { pattern: string; match: RegExp }[] = [\n { pattern: 'clean', match: /\\bclean architecture\\b/i },\n { pattern: 'hexagonal', match: /\\bhexagonal\\b|\\bports?\\s+and\\s+adapters?\\b/i },\n { pattern: 'onion', match: /\\bonion architecture\\b/i },\n { pattern: 'layered', match: /\\blayered architecture\\b|\\bn-tier\\b|\\bthree-tier\\b/i },\n { pattern: 'vertical-slice', match: /\\bvertical slices?\\b|\\bfeature slices?\\b/i },\n { pattern: 'mvc', match: /\\bMVC\\b/ },\n { pattern: 'mvvm', match: /\\bMVVM\\b/ },\n];\n\n/**\n * Read declared intent from a repository.\n *\n * Never throws: an unreadable or absent instruction file means \"nothing was\n * declared\", which is a legitimate state, not an error.\n */\nexport function readDeclaredIntent(root: string, files: readonly string[] = INTENT_FILES): DeclaredIntent {\n const patterns = new Set<string>();\n const sources: string[] = [];\n const citations: DeclaredIntent['citations'] = [];\n\n for (const rel of files) {\n const abs = path.join(root, rel);\n let text: string;\n try {\n const stat = fs.statSync(abs);\n if (!stat.isFile() || stat.size > MAX_INTENT_BYTES) continue;\n text = fs.readFileSync(abs, 'utf8');\n } catch {\n continue;\n }\n let matchedHere = false;\n const lines = text.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n for (const { pattern, match } of PATTERN_VOCABULARY) {\n if (!match.test(lines[i])) continue;\n patterns.add(pattern);\n matchedHere = true;\n if (citations.length < 12) {\n citations.push({ file: rel, line: i + 1, text: lines[i].trim().slice(0, 200) });\n }\n }\n }\n if (matchedHere) sources.push(rel);\n }\n\n return { patterns: [...patterns].sort(), sources, citations };\n}\n","/**\n * The `assess_change` binding: graph + root in, envelope out.\n *\n * Sits between the MCP tool (which owns transport and schema) and\n * `assess.ts` (which owns the rules). Its whole job is assembling the\n * baseline — peer votes, the similarity index, the guard convention — from a\n * graph the server already has loaded, and never throwing while it does so.\n *\n * The baseline is cached per (root, corpusHash). An agent calls this once per\n * edit, so rebuilding the index on every call would put seconds into a loop\n * that has to feel instant; keying on the graph's own corpus hash means a\n * rebuilt map invalidates it automatically and a stale one never silently\n * answers for the current code.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { classifyFile } from '../core-open/scanners/architecture/classify.js';\nimport type { ArchitectureLayer } from '../core-open/types.js';\nimport type { VgGraph } from '../schema.js';\nimport { assessChange, type AssessResult } from './assess.js';\nimport { classifyRoute } from './auth.js';\nimport { classifyDataAccess, type DataAccessPattern } from './dimensions.js';\nimport { MIN_GROUP_SIZE, voteAll, type DominanceVote, type PeerFile } from './dominance.js';\nimport { fileRecencyDays } from './git.js';\nimport { readDeclaredIntent } from './intent.js';\nimport { routesForFile } from './routes.js';\nimport { isComparable, SimilarityIndex, type FunctionBody } from './similarity.js';\n\ninterface Baseline {\n corpusHash: string;\n votes: DominanceVote[];\n dataAccess: Map<string, DataAccessPattern>;\n similarity: SimilarityIndex;\n declaredTarget: string | null;\n guardedByDirectory: Map<string, { guarded: number; classified: number }>;\n}\n\nconst cache = new Map<string, Baseline>();\n\n/** Drop the cached baseline for one root, or all of them. Used by tests. */\nexport function clearAssessBaselineCache(root?: string): void {\n if (root === undefined) cache.clear();\n else cache.delete(path.resolve(root));\n}\n\nconst BOUNDARY_EDGE_KINDS = new Set(['import', 'call']);\nconst FUNCTION_KINDS = new Set(['function', 'method']);\nconst ROUTE_LAYERS = new Set<ArchitectureLayer>(['routing', 'middleware', 'presentation']);\nconst MAX_ROUTE_FILES = 300;\n\nfunction buildBaseline(graph: VgGraph, root: string): Baseline {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const normalize = (p: string): string => p.replace(/\\\\/g, '/');\n const layerCache = new Map<string, ArchitectureLayer | null>();\n const layerOf = (p: string): ArchitectureLayer | null => {\n if (layerCache.has(p)) return layerCache.get(p)!;\n const cls = classifyFile(p, 'unknown');\n const layer = cls?.layer ?? null;\n layerCache.set(p, layer);\n return layer;\n };\n\n // Outgoing layer set per file — the input to the data-access dimension.\n const outgoing = new Map<string, Set<ArchitectureLayer>>();\n for (const edge of graph.edges) {\n if (!BOUNDARY_EDGE_KINDS.has(edge.kind)) continue;\n const src = nodeById.get(edge.src);\n const dst = nodeById.get(edge.dst);\n if (!src || !dst) continue;\n const from = normalize(src.file);\n const to = normalize(dst.file);\n if (from === to) continue;\n const toLayer = layerOf(to);\n if (!toLayer) continue;\n let set = outgoing.get(from);\n if (!set) outgoing.set(from, (set = new Set()));\n set.add(toLayer);\n }\n\n const areaOfFile = new Map<string, number>();\n for (const area of graph.areas) {\n for (const member of area.members) {\n const node = nodeById.get(member);\n if (node) areaOfFile.set(normalize(node.file), area.id);\n }\n }\n\n const files = [...new Set(graph.nodes.map((n) => normalize(n.file)))].sort();\n const recency = fileRecencyDays(root);\n const intent = readDeclaredIntent(root);\n\n const dataAccess = new Map<string, DataAccessPattern>();\n const candidates: { path: string; pattern: DataAccessPattern; role: string; areaGroup: string | null }[] = [];\n for (const file of files) {\n const cls = classifyFile(file, 'unknown');\n if (!cls) continue;\n const pattern = classifyDataAccess(cls.layer, [...(outgoing.get(file) ?? [])]);\n if (!pattern) continue;\n dataAccess.set(file, pattern);\n const areaId = areaOfFile.get(file);\n const role = cls.role ?? cls.layer;\n candidates.push({\n path: file,\n pattern,\n role,\n areaGroup: areaId !== undefined ? `area:${areaId}:${role}` : null,\n });\n }\n\n // Same grouping rule as the capsule compiler: area when thick enough, role\n // otherwise. It has to match, or the tool and the review would disagree about\n // what a file's peers even are.\n const areaCounts = new Map<string, number>();\n for (const c of candidates) {\n if (c.areaGroup) areaCounts.set(c.areaGroup, (areaCounts.get(c.areaGroup) ?? 0) + 1);\n }\n const peerFiles: PeerFile[] = candidates.map((c) => {\n const useArea = c.areaGroup !== null && (areaCounts.get(c.areaGroup) ?? 0) >= MIN_GROUP_SIZE;\n return {\n path: c.path,\n pattern: c.pattern,\n group: useArea ? c.areaGroup! : `role:${c.role}`,\n groupKind: useArea ? 'area' : 'role',\n daysSinceCommit: recency.get(c.path) ?? null,\n };\n });\n\n // Similarity index over existing bodies.\n const similarity = new SimilarityIndex();\n const lineCache = new Map<string, string[] | null>();\n const linesOf = (rel: string): string[] | null => {\n if (lineCache.has(rel)) return lineCache.get(rel)!;\n let value: string[] | null = null;\n try {\n const abs = path.join(root, rel);\n const stat = fs.statSync(abs);\n if (stat.isFile() && stat.size <= 1024 * 1024) value = fs.readFileSync(abs, 'utf8').split('\\n');\n } catch {\n value = null;\n }\n lineCache.set(rel, value);\n return value;\n };\n for (const node of graph.nodes) {\n if (!FUNCTION_KINDS.has(node.kind)) continue;\n const rel = normalize(node.file);\n if (!isComparable(rel)) continue;\n const lines = linesOf(rel);\n if (!lines) continue;\n const text = lines.slice(node.span.start - 1, node.span.end).join('\\n');\n if (!text.trim()) continue;\n const body: FunctionBody = {\n id: node.id,\n name: node.name,\n file: rel,\n startLine: node.span.start,\n endLine: node.span.end,\n text,\n };\n similarity.add(body);\n }\n\n // Guard convention per directory.\n const guardedByDirectory = new Map<string, { guarded: number; classified: number }>();\n let routeFiles = 0;\n for (const file of files) {\n if (routeFiles >= MAX_ROUTE_FILES) break;\n const layer = layerOf(file);\n if (!layer || !ROUTE_LAYERS.has(layer)) continue;\n const lines = linesOf(file);\n if (!lines) continue;\n routeFiles++;\n const dir = file.split('/').slice(0, -1).join('/') || '.';\n for (const route of routesForFile(file, lines.join('\\n'))) {\n const verdict = classifyRoute(route);\n if (verdict.verdict === 'unsure') continue;\n if (!/^(POST|PUT|PATCH|DELETE|ALL)$/i.test(route.method)) continue;\n const entry = guardedByDirectory.get(dir) ?? { guarded: 0, classified: 0 };\n entry.classified++;\n if (verdict.verdict === 'auth') entry.guarded++;\n guardedByDirectory.set(dir, entry);\n }\n }\n\n return {\n corpusHash: graph.provenance.corpusHash,\n votes: voteAll(peerFiles, { declaredPatterns: intent.patterns }),\n dataAccess,\n similarity,\n declaredTarget: intent.patterns[0] ?? null,\n guardedByDirectory,\n };\n}\n\n/**\n * Assess a proposed change against the served graph.\n *\n * Never throws: a tool that raises mid-edit gives an agent nothing to act on\n * and teaches it to stop asking. Every failure is a value with a status.\n */\nexport function assessProposedChange(\n graph: VgGraph,\n root: string,\n file: string,\n content: string,\n): AssessResult | { error: string; message: string } {\n if (!file) return { error: 'bad_request', message: 'file is required' };\n if (!content) return { error: 'bad_request', message: 'content is required' };\n\n const key = path.resolve(root);\n let baseline = cache.get(key);\n // The graph's own corpus hash is the cache key, so a rebuilt map invalidates\n // this automatically and a stale one can never answer for current code.\n if (!baseline || baseline.corpusHash !== graph.provenance.corpusHash) {\n try {\n baseline = buildBaseline(graph, root);\n cache.set(key, baseline);\n } catch {\n return {\n status: 'no_baseline',\n ok: true,\n conflicts: [],\n duplicateOf: [],\n convention: null,\n declaredTarget: null,\n unknowns: ['The baseline could not be built from the code map, so nothing was checked.'],\n confidence: 0.2,\n };\n }\n }\n\n const normalized = file.replace(/\\\\/g, '/');\n const cls = classifyFile(normalized, 'unknown');\n const role = cls ? (cls.role ?? cls.layer) : null;\n const directory = normalized.split('/').slice(0, -1).join('/') || '.';\n\n return assessChange({\n file: normalized,\n content,\n votes: baseline.votes,\n dataAccess: baseline.dataAccess,\n similarity: baseline.similarity,\n declaredTarget: baseline.declaredTarget,\n // Resolve the peer group the same way the capsule does, preferring the\n // file's area when it has one and falling back to its role.\n group:\n baseline.votes.find((v) => v.exemplars.includes(normalized) || v.deviators.includes(normalized))\n ?.group ?? (role ? `role:${role}` : undefined),\n guardedShare: baseline.guardedByDirectory.get(directory) ?? null,\n });\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 { rankQuestion } from '../engine/relevance-provider.js';\nimport { rankingAskFrom } from '../engine/user-ask.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 { assessProposedChange } from '../review/mcp-assess.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 // The relevance module ranks the seeds when installed; null → mechanical\n // fallback. rankQuestion never throws and the provider is memoized, so\n // this adds no meaningful latency to the navigation path.\n const topicTags = await loadTopicTags(graph, ctx.root, ctx.graphPath);\n const modRank = await rankQuestion(graph, rankingAskFrom(question), { limit: 48, topicTags });\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 ranked: modRank,\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, ranked: modRank });\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, ranked: modRank }), 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 name: 'assess_change',\n description:\n 'Before you write: would this code fit? One call reports whether the proposal conflicts with what its peers do, would add an unguarded route, or re-implements something that already exists — with the files to follow instead. Ask this while deciding; `vg review` asks the same questions after the fact, when the fix costs more.',\n inputSchema: obj(\n {\n file: { type: 'string', description: 'repo-relative path the code would live at' },\n content: { type: 'string', maxLength: 20000, description: 'the proposed code' },\n },\n ['file', 'content'],\n ),\n // A thin adapter. Every rule lives in `review/assess.ts`, transport-free, so\n // the hook, the CLI and this tool cannot drift into three sets of answers.\n handler: (graph, args, ctx) =>\n assessProposedChange(graph, ctx.root, String(args.file ?? ''), String(args.content ?? '')),\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"]}