playwright-e2e-mcp 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +150 -24
  2. package/dist/cli/ci.js +3 -0
  3. package/dist/cli/ci.js.map +1 -1
  4. package/dist/cli/doctor.d.ts +12 -1
  5. package/dist/cli/doctor.js +34 -4
  6. package/dist/cli/doctor.js.map +1 -1
  7. package/dist/cli/guard.d.ts +11 -0
  8. package/dist/cli/guard.js +80 -0
  9. package/dist/cli/guard.js.map +1 -0
  10. package/dist/cli/upload.d.ts +14 -0
  11. package/dist/cli/upload.js +81 -0
  12. package/dist/cli/upload.js.map +1 -0
  13. package/dist/discovery.d.ts +61 -0
  14. package/dist/discovery.js +108 -0
  15. package/dist/discovery.js.map +1 -0
  16. package/dist/http.d.ts +10 -1
  17. package/dist/http.js +50 -4
  18. package/dist/http.js.map +1 -1
  19. package/dist/index.js +28 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/oauth.d.ts +2 -0
  22. package/dist/oauth.js +1 -1
  23. package/dist/oauth.js.map +1 -1
  24. package/dist/server.d.ts +24 -4
  25. package/dist/server.js +98 -15
  26. package/dist/server.js.map +1 -1
  27. package/dist/skills.d.ts +23 -0
  28. package/dist/skills.js +101 -0
  29. package/dist/skills.js.map +1 -0
  30. package/dist/tools/analyze-history.d.ts +15 -0
  31. package/dist/tools/analyze-history.js +44 -9
  32. package/dist/tools/analyze-history.js.map +1 -1
  33. package/dist/tools/audit-accessibility.d.ts +6 -0
  34. package/dist/tools/audit-performance.d.ts +6 -0
  35. package/dist/tools/check-test-change.d.ts +44 -0
  36. package/dist/tools/check-test-change.js +132 -0
  37. package/dist/tools/check-test-change.js.map +1 -0
  38. package/dist/tools/compare-visual-state.d.ts +6 -0
  39. package/dist/tools/diagnose-flaky.js +5 -1
  40. package/dist/tools/diagnose-flaky.js.map +1 -1
  41. package/dist/tools/generate-e2e-test.d.ts +3 -0
  42. package/dist/tools/generate-e2e-test.js +3 -0
  43. package/dist/tools/generate-e2e-test.js.map +1 -1
  44. package/dist/tools/get-failure.js +3 -1
  45. package/dist/tools/get-failure.js.map +1 -1
  46. package/dist/tools/get-run-status.js +8 -2
  47. package/dist/tools/get-run-status.js.map +1 -1
  48. package/dist/tools/inspect-page.d.ts +6 -0
  49. package/dist/tools/inspect-page.js +3 -1
  50. package/dist/tools/inspect-page.js.map +1 -1
  51. package/dist/tools/list-tests.js +16 -12
  52. package/dist/tools/list-tests.js.map +1 -1
  53. package/dist/tools/probe-script.js +181 -15
  54. package/dist/tools/probe-script.js.map +1 -1
  55. package/dist/tools/quarantine.d.ts +61 -0
  56. package/dist/tools/quarantine.js +133 -0
  57. package/dist/tools/quarantine.js.map +1 -0
  58. package/dist/tools/run-test.d.ts +10 -1
  59. package/dist/tools/run-test.js +38 -6
  60. package/dist/tools/run-test.js.map +1 -1
  61. package/dist/tools/save-login.d.ts +145 -0
  62. package/dist/tools/save-login.js +264 -0
  63. package/dist/tools/save-login.js.map +1 -0
  64. package/dist/tools/shared.d.ts +49 -2
  65. package/dist/tools/shared.js +57 -6
  66. package/dist/tools/shared.js.map +1 -1
  67. package/dist/tools/structured.d.ts +8 -1
  68. package/dist/tools/structured.js +8 -1
  69. package/dist/tools/structured.js.map +1 -1
  70. package/dist/tools/suggest-fix.js +4 -0
  71. package/dist/tools/suggest-fix.js.map +1 -1
  72. package/dist/tools/validate-selector.d.ts +6 -0
  73. package/dist/tools/validate-selector.js +10 -2
  74. package/dist/tools/validate-selector.js.map +1 -1
  75. package/dist/types/index.d.ts +1 -1
  76. package/dist/utils/live-reporter.d.ts +29 -0
  77. package/dist/utils/live-reporter.js +145 -0
  78. package/dist/utils/live-reporter.js.map +1 -0
  79. package/dist/utils/playwright-runner.js +36 -14
  80. package/dist/utils/playwright-runner.js.map +1 -1
  81. package/dist/utils/pro-client.d.ts +29 -0
  82. package/dist/utils/pro-client.js +114 -0
  83. package/dist/utils/pro-client.js.map +1 -0
  84. package/dist/utils/pytest-runner.d.ts +102 -0
  85. package/dist/utils/pytest-runner.js +715 -0
  86. package/dist/utils/pytest-runner.js.map +1 -0
  87. package/dist/utils/quarantine.d.ts +64 -0
  88. package/dist/utils/quarantine.js +106 -0
  89. package/dist/utils/quarantine.js.map +1 -0
  90. package/dist/utils/test-change-guard.d.ts +90 -0
  91. package/dist/utils/test-change-guard.js +516 -0
  92. package/dist/utils/test-change-guard.js.map +1 -0
  93. package/dist/utils/totp.d.ts +26 -0
  94. package/dist/utils/totp.js +84 -0
  95. package/dist/utils/totp.js.map +1 -0
  96. package/dist/utils/update-check.d.ts +50 -0
  97. package/dist/utils/update-check.js +75 -0
  98. package/dist/utils/update-check.js.map +1 -0
  99. package/examples/github-actions/playwright-e2e.yml +80 -0
  100. package/examples/gitlab-ci/playwright-e2e.yml +71 -0
  101. package/package.json +2 -2
  102. package/skill/playwright-e2e-mcp/SKILL.md +45 -7
  103. package/skill/playwright-e2e-mcp/references/setup.md +12 -1
  104. package/skill/playwright-e2e-mcp/references/tools.md +42 -1
