Skip to content

Commit 8a5b103

Browse files
authored
Merge pull request #23 from Litenova-Solutions/release/v3.2.0
Merge release/v3.2.0 into main: 3.2.0 release + v3.3 roadmap
2 parents b986e92 + fb627cb commit 8a5b103

33 files changed

Lines changed: 3251 additions & 397 deletions

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Build first, then test with `--no-build`. CI verifies build, test, format, and a
3232
- A small local embedding model backs the dense retrieval channel (on by default); it is fetched once and cached on the first index, and all query-time work is offline. When the model is absent the path falls back to the deterministic lexical (BM25F) floor, so retrieval never requires a model at query time.
3333
- The syntax-tier indexer is provider-driven: a `ILanguageSyntaxProvider` (in `Fuse.Semantics`) claims file extensions and extracts symbols and chunks with no compiler, and `SemanticIndexer` selects providers by extension rather than hardwiring one language. C# is the `CSharpSyntaxProvider` (the existing Roslyn-syntax extractor behind the seam, unchanged); a second language registers a provider without changing the shared indexer. Each indexed file carries a `language` tag (the `files.language` column, schema version 14) set from the selecting provider, so retrieval can filter or blend by language over the language-agnostic tables; symbols and nodes inherit their language through their `file_id`. The semantic (typed-graph) tier remains C#/Roslyn-only for now (the semantic-tier provider seam and per-language wiring analyzers are not yet built).
3434
- Persistent cache and index data live in a single SQLite file at `.fuse/fuse.db` (WAL mode).
35+
- The VS Code host (`fuse host`) reads the same persistent semantic index (`WorkspaceIndexStore`, `SemanticRetrievalEngine`) as the MCP server; it does not run a separate analysis engine, so the editor and the agent report identical data.
3536
- JSON uses source-generated `JsonSerializerContext` only (no reflection serialization).
3637

3738
## Change-safety invariants

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,25 @@
22

33
All notable changes to Fuse are documented here. The format is based on Keep a Changelog. Fuse 3.0 is a product overhaul; backward compatibility with 2.x output, commands, and the MCP tool surface is not a goal.
44

