diff --git a/package-lock.json b/package-lock.json index c6ae9a6b..c9753c72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "opencovibe", - "version": "0.5.8", + "version": "0.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "opencovibe", - "version": "0.5.8", + "version": "0.6.0", "license": "Apache-2.0", "dependencies": { "@codemirror/lang-cpp": "^6.0.3", @@ -50,6 +50,7 @@ "@tailwindcss/typography": "^0.5.19", "@tauri-apps/cli": "^2.5.0", "@types/diff": "^7.0.2", + "@types/node": "22.17.0", "@types/turndown": "^5.0.6", "autoprefixer": "^10.4.20", "eslint": "^9.39.2", @@ -2294,6 +2295,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "22.17.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.0.tgz", + "integrity": "sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -6320,6 +6331,13 @@ "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", "license": "MIT" }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/unzipper": { "version": "0.10.14", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", diff --git a/package.json b/package.json index bf85c1e2..39ee84b4 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@tailwindcss/typography": "^0.5.19", "@tauri-apps/cli": "^2.5.0", "@types/diff": "^7.0.2", + "@types/node": "22.17.0", "@types/turndown": "^5.0.6", "autoprefixer": "^10.4.20", "eslint": "^9.39.2", @@ -70,7 +71,6 @@ "vitest": "^4.0.18" }, "dependencies": { - "@recallai/desktop-sdk": "2.0.26", "@codemirror/lang-cpp": "^6.0.3", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-go": "^6.0.1", @@ -87,6 +87,7 @@ "@codemirror/language-data": "^6.5.2", "@codemirror/legacy-modes": "^6.5.2", "@codemirror/theme-one-dark": "^6.1.3", + "@recallai/desktop-sdk": "2.0.26", "@tauri-apps/api": "^2.5.0", "@tauri-apps/plugin-dialog": "^2.2.0", "@tauri-apps/plugin-notification": "^2.3.3", diff --git a/src/lib/scratchpad-block.test.ts b/src/lib/scratchpad-block.test.ts index d44d60c7..fcdd108a 100644 --- a/src/lib/scratchpad-block.test.ts +++ b/src/lib/scratchpad-block.test.ts @@ -4,6 +4,7 @@ import { parseScratchpadPayload, repairScratchpadPayload, stripScratchpadBlocks, + stripStreamingBlocks, } from "./scratchpad-block"; const block = (payload: string) => "```brains-scratchpad\n" + payload + "\n```"; @@ -107,3 +108,34 @@ describe("stripScratchpadBlocks", () => { expect(stripScratchpadBlocks(text)).toBe("Before\n\nAfter"); }); }); + +describe("stripStreamingBlocks", () => { + it("hides a block that is still being written", () => { + const partial = 'Here you go.\n```brains-scratchpad\n{"title":"T","html":"
rea'; + expect(stripStreamingBlocks(partial)).toBe("Here you go."); + }); + + it("hides raw markup when the turn was rejoined mid-block", () => { + // Switching tabs mid-turn used to resume the stream with no opening fence, + // so document markup rendered as the agent's own message: + // ched tabs and came back