feat(parser): add Windsurf workspace chat support (#696) - #998
Conversation
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
1602c4c to
a403234
Compare
roborev: Combined Review (
|
a403234 to
090c8ab
Compare
roborev: Combined Review (
|
090c8ab to
da36a2e
Compare
roborev: Combined Review (
|
da36a2e to
0875538
Compare
roborev: Combined Review (
|
- Prevent resolver script truncation on Windows - Handle Windsurf deletion and numeric bubbles - Drop obsolete SSH command helper - Retry corrupted benchmark capture - Keep benchmark output parseable during setup - fix(parser): scope windsurf virtual sources (kenn-io#696)
0875538 to
439a9a4
Compare
roborev: Combined Review (
|
VALID (fixed): kenn-io#1 -- Windsurf same-size/same-mtime SQLite rewrites need to compare the provider file_hash before taking skip-cache or stored-freshness shortcuts. Windsurf now uses a component-labeled content digest for state.vscdb, WAL/SHM, and workspace.json so the fingerprint is stable across roots while still moving when parsed source content changes. The sync freshness allowlist now requires that hash for Windsurf, matching the composite fingerprint contract. The commit also includes the repository hook's automatic Qoder slices.Backward modernization; without staging that generated fix, the pre-commit hook re-applies it and aborts before the Windsurf fix can be committed.
roborev: Combined Review (
|
VALID (fixed): kenn-io#1 -- Windsurf remote-sync targets exposed workspaceStorage as a recursive archive root. Windsurf targets now separate import roots from archived files, so the HTTP archive endpoint streams only state.vscdb, sidecars, and workspace.json. Dir-only archive requests for file-scoped Windsurf targets are rejected instead of falling back to recursive tar.
roborev: Combined Review (
|
VALID (fixed): kenn-io#1 -- SSH remote sync still resolved Windsurf to workspaceStorage and recursively tarred unrelated workspace files. The SSH resolver now emits the Windsurf import root separately from agent-scoped file records, so transfer can include only state.vscdb, WAL/SHM sidecars, and workspace.json while import keeps the same root metadata. This aligns the default SSH transport with the HTTP remote-sync file-scoped behavior and prevents dir-only Windsurf roots from being archived recursively.
Windows CI runs the SSH resolver script through MSYS sh, which rewrites native temp paths from C:/... to /c/.... The test was asserting exact native drive-letter records even though the behavior under test is the resolver record type and the Windsurf path shape. Match record prefixes and path suffixes instead, preserving coverage that only the Windsurf root and allowed session files are emitted while making the assertion independent of the shell path dialect.
roborev: Combined Review (
|
VALID (fixed): kenn-io#1 -- SSH Windsurf remote sync expanded all file-scoped targets into one tar argv list. The SSH transfer now sends the tar script over stdin and feeds selected paths to tar with -T -, so large Windsurf exports do not consume ssh/exec argument space. Message-write benchmarks also silence slow-operation logs because those logs can interleave with benchmark rows and leave benchgate with too few parseable candidate samples.
Baseline benchmarks run from the merge base, so they can predate candidate fixes that keep benchmark output parseable. Treat baseline syntax errors like other partial baseline conditions: report them and gate the parseable data, while candidate syntax errors remain a hard configuration failure.
The SSH tar script is executed by a POSIX remote shell, but the unit test runs it locally. On Windows, MSYS sh receives native temp paths that do not represent remote POSIX paths, so keep the structural coverage there and run the end-to-end script execution only on Unix-like hosts.
roborev: Combined Review (
|
VALID (fixed): kenn-io#1 -- HTTP remote sync could stream raw Windsurf workspace SQLite state and sidecars to any bearer-token holder allowed to request remote archives. VALID (fixed): kenn-io#2 -- Windsurf freshness and remote target selection treated transient SQLite SHM files as durable session inputs. Windsurf HTTP archives now synthesize a filtered state.vscdb containing only the chat keys the parser consumes, while preserving workspace metadata for project naming. SHM is no longer watched, fingerprinted, or resolved, and SSH tar input skips paths that disappear after resolution so optional WAL sidecars do not abort transfer.
The Windsurf freshness regression test only needed an initial stored session, but it reached into writeBatch directly. Current main changed that private helper's return shape, so the PR merge ref failed to compile even though the branch alone still built. Seed the initial row through SyncAll and derive the old hash-scoped skip-cache key from stored session metadata instead. That keeps the test focused on Windsurf freshness behavior and avoids coupling it to writeBatch internals.
roborev: Combined Review (
|
VALID (fixed): kenn-io#1 -- SSH tar path-list mode could treat a dash-leading relative archive input as a tar option. Prefix streamed entries with ./ before they reach tar -T -, preserving root-relative behavior under -C / while keeping file-list parsing safe on GNU tar.
roborev: Combined Review (
|
VALID (fixed): kenn-io#1 -- SSH tar path-list mode could split newline-bearing resolved paths into multiple tar entries. Reject CR/LF/NUL target paths before generating the remote shell script. This keeps newline-delimited tar -T input from reinterpreting one existing path as multiple archive requests while preserving the portable tar invocation used for normal paths.
roborev: Combined Review (
|
Agentsview currently has no Windsurf parser, so Windsurf workspace chat history is invisible to sync and import. Windsurf stores workspace chat in
workspaceStorage/*/state.vscdb, and the payloads are close enough to the existing VS Code family that the right implementation is an adapter over the shared VS Code parser, not a separate parser stack.This adds Windsurf as a first-class parser provider. The provider discovers
workspaceStorage/*/state.vscdb, reads the known chat rows fromItemTable, translates the tab-container shape into VS Code session JSON when needed, and then reuses the existing VS Code chat parser while relabeling the normalized session and usage events aswindsurf. Each parseable session is exposed as astate.vscdb#sessionIDvirtual source so discovery, fingerprinting, watch updates, and restart-time lookup all stay scoped to one session instead of one shared database file.The rest of the change is the minimum consumer routing needed for a new DB-backed virtual source family: generic source-path resolution, per-session parse-diff scoping, sync-by-path lookup, session export, and narrow
workspaceStorageremote targeting. The SSH resolver change stays because the longer resolver script hit the Windows command-length limit in CI, and sending the script over stdin fixes that at the transport layer without changing parser ownership.This PR intentionally keeps Cascade trajectory protobufs, encrypted
.pbcache files, and other non-workspace Windsurf storage out of scope. Those are a separate format surface and can be handled later without blocking workspace chat support. The remaining proof gap is format ownership: validation here is based on synthetic SQLite fixtures and public non-owner references, not a captured real Windsurf session database, so the claim stays scoped to the handled workspace chat shapes rather than all Windsurf transcript variants.Closes #696