5+
## [3.2.0] - 2026-07-02
6+
7+
### Changed
8+
9+
- **The VS Code host runs on the V3 semantic index, not the legacy fusion engine.** The `fuse host` RPC surface (`fuse/index`, `fuse/graph`, `fuse/scope`, `fuse/explain`, `fuse/diagnostics`) is rewritten to read the same `WorkspaceIndexStore` and `SemanticRetrievalEngine` the MCP tools use, so the editor and the agent see identical analysis. The legacy `FusionOrchestrator`, `DependencyGraphBuilder`, and explain service are gone from the host. The wire protocol is bumped to version 3 (`FuseHostService.ProtocolVersion` and the extension's `PROTOCOL_VERSION`); an older extension and a newer host surface the mismatch at handshake.
10+
- **The index panel shows the full semantic picture.** `fuse/index` now returns the index tier (semantic, partial, or syntax), symbol and route counts, a per-language file breakdown, full-text-search availability, the schema version, and the Fuse build that wrote the index. The extension's Index panel renders all of it.
11+
12+
### Added
13+
14+
- **Host index summary queries.** New store queries back the panel and the graph without per-file round-trips: route count, per-language counts, file-level dependency edges, and a bulk file token-estimate map.
15+
16+
## [3.1.2] - 2026-07-02
17+
18+
### Added
19+
20+
- **Update awareness for the CLI and MCP server.** A cache-first, throttled (once a day), offline-safe check tells you when a newer Fuse is on NuGet. `fuse mcp serve` prints the notice to stderr and `fuse index` to the console; both read a local cache instantly and refresh it in the background, so nothing waits on the network. Disable with `FUSE_UPDATE_CHECK=0`.
21+
- **Opt-in auto-update between sessions.** Set `FUSE_AUTO_UPDATE=1` and the MCP server, on finding a newer version, launches the detached updater to apply after the session exits, so the next spawn is current. It never stops sibling sessions and never updates mid-session.
22+
- **Scheduled updates** are documented as a one-line Task Scheduler (Windows) or cron (POSIX) entry that runs `fuse update` on a cadence, for fully hands-off upgrades.
23+
524
## [3.1.1] - 2026-07-01
625

726
### Added

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<!-- Single source of truth for the product version, applied to every Fuse assembly so the CLI, the host,
55
and FuseBuildInfo (the index version stamp) all report the same number. The release tag must match this
66
(enforced by build/verify-version.ps1); bump every package in lockstep with build/set-version.ps1. -->
7-
<Version>3.1.1</Version>
7+
<Version>3.2.0</Version>
88
<TargetFramework>net10.0</TargetFramework>
99
<ImplicitUsings>enable</ImplicitUsings>
1010
<Nullable>enable</Nullable>

ext/vscode/media/fuse.svg

Lines changed: 10 additions & 2 deletions
Loading

ext/vscode/media/icon.png

2.1 KB
Loading

ext/vscode/media/icon.svg

Lines changed: 12 additions & 0 deletions
Loading

ext/vscode/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/vscode/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
"name": "fuse-vscode",
33
"displayName": "Fuse",
44
"description": "Warm Fuse engine in VS Code: index status, token hotspots, dependency graph, scoping, and secret diagnostics. The human-facing twin of the Fuse MCP server.",
5-
"version": "3.1.1",
5+
"version": "3.2.0",
66
"publisher": "litenova",
77
"license": "MIT",
8+
"icon": "media/icon.png",
89
"engines": {
910
"vscode": "^1.90.0"
1011
},

ext/vscode/src/extension.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,17 @@ async function warmAndProject(
170170
const stats = await client.stats();
171171
const rss = `${Math.round(stats.workingSetBytes / (1024 * 1024))} MB`;
172172
statusBar.setState(`warm (${index.fileCount})`, `Fuse host ${stats.hostVersion}, RSS ${rss}`);
173+
const languages = index.languages.map((l) => `${l.language} ${l.count}`).join(", ");
173174
indexStatus.update([
175+
new StatusRow("Fuse version", index.fuseVersion),
174176
new StatusRow("State", index.indexState),
177+
new StatusRow("Tier", index.mode),
175178
new StatusRow("Files", String(index.fileCount)),
179+
new StatusRow("Symbols", String(index.symbolCount)),
180+
new StatusRow("Routes", String(index.routeCount)),
181+
new StatusRow("Languages", languages.length > 0 ? languages : "none"),
182+
new StatusRow("Full-text search", index.fullTextSearch ? "available" : "unavailable"),
183+
new StatusRow("Schema", `v${index.schemaVersion}`),
176184
new StatusRow("Index time", `${index.elapsedMs} ms`),
177185
new StatusRow("Host RSS", rss),
178186
]);

ext/vscode/src/host/protocol.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// parses the same fixtures, so any drift on either side fails a test. Keep this file in lockstep with the DTOs.
55

66
/** Wire protocol version; must equal FuseHostService.ProtocolVersion on the host. */
7-
export const PROTOCOL_VERSION = 2;
7+
export const PROTOCOL_VERSION = 3;
88

99
/** Result of `fuse/handshake`: host package version, the wire protocol version to match, and the session token for later RPC calls. */
1010
export interface FuseHostHandshake {
@@ -45,11 +45,25 @@ export interface GraphDto {
4545
detail: "Files" | "Directories";
4646
}
4747

48-
/** Result of `fuse/index`: the warm-index state after collecting and building the graph. */
48+
/** The indexed file count for one language, for the index panel. */
49+
export interface LanguageCountDto {
50+
language: string;
51+
count: number;
52+
}
53+
54+
/** Result of `fuse/index`: the semantic index summary the panel shows after building or refreshing the index. */
4955
export interface IndexResultDto {
5056
indexState: "Warm" | "Indexing" | "NotIndexed";
5157
fileCount: number;
5258
elapsedMs: number;
59+
/** The index tier: `semantic` (full typed graph), `partial`, or `syntax`. */
60+
mode: string;
61+
symbolCount: number;
62+
routeCount: number;
63+
schemaVersion: number;
64+
fullTextSearch: boolean;
65+
fuseVersion: string;
66+
languages: LanguageCountDto[];
5367
}
5468

5569
/** One emitted file in a scope result: the included path and its token cost. */

0 commit comments

Comments
 (0)