Thread ownerId and member aliases through the TS and native parsers. Persist aliases across full and incremental imports so exported ChatLab JSON retains user identity metadata.
Stream members and messages in one pass so nested member metadata is parsed structurally. Cover exports whose complete member list exceeds the filtered messages.
Remove persisted annual summary snapshots whenever a session is deleted through shared or desktop cleanup paths. Drop cached in-memory snapshots when their backing files disappear so stale responses cannot expose deleted session data.
Importing a skill from the cloud market failed with
'SyntaxError: No number after minus sign in JSON at position 1 (line 1 column 2)'
because the WebPlatformAdapter hard-coded res.json() for every response, while
the same IPC handler on Electron already routes by Content-Type / .json suffix
(see apps/desktop/main/ipc/window.ts: '支持 JSON 和纯文本/Markdown').
The Electron path handled skill bodies (.md) correctly; the Web path only
worked for the catalog (skill.json). Aligning the Web adapter with the same
Content-Type / .json-suffix rule fixes both fetchCloudCatalog and
importFromCloud at once, with no new abstraction.
An ambient npm_config_runtime=electron (common in Electron dev shells
and CI) makes bare prebuild-install "succeed" with an Electron-ABI
binding, bypassing the source-build fallbacks and leaving the CLI
unable to start. Pin -r node -t to the current system Node instead.
Co-authored-by: Cursor <cursoragent@cursor.com>
Prepending all of System32 to PATH made WSL bash.EXE shadow Git Bash,
breaking every later shell: bash step (first hit: dtolnay/rust-toolchain);
now only tar.exe is exposed. Passing --target after -- hid the triple
from napi, which then emitted a host-named darwin-arm64 artifact for the
x64 build; pass --target to napi directly instead.
Co-authored-by: Cursor <cursoragent@cursor.com>