tracegist-mcp-bridge 1.0.0 → 1.1.0
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/CHANGELOG.md +35 -0
- package/README.md +1 -1
- package/bin/lib.mjs +10 -2
- package/bin/tracegist-mcp-bridge.mjs +22 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,41 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `tracegist-mcp-bridge`.
|
|
4
4
|
|
|
5
|
+
## 1.1.0
|
|
6
|
+
|
|
7
|
+
> ⚠️ **Update this bridge before updating the extension.** The extension release
|
|
8
|
+
> paired with this version writes package filenames **name-first**, so the
|
|
9
|
+
> `tracegistcom-` token is no longer at the start of the name. A 1.0.x bridge
|
|
10
|
+
> matches that token as a **prefix** and will therefore report
|
|
11
|
+
> `list_tracegist_packages` as empty for every newly exported session — with no
|
|
12
|
+
> error, just an empty list. Nothing is lost; the packages are on disk and become
|
|
13
|
+
> visible again as soon as the bridge is updated.
|
|
14
|
+
>
|
|
15
|
+
> No MCP tool signatures changed, and this bridge still reads packages written by
|
|
16
|
+
> every older extension, which is why this is a minor rather than a major bump.
|
|
17
|
+
|
|
18
|
+
- **Name-first package filenames.** `isTraceGistPackageFile` now accepts
|
|
19
|
+
`tracegistcom-` anywhere in the filename instead of requiring it as a prefix, a
|
|
20
|
+
strict superset of the previous rule. The extension leads the filename with the
|
|
21
|
+
session-name slug so it stays readable in Finder/Explorer, which truncate the
|
|
22
|
+
middle of long names:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
checkout-crash-2026-07-27-14-32-05-tracegistcom-<id>-session-coding-agent-package.zip
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Unnamed sessions lead with the timestamp
|
|
29
|
+
(`2026-07-27-14-32-05-tracegistcom-<id>-…`). Package filenames are still never
|
|
30
|
+
parsed positionally, so the variable-length leading segment is safe.
|
|
31
|
+
|
|
32
|
+
- **Surfaces withheld response images.** In a remote session the extension now
|
|
33
|
+
declines to transmit a question-response screenshot or highlight capture that
|
|
34
|
+
was not taken on the recorded tab (a tester can capture on an unrelated tab,
|
|
35
|
+
switch back, then answer). `question-response-received` and
|
|
36
|
+
`get_tester_response` report that as `withheldMedia` so an agent can tell a
|
|
37
|
+
privacy withhold apart from the tester simply not attaching anything, rather
|
|
38
|
+
than silently re-asking for a picture it will never receive.
|
|
39
|
+
|
|
5
40
|
## 1.0.0
|
|
6
41
|
|
|
7
42
|
> ⚠️ **Breaking Remote Live Session protocol change** (`FRAME_VERSION` → 3):
|
package/README.md
CHANGED
|
@@ -69,7 +69,7 @@ Each session ZIP may include:
|
|
|
69
69
|
Local Whisper is bundled — no Python, no system ffmpeg. The TraceGist extension
|
|
70
70
|
records voice notes as 16 kHz mono wav, which whisper.cpp accepts directly.
|
|
71
71
|
|
|
72
|
-
### Default — local Whisper (
|
|
72
|
+
### Default — local Whisper (private, no external calls after a one-time model download)
|
|
73
73
|
|
|
74
74
|
`tracegist-mcp-bridge` depends on
|
|
75
75
|
[`nodejs-whisper`](https://www.npmjs.com/package/nodejs-whisper), which compiles
|
package/bin/lib.mjs
CHANGED
|
@@ -5,8 +5,16 @@ const PACKAGE_SUFFIX = "-package.zip";
|
|
|
5
5
|
const HANDOFF_SUFFIXES = ["-coding-agent-handoff.md", "-cursor-handoff.md"];
|
|
6
6
|
|
|
7
7
|
export function isTraceGistPackageFile(fileName) {
|
|
8
|
+
// The `tracegistcom-` token can appear anywhere, not only at the start: as of
|
|
9
|
+
// the name-first filename format (extension >= the release paired with this
|
|
10
|
+
// bridge version), a session name leads the filename so it survives file-
|
|
11
|
+
// browser truncation, e.g. `checkout-crash-2026-…-tracegistcom-<id>-…`. This
|
|
12
|
+
// matcher is a strict superset of the old prefix rule, so a current bridge
|
|
13
|
+
// still finds packages produced by older extensions. An older bridge, whose
|
|
14
|
+
// rule required the name to START with `tracegistcom-`, will NOT see
|
|
15
|
+
// name-first packages — hence the paired version bump.
|
|
8
16
|
return (
|
|
9
|
-
(fileName.startsWith("
|
|
17
|
+
(fileName.startsWith("tracegist-") || fileName.includes("tracegistcom-")) &&
|
|
10
18
|
fileName.endsWith(PACKAGE_SUFFIX)
|
|
11
19
|
);
|
|
12
20
|
}
|
|
@@ -25,7 +33,7 @@ export function renderPackagesText(
|
|
|
25
33
|
if (packages.length === 0) {
|
|
26
34
|
return [
|
|
27
35
|
`No TraceGist package zips found in ${directory}.`,
|
|
28
|
-
"Expected naming pattern: tracegistcom
|
|
36
|
+
"Expected naming pattern: [<session-name>-]<date>-<time>-tracegistcom-<id>-...-package.zip",
|
|
29
37
|
].join("\n");
|
|
30
38
|
}
|
|
31
39
|
const countLabel =
|
|
@@ -1380,6 +1380,11 @@ function handleExtensionMessage(msg, source = "local") {
|
|
|
1380
1380
|
voiceBlobDataUrl: msg.voiceBlobDataUrl || null,
|
|
1381
1381
|
screenshot: msg.screenshot || null,
|
|
1382
1382
|
highlightCaptures: msg.highlightCaptures || [],
|
|
1383
|
+
// Present when the extension declined to transmit an image because it
|
|
1384
|
+
// was not captured on the recorded tab. Kept distinct from "the tester
|
|
1385
|
+
// attached nothing" so the agent does not read a privacy withhold as a
|
|
1386
|
+
// deliberate choice and re-ask for the same picture.
|
|
1387
|
+
withheldMedia: msg.withheldMedia || null,
|
|
1383
1388
|
});
|
|
1384
1389
|
const rIdx = pendingQuestions.findIndex((q) => q.questionId === msg.questionId);
|
|
1385
1390
|
if (rIdx >= 0) pendingQuestions.splice(rIdx, 1);
|
|
@@ -1389,6 +1394,7 @@ function handleExtensionMessage(msg, source = "local") {
|
|
|
1389
1394
|
hasVoice: !!msg.voiceBlobDataUrl,
|
|
1390
1395
|
hasScreenshot: !!msg.screenshot,
|
|
1391
1396
|
highlightCount: msg.highlightCaptures?.length || 0,
|
|
1397
|
+
withheldMedia: msg.withheldMedia || undefined,
|
|
1392
1398
|
hint: "Use get_tester_response to retrieve the full response with transcription and images.",
|
|
1393
1399
|
});
|
|
1394
1400
|
// Eagerly transcribe the voice response and log the interaction immediately
|
|
@@ -2232,12 +2238,28 @@ server.registerTool(
|
|
|
2232
2238
|
hasVoice: !!response.voiceBlobDataUrl,
|
|
2233
2239
|
hasScreenshot: !!response.screenshot,
|
|
2234
2240
|
highlightCount: response.highlightCaptures?.length || 0,
|
|
2241
|
+
...(response.withheldMedia ? { withheldMedia: response.withheldMedia } : {}),
|
|
2235
2242
|
};
|
|
2236
2243
|
content.push({
|
|
2237
2244
|
type: "text",
|
|
2238
2245
|
text: JSON.stringify(meta, null, 2),
|
|
2239
2246
|
});
|
|
2240
2247
|
|
|
2248
|
+
if (response.withheldMedia) {
|
|
2249
|
+
const parts = [];
|
|
2250
|
+
if (response.withheldMedia.screenshot) parts.push("a screenshot");
|
|
2251
|
+
if (response.withheldMedia.highlightCount > 0) {
|
|
2252
|
+
parts.push(`${response.withheldMedia.highlightCount} highlight capture(s)`);
|
|
2253
|
+
}
|
|
2254
|
+
content.push({
|
|
2255
|
+
type: "text",
|
|
2256
|
+
text:
|
|
2257
|
+
`Note: ${parts.join(" and ")} were withheld because they were ` +
|
|
2258
|
+
`${response.withheldMedia.reason}. The tester did attach them; they were not sent. ` +
|
|
2259
|
+
`Ask them to re-capture on the tab being recorded if you need the image.`,
|
|
2260
|
+
});
|
|
2261
|
+
}
|
|
2262
|
+
|
|
2241
2263
|
// Include screenshot as image
|
|
2242
2264
|
if (response.screenshot && response.screenshot.startsWith("data:image/")) {
|
|
2243
2265
|
const match = response.screenshot.match(/^data:([^;]+);base64,(.+)$/);
|