package/dist/server.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MCP server setup: creates the McpServer instance, registers the sixteen
2
+ * MCP server setup: creates the McpServer instance, registers the nineteen
3
3
  * tools (with spec tool annotations) and the workflow prompts, and wires
4
4
  * each invocation to a ToolContext (per-tool logger, abort signal, progress
5
5
  * reporter, shared store, default project root).
@@ -31,7 +31,7 @@ export interface CreateServerOptions {
31
31
  export declare const READ_ONLY_TOOLS: readonly string[];
32
32
  /**
33
33
  * Named tool sets for PW_MCP_TOOLS / --tools. Every tool definition costs
34
- * context on each request (all sixteen are ~12k tokens), so a client that
34
+ * context on each request (all nineteen are ~16k tokens), so a client that
35
35
  * only fixes failing suites can load the core loop alone.
36
36
  */
37
37
  export declare const TOOL_PROFILES: Readonly<Record<string, readonly string[]>>;
@@ -45,8 +45,28 @@ export declare function resolveToolSelection(spec: string | undefined): {
45
45
  unknown: string[];
46
46
  };
47
47
  export declare function resolveDefaultProjectRoot(): string;
48
+ /** The first protocol revision without sessions or the initialize handshake. */
49
+ export declare const MODERN_PROTOCOL_VERSION = "2026-07-28";
50
+ /**
51
+ * Protocol versions this server offers: the 2026-07-28 revision first, then
52
+ * every 2025-era version the SDK supports. PW_MCP_PROTOCOL=legacy drops the
53
+ * 2026 revision, for a client that misbehaves when it is offered.
54
+ */
55
+ export declare function supportedProtocolVersions(): string[];
56
+ /** The trace id from a request's `traceparent` (`00-<trace-id>-<span-id>-<flags>`), when valid. */
57
+ export declare function traceContext(meta: Record<string, unknown> | undefined): {
58
+ traceId?: string;
59
+ parentSpanId?: string;
60
+ };
48
61
  export declare function createServer(options?: CreateServerOptions): McpServer;
49
62
  /** Close the server, kill orphaned children, and exit. */
50
- export declare function shutdown(server: McpServer, code: number, reason: string): Promise<void>;
51
- /** Connect the server over stdio and install shutdown handlers. */
63
+ export declare function shutdown(server: {
64
+ close(): Promise<void>;
65
+ }, code: number, reason: string): Promise<void>;
66
+ /**
67
+ * Serve over stdio and install shutdown handlers. `serveStdio` lets the
68
+ * client's opening message pick the era: a 2026-07-28 client opens with
69
+ * `server/discover`, a 2025 client with `initialize`; either way one server
70
+ * from createServer() is pinned for the connection.
71
+ */
52
72
  export declare function startServer(): Promise<void>;
package/dist/server.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MCP server setup: creates the McpServer instance, registers the sixteen
2
+ * MCP server setup: creates the McpServer instance, registers the nineteen
3
3
  * tools (with spec tool annotations) and the workflow prompts, and wires
4
4
  * each invocation to a ToolContext (per-tool logger, abort signal, progress
5
5
  * reporter, shared store, default project root).
@@ -8,8 +8,8 @@
8
8
  */
9
9
  import { createRequire } from 'node:module';
10
10
  import { statSync } from 'node:fs';
11
- import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
12
- import { McpServer } from '@modelcontextprotocol/server';
11
+ import { serveStdio } from '@modelcontextprotocol/server/stdio';
12
+ import { McpServer, SUPPORTED_PROTOCOL_VERSIONS, TRACEPARENT_META_KEY } from '@modelcontextprotocol/server';
13
13
  import { toPlaywrightMcpError } from './types/index.js';
14
14
  import { logger } from './utils/logger.js';
15
15
  import { killActiveChildren } from './utils/playwright-runner.js';
@@ -30,8 +30,13 @@ import { getRunStatusTool } from './tools/get-run-status.js';
30
30
  import { loadReportTool } from './tools/load-report.js';
31
31
  import { auditTestsTool } from './tools/audit-tests.js';
32
32
  import { bisectFailureTool } from './tools/bisect-failure.js';
33
+ import { saveLoginTool } from './tools/save-login.js';
34
+ import { checkTestChangeTool } from './tools/check-test-change.js';
35
+ import { quarantineTool } from './tools/quarantine.js';
33
36
  import { registerPrompts } from './prompts.js';
34
37
  import { outputSchemaFor } from './tools/structured.js';
38
+ import { CACHE_HINTS, SERVER_IDENTITY } from './discovery.js';
39
+ import { attachBundledSkill } from './skills.js';
35
40
  /**
36
41
  * Accept unknown argument names instead of dropping them silently, so the
37
42
  * result can say which ones were ignored: a planner that writes `waitfor`
@@ -260,6 +265,41 @@ const TOOLS = [
260
265
  },
261
266
  handler: bisectFailureTool.handler,
262
267
  },
268
+ {
269
+ ...checkTestChangeTool,
270
+ title: 'Check a test fix (heal guard)',
271
+ // Reads spec files and runs read-only git commands.
272
+ annotations: {
273
+ readOnlyHint: true,
274
+ idempotentHint: true,
275
+ openWorldHint: false,
276
+ },
277
+ handler: checkTestChangeTool.handler,
278
+ },
279
+ {
280
+ ...quarantineTool,
281
+ title: 'Quarantine flaky tests',
282
+ // Reads and writes playwright-quarantine.json in the project.
283
+ annotations: {
284
+ readOnlyHint: false,
285
+ destructiveHint: false,
286
+ idempotentHint: true,
287
+ openWorldHint: false,
288
+ },
289
+ handler: quarantineTool.handler,
290
+ },
291
+ {
292
+ ...saveLoginTool,
293
+ title: 'Save a login session',
294
+ // Drives a browser through a live login and writes a session file.
295
+ annotations: {
296
+ readOnlyHint: false,
297
+ destructiveHint: false,
298
+ idempotentHint: true,
299
+ openWorldHint: true,
300
+ },
301
+ handler: saveLoginTool.handler,
302
+ },
263
303
  ];
264
304
  /**
265
305
  * Tools that neither drive a browser nor write files. The HTTP bridge
@@ -270,15 +310,15 @@ const TOOLS = [
270
310
  export const READ_ONLY_TOOLS = ['list-tests', 'get-failure', 'analyze-history'];
271
311
  /**
272
312
  * Named tool sets for PW_MCP_TOOLS / --tools. Every tool definition costs
273
- * context on each request (all sixteen are ~12k tokens), so a client that
313
+ * context on each request (all nineteen are ~16k tokens), so a client that
274
314
  * only fixes failing suites can load the core loop alone.
275
315
  */
276
316
  export const TOOL_PROFILES = {
277
317
  all: TOOLS.map((tool) => tool.name),
278
- core: ['run-test', 'get-run-status', 'get-failure', 'suggest-fix', 'diagnose-flaky', 'list-tests'],
279
- triage: ['run-test', 'get-run-status', 'get-failure', 'load-report', 'diagnose-flaky', 'analyze-history', 'audit-tests', 'bisect-failure', 'list-tests'],
280
- inspect: ['inspect-page', 'validate-selector', 'compare-visual-state', 'audit-accessibility', 'audit-performance'],
281
- author: ['list-tests', 'inspect-page', 'validate-selector', 'generate-e2e-test', 'run-test'],
318
+ core: ['run-test', 'get-run-status', 'get-failure', 'suggest-fix', 'check-test-change', 'diagnose-flaky', 'list-tests'],
319
+ triage: ['run-test', 'get-run-status', 'get-failure', 'load-report', 'diagnose-flaky', 'quarantine', 'analyze-history', 'audit-tests', 'bisect-failure', 'check-test-change', 'list-tests'],
320
+ inspect: ['inspect-page', 'validate-selector', 'compare-visual-state', 'audit-accessibility', 'audit-performance', 'save-login'],
321
+ author: ['list-tests', 'save-login', 'inspect-page', 'validate-selector', 'generate-e2e-test', 'check-test-change', 'run-test'],
282
322
  };
283
323
  /**
284
324
  * Resolve a comma-separated list of tool names and profile names
@@ -331,10 +371,44 @@ export function resolveDefaultProjectRoot() {
331
371
  }
332
372
  return root;
333
373
  }
374
+ /** The first protocol revision without sessions or the initialize handshake. */
375
+ export const MODERN_PROTOCOL_VERSION = '2026-07-28';
376
+ /**
377
+ * Protocol versions this server offers: the 2026-07-28 revision first, then
378
+ * every 2025-era version the SDK supports. PW_MCP_PROTOCOL=legacy drops the
379
+ * 2026 revision, for a client that misbehaves when it is offered.
380
+ */
381
+ export function supportedProtocolVersions() {
382
+ const legacy = SUPPORTED_PROTOCOL_VERSIONS.filter((version) => version < MODERN_PROTOCOL_VERSION);
383
+ return process.env.PW_MCP_PROTOCOL === 'legacy' ? legacy : [MODERN_PROTOCOL_VERSION, ...legacy];
384
+ }
385
+ /** The trace id from a request's `traceparent` (`00-<trace-id>-<span-id>-<flags>`), when valid. */
386
+ export function traceContext(meta) {
387
+ const value = meta?.[TRACEPARENT_META_KEY];
388
+ if (typeof value !== 'string')
389
+ return {};
390
+ const match = /^[\da-f]{2}-([\da-f]{32})-([\da-f]{16})-[\da-f]{2}$/.exec(value.trim());
391
+ if (!match || /^0+$/.test(match[1]) || /^0+$/.test(match[2]))
392
+ return {};
393
+ return { traceId: match[1], parentSpanId: match[2] };
394
+ }
334
395
  export function createServer(options = {}) {
335
396
  const projectRoot = options.projectRoot ?? resolveDefaultProjectRoot();
336
397
  const store = options.store ?? createToolStore();
337
- const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION });
398
+ const server = new McpServer({
399
+ name: SERVER_NAME,
400
+ version: SERVER_VERSION,
401
+ title: SERVER_IDENTITY.title,
402
+ description: SERVER_IDENTITY.description,
403
+ websiteUrl: SERVER_IDENTITY.websiteUrl,
404
+ icons: SERVER_IDENTITY.icons.map((icon) => ({ ...icon, sizes: [...icon.sizes] })),
405
+ }, {
406
+ // Speak the stateless 2026-07-28 revision to clients that ask for it
407
+ // (server/discover), and the 2025 handshake to everyone else.
408
+ supportedProtocolVersions: supportedProtocolVersions(),
409
+ // 2026-07-28 clients may cache the lists for an hour (SEP-2549).
410
+ cacheHints: CACHE_HINTS,
411
+ });
338
412
  let selection = options.tools;
