@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.
- package/dist/agent-HNV2VUCO.js +24 -0
- package/dist/{agent-4DAECASW.js.map → agent-HNV2VUCO.js.map} +1 -1
- package/dist/baseline-6WTULHM5.js +9 -0
- package/dist/{baseline-4BDH4F2W.js.map → baseline-6WTULHM5.js.map} +1 -1
- package/dist/{chunk-BNEHDLVZ.js → chunk-2TLQDF6C.js} +129 -20
- package/dist/chunk-2TLQDF6C.js.map +1 -0
- package/dist/{chunk-JLWI2JGA.js → chunk-4HFSUIIN.js} +117 -6
- package/dist/chunk-4HFSUIIN.js.map +1 -0
- package/dist/{chunk-IRCYOTRG.js → chunk-536J6HUR.js} +235 -13
- package/dist/chunk-536J6HUR.js.map +1 -0
- package/dist/{chunk-SDG242R4.js → chunk-5VH3Y4QC.js} +63 -361
- package/dist/chunk-5VH3Y4QC.js.map +1 -0
- package/dist/{chunk-E6H2F2XF.js → chunk-6I4TXAI6.js} +3 -3
- package/dist/{chunk-E6H2F2XF.js.map → chunk-6I4TXAI6.js.map} +1 -1
- package/dist/{chunk-FF5ZQ6KI.js → chunk-6JP7HGIF.js} +4 -4
- package/dist/{chunk-FF5ZQ6KI.js.map → chunk-6JP7HGIF.js.map} +1 -1
- package/dist/chunk-AJ2KE3NT.js +446 -0
- package/dist/chunk-AJ2KE3NT.js.map +1 -0
- package/dist/{chunk-V2QK3IUY.js → chunk-B2KLJPFY.js} +4 -4
- package/dist/{chunk-V2QK3IUY.js.map → chunk-B2KLJPFY.js.map} +1 -1
- package/dist/{chunk-B3OMGYZZ.js → chunk-BBFQZ7CA.js} +4 -4
- package/dist/{chunk-B3OMGYZZ.js.map → chunk-BBFQZ7CA.js.map} +1 -1
- package/dist/{chunk-I6RBAIS3.js → chunk-BWMMR5XA.js} +4 -4
- package/dist/{chunk-I6RBAIS3.js.map → chunk-BWMMR5XA.js.map} +1 -1
- package/dist/{chunk-WIDZ5IE7.js → chunk-CC6F75GI.js} +14 -7
- package/dist/chunk-CC6F75GI.js.map +1 -0
- package/dist/{chunk-G7W4MFPZ.js → chunk-CE45STY5.js} +4 -4
- package/dist/{chunk-G7W4MFPZ.js.map → chunk-CE45STY5.js.map} +1 -1
- package/dist/{chunk-T6DRYOMT.js → chunk-DIU3MXB3.js} +4 -4
- package/dist/{chunk-T6DRYOMT.js.map → chunk-DIU3MXB3.js.map} +1 -1
- package/dist/{chunk-KL65SSR7.js → chunk-FKFRASAB.js} +323 -152
- package/dist/chunk-FKFRASAB.js.map +1 -0
- package/dist/{chunk-A43I2AJ4.js → chunk-JUSXLCSE.js} +3 -3
- package/dist/{chunk-A43I2AJ4.js.map → chunk-JUSXLCSE.js.map} +1 -1
- package/dist/{chunk-7G5S5KZN.js → chunk-KUZLILN3.js} +16 -3
- package/dist/chunk-KUZLILN3.js.map +1 -0
- package/dist/{chunk-76TDXGGF.js → chunk-N4IDP2M2.js} +218 -51
- package/dist/chunk-N4IDP2M2.js.map +1 -0
- package/dist/{chunk-XRN7DQGR.js → chunk-NJFQCDGA.js} +3 -3
- package/dist/{chunk-XRN7DQGR.js.map → chunk-NJFQCDGA.js.map} +1 -1
- package/dist/{chunk-XEJJGDGX.js → chunk-O7MTBC52.js} +134 -9
- package/dist/chunk-O7MTBC52.js.map +1 -0
- package/dist/chunk-QT2PMGN3.js +6 -0
- package/dist/{chunk-TGDHOAXX.js.map → chunk-QT2PMGN3.js.map} +1 -1
- package/dist/{chunk-V3X3DBZL.js → chunk-S4NSF5AZ.js} +6 -6
- package/dist/{chunk-V3X3DBZL.js.map → chunk-S4NSF5AZ.js.map} +1 -1
- package/dist/{chunk-G25STLE7.js → chunk-SJFBXCII.js} +30 -3
- package/dist/chunk-SJFBXCII.js.map +1 -0
- package/dist/{chunk-7PVCHLR2.js → chunk-SNKTD23L.js} +109 -10
- package/dist/chunk-SNKTD23L.js.map +1 -0
- package/dist/{chunk-IPICO2RV.js → chunk-VIWZ4QT7.js} +14 -3
- package/dist/chunk-VIWZ4QT7.js.map +1 -0
- package/dist/{chunk-MPP4S4OE.js → chunk-Y7YKUZ3T.js} +8 -7
- package/dist/chunk-Y7YKUZ3T.js.map +1 -0
- package/dist/cli.js +730 -345
- package/dist/cli.js.map +1 -1
- package/dist/ensure-map-5YEI7R7V.js +29 -0
- package/dist/{ensure-map-SMWHKOUY.js.map → ensure-map-5YEI7R7V.js.map} +1 -1
- package/dist/{graph-backend-I4I72J4W.js → graph-backend-CPHLUKUC.js} +5 -5
- package/dist/{graph-backend-I4I72J4W.js.map → graph-backend-CPHLUKUC.js.map} +1 -1
- package/dist/index.d.ts +118 -7
- package/dist/index.js +17 -16
- package/dist/index.js.map +1 -1
- package/dist/{interactive-TMQR6TXM.js → interactive-TNRE4OEK.js} +45 -32
- package/dist/interactive-TNRE4OEK.js.map +1 -0
- package/dist/load-MWG6WZTK.js +10 -0
- package/dist/{load-E3OTM7BS.js.map → load-MWG6WZTK.js.map} +1 -1
- package/dist/model-manager-GJ2YSTSK.js +1 -1
- package/dist/{run-outcome-QWLNBASF.js → run-outcome-375HMSQG.js} +6 -6
- package/dist/{run-outcome-QWLNBASF.js.map → run-outcome-375HMSQG.js.map} +1 -1
- package/dist/runtime-session-3MPWXNRL.js +20 -0
- package/dist/{runtime-session-UQ7UVAPL.js.map → runtime-session-3MPWXNRL.js.map} +1 -1
- package/dist/session-2NGJLI5Y.js +15 -0
- package/dist/{session-MG6BJVAG.js.map → session-2NGJLI5Y.js.map} +1 -1
- package/dist/session-store-F7NX7SZN.js +4 -0
- package/dist/{session-store-SQECEXUU.js.map → session-store-F7NX7SZN.js.map} +1 -1
- package/dist/{stream-json-GM44SP7L.js → stream-json-AUMU3NLV.js} +48 -16
- package/dist/stream-json-AUMU3NLV.js.map +1 -0
- package/dist/{vg-mcp-bridge-3WFC7LGE.js → vg-mcp-bridge-D463EHQI.js} +13 -11
- package/dist/vg-mcp-bridge-D463EHQI.js.map +1 -0
- package/dist/{vgd-ZUSBEVUL.js → vgd-Z23PXSP4.js} +9 -9
- package/dist/{vgd-ZUSBEVUL.js.map → vgd-Z23PXSP4.js.map} +1 -1
- package/package.json +1 -1
- package/dist/agent-4DAECASW.js +0 -22
- package/dist/baseline-4BDH4F2W.js +0 -9
- package/dist/chunk-76TDXGGF.js.map +0 -1
- package/dist/chunk-7G5S5KZN.js.map +0 -1
- package/dist/chunk-7PVCHLR2.js.map +0 -1
- package/dist/chunk-BNEHDLVZ.js.map +0 -1
- package/dist/chunk-G25STLE7.js.map +0 -1
- package/dist/chunk-IPICO2RV.js.map +0 -1
- package/dist/chunk-IRCYOTRG.js.map +0 -1
- package/dist/chunk-JLWI2JGA.js.map +0 -1
- package/dist/chunk-KL65SSR7.js.map +0 -1
- package/dist/chunk-MPP4S4OE.js.map +0 -1
- package/dist/chunk-SDG242R4.js.map +0 -1
- package/dist/chunk-TGDHOAXX.js +0 -6
- package/dist/chunk-WIDZ5IE7.js.map +0 -1
- package/dist/chunk-XEJJGDGX.js.map +0 -1
- package/dist/chunk-ZKNB4YH4.js +0 -102
- package/dist/chunk-ZKNB4YH4.js.map +0 -1
- package/dist/ensure-map-SMWHKOUY.js +0 -28
- package/dist/interactive-TMQR6TXM.js.map +0 -1
- package/dist/load-E3OTM7BS.js +0 -10
- package/dist/runtime-session-UQ7UVAPL.js +0 -20
- package/dist/session-MG6BJVAG.js +0 -13
- package/dist/session-store-SQECEXUU.js +0 -4
- package/dist/stream-json-GM44SP7L.js.map +0 -1
- 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-
|
|
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-
|
|
136
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
99
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
2
|
-
import { parseGraph, stableStringify, serializeGraph } from './chunk-
|
|
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
|
|
5
|
+
import * as fs3 from 'fs';
|
|
6
6
|
import * as zlib from 'zlib';
|
|
7
7
|
import { Packr } from 'msgpackr';
|
|
8
|
-
import * as
|
|
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 =
|
|
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
|
-
|
|
60
|
-
|
|
61
|
+
fs3.writeFileSync(tmp, Buffer.concat([MAGIC, lenBuf, header, payload]));
|
|
62
|
+
fs3.renameSync(tmp, file);
|
|
61
63
|
} catch (err) {
|
|
62
|
-
|
|
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 (!
|
|
74
|
-
const raw =
|
|
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 =
|
|
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 (
|
|
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
|
|
102
|
+
return fs3.statSync(graphPath);
|
|
101
103
|
} catch (err) {
|
|
102
104
|
const snap = snapshotPathFor(graphPath);
|
|
103
|
-
if (
|
|
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 =
|
|
112
|
+
fd = fs3.openSync(file, "r");
|
|
111
113
|
const prefix = Buffer.alloc(4096);
|
|
112
|
-
const read =
|
|
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)
|
|
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 =
|
|
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, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
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
|
|
370
|
+
return path2.join(root, ".vibgrate");
|
|
295
371
|
}
|
|
296
372
|
function legacyGraphPath(root) {
|
|
297
|
-
return
|
|
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
|
|
386
|
+
if (override?.trim()) return path2.resolve(override.trim());
|
|
311
387
|
if (preferInRepoGraph(env)) {
|
|
312
388
|
const legacy2 = legacyGraphPath(root);
|
|
313
|
-
if (
|
|
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 (
|
|
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 =
|
|
350
|
-
if (
|
|
351
|
-
|
|
352
|
-
|
|
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 =
|
|
357
|
-
const legacy =
|
|
433
|
+
const resolved = path2.resolve(graphPath);
|
|
434
|
+
const legacy = path2.resolve(legacyGraphPath(root));
|
|
358
435
|
if (resolved === legacy) return vibgrateDir(root);
|
|
359
|
-
const globalDefault =
|
|
436
|
+
const globalDefault = path2.resolve(globalGraphPath(root, "current", env));
|
|
360
437
|
if (resolved === globalDefault) return repositoryStoreDir(root, env);
|
|
361
|
-
return
|
|
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
|
-
|
|
368
|
-
|
|
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 (
|
|
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
|
-
|
|
455
|
+
fs3.rmSync(graphPath, { force: true });
|
|
378
456
|
}
|
|
379
457
|
}
|
|
380
|
-
if (!storeMode || !
|
|
458
|
+
if (!storeMode || !fs3.existsSync(snapshotPathFor(graphPath))) {
|
|
381
459
|
const tmp = `${graphPath}.${process.pid}.tmp`;
|
|
382
460
|
try {
|
|
383
|
-
|
|
384
|
-
|
|
461
|
+
fs3.writeFileSync(tmp, serializeGraph(graph));
|
|
462
|
+
fs3.renameSync(tmp, graphPath);
|
|
385
463
|
} catch (err) {
|
|
386
|
-
|
|
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 && !
|
|
470
|
+
graphPath: storeMode && !fs3.existsSync(graphPath) ? snapshotPathFor(graphPath) : graphPath
|
|
393
471
|
};
|
|
394
472
|
if (options.report !== false) {
|
|
395
|
-
const reportPath =
|
|
396
|
-
|
|
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 =
|
|
401
|
-
|
|
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 =
|
|
406
|
-
|
|
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 =
|
|
413
|
-
return rel === "" || !rel.startsWith("..") && !
|
|
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-
|
|
418
|
-
//# sourceMappingURL=chunk-
|
|
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
|