@vibgrate/cli 2026.801.1 → 2026.803.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 (109) hide show
  1. package/dist/agent-HNV2VUCO.js +24 -0
  2. package/dist/{agent-4DAECASW.js.map → agent-HNV2VUCO.js.map} +1 -1
  3. package/dist/baseline-6WTULHM5.js +9 -0
  4. package/dist/{baseline-4BDH4F2W.js.map → baseline-6WTULHM5.js.map} +1 -1
  5. package/dist/{chunk-BNEHDLVZ.js → chunk-2TLQDF6C.js} +129 -20
  6. package/dist/chunk-2TLQDF6C.js.map +1 -0
  7. package/dist/{chunk-JLWI2JGA.js → chunk-4HFSUIIN.js} +117 -6
  8. package/dist/chunk-4HFSUIIN.js.map +1 -0
  9. package/dist/{chunk-IRCYOTRG.js → chunk-536J6HUR.js} +235 -13
  10. package/dist/chunk-536J6HUR.js.map +1 -0
  11. package/dist/{chunk-SDG242R4.js → chunk-5VH3Y4QC.js} +63 -361
  12. package/dist/chunk-5VH3Y4QC.js.map +1 -0
  13. package/dist/{chunk-E6H2F2XF.js → chunk-6I4TXAI6.js} +3 -3
  14. package/dist/{chunk-E6H2F2XF.js.map → chunk-6I4TXAI6.js.map} +1 -1
  15. package/dist/{chunk-FF5ZQ6KI.js → chunk-6JP7HGIF.js} +4 -4
  16. package/dist/{chunk-FF5ZQ6KI.js.map → chunk-6JP7HGIF.js.map} +1 -1
  17. package/dist/chunk-AJ2KE3NT.js +446 -0
  18. package/dist/chunk-AJ2KE3NT.js.map +1 -0
  19. package/dist/{chunk-V2QK3IUY.js → chunk-B2KLJPFY.js} +4 -4
  20. package/dist/{chunk-V2QK3IUY.js.map → chunk-B2KLJPFY.js.map} +1 -1
  21. package/dist/{chunk-B3OMGYZZ.js → chunk-BBFQZ7CA.js} +4 -4
  22. package/dist/{chunk-B3OMGYZZ.js.map → chunk-BBFQZ7CA.js.map} +1 -1
  23. package/dist/{chunk-I6RBAIS3.js → chunk-BWMMR5XA.js} +4 -4
  24. package/dist/{chunk-I6RBAIS3.js.map → chunk-BWMMR5XA.js.map} +1 -1
  25. package/dist/{chunk-WIDZ5IE7.js → chunk-CC6F75GI.js} +14 -7
  26. package/dist/chunk-CC6F75GI.js.map +1 -0
  27. package/dist/{chunk-G7W4MFPZ.js → chunk-CE45STY5.js} +4 -4
  28. package/dist/{chunk-G7W4MFPZ.js.map → chunk-CE45STY5.js.map} +1 -1
  29. package/dist/{chunk-T6DRYOMT.js → chunk-DIU3MXB3.js} +4 -4
  30. package/dist/{chunk-T6DRYOMT.js.map → chunk-DIU3MXB3.js.map} +1 -1
  31. package/dist/{chunk-KL65SSR7.js → chunk-FKFRASAB.js} +323 -152
  32. package/dist/chunk-FKFRASAB.js.map +1 -0
  33. package/dist/{chunk-A43I2AJ4.js → chunk-JUSXLCSE.js} +3 -3
  34. package/dist/{chunk-A43I2AJ4.js.map → chunk-JUSXLCSE.js.map} +1 -1
  35. package/dist/{chunk-7G5S5KZN.js → chunk-KUZLILN3.js} +16 -3
  36. package/dist/chunk-KUZLILN3.js.map +1 -0
  37. package/dist/{chunk-76TDXGGF.js → chunk-N4IDP2M2.js} +218 -51
  38. package/dist/chunk-N4IDP2M2.js.map +1 -0
  39. package/dist/{chunk-XRN7DQGR.js → chunk-NJFQCDGA.js} +3 -3
  40. package/dist/{chunk-XRN7DQGR.js.map → chunk-NJFQCDGA.js.map} +1 -1
  41. package/dist/{chunk-XEJJGDGX.js → chunk-O7MTBC52.js} +134 -9
  42. package/dist/chunk-O7MTBC52.js.map +1 -0
  43. package/dist/chunk-QT2PMGN3.js +6 -0
  44. package/dist/{chunk-TGDHOAXX.js.map → chunk-QT2PMGN3.js.map} +1 -1
  45. package/dist/{chunk-V3X3DBZL.js → chunk-S4NSF5AZ.js} +6 -6
  46. package/dist/{chunk-V3X3DBZL.js.map → chunk-S4NSF5AZ.js.map} +1 -1
  47. package/dist/{chunk-G25STLE7.js → chunk-SJFBXCII.js} +30 -3
  48. package/dist/chunk-SJFBXCII.js.map +1 -0
  49. package/dist/{chunk-7PVCHLR2.js → chunk-SNKTD23L.js} +109 -10
  50. package/dist/chunk-SNKTD23L.js.map +1 -0
  51. package/dist/{chunk-IPICO2RV.js → chunk-VIWZ4QT7.js} +14 -3
  52. package/dist/chunk-VIWZ4QT7.js.map +1 -0
  53. package/dist/{chunk-MPP4S4OE.js → chunk-Y7YKUZ3T.js} +8 -7
  54. package/dist/chunk-Y7YKUZ3T.js.map +1 -0
  55. package/dist/cli.js +730 -345
  56. package/dist/cli.js.map +1 -1
  57. package/dist/ensure-map-5YEI7R7V.js +29 -0
  58. package/dist/{ensure-map-SMWHKOUY.js.map → ensure-map-5YEI7R7V.js.map} +1 -1
  59. package/dist/{graph-backend-I4I72J4W.js → graph-backend-CPHLUKUC.js} +5 -5
  60. package/dist/{graph-backend-I4I72J4W.js.map → graph-backend-CPHLUKUC.js.map} +1 -1
  61. package/dist/index.d.ts +118 -7
  62. package/dist/index.js +17 -16
  63. package/dist/index.js.map +1 -1
  64. package/dist/{interactive-TMQR6TXM.js → interactive-TNRE4OEK.js} +45 -32
  65. package/dist/interactive-TNRE4OEK.js.map +1 -0
  66. package/dist/load-MWG6WZTK.js +10 -0
  67. package/dist/{load-E3OTM7BS.js.map → load-MWG6WZTK.js.map} +1 -1
  68. package/dist/model-manager-GJ2YSTSK.js +1 -1
  69. package/dist/{run-outcome-QWLNBASF.js → run-outcome-375HMSQG.js} +6 -6
  70. package/dist/{run-outcome-QWLNBASF.js.map → run-outcome-375HMSQG.js.map} +1 -1
  71. package/dist/runtime-session-3MPWXNRL.js +20 -0
  72. package/dist/{runtime-session-UQ7UVAPL.js.map → runtime-session-3MPWXNRL.js.map} +1 -1
  73. package/dist/session-2NGJLI5Y.js +15 -0
  74. package/dist/{session-MG6BJVAG.js.map → session-2NGJLI5Y.js.map} +1 -1
  75. package/dist/session-store-F7NX7SZN.js +4 -0
  76. package/dist/{session-store-SQECEXUU.js.map → session-store-F7NX7SZN.js.map} +1 -1
  77. package/dist/{stream-json-GM44SP7L.js → stream-json-AUMU3NLV.js} +48 -16
  78. package/dist/stream-json-AUMU3NLV.js.map +1 -0
  79. package/dist/{vg-mcp-bridge-3WFC7LGE.js → vg-mcp-bridge-D463EHQI.js} +13 -11
  80. package/dist/vg-mcp-bridge-D463EHQI.js.map +1 -0
  81. package/dist/{vgd-ZUSBEVUL.js → vgd-Z23PXSP4.js} +9 -9
  82. package/dist/{vgd-ZUSBEVUL.js.map → vgd-Z23PXSP4.js.map} +1 -1
  83. package/package.json +1 -1
  84. package/dist/agent-4DAECASW.js +0 -22
  85. package/dist/baseline-4BDH4F2W.js +0 -9
  86. package/dist/chunk-76TDXGGF.js.map +0 -1
  87. package/dist/chunk-7G5S5KZN.js.map +0 -1
  88. package/dist/chunk-7PVCHLR2.js.map +0 -1
  89. package/dist/chunk-BNEHDLVZ.js.map +0 -1
  90. package/dist/chunk-G25STLE7.js.map +0 -1
  91. package/dist/chunk-IPICO2RV.js.map +0 -1
  92. package/dist/chunk-IRCYOTRG.js.map +0 -1
  93. package/dist/chunk-JLWI2JGA.js.map +0 -1
  94. package/dist/chunk-KL65SSR7.js.map +0 -1
  95. package/dist/chunk-MPP4S4OE.js.map +0 -1
  96. package/dist/chunk-SDG242R4.js.map +0 -1
  97. package/dist/chunk-TGDHOAXX.js +0 -6
  98. package/dist/chunk-WIDZ5IE7.js.map +0 -1
  99. package/dist/chunk-XEJJGDGX.js.map +0 -1
  100. package/dist/chunk-ZKNB4YH4.js +0 -102
  101. package/dist/chunk-ZKNB4YH4.js.map +0 -1
  102. package/dist/ensure-map-SMWHKOUY.js +0 -28
  103. package/dist/interactive-TMQR6TXM.js.map +0 -1
  104. package/dist/load-E3OTM7BS.js +0 -10
  105. package/dist/runtime-session-UQ7UVAPL.js +0 -20
  106. package/dist/session-MG6BJVAG.js +0 -13
  107. package/dist/session-store-SQECEXUU.js +0 -4
  108. package/dist/stream-json-GM44SP7L.js.map +0 -1
  109. package/dist/vg-mcp-bridge-3WFC7LGE.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { vgdRequest } from './chunk-RBIRXQR6.js';
