You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+21-21Lines changed: 21 additions & 21 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,112 +5,112 @@ All notable changes to this project will be documented in this file.
5
5
The format is based on Keep a Changelog,
6
6
and this project adheres to Semantic Versioning.
7
7
8
-
## [1.0.20] - 2026-05-03
8
+
## [0.1.20] - 2026-05-03
9
9
### Fixed
10
10
- Recording now fetches the response body in `Network.loadingFinished` (restoring the reliable v0.1 flow) instead of `Network.responseReceived`, ensuring the body is fully available before capture. A fallback in `stopRecording` flushes any requests that received response metadata but never got `loadingFinished` (e.g. cached / 304 responses).
11
11
12
-
## [1.0.19] - 2026-05-03
12
+
## [0.1.19] - 2026-05-03
13
13
### Fixed
14
14
- Recording no longer drops duplicate API calls — each recorded entry now gets a unique timestamp-based key so repeated calls to the same endpoint are all preserved.
15
15
16
-
## [1.0.18] - 2026-05-03
16
+
## [0.1.18] - 2026-05-03
17
17
### Fixed
18
18
- Replay no longer logs `Uncaught (in promise) Error: Detached while handling command` when the debugger detaches mid-flight (tab navigated/closed, replay stopped, or service worker recycled). All `chrome.debugger.sendCommand` calls in `src/background/replayer.ts` are now routed through a `safeSendCommand` helper that swallows detach-related errors. After a latency wait, replay state is re-checked before sending the response so we don't try to fulfill on a detached debugger.
19
19
20
-
## [1.0.17] - 2026-05-03
20
+
## [0.1.17] - 2026-05-03
21
21
### Changed
22
22
- Captured Requests table now auto-sizes columns (▶ / Status / Method shrink to content; Path takes the remaining width with truncation + full-URL tooltip) so nothing overflows the popup.
23
23
- Removed the per-row match indicator (●) column. The match indicator was unreliable — some matched URLs were not flagged — so it's been disabled until the matcher is fixed; the matched-row green tint is also gone.
24
24
25
-
## [1.0.16] - 2026-05-03
25
+
## [0.1.16] - 2026-05-03
26
26
### Changed
27
27
- Captured Requests table column order is now **▶ | Status | Method | ● | Path**, so Status is right after the include toggle and Path expands to fill the remaining width.
28
28
- Replay hit count is now shown inside the Status badge as `200 (3)` instead of as a separate column, making the table more compact and clearer.
29
29
### Fixed
30
30
- Per-row match indicator (●) and hit count now update live during replay. The popup listens to `chrome.storage.session` changes for `replayStats`, so each captured replay hit immediately re-renders the row (previously the table only refreshed on `recordingUpdated`/`newApiCall` messages, which the replayer doesn't send).
31
31
32
-
## [1.0.15] - 2026-05-03
32
+
## [0.1.15] - 2026-05-03
33
33
### Changed
34
34
- Removed the Replay stats panel (Matched / Unmatched / Recent unmatched). The per-row green ● match indicator on the API requests list is now the single source of truth.
35
35
- Replay configuration (fallback matching, latency, latency range, URL mappings) is collapsed under a toggleable **Advanced settings**`<details>` block in the Replay tab to reduce vertical clutter.
36
36
- Captured Requests table is now fixed-layout: long URLs are truncated in the **Path** cell with the full URL shown on hover via a `title` tooltip.
37
37
-**Status** column is now a colored circular badge (green 2xx / blue 3xx / amber 4xx / red 5xx / gray for none); click the badge to edit the status. The numeric value is in the tooltip.
38
38
-**Hits** column is now a small colored pill badge with the hit count and a descriptive tooltip.
39
39
40
-
## [1.0.14] - 2026-05-03
40
+
## [0.1.14] - 2026-05-03
41
41
### Changed
42
42
- Replay status indicator moved above the Record/Replay tab buttons so the current state is visible regardless of the active tab.
43
43
- Per-request match indicator: each row in the API requests list now shows a green ● when it has been matched at least once during the current replay (gray when not yet matched, faded when not replaying). Matched rows are highlighted with a subtle green tint. Replaces the previous reliance on the global Matched/Unmatched stats which under-counted because of de-duplication by path.
44
44
45
-
## [1.0.13] - 2026-05-03
45
+
## [0.1.13] - 2026-05-03
46
46
### Changed
47
47
- Replay stats now only count requests within the recording's URL filter (e.g. `/api`). Out-of-scope analytics calls (e.g. `/ingest/*`) no longer pollute Matched/Unmatched counters.
48
48
- "Unmatched" stat is de-emphasized in the popup; "Recent unmatched" is hidden when there are no in-scope unmatched requests.
49
49
50
50
### Added
51
51
- When opening the popup while replay is in progress, the Replay tab is now focused automatically and the popup body is visually marked (blue tint + border) to indicate replay mode.
52
52
53
-
## [1.0.12] - 2026-05-03
53
+
## [0.1.12] - 2026-05-03
54
54
### Fixed
55
55
- Record tab now shows the full request list right after stopping recording. Two issues caused it to look "still filtered" while the replay/review tab showed everything: (1) the popup's `newApiCall` live-update listener referenced an undeclared `currentRecordingApis` set and threw on every captured request, so the record-tab list was never updated live; (2) `stopRecording` detached the debugger before the recorder's event queue had a chance to drain, so any `responseReceived` handlers still mid-flight were cancelled. Now the popup declares `currentRecordingApis` properly, and `stopRecording` awaits the recorder queue before detaching.
56
56
57
-
## [1.0.11] - 2026-05-03
57
+
## [0.1.11] - 2026-05-03
58
58
### Fixed
59
59
- Recording now persists requests from `Network.responseReceived` (matching the working v0.1 flow) instead of only from `Network.loadingFinished`. Chrome does not reliably fire `loadingFinished` for some responses (cached, 304 Not Modified, streamed), which previously caused most GETs to be silently dropped — only the POST would survive in the saved recording even though all requests appeared live during recording.
60
60
### Added
61
61
- Regression test in `tests/unit/recorder.test.ts` covering the case where `Network.loadingFinished` never fires after `responseReceived`.
62
62
63
-
## [1.0.10] - 2026-05-03
63
+
## [0.1.10] - 2026-05-03
64
64
### Fixed
65
65
- Replay now matches recorded requests by **HTTP method + pathname**, not pathname alone. Previously, when a recording contained both a GET and a POST on the same path (e.g. `/api/items`), only the entry that happened to come first in iteration order was returned for every incoming request — which on busy pages typically meant POSTs replied to GETs and vice‑versa. The fallback (length-based) matcher also now requires method to match.
66
66
### Added
67
67
- Regression tests in `tests/unit/replayer.test.ts`: an incoming GET selects the GET-recorded response (not the POST) for the same path, and a method mismatch falls through to `continueRequest`.
68
68
69
-
## [1.0.9] - 2026-05-03
69
+
## [0.1.9] - 2026-05-03
70
70
### Fixed
71
71
- Recording now reliably captures **all** requests on busy pages, not just the first/last. Concurrent network events (`requestWillBeSent` / `responseReceived` / `loadingFinished`) were racing on `chrome.storage.session` reads/writes, causing handlers to overwrite each other's `pendingRequests` and `recordedData` and silently drop most GET requests. The recorder now serializes all events through a per-process promise queue and re-reads the latest state immediately before each `patch`.
72
72
### Added
73
73
- Regression test `records all of many concurrent GET requests (no lost updates)` in `tests/unit/recorder.test.ts` that interleaves N parallel request lifecycles against an async store.
74
74
75
-
## [1.0.8] - 2026-05-03
75
+
## [0.1.8] - 2026-05-03
76
76
### Fixed
77
77
- Recording now reliably captures large POST requests (e.g. `/api/votes/voting-percentages`). Removed `Fetch.enable` interception from the recording flow; recording now uses pure `Network.*` debugger events (`requestWillBeSent` → `responseReceived` → `loadingFinished`) and `Network.getResponseBody`, matching the working pre-refactor v0.1 behavior. POST bodies that Chrome does not inline are fetched via `Network.getRequestPostData`.
78
78
### Changed
79
79
-`tests/unit/recorder.test.ts` updated to cover the new `Network.*` flow, including the large-POST regression scenario and UTF-8-safe base64 decoding.
80
80
81
-
## [1.0.7] - 2026-05-03
81
+
## [0.1.7] - 2026-05-03
82
82
### Fixed
83
83
- POST requests are now reliably recorded even when Chrome does not fire `Network.requestWillBeSent` before `Fetch.requestPaused` (or fires it with a non-matching id). The Fetch handler now synthesizes a request entry from `params.request` when no pending entry exists, applying the recording's URL filter.
84
84
85
85
### Added
86
86
- Unit tests for the recorder (`tests/unit/recorder.test.ts`) covering: POST recorded with no prior `Network.requestWillBeSent`, URL-filter exclusion of non-`/api` requests, and matching by `networkId` when the pending entry exists.
87
87
88
-
## [1.0.6] - 2026-05-03
88
+
## [0.1.6] - 2026-05-03
89
89
### Fixed
90
90
- POST requests (and other requests with large bodies) no longer silently disappear from recordings. The root cause was that Chrome does not reliably fire `Network.loadingFinished` when Fetch interception is active; requests are now persisted directly inside the `Fetch.requestPaused` handler as soon as the response body is available.
91
91
- Response status and headers are now captured from `Fetch.requestPaused` params as a fallback when `Network.responseReceived` has not yet fired.
92
92
- POST request bodies (`postData`) are now stored in the recording for future reference.
93
93
94
-
## [1.0.5] - 2026-05-03
94
+
## [0.1.5] - 2026-05-03
95
95
### Fixed
96
96
- Editing popup now correctly renders non-Latin1 characters (e.g. Hebrew, Arabic, Chinese) in response bodies that were recorded before v1.0.4 and stored as raw base64.
97
97
98
-
## [1.0.4] - 2026-05-03
98
+
## [0.1.4] - 2026-05-03
99
99
### Fixed
100
100
- Recording no longer silently drops response bodies for POST requests where Chrome assigns a different `networkId` vs `requestId` in the Fetch/Network debugger events (fallback key resolution added).
101
101
- Base64-encoded response bodies containing UTF-8 characters are now correctly decoded during recording (replaced bare `atob` with `decodeURIComponent(escape(atob(...)))`).
102
102
103
-
## [1.0.3] - 2026-05-03
103
+
## [0.1.3] - 2026-05-03
104
104
### Fixed
105
105
- Unicode characters in recorded response bodies no longer cause `btoa` errors during replay (replaced bare `btoa` with a UTF-8-safe base64 encoder).
106
106
107
-
## [1.0.2] - 2026-05-03
107
+
## [0.1.2] - 2026-05-03
108
108
### Added
109
109
- URL path prefix mapping for cross-environment replay: record on staging (e.g. `/microservice1/api/users`), replay locally (e.g. `/api/users`) using the new **URL Mappings** field in the Replay tab.
110
110
- Mappings are persisted with each recording's replay options and restored on selection.
111
111
- README workflow documentation for the central-record / local-replay use case.
112
112
113
-
## [1.0.1] - 2026-04-26
113
+
## [0.1.1] - 2026-04-26
114
114
115
115
### Added
116
116
- In-progress recorded URLs preview in the `Record` tab for live visibility while capturing traffic.
@@ -121,7 +121,7 @@ and this project adheres to Semantic Versioning.
121
121
### Fixed
122
122
- Popup replay/preview interaction stability improvements to keep request inspection and control flows consistent.
123
123
124
-
## [1.0.0] - 2026-04-26
124
+
## [0.1.0] - 2026-04-26
125
125
126
126
### Added
127
127
- Vite + CRX + TypeScript production toolchain with lint, typecheck, build and packaging scripts.
Copy file name to clipboardExpand all lines: docs/recording-debug-history.md
+11-11Lines changed: 11 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,36 +7,36 @@ Some API calls are not being recorded. The user reports that certain URLs (e.g.
7
7
8
8
## What Was Tried (Chronological)
9
9
10
-
### v1.0.3 — Fix `btoa` crash during replay (Unicode)
10
+
### v0.1.3 — Fix `btoa` crash during replay (Unicode)
11
11
-**Problem:** Replay crashed with `InvalidCharacterError: btoa` for responses containing Hebrew/Unicode.
12
12
-**Fix:** Replaced bare `btoa()` with `btoa(unescape(encodeURIComponent(str)))` in `replayer.ts`.
13
13
-**Result:** ✅ Replay Unicode crash fixed.
14
14
15
15
---
16
16
17
-
### v1.0.4 — Fix POST recording via `networkId`/`requestId` fallback
17
+
### v0.1.4 — Fix POST recording via `networkId`/`requestId` fallback
18
18
-**Problem:** POST requests (e.g. `voting-percentages`) were not being recorded.
19
19
-**Root cause hypothesis:** Chrome assigns different `networkId` vs `requestId` for some requests; the `Fetch.requestPaused` handler looked up `pendingRequests[networkId]` and found nothing.
20
20
-**Fix:** Added fallback: if `networkId` lookup fails, try `requestId`.
21
21
-**Result:** ❌ Still not working reliably.
22
22
23
23
---
24
24
25
-
### v1.0.6 — Move persistence into `Fetch.requestPaused`
25
+
### v0.1.6 — Move persistence into `Fetch.requestPaused`
26
26
-**Problem:**`Network.loadingFinished` is not reliably fired by Chrome when `Fetch.enable` interception is active.
27
27
-**Fix:** Moved `getResponseBody` + persist logic into `Fetch.requestPaused` handler directly.
28
28
-**Result:** ❌ Still not working for all requests.
29
29
30
30
---
31
31
32
-
### v1.0.7 — Synthesize request entry in `Fetch.requestPaused`
32
+
### v0.1.7 — Synthesize request entry in `Fetch.requestPaused`
33
33
-**Problem:** When `Network.requestWillBeSent` didn't fire before `Fetch.requestPaused`, no `pendingRequests` entry existed and the request was silently dropped.
34
34
-**Fix:**`Fetch.requestPaused` now synthesizes a request entry from `params.request` when no pending entry is found.
35
35
-**Result:** ❌ Still not working.
36
36
37
37
---
38
38
39
-
### v1.0.8 — Revert to pure `Network.*` flow (drop `Fetch.enable`)
39
+
### v0.1.8 — Revert to pure `Network.*` flow (drop `Fetch.enable`)
40
40
-**Problem:** The entire `Fetch.enable` approach was unreliable for large bodies.
41
41
-**Fix:** Removed `Fetch.enable` entirely. Recorder reverted to the pre-refactor v0.1 flow:
42
42
-`Network.requestWillBeSent` → store pending request
@@ -47,43 +47,43 @@ Some API calls are not being recorded. The user reports that certain URLs (e.g.
-**Problem:** On busy pages, concurrent `Network.*` events raced on `chrome.storage.session` reads/writes, causing handlers to overwrite each other's `pendingRequests`/`recordedData`.
52
52
-**Fix:** All `onRecorderEvent` calls serialized through a per-process promise queue; state re-read immediately before each patch.
53
53
-**Result:** ✅ Concurrency fixed, but some requests still missing.
54
54
55
55
---
56
56
57
-
### v1.0.10 — Match replay by method + pathname
57
+
### v0.1.10 — Match replay by method + pathname
58
58
-**Problem:** Replay matched only by pathname, so GET and POST on the same path collided.
59
59
-**Fix:** Matcher now requires HTTP method to match in addition to pathname.
60
60
-**Result:** ✅ Replay matching improved.
61
61
62
62
---
63
63
64
-
### v1.0.11 — Persist in `responseReceived`, not `loadingFinished`
64
+
### v0.1.11 — Persist in `responseReceived`, not `loadingFinished`
65
65
-**Problem:** After stopping recording, only POST requests appeared in the saved list even though all requests were visible live.
66
66
-**Root cause:**`Network.loadingFinished` is not reliably fired for cached/304/streamed responses.
67
67
-**Fix:** Moved `getResponseBody` + persist into `Network.responseReceived`.
68
68
-**Result:** ✅ More requests saved, but still not all.
-**Problem:** Record tab showed truncated list after stopping; live updates never worked.
74
74
-**Fix:** (1) Declared missing `currentRecordingApis = new Set<string>()` in popup. (2) `stopRecording` now awaits the recorder event queue before detaching debugger.
75
75
-**Result:** ✅ UI fixed.
76
76
77
77
---
78
78
79
-
### v1.0.18 — Swallow debugger detach errors
79
+
### v0.1.18 — Swallow debugger detach errors
80
80
-**Problem:**`Uncaught Error: Detached while handling command` during replay.
81
81
-**Fix:** All `chrome.debugger.sendCommand` calls routed through `safeSendCommand` helper that swallows detach errors.
82
82
-**Result:** ✅ Replay error fixed.
83
83
84
84
---
85
85
86
-
### v1.0.19 (current, not released) — Unique timestamp-based keys
86
+
### v0.1.19 (current, not released) — Unique timestamp-based keys
87
87
-**Problem:** When the same endpoint was called multiple times, only the last response was kept (key collision).
88
88
-**Fix:**`requestKey` now appends a timestamp: `GET /api/config [200] 2026-05-03T...`
0 commit comments