@opentabs-dev/opentabs-plugin-meticulous 0.0.76

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 (121) hide show
  1. package/README.md +159 -0
  2. package/dist/adapter.iife.js +15945 -0
  3. package/dist/adapter.iife.js.map +7 -0
  4. package/dist/index.d.ts +14 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +80 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/meticulous-api.d.ts +34 -0
  9. package/dist/meticulous-api.d.ts.map +1 -0
  10. package/dist/meticulous-api.js +477 -0
  11. package/dist/meticulous-api.js.map +1 -0
  12. package/dist/tools/accept-all-diffs.d.ts +8 -0
  13. package/dist/tools/accept-all-diffs.d.ts.map +1 -0
  14. package/dist/tools/accept-all-diffs.js +23 -0
  15. package/dist/tools/accept-all-diffs.js.map +1 -0
  16. package/dist/tools/check-for-flakes.d.ts +8 -0
  17. package/dist/tools/check-for-flakes.d.ts.map +1 -0
  18. package/dist/tools/check-for-flakes.js +26 -0
  19. package/dist/tools/check-for-flakes.js.map +1 -0
  20. package/dist/tools/compare-replays.d.ts +68 -0
  21. package/dist/tools/compare-replays.d.ts.map +1 -0
  22. package/dist/tools/compare-replays.js +53 -0
  23. package/dist/tools/compare-replays.js.map +1 -0
  24. package/dist/tools/create-label-action.d.ts +16 -0
  25. package/dist/tools/create-label-action.d.ts.map +1 -0
  26. package/dist/tools/create-label-action.js +29 -0
  27. package/dist/tools/create-label-action.js.map +1 -0
  28. package/dist/tools/get-current-user.d.ts +12 -0
  29. package/dist/tools/get-current-user.d.ts.map +1 -0
  30. package/dist/tools/get-current-user.js +22 -0
  31. package/dist/tools/get-current-user.js.map +1 -0
  32. package/dist/tools/get-project-pull-request.d.ts +14 -0
  33. package/dist/tools/get-project-pull-request.d.ts.map +1 -0
  34. package/dist/tools/get-project-pull-request.js +23 -0
  35. package/dist/tools/get-project-pull-request.js.map +1 -0
  36. package/dist/tools/get-project.d.ts +20 -0
  37. package/dist/tools/get-project.d.ts.map +1 -0
  38. package/dist/tools/get-project.js +25 -0
  39. package/dist/tools/get-project.js.map +1 -0
  40. package/dist/tools/get-replay-screenshots.d.ts +16 -0
  41. package/dist/tools/get-replay-screenshots.d.ts.map +1 -0
  42. package/dist/tools/get-replay-screenshots.js +27 -0
  43. package/dist/tools/get-replay-screenshots.js.map +1 -0
  44. package/dist/tools/get-replay.d.ts +17 -0
  45. package/dist/tools/get-replay.d.ts.map +1 -0
  46. package/dist/tools/get-replay.js +21 -0
  47. package/dist/tools/get-replay.js.map +1 -0
  48. package/dist/tools/get-session-events.d.ts +14 -0
  49. package/dist/tools/get-session-events.d.ts.map +1 -0
  50. package/dist/tools/get-session-events.js +27 -0
  51. package/dist/tools/get-session-events.js.map +1 -0
  52. package/dist/tools/get-session.d.ts +19 -0
  53. package/dist/tools/get-session.d.ts.map +1 -0
  54. package/dist/tools/get-session.js +21 -0
  55. package/dist/tools/get-session.js.map +1 -0
  56. package/dist/tools/get-test-run-coverage.d.ts +83 -0
  57. package/dist/tools/get-test-run-coverage.d.ts.map +1 -0
  58. package/dist/tools/get-test-run-coverage.js +64 -0
  59. package/dist/tools/get-test-run-coverage.js.map +1 -0
  60. package/dist/tools/get-test-run-diffs.d.ts +56 -0
  61. package/dist/tools/get-test-run-diffs.d.ts.map +1 -0
  62. package/dist/tools/get-test-run-diffs.js +53 -0
  63. package/dist/tools/get-test-run-diffs.js.map +1 -0
  64. package/dist/tools/get-test-run-pr-description.d.ts +8 -0
  65. package/dist/tools/get-test-run-pr-description.d.ts.map +1 -0
  66. package/dist/tools/get-test-run-pr-description.js +26 -0
  67. package/dist/tools/get-test-run-pr-description.js.map +1 -0
  68. package/dist/tools/get-test-run-screenshots.d.ts +70 -0
  69. package/dist/tools/get-test-run-screenshots.d.ts.map +1 -0
  70. package/dist/tools/get-test-run-screenshots.js +61 -0
  71. package/dist/tools/get-test-run-screenshots.js.map +1 -0
  72. package/dist/tools/get-test-run-source-code.d.ts +9 -0
  73. package/dist/tools/get-test-run-source-code.d.ts.map +1 -0
  74. package/dist/tools/get-test-run-source-code.js +24 -0
  75. package/dist/tools/get-test-run-source-code.js.map +1 -0
  76. package/dist/tools/get-test-run-test-cases.d.ts +25 -0
  77. package/dist/tools/get-test-run-test-cases.d.ts.map +1 -0
  78. package/dist/tools/get-test-run-test-cases.js +60 -0
  79. package/dist/tools/get-test-run-test-cases.js.map +1 -0
  80. package/dist/tools/get-test-run.d.ts +29 -0
  81. package/dist/tools/get-test-run.d.ts.map +1 -0
  82. package/dist/tools/get-test-run.js +30 -0
  83. package/dist/tools/get-test-run.js.map +1 -0
  84. package/dist/tools/list-github-repositories.d.ts +11 -0
  85. package/dist/tools/list-github-repositories.d.ts.map +1 -0
  86. package/dist/tools/list-github-repositories.js +19 -0
  87. package/dist/tools/list-github-repositories.js.map +1 -0
  88. package/dist/tools/list-organization-members.d.ts +18 -0
  89. package/dist/tools/list-organization-members.d.ts.map +1 -0
  90. package/dist/tools/list-organization-members.js +21 -0
  91. package/dist/tools/list-organization-members.js.map +1 -0
  92. package/dist/tools/list-organizations.d.ts +9 -0
  93. package/dist/tools/list-organizations.d.ts.map +1 -0
  94. package/dist/tools/list-organizations.js +19 -0
  95. package/dist/tools/list-organizations.js.map +1 -0
  96. package/dist/tools/list-projects.d.ts +14 -0
  97. package/dist/tools/list-projects.d.ts.map +1 -0
  98. package/dist/tools/list-projects.js +19 -0
  99. package/dist/tools/list-projects.js.map +1 -0
  100. package/dist/tools/list-replays.d.ts +18 -0
  101. package/dist/tools/list-replays.d.ts.map +1 -0
  102. package/dist/tools/list-replays.js +25 -0
  103. package/dist/tools/list-replays.js.map +1 -0
  104. package/dist/tools/list-sessions.d.ts +20 -0
  105. package/dist/tools/list-sessions.d.ts.map +1 -0
  106. package/dist/tools/list-sessions.js +22 -0
  107. package/dist/tools/list-sessions.js.map +1 -0
  108. package/dist/tools/schemas.d.ts +560 -0
  109. package/dist/tools/schemas.d.ts.map +1 -0
  110. package/dist/tools/schemas.js +303 -0
  111. package/dist/tools/schemas.js.map +1 -0
  112. package/dist/tools/search-sessions.d.ts +24 -0
  113. package/dist/tools/search-sessions.d.ts.map +1 -0
  114. package/dist/tools/search-sessions.js +33 -0
  115. package/dist/tools/search-sessions.js.map +1 -0
  116. package/dist/tools/upsert-diff-approval.d.ts +12 -0
  117. package/dist/tools/upsert-diff-approval.d.ts.map +1 -0
  118. package/dist/tools/upsert-diff-approval.js +36 -0
  119. package/dist/tools/upsert-diff-approval.js.map +1 -0
  120. package/dist/tools.json +4020 -0
  121. package/package.json +58 -0