339
413
  if (!selection && process.env.PW_MCP_TOOLS) {
340
414
  const resolved = resolveToolSelection(process.env.PW_MCP_TOOLS);
@@ -374,7 +448,9 @@ export function createServer(options = {}) {
374
448
  })
375
449
  .catch(() => undefined);
376
450
  },
377
- logger: logger.child({ tool: tool.name }),
451
+ // W3C trace context from the request _meta (SEP-414), so stderr
452
+ // logs line up with the client's OpenTelemetry spans.
453
+ logger: logger.child({ tool: tool.name, ...traceContext(reqCtx.mcpReq._meta) }),
378
454
  // v2: the request abort signal lives under ctx.mcpReq.
379
455
  signal: options.requestSignal
380
456
  ? AbortSignal.any([reqCtx.mcpReq.signal, options.requestSignal])
@@ -401,6 +477,8 @@ export function createServer(options = {}) {
401
477
  }
402
478
  if (!options.tools)
403
479
  registerPrompts(server);
480
+ // The playbook for these tools, over the Skills extension (SEP-2640).
481
+ attachBundledSkill(server);
404
482
  logger.debug('server created', { version: SERVER_VERSION, projectRoot, tools: enabled.length });
405
483
  return server;
406
484
  }
@@ -420,10 +498,16 @@ export async function shutdown(server, code, reason) {
420
498
  }
