repoburg 1.3.254 → 1.3.256

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.
Files changed (78) hide show
  1. package/agent-pane/frontend/dist/assets/{index-hYkepxdY.js → index-BzDC6DcX.js} +86 -86
  2. package/agent-pane/frontend/dist/index.html +1 -1
  3. package/daemon/dist/index.js +61 -3
  4. package/daemon/dist/staticServing.js +2 -2
  5. package/daemon/dist/tabtape/api/follow.js +174 -0
  6. package/daemon/dist/tabtape/api/http.js +221 -0
  7. package/daemon/dist/tabtape/api/record.js +149 -0
  8. package/daemon/dist/tabtape/api/router.js +519 -0
  9. package/daemon/dist/tabtape/api/router.spec.js +604 -0
  10. package/daemon/dist/tabtape/api/static.js +70 -0
  11. package/daemon/dist/tabtape/api/ws.js +166 -0
  12. package/daemon/dist/tabtape/buffer/buffer.js +347 -0
  13. package/daemon/dist/tabtape/buffer/buffer.spec.js +137 -0
  14. package/daemon/dist/tabtape/config.js +108 -0
  15. package/daemon/dist/tabtape/e2e-server.js +96 -0
  16. package/daemon/dist/tabtape/errors.js +77 -0
  17. package/daemon/dist/tabtape/export/export.js +331 -0
  18. package/daemon/dist/tabtape/export/export.spec.js +262 -0
  19. package/daemon/dist/tabtape/har/gostd.js +395 -0
  20. package/daemon/dist/tabtape/har/gostd.spec.js +139 -0
  21. package/daemon/dist/tabtape/har/har.js +582 -0
  22. package/daemon/dist/tabtape/har/har.spec.js +325 -0
  23. package/daemon/dist/tabtape/index.js +134 -0
  24. package/daemon/dist/tabtape/index.spec.js +104 -0
  25. package/daemon/dist/tabtape/lock.js +67 -0
  26. package/daemon/dist/tabtape/log.js +32 -0
  27. package/daemon/dist/tabtape/mcp/definitions.js +362 -0
  28. package/daemon/dist/tabtape/mcp/gofmt.js +227 -0
  29. package/daemon/dist/tabtape/mcp/params.js +345 -0
  30. package/daemon/dist/tabtape/mcp/params.spec.js +172 -0
  31. package/daemon/dist/tabtape/mcp/recordLink.js +122 -0
  32. package/daemon/dist/tabtape/mcp/server.js +411 -0
  33. package/daemon/dist/tabtape/mcp/server.spec.js +722 -0
  34. package/daemon/dist/tabtape/mcp/tools.js +1085 -0
  35. package/daemon/dist/tabtape/query/format.js +195 -0
  36. package/daemon/dist/tabtape/query/network.js +133 -0
  37. package/daemon/dist/tabtape/query/perf.js +93 -0
  38. package/daemon/dist/tabtape/query/query.spec.js +233 -0
  39. package/daemon/dist/tabtape/query/reader.js +602 -0
  40. package/daemon/dist/tabtape/query/types.js +274 -0
  41. package/daemon/dist/tabtape/redact.js +37 -0
  42. package/daemon/dist/tabtape/repro/lang.js +95 -0
  43. package/daemon/dist/tabtape/repro/repro.js +422 -0
  44. package/daemon/dist/tabtape/repro/repro.spec.js +210 -0
  45. package/daemon/dist/tabtape/sink.js +24 -0
  46. package/daemon/dist/tabtape/store/record.js +99 -0
  47. package/daemon/dist/tabtape/store/segment.js +267 -0
  48. package/daemon/dist/tabtape/store/store.js +846 -0
  49. package/daemon/dist/tabtape/store/store.spec.js +485 -0
  50. package/daemon/dist/tabtape/testing/querytest.js +119 -0
  51. package/daemon/dist/tabtape/testing/tmp.js +33 -0
  52. package/package.json +3 -2
  53. package/tabtape/extension/dist/background.js +8 -0
  54. package/tabtape/extension/dist/background.js.map +7 -0
  55. package/tabtape/extension/dist/bridge.js +3 -0
  56. package/tabtape/extension/dist/bridge.js.map +7 -0
  57. package/tabtape/extension/dist/icons/128.png +0 -0
  58. package/tabtape/extension/dist/icons/16.png +0 -0
  59. package/tabtape/extension/dist/icons/32.png +0 -0
  60. package/tabtape/extension/dist/icons/48.png +0 -0
  61. package/tabtape/extension/dist/manifest.json +28 -0
  62. package/tabtape/extension/dist/popup.css +62 -0
  63. package/tabtape/extension/dist/popup.html +34 -0
  64. package/tabtape/extension/dist/popup.js +4 -0
  65. package/tabtape/extension/dist/popup.js.map +7 -0
  66. package/tabtape/extension/dist/recorder.js +133 -0
  67. package/tabtape/extension/dist/recorder.js.map +1 -0
  68. package/tabtape/extension/dist/state.js +2 -0
  69. package/tabtape/extension/dist/state.js.map +1 -0
  70. package/tabtape/playwright/mcp.mjs +58 -0
  71. package/tabtape/playwright/tabtape.d.mts +37 -0
  72. package/tabtape/playwright/tabtape.mjs +146 -0
  73. package/tabtape/ui/dist/app/assets/index-Canv3Ljk.css +1 -0
  74. package/tabtape/ui/dist/app/assets/index-iWNSSrAE.js +145 -0
  75. package/tabtape/ui/dist/app/index.html +14 -0
  76. package/tabtape/ui/dist/export/viewer.css +2 -0
  77. package/tabtape/ui/dist/export/viewer.js +143 -0
  78. package/visual-editor-proxy/dist/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ /**
3
+ * TypeScript mirrors of the record payloads in tabtape/shared/events.ts, with
4
+ * decoders that keep only fields of the expected type. Fields that the
5
+ * server does not use are left out. Value fields default to their zero value
6
+ * (like Go structs); fields whose absence matters are optional.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.isAsset = exports.isWebSocket = void 0;
10
+ exports.isObj = isObj;
11
+ exports.decodeTiming = decodeTiming;
12
+ exports.decodeNetwork = decodeNetwork;
13
+ exports.decodeWS = decodeWS;
14
+ exports.decodeState = decodeState;
15
+ exports.decodeConsole = decodeConsole;
16
+ exports.decodeTarget = decodeTarget;
17
+ exports.decodeEvent = decodeEvent;
18
+ exports.decodePerf = decodePerf;
19
+ exports.failed = failed;
20
+ exports.sizeOf = sizeOf;
21
+ exports.recorded = recorded;
22
+ function isObj(v) {
23
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
24
+ }
25
+ const asObj = (v) => (isObj(v) ? v : {});
26
+ const str = (v) => (typeof v === 'string' ? v : '');
27
+ const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : 0);
28
+ const int = (v) => Math.trunc(num(v));
29
+ const bool = (v) => v === true;
30
+ const optNum = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : undefined);
31
+ const optStr = (v) => (typeof v === 'string' ? v : undefined);
32
+ function strMap(v) {
33
+ if (!isObj(v))
34
+ return undefined;
35
+ const out = {};
36
+ for (const [k, x] of Object.entries(v))
37
+ if (typeof x === 'string')
38
+ out[k] = x;
39
+ return out;
40
+ }
41
+ const optObj = (v) => (isObj(v) ? v : undefined);
42
+ function strList(v) {
43
+ return Array.isArray(v) ? v.filter((x) => typeof x === 'string') : [];
44
+ }
45
+ function blockedCookies(v) {
46
+ if (!Array.isArray(v))
47
+ return undefined;
48
+ return v.filter(isObj).map((c) => ({ name: str(c.name), reasons: strList(c.reasons), domain: str(c.domain), path: str(c.path) }));
49
+ }
50
+ function decodeTiming(v) {
51
+ if (!isObj(v))
52
+ return undefined;
53
+ return {
54
+ blocked: optNum(v.blocked),
55
+ dns: optNum(v.dns),
56
+ connect: optNum(v.connect),
57
+ ssl: optNum(v.ssl),
58
+ send: optNum(v.send),
59
+ wait: optNum(v.wait),
60
+ receive: optNum(v.receive),
61
+ };
62
+ }
63
+ function decodeNetwork(v) {
64
+ const d = asObj(v);
65
+ const cors = isObj(d.corsErrorStatus) ? { corsError: str(d.corsErrorStatus.corsError), failedParameter: str(d.corsErrorStatus.failedParameter) } : undefined;
66
+ const worker = isObj(d.worker) ? { type: str(d.worker.type), url: str(d.worker.url) } : undefined;
67
+ const frames = isObj(d.frames)
68
+ ? {
69
+ sent: int(d.frames.sent),
70
+ received: int(d.frames.received),
71
+ sentBytes: num(d.frames.sentBytes),
72
+ receivedBytes: num(d.frames.receivedBytes),
73
+ dropped: int(d.frames.dropped),
74
+ dataOmitted: int(d.frames.dataOmitted),
75
+ }
76
+ : undefined;
77
+ return {
78
+ id: str(d.id),
79
+ kind: str(d.kind),
80
+ method: str(d.method),
81
+ url: str(d.url),
82
+ status: int(d.status),
83
+ statusText: str(d.statusText),
84
+ duration: optNum(d.duration),
85
+ ttfb: optNum(d.ttfb),
86
+ reqHeaders: strMap(d.reqHeaders),
87
+ reqBody: optStr(d.reqBody),
88
+ reqBodyNote: str(d.reqBodyNote),
89
+ reqBodyTruncated: bool(d.reqBodyTruncated),
90
+ resHeaders: strMap(d.resHeaders),
91
+ resBody: optStr(d.resBody),
92
+ resBodyNote: str(d.resBodyNote),
93
+ resBodyTruncated: bool(d.resBodyTruncated),
94
+ resSize: optNum(d.resSize),
95
+ transferSize: optNum(d.transferSize),
96
+ mime: str(d.mime),
97
+ error: str(d.error),
98
+ pending: bool(d.pending),
99
+ initiator: str(d.initiator),
100
+ navType: str(d.navType),
101
+ source: str(d.source),
102
+ resourceType: str(d.resourceType),
103
+ timing: decodeTiming(d.timing),
104
+ protocol: str(d.protocol),
105
+ remoteAddress: str(d.remoteAddress),
106
+ cache: str(d.cache),
107
+ fromServiceWorker: bool(d.fromServiceWorker),
108
+ swSource: str(d.swSource),
109
+ blockedReason: str(d.blockedReason),
110
+ corsErrorStatus: cors,
111
+ blockedCookies: blockedCookies(d.blockedCookies),
112
+ blockedSetCookies: blockedCookies(d.blockedSetCookies),
113
+ worker,
114
+ closedAt: num(d.closedAt),
115
+ frames,
116
+ };
117
+ }
118
+ function decodeWS(v) {
119
+ const d = asObj(v);
120
+ return {
121
+ conn: str(d.conn),
122
+ dir: str(d.dir),
123
+ opcode: int(d.opcode),
124
+ size: num(d.size),
125
+ data: optStr(d.data),
126
+ truncated: bool(d.truncated),
127
+ dataOmitted: bool(d.dataOmitted),
128
+ dropped: int(d.dropped),
129
+ error: str(d.error),
130
+ dataRemoved: bool(d.dataRemoved),
131
+ };
132
+ }
133
+ function decodeState(v) {
134
+ const d = asObj(v);
135
+ const changes = Array.isArray(d.changes)
136
+ ? d.changes.filter(isObj).map((c) => {
137
+ const ch = { path: str(c.path), deleted: bool(c.deleted) };
138
+ if (c.value !== undefined)
139
+ ch.value = c.value;
140
+ return ch;
141
+ })
142
+ : undefined;
143
+ const out = {
144
+ store: str(d.store),
145
+ kind: str(d.kind),
146
+ action: str(d.action),
147
+ payload: optObj(d.payload),
148
+ payloadTruncated: bool(d.payloadTruncated),
149
+ changes,
150
+ truncated: bool(d.truncated),
151
+ burst: bool(d.burst),
152
+ reason: str(d.reason),
153
+ };
154
+ // Present even when null: the record still carries "the whole state".
155
+ if (d.state !== undefined)
156
+ out.state = d.state;
157
+ return out;
158
+ }
159
+ function decodeConsole(v) {
160
+ const d = asObj(v);
161
+ return {
162
+ level: str(d.level),
163
+ source: str(d.source),
164
+ text: str(d.text),
165
+ args: Array.isArray(d.args) ? d.args : undefined,
166
+ stack: str(d.stack),
167
+ url: str(d.url),
168
+ line: int(d.line),
169
+ col: int(d.col),
170
+ };
171
+ }
172
+ function decodeTarget(v) {
173
+ if (!isObj(v))
174
+ return undefined;
175
+ return {
176
+ tag: str(v.tag),
177
+ selector: str(v.selector),
178
+ text: str(v.text),
179
+ id: str(v.id),
180
+ classes: str(v.classes),
181
+ name: str(v.name),
182
+ type: str(v.type),
183
+ role: str(v.role),
184
+ ariaLabel: str(v.ariaLabel),
185
+ href: str(v.href),
186
+ testId: str(v.testId),
187
+ placeholder: str(v.placeholder),
188
+ title: str(v.title),
189
+ alt: str(v.alt),
190
+ };
191
+ }
192
+ function decodeEvent(v) {
193
+ const d = asObj(v);
194
+ return {
195
+ name: str(d.name),
196
+ kind: str(d.kind),
197
+ url: str(d.url),
198
+ title: str(d.title),
199
+ referrer: str(d.referrer),
200
+ viewport: isObj(d.viewport) ? { w: int(d.viewport.w), h: int(d.viewport.h) } : undefined,
201
+ target: decodeTarget(d.target),
202
+ x: int(d.x),
203
+ y: int(d.y),
204
+ count: int(d.count),
205
+ value: optStr(d.value),
206
+ masked: bool(d.masked),
207
+ action: str(d.action),
208
+ method: str(d.method),
209
+ label: str(d.label),
210
+ event: str(d.event),
211
+ props: optObj(d.props),
212
+ userId: str(d.userId),
213
+ traits: optObj(d.traits),
214
+ dropped: int(d.dropped),
215
+ };
216
+ }
217
+ function decodePerf(v) {
218
+ const d = asObj(v);
219
+ const a = d.attribution;
220
+ return {
221
+ kind: str(d.kind),
222
+ name: str(d.name),
223
+ value: num(d.value),
224
+ rating: str(d.rating),
225
+ id: str(d.id),
226
+ url: str(d.url),
227
+ attribution: isObj(a)
228
+ ? {
229
+ target: str(a.target),
230
+ time: num(a.time),
231
+ url: str(a.url),
232
+ largestShiftValue: num(a.largestShiftValue),
233
+ interactionType: str(a.interactionType),
234
+ inputDelay: num(a.inputDelay),
235
+ processingDuration: num(a.processingDuration),
236
+ presentationDelay: num(a.presentationDelay),
237
+ }
238
+ : undefined,
239
+ duration: num(d.duration),
240
+ blockingDuration: num(d.blockingDuration),
241
+ scripts: Array.isArray(d.scripts)
242
+ ? d.scripts.filter(isObj).map((s) => ({
243
+ url: str(s.url),
244
+ fn: str(s.fn),
245
+ invoker: str(s.invoker),
246
+ invokerType: str(s.invokerType),
247
+ duration: num(s.duration),
248
+ }))
249
+ : undefined,
250
+ };
251
+ }
252
+ // ---------- predicates ----------
253
+ /** Whether the record is a WebSocket connection. */
254
+ const isWebSocket = (n) => n.kind === 'websocket';
255
+ exports.isWebSocket = isWebSocket;
256
+ /** Whether the request failed: HTTP status >= 400, a transport error, or (deep mode) a CORS check or a block by Chrome. */
257
+ function failed(n) {
258
+ return n.status >= 400 || n.error !== '' || n.corsErrorStatus !== undefined || n.blockedReason !== '';
259
+ }
260
+ /** Whether the request is a page asset seen through Resource Timing (scripts, images, CSS) rather than an API call or a document. */
261
+ const isAsset = (n) => n.kind === 'resource';
262
+ exports.isAsset = isAsset;
263
+ /** The decoded response size when known, else the transfer size. */
264
+ function sizeOf(n) {
265
+ if (n.resSize !== undefined)
266
+ return n.resSize;
267
+ if (n.transferSize !== undefined)
268
+ return n.transferSize;
269
+ return 0;
270
+ }
271
+ /** How a network record was captured. */
272
+ function recorded(n) {
273
+ return n.source === 'cdp' ? 'deep mode (Chrome DevTools Protocol)' : 'in the page';
274
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /**
3
+ * The list of sensitive HTTP headers that are hidden when recorded data
4
+ * leaves the replay UI: MCP tool results and exports.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RedactHeaders = exports.DEFAULT_REDACT_HEADERS = exports.REDACTED = void 0;
8
+ /** Replaces the value of a sensitive header. */
9
+ exports.REDACTED = '[redacted]';
10
+ /** The built-in list of sensitive headers. */
11
+ exports.DEFAULT_REDACT_HEADERS = 'authorization,cookie,set-cookie,x-api-key,proxy-authorization';
12
+ /** A set of header names, compared case-insensitively. */
13
+ class RedactHeaders {
14
+ constructor(list = exports.DEFAULT_REDACT_HEADERS) {
15
+ this.names = new Set(list
16
+ .split(',')
17
+ .map((name) => name.trim().toLowerCase())
18
+ .filter(Boolean));
19
+ }
20
+ /** Whether name is sensitive. */
21
+ has(name) {
22
+ return this.names.has(name.toLowerCase());
23
+ }
24
+ apply(m) {
25
+ if (!m)
26
+ return undefined;
27
+ const out = {};
28
+ for (const [k, v] of Object.entries(m))
29
+ out[k] = this.has(k) ? exports.REDACTED : v;
30
+ return out;
31
+ }
32
+ /** The header names, sorted. */
33
+ list() {
34
+ return [...this.names].sort();
35
+ }
36
+ }
37
+ exports.RedactHeaders = RedactHeaders;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /** The wording of reproduction steps, one table per language. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.langFor = langFor;
5
+ function withProps(s, props) {
6
+ return props !== '' ? `${s} (${props})` : s;
7
+ }
8
+ function withScript(s, script) {
9
+ return script !== '' ? `${s} (${script})` : s;
10
+ }
11
+ function times(n) {
12
+ return n > 1 ? ` ×${n}` : '';
13
+ }
14
+ const en = {
15
+ env: 'Environment',
16
+ startURL: 'Start URL',
17
+ expected: 'Expected',
18
+ fillIn: 'fill in',
19
+ replay: 'Replay',
20
+ noSteps: '_No user actions in this range._',
21
+ failed: 'failed',
22
+ opened: (p) => 'Opened ' + p,
23
+ navigated: (p) => 'Navigated to ' + p,
24
+ link: (p) => 'link to ' + p,
25
+ clicked: (l, n) => 'Clicked ' + l + times(n),
26
+ typed: (f, v) => 'Typed ' + v + ' into ' + f,
27
+ selected: (f, v) => 'Selected ' + v + ' in ' + f,
28
+ file: (f, v) => 'Chose file ' + v + ' in ' + f,
29
+ cleared: (f) => 'Cleared ' + f,
30
+ masked: (f) => 'Filled ' + f + ' (masked)',
31
+ submitted: (f) => 'Submitted form ' + f,
32
+ checked: (f) => 'Checked ' + f,
33
+ unchecked: (f) => 'Unchecked ' + f,
34
+ consoleErr: (t) => 'Console error: ' + t,
35
+ tracked: (name, props, n) => withProps('Event ' + name, props) + times(n),
36
+ user: (id) => 'user ' + id,
37
+ poorVital: (metric, value, target) => {
38
+ let s = 'Poor ' + metric + ': ' + value;
39
+ if (target !== '')
40
+ s += ' on ' + target;
41
+ return s;
42
+ },
43
+ froze: (dur, script) => withScript('Page froze for ' + dur, script),
44
+ request: (req, status, dur, body) => {
45
+ let s = req + ' → **' + status + '**';
46
+ if (dur !== '')
47
+ s += ' in ' + dur;
48
+ if (body !== '')
49
+ s += ': ' + body;
50
+ return s;
51
+ },
52
+ };
53
+ const tr = {
54
+ env: 'Ortam',
55
+ startURL: "Başlangıç URL'si",
56
+ expected: 'Beklenen',
57
+ fillIn: 'doldurun',
58
+ replay: 'Replay',
59
+ noSteps: '_Bu aralıkta kullanıcı eylemi yok._',
60
+ failed: 'başarısız',
61
+ opened: (p) => p + ' açıldı',
62
+ navigated: (p) => p + ' sayfasına geçildi',
63
+ link: (p) => p + ' bağlantısı',
64
+ clicked: (l, n) => l + times(n) + ' tıklandı',
65
+ typed: (f, v) => f + ' alanına ' + v + ' yazıldı',
66
+ selected: (f, v) => f + ' alanında ' + v + ' seçildi',
67
+ file: (f, v) => f + ' alanında ' + v + ' dosyası seçildi',
68
+ cleared: (f) => f + ' alanı temizlendi',
69
+ masked: (f) => f + ' dolduruldu (maskeli)',
70
+ submitted: (f) => f + ' formu gönderildi',
71
+ checked: (f) => f + ' işaretlendi',
72
+ unchecked: (f) => f + ' işareti kaldırıldı',
73
+ consoleErr: (t) => 'Console hatası: ' + t,
74
+ tracked: (name, props, n) => withProps(name + ' olayı', props) + times(n),
75
+ user: (id) => 'kullanıcı ' + id,
76
+ poorVital: (metric, value, target) => {
77
+ let s = 'Kötü ' + metric + ': ' + value;
78
+ if (target !== '')
79
+ s += ', ' + target;
80
+ return s;
81
+ },
82
+ froze: (dur, script) => withScript('Sayfa ' + dur + ' dondu', script),
83
+ request: (req, status, dur, body) => {
84
+ let s = req + ' → **' + status + '**';
85
+ if (dur !== '')
86
+ s += ', ' + dur;
87
+ if (body !== '')
88
+ s += ': ' + body;
89
+ return s;
90
+ },
91
+ };
92
+ /** The wording for a language code: "tr", else English. */
93
+ function langFor(code) {
94
+ return code === 'tr' ? tr : en;
95
+ }