2
2
  import { resolveOne } from './chunk-J7LKEB2R.js';
3
- import { impactOf, queryGraph } from './chunk-SDG242R4.js';
3
+ import { impactOf, queryGraph } from './chunk-5VH3Y4QC.js';
4
4
 
5
5
  // src/code/graph-backend.ts
6
6
  function localGraphBackend(graph) {
@@ -132,5 +132,5 @@ function resolveSymbolId(graph, symbol) {
132
132
  }
133
133
 
134
134
  export { localGraphBackend, resolveGraphBackend, vgdGraphBackend };
135
- //# sourceMappingURL=chunk-A43I2AJ4.js.map
136
- //# sourceMappingURL=chunk-A43I2AJ4.js.map
135
+ //# sourceMappingURL=chunk-JUSXLCSE.js.map
136
+ //# sourceMappingURL=chunk-JUSXLCSE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/code/graph-backend.ts"],"names":[],"mappings":"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","file":"chunk-A43I2AJ4.js","sourcesContent":["/**\n * Graph query backend for the agent tool layer (Fusion Runtime).\n *\n * Tools prefer a warm ActiveGraph in vgd when a daemon session is attached;\n * otherwise they fall back to the in-process {@link VgGraph}. Failures never\n * surface to the model as transport errors — they degrade to local query.\n */\n\nimport { queryGraph } from '../engine/query.js';\nimport { impactOf } from '../engine/impact.js';\nimport { resolveOne } from '../engine/lookup.js';\nimport { vgdRequest, type VgdClientOptions } from '../runtime/vgd/client.js';\nimport type { VgdRequest } from '../runtime/vgd/protocol.js';\nimport type { VgGraph } from '../schema.js';\n\nexport type GraphBackendSource = 'local' | 'vgd';\n\nexport interface GraphSearchHit {\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n score: number;\n why: string;\n signature?: string | null;\n}\n\nexport interface GraphImpactHit {\n id: string;\n name: string;\n kind: string;\n file: string;\n line: number;\n depth: number;\n confidence: number;\n}\n\nexport interface GraphImpactResult {\n root: { id: string; name: string };\n depth: number;\n affected: GraphImpactHit[];\n direct: number;\n transitive: number;\n source: GraphBackendSource;\n}\n\nexport interface GraphSearchResult {\n matches: GraphSearchHit[];\n source: GraphBackendSource;\n}\n\nexport interface GraphBackend {\n readonly source: GraphBackendSource;\n search(query: string, opts?: { limit?: number }): Promise<GraphSearchResult>;\n impact(symbol: string, opts?: { depth?: number }): Promise<GraphImpactResult | null>;\n}\n\n/** Pure in-process backend over a loaded graph. */\nexport function localGraphBackend(graph: VgGraph): GraphBackend {\n return {\n source: 'local',\n async search(query, opts) {\n const res = queryGraph(graph, query, { budget: 1500, limit: opts?.limit ?? 10 });\n return {\n source: 'local',\n matches: res.matches.map((m) => ({\n id: m.node.id,\n qualifiedName: m.node.qualifiedName,\n kind: m.node.kind,\n file: m.node.file,\n line: m.node.span?.start ?? 0,\n score: m.score,\n why: m.why,\n signature: m.node.signature ?? null,\n })),\n };\n },\n async impact(symbol, opts) {\n const node = resolveSymbolId(graph, symbol);\n if (!node) return null;\n const imp = impactOf(graph, node, { depth: opts?.depth ?? 4 });\n return {\n source: 'local',\n root: imp.root,\n depth: imp.depth,\n affected: imp.affected.map((a) => ({\n id: a.id,\n name: a.name,\n kind: a.kind,\n file: a.file,\n line: a.line,\n depth: a.depth,\n confidence: a.confidence,\n })),\n direct: imp.direct,\n transitive: imp.transitive,\n };\n },\n };\n}\n\nexport interface VgdGraphBackendOptions {\n repositoryId: string;\n gitRef?: string;\n socketPath?: string;\n /** Always required for fall back when vgd has no slot or is down. */\n fallback: VgGraph;\n request?: (req: VgdRequest, opts?: VgdClientOptions) => Promise<unknown>;\n}\n\n/**\n * Prefer vgd query/impact; on any failure or empty daemon state, use local.\n * The returned `source` reflects which path answered.\n */\nexport function vgdGraphBackend(options: VgdGraphBackendOptions): GraphBackend {\n const local = localGraphBackend(options.fallback);\n const request = options.request ?? ((req, opts) => vgdRequest(req, opts));\n const clientOpts: VgdClientOptions = { socketPath: options.socketPath };\n\n return {\n source: 'vgd',\n async search(query, opts) {\n try {\n const res = (await request(\n {\n op: 'query-graph',\n repositoryId: options.repositoryId,\n query,\n limit: opts?.limit ?? 10,\n gitRef: options.gitRef,\n },\n clientOpts,\n )) as {\n ok?: boolean;\n matches?: Array<{\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n score: number;\n why: string;\n }>;\n };\n if (res?.ok && Array.isArray(res.matches)) {\n return {\n source: 'vgd',\n matches: res.matches.map((m) => ({\n id: m.id,\n qualifiedName: m.qualifiedName,\n kind: m.kind,\n file: m.file,\n line: m.line,\n score: m.score,\n why: m.why,\n signature: null,\n })),\n };\n }\n } catch {\n /* fall through */\n }\n return local.search(query, opts);\n },\n async impact(symbol, opts) {\n try {\n const res = (await request(\n {\n op: 'impact-of',\n repositoryId: options.repositoryId,\n symbol,\n depth: opts?.depth ?? 4,\n gitRef: options.gitRef,\n },\n clientOpts,\n )) as {\n ok?: boolean;\n root?: { id: string; name: string };\n depth?: number;\n affected?: GraphImpactHit[];\n direct?: number;\n transitive?: number;\n };\n if (res?.ok && res.root && Array.isArray(res.affected)) {\n return {\n source: 'vgd',\n root: res.root,\n depth: res.depth ?? opts?.depth ?? 4,\n affected: res.affected,\n direct: res.direct ?? 0,\n transitive: res.transitive ?? 0,\n };\n }\n } catch {\n /* fall through */\n }\n return local.impact(symbol, opts);\n },\n };\n}\n\n/**\n * Pick a backend: vgd when repositoryId + socket are known, else local.\n */\nexport function resolveGraphBackend(input: {\n graph: VgGraph;\n repositoryId?: string | null;\n gitRef?: string | null;\n socketPath?: string | null;\n}): GraphBackend {\n if (input.repositoryId && input.socketPath) {\n return vgdGraphBackend({\n repositoryId: input.repositoryId,\n gitRef: input.gitRef ?? undefined,\n socketPath: input.socketPath,\n fallback: input.graph,\n });\n }\n return localGraphBackend(input.graph);\n}\n\nfunction resolveSymbolId(graph: VgGraph, symbol: string): string | null {\n if (graph.nodes.some((n) => n.id === symbol)) return symbol;\n const hit = resolveOne(graph, symbol);\n if (hit.node?.id) return hit.node.id;\n if (hit.candidates.length === 1 && hit.candidates[0]?.id) return hit.candidates[0].id;\n const q = symbol.toLowerCase();\n const byQn = graph.nodes.find((n) => n.qualifiedName?.toLowerCase() === q || n.name?.toLowerCase() === q);\n return byQn?.id ?? null;\n}\n"]}
1
+ {"version":3,"sources":["../src/code/graph-backend.ts"],"names":[],"mappings":"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","file":"chunk-JUSXLCSE.js","sourcesContent":["/**\n * Graph query backend for the agent tool layer (Fusion Runtime).\n *\n * Tools prefer a warm ActiveGraph in vgd when a daemon session is attached;\n * otherwise they fall back to the in-process {@link VgGraph}. Failures never\n * surface to the model as transport errors — they degrade to local query.\n */\n\nimport { queryGraph } from '../engine/query.js';\nimport { impactOf } from '../engine/impact.js';\nimport { resolveOne } from '../engine/lookup.js';\nimport { vgdRequest, type VgdClientOptions } from '../runtime/vgd/client.js';\nimport type { VgdRequest } from '../runtime/vgd/protocol.js';\nimport type { VgGraph } from '../schema.js';\n\nexport type GraphBackendSource = 'local' | 'vgd';\n\nexport interface GraphSearchHit {\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n score: number;\n why: string;\n signature?: string | null;\n}\n\nexport interface GraphImpactHit {\n id: string;\n name: string;\n kind: string;\n file: string;\n line: number;\n depth: number;\n confidence: number;\n}\n\nexport interface GraphImpactResult {\n root: { id: string; name: string };\n depth: number;\n affected: GraphImpactHit[];\n direct: number;\n transitive: number;\n source: GraphBackendSource;\n}\n\nexport interface GraphSearchResult {\n matches: GraphSearchHit[];\n source: GraphBackendSource;\n}\n\nexport interface GraphBackend {\n readonly source: GraphBackendSource;\n search(query: string, opts?: { limit?: number }): Promise<GraphSearchResult>;\n impact(symbol: string, opts?: { depth?: number }): Promise<GraphImpactResult | null>;\n}\n\n/** Pure in-process backend over a loaded graph. */\nexport function localGraphBackend(graph: VgGraph): GraphBackend {\n return {\n source: 'local',\n async search(query, opts) {\n const res = queryGraph(graph, query, { budget: 1500, limit: opts?.limit ?? 10 });\n return {\n source: 'local',\n matches: res.matches.map((m) => ({\n id: m.node.id,\n qualifiedName: m.node.qualifiedName,\n kind: m.node.kind,\n file: m.node.file,\n line: m.node.span?.start ?? 0,\n score: m.score,\n why: m.why,\n signature: m.node.signature ?? null,\n })),\n };\n },\n async impact(symbol, opts) {\n const node = resolveSymbolId(graph, symbol);\n if (!node) return null;\n const imp = impactOf(graph, node, { depth: opts?.depth ?? 4 });\n return {\n source: 'local',\n root: imp.root,\n depth: imp.depth,\n affected: imp.affected.map((a) => ({\n id: a.id,\n name: a.name,\n kind: a.kind,\n file: a.file,\n line: a.line,\n depth: a.depth,\n confidence: a.confidence,\n })),\n direct: imp.direct,\n transitive: imp.transitive,\n };\n },\n };\n}\n\nexport interface VgdGraphBackendOptions {\n repositoryId: string;\n gitRef?: string;\n socketPath?: string;\n /** Always required for fall back when vgd has no slot or is down. */\n fallback: VgGraph;\n request?: (req: VgdRequest, opts?: VgdClientOptions) => Promise<unknown>;\n}\n\n/**\n * Prefer vgd query/impact; on any failure or empty daemon state, use local.\n * The returned `source` reflects which path answered.\n */\nexport function vgdGraphBackend(options: VgdGraphBackendOptions): GraphBackend {\n const local = localGraphBackend(options.fallback);\n const request = options.request ?? ((req, opts) => vgdRequest(req, opts));\n const clientOpts: VgdClientOptions = { socketPath: options.socketPath };\n\n return {\n source: 'vgd',\n async search(query, opts) {\n try {\n const res = (await request(\n {\n op: 'query-graph',\n repositoryId: options.repositoryId,\n query,\n limit: opts?.limit ?? 10,\n gitRef: options.gitRef,\n },\n clientOpts,\n )) as {\n ok?: boolean;\n matches?: Array<{\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n score: number;\n why: string;\n }>;\n };\n if (res?.ok && Array.isArray(res.matches)) {\n return {\n source: 'vgd',\n matches: res.matches.map((m) => ({\n id: m.id,\n qualifiedName: m.qualifiedName,\n kind: m.kind,\n file: m.file,\n line: m.line,\n score: m.score,\n why: m.why,\n signature: null,\n })),\n };\n }\n } catch {\n /* fall through */\n }\n return local.search(query, opts);\n },\n async impact(symbol, opts) {\n try {\n const res = (await request(\n {\n op: 'impact-of',\n repositoryId: options.repositoryId,\n symbol,\n depth: opts?.depth ?? 4,\n gitRef: options.gitRef,\n },\n clientOpts,\n )) as {\n ok?: boolean;\n root?: { id: string; name: string };\n depth?: number;\n affected?: GraphImpactHit[];\n direct?: number;\n transitive?: number;\n };\n if (res?.ok && res.root && Array.isArray(res.affected)) {\n return {\n source: 'vgd',\n root: res.root,\n depth: res.depth ?? opts?.depth ?? 4,\n affected: res.affected,\n direct: res.direct ?? 0,\n transitive: res.transitive ?? 0,\n };\n }\n } catch {\n /* fall through */\n }\n return local.impact(symbol, opts);\n },\n };\n}\n\n/**\n * Pick a backend: vgd when repositoryId + socket are known, else local.\n */\nexport function resolveGraphBackend(input: {\n graph: VgGraph;\n repositoryId?: string | null;\n gitRef?: string | null;\n socketPath?: string | null;\n}): GraphBackend {\n if (input.repositoryId && input.socketPath) {\n return vgdGraphBackend({\n repositoryId: input.repositoryId,\n gitRef: input.gitRef ?? undefined,\n socketPath: input.socketPath,\n fallback: input.graph,\n });\n }\n return localGraphBackend(input.graph);\n}\n\nfunction resolveSymbolId(graph: VgGraph, symbol: string): string | null {\n if (graph.nodes.some((n) => n.id === symbol)) return symbol;\n const hit = resolveOne(graph, symbol);\n if (hit.node?.id) return hit.node.id;\n if (hit.candidates.length === 1 && hit.candidates[0]?.id) return hit.candidates[0].id;\n const q = symbol.toLowerCase();\n const byQn = graph.nodes.find((n) => n.qualifiedName?.toLowerCase() === q || n.name?.toLowerCase() === q);\n return byQn?.id ?? null;\n}\n"]}
@@ -84,6 +84,19 @@ ${lines.join("\n")}`;
84
84
  function newSession(id, provider, model, now) {
85
85
  return { id, provider, model, startedAt: now, updatedAt: now, tasks: [], lastChanges: [] };
86
86
  }
87
+ function condenseSession(session, now) {
88
+ if (session.tasks.length <= 1) return session;
89
+ const files = [...new Set(session.tasks.flatMap((t) => t.files))];
90
+ const lines = session.tasks.slice(-12).map((t) => `${t.instruction.slice(0, 80)} \u2014 ${t.summary.slice(0, 80)}`);
91
+ const checkpoint = {
92
+ instruction: `(compacted: ${session.tasks.length} earlier task(s))`,
93
+ summary: lines.join(" \xB7 ").slice(0, 1500),
94
+ files,
95
+ stopped: "compacted",
96
+ ts: now
97
+ };
98
+ return { ...session, updatedAt: now, tasks: [checkpoint] };
99
+ }
87
100
  function recordTask(session, task, now) {
88
101
  const files = [...new Set(task.changes.map((c) => c.file))];
89
102
  return {
@@ -94,6 +107,6 @@ function recordTask(session, task, now) {
94
107
  };
95
108
  }
96
109
 
97
- export { listSessions, loadLatestSession, loadSession, newSession, recordTask, saveSession, sessionsDir, setLatestSession, summarizeSession };
98
- //# sourceMappingURL=chunk-7G5S5KZN.js.map
99
- //# sourceMappingURL=chunk-7G5S5KZN.js.map
110
+ export { condenseSession, listSessions, loadLatestSession, loadSession, newSession, recordTask, saveSession, sessionsDir, setLatestSession, summarizeSession };
111
+ //# sourceMappingURL=chunk-KUZLILN3.js.map
112
+ //# sourceMappingURL=chunk-KUZLILN3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/code/session-store.ts"],"names":[],"mappings":"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","file":"chunk-KUZLILN3.js","sourcesContent":["/**\n * Session persistence for VG Code (VG-CLI-CODE §16) — `vg code --continue`.\n *\n * A coding session is a series of tasks; this stores a compact record of them\n * (what you asked, a one-line outcome, which files changed) plus the last\n * change-set so `/undo` survives a restart. `--continue` reloads the most recent\n * session and hands the model a short summary of what was already done, so you\n * can pick a conversation back up instead of re-explaining. We persist a\n * *summary*, never raw file contents or tool transcripts — small, private, and\n * safe to keep on disk.\n *\n * Pure over an injected clock; the store is JSON under `.vibgrate/code-sessions/`.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { FileChange } from './types.js';\n\nexport interface SessionTask {\n instruction: string;\n summary: string;\n files: string[];\n stopped: string;\n ts: number;\n}\n\nexport interface StoredSession {\n id: string;\n provider: string;\n model: string;\n startedAt: number;\n updatedAt: number;\n tasks: SessionTask[];\n /** The most recent change-set, so `/undo` works after `--continue`. */\n lastChanges: FileChange[];\n}\n\nexport function sessionsDir(root: string): string {\n return path.join(root, '.vibgrate', 'code-sessions');\n}\nfunction latestPointer(root: string): string {\n return path.join(sessionsDir(root), 'latest.json');\n}\n\n/** Write a session and update the `latest` pointer. Best-effort; never throws. */\nexport function saveSession(root: string, session: StoredSession): void {\n try {\n const dir = sessionsDir(root);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, `${session.id}.json`), JSON.stringify(session, null, 2));\n fs.writeFileSync(latestPointer(root), JSON.stringify({ id: session.id }));\n } catch {\n /* persistence is best-effort */\n }\n}\n\n/** Load the most recent session, or undefined if none/there was a read error. */\nexport function loadLatestSession(root: string): StoredSession | undefined {\n try {\n const { id } = JSON.parse(fs.readFileSync(latestPointer(root), 'utf8')) as { id: string };\n return loadSession(root, id);\n } catch {\n /* no session */\n }\n return undefined;\n}\n\n/** Load one session by id, or undefined if missing/invalid. */\nexport function loadSession(root: string, id: string): StoredSession | undefined {\n try {\n const safe = id.replace(/[^a-zA-Z0-9_-]/g, '');\n if (!safe || safe !== id) return undefined;\n const raw = JSON.parse(fs.readFileSync(path.join(sessionsDir(root), `${safe}.json`), 'utf8')) as StoredSession;\n if (Array.isArray(raw.tasks) && raw.id) return raw;\n } catch {\n /* missing */\n }\n return undefined;\n}\n\nexport interface SessionListEntry {\n id: string;\n provider: string;\n model: string;\n startedAt: number;\n updatedAt: number;\n taskCount: number;\n /** First task instruction (truncated) for history UI. */\n title: string;\n}\n\n/** List stored sessions newest-first (multi-chat history). Best-effort. */\nexport function listSessions(root: string, limit = 50): SessionListEntry[] {\n try {\n const dir = sessionsDir(root);\n if (!fs.existsSync(dir)) return [];\n const files = fs.readdirSync(dir).filter((f) => f.endsWith('.json') && f !== 'latest.json');\n const out: SessionListEntry[] = [];\n for (const f of files) {\n try {\n const raw = JSON.parse(fs.readFileSync(path.join(dir, f), 'utf8')) as StoredSession;\n if (!raw?.id || !Array.isArray(raw.tasks)) continue;\n const first = raw.tasks[0]?.instruction?.trim() || 'New chat';\n out.push({\n id: raw.id,\n provider: raw.provider ?? '',\n model: raw.model ?? '',\n startedAt: raw.startedAt ?? 0,\n updatedAt: raw.updatedAt ?? raw.startedAt ?? 0,\n taskCount: raw.tasks.length,\n title: first.slice(0, 80),\n });\n } catch {\n /* skip bad file */\n }\n }\n out.sort((a, b) => b.updatedAt - a.updatedAt);\n return out.slice(0, Math.max(1, limit));\n } catch {\n return [];\n }\n}\n\n/** Point `latest` at an existing session (resume a prior chat). */\nexport function setLatestSession(root: string, id: string): boolean {\n const s = loadSession(root, id);\n if (!s) return false;\n try {\n fs.mkdirSync(sessionsDir(root), { recursive: true });\n fs.writeFileSync(latestPointer(root), JSON.stringify({ id: s.id }));\n return true;\n } catch {\n return false;\n }\n}\n\n/** A short natural-language recap of a session to seed a continued run's context. */\nexport function summarizeSession(session: StoredSession): string {\n if (session.tasks.length === 0) return '';\n const lines = session.tasks.slice(-8).map((t, i) => `${i + 1}. ${t.instruction} — ${t.summary}${t.files.length ? ` (${t.files.join(', ')})` : ''}`);\n return `Earlier in this session (${session.provider}/${session.model}) you did:\\n${lines.join('\\n')}`;\n}\n\n/** A fresh session record. `id` and `now` are injected so this stays deterministic. */\nexport function newSession(id: string, provider: string, model: string, now: number): StoredSession {\n return { id, provider, model, startedAt: now, updatedAt: now, tasks: [], lastChanges: [] };\n}\n\n/**\n * Manually compact a session: collapse all recorded tasks into a single\n * checkpoint entry so the recap seeded into future turns shrinks to one line\n * per prior task, capped. Deterministic (no model call) — the in-turn LLM\n * compaction handles rich summaries; this is the user-invoked `/compact`.\n */\nexport function condenseSession(session: StoredSession, now: number): StoredSession {\n if (session.tasks.length <= 1) return session;\n const files = [...new Set(session.tasks.flatMap((t) => t.files))];\n const lines = session.tasks\n .slice(-12)\n .map((t) => `${t.instruction.slice(0, 80)} — ${t.summary.slice(0, 80)}`);\n const checkpoint: SessionTask = {\n instruction: `(compacted: ${session.tasks.length} earlier task(s))`,\n summary: lines.join(' · ').slice(0, 1500),\n files,\n stopped: 'compacted',\n ts: now,\n };\n return { ...session, updatedAt: now, tasks: [checkpoint] };\n}\n\n/** Append a completed task (immutably updating the record's timestamps). */\nexport function recordTask(\n session: StoredSession,\n task: { instruction: string; summary: string; changes: FileChange[]; stopped: string },\n now: number,\n): StoredSession {\n const files = [...new Set(task.changes.map((c) => c.file))];\n return {\n ...session,\n updatedAt: now,\n tasks: [...session.tasks, { instruction: task.instruction.slice(0, 300), summary: task.summary.slice(0, 300), files, stopped: task.stopped, ts: now }],\n lastChanges: task.changes.length ? task.changes : session.lastChanges,\n };\n}\n"]}
@@ -1,11 +1,13 @@
1
- import { VERSION } from './chunk-TGDHOAXX.js';
2
- import { parseGraph, stableStringify, serializeGraph } from './chunk-ZKNB4YH4.js';
1
+ import { VERSION } from './chunk-QT2PMGN3.js';
2
+ import { parseGraph, stableStringify, WEAK_TERMS, serializeGraph } from './chunk-AJ2KE3NT.js';
3
3
  import { globalGraphPathForRef, globalGraphPath, repositoryStoreDir } from './chunk-BWPBB45M.js';
4
4
  import { detectGitRef } from './chunk-BPF3YX2U.js';
5
- import * as fs2 from 'fs';
5
+ import * as fs3 from 'fs';
6
6
  import * as zlib from 'zlib';
7
7
  import { Packr } from 'msgpackr';
8
- import * as path from 'path';
8
+ import * as os from 'os';
9
+ import * as path2 from 'path';
10
+ import { pathToFileURL } from 'url';
9
11
 
10
12
  var MAGIC = Buffer.from("VGSNAP1\0", "latin1");
11
13
  var crc322 = zlib.crc32 ?? jsCrc32;
@@ -43,7 +45,7 @@ function writeGraphSnapshot(graphPath, graph, opts = {}) {
43
45
  standalone: true
44
46
  });
45
47
  } else {
46
- const stat = fs2.statSync(graphPath);
48
+ const stat = fs3.statSync(graphPath);
47
49
  header = newPackr().pack({
48
50
  engine: VERSION,
49
51
  sourceSize: stat.size,
@@ -56,10 +58,10 @@ function writeGraphSnapshot(graphPath, graph, opts = {}) {
56
58
  const file = snapshotPathFor(graphPath);
57
59
  const tmp = `${file}.${process.pid}.tmp`;
58
60
  try {
59
- fs2.writeFileSync(tmp, Buffer.concat([MAGIC, lenBuf, header, payload]));
60
- fs2.renameSync(tmp, file);
61
+ fs3.writeFileSync(tmp, Buffer.concat([MAGIC, lenBuf, header, payload]));
62
+ fs3.renameSync(tmp, file);
61
63
  } catch (err) {
62
- fs2.rmSync(tmp, { force: true });
64
+ fs3.rmSync(tmp, { force: true });
63
65
  throw err;
64
66
  }
65
67
  return true;
@@ -70,8 +72,8 @@ function writeGraphSnapshot(graphPath, graph, opts = {}) {
70
72
  function readGraphSnapshot(graphPath) {
71
73
  try {
72
74
  const file = snapshotPathFor(graphPath);
73
- if (!fs2.existsSync(file)) return null;
74
- const raw = fs2.readFileSync(file);
75
+ if (!fs3.existsSync(file)) return null;
76
+ const raw = fs3.readFileSync(file);
75
77
  if (raw.length < MAGIC.length + 4 || !raw.subarray(0, MAGIC.length).equals(MAGIC)) return null;
76
78
  const headerLen = raw.readUInt32LE(MAGIC.length);
77
79
  const payloadStart = MAGIC.length + 4 + headerLen;
@@ -79,7 +81,7 @@ function readGraphSnapshot(graphPath) {
79
81
  const header = newPackr().unpack(raw.subarray(MAGIC.length + 4, payloadStart));
80
82
  if (!header.standalone) {
81
83
  if (header.engine !== VERSION) return null;
82
- const sourceStat = fs2.statSync(graphPath);
84
+ const sourceStat = fs3.statSync(graphPath);
83
85
  if (header.sourceSize !== sourceStat.size || header.sourceMtimeMs !== sourceStat.mtimeMs) return null;
84
86
  }
85
87
  const payload = raw.subarray(payloadStart);
@@ -92,24 +94,24 @@ function readGraphSnapshot(graphPath) {
92
94
  }
93
95
  }
94
96
  function mapFileExists(graphPath) {
95
- if (fs2.existsSync(graphPath)) return true;
97
+ if (fs3.existsSync(graphPath)) return true;
96
98
  return readSnapshotHeader(snapshotPathFor(graphPath))?.standalone === true;
97
99
  }
98
100
  function mapFileStat(graphPath) {
99
101
  try {
100
- return fs2.statSync(graphPath);
102
+ return fs3.statSync(graphPath);
101
103
  } catch (err) {
102
104
  const snap = snapshotPathFor(graphPath);
103
- if (fs2.existsSync(snap)) return fs2.statSync(snap);
105
+ if (fs3.existsSync(snap)) return fs3.statSync(snap);
104
106
  throw err;
105
107
  }
106
108
  }
107
109
  function readSnapshotHeader(file) {
108
110
  let fd = null;
109
111
  try {
110
- fd = fs2.openSync(file, "r");
112
+ fd = fs3.openSync(file, "r");
111
113
  const prefix = Buffer.alloc(4096);
112
- const read = fs2.readSync(fd, prefix, 0, prefix.length, 0);
114
+ const read = fs3.readSync(fd, prefix, 0, prefix.length, 0);
113
115
  if (read < MAGIC.length + 4 || !prefix.subarray(0, MAGIC.length).equals(MAGIC)) return null;
114
116
  const headerLen = prefix.readUInt32LE(MAGIC.length);
115
117
  if (MAGIC.length + 4 + headerLen > read) return null;
@@ -117,7 +119,7 @@ function readSnapshotHeader(file) {
117
119
  } catch {
118
120
  return null;
119
121
  } finally {
120
- if (fd !== null) fs2.closeSync(fd);
122
+ if (fd !== null) fs3.closeSync(fd);
121
123
  }
122
124
  }
123
125
  function loadGraphFileWithSnapshot(graphPath) {
@@ -125,7 +127,7 @@ function loadGraphFileWithSnapshot(graphPath) {
125
127
  if (snap) return snap;
126
128
  let json;
127
129
  try {
128
- json = fs2.readFileSync(graphPath, "utf8");
130
+ json = fs3.readFileSync(graphPath, "utf8");
129
131
  } catch {
130
132
  return null;
131
133
  }
@@ -290,11 +292,85 @@ ${embedded}
290
292
  function esc(s) {
291
293
  return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
292
294
  }
295
+ var MAX_PROVIDER_EXPANSIONS = 24;
296
+ function disabled() {
297
+ const v = process.env.VIBGRATE_NO_KERNEL;
298
+ return v === "1" || v === "true";
299
+ }
300
+ function relevanceModuleDir() {
301
+ const base = process.env.XDG_CACHE_HOME || path2.join(os.homedir(), ".cache");
302
+ return path2.join(base, "vibgrate", "modules", "relevance");
303
+ }
304
+ function defaultModulePath() {
305
+ return path2.join(relevanceModuleDir(), "index.js");
306
+ }
307
+ function candidatePaths() {
308
+ const custom = process.env.VIBGRATE_RELEVANCE_PATH;
309
+ if (custom) {
310
+ const p = path2.resolve(custom);
311
+ try {
312
+ if (fs3.statSync(p).isDirectory()) return [path2.join(p, "index.js")];
313
+ } catch {
314
+ }
315
+ return [p];
316
+ }
317
+ return [defaultModulePath()];
318
+ }
319
+ var cached;
320
+ function resetRelevanceProviderCache() {
321
+ cached = void 0;
322
+ }
323
+ async function loadRelevanceProvider() {
324
+ if (cached !== void 0) return cached;
325
+ cached = null;
326
+ if (disabled()) return cached;
327
+ for (const p of candidatePaths()) {
328
+ if (!fs3.existsSync(p)) continue;
329
+ try {
330
+ const mod = await import(pathToFileURL(p).href);
331
+ const provider = mod.createRelevanceProvider?.();
332
+ if (provider && typeof provider.version === "function" && typeof provider.analyzeQuery === "function") {
333
+ cached = provider;
334
+ return cached;
335
+ }
336
+ } catch {
337
+ }
338
+ }
339
+ return cached;
340
+ }
341
+ async function analyzeQuestion(question) {
342
+ const provider = await loadRelevanceProvider();
343
+ if (!provider) return null;
344
+ try {
345
+ return sanitizeAnalysis(provider.analyzeQuery(question));
346
+ } catch {
347
+ return null;
348
+ }
349
+ }
350
+ function sanitizeAnalysis(raw) {
351
+ if (!raw || typeof raw.version !== "string") return null;
352
+ const seen = /* @__PURE__ */ new Set();
353
+ const expansions = [];
354
+ for (const e of raw.expansions ?? []) {
355
+ const term = String(e?.term ?? "").toLowerCase().trim();
356
+ const from = String(e?.from ?? "").toLowerCase().trim();
357
+ const weight = Number(e?.weight);
358
+ if (!term || !from || term.includes(" ")) continue;
359
+ if (WEAK_TERMS.has(from) || WEAK_TERMS.has(term)) continue;
360
+ if (!Number.isFinite(weight) || weight <= 0) continue;
361
+ if (seen.has(term)) continue;
362
+ seen.add(term);
363
+ expansions.push({ term, from, weight: Math.min(1, weight) });
364
+ if (expansions.length >= MAX_PROVIDER_EXPANSIONS) break;
365
+ }
366
+ const topics = (raw.topics ?? []).filter((t) => t && typeof t.id === "string" && Number.isFinite(t.score)).map((t) => ({ id: t.id, score: Math.max(0, Math.min(1, t.score)) }));
367
+ return { version: raw.version, topics, expansions };
368
+ }
293
369
  function vibgrateDir(root) {
294
- return path.join(root, ".vibgrate");
370
+ return path2.join(root, ".vibgrate");
295
371
  }
296
372
  function legacyGraphPath(root) {
297
- return path.join(vibgrateDir(root), "graph.json");
373
+ return path2.join(vibgrateDir(root), "graph.json");
298
374
  }
299
375
  function preferInRepoGraph(env = process.env) {
300
376
  const v = env.VIBGRATE_GRAPH_IN_REPO?.trim().toLowerCase();
@@ -307,10 +383,10 @@ function defaultGraphPath(root, env = process.env) {
307
383
  return globalGraphPath(root, "current", env);
308
384
  }
309
385
  function resolveGraphPath(root, override, env = process.env) {
310
- if (override?.trim()) return path.resolve(override.trim());
386
+ if (override?.trim()) return path2.resolve(override.trim());
311
387
  if (preferInRepoGraph(env)) {
312
388
  const legacy2 = legacyGraphPath(root);
313
- if (fs2.existsSync(legacy2)) return legacy2;
389
+ if (fs3.existsSync(legacy2)) return legacy2;
314
390
  return legacy2;
315
391
  }
316
392
  const { ref, kind } = detectGitRef(root);
@@ -321,7 +397,7 @@ function resolveGraphPath(root, override, env = process.env) {
321
397
  const globalPath = globalGraphPath(root, "current", env);
322
398
  if (mapFileExists(globalPath)) return globalPath;
323
399
  const legacy = legacyGraphPath(root);
324
- if (fs2.existsSync(legacy)) return legacy;
400
+ if (fs3.existsSync(legacy)) return legacy;
325
401
  return defaultGraphPath(root, env);
326
402
  }
327
403
  var DEFAULT_GITIGNORE = [
@@ -333,6 +409,7 @@ var DEFAULT_GITIGNORE = [
333
409
  "cache/",
334
410
  "graph.json",
335
411
  "graph.snap",
412
+ "graph.tags.snap",
336
413
  "graph.html",
337
414
  "GRAPH_REPORT.md",
338
415
  "facts.jsonl",
@@ -346,73 +423,163 @@ var DEFAULT_GITIGNORE = [
346
423
  "run-outcomes.jsonl"
347
424
  ];
348
425
  function ensureVibgrateGitignore(root) {
349
- const file = path.join(vibgrateDir(root), ".gitignore");
350
- if (fs2.existsSync(file)) return;
351
- fs2.mkdirSync(vibgrateDir(root), { recursive: true });
352
- fs2.writeFileSync(file, `${DEFAULT_GITIGNORE.join("\n")}
426
+ const file = path2.join(vibgrateDir(root), ".gitignore");
427
+ if (fs3.existsSync(file)) return;
428
+ fs3.mkdirSync(vibgrateDir(root), { recursive: true });
429
+ fs3.writeFileSync(file, `${DEFAULT_GITIGNORE.join("\n")}
353
430
  `);
354
431
  }