421
499
  process.exit(code);
422
500
  }
423
- /** Connect the server over stdio and install shutdown handlers. */
501
+ /**
502
+ * Serve over stdio and install shutdown handlers. `serveStdio` lets the
503
+ * client's opening message pick the era: a 2026-07-28 client opens with
504
+ * `server/discover`, a 2025 client with `initialize`; either way one server
505
+ * from createServer() is pinned for the connection.
506
+ */
424
507
  export async function startServer() {
425
- const server = createServer();
426
- const transport = new StdioServerTransport();
508
+ const server = serveStdio(() => createServer(), {
509
+ onerror: (error) => logger.warn('stdio transport error', { error }),
510
+ });
427
511
  process.on('SIGINT', () => void shutdown(server, 0, 'SIGINT'));
428
512
  process.on('SIGTERM', () => void shutdown(server, 0, 'SIGTERM'));
429
513
  // The client went away: stdin ends, and we must not leave browsers or
@@ -438,8 +522,7 @@ export async function startServer() {
438
522
  logger.error('unhandled rejection', { error: reason });
439
523
  void shutdown(server, 1, 'unhandledRejection');
440
524
  });
441
- await server.connect(transport);
442
- logger.info('connected over stdio', {
525
+ logger.info('serving over stdio', {
443
526
  version: SERVER_VERSION,
444
527
  projectRoot: resolveDefaultProjectRoot(),
445
528
  tools: resolveToolSelection(process.env.PW_MCP_TOOLS).tools ?? TOOLS.map((tool) => tool.name),
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAG5G,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;GAIG;AACH,SAAS,UAAU,CAAC,MAA8B;IAChD,MAAM,MAAM,GAAG,MAA8F,CAAC;IAC9G,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC7F,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,0FAA0F;AAC1F,SAAS,oBAAoB,CAAC,MAAoB,EAAE,OAAiB,EAAE,KAAkB;IACvF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAClG,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,sBAAsB,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,gCAAgC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACzG,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACtK,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAyB,CAAC;QAC/D,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,EAAE,CAAC;AAc5C,MAAM,KAAK,GAAe;IACxB;QACE,GAAG,WAAW;QACd,KAAK,EAAE,eAAe;QACtB,uEAAuE;QACvE,4DAA4D;QAC5D,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,WAAW,CAAC,OAA8B;KACpD;IACD;QACE,GAAG,gBAAgB;QACnB,KAAK,EAAE,wBAAwB;QAC/B,8DAA8D;QAC9D,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,gBAAgB,CAAC,OAA8B;KACzD;IACD;QACE,GAAG,cAAc;QACjB,KAAK,EAAE,wBAAwB;QAC/B,mEAAmE;QACnE,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,cAAc,CAAC,OAA8B;KACvD;IACD;QACE,GAAG,cAAc;QACjB,KAAK,EAAE,kBAAkB;QACzB,mEAAmE;QACnE,oDAAoD;QACpD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,cAAc,CAAC,OAA8B;KACvD;IACD;QACE,GAAG,cAAc;QACjB,KAAK,EAAE,2BAA2B;QAClC,wEAAwE;QACxE,qEAAqE;QACrE,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,cAAc,CAAC,OAA8B;KACvD;IACD;QACE,GAAG,eAAe;QAClB,KAAK,EAAE,uBAAuB;QAC9B,wEAAwE;QACxE,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,eAAe,CAAC,OAA8B;KACxD;IACD;QACE,GAAG,aAAa;QAChB,KAAK,EAAE,sBAAsB;QAC7B,uDAAuD;QACvD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,aAAa,CAAC,OAA8B;KACtD;IACD;QACE,GAAG,oBAAoB;QACvB,KAAK,EAAE,8BAA8B;QACrC,oEAAoE;QACpE,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,oBAAoB,CAAC,OAA8B;KAC7D;IACD;QACE,GAAG,sBAAsB;QACzB,KAAK,EAAE,0BAA0B;QACjC,uEAAuE;QACvE,0BAA0B;QAC1B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,sBAAsB,CAAC,OAA8B;KAC/D;IACD;QACE,GAAG,oBAAoB;QACvB,KAAK,EAAE,wBAAwB;QAC/B,wEAAwE;QACxE,qCAAqC;QACrC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,oBAAoB,CAAC,OAA8B;KAC7D;IACD;QACE,GAAG,mBAAmB;QACtB,KAAK,EAAE,sBAAsB;QAC7B,qEAAqE;QACrE,iCAAiC;QACjC,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,mBAAmB,CAAC,OAA8B;KAC5D;IACD;QACE,GAAG,sBAAsB;QACzB,KAAK,EAAE,sBAAsB;QAC7B,uEAAuE;QACvE,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,sBAAsB,CAAC,OAA8B;KAC/D;IACD;QACE,GAAG,iBAAiB;QACpB,KAAK,EAAE,qBAAqB;QAC5B,iEAAiE;QACjE,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,iBAAiB,CAAC,OAA8B;KAC1D;IACD;QACE,GAAG,kBAAkB;QACrB,KAAK,EAAE,qBAAqB;QAC5B,qCAAqC;QACrC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,kBAAkB,CAAC,OAA8B;KAC3D;IACD;QACE,GAAG,cAAc;QACjB,KAAK,EAAE,6BAA6B;QACpC,qEAAqE;QACrE,qEAAqE;QACrE,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,cAAc,CAAC,OAA8B;KACvD;IACD;QACE,GAAG,iBAAiB;QACpB,KAAK,EAAE,mCAAmC;QAC1C,mEAAmE;QACnE,6DAA6D;QAC7D,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,iBAAiB,CAAC,OAA8B;KAC1D;IACD;QACE,GAAG,mBAAmB;QACtB,KAAK,EAAE,+BAA+B;QACtC,oDAAoD;QACpD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,mBAAmB,CAAC,OAA8B;KAC5D;IACD;QACE,GAAG,cAAc;QACjB,KAAK,EAAE,wBAAwB;QAC/B,8DAA8D;QAC9D,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,cAAc,CAAC,OAA8B;KACvD;IACD;QACE,GAAG,aAAa;QAChB,KAAK,EAAE,sBAAsB;QAC7B,mEAAmE;QACnE,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,OAAO,EAAE,aAAa,CAAC,OAA8B;KACtD;CACF,CAAC;AAeF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsB,CAAC,YAAY,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;AAEnG;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAgD;IACxE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;IACnC,IAAI,EAAE,CAAC,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,CAAC;IACvH,MAAM,EAAE,CAAC,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,CAAC;IAC3L,OAAO,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,YAAY,CAAC;IAChI,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,UAAU,CAAC;CAChI,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAwB;IAC3D,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;SACzB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACnD,IAAI,OAAO;YAAE,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;aACtD,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;YAC1C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC5C,qDAAqD;IACrD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAChD,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,6EAA6E,EAAE;YACzF,KAAK,EAAE,OAAO;SACf,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACxE,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,wEAAwE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,yBAAyB;IACvC,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,uBAAuB,CAAC,CAAC;IAClG,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,uBAAuB,EAAE,GAAG,MAAM,CAAC,CAAC;AAClG,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,YAAY,CAAC,IAAyC;IACpE,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,qDAAqD,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACxE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAO,GAAwB,EAAE;IAC5D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,yBAAyB,EAAE,CAAC;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,WAAW,EAAE,eAAe,CAAC,WAAW;QACxC,UAAU,EAAE,eAAe,CAAC,UAAU;QACtC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;KAClF,EACD;QACE,qEAAqE;QACrE,8DAA8D;QAC9D,yBAAyB,EAAE,yBAAyB,EAAE;QACtD,iEAAiE;QACjE,UAAU,EAAE,WAAW;KACxB,CACF,CAAC;IAEF,IAAI,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;IAC9B,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChE,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,6DAA6D,EAAE;gBACzE,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;aACrC,CAAC,CAAC;QACL,CAAC;QACD,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1F,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,YAAY,CACjB,IAAI,CAAC,IAAI,EACT;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,KAAK,CAAC,MAAM;YACzB,oEAAoE;YACpE,0EAA0E;YAC1E,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChI,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,EACD,KAAK,EAAE,IAAa,EAAE,MAAqB,EAAE,EAAE;YAC7C,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC;YACzD,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;YACtB,MAAM,GAAG,GAAgB;gBACvB,QAAQ,EACN,aAAa,KAAK,SAAS;oBACzB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;wBAC3B,kEAAkE;wBAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,GAAG,KAAK,CAAC,CAAC;wBACvD,YAAY,GAAG,KAAK,CAAC;wBACrB,KAAK,MAAM,CAAC,MAAM;6BACf,MAAM,CAAC;4BACN,MAAM,EAAE,wBAAwB;4BAChC,MAAM,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;yBACvH,CAAC;6BACD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;oBAC5B,CAAC;gBACP,gEAAgE;gBAChE,sDAAsD;gBACtD,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/E,uDAAuD;gBACvD,MAAM,EAAE,OAAO,CAAC,aAAa;oBAC3B,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;oBAChE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;gBACxB,KAAK;gBACL,WAAW;gBACX,UAAU,EAAE,OAAO,CAAC,UAAU,KAAK,IAAI;aACxC,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;gBACtD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,IAAa,EAAE,GAAG,CAAC,CAAC;gBACxE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjG,OAAO,oBAAoB,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAc,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAM,CAAC,CAAC;YAC9F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,gEAAgE;gBAChE,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;gBACxC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzE,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5C,sEAAsE;IACtE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE3B,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChG,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAkC,EAAE,IAAY,EAAE,MAAc;IAC7F,IAAI,YAAY;QAAE,OAAO;IACzB,YAAY,GAAG,IAAI,CAAC;IACpB,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE;QAC9C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC;KACpE,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IACjE,sEAAsE;IACtE,wBAAwB;IACxB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,mCAAmC,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,oCAAoC,CAAC,CAAC,CAAC;IAChG,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACnD,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;QAChC,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,yBAAyB,EAAE;QACxC,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;KAC9F,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Serves the bundled agent skill over MCP with the Skills extension
3
+ * (`io.modelcontextprotocol/skills`, SEP-2640).
4
+ *
5
+ * The same `skill/playwright-e2e-mcp` folder that ships as a zip for Claude
6
+ * Code, Gemini CLI and skill marketplaces is offered here as
7
+ * `skill://playwright-e2e-mcp/SKILL.md` plus its reference files. A client
8
+ * that supports the extension can load the playbook straight from the
9
+ * server it is connected to, so the instructions always match the installed
10
+ * server version and nobody has to install the skill separately. Clients
11
+ * that do not know the extension never see it: it only adds the
12
+ * `skills/list` and `skills/get` methods and a resource template.
13
+ *
14
+ * Set PW_MCP_SKILLS=0 to turn it off. When the folder is missing (a build
15
+ * that left it out), nothing is attached.
16
+ */
17
+ import type { McpServer } from '@modelcontextprotocol/server';
18
+ import type { SkillSource } from '@modelcontextprotocol/server/ext/skills';
19
+ export declare const SKILL_BASE_URI = "skill://";
20
+ /** A SkillSource over one skill folder, read once on first use. */
21
+ export declare function folderSkillSource(dir: string, name?: string): SkillSource;
22
+ /** Attach the bundled skill to `server` (before it connects). Returns whether it did. */
23
+ export declare function attachBundledSkill(server: McpServer): boolean;
package/dist/skills.js ADDED
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Serves the bundled agent skill over MCP with the Skills extension
3
+ * (`io.modelcontextprotocol/skills`, SEP-2640).
4
+ *
5
+ * The same `skill/playwright-e2e-mcp` folder that ships as a zip for Claude
6
+ * Code, Gemini CLI and skill marketplaces is offered here as
7
+ * `skill://playwright-e2e-mcp/SKILL.md` plus its reference files. A client
8
+ * that supports the extension can load the playbook straight from the
9
+ * server it is connected to, so the instructions always match the installed
10
+ * server version and nobody has to install the skill separately. Clients
11
+ * that do not know the extension never see it: it only adds the
12
+ * `skills/list` and `skills/get` methods and a resource template.
13
+ *
14
+ * Set PW_MCP_SKILLS=0 to turn it off. When the folder is missing (a build
15
+ * that left it out), nothing is attached.
16
+ */
17
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
18
+ import path from 'node:path';
19
+ import { SkillsExtension, skillEntry } from '@modelcontextprotocol/server/ext/skills';
20
+ import { bundledSkillDir, SKILL_NAME } from './cli/init.js';
21
+ import { LIST_TTL_MS } from './discovery.js';
22
+ import { logger } from './utils/logger.js';
23
+ export const SKILL_BASE_URI = 'skill://';
24
+ /** Every regular file under `dir`, keyed by its `/`-separated relative path. */
25
+ function readTree(dir, prefix = '') {
26
+ const files = {};
27
+ for (const entry of readdirSync(path.join(dir, prefix), { withFileTypes: true })) {
28
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
29
+ if (entry.isDirectory())
30
+ Object.assign(files, readTree(dir, rel));
31
+ else if (entry.isFile())
32
+ files[rel] = readFileSync(path.join(dir, rel));
33
+ }
34
+ return files;
35
+ }
36
+ /** A SkillSource over one skill folder, read once on first use. */
37
+ export function folderSkillSource(dir, name = SKILL_NAME) {
38
+ let loaded;
39
+ const load = () => {
40
+ loaded ??= (async () => {
41
+ const raw = readTree(dir);
42
+ const entry = await skillEntry(name, raw, { baseUri: SKILL_BASE_URI });
43
+ const files = new Map(Object.entries(raw).map(([rel, bytes]) => [`${SKILL_BASE_URI}${name}/${rel}`, bytes]));
44
+ return { entry, files };
45
+ })();
46
+ return loaded;
47
+ };
48
+ return {
49
+ async list() {
50
+ return { skills: [(await load()).entry] };
51
+ },
52
+ async get(uri) {
53
+ const { entry } = await load();
54
+ return uri === entry.uri ? entry : undefined;
55
+ },
56
+ async read(uri) {
57
+ const bytes = (await load()).files.get(uri);
58
+ if (!bytes)
59
+ return undefined;
60
+ return uri.endsWith('.md') ? { text: Buffer.from(bytes).toString('utf8'), mimeType: 'text/markdown' } : { bytes };
61
+ },
62
+ };
63
+ }
64
+ let extension;
65
+ /** The shared extension instance, or null when skills are off or missing. */
66
+ function bundledSkillsExtension() {
67
+ if (extension !== undefined)
68
+ return extension;
69
+ const dir = bundledSkillDir();
70
+ if (process.env.PW_MCP_SKILLS === '0') {
71
+ extension = null;
72
+ }
73
+ else if (!existsSync(path.join(dir, 'SKILL.md')) || !statSync(dir).isDirectory()) {
74
+ logger.debug('bundled skill folder not found; skills extension off', { dir });
75
+ extension = null;
76
+ }
77
+ else {
78
+ extension = new SkillsExtension({
79
+ source: folderSkillSource(dir),
80
+ // The files only change with the package version.
81
+ cacheHint: { ttlMs: LIST_TTL_MS, cacheScope: 'public' },
82
+ onWarning: (warning) => logger.warn('skill problem', { ...warning }),
83
+ });
84
+ }
85
+ return extension;
86
+ }
87
+ /** Attach the bundled skill to `server` (before it connects). Returns whether it did. */
88
+ export function attachBundledSkill(server) {
89
+ const ext = bundledSkillsExtension();
90
+ if (!ext)
91
+ return false;
92
+ try {
93
+ ext.attach(server);
94
+ return true;
95
+ }
96
+ catch (err) {
97
+ logger.warn('could not attach the skills extension', { error: err });
98
+ return false;
99
+ }
100
+ }
101
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,11 @@ declare const analyzeHistoryInput: z.ZodObject<{
20
20
  test: z.ZodOptional<z.ZodString>;
21
21
  lastRuns: z.ZodOptional<z.ZodNumber>;
22
22
  limit: z.ZodOptional<z.ZodNumber>;
23
+ source: z.ZodOptional<z.ZodEnum<{
24
+ both: "both";
25
+ cloud: "cloud";
26
+ local: "local";
27
+ }>>;
23
28
  projectRoot: z.ZodOptional<z.ZodString>;
24
29
  }, z.core.$strip>;
25
30
  export type AnalyzeHistoryInput = z.infer<typeof analyzeHistoryInput>;
@@ -35,6 +40,11 @@ export declare const analyzeHistorySchema: z.ZodObject<{
35
40
  test: z.ZodOptional<z.ZodString>;
36
41
  lastRuns: z.ZodOptional<z.ZodNumber>;
37
42
  limit: z.ZodOptional<z.ZodNumber>;
43
+ source: z.ZodOptional<z.ZodEnum<{
44
+ both: "both";
45
+ cloud: "cloud";
46
+ local: "local";
47
+ }>>;
38
48
  projectRoot: z.ZodOptional<z.ZodString>;
39
49
  }, z.core.$strip>;
40
50
  export declare const analyzeHistoryTool: {
@@ -52,6 +62,11 @@ export declare const analyzeHistoryTool: {
52
62
  test: z.ZodOptional<z.ZodString>;
53
63
  lastRuns: z.ZodOptional<z.ZodNumber>;
54
64
  limit: z.ZodOptional<z.ZodNumber>;
65
+ source: z.ZodOptional<z.ZodEnum<{
66
+ both: "both";
67
+ cloud: "cloud";
68
+ local: "local";
69
+ }>>;
55
70
  projectRoot: z.ZodOptional<z.ZodString>;
56
71
  }, z.core.$strip>;
57
72
  handler: (args: AnalyzeHistoryInput, ctx: ToolContext) => Promise<ToolResponse>;
@@ -8,6 +8,8 @@
8
8
  */
9
9
  import { z } from 'zod';
10
10
  import { breakingCommits, dailyTrend, failurePatterns, historyEnabled, HISTORY_DIR, rankFlaky, readHistory, slowTests, testStats, } from '../utils/run-history.js';
11
+ import { PlaywrightMcpError } from '../types/index.js';
12
+ import { fetchRuns, mergeRuns, proProjectName, proSettings } from '../utils/pro-client.js';
11
13
  import { clipLines, formatDuration, guard, markdownCell, resolveProjectRoot, toolText, } from './shared.js';
12
14
  const analyzeHistoryInput = z.object({
13
15
  view: z
@@ -17,6 +19,10 @@ const analyzeHistoryInput = z.object({
17
19
  test: z.string().optional().describe('Filter: substring of file or title'),
18
20
  lastRuns: z.number().int().min(2).max(500).optional().describe('Runs to analyze (default 30)'),
19
21
  limit: z.number().int().min(1).max(100).optional(),
22
+ source: z
23
+ .enum(['local', 'cloud', 'both'])
24
+ .optional()
25
+ .describe("With a Pro key: 'both' (default) merges this machine's runs with CI runs from Pro Cloud; 'cloud' or 'local' for one side"),
20
26
  projectRoot: z.string().optional(),
21
27
  });
22
28
  export const analyzeHistorySchema = analyzeHistoryInput;
@@ -32,10 +38,37 @@ function bar(rate, width = 10) {
32
38
  const filled = Math.round(Math.min(1, rate) * width);
33
39
  return `${'█'.repeat(filled)}${'░'.repeat(width - filled)}`;
34
40
  }
35
- function header(entries, requested) {
41
+ function header(entries, requested, note) {
36
42
  const first = entries[0]?.at.slice(0, 16).replace('T', ' ');
37
43
  const last = entries[entries.length - 1]?.at.slice(0, 16).replace('T', ' ');
38
- return [`**Window:** last ${entries.length} run(s)${entries.length < requested ? ` (all recorded)` : ''}, ${first} → ${last} UTC`, ''];
44
+ return [`**Window:** last ${entries.length} run(s)${entries.length < requested ? ` (all recorded)` : ''}, ${first} → ${last} UTC`, ...(note ? [note] : []), ''];
45
+ }
46
+ /**
47
+ * Local runs, plus Pro Cloud runs when a Pro key is set. Without a key this
48
+ * is exactly the local history and nothing leaves the machine.
49
+ */
50
+ async function loadEntries(root, requested, source) {
51
+ const settings = proSettings();
52
+ const wanted = source ?? (settings ? 'both' : 'local');
53
+ if (wanted === 'local')
54
+ return { entries: await readHistory(root, requested) };
55
+ if (!settings) {
56
+ throw new PlaywrightMcpError('Cloud history needs a Pro key', 'INVALID_INPUT', {
57
+ hint: "Set PW_MCP_PRO_KEY and PW_MCP_PRO_URL, or use source: 'local'.",
58
+ });
59
+ }
60
+ const local = wanted === 'both' ? await readHistory(root, requested) : [];
61
+ const project = await proProjectName(root);
62
+ try {
63
+ const cloud = await fetchRuns(settings, project, requested);
64
+ const entries = mergeRuns(local, cloud, requested);
65
+ return { entries, note: `**Source:** ${wanted === 'both' ? `${local.length} local run(s) + ` : ''}${cloud.length} Pro Cloud run(s) for \`${project}\`` };
66
+ }
67
+ catch (error) {
68
+ if (wanted === 'cloud')
69
+ throw error;
70
+ return { entries: local, note: `**Source:** local only; Pro Cloud failed: ${error.message}` };
71
+ }
39
72
  }
40
73
  export const analyzeHistoryTool = {
41
74
  name: 'analyze-history',
@@ -46,7 +79,9 @@ export const analyzeHistoryTool = {
46
79
  const requested = args.lastRuns ?? 30;
47
80
  const limit = args.limit ?? 15;
48
81
  const view = args.view ?? (args.test ? 'test' : 'flaky');
49
- let entries = await readHistory(root, requested);
82
+ const loaded = await loadEntries(root, requested, args.source);
83
+ let entries = loaded.entries;
84
+ const sourceNote = loaded.note;
50
85
  if (entries.length === 0) {
51
86
  return toolText([
52
87
  '## No run history yet',
@@ -66,7 +101,7 @@ export const analyzeHistoryTool = {
66
101
  const lines = [];
67
102
  if (view === 'test') {
68
103
  const stats = testStats(entries);
69
- lines.push(`## Test history${args.test ? ` — "${args.test}"` : ''}`, '', ...header(entries, requested));
104
+ lines.push(`## Test history${args.test ? ` — "${args.test}"` : ''}`, '', ...header(entries, requested, sourceNote));
70
105
  if (stats.length === 0) {
71
106
  lines.push('_No recorded runs include a matching test._');
72
107
  return toolText(lines.join('\n'));
@@ -87,7 +122,7 @@ export const analyzeHistoryTool = {
87
122
  }
88
123
  if (view === 'patterns') {
89
124
  const patterns = failurePatterns(entries);
90
- lines.push('## Failure patterns', '', ...header(entries, requested));
125
+ lines.push('## Failure patterns', '', ...header(entries, requested, sourceNote));
91
126
  if (patterns.length === 0) {
92
127
  lines.push('✅ No failures recorded in this window.');
93
128
  return toolText(lines.join('\n'));
@@ -109,7 +144,7 @@ export const analyzeHistoryTool = {
109
144
  }
110
145
  if (view === 'slow') {
111
146
  const slow = slowTests(entries);
112
- lines.push('## Slowest tests', '', ...header(entries, requested));
147
+ lines.push('## Slowest tests', '', ...header(entries, requested, sourceNote));
113
148
  if (slow.length === 0) {
114
149
  lines.push('_No passing runs with durations recorded yet._');
115
150
  return toolText(lines.join('\n'));
@@ -129,7 +164,7 @@ export const analyzeHistoryTool = {
129
164
  }
130
165
  if (view === 'trend') {
131
166
  const days = dailyTrend(entries);
132
- lines.push('## Stability by day', '', ...header(entries, requested));
167
+ lines.push('## Stability by day', '', ...header(entries, requested, sourceNote));
133
168
  lines.push('| day (UTC) | runs | tests run | failed | flaky | unstable | |', '| --- | ---: | ---: | ---: | ---: | ---: | --- |');
134
169
  for (const d of days.slice(-limit)) {
135
170
  lines.push(`| ${d.day} | ${d.runs} | ${d.executions} | ${d.failed} | ${d.flaky} | ${pct(d.unstableRate)} (${d.unstableTests} tests) | ${bar(d.unstableRate)} |`);
@@ -149,7 +184,7 @@ export const analyzeHistoryTool = {
149
184
  }
150
185
  if (view === 'commits') {
151
186
  const breaks = breakingCommits(entries);
152
- lines.push('## When each test went bad', '', ...header(entries, requested));
187
+ lines.push('## When each test went bad', '', ...header(entries, requested, sourceNote));
153
188
  if (breaks.length === 0) {
154
189
  lines.push('✅ No test is failing or flaky now.');
155
190
  return toolText(lines.join('\n'));
@@ -183,7 +218,7 @@ export const analyzeHistoryTool = {
183
218
  return toolText(lines.join('\n'));
184
219
  }
185
220
  const ranking = rankFlaky(entries);
186
- lines.push('## Flakiness ranking', '', ...header(entries, requested));
221
+ lines.push('## Flakiness ranking', '', ...header(entries, requested, sourceNote));
187
222
  if (ranking.flaky.length === 0 && ranking.broken.length === 0 && ranking.regressed.length === 0) {
188
223
  lines.push(`✅ No unstable tests: every recorded test behaved the same way across these runs (${ranking.stable} stable).`);
189
224
  if (entries.length < 3)