@@ -0,0 +1,4020 @@
1
+ {
2
+ "sdkVersion": "0.0.76",
3
+ "iconSvg": "<svg viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"> <g transform=\"translate(1, 0)\"> <path d=\"M2.34131 0H0V17.3123H1.65712V2.45609L4.4692 8.65928L5.3417 6.61884L2.34131 0ZM14.2048 6.80147V17.3123H16V2.60093L14.2048 6.80147Z\" fill=\"black\"/> <path d=\"M13.6131 0L8.2023 11.9781H7.77547L6.35687 8.86081L5.48438 10.9012L6.73349 13.6596H9.09991L12.659 5.78755L12.7092 5.67419L15.1321 0H13.6131Z\" fill=\"#6E64BD\"/> </g> </svg>",
4
+ "iconInactiveSvg": "<svg viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"> <g transform=\"translate(1, 0)\"> <path d=\"M2.34131 0H0V17.3123H1.65712V2.45609L4.4692 8.65928L5.3417 6.61884L2.34131 0ZM14.2048 6.80147V17.3123H16V2.60093L14.2048 6.80147Z\" fill=\"#999999\"/> <path d=\"M13.6131 0L8.2023 11.9781H7.77547L6.35687 8.86081L5.48438 10.9012L6.73349 13.6596H9.09991L12.659 5.78755L12.7092 5.67419L15.1321 0H13.6131Z\" fill=\"#999999\"/> </g> </svg>",
5
+ "iconDarkSvg": "<svg viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"> <g transform=\"translate(1, 0)\"> <path d=\"M2.34131 0H0V17.3123H1.65712V2.45609L4.4692 8.65928L5.3417 6.61884L2.34131 0ZM14.2048 6.80147V17.3123H16V2.60093L14.2048 6.80147Z\" fill=\"#ffffff\"/> <path d=\"M13.6131 0L8.2023 11.9781H7.77547L6.35687 8.86081L5.48438 10.9012L6.73349 13.6596H9.09991L12.659 5.78755L12.7092 5.67419L15.1321 0H13.6131Z\" fill=\"#6E64BD\"/> </g> </svg>",
6
+ "iconDarkInactiveSvg": "<svg viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"> <g transform=\"translate(1, 0)\"> <path d=\"M2.34131 0H0V17.3123H1.65712V2.45609L4.4692 8.65928L5.3417 6.61884L2.34131 0ZM14.2048 6.80147V17.3123H16V2.60093L14.2048 6.80147Z\" fill=\"#ffffff\"/> <path d=\"M13.6131 0L8.2023 11.9781H7.77547L6.35687 8.86081L5.48438 10.9012L6.73349 13.6596H9.09991L12.659 5.78755L12.7092 5.67419L15.1321 0H13.6131Z\" fill=\"#999999\"/> </g> </svg>",
7
+ "tools": [
8
+ {
9
+ "name": "get_current_user",
10
+ "displayName": "Get Current User",
11
+ "description": "Get the currently authenticated user profile including email, name, and admin status.",
12
+ "summary": "Get the current user profile",
13
+ "icon": "user",
14
+ "group": "User",
15
+ "input_schema": {
16
+ "type": "object",
17
+ "properties": {},
18
+ "additionalProperties": false
19
+ },
20
+ "output_schema": {
21
+ "type": "object",
22
+ "properties": {
23
+ "user": {
24
+ "type": "object",
25
+ "properties": {
26
+ "id": {
27
+ "type": "string",
28
+ "description": "User ID"
29
+ },
30
+ "email": {
31
+ "type": "string",
32
+ "description": "User email"
33
+ },
34
+ "first_name": {
35
+ "type": "string",
36
+ "description": "First name"
37
+ },
38
+ "last_name": {
39
+ "type": "string",
40
+ "description": "Last name"
41
+ },
42
+ "is_admin": {
43
+ "type": "boolean",
44
+ "description": "Whether user is an admin"
45
+ }
46
+ },
47
+ "required": [
48
+ "id",
49
+ "email",
50
+ "first_name",
51
+ "last_name",
52
+ "is_admin"
53
+ ],
54
+ "additionalProperties": false
55
+ },
56
+ "is_signed_in": {
57
+ "type": "boolean"
58
+ }
59
+ },
60
+ "required": [
61
+ "user",
62
+ "is_signed_in"
63
+ ],
64
+ "additionalProperties": false
65
+ }
66
+ },
67
+ {
68
+ "name": "list_organizations",
69
+ "displayName": "List Organizations",
70
+ "description": "List all organizations the current user belongs to.",
71
+ "summary": "List organizations",
72
+ "icon": "building",
73
+ "group": "Organizations",
74
+ "input_schema": {
75
+ "type": "object",
76
+ "properties": {},
77
+ "additionalProperties": false
78
+ },
79
+ "output_schema": {
80
+ "type": "object",
81
+ "properties": {
82
+ "organizations": {
83
+ "type": "array",
84
+ "items": {
85
+ "type": "object",
86
+ "properties": {
87
+ "id": {
88
+ "type": "string",
89
+ "description": "Organization ID"
90
+ },
91
+ "name": {
92
+ "type": "string",
93
+ "description": "Organization name"
94
+ },
95
+ "created_at": {
96
+ "type": "string",
97
+ "description": "ISO 8601 creation timestamp"
98
+ }
99
+ },
100
+ "required": [
101
+ "id",
102
+ "name",
103
+ "created_at"
104
+ ],
105
+ "additionalProperties": false
106
+ }
107
+ }
108
+ },
109
+ "required": [
110
+ "organizations"
111
+ ],
112
+ "additionalProperties": false
113
+ }
114
+ },
115
+ {
116
+ "name": "list_organization_members",
117
+ "displayName": "List Organization Members",
118
+ "description": "List all members of an organization with their roles.",
119
+ "summary": "List org members",
120
+ "icon": "users",
121
+ "group": "Organizations",
122
+ "input_schema": {
123
+ "type": "object",
124
+ "properties": {
125
+ "organization_name": {
126
+ "type": "string",
127
+ "description": "Organization name"
128
+ }
129
+ },
130
+ "required": [
131
+ "organization_name"
132
+ ],
133
+ "additionalProperties": false
134
+ },
135
+ "output_schema": {
136
+ "type": "object",
137
+ "properties": {
138
+ "members": {
139
+ "type": "array",
140
+ "items": {
141
+ "type": "object",
142
+ "properties": {
143
+ "id": {
144
+ "type": "string",
145
+ "description": "Membership ID"
146
+ },
147
+ "role": {
148
+ "type": "string",
149
+ "description": "Role (e.g., member, admin)"
150
+ },
151
+ "created_at": {
152
+ "type": "string",
153
+ "description": "ISO 8601 join timestamp"
154
+ },
155
+ "user": {
156
+ "type": "object",
157
+ "properties": {
158
+ "id": {
159
+ "type": "string",
160
+ "description": "User ID"
161
+ },
162
+ "email": {
163
+ "type": "string",
164
+ "description": "User email"
165
+ },
166
+ "first_name": {
167
+ "type": "string",
168
+ "description": "First name"
169
+ },
170
+ "last_name": {
171
+ "type": "string",
172
+ "description": "Last name"
173
+ },
174
+ "is_admin": {
175
+ "type": "boolean",
176
+ "description": "Whether user is an admin"
177
+ }
178
+ },
179
+ "required": [
180
+ "id",
181
+ "email",
182
+ "first_name",
183
+ "last_name",
184
+ "is_admin"
185
+ ],
186
+ "additionalProperties": false
187
+ }
188
+ },
189
+ "required": [
190
+ "id",
191
+ "role",
192
+ "created_at",
193
+ "user"
194
+ ],
195
+ "additionalProperties": false
196
+ }
197
+ }
198
+ },
199
+ "required": [
200
+ "members"
201
+ ],
202
+ "additionalProperties": false
203
+ }
204
+ },
205
+ {
206
+ "name": "list_projects",
207
+ "displayName": "List Projects",
208
+ "description": "List all projects accessible to the current user, including latest test run info.",
209
+ "summary": "List projects",
210
+ "icon": "folder",
211
+ "group": "Projects",
212
+ "input_schema": {
213
+ "type": "object",
214
+ "properties": {},
215
+ "additionalProperties": false
216
+ },
217
+ "output_schema": {
218
+ "type": "object",
219
+ "properties": {
220
+ "projects": {
221
+ "type": "array",
222
+ "items": {
223
+ "type": "object",
224
+ "properties": {
225
+ "id": {
226
+ "type": "string",
227
+ "description": "Project ID"
228
+ },
229
+ "name": {
230
+ "type": "string",
231
+ "description": "Project name"
232
+ },
233
+ "organization_name": {
234
+ "type": "string",
235
+ "description": "Organization name"
236
+ },
237
+ "host_kind": {
238
+ "anyOf": [
239
+ {
240
+ "type": "string"
241
+ },
242
+ {
243
+ "type": "null"
244
+ }
245
+ ],
246
+ "description": "Hosting provider (e.g., github)"
247
+ },
248
+ "status": {
249
+ "type": "string",
250
+ "description": "Project status"
251
+ },
252
+ "latest_test_run_at": {
253
+ "anyOf": [
254
+ {
255
+ "type": "string"
256
+ },
257
+ {
258
+ "type": "null"
259
+ }
260
+ ],
261
+ "description": "Last successful test run timestamp"
262
+ },
263
+ "total_sessions": {
264
+ "anyOf": [
265
+ {
266
+ "type": "number"
267
+ },
268
+ {
269
+ "type": "null"
270
+ }
271
+ ],
272
+ "description": "Total sessions in latest test run"
273
+ },
274
+ "total_screenshots": {
275
+ "anyOf": [
276
+ {
277
+ "type": "number"
278
+ },
279
+ {
280
+ "type": "null"
281
+ }
282
+ ],
283
+ "description": "Total screenshots in latest test run"
284
+ }
285
+ },
286
+ "required": [
287
+ "id",
288
+ "name",
289
+ "organization_name",
290
+ "host_kind",
291
+ "status",
292
+ "latest_test_run_at",
293
+ "total_sessions",
294
+ "total_screenshots"
295
+ ],
296
+ "additionalProperties": false
297
+ }
298
+ }
299
+ },
300
+ "required": [
301
+ "projects"
302
+ ],
303
+ "additionalProperties": false
304
+ }
305
+ },
306
+ {
307
+ "name": "get_project",
308
+ "displayName": "Get Project",
309
+ "description": "Get detailed information about a specific project including tokens, settings, and configuration.",
310
+ "summary": "Get project details",
311
+ "icon": "folder-open",
312
+ "group": "Projects",
313
+ "input_schema": {
314
+ "type": "object",
315
+ "properties": {
316
+ "organization_name": {
317
+ "type": "string",
318
+ "description": "Organization name"
319
+ },
320
+ "project_name": {
321
+ "type": "string",
322
+ "description": "Project name"
323
+ }
324
+ },
325
+ "required": [
326
+ "organization_name",
327
+ "project_name"
328
+ ],
329
+ "additionalProperties": false
330
+ },
331
+ "output_schema": {
332
+ "type": "object",
333
+ "properties": {
334
+ "project": {
335
+ "type": "object",
336
+ "properties": {
337
+ "id": {
338
+ "type": "string",
339
+ "description": "Project ID"
340
+ },
341
+ "name": {
342
+ "type": "string",
343
+ "description": "Project name"
344
+ },
345
+ "organization_name": {
346
+ "type": "string",
347
+ "description": "Organization name"
348
+ },
349
+ "host_kind": {
350
+ "anyOf": [
351
+ {
352
+ "type": "string"
353
+ },
354
+ {
355
+ "type": "null"
356
+ }
357
+ ],
358
+ "description": "Hosting provider"
359
+ },
360
+ "status": {
361
+ "type": "string",
362
+ "description": "Project status"
363
+ },
364
+ "recording_token": {
365
+ "anyOf": [
366
+ {
367
+ "type": "string"
368
+ },
369
+ {
370
+ "type": "null"
371
+ }
372
+ ],
373
+ "description": "Recording token for SDK"
374
+ },
375
+ "api_token": {
376
+ "anyOf": [
377
+ {
378
+ "type": "string"
379
+ },
380
+ {
381
+ "type": "null"
382
+ }
383
+ ],
384
+ "description": "API token"
385
+ },
386
+ "created_at": {
387
+ "type": "string",
388
+ "description": "ISO 8601 creation timestamp"
389
+ },
390
+ "updated_at": {
391
+ "type": "string",
392
+ "description": "ISO 8601 update timestamp"
393
+ },
394
+ "enterprise_grade_security": {
395
+ "type": "boolean",
396
+ "description": "Enterprise security enabled"
397
+ },
398
+ "auto_session_selection": {
399
+ "type": "boolean",
400
+ "description": "Auto session selection enabled"
401
+ }
402
+ },
403
+ "required": [
404
+ "id",
405
+ "name",
406
+ "organization_name",
407
+ "host_kind",
408
+ "status",
409
+ "recording_token",
410
+ "api_token",
411
+ "created_at",
412
+ "updated_at",
413
+ "enterprise_grade_security",
414
+ "auto_session_selection"
415
+ ],
416
+ "additionalProperties": false
417
+ }
418
+ },
419
+ "required": [
420
+ "project"
421
+ ],
422
+ "additionalProperties": false
423
+ }
424
+ },
425
+ {
426
+ "name": "get_project_pull_request",
427
+ "displayName": "Get Project Pull Request",
428
+ "description": "Get the Meticulous test status for a specific pull request by its hosting provider ID (e.g., GitHub PR number).",
429
+ "summary": "Get PR test status",
430
+ "icon": "git-pull-request",
431
+ "group": "Projects",
432
+ "input_schema": {
433
+ "type": "object",
434
+ "properties": {
435
+ "organization_name": {
436
+ "type": "string",
437
+ "description": "Organization name"
438
+ },
439
+ "project_name": {
440
+ "type": "string",
441
+ "description": "Project name"
442
+ },
443
+ "pull_request_id": {
444
+ "type": "string",
445
+ "description": "Hosting provider PR identifier (e.g., GitHub PR number as string)"
446
+ }
447
+ },
448
+ "required": [
449
+ "organization_name",
450
+ "project_name",
451
+ "pull_request_id"
452
+ ],
453
+ "additionalProperties": false
454
+ },
455
+ "output_schema": {
456
+ "type": "object",
457
+ "properties": {
458
+ "pull_request": {
459
+ "anyOf": [
460
+ {
461
+ "type": "object",
462
+ "properties": {
463
+ "id": {
464
+ "type": "string",
465
+ "description": "Pull request ID"
466
+ },
467
+ "approval_state": {
468
+ "anyOf": [
469
+ {
470
+ "type": "string"
471
+ },
472
+ {
473
+ "type": "null"
474
+ }
475
+ ],
476
+ "description": "Approval state"
477
+ },
478
+ "latest_test_run_id": {
479
+ "anyOf": [
480
+ {
481
+ "type": "string"
482
+ },
483
+ {
484
+ "type": "null"
485
+ }
486
+ ],
487
+ "description": "Latest test run ID"
488
+ },
489
+ "created_at": {
490
+ "type": "string",
491
+ "description": "ISO 8601 creation timestamp"
492
+ }
493
+ },
494
+ "required": [
495
+ "id",
496
+ "approval_state",
497
+ "latest_test_run_id",
498
+ "created_at"
499
+ ],
500
+ "additionalProperties": false
501
+ },
502
+ {
503
+ "type": "null"
504
+ }
505
+ ]
506
+ }
507
+ },
508
+ "required": [
509
+ "pull_request"
510
+ ],
511
+ "additionalProperties": false
512
+ }
513
+ },
514
+ {
515
+ "name": "list_github_repositories",
516
+ "displayName": "List GitHub Repositories",
517
+ "description": "List GitHub repositories connected to the Meticulous organization via the GitHub App.",
518
+ "summary": "List connected GitHub repos",
519
+ "icon": "github",
520
+ "group": "Integrations",
521
+ "input_schema": {
522
+ "type": "object",
523
+ "properties": {},
524
+ "additionalProperties": false
525
+ },
526
+ "output_schema": {
527
+ "type": "object",
528
+ "properties": {
529
+ "repositories": {
530
+ "type": "array",
531
+ "items": {
532
+ "type": "object",
533
+ "properties": {
534
+ "id": {
535
+ "type": "string",
536
+ "description": "GitHub repository ID"
537
+ },
538
+ "name": {
539
+ "type": "string",
540
+ "description": "Repository name"
541
+ },
542
+ "owner": {
543
+ "type": "string",
544
+ "description": "Repository owner"
545
+ },
546
+ "url": {
547
+ "type": "string",
548
+ "description": "Repository URL"
549
+ },
550
+ "full_name": {
551
+ "type": "string",
552
+ "description": "Full repository name (owner/name)"
553
+ }
554
+ },
555
+ "required": [
556
+ "id",
557
+ "name",
558
+ "owner",
559
+ "url",
560
+ "full_name"
561
+ ],
562
+ "additionalProperties": false
563
+ }
564
+ }
565
+ },
566
+ "required": [
567
+ "repositories"
568
+ ],
569
+ "additionalProperties": false
570
+ }
571
+ },
572
+ {
573
+ "name": "get_test_run",
574
+ "displayName": "Get Test Run",
575
+ "description": "Get detailed information about a test run including status, statistics, CI context, PR details, and a link to the Meticulous web UI for visual debugging. The test run ID can be found in the Meticulous URL or from project details.",
576
+ "summary": "Get test run details",
577
+ "icon": "play-circle",
578
+ "group": "Test Runs",
579
+ "input_schema": {
580
+ "type": "object",
581
+ "properties": {
582
+ "test_run_id": {
583
+ "type": "string",
584
+ "description": "Test run ID"
585
+ }
586
+ },
587
+ "required": [
588
+ "test_run_id"
589
+ ],
590
+ "additionalProperties": false
591
+ },
592
+ "output_schema": {
593
+ "type": "object",
594
+ "properties": {
595
+ "test_run": {
596
+ "type": "object",
597
+ "properties": {
598
+ "id": {
599
+ "type": "string",
600
+ "description": "Test run ID"
601
+ },
602
+ "status": {
603
+ "type": "string",
604
+ "description": "Test run status"
605
+ },
606
+ "commit_sha": {
607
+ "anyOf": [
608
+ {
609
+ "type": "string"
610
+ },
611
+ {
612
+ "type": "null"
613
+ }
614
+ ],
615
+ "description": "Git commit SHA"
616
+ },
617
+ "created_at": {
618
+ "type": "string",
619
+ "description": "ISO 8601 creation timestamp"
620
+ },
621
+ "updated_at": {
622
+ "type": "string",
623
+ "description": "ISO 8601 update timestamp"
624
+ },
625
+ "project_name": {
626
+ "type": "string",
627
+ "description": "Project name"
628
+ },
629
+ "organization_name": {
630
+ "type": "string",
631
+ "description": "Organization name"
632
+ },
633
+ "stats": {
634
+ "anyOf": [
635
+ {
636
+ "type": "object",
637
+ "properties": {
638
+ "total_screenshots": {
639
+ "type": "number",
640
+ "description": "Total screenshots compared"
641
+ },
642
+ "total_sessions": {
643
+ "type": "number",
644
+ "description": "Total sessions"
645
+ },
646
+ "total_sessions_replayed": {
647
+ "anyOf": [
648
+ {
649
+ "type": "number"
650
+ },
651
+ {
652
+ "type": "null"
653
+ }
654
+ ],
655
+ "description": "Sessions successfully replayed"
656
+ },
657
+ "sessions_skipped": {
658
+ "anyOf": [
659
+ {
660
+ "type": "number"
661
+ },
662
+ {
663
+ "type": "null"
664
+ }
665
+ ],
666
+ "description": "Sessions skipped"
667
+ },
668
+ "screenshots_skipped": {
669
+ "anyOf": [
670
+ {
671
+ "type": "number"
672
+ },
673
+ {
674
+ "type": "null"
675
+ }
676
+ ],
677
+ "description": "Screenshots skipped"
678
+ }
679
+ },
680
+ "required": [
681
+ "total_screenshots",
682
+ "total_sessions",
683
+ "total_sessions_replayed",
684
+ "sessions_skipped",
685
+ "screenshots_skipped"
686
+ ],
687
+ "additionalProperties": false
688
+ },
689
+ {
690
+ "type": "null"
691
+ }
692
+ ],
693
+ "description": "Test run statistics"
694
+ },
695
+ "ci_provider": {
696
+ "anyOf": [
697
+ {
698
+ "type": "string"
699
+ },
700
+ {
701
+ "type": "null"
702
+ }
703
+ ],
704
+ "description": "CI provider"
705
+ },
706
+ "pr_title": {
707
+ "anyOf": [
708
+ {
709
+ "type": "string"
710
+ },
711
+ {
712
+ "type": "null"
713
+ }
714
+ ],
715
+ "description": "Pull request title"
716
+ },
717
+ "pr_number": {
718
+ "anyOf": [
719
+ {
720
+ "type": "number"
721
+ },
722
+ {
723
+ "type": "null"
724
+ }
725
+ ],
726
+ "description": "Pull request number"
727
+ },
728
+ "pr_url": {
729
+ "anyOf": [
730
+ {
731
+ "type": "string"
732
+ },
733
+ {
734
+ "type": "null"
735
+ }
736
+ ],
737
+ "description": "Pull request URL"
738
+ },
739
+ "approval_state": {
740
+ "anyOf": [
741
+ {
742
+ "type": "string"
743
+ },
744
+ {
745
+ "type": "null"
746
+ }
747
+ ],
748
+ "description": "PR approval state"
749
+ },
750
+ "describe_tested": {
751
+ "anyOf": [
752
+ {
753
+ "type": "string"
754
+ },
755
+ {
756
+ "type": "null"
757
+ }
758
+ ],
759
+ "description": "Description of what was tested"
760
+ }
761
+ },
762
+ "required": [
763
+ "id",
764
+ "status",
765
+ "commit_sha",
766
+ "created_at",
767
+ "updated_at",
768
+ "project_name",
769
+ "organization_name",
770
+ "stats",
771
+ "ci_provider",
772
+ "pr_title",
773
+ "pr_number",
774
+ "pr_url",
775
+ "approval_state",
776
+ "describe_tested"
777
+ ],
778
+ "additionalProperties": false
779
+ },
780
+ "web_url": {
781
+ "type": "string",
782
+ "description": "URL to view the test run in the Meticulous web UI"
783
+ }
784
+ },
785
+ "required": [
786
+ "test_run",
787
+ "web_url"
788
+ ],
789
+ "additionalProperties": false
790
+ }
791
+ },
792
+ {
793
+ "name": "get_test_run_screenshots",
794
+ "displayName": "Get Test Run Screenshots",
795
+ "description": "Get screenshot diffs and test case screenshots for a test run. Each diff includes head/base replay info and screenshot comparison URLs (base image, head image, diff image).",
796
+ "summary": "Get test run screenshot diffs",
797
+ "icon": "image",
798
+ "group": "Test Runs",
799
+ "input_schema": {
800
+ "type": "object",
801
+ "properties": {
802
+ "test_run_id": {
803
+ "type": "string",
804
+ "description": "Test run ID"
805
+ },
806
+ "replay_diff_limit": {
807
+ "default": 50,
808
+ "description": "Max replay diffs to return",
809
+ "type": "number"
810
+ },
811
+ "replay_diff_offset": {
812
+ "default": 0,
813
+ "description": "Offset for replay diffs pagination",
814
+ "type": "number"
815
+ },
816
+ "test_case_limit": {
817
+ "default": 50,
818
+ "description": "Max test case results to return",
819
+ "type": "number"
820
+ },
821
+ "test_case_offset": {
822
+ "default": 0,
823
+ "description": "Offset for test case pagination",
824
+ "type": "number"
825
+ }
826
+ },
827
+ "required": [
828
+ "test_run_id",
829
+ "replay_diff_limit",
830
+ "replay_diff_offset",
831
+ "test_case_limit",
832
+ "test_case_offset"
833
+ ],
834
+ "additionalProperties": false
835
+ },
836
+ "output_schema": {
837
+ "type": "object",
838
+ "properties": {
839
+ "diffs": {
840
+ "type": "array",
841
+ "items": {
842
+ "type": "object",
843
+ "properties": {
844
+ "replay_diff_id": {
845
+ "type": "string",
846
+ "description": "Replay diff ID"
847
+ },
848
+ "head_replay": {
849
+ "type": "object",
850
+ "properties": {
851
+ "id": {
852
+ "type": "string",
853
+ "description": "Replay ID"
854
+ },
855
+ "status": {
856
+ "anyOf": [
857
+ {
858
+ "type": "string"
859
+ },
860
+ {
861
+ "type": "null"
862
+ }
863
+ ],
864
+ "description": "Replay status (e.g., Success, Failure)"
865
+ },
866
+ "is_accurate": {
867
+ "anyOf": [
868
+ {
869
+ "type": "boolean"
870
+ },
871
+ {
872
+ "type": "null"
873
+ }
874
+ ],
875
+ "description": "Whether replay was accurate"
876
+ },
877
+ "app_url": {
878
+ "anyOf": [
879
+ {
880
+ "type": "string"
881
+ },
882
+ {
883
+ "type": "null"
884
+ }
885
+ ],
886
+ "description": "Application URL"
887
+ }
888
+ },
889
+ "required": [
890
+ "id",
891
+ "status",
892
+ "is_accurate",
893
+ "app_url"
894
+ ],
895
+ "additionalProperties": false,
896
+ "description": "Head (actual) replay"
897
+ },
898
+ "base_replay": {
899
+ "type": "object",
900
+ "properties": {
901
+ "id": {
902
+ "type": "string",
903
+ "description": "Replay ID"
904
+ },
905
+ "status": {
906
+ "anyOf": [
907
+ {
908
+ "type": "string"
909
+ },
910
+ {
911
+ "type": "null"
912
+ }
913
+ ],
914
+ "description": "Replay status (e.g., Success, Failure)"
915
+ },
916
+ "is_accurate": {
917
+ "anyOf": [
918
+ {
919
+ "type": "boolean"
920
+ },
921
+ {
922
+ "type": "null"
923
+ }
924
+ ],
925
+ "description": "Whether replay was accurate"
926
+ },
927
+ "app_url": {
928
+ "anyOf": [
929
+ {
930
+ "type": "string"
931
+ },
932
+ {
933
+ "type": "null"
934
+ }
935
+ ],
936
+ "description": "Application URL"
937
+ }
938
+ },
939
+ "required": [
940
+ "id",
941
+ "status",
942
+ "is_accurate",
943
+ "app_url"
944
+ ],
945
+ "additionalProperties": false,
946
+ "description": "Base (expected) replay"
947
+ },
948
+ "screenshot_diffs": {
949
+ "type": "array",
950
+ "items": {
951
+ "type": "object",
952
+ "properties": {
953
+ "outcome": {
954
+ "type": "string",
955
+ "description": "Diff outcome"
956
+ },
957
+ "user_visible_outcome": {
958
+ "type": "string",
959
+ "description": "User-visible outcome"
960
+ },
961
+ "group_id": {
962
+ "anyOf": [
963
+ {
964
+ "type": "string"
965
+ },
966
+ {
967
+ "type": "null"
968
+ }
969
+ ],
970
+ "description": "Group ID"
971
+ },
972
+ "width": {
973
+ "anyOf": [
974
+ {
975
+ "type": "number"
976
+ },
977
+ {
978
+ "type": "null"
979
+ }
980
+ ],
981
+ "description": "Screenshot width"
982
+ },
983
+ "mismatch_pixels": {
984
+ "anyOf": [
985
+ {
986
+ "type": "number"
987
+ },
988
+ {
989
+ "type": "null"
990
+ }
991
+ ],
992
+ "description": "Number of mismatched pixels"
993
+ },
994
+ "diff_hash": {
995
+ "anyOf": [
996
+ {
997
+ "type": "string"
998
+ },
999
+ {
1000
+ "type": "null"
1001
+ }
1002
+ ],
1003
+ "description": "Diff hash for deduplication"
1004
+ },
1005
+ "base_screenshot": {
1006
+ "anyOf": [
1007
+ {
1008
+ "type": "object",
1009
+ "properties": {
1010
+ "filename": {
1011
+ "type": "string",
1012
+ "description": "Screenshot filename"
1013
+ },
1014
+ "public_url": {
1015
+ "type": "string",
1016
+ "description": "Signed URL to screenshot image"
1017
+ },
1018
+ "replay_id": {
1019
+ "description": "Replay ID",
1020
+ "type": "string"
1021
+ },
1022
+ "route_url": {
1023
+ "description": "Page URL",
1024
+ "type": "string"
1025
+ },
1026
+ "route_group": {
1027
+ "description": "Route group",
1028
+ "type": "string"
1029
+ },
1030
+ "identifier_type": {
1031
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
1032
+ "type": "string"
1033
+ },
1034
+ "event_number": {
1035
+ "description": "Event number for after-event screenshots",
1036
+ "type": "number"
1037
+ }
1038
+ },
1039
+ "required": [
1040
+ "filename",
1041
+ "public_url"
1042
+ ],
1043
+ "additionalProperties": false
1044
+ },
1045
+ {
1046
+ "type": "null"
1047
+ }
1048
+ ],
1049
+ "description": "Base (expected) screenshot"
1050
+ },
1051
+ "head_screenshot": {
1052
+ "anyOf": [
1053
+ {
1054
+ "type": "object",
1055
+ "properties": {
1056
+ "filename": {
1057
+ "type": "string",
1058
+ "description": "Screenshot filename"
1059
+ },
1060
+ "public_url": {
1061
+ "type": "string",
1062
+ "description": "Signed URL to screenshot image"
1063
+ },
1064
+ "replay_id": {
1065
+ "description": "Replay ID",
1066
+ "type": "string"
1067
+ },
1068
+ "route_url": {
1069
+ "description": "Page URL",
1070
+ "type": "string"
1071
+ },
1072
+ "route_group": {
1073
+ "description": "Route group",
1074
+ "type": "string"
1075
+ },
1076
+ "identifier_type": {
1077
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
1078
+ "type": "string"
1079
+ },
1080
+ "event_number": {
1081
+ "description": "Event number for after-event screenshots",
1082
+ "type": "number"
1083
+ }
1084
+ },
1085
+ "required": [
1086
+ "filename",
1087
+ "public_url"
1088
+ ],
1089
+ "additionalProperties": false
1090
+ },
1091
+ {
1092
+ "type": "null"
1093
+ }
1094
+ ],
1095
+ "description": "Head (actual) screenshot"
1096
+ },
1097
+ "diff_url_thumb": {
1098
+ "anyOf": [
1099
+ {
1100
+ "type": "string"
1101
+ },
1102
+ {
1103
+ "type": "null"
1104
+ }
1105
+ ],
1106
+ "description": "Diff thumbnail URL"
1107
+ },
1108
+ "diff_url_full": {
1109
+ "anyOf": [
1110
+ {
1111
+ "type": "string"
1112
+ },
1113
+ {
1114
+ "type": "null"
1115
+ }
1116
+ ],
1117
+ "description": "Full diff image URL"
1118
+ },
1119
+ "changed_class_names": {
1120
+ "type": "array",
1121
+ "items": {
1122
+ "type": "string"
1123
+ },
1124
+ "description": "CSS class names of changed sections"
1125
+ }
1126
+ },
1127
+ "required": [
1128
+ "outcome",
1129
+ "user_visible_outcome",
1130
+ "group_id",
1131
+ "width",
1132
+ "mismatch_pixels",
1133
+ "diff_hash",
1134
+ "base_screenshot",
1135
+ "head_screenshot",
1136
+ "diff_url_thumb",
1137
+ "diff_url_full",
1138
+ "changed_class_names"
1139
+ ],
1140
+ "additionalProperties": false
1141
+ }
1142
+ }
1143
+ },
1144
+ "required": [
1145
+ "replay_diff_id",
1146
+ "head_replay",
1147
+ "base_replay",
1148
+ "screenshot_diffs"
1149
+ ],
1150
+ "additionalProperties": false
1151
+ }
1152
+ },
1153
+ "test_case_screenshots": {
1154
+ "type": "array",
1155
+ "items": {
1156
+ "type": "object",
1157
+ "properties": {
1158
+ "replay_id": {
1159
+ "type": "string",
1160
+ "description": "Replay ID"
1161
+ },
1162
+ "replay_status": {
1163
+ "anyOf": [
1164
+ {
1165
+ "type": "string"
1166
+ },
1167
+ {
1168
+ "type": "null"
1169
+ }
1170
+ ],
1171
+ "description": "Replay status"
1172
+ },
1173
+ "replay_accurate": {
1174
+ "anyOf": [
1175
+ {
1176
+ "type": "boolean"
1177
+ },
1178
+ {
1179
+ "type": "null"
1180
+ }
1181
+ ],
1182
+ "description": "Whether replay was accurate"
1183
+ },
1184
+ "app_url": {
1185
+ "anyOf": [
1186
+ {
1187
+ "type": "string"
1188
+ },
1189
+ {
1190
+ "type": "null"
1191
+ }
1192
+ ],
1193
+ "description": "Application URL"
1194
+ },
1195
+ "session_id": {
1196
+ "anyOf": [
1197
+ {
1198
+ "type": "string"
1199
+ },
1200
+ {
1201
+ "type": "null"
1202
+ }
1203
+ ],
1204
+ "description": "Source session ID"
1205
+ },
1206
+ "screenshots": {
1207
+ "type": "array",
1208
+ "items": {
1209
+ "type": "object",
1210
+ "properties": {
1211
+ "filename": {
1212
+ "type": "string",
1213
+ "description": "Screenshot filename"
1214
+ },
1215
+ "public_url": {
1216
+ "type": "string",
1217
+ "description": "Signed URL to screenshot image"
1218
+ },
1219
+ "replay_id": {
1220
+ "description": "Replay ID",
1221
+ "type": "string"
1222
+ },
1223
+ "route_url": {
1224
+ "description": "Page URL",
1225
+ "type": "string"
1226
+ },
1227
+ "route_group": {
1228
+ "description": "Route group",
1229
+ "type": "string"
1230
+ },
1231
+ "identifier_type": {
1232
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
1233
+ "type": "string"
1234
+ },
1235
+ "event_number": {
1236
+ "description": "Event number for after-event screenshots",
1237
+ "type": "number"
1238
+ }
1239
+ },
1240
+ "required": [
1241
+ "filename",
1242
+ "public_url"
1243
+ ],
1244
+ "additionalProperties": false
1245
+ }
1246
+ }
1247
+ },
1248
+ "required": [
1249
+ "replay_id",
1250
+ "replay_status",
1251
+ "replay_accurate",
1252
+ "app_url",
1253
+ "session_id",
1254
+ "screenshots"
1255
+ ],
1256
+ "additionalProperties": false
1257
+ }
1258
+ }
1259
+ },
1260
+ "required": [
1261
+ "diffs",
1262
+ "test_case_screenshots"
1263
+ ],
1264
+ "additionalProperties": false
1265
+ }
1266
+ },
1267
+ {
1268
+ "name": "get_test_run_diffs",
1269
+ "displayName": "Get Test Run Diffs",
1270
+ "description": "Get replay diffs for a test run. Each diff compares a head replay against a base replay. Set only_with_screenshot_diffs=true to skip diffs that have no visual differences (many diffs are structural-only with empty screenshot_diffs). Use compare_replays with the base_replay.id to see full comparison details including screenshots.",
1271
+ "summary": "Get replay diffs for a test run",
1272
+ "icon": "diff",
1273
+ "group": "Test Runs",
1274
+ "input_schema": {
1275
+ "type": "object",
1276
+ "properties": {
1277
+ "test_run_id": {
1278
+ "type": "string",
1279
+ "description": "Test run ID"
1280
+ },
1281
+ "only_with_screenshot_diffs": {
1282
+ "default": false,
1283
+ "description": "Only return diffs that have actual visual screenshot differences",
1284
+ "type": "boolean"
1285
+ },
1286
+ "limit": {
1287
+ "default": 100,
1288
+ "description": "Max results to return",
1289
+ "type": "number"
1290
+ },
1291
+ "offset": {
1292
+ "default": 0,
1293
+ "description": "Offset for pagination",
1294
+ "type": "number"
1295
+ }
1296
+ },
1297
+ "required": [
1298
+ "test_run_id",
1299
+ "only_with_screenshot_diffs",
1300
+ "limit",
1301
+ "offset"
1302
+ ],
1303
+ "additionalProperties": false
1304
+ },
1305
+ "output_schema": {
1306
+ "type": "object",
1307
+ "properties": {
1308
+ "total_fetched": {
1309
+ "type": "number",
1310
+ "description": "Total diffs fetched from API before filtering"
1311
+ },
1312
+ "diffs": {
1313
+ "type": "array",
1314
+ "items": {
1315
+ "type": "object",
1316
+ "properties": {
1317
+ "replay_diff_id": {
1318
+ "type": "string",
1319
+ "description": "Replay diff ID"
1320
+ },
1321
+ "head_replay": {
1322
+ "type": "object",
1323
+ "properties": {
1324
+ "id": {
1325
+ "type": "string",
1326
+ "description": "Replay ID"
1327
+ },
1328
+ "status": {
1329
+ "anyOf": [
1330
+ {
1331
+ "type": "string"
1332
+ },
1333
+ {
1334
+ "type": "null"
1335
+ }
1336
+ ],
1337
+ "description": "Replay status (e.g., Success, Failure)"
1338
+ },
1339
+ "is_accurate": {
1340
+ "anyOf": [
1341
+ {
1342
+ "type": "boolean"
1343
+ },
1344
+ {
1345
+ "type": "null"
1346
+ }
1347
+ ],
1348
+ "description": "Whether replay was accurate"
1349
+ },
1350
+ "app_url": {
1351
+ "anyOf": [
1352
+ {
1353
+ "type": "string"
1354
+ },
1355
+ {
1356
+ "type": "null"
1357
+ }
1358
+ ],
1359
+ "description": "Application URL"
1360
+ }
1361
+ },
1362
+ "required": [
1363
+ "id",
1364
+ "status",
1365
+ "is_accurate",
1366
+ "app_url"
1367
+ ],
1368
+ "additionalProperties": false,
1369
+ "description": "Head (actual) replay"
1370
+ },
1371
+ "base_replay": {
1372
+ "type": "object",
1373
+ "properties": {
1374
+ "id": {
1375
+ "type": "string",
1376
+ "description": "Replay ID"
1377
+ },
1378
+ "status": {
1379
+ "anyOf": [
1380
+ {
1381
+ "type": "string"
1382
+ },
1383
+ {
1384
+ "type": "null"
1385
+ }
1386
+ ],
1387
+ "description": "Replay status (e.g., Success, Failure)"
1388
+ },
1389
+ "is_accurate": {
1390
+ "anyOf": [
1391
+ {
1392
+ "type": "boolean"
1393
+ },
1394
+ {
1395
+ "type": "null"
1396
+ }
1397
+ ],
1398
+ "description": "Whether replay was accurate"
1399
+ },
1400
+ "app_url": {
1401
+ "anyOf": [
1402
+ {
1403
+ "type": "string"
1404
+ },
1405
+ {
1406
+ "type": "null"
1407
+ }
1408
+ ],
1409
+ "description": "Application URL"
1410
+ }
1411
+ },
1412
+ "required": [
1413
+ "id",
1414
+ "status",
1415
+ "is_accurate",
1416
+ "app_url"
1417
+ ],
1418
+ "additionalProperties": false,
1419
+ "description": "Base (expected) replay"
1420
+ },
1421
+ "has_screenshot_diffs": {
1422
+ "type": "boolean",
1423
+ "description": "Whether this diff has visual screenshot differences"
1424
+ },
1425
+ "screenshot_diff_count": {
1426
+ "type": "number",
1427
+ "description": "Number of screenshot diffs"
1428
+ },
1429
+ "screenshot_diffs": {
1430
+ "type": "array",
1431
+ "items": {
1432
+ "type": "object",
1433
+ "properties": {
1434
+ "outcome": {
1435
+ "type": "string",
1436
+ "description": "Diff outcome"
1437
+ },
1438
+ "user_visible_outcome": {
1439
+ "type": "string",
1440
+ "description": "User-visible outcome"
1441
+ },
1442
+ "group_id": {
1443
+ "anyOf": [
1444
+ {
1445
+ "type": "string"
1446
+ },
1447
+ {
1448
+ "type": "null"
1449
+ }
1450
+ ],
1451
+ "description": "Group ID"
1452
+ },
1453
+ "width": {
1454
+ "anyOf": [
1455
+ {
1456
+ "type": "number"
1457
+ },
1458
+ {
1459
+ "type": "null"
1460
+ }
1461
+ ],
1462
+ "description": "Screenshot width"
1463
+ },
1464
+ "mismatch_pixels": {
1465
+ "anyOf": [
1466
+ {
1467
+ "type": "number"
1468
+ },
1469
+ {
1470
+ "type": "null"
1471
+ }
1472
+ ],
1473
+ "description": "Number of mismatched pixels"
1474
+ },
1475
+ "diff_hash": {
1476
+ "anyOf": [
1477
+ {
1478
+ "type": "string"
1479
+ },
1480
+ {
1481
+ "type": "null"
1482
+ }
1483
+ ],
1484
+ "description": "Diff hash for deduplication"
1485
+ },
1486
+ "base_screenshot": {
1487
+ "anyOf": [
1488
+ {
1489
+ "type": "object",
1490
+ "properties": {
1491
+ "filename": {
1492
+ "type": "string",
1493
+ "description": "Screenshot filename"
1494
+ },
1495
+ "public_url": {
1496
+ "type": "string",
1497
+ "description": "Signed URL to screenshot image"
1498
+ },
1499
+ "replay_id": {
1500
+ "description": "Replay ID",
1501
+ "type": "string"
1502
+ },
1503
+ "route_url": {
1504
+ "description": "Page URL",
1505
+ "type": "string"
1506
+ },
1507
+ "route_group": {
1508
+ "description": "Route group",
1509
+ "type": "string"
1510
+ },
1511
+ "identifier_type": {
1512
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
1513
+ "type": "string"
1514
+ },
1515
+ "event_number": {
1516
+ "description": "Event number for after-event screenshots",
1517
+ "type": "number"
1518
+ }
1519
+ },
1520
+ "required": [
1521
+ "filename",
1522
+ "public_url"
1523
+ ],
1524
+ "additionalProperties": false
1525
+ },
1526
+ {
1527
+ "type": "null"
1528
+ }
1529
+ ],
1530
+ "description": "Base (expected) screenshot"
1531
+ },
1532
+ "head_screenshot": {
1533
+ "anyOf": [
1534
+ {
1535
+ "type": "object",
1536
+ "properties": {
1537
+ "filename": {
1538
+ "type": "string",
1539
+ "description": "Screenshot filename"
1540
+ },
1541
+ "public_url": {
1542
+ "type": "string",
1543
+ "description": "Signed URL to screenshot image"
1544
+ },
1545
+ "replay_id": {
1546
+ "description": "Replay ID",
1547
+ "type": "string"
1548
+ },
1549
+ "route_url": {
1550
+ "description": "Page URL",
1551
+ "type": "string"
1552
+ },
1553
+ "route_group": {
1554
+ "description": "Route group",
1555
+ "type": "string"
1556
+ },
1557
+ "identifier_type": {
1558
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
1559
+ "type": "string"
1560
+ },
1561
+ "event_number": {
1562
+ "description": "Event number for after-event screenshots",
1563
+ "type": "number"
1564
+ }
1565
+ },
1566
+ "required": [
1567
+ "filename",
1568
+ "public_url"
1569
+ ],
1570
+ "additionalProperties": false
1571
+ },
1572
+ {
1573
+ "type": "null"
1574
+ }
1575
+ ],
1576
+ "description": "Head (actual) screenshot"
1577
+ },
1578
+ "diff_url_thumb": {
1579
+ "anyOf": [
1580
+ {
1581
+ "type": "string"
1582
+ },
1583
+ {
1584
+ "type": "null"
1585
+ }
1586
+ ],
1587
+ "description": "Diff thumbnail URL"
1588
+ },
1589
+ "diff_url_full": {
1590
+ "anyOf": [
1591
+ {
1592
+ "type": "string"
1593
+ },
1594
+ {
1595
+ "type": "null"
1596
+ }
1597
+ ],
1598
+ "description": "Full diff image URL"
1599
+ },
1600
+ "changed_class_names": {
1601
+ "type": "array",
1602
+ "items": {
1603
+ "type": "string"
1604
+ },
1605
+ "description": "CSS class names of changed sections"
1606
+ }
1607
+ },
1608
+ "required": [
1609
+ "outcome",
1610
+ "user_visible_outcome",
1611
+ "group_id",
1612
+ "width",
1613
+ "mismatch_pixels",
1614
+ "diff_hash",
1615
+ "base_screenshot",
1616
+ "head_screenshot",
1617
+ "diff_url_thumb",
1618
+ "diff_url_full",
1619
+ "changed_class_names"
1620
+ ],
1621
+ "additionalProperties": false
1622
+ }
1623
+ }
1624
+ },
1625
+ "required": [
1626
+ "replay_diff_id",
1627
+ "head_replay",
1628
+ "base_replay",
1629
+ "has_screenshot_diffs",
1630
+ "screenshot_diff_count",
1631
+ "screenshot_diffs"
1632
+ ],
1633
+ "additionalProperties": false
1634
+ }
1635
+ }
1636
+ },
1637
+ "required": [
1638
+ "total_fetched",
1639
+ "diffs"
1640
+ ],
1641
+ "additionalProperties": false
1642
+ }
1643
+ },
1644
+ {
1645
+ "name": "get_test_run_test_cases",
1646
+ "displayName": "Get Test Run Test Cases",
1647
+ "description": "Get test case results for a test run. Each test case has a head replay with status and accuracy info. A replay with is_accurate=false means the replay diverged from the original session (non-deterministic behavior, flaky). Note: test cases do not have a base replay — they represent individual session replays, not diff comparisons. For visual diffs, use get_test_run_diffs instead.",
1648
+ "summary": "Get test case results",
1649
+ "icon": "list-checks",
1650
+ "group": "Test Runs",
1651
+ "input_schema": {
1652
+ "type": "object",
1653
+ "properties": {
1654
+ "test_run_id": {
1655
+ "type": "string",
1656
+ "description": "Test run ID"
1657
+ },
1658
+ "include_passes": {
1659
+ "default": false,
1660
+ "description": "Include passing test cases (defaults to failures only)",
1661
+ "type": "boolean"
1662
+ },
1663
+ "limit": {
1664
+ "default": 100,
1665
+ "description": "Max results to return",
1666
+ "type": "number"
1667
+ },
1668
+ "offset": {
1669
+ "default": 0,
1670
+ "description": "Offset for pagination",
1671
+ "type": "number"
1672
+ }
1673
+ },
1674
+ "required": [
1675
+ "test_run_id",
1676
+ "include_passes",
1677
+ "limit",
1678
+ "offset"
1679
+ ],
1680
+ "additionalProperties": false
1681
+ },
1682
+ "output_schema": {
1683
+ "type": "object",
1684
+ "properties": {
1685
+ "test_cases": {
1686
+ "type": "array",
1687
+ "items": {
1688
+ "type": "object",
1689
+ "properties": {
1690
+ "replay_id": {
1691
+ "type": "string",
1692
+ "description": "Replay ID — use with get_replay for full details"
1693
+ },
1694
+ "replay_status": {
1695
+ "anyOf": [
1696
+ {
1697
+ "type": "string"
1698
+ },
1699
+ {
1700
+ "type": "null"
1701
+ }
1702
+ ],
1703
+ "description": "Replay execution status (Success = completed, may still be inaccurate)"
1704
+ },
1705
+ "replay_accurate": {
1706
+ "anyOf": [
1707
+ {
1708
+ "type": "boolean"
1709
+ },
1710
+ {
1711
+ "type": "null"
1712
+ }
1713
+ ],
1714
+ "description": "Whether the replay accurately reproduced the session. false = flaky/non-deterministic failure"
1715
+ },
1716
+ "app_url": {
1717
+ "anyOf": [
1718
+ {
1719
+ "type": "string"
1720
+ },
1721
+ {
1722
+ "type": "null"
1723
+ }
1724
+ ],
1725
+ "description": "Application URL used for replay"
1726
+ },
1727
+ "session_id": {
1728
+ "anyOf": [
1729
+ {
1730
+ "type": "string"
1731
+ },
1732
+ {
1733
+ "type": "null"
1734
+ }
1735
+ ],
1736
+ "description": "Source session ID — use with get_session_events to see original user interactions"
1737
+ },
1738
+ "screenshots": {
1739
+ "type": "array",
1740
+ "items": {
1741
+ "type": "object",
1742
+ "properties": {
1743
+ "filename": {
1744
+ "type": "string",
1745
+ "description": "Screenshot filename"
1746
+ },
1747
+ "public_url": {
1748
+ "type": "string",
1749
+ "description": "Signed URL to screenshot image"
1750
+ },
1751
+ "replay_id": {
1752
+ "description": "Replay ID",
1753
+ "type": "string"
1754
+ },
1755
+ "route_url": {
1756
+ "description": "Page URL",
1757
+ "type": "string"
1758
+ },
1759
+ "route_group": {
1760
+ "description": "Route group",
1761
+ "type": "string"
1762
+ },
1763
+ "identifier_type": {
1764
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
1765
+ "type": "string"
1766
+ },
1767
+ "event_number": {
1768
+ "description": "Event number for after-event screenshots",
1769
+ "type": "number"
1770
+ }
1771
+ },
1772
+ "required": [
1773
+ "filename",
1774
+ "public_url"
1775
+ ],
1776
+ "additionalProperties": false
1777
+ }
1778
+ }
1779
+ },
1780
+ "required": [
1781
+ "replay_id",
1782
+ "replay_status",
1783
+ "replay_accurate",
1784
+ "app_url",
1785
+ "session_id",
1786
+ "screenshots"
1787
+ ],
1788
+ "additionalProperties": false
1789
+ }
1790
+ }
1791
+ },
1792
+ "required": [
1793
+ "test_cases"
1794
+ ],
1795
+ "additionalProperties": false
1796
+ }
1797
+ },
1798
+ {
1799
+ "name": "get_test_run_coverage",
1800
+ "displayName": "Get Test Run Coverage",
1801
+ "description": "Get screenshot coverage data for a test run. Shows which routes have diffs, which were compared without diffs, and which were not compared. Use category filter to limit output size (defaults to with_diffs only). Use route_filter to search for specific routes.",
1802
+ "summary": "Get test run coverage",
1803
+ "icon": "shield-check",
1804
+ "group": "Test Runs",
1805
+ "input_schema": {
1806
+ "type": "object",
1807
+ "properties": {
1808
+ "test_run_id": {
1809
+ "type": "string",
1810
+ "description": "Test run ID"
1811
+ },
1812
+ "pr_mode": {
1813
+ "default": true,
1814
+ "description": "Whether to use PR mode for coverage calculation",
1815
+ "type": "boolean"
1816
+ },
1817
+ "replay_id": {
1818
+ "description": "Optional replay ID to scope coverage to",
1819
+ "type": "string"
1820
+ },
1821
+ "category": {
1822
+ "default": "with_diffs",
1823
+ "description": "Coverage category to return (defaults to with_diffs to limit response size)",
1824
+ "type": "string",
1825
+ "enum": [
1826
+ "with_diffs",
1827
+ "without_diffs",
1828
+ "not_compared",
1829
+ "all"
1830
+ ]
1831
+ },
1832
+ "route_filter": {
1833
+ "description": "Filter routes by substring match on route URL or group",
1834
+ "type": "string"
1835
+ },
1836
+ "limit": {
1837
+ "default": 50,
1838
+ "description": "Max routes to return per category",
1839
+ "type": "number"
1840
+ }
1841
+ },
1842
+ "required": [
1843
+ "test_run_id",
1844
+ "pr_mode",
1845
+ "category",
1846
+ "limit"
1847
+ ],
1848
+ "additionalProperties": false
1849
+ },
1850
+ "output_schema": {
1851
+ "type": "object",
1852
+ "properties": {
1853
+ "test_run": {
1854
+ "type": "object",
1855
+ "properties": {
1856
+ "id": {
1857
+ "type": "string",
1858
+ "description": "Test run ID"
1859
+ },
1860
+ "status": {
1861
+ "type": "string",
1862
+ "description": "Test run status"
1863
+ },
1864
+ "commit_sha": {
1865
+ "anyOf": [
1866
+ {
1867
+ "type": "string"
1868
+ },
1869
+ {
1870
+ "type": "null"
1871
+ }
1872
+ ],
1873
+ "description": "Git commit SHA"
1874
+ },
1875
+ "created_at": {
1876
+ "type": "string",
1877
+ "description": "ISO 8601 creation timestamp"
1878
+ },
1879
+ "updated_at": {
1880
+ "type": "string",
1881
+ "description": "ISO 8601 update timestamp"
1882
+ },
1883
+ "project_name": {
1884
+ "type": "string",
1885
+ "description": "Project name"
1886
+ },
1887
+ "organization_name": {
1888
+ "type": "string",
1889
+ "description": "Organization name"
1890
+ },
1891
+ "stats": {
1892
+ "anyOf": [
1893
+ {
1894
+ "type": "object",
1895
+ "properties": {
1896
+ "total_screenshots": {
1897
+ "type": "number",
1898
+ "description": "Total screenshots compared"
1899
+ },
1900
+ "total_sessions": {
1901
+ "type": "number",
1902
+ "description": "Total sessions"
1903
+ },
1904
+ "total_sessions_replayed": {
1905
+ "anyOf": [
1906
+ {
1907
+ "type": "number"
1908
+ },
1909
+ {
1910
+ "type": "null"
1911
+ }
1912
+ ],
1913
+ "description": "Sessions successfully replayed"
1914
+ },
1915
+ "sessions_skipped": {
1916
+ "anyOf": [
1917
+ {
1918
+ "type": "number"
1919
+ },
1920
+ {
1921
+ "type": "null"
1922
+ }
1923
+ ],
1924
+ "description": "Sessions skipped"
1925
+ },
1926
+ "screenshots_skipped": {
1927
+ "anyOf": [
1928
+ {
1929
+ "type": "number"
1930
+ },
1931
+ {
1932
+ "type": "null"
1933
+ }
1934
+ ],
1935
+ "description": "Screenshots skipped"
1936
+ }
1937
+ },
1938
+ "required": [
1939
+ "total_screenshots",
1940
+ "total_sessions",
1941
+ "total_sessions_replayed",
1942
+ "sessions_skipped",
1943
+ "screenshots_skipped"
1944
+ ],
1945
+ "additionalProperties": false
1946
+ },
1947
+ {
1948
+ "type": "null"
1949
+ }
1950
+ ],
1951
+ "description": "Test run statistics"
1952
+ },
1953
+ "ci_provider": {
1954
+ "anyOf": [
1955
+ {
1956
+ "type": "string"
1957
+ },
1958
+ {
1959
+ "type": "null"
1960
+ }
1961
+ ],
1962
+ "description": "CI provider"
1963
+ },
1964
+ "pr_title": {
1965
+ "anyOf": [
1966
+ {
1967
+ "type": "string"
1968
+ },
1969
+ {
1970
+ "type": "null"
1971
+ }
1972
+ ],
1973
+ "description": "Pull request title"
1974
+ },
1975
+ "pr_number": {
1976
+ "anyOf": [
1977
+ {
1978
+ "type": "number"
1979
+ },
1980
+ {
1981
+ "type": "null"
1982
+ }
1983
+ ],
1984
+ "description": "Pull request number"
1985
+ },
1986
+ "pr_url": {
1987
+ "anyOf": [
1988
+ {
1989
+ "type": "string"
1990
+ },
1991
+ {
1992
+ "type": "null"
1993
+ }
1994
+ ],
1995
+ "description": "Pull request URL"
1996
+ },
1997
+ "approval_state": {
1998
+ "anyOf": [
1999
+ {
2000
+ "type": "string"
2001
+ },
2002
+ {
2003
+ "type": "null"
2004
+ }
2005
+ ],
2006
+ "description": "PR approval state"
2007
+ },
2008
+ "describe_tested": {
2009
+ "anyOf": [
2010
+ {
2011
+ "type": "string"
2012
+ },
2013
+ {
2014
+ "type": "null"
2015
+ }
2016
+ ],
2017
+ "description": "Description of what was tested"
2018
+ }
2019
+ },
2020
+ "required": [
2021
+ "id",
2022
+ "status",
2023
+ "commit_sha",
2024
+ "created_at",
2025
+ "updated_at",
2026
+ "project_name",
2027
+ "organization_name",
2028
+ "stats",
2029
+ "ci_provider",
2030
+ "pr_title",
2031
+ "pr_number",
2032
+ "pr_url",
2033
+ "approval_state",
2034
+ "describe_tested"
2035
+ ],
2036
+ "additionalProperties": false
2037
+ },
2038
+ "coverage": {
2039
+ "type": "object",
2040
+ "properties": {
2041
+ "with_diffs": {
2042
+ "type": "array",
2043
+ "items": {
2044
+ "type": "object",
2045
+ "properties": {
2046
+ "route_group": {
2047
+ "anyOf": [
2048
+ {
2049
+ "type": "string"
2050
+ },
2051
+ {
2052
+ "type": "null"
2053
+ }
2054
+ ],
2055
+ "description": "Route group"
2056
+ },
2057
+ "route_url": {
2058
+ "anyOf": [
2059
+ {
2060
+ "type": "string"
2061
+ },
2062
+ {
2063
+ "type": "null"
2064
+ }
2065
+ ],
2066
+ "description": "Route URL"
2067
+ },
2068
+ "screenshots": {
2069
+ "type": "array",
2070
+ "items": {
2071
+ "type": "object",
2072
+ "properties": {
2073
+ "filename": {
2074
+ "type": "string",
2075
+ "description": "Screenshot filename"
2076
+ },
2077
+ "public_url": {
2078
+ "type": "string",
2079
+ "description": "Signed URL to screenshot image"
2080
+ },
2081
+ "replay_id": {
2082
+ "description": "Replay ID",
2083
+ "type": "string"
2084
+ },
2085
+ "route_url": {
2086
+ "description": "Page URL",
2087
+ "type": "string"
2088
+ },
2089
+ "route_group": {
2090
+ "description": "Route group",
2091
+ "type": "string"
2092
+ },
2093
+ "identifier_type": {
2094
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
2095
+ "type": "string"
2096
+ },
2097
+ "event_number": {
2098
+ "description": "Event number for after-event screenshots",
2099
+ "type": "number"
2100
+ }
2101
+ },
2102
+ "required": [
2103
+ "filename",
2104
+ "public_url"
2105
+ ],
2106
+ "additionalProperties": false
2107
+ },
2108
+ "description": "Screenshots for this route"
2109
+ }
2110
+ },
2111
+ "required": [
2112
+ "route_group",
2113
+ "route_url",
2114
+ "screenshots"
2115
+ ],
2116
+ "additionalProperties": false
2117
+ },
2118
+ "description": "Routes with screenshot diffs"
2119
+ },
2120
+ "without_diffs": {
2121
+ "type": "array",
2122
+ "items": {
2123
+ "type": "object",
2124
+ "properties": {
2125
+ "route_group": {
2126
+ "anyOf": [
2127
+ {
2128
+ "type": "string"
2129
+ },
2130
+ {
2131
+ "type": "null"
2132
+ }
2133
+ ],
2134
+ "description": "Route group"
2135
+ },
2136
+ "route_url": {
2137
+ "anyOf": [
2138
+ {
2139
+ "type": "string"
2140
+ },
2141
+ {
2142
+ "type": "null"
2143
+ }
2144
+ ],
2145
+ "description": "Route URL"
2146
+ },
2147
+ "screenshots": {
2148
+ "type": "array",
2149
+ "items": {
2150
+ "type": "object",
2151
+ "properties": {
2152
+ "filename": {
2153
+ "type": "string",
2154
+ "description": "Screenshot filename"
2155
+ },
2156
+ "public_url": {
2157
+ "type": "string",
2158
+ "description": "Signed URL to screenshot image"
2159
+ },
2160
+ "replay_id": {
2161
+ "description": "Replay ID",
2162
+ "type": "string"
2163
+ },
2164
+ "route_url": {
2165
+ "description": "Page URL",
2166
+ "type": "string"
2167
+ },
2168
+ "route_group": {
2169
+ "description": "Route group",
2170
+ "type": "string"
2171
+ },
2172
+ "identifier_type": {
2173
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
2174
+ "type": "string"
2175
+ },
2176
+ "event_number": {
2177
+ "description": "Event number for after-event screenshots",
2178
+ "type": "number"
2179
+ }
2180
+ },
2181
+ "required": [
2182
+ "filename",
2183
+ "public_url"
2184
+ ],
2185
+ "additionalProperties": false
2186
+ },
2187
+ "description": "Screenshots for this route"
2188
+ }
2189
+ },
2190
+ "required": [
2191
+ "route_group",
2192
+ "route_url",
2193
+ "screenshots"
2194
+ ],
2195
+ "additionalProperties": false
2196
+ },
2197
+ "description": "Routes compared but without diffs"
2198
+ },
2199
+ "not_compared": {
2200
+ "type": "array",
2201
+ "items": {
2202
+ "type": "object",
2203
+ "properties": {
2204
+ "route_group": {
2205
+ "anyOf": [
2206
+ {
2207
+ "type": "string"
2208
+ },
2209
+ {
2210
+ "type": "null"
2211
+ }
2212
+ ],
2213
+ "description": "Route group"
2214
+ },
2215
+ "route_url": {
2216
+ "anyOf": [
2217
+ {
2218
+ "type": "string"
2219
+ },
2220
+ {
2221
+ "type": "null"
2222
+ }
2223
+ ],
2224
+ "description": "Route URL"
2225
+ },
2226
+ "screenshots": {
2227
+ "type": "array",
2228
+ "items": {
2229
+ "type": "object",
2230
+ "properties": {
2231
+ "filename": {
2232
+ "type": "string",
2233
+ "description": "Screenshot filename"
2234
+ },
2235
+ "public_url": {
2236
+ "type": "string",
2237
+ "description": "Signed URL to screenshot image"
2238
+ },
2239
+ "replay_id": {
2240
+ "description": "Replay ID",
2241
+ "type": "string"
2242
+ },
2243
+ "route_url": {
2244
+ "description": "Page URL",
2245
+ "type": "string"
2246
+ },
2247
+ "route_group": {
2248
+ "description": "Route group",
2249
+ "type": "string"
2250
+ },
2251
+ "identifier_type": {
2252
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
2253
+ "type": "string"
2254
+ },
2255
+ "event_number": {
2256
+ "description": "Event number for after-event screenshots",
2257
+ "type": "number"
2258
+ }
2259
+ },
2260
+ "required": [
2261
+ "filename",
2262
+ "public_url"
2263
+ ],
2264
+ "additionalProperties": false
2265
+ },
2266
+ "description": "Screenshots for this route"
2267
+ }
2268
+ },
2269
+ "required": [
2270
+ "route_group",
2271
+ "route_url",
2272
+ "screenshots"
2273
+ ],
2274
+ "additionalProperties": false
2275
+ },
2276
+ "description": "Routes not compared"
2277
+ },
2278
+ "num_unmapped_files": {
2279
+ "type": "number",
2280
+ "description": "Number of unmapped source files"
2281
+ },
2282
+ "total_with_diffs": {
2283
+ "type": "number",
2284
+ "description": "Total routes with diffs (before filtering)"
2285
+ },
2286
+ "total_without_diffs": {
2287
+ "type": "number",
2288
+ "description": "Total routes without diffs (before filtering)"
2289
+ },
2290
+ "total_not_compared": {
2291
+ "type": "number",
2292
+ "description": "Total routes not compared (before filtering)"
2293
+ }
2294
+ },
2295
+ "required": [
2296
+ "with_diffs",
2297
+ "without_diffs",
2298
+ "not_compared",
2299
+ "num_unmapped_files",
2300
+ "total_with_diffs",
2301
+ "total_without_diffs",
2302
+ "total_not_compared"
2303
+ ],
2304
+ "additionalProperties": false
2305
+ }
2306
+ },
2307
+ "required": [
2308
+ "test_run",
2309
+ "coverage"
2310
+ ],
2311
+ "additionalProperties": false
2312
+ }
2313
+ },
2314
+ {
2315
+ "name": "get_test_run_source_code",
2316
+ "displayName": "Get Test Run Source Code",
2317
+ "description": "Get the source code of a file at the commit of a specific test run.",
2318
+ "summary": "Get source code for a test run commit",
2319
+ "icon": "file-code",
2320
+ "group": "Test Runs",
2321
+ "input_schema": {
2322
+ "type": "object",
2323
+ "properties": {
2324
+ "test_run_id": {
2325
+ "type": "string",
2326
+ "description": "Test run ID"
2327
+ },
2328
+ "path": {
2329
+ "type": "string",
2330
+ "description": "File path relative to repository root"
2331
+ }
2332
+ },
2333
+ "required": [
2334
+ "test_run_id",
2335
+ "path"
2336
+ ],
2337
+ "additionalProperties": false
2338
+ },
2339
+ "output_schema": {
2340
+ "type": "object",
2341
+ "properties": {
2342
+ "test_run_id": {
2343
+ "type": "string"
2344
+ },
2345
+ "source_code": {
2346
+ "anyOf": [
2347
+ {
2348
+ "type": "string"
2349
+ },
2350
+ {
2351
+ "type": "null"
2352
+ }
2353
+ ],
2354
+ "description": "File source code content"
2355
+ }
2356
+ },
2357
+ "required": [
2358
+ "test_run_id",
2359
+ "source_code"
2360
+ ],
2361
+ "additionalProperties": false
2362
+ }
2363
+ },
2364
+ {
2365
+ "name": "get_test_run_pr_description",
2366
+ "displayName": "Get Test Run PR Description",
2367
+ "description": "Get the pull request description associated with a test run.",
2368
+ "summary": "Get PR description for a test run",
2369
+ "icon": "file-text",
2370
+ "group": "Test Runs",
2371
+ "input_schema": {
2372
+ "type": "object",
2373
+ "properties": {
2374
+ "test_run_id": {
2375
+ "type": "string",
2376
+ "description": "Test run ID"
2377
+ }
2378
+ },
2379
+ "required": [
2380
+ "test_run_id"
2381
+ ],
2382
+ "additionalProperties": false
2383
+ },
2384
+ "output_schema": {
2385
+ "type": "object",
2386
+ "properties": {
2387
+ "test_run_id": {
2388
+ "type": "string"
2389
+ },
2390
+ "pr_description": {
2391
+ "anyOf": [
2392
+ {
2393
+ "type": "string"
2394
+ },
2395
+ {
2396
+ "type": "null"
2397
+ }
2398
+ ],
2399
+ "description": "Pull request description text"
2400
+ }
2401
+ },
2402
+ "required": [
2403
+ "test_run_id",
2404
+ "pr_description"
2405
+ ],
2406
+ "additionalProperties": false
2407
+ }
2408
+ },
2409
+ {
2410
+ "name": "accept_all_diffs",
2411
+ "displayName": "Accept All Diffs",
2412
+ "description": "Accept (approve) all visual differences in a test run. This marks all screenshot diffs as expected/approved for the associated pull request.",
2413
+ "summary": "Approve all diffs in a test run",
2414
+ "icon": "check-circle",
2415
+ "group": "Test Runs",
2416
+ "input_schema": {
2417
+ "type": "object",
2418
+ "properties": {
2419
+ "pull_request_id": {
2420
+ "type": "string",
2421
+ "description": "Pull request ID (from test run's pullRequest.id field)"
2422
+ },
2423
+ "test_run_id": {
2424
+ "type": "string",
2425
+ "description": "Test run ID"
2426
+ }
2427
+ },
2428
+ "required": [
2429
+ "pull_request_id",
2430
+ "test_run_id"
2431
+ ],
2432
+ "additionalProperties": false
2433
+ },
2434
+ "output_schema": {
2435
+ "type": "object",
2436
+ "properties": {
2437
+ "approval_state": {
2438
+ "anyOf": [
2439
+ {
2440
+ "type": "string"
2441
+ },
2442
+ {
2443
+ "type": "null"
2444
+ }
2445
+ ],
2446
+ "description": "Updated PR approval state"
2447
+ }
2448
+ },
2449
+ "required": [
2450
+ "approval_state"
2451
+ ],
2452
+ "additionalProperties": false
2453
+ }
2454
+ },
2455
+ {
2456
+ "name": "check_for_flakes",
2457
+ "displayName": "Check for Flakes",
2458
+ "description": "Trigger a flake detection check for a test run. Re-runs failing tests multiple times to determine if failures are flaky (non-deterministic).",
2459
+ "summary": "Check for flaky tests",
2460
+ "icon": "refresh-cw",
2461
+ "group": "Test Runs",
2462
+ "input_schema": {
2463
+ "type": "object",
2464
+ "properties": {
2465
+ "test_run_id": {
2466
+ "type": "string",
2467
+ "description": "Test run ID"
2468
+ },
2469
+ "rerun_count": {
2470
+ "default": 3,
2471
+ "description": "Number of times to re-run tests for flake detection",
2472
+ "type": "number"
2473
+ }
2474
+ },
2475
+ "required": [
2476
+ "test_run_id",
2477
+ "rerun_count"
2478
+ ],
2479
+ "additionalProperties": false
2480
+ },
2481
+ "output_schema": {
2482
+ "type": "object",
2483
+ "properties": {
2484
+ "id": {
2485
+ "anyOf": [
2486
+ {
2487
+ "type": "string"
2488
+ },
2489
+ {
2490
+ "type": "null"
2491
+ }
2492
+ ],
2493
+ "description": "ID of the flake check run"
2494
+ }
2495
+ },
2496
+ "required": [
2497
+ "id"
2498
+ ],
2499
+ "additionalProperties": false
2500
+ }
2501
+ },
2502
+ {
2503
+ "name": "create_label_action",
2504
+ "displayName": "Create Label Action",
2505
+ "description": "Label a specific screenshot diff as approved or rejected. Use this to approve or reject individual visual differences within a test run.",
2506
+ "summary": "Label a screenshot diff",
2507
+ "icon": "tag",
2508
+ "group": "Test Runs",
2509
+ "input_schema": {
2510
+ "type": "object",
2511
+ "properties": {
2512
+ "test_run_id": {
2513
+ "type": "string",
2514
+ "description": "Test run ID"
2515
+ },
2516
+ "replay_diff_id": {
2517
+ "description": "Replay diff ID",
2518
+ "type": "string"
2519
+ },
2520
+ "screenshot_file_name": {
2521
+ "description": "Screenshot filename",
2522
+ "type": "string"
2523
+ },
2524
+ "label": {
2525
+ "type": "string",
2526
+ "description": "Label to apply (e.g., approved, rejected)"
2527
+ }
2528
+ },
2529
+ "required": [
2530
+ "test_run_id",
2531
+ "label"
2532
+ ],
2533
+ "additionalProperties": false
2534
+ },
2535
+ "output_schema": {
2536
+ "type": "object",
2537
+ "properties": {
2538
+ "label_action": {
2539
+ "type": "object",
2540
+ "properties": {
2541
+ "id": {
2542
+ "type": "string",
2543
+ "description": "Label action ID"
2544
+ },
2545
+ "replay_diff_id": {
2546
+ "type": "string",
2547
+ "description": "Replay diff ID"
2548
+ },
2549
+ "screenshot_file_name": {
2550
+ "type": "string",
2551
+ "description": "Screenshot filename"
2552
+ },
2553
+ "label": {
2554
+ "type": "string",
2555
+ "description": "Label (e.g., approved, rejected)"
2556
+ },
2557
+ "created_at": {
2558
+ "type": "string",
2559
+ "description": "ISO 8601 creation timestamp"
2560
+ }
2561
+ },
2562
+ "required": [
2563
+ "id",
2564
+ "replay_diff_id",
2565
+ "screenshot_file_name",
2566
+ "label",
2567
+ "created_at"
2568
+ ],
2569
+ "additionalProperties": false
2570
+ }
2571
+ },
2572
+ "required": [
2573
+ "label_action"
2574
+ ],
2575
+ "additionalProperties": false
2576
+ }
2577
+ },
2578
+ {
2579
+ "name": "upsert_diff_approval",
2580
+ "displayName": "Upsert Diff Approval",
2581
+ "description": "Approve or reject one or more screenshot diffs in bulk. Updates the approval state of diffs for a test run.",
2582
+ "summary": "Bulk approve/reject diffs",
2583
+ "icon": "check-square",
2584
+ "group": "Test Runs",
2585
+ "input_schema": {
2586
+ "type": "object",
2587
+ "properties": {
2588
+ "test_run_id": {
2589
+ "type": "string",
2590
+ "description": "Test run ID"
2591
+ },
2592
+ "approvals": {
2593
+ "type": "array",
2594
+ "items": {
2595
+ "type": "object",
2596
+ "properties": {
2597
+ "replay_diff_id": {
2598
+ "type": "string",
2599
+ "description": "Replay diff ID"
2600
+ },
2601
+ "screenshot_file_name": {
2602
+ "type": "string",
2603
+ "description": "Screenshot filename"
2604
+ },
2605
+ "approved": {
2606
+ "type": "boolean",
2607
+ "description": "Whether to approve (true) or reject (false)"
2608
+ }
2609
+ },
2610
+ "required": [
2611
+ "replay_diff_id",
2612
+ "screenshot_file_name",
2613
+ "approved"
2614
+ ],
2615
+ "additionalProperties": false
2616
+ },
2617
+ "description": "List of diff approval states to set"
2618
+ }
2619
+ },
2620
+ "required": [
2621
+ "test_run_id",
2622
+ "approvals"
2623
+ ],
2624
+ "additionalProperties": false
2625
+ },
2626
+ "output_schema": {
2627
+ "type": "object",
2628
+ "properties": {
2629
+ "success": {
2630
+ "type": "boolean"
2631
+ }
2632
+ },
2633
+ "required": [
2634
+ "success"
2635
+ ],
2636
+ "additionalProperties": false
2637
+ }
2638
+ },
2639
+ {
2640
+ "name": "get_replay",
2641
+ "displayName": "Get Replay",
2642
+ "description": "Get detailed information about a specific replay including its status, accuracy, and associated session.",
2643
+ "summary": "Get replay details",
2644
+ "icon": "video",
2645
+ "group": "Replays",
2646
+ "input_schema": {
2647
+ "type": "object",
2648
+ "properties": {
2649
+ "replay_id": {
2650
+ "type": "string",
2651
+ "description": "Replay ID"
2652
+ }
2653
+ },
2654
+ "required": [
2655
+ "replay_id"
2656
+ ],
2657
+ "additionalProperties": false
2658
+ },
2659
+ "output_schema": {
2660
+ "type": "object",
2661
+ "properties": {
2662
+ "replay": {
2663
+ "type": "object",
2664
+ "properties": {
2665
+ "id": {
2666
+ "type": "string",
2667
+ "description": "Replay ID"
2668
+ },
2669
+ "status": {
2670
+ "type": "string",
2671
+ "description": "Replay status"
2672
+ },
2673
+ "commit_sha": {
2674
+ "anyOf": [
2675
+ {
2676
+ "type": "string"
2677
+ },
2678
+ {
2679
+ "type": "null"
2680
+ }
2681
+ ],
2682
+ "description": "Git commit SHA"
2683
+ },
2684
+ "is_accurate": {
2685
+ "anyOf": [
2686
+ {
2687
+ "type": "boolean"
2688
+ },
2689
+ {
2690
+ "type": "null"
2691
+ }
2692
+ ],
2693
+ "description": "Whether replay is accurate"
2694
+ },
2695
+ "app_url": {
2696
+ "anyOf": [
2697
+ {
2698
+ "type": "string"
2699
+ },
2700
+ {
2701
+ "type": "null"
2702
+ }
2703
+ ],
2704
+ "description": "Application URL"
2705
+ },
2706
+ "session_id": {
2707
+ "anyOf": [
2708
+ {
2709
+ "type": "string"
2710
+ },
2711
+ {
2712
+ "type": "null"
2713
+ }
2714
+ ],
2715
+ "description": "Source session ID"
2716
+ },
2717
+ "created_at": {
2718
+ "type": "string",
2719
+ "description": "ISO 8601 creation timestamp"
2720
+ },
2721
+ "project_name": {
2722
+ "anyOf": [
2723
+ {
2724
+ "type": "string"
2725
+ },
2726
+ {
2727
+ "type": "null"
2728
+ }
2729
+ ],
2730
+ "description": "Project name"
2731
+ },
2732
+ "organization_name": {
2733
+ "anyOf": [
2734
+ {
2735
+ "type": "string"
2736
+ },
2737
+ {
2738
+ "type": "null"
2739
+ }
2740
+ ],
2741
+ "description": "Organization name"
2742
+ }
2743
+ },
2744
+ "required": [
2745
+ "id",
2746
+ "status",
2747
+ "commit_sha",
2748
+ "is_accurate",
2749
+ "app_url",
2750
+ "session_id",
2751
+ "created_at",
2752
+ "project_name",
2753
+ "organization_name"
2754
+ ],
2755
+ "additionalProperties": false
2756
+ }
2757
+ },
2758
+ "required": [
2759
+ "replay"
2760
+ ],
2761
+ "additionalProperties": false
2762
+ }
2763
+ },
2764
+ {
2765
+ "name": "list_replays",
2766
+ "displayName": "List Replays",
2767
+ "description": "List replays for a specific project.",
2768
+ "summary": "List replays for a project",
2769
+ "icon": "list",
2770
+ "group": "Replays",
2771
+ "input_schema": {
2772
+ "type": "object",
2773
+ "properties": {
2774
+ "project_id": {
2775
+ "type": "string",
2776
+ "description": "Project ID"
2777
+ },
2778
+ "count": {
2779
+ "default": 50,
2780
+ "description": "Number of replays to return",
2781
+ "type": "number"
2782
+ }
2783
+ },
2784
+ "required": [
2785
+ "project_id",
2786
+ "count"
2787
+ ],
2788
+ "additionalProperties": false
2789
+ },
2790
+ "output_schema": {
2791
+ "type": "object",
2792
+ "properties": {
2793
+ "replays": {
2794
+ "type": "array",
2795
+ "items": {
2796
+ "type": "object",
2797
+ "properties": {
2798
+ "id": {
2799
+ "type": "string",
2800
+ "description": "Replay ID"
2801
+ },
2802
+ "status": {
2803
+ "type": "string",
2804
+ "description": "Replay status"
2805
+ },
2806
+ "commit_sha": {
2807
+ "anyOf": [
2808
+ {
2809
+ "type": "string"
2810
+ },
2811
+ {
2812
+ "type": "null"
2813
+ }
2814
+ ],
2815
+ "description": "Git commit SHA"
2816
+ },
2817
+ "is_accurate": {
2818
+ "anyOf": [
2819
+ {
2820
+ "type": "boolean"
2821
+ },
2822
+ {
2823
+ "type": "null"
2824
+ }
2825
+ ],
2826
+ "description": "Whether replay is accurate"
2827
+ },
2828
+ "app_url": {
2829
+ "anyOf": [
2830
+ {
2831
+ "type": "string"
2832
+ },
2833
+ {
2834
+ "type": "null"
2835
+ }
2836
+ ],
2837
+ "description": "Application URL"
2838
+ },
2839
+ "session_id": {
2840
+ "anyOf": [
2841
+ {
2842
+ "type": "string"
2843
+ },
2844
+ {
2845
+ "type": "null"
2846
+ }
2847
+ ],
2848
+ "description": "Source session ID"
2849
+ },
2850
+ "created_at": {
2851
+ "type": "string",
2852
+ "description": "ISO 8601 creation timestamp"
2853
+ },
2854
+ "project_name": {
2855
+ "anyOf": [
2856
+ {
2857
+ "type": "string"
2858
+ },
2859
+ {
2860
+ "type": "null"
2861
+ }
2862
+ ],
2863
+ "description": "Project name"
2864
+ },
2865
+ "organization_name": {
2866
+ "anyOf": [
2867
+ {
2868
+ "type": "string"
2869
+ },
2870
+ {
2871
+ "type": "null"
2872
+ }
2873
+ ],
2874
+ "description": "Organization name"
2875
+ }
2876
+ },
2877
+ "required": [
2878
+ "id",
2879
+ "status",
2880
+ "commit_sha",
2881
+ "is_accurate",
2882
+ "app_url",
2883
+ "session_id",
2884
+ "created_at",
2885
+ "project_name",
2886
+ "organization_name"
2887
+ ],
2888
+ "additionalProperties": false
2889
+ }
2890
+ }
2891
+ },
2892
+ "required": [
2893
+ "replays"
2894
+ ],
2895
+ "additionalProperties": false
2896
+ }
2897
+ },
2898
+ {
2899
+ "name": "get_replay_screenshots",
2900
+ "displayName": "Get Replay Screenshots",
2901
+ "description": "Get all screenshots captured during a specific replay.",
2902
+ "summary": "Get screenshots for a replay",
2903
+ "icon": "image",
2904
+ "group": "Replays",
2905
+ "input_schema": {
2906
+ "type": "object",
2907
+ "properties": {
2908
+ "replay_id": {
2909
+ "type": "string",
2910
+ "description": "Replay ID"
2911
+ }
2912
+ },
2913
+ "required": [
2914
+ "replay_id"
2915
+ ],
2916
+ "additionalProperties": false
2917
+ },
2918
+ "output_schema": {
2919
+ "type": "object",
2920
+ "properties": {
2921
+ "replay_id": {
2922
+ "type": "string"
2923
+ },
2924
+ "screenshots": {
2925
+ "type": "array",
2926
+ "items": {
2927
+ "type": "object",
2928
+ "properties": {
2929
+ "filename": {
2930
+ "type": "string",
2931
+ "description": "Screenshot filename"
2932
+ },
2933
+ "public_url": {
2934
+ "type": "string",
2935
+ "description": "Signed URL to screenshot image"
2936
+ },
2937
+ "replay_id": {
2938
+ "description": "Replay ID",
2939
+ "type": "string"
2940
+ },
2941
+ "route_url": {
2942
+ "description": "Page URL",
2943
+ "type": "string"
2944
+ },
2945
+ "route_group": {
2946
+ "description": "Route group",
2947
+ "type": "string"
2948
+ },
2949
+ "identifier_type": {
2950
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
2951
+ "type": "string"
2952
+ },
2953
+ "event_number": {
2954
+ "description": "Event number for after-event screenshots",
2955
+ "type": "number"
2956
+ }
2957
+ },
2958
+ "required": [
2959
+ "filename",
2960
+ "public_url"
2961
+ ],
2962
+ "additionalProperties": false
2963
+ }
2964
+ }
2965
+ },
2966
+ "required": [
2967
+ "replay_id",
2968
+ "screenshots"
2969
+ ],
2970
+ "additionalProperties": false
2971
+ }
2972
+ },
2973
+ {
2974
+ "name": "compare_replays",
2975
+ "displayName": "Compare Replays",
2976
+ "description": "Compare a head replay against its base replay within a test run. Returns screenshot diffs with base/head/diff image URLs, divergences, and replay metadata. Use the base_replay_id from get_test_run_diffs results.",
2977
+ "summary": "Compare replays in a test run",
2978
+ "icon": "columns",
2979
+ "group": "Replays",
2980
+ "input_schema": {
2981
+ "type": "object",
2982
+ "properties": {
2983
+ "test_run_id": {
2984
+ "type": "string",
2985
+ "description": "Test run ID"
2986
+ },
2987
+ "base_replay_id": {
2988
+ "type": "string",
2989
+ "description": "Base replay ID (from get_test_run_diffs base_replay.id)"
2990
+ }
2991
+ },
2992
+ "required": [
2993
+ "test_run_id",
2994
+ "base_replay_id"
2995
+ ],
2996
+ "additionalProperties": false
2997
+ },
2998
+ "output_schema": {
2999
+ "type": "object",
3000
+ "properties": {
3001
+ "diff_id": {
3002
+ "anyOf": [
3003
+ {
3004
+ "type": "string"
3005
+ },
3006
+ {
3007
+ "type": "null"
3008
+ }
3009
+ ],
3010
+ "description": "Replay diff ID"
3011
+ },
3012
+ "divergences": {
3013
+ "anyOf": [
3014
+ {
3015
+ "type": "array",
3016
+ "items": {
3017
+ "type": "string"
3018
+ }
3019
+ },
3020
+ {
3021
+ "type": "null"
3022
+ }
3023
+ ],
3024
+ "description": "Structural divergences between replays (list of divergence descriptions)"
3025
+ },
3026
+ "head_replay": {
3027
+ "anyOf": [
3028
+ {
3029
+ "type": "object",
3030
+ "properties": {
3031
+ "id": {
3032
+ "type": "string",
3033
+ "description": "Replay ID"
3034
+ },
3035
+ "status": {
3036
+ "anyOf": [
3037
+ {
3038
+ "type": "string"
3039
+ },
3040
+ {
3041
+ "type": "null"
3042
+ }
3043
+ ],
3044
+ "description": "Replay status (e.g., Success, Failure)"
3045
+ },
3046
+ "is_accurate": {
3047
+ "anyOf": [
3048
+ {
3049
+ "type": "boolean"
3050
+ },
3051
+ {
3052
+ "type": "null"
3053
+ }
3054
+ ],
3055
+ "description": "Whether replay was accurate"
3056
+ },
3057
+ "app_url": {
3058
+ "anyOf": [
3059
+ {
3060
+ "type": "string"
3061
+ },
3062
+ {
3063
+ "type": "null"
3064
+ }
3065
+ ],
3066
+ "description": "Application URL"
3067
+ }
3068
+ },
3069
+ "required": [
3070
+ "id",
3071
+ "status",
3072
+ "is_accurate",
3073
+ "app_url"
3074
+ ],
3075
+ "additionalProperties": false
3076
+ },
3077
+ {
3078
+ "type": "null"
3079
+ }
3080
+ ],
3081
+ "description": "Head replay info"
3082
+ },
3083
+ "base_replay": {
3084
+ "anyOf": [
3085
+ {
3086
+ "type": "object",
3087
+ "properties": {
3088
+ "id": {
3089
+ "type": "string",
3090
+ "description": "Replay ID"
3091
+ },
3092
+ "status": {
3093
+ "anyOf": [
3094
+ {
3095
+ "type": "string"
3096
+ },
3097
+ {
3098
+ "type": "null"
3099
+ }
3100
+ ],
3101
+ "description": "Replay status (e.g., Success, Failure)"
3102
+ },
3103
+ "is_accurate": {
3104
+ "anyOf": [
3105
+ {
3106
+ "type": "boolean"
3107
+ },
3108
+ {
3109
+ "type": "null"
3110
+ }
3111
+ ],
3112
+ "description": "Whether replay was accurate"
3113
+ },
3114
+ "app_url": {
3115
+ "anyOf": [
3116
+ {
3117
+ "type": "string"
3118
+ },
3119
+ {
3120
+ "type": "null"
3121
+ }
3122
+ ],
3123
+ "description": "Application URL"
3124
+ }
3125
+ },
3126
+ "required": [
3127
+ "id",
3128
+ "status",
3129
+ "is_accurate",
3130
+ "app_url"
3131
+ ],
3132
+ "additionalProperties": false
3133
+ },
3134
+ {
3135
+ "type": "null"
3136
+ }
3137
+ ],
3138
+ "description": "Base replay info"
3139
+ },
3140
+ "head_screenshots": {
3141
+ "type": "array",
3142
+ "items": {
3143
+ "type": "object",
3144
+ "properties": {
3145
+ "filename": {
3146
+ "type": "string",
3147
+ "description": "Screenshot filename"
3148
+ },
3149
+ "public_url": {
3150
+ "type": "string",
3151
+ "description": "Signed URL to screenshot image"
3152
+ },
3153
+ "replay_id": {
3154
+ "description": "Replay ID",
3155
+ "type": "string"
3156
+ },
3157
+ "route_url": {
3158
+ "description": "Page URL",
3159
+ "type": "string"
3160
+ },
3161
+ "route_group": {
3162
+ "description": "Route group",
3163
+ "type": "string"
3164
+ },
3165
+ "identifier_type": {
3166
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
3167
+ "type": "string"
3168
+ },
3169
+ "event_number": {
3170
+ "description": "Event number for after-event screenshots",
3171
+ "type": "number"
3172
+ }
3173
+ },
3174
+ "required": [
3175
+ "filename",
3176
+ "public_url"
3177
+ ],
3178
+ "additionalProperties": false
3179
+ },
3180
+ "description": "Head replay screenshots"
3181
+ },
3182
+ "base_screenshots": {
3183
+ "type": "array",
3184
+ "items": {
3185
+ "type": "object",
3186
+ "properties": {
3187
+ "filename": {
3188
+ "type": "string",
3189
+ "description": "Screenshot filename"
3190
+ },
3191
+ "public_url": {
3192
+ "type": "string",
3193
+ "description": "Signed URL to screenshot image"
3194
+ },
3195
+ "replay_id": {
3196
+ "description": "Replay ID",
3197
+ "type": "string"
3198
+ },
3199
+ "route_url": {
3200
+ "description": "Page URL",
3201
+ "type": "string"
3202
+ },
3203
+ "route_group": {
3204
+ "description": "Route group",
3205
+ "type": "string"
3206
+ },
3207
+ "identifier_type": {
3208
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
3209
+ "type": "string"
3210
+ },
3211
+ "event_number": {
3212
+ "description": "Event number for after-event screenshots",
3213
+ "type": "number"
3214
+ }
3215
+ },
3216
+ "required": [
3217
+ "filename",
3218
+ "public_url"
3219
+ ],
3220
+ "additionalProperties": false
3221
+ },
3222
+ "description": "Base replay screenshots"
3223
+ },
3224
+ "screenshot_diffs": {
3225
+ "type": "array",
3226
+ "items": {
3227
+ "type": "object",
3228
+ "properties": {
3229
+ "outcome": {
3230
+ "type": "string",
3231
+ "description": "Diff outcome"
3232
+ },
3233
+ "user_visible_outcome": {
3234
+ "type": "string",
3235
+ "description": "User-visible outcome"
3236
+ },
3237
+ "group_id": {
3238
+ "anyOf": [
3239
+ {
3240
+ "type": "string"
3241
+ },
3242
+ {
3243
+ "type": "null"
3244
+ }
3245
+ ],
3246
+ "description": "Group ID"
3247
+ },
3248
+ "width": {
3249
+ "anyOf": [
3250
+ {
3251
+ "type": "number"
3252
+ },
3253
+ {
3254
+ "type": "null"
3255
+ }
3256
+ ],
3257
+ "description": "Screenshot width"
3258
+ },
3259
+ "mismatch_pixels": {
3260
+ "anyOf": [
3261
+ {
3262
+ "type": "number"
3263
+ },
3264
+ {
3265
+ "type": "null"
3266
+ }
3267
+ ],
3268
+ "description": "Number of mismatched pixels"
3269
+ },
3270
+ "diff_hash": {
3271
+ "anyOf": [
3272
+ {
3273
+ "type": "string"
3274
+ },
3275
+ {
3276
+ "type": "null"
3277
+ }
3278
+ ],
3279
+ "description": "Diff hash for deduplication"
3280
+ },
3281
+ "base_screenshot": {
3282
+ "anyOf": [
3283
+ {
3284
+ "type": "object",
3285
+ "properties": {
3286
+ "filename": {
3287
+ "type": "string",
3288
+ "description": "Screenshot filename"
3289
+ },
3290
+ "public_url": {
3291
+ "type": "string",
3292
+ "description": "Signed URL to screenshot image"
3293
+ },
3294
+ "replay_id": {
3295
+ "description": "Replay ID",
3296
+ "type": "string"
3297
+ },
3298
+ "route_url": {
3299
+ "description": "Page URL",
3300
+ "type": "string"
3301
+ },
3302
+ "route_group": {
3303
+ "description": "Route group",
3304
+ "type": "string"
3305
+ },
3306
+ "identifier_type": {
3307
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
3308
+ "type": "string"
3309
+ },
3310
+ "event_number": {
3311
+ "description": "Event number for after-event screenshots",
3312
+ "type": "number"
3313
+ }
3314
+ },
3315
+ "required": [
3316
+ "filename",
3317
+ "public_url"
3318
+ ],
3319
+ "additionalProperties": false
3320
+ },
3321
+ {
3322
+ "type": "null"
3323
+ }
3324
+ ],
3325
+ "description": "Base (expected) screenshot"
3326
+ },
3327
+ "head_screenshot": {
3328
+ "anyOf": [
3329
+ {
3330
+ "type": "object",
3331
+ "properties": {
3332
+ "filename": {
3333
+ "type": "string",
3334
+ "description": "Screenshot filename"
3335
+ },
3336
+ "public_url": {
3337
+ "type": "string",
3338
+ "description": "Signed URL to screenshot image"
3339
+ },
3340
+ "replay_id": {
3341
+ "description": "Replay ID",
3342
+ "type": "string"
3343
+ },
3344
+ "route_url": {
3345
+ "description": "Page URL",
3346
+ "type": "string"
3347
+ },
3348
+ "route_group": {
3349
+ "description": "Route group",
3350
+ "type": "string"
3351
+ },
3352
+ "identifier_type": {
3353
+ "description": "Screenshot type (e.g., ScreenshotAfterEvent, EndStateScreenshot)",
3354
+ "type": "string"
3355
+ },
3356
+ "event_number": {
3357
+ "description": "Event number for after-event screenshots",
3358
+ "type": "number"
3359
+ }
3360
+ },
3361
+ "required": [
3362
+ "filename",
3363
+ "public_url"
3364
+ ],
3365
+ "additionalProperties": false
3366
+ },
3367
+ {
3368
+ "type": "null"
3369
+ }
3370
+ ],
3371
+ "description": "Head (actual) screenshot"
3372
+ },
3373
+ "diff_url_thumb": {
3374
+ "anyOf": [
3375
+ {
3376
+ "type": "string"
3377
+ },
3378
+ {
3379
+ "type": "null"
3380
+ }
3381
+ ],
3382
+ "description": "Diff thumbnail URL"
3383
+ },
3384
+ "diff_url_full": {
3385
+ "anyOf": [
3386
+ {
3387
+ "type": "string"
3388
+ },
3389
+ {
3390
+ "type": "null"
3391
+ }
3392
+ ],
3393
+ "description": "Full diff image URL"
3394
+ },
3395
+ "changed_class_names": {
3396
+ "type": "array",
3397
+ "items": {
3398
+ "type": "string"
3399
+ },
3400
+ "description": "CSS class names of changed sections"
3401
+ }
3402
+ },
3403
+ "required": [
3404
+ "outcome",
3405
+ "user_visible_outcome",
3406
+ "group_id",
3407
+ "width",
3408
+ "mismatch_pixels",
3409
+ "diff_hash",
3410
+ "base_screenshot",
3411
+ "head_screenshot",
3412
+ "diff_url_thumb",
3413
+ "diff_url_full",
3414
+ "changed_class_names"
3415
+ ],
3416
+ "additionalProperties": false
3417
+ },
3418
+ "description": "Visual differences between screenshots"
3419
+ }
3420
+ },
3421
+ "required": [
3422
+ "diff_id",
3423
+ "divergences",
3424
+ "head_replay",
3425
+ "base_replay",
3426
+ "head_screenshots",
3427
+ "base_screenshots",
3428
+ "screenshot_diffs"
3429
+ ],
3430
+ "additionalProperties": false
3431
+ }
3432
+ },
3433
+ {
3434
+ "name": "list_sessions",
3435
+ "displayName": "List Sessions",
3436
+ "description": "List recorded user sessions for a project.",
3437
+ "summary": "List sessions for a project",
3438
+ "icon": "monitor",
3439
+ "group": "Sessions",
3440
+ "input_schema": {
3441
+ "type": "object",
3442
+ "properties": {
3443
+ "project_id": {
3444
+ "type": "string",
3445
+ "description": "Project ID"
3446
+ },
3447
+ "count": {
3448
+ "default": 50,
3449
+ "description": "Number of sessions to return",
3450
+ "type": "number"
3451
+ }
3452
+ },
3453
+ "required": [
3454
+ "project_id",
3455
+ "count"
3456
+ ],
3457
+ "additionalProperties": false
3458
+ },
3459
+ "output_schema": {
3460
+ "type": "object",
3461
+ "properties": {
3462
+ "sessions": {
3463
+ "type": "array",
3464
+ "items": {
3465
+ "type": "object",
3466
+ "properties": {
3467
+ "id": {
3468
+ "type": "string",
3469
+ "description": "Session ID"
3470
+ },
3471
+ "project_id": {
3472
+ "type": "string",
3473
+ "description": "Project ID"
3474
+ },
3475
+ "project_name": {
3476
+ "type": "string",
3477
+ "description": "Project name"
3478
+ },
3479
+ "hostname": {
3480
+ "anyOf": [
3481
+ {
3482
+ "type": "string"
3483
+ },
3484
+ {
3485
+ "type": "null"
3486
+ }
3487
+ ],
3488
+ "description": "Recording hostname"
3489
+ },
3490
+ "datetime": {
3491
+ "anyOf": [
3492
+ {
3493
+ "type": "string"
3494
+ },
3495
+ {
3496
+ "type": "null"
3497
+ }
3498
+ ],
3499
+ "description": "Session datetime"
3500
+ },
3501
+ "num_user_events": {
3502
+ "anyOf": [
3503
+ {
3504
+ "type": "number"
3505
+ },
3506
+ {
3507
+ "type": "null"
3508
+ }
3509
+ ],
3510
+ "description": "Number of user events"
3511
+ },
3512
+ "num_bytes": {
3513
+ "anyOf": [
3514
+ {
3515
+ "type": "number"
3516
+ },
3517
+ {
3518
+ "type": "null"
3519
+ }
3520
+ ],
3521
+ "description": "Size in bytes"
3522
+ },
3523
+ "source": {
3524
+ "anyOf": [
3525
+ {
3526
+ "type": "string"
3527
+ },
3528
+ {
3529
+ "type": "null"
3530
+ }
3531
+ ],
3532
+ "description": "Recording source"
3533
+ },
3534
+ "start_url": {
3535
+ "anyOf": [
3536
+ {
3537
+ "type": "string"
3538
+ },
3539
+ {
3540
+ "type": "null"
3541
+ }
3542
+ ],
3543
+ "description": "Starting URL"
3544
+ },
3545
+ "abandoned": {
3546
+ "anyOf": [
3547
+ {
3548
+ "type": "boolean"
3549
+ },
3550
+ {
3551
+ "type": "null"
3552
+ }
3553
+ ],
3554
+ "description": "Whether session was abandoned"
3555
+ },
3556
+ "description": {
3557
+ "anyOf": [
3558
+ {
3559
+ "type": "string"
3560
+ },
3561
+ {
3562
+ "type": "null"
3563
+ }
3564
+ ],
3565
+ "description": "Session description"
3566
+ }
3567
+ },
3568
+ "required": [
3569
+ "id",
3570
+ "project_id",
3571
+ "project_name",
3572
+ "hostname",
3573
+ "datetime",
3574
+ "num_user_events",
3575
+ "num_bytes",
3576
+ "source",
3577
+ "start_url",
3578
+ "abandoned",
3579
+ "description"
3580
+ ],
3581
+ "additionalProperties": false
3582
+ }
3583
+ }
3584
+ },
3585
+ "required": [
3586
+ "sessions"
3587
+ ],
3588
+ "additionalProperties": false
3589
+ }
3590
+ },
3591
+ {
3592
+ "name": "get_session",
3593
+ "displayName": "Get Session",
3594
+ "description": "Get detailed information about a specific recorded user session.",
3595
+ "summary": "Get session details",
3596
+ "icon": "monitor",
3597
+ "group": "Sessions",
3598
+ "input_schema": {
3599
+ "type": "object",
3600
+ "properties": {
3601
+ "session_id": {
3602
+ "type": "string",
3603
+ "description": "Session ID"
3604
+ }
3605
+ },
3606
+ "required": [
3607
+ "session_id"
3608
+ ],
3609
+ "additionalProperties": false
3610
+ },
3611
+ "output_schema": {
3612
+ "type": "object",
3613
+ "properties": {
3614
+ "session": {
3615
+ "type": "object",
3616
+ "properties": {
3617
+ "id": {
3618
+ "type": "string",
3619
+ "description": "Session ID"
3620
+ },
3621
+ "project_id": {
3622
+ "type": "string",
3623
+ "description": "Project ID"
3624
+ },
3625
+ "project_name": {
3626
+ "type": "string",
3627
+ "description": "Project name"
3628
+ },
3629
+ "hostname": {
3630
+ "anyOf": [
3631
+ {
3632
+ "type": "string"
3633
+ },
3634
+ {
3635
+ "type": "null"
3636
+ }
3637
+ ],
3638
+ "description": "Recording hostname"
3639
+ },
3640
+ "datetime": {
3641
+ "anyOf": [
3642
+ {
3643
+ "type": "string"
3644
+ },
3645
+ {
3646
+ "type": "null"
3647
+ }
3648
+ ],
3649
+ "description": "Session datetime"
3650
+ },
3651
+ "num_user_events": {
3652
+ "anyOf": [
3653
+ {
3654
+ "type": "number"
3655
+ },
3656
+ {
3657
+ "type": "null"
3658
+ }
3659
+ ],
3660
+ "description": "Number of user events"
3661
+ },
3662
+ "num_bytes": {
3663
+ "anyOf": [
3664
+ {
3665
+ "type": "number"
3666
+ },
3667
+ {
3668
+ "type": "null"
3669
+ }
3670
+ ],
3671
+ "description": "Size in bytes"
3672
+ },
3673
+ "source": {
3674
+ "anyOf": [
3675
+ {
3676
+ "type": "string"
3677
+ },
3678
+ {
3679
+ "type": "null"
3680
+ }
3681
+ ],
3682
+ "description": "Recording source"
3683
+ },
3684
+ "start_url": {
3685
+ "anyOf": [
3686
+ {
3687
+ "type": "string"
3688
+ },
3689
+ {
3690
+ "type": "null"
3691
+ }
3692
+ ],
3693
+ "description": "Starting URL"
3694
+ },
3695
+ "abandoned": {
3696
+ "anyOf": [
3697
+ {
3698
+ "type": "boolean"
3699
+ },
3700
+ {
3701
+ "type": "null"
3702
+ }
3703
+ ],
3704
+ "description": "Whether session was abandoned"
3705
+ },
3706
+ "description": {
3707
+ "anyOf": [
3708
+ {
3709
+ "type": "string"
3710
+ },
3711
+ {
3712
+ "type": "null"
3713
+ }
3714
+ ],
3715
+ "description": "Session description"
3716
+ }
3717
+ },
3718
+ "required": [
3719
+ "id",
3720
+ "project_id",
3721
+ "project_name",
3722
+ "hostname",
3723
+ "datetime",
3724
+ "num_user_events",
3725
+ "num_bytes",
3726
+ "source",
3727
+ "start_url",
3728
+ "abandoned",
3729
+ "description"
3730
+ ],
3731
+ "additionalProperties": false
3732
+ }
3733
+ },
3734
+ "required": [
3735
+ "session"
3736
+ ],
3737
+ "additionalProperties": false
3738
+ }
3739
+ },
3740
+ {
3741
+ "name": "search_sessions",
3742
+ "displayName": "Search Sessions",
3743
+ "description": "Search recorded sessions by query string within a project.",
3744
+ "summary": "Search sessions",
3745
+ "icon": "search",
3746
+ "group": "Sessions",
3747
+ "input_schema": {
3748
+ "type": "object",
3749
+ "properties": {
3750
+ "project_id": {
3751
+ "type": "string",
3752
+ "description": "Project ID to search within"
3753
+ },
3754
+ "query": {
3755
+ "type": "string",
3756
+ "description": "Search query string"
3757
+ },
3758
+ "count": {
3759
+ "default": 50,
3760
+ "description": "Number of results to return",
3761
+ "type": "number"
3762
+ },
3763
+ "offset": {
3764
+ "default": 0,
3765
+ "description": "Offset for pagination",
3766
+ "type": "number"
3767
+ },
3768
+ "include_empty_sessions": {
3769
+ "default": false,
3770
+ "description": "Include sessions with no user events",
3771
+ "type": "boolean"
3772
+ },
3773
+ "include_automated_sessions": {
3774
+ "default": false,
3775
+ "description": "Include automated/bot sessions",
3776
+ "type": "boolean"
3777
+ }
3778
+ },
3779
+ "required": [
3780
+ "project_id",
3781
+ "query",
3782
+ "count",
3783
+ "offset",
3784
+ "include_empty_sessions",
3785
+ "include_automated_sessions"
3786
+ ],
3787
+ "additionalProperties": false
3788
+ },
3789
+ "output_schema": {
3790
+ "type": "object",
3791
+ "properties": {
3792
+ "sessions": {
3793
+ "type": "array",
3794
+ "items": {
3795
+ "type": "object",
3796
+ "properties": {
3797
+ "id": {
3798
+ "type": "string",
3799
+ "description": "Session ID"
3800
+ },
3801
+ "project_id": {
3802
+ "type": "string",
3803
+ "description": "Project ID"
3804
+ },
3805
+ "project_name": {
3806
+ "type": "string",
3807
+ "description": "Project name"
3808
+ },
3809
+ "hostname": {
3810
+ "anyOf": [
3811
+ {
3812
+ "type": "string"
3813
+ },
3814
+ {
3815
+ "type": "null"
3816
+ }
3817
+ ],
3818
+ "description": "Recording hostname"
3819
+ },
3820
+ "datetime": {
3821
+ "anyOf": [
3822
+ {
3823
+ "type": "string"
3824
+ },
3825
+ {
3826
+ "type": "null"
3827
+ }
3828
+ ],
3829
+ "description": "Session datetime"
3830
+ },
3831
+ "num_user_events": {
3832
+ "anyOf": [
3833
+ {
3834
+ "type": "number"
3835
+ },
3836
+ {
3837
+ "type": "null"
3838
+ }
3839
+ ],
3840
+ "description": "Number of user events"
3841
+ },
3842
+ "num_bytes": {
3843
+ "anyOf": [
3844
+ {
3845
+ "type": "number"
3846
+ },
3847
+ {
3848
+ "type": "null"
3849
+ }
3850
+ ],
3851
+ "description": "Size in bytes"
3852
+ },
3853
+ "source": {
3854
+ "anyOf": [
3855
+ {
3856
+ "type": "string"
3857
+ },
3858
+ {
3859
+ "type": "null"
3860
+ }
3861
+ ],
3862
+ "description": "Recording source"
3863
+ },
3864
+ "start_url": {
3865
+ "anyOf": [
3866
+ {
3867
+ "type": "string"
3868
+ },
3869
+ {
3870
+ "type": "null"
3871
+ }
3872
+ ],
3873
+ "description": "Starting URL"
3874
+ },
3875
+ "abandoned": {
3876
+ "anyOf": [
3877
+ {
3878
+ "type": "boolean"
3879
+ },
3880
+ {
3881
+ "type": "null"
3882
+ }
3883
+ ],
3884
+ "description": "Whether session was abandoned"
3885
+ },
3886
+ "description": {
3887
+ "anyOf": [
3888
+ {
3889
+ "type": "string"
3890
+ },
3891
+ {
3892
+ "type": "null"
3893
+ }
3894
+ ],
3895
+ "description": "Session description"
3896
+ }
3897
+ },
3898
+ "required": [
3899
+ "id",
3900
+ "project_id",
3901
+ "project_name",
3902
+ "hostname",
3903
+ "datetime",
3904
+ "num_user_events",
3905
+ "num_bytes",
3906
+ "source",
3907
+ "start_url",
3908
+ "abandoned",
3909
+ "description"
3910
+ ],
3911
+ "additionalProperties": false
3912
+ }
3913
+ }
3914
+ },
3915
+ "required": [
3916
+ "sessions"
3917
+ ],
3918
+ "additionalProperties": false
3919
+ }
3920
+ },
3921
+ {
3922
+ "name": "get_session_events",
3923
+ "displayName": "Get Session Events",
3924
+ "description": "Get the user interaction events (clicks, inputs, navigations) recorded during a session.",
3925
+ "summary": "Get user events in a session",
3926
+ "icon": "activity",
3927
+ "group": "Sessions",
3928
+ "input_schema": {
3929
+ "type": "object",
3930
+ "properties": {
3931
+ "session_id": {
3932
+ "type": "string",
3933
+ "description": "Session ID"
3934
+ }
3935
+ },
3936
+ "required": [
3937
+ "session_id"
3938
+ ],
3939
+ "additionalProperties": false
3940
+ },
3941
+ "output_schema": {
3942
+ "type": "object",
3943
+ "properties": {
3944
+ "session_id": {
3945
+ "type": "string"
3946
+ },
3947
+ "events": {
3948
+ "type": "array",
3949
+ "items": {
3950
+ "type": "object",
3951
+ "properties": {
3952
+ "type": {
3953
+ "type": "string",
3954
+ "description": "Event type (e.g., click, scroll, input)"
3955
+ },
3956
+ "timestamp": {
3957
+ "anyOf": [
3958
+ {
3959
+ "type": "number"
3960
+ },
3961
+ {
3962
+ "type": "null"
3963
+ }
3964
+ ],
3965
+ "description": "Event timestamp (ms)"
3966
+ },
3967
+ "selector": {
3968
+ "anyOf": [
3969
+ {
3970
+ "type": "string"
3971
+ },
3972
+ {
3973
+ "type": "null"
3974
+ }
3975
+ ],
3976
+ "description": "CSS selector of target element"
3977
+ },
3978
+ "client_x": {
3979
+ "anyOf": [
3980
+ {
3981
+ "type": "number"
3982
+ },
3983
+ {
3984
+ "type": "null"
3985
+ }
3986
+ ],
3987
+ "description": "Mouse X coordinate"
3988
+ },
3989
+ "client_y": {
3990
+ "anyOf": [
3991
+ {
3992
+ "type": "number"
3993
+ },
3994
+ {
3995
+ "type": "null"
3996
+ }
3997
+ ],
3998
+ "description": "Mouse Y coordinate"
3999
+ }
4000
+ },
4001
+ "required": [
4002
+ "type",
4003
+ "timestamp",
4004
+ "selector",
4005
+ "client_x",
4006
+ "client_y"
4007
+ ],
4008
+ "additionalProperties": false
4009
+ }
4010
+ }
4011
+ },
4012
+ "required": [
4013
+ "session_id",
4014
+ "events"
4015
+ ],
4016
+ "additionalProperties": false
4017
+ }
4018
+ }
4019
+ ]
4020
+ }