355
432
  function companionArtifactDir(root, graphPath, env = process.env) {
356
- const resolved = path.resolve(graphPath);
357
- const legacy = path.resolve(legacyGraphPath(root));
433
+ const resolved = path2.resolve(graphPath);
434
+ const legacy = path2.resolve(legacyGraphPath(root));
358
435
  if (resolved === legacy) return vibgrateDir(root);
359
- const globalDefault = path.resolve(globalGraphPath(root, "current", env));
436
+ const globalDefault = path2.resolve(globalGraphPath(root, "current", env));
360
437
  if (resolved === globalDefault) return repositoryStoreDir(root, env);
361
- return path.dirname(resolved);
438
+ return path2.dirname(resolved);
362
439
  }
363
440
  function writeArtifacts(graph, options) {
364
441
  const graphPath = options.graphPath ?? defaultGraphPath(options.root);
365
442
  const companions = companionArtifactDir(options.root, graphPath);
366
443
  const inRepo = isPathInside(companions, options.root) || isPathInside(graphPath, options.root);
367
- fs2.mkdirSync(path.dirname(graphPath), { recursive: true });
368
- fs2.mkdirSync(companions, { recursive: true });
444
+ fs3.mkdirSync(path2.dirname(graphPath), { recursive: true });
445
+ fs3.mkdirSync(companions, { recursive: true });
369
446
  if (inRepo && isPathInside(companions, vibgrateDir(options.root))) {
370
447
  ensureVibgrateGitignore(options.root);
371
- } else if (path.resolve(graphPath) === path.resolve(legacyGraphPath(options.root))) {
448
+ } else if (path2.resolve(graphPath) === path2.resolve(legacyGraphPath(options.root))) {
372
449
  ensureVibgrateGitignore(options.root);
373
450
  }
374
451
  const storeMode = isPathInside(graphPath, repositoryStoreDir(options.root));
452
+ deleteTagsSidecarFor(graphPath);
375
453
  if (storeMode) {
376
454
  if (!writeGraphSnapshot(graphPath, graph, { standalone: true })) ; else {
377
- fs2.rmSync(graphPath, { force: true });
455
+ fs3.rmSync(graphPath, { force: true });
378
456
  }
379
457
  }
380
- if (!storeMode || !fs2.existsSync(snapshotPathFor(graphPath))) {
458
+ if (!storeMode || !fs3.existsSync(snapshotPathFor(graphPath))) {
381
459
  const tmp = `${graphPath}.${process.pid}.tmp`;
382
460
  try {
383
- fs2.writeFileSync(tmp, serializeGraph(graph));
384
- fs2.renameSync(tmp, graphPath);
461
+ fs3.writeFileSync(tmp, serializeGraph(graph));
462
+ fs3.renameSync(tmp, graphPath);
385
463
  } catch (err) {
386
- fs2.rmSync(tmp, { force: true });
464
+ fs3.rmSync(tmp, { force: true });
387
465
  throw err;
388
466
  }
389
467
  writeGraphSnapshot(graphPath, graph);
390
468
  }
391
469
  const written = {
392
- graphPath: storeMode && !fs2.existsSync(graphPath) ? snapshotPathFor(graphPath) : graphPath
470
+ graphPath: storeMode && !fs3.existsSync(graphPath) ? snapshotPathFor(graphPath) : graphPath
393
471
  };
394
472
  if (options.report !== false) {
395
- const reportPath = path.join(companions, "GRAPH_REPORT.md");
396
- fs2.writeFileSync(reportPath, renderReport(graph));
473
+ const reportPath = path2.join(companions, "GRAPH_REPORT.md");
474
+ fs3.writeFileSync(reportPath, renderReport(graph));
397
475
  written.reportPath = reportPath;
398
476
  }
399
477
  if (options.html !== false) {
400
- const htmlPath = path.join(companions, "graph.html");
401
- fs2.writeFileSync(htmlPath, renderHtml(graph));
478
+ const htmlPath = path2.join(companions, "graph.html");
479
+ fs3.writeFileSync(htmlPath, renderHtml(graph));
402
480
  written.htmlPath = htmlPath;
403
481
  }
404
482
  if (graph.facts && graph.facts.length) {
405
- const factsPath = path.join(companions, "facts.jsonl");
406
- fs2.writeFileSync(factsPath, graph.facts.map((f) => JSON.stringify(f)).join("\n") + "\n");
483
+ const factsPath = path2.join(companions, "facts.jsonl");
484
+ fs3.writeFileSync(factsPath, graph.facts.map((f) => JSON.stringify(f)).join("\n") + "\n");
407
485
  written.factsPath = factsPath;
408
486
  }
409
487
  return written;
410
488
  }
411
489
  function isPathInside(child, parent) {
412
- const rel = path.relative(path.resolve(parent), path.resolve(child));
413
- return rel === "" || !rel.startsWith("..") && !path.isAbsolute(rel);
490
+ const rel = path2.relative(path2.resolve(parent), path2.resolve(child));
491
+ return rel === "" || !rel.startsWith("..") && !path2.isAbsolute(rel);
492
+ }
493
+
494
+ // src/engine/relevance-enrich.ts
495
+ var MAGIC2 = Buffer.from("VGTAGS1\0", "latin1");
496
+ var crc324 = zlib.crc32 ?? (() => 0);
497
+ function newPackr2() {
498
+ return new Packr({ useRecords: true });
499
+ }
500
+ function tagsSidecarPathFor(graphPath) {
501
+ return graphPath.endsWith(".json") ? `${graphPath.slice(0, -5)}.tags.snap` : `${graphPath}.tags.snap`;
502
+ }
503
+ function deleteTagsSidecarFor(graphPath) {
504
+ try {
505
+ fs3.rmSync(tagsSidecarPathFor(graphPath), { force: true });
506
+ } catch {
507
+ }
508
+ }
509
+ function readSidecar(file, expect) {
510
+ try {
511
+ if (!fs3.existsSync(file)) return null;
512
+ const raw = fs3.readFileSync(file);
513
+ if (raw.length < MAGIC2.length + 4 || !raw.subarray(0, MAGIC2.length).equals(MAGIC2)) return null;
514
+ const headerLen = raw.readUInt32LE(MAGIC2.length);
515
+ const headerStart = MAGIC2.length + 4;
516
+ if (raw.length < headerStart + headerLen) return null;
517
+ const header = newPackr2().unpack(raw.subarray(headerStart, headerStart + headerLen));
518
+ if (header.engine !== VERSION) return null;
519
+ if (header.provider !== expect.provider) return null;
520
+ if (header.corpusHash !== expect.corpusHash) return null;
521
+ const payload = raw.subarray(headerStart + headerLen);
522
+ if (crc324(payload) >>> 0 !== header.crc32 >>> 0) return null;
523
+ const tags = newPackr2().unpack(payload);
524
+ return tags && typeof tags === "object" ? tags : null;
525
+ } catch {
526
+ return null;
527
+ }
528
+ }
529
+ function writeSidecar(file, meta, tags) {
530
+ try {
531
+ const sorted = Object.fromEntries(Object.entries(tags).sort(([a], [b]) => a < b ? -1 : 1));
532
+ const payload = newPackr2().pack(sorted);
533
+ const header = newPackr2().pack({
534
+ engine: VERSION,
535
+ provider: meta.provider,
536
+ corpusHash: meta.corpusHash,
537
+ crc32: crc324(payload) >>> 0
538
+ });
539
+ const lenBuf = Buffer.alloc(4);
540
+ lenBuf.writeUInt32LE(header.length);
541
+ fs3.mkdirSync(path2.dirname(file), { recursive: true });
542
+ const tmp = `${file}.${process.pid}.tmp`;
543
+ fs3.writeFileSync(tmp, Buffer.concat([MAGIC2, lenBuf, Buffer.from(header), Buffer.from(payload)]));
544
+ fs3.renameSync(tmp, file);
545
+ } catch {
546
+ }
547
+ }
548
+ async function loadTopicTags(graph, root, graphPath) {
549
+ const provider = await loadRelevanceProvider();
550
+ if (!provider?.tagNode) return null;
551
+ let providerVersion;
552
+ try {
553
+ providerVersion = provider.version();
554
+ } catch {
555
+ return null;
556
+ }
557
+ const corpusHash = graph.provenance?.corpusHash;
558
+ if (!corpusHash) return null;
559
+ const file = tagsSidecarPathFor(graphPath?.trim() ? path2.resolve(graphPath) : resolveGraphPath(root));
560
+ const cached2 = readSidecar(file, { provider: providerVersion, corpusHash });
561
+ if (cached2) {
562
+ const tags2 = /* @__PURE__ */ new Map();
563
+ for (const [id, t] of Object.entries(cached2)) if (t.length) tags2.set(id, t);
564
+ return tags2;
565
+ }
566
+ const record = {};
567
+ const tags = /* @__PURE__ */ new Map();
568
+ try {
569
+ for (const node of graph.nodes) {
570
+ if (node.kind === "file" || node.kind === "external") continue;
571
+ const computed = provider.tagNode({ qualifiedName: node.qualifiedName, file: node.file }) ?? [];
572
+ const clean = computed.filter((t) => typeof t === "string" && t.length > 0).map((t) => t.toLowerCase()).slice(0, 3);
573
+ record[node.id] = clean;
574
+ if (clean.length) tags.set(node.id, clean);
575
+ }
576
+ } catch {
577
+ return null;
578
+ }
579
+ writeSidecar(file, { provider: providerVersion, corpusHash }, record);
580
+ return tags;
414
581
  }
415
582
 
416
- export { defaultGraphPath, ensureVibgrateGitignore, legacyGraphPath, loadGraphFileWithSnapshot, mapFileExists, mapFileStat, preferInRepoGraph, renderHtml, renderReport, resolveGraphPath, vibgrateDir, writeArtifacts };
417
- //# sourceMappingURL=chunk-76TDXGGF.js.map
418
- //# sourceMappingURL=chunk-76TDXGGF.js.map
583
+ export { analyzeQuestion, defaultGraphPath, ensureVibgrateGitignore, legacyGraphPath, loadGraphFileWithSnapshot, loadRelevanceProvider, loadTopicTags, mapFileExists, mapFileStat, preferInRepoGraph, relevanceModuleDir, renderHtml, renderReport, resetRelevanceProviderCache, resolveGraphPath, vibgrateDir, writeArtifacts };
584
+ //# sourceMappingURL=chunk-N4IDP2M2.js.map
585
+ //# sourceMappingURL=chunk-N4IDP2M2.js.map