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 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 (bundled, private, no external calls)
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("tracegistcom-") || fileName.startsWith("tracegist-")) &&
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-...-package.zip",
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,(.+)$/);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tracegist-mcp-bridge",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Local-first MCP bridge for reading and transcribing TraceGist package zips.",
5
5
  "type": "module",
6
6
  "bin": {