@yasserkhanorg/e2e-agents 1.7.7 → 1.8.1

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 (119) hide show
  1. package/README.md +55 -0
  2. package/dist/agent/git.d.ts +5 -0
  3. package/dist/agent/git.d.ts.map +1 -1
  4. package/dist/agent/git.js +13 -0
  5. package/dist/agents/coverage-evaluator.d.ts +8 -0
  6. package/dist/agents/coverage-evaluator.d.ts.map +1 -0
  7. package/dist/agents/coverage-evaluator.js +41 -0
  8. package/dist/agents/cross-impact.d.ts +13 -0
  9. package/dist/agents/cross-impact.d.ts.map +1 -0
  10. package/dist/agents/cross-impact.js +135 -0
  11. package/dist/agents/executor.d.ts +8 -0
  12. package/dist/agents/executor.d.ts.map +1 -0
  13. package/dist/agents/executor.js +70 -0
  14. package/dist/agents/explorer.d.ts +12 -0
  15. package/dist/agents/explorer.d.ts.map +1 -0
  16. package/dist/agents/explorer.js +43 -0
  17. package/dist/agents/generator.d.ts +8 -0
  18. package/dist/agents/generator.d.ts.map +1 -0
  19. package/dist/agents/generator.js +77 -0
  20. package/dist/agents/healer.d.ts +8 -0
  21. package/dist/agents/healer.d.ts.map +1 -0
  22. package/dist/agents/healer.js +31 -0
  23. package/dist/agents/impact-analyst.d.ts +8 -0
  24. package/dist/agents/impact-analyst.d.ts.map +1 -0
  25. package/dist/agents/impact-analyst.js +38 -0
  26. package/dist/agents/regression-advisor.d.ts +8 -0
  27. package/dist/agents/regression-advisor.d.ts.map +1 -0
  28. package/dist/agents/regression-advisor.js +116 -0
  29. package/dist/agents/strategist.d.ts +9 -0
  30. package/dist/agents/strategist.d.ts.map +1 -0
  31. package/dist/agents/strategist.js +87 -0
  32. package/dist/agents/test-designer.d.ts +8 -0
  33. package/dist/agents/test-designer.d.ts.map +1 -0
  34. package/dist/agents/test-designer.js +106 -0
  35. package/dist/cli/commands/crew.d.ts +3 -0
  36. package/dist/cli/commands/crew.d.ts.map +1 -0
  37. package/dist/cli/commands/crew.js +137 -0
  38. package/dist/cli/parse_args.d.ts.map +1 -1
  39. package/dist/cli/parse_args.js +2 -1
  40. package/dist/cli/types.d.ts +2 -1
  41. package/dist/cli/types.d.ts.map +1 -1
  42. package/dist/cli.js +5 -0
  43. package/dist/crew/context.d.ts +40 -0
  44. package/dist/crew/context.d.ts.map +1 -0
  45. package/dist/crew/context.js +36 -0
  46. package/dist/crew/orchestrator.d.ts +36 -0
  47. package/dist/crew/orchestrator.d.ts.map +1 -0
  48. package/dist/crew/orchestrator.js +171 -0
  49. package/dist/crew/protocol.d.ts +33 -0
  50. package/dist/crew/protocol.d.ts.map +1 -0
  51. package/dist/crew/protocol.js +4 -0
  52. package/dist/crew/provider.d.ts +3 -0
  53. package/dist/crew/provider.d.ts.map +1 -0
  54. package/dist/crew/provider.js +16 -0
  55. package/dist/crew/sanitize.d.ts +3 -0
  56. package/dist/crew/sanitize.d.ts.map +1 -0
  57. package/dist/crew/sanitize.js +31 -0
  58. package/dist/crew/types.d.ts +52 -0
  59. package/dist/crew/types.d.ts.map +1 -0
  60. package/dist/crew/types.js +4 -0
  61. package/dist/crew/workflows.d.ts +52 -0
  62. package/dist/crew/workflows.d.ts.map +1 -0
  63. package/dist/crew/workflows.js +36 -0
  64. package/dist/esm/agent/git.js +12 -0
  65. package/dist/esm/agents/coverage-evaluator.js +37 -0
  66. package/dist/esm/agents/cross-impact.js +131 -0
  67. package/dist/esm/agents/executor.js +66 -0
  68. package/dist/esm/agents/explorer.js +39 -0
  69. package/dist/esm/agents/generator.js +73 -0
  70. package/dist/esm/agents/healer.js +27 -0
  71. package/dist/esm/agents/impact-analyst.js +34 -0
  72. package/dist/esm/agents/regression-advisor.js +112 -0
  73. package/dist/esm/agents/strategist.js +83 -0
  74. package/dist/esm/agents/test-designer.js +102 -0
  75. package/dist/esm/cli/commands/crew.js +134 -0
  76. package/dist/esm/cli/parse_args.js +2 -1
  77. package/dist/esm/cli.js +5 -0
  78. package/dist/esm/crew/context.js +32 -0
  79. package/dist/esm/crew/orchestrator.js +167 -0
  80. package/dist/esm/crew/protocol.js +3 -0
  81. package/dist/esm/crew/provider.js +13 -0
  82. package/dist/esm/crew/sanitize.js +27 -0
  83. package/dist/esm/crew/types.js +3 -0
  84. package/dist/esm/crew/workflows.js +33 -0
  85. package/dist/esm/index.js +14 -0
  86. package/dist/esm/knowledge/route_families.js +2 -2
  87. package/dist/esm/logger.js +1 -2
  88. package/dist/esm/ollama_provider.js +1 -1
  89. package/dist/esm/prompts/cross-impact.js +71 -0
  90. package/dist/esm/prompts/strategist.js +79 -0
  91. package/dist/esm/prompts/test-designer.js +107 -0
  92. package/dist/esm/provider_factory.js +6 -10
  93. package/dist/esm/training/enricher.js +4 -3
  94. package/dist/esm/training/validator.js +2 -1
  95. package/dist/index.d.ts +17 -0
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +27 -1
  98. package/dist/knowledge/route_families.d.ts.map +1 -1
  99. package/dist/knowledge/route_families.js +2 -2
  100. package/dist/logger.d.ts +1 -2
  101. package/dist/logger.d.ts.map +1 -1
  102. package/dist/logger.js +1 -2
  103. package/dist/ollama_provider.js +1 -1
  104. package/dist/prompts/cross-impact.d.ts +22 -0
  105. package/dist/prompts/cross-impact.d.ts.map +1 -0
  106. package/dist/prompts/cross-impact.js +75 -0
  107. package/dist/prompts/strategist.d.ts +25 -0
  108. package/dist/prompts/strategist.d.ts.map +1 -0
  109. package/dist/prompts/strategist.js +83 -0
  110. package/dist/prompts/test-designer.d.ts +33 -0
  111. package/dist/prompts/test-designer.d.ts.map +1 -0
  112. package/dist/prompts/test-designer.js +111 -0
  113. package/dist/provider_factory.d.ts.map +1 -1
  114. package/dist/provider_factory.js +6 -10
  115. package/dist/training/enricher.d.ts.map +1 -1
  116. package/dist/training/enricher.js +4 -3
  117. package/dist/training/validator.d.ts.map +1 -1
  118. package/dist/training/validator.js +2 -1
  119. package/package.json +1 -1
@@ -0,0 +1,79 @@
1
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2
+ // See LICENSE.txt for license information.
3
+ import { sanitizeForPrompt } from '../crew/sanitize.js';
4
+ export function buildStrategistPrompt(ctx) {
5
+ const flowsBlock = ctx.impactedFlows
6
+ .map((f) => {
7
+ const specs = f.existingSpecs.map((s) => `${s.path} (${s.coverageLevel})`).join(', ') || 'none';
8
+ return [
9
+ `- ${f.flowId} (${f.priority}): ${f.flowName}`,
10
+ ` Route Family: ${f.routeFamily}`,
11
+ ` Action: ${f.action}`,
12
+ ` Confidence: ${f.confidence}%`,
13
+ ` Existing Coverage: ${specs}`,
14
+ ` User Actions: ${sanitizeForPrompt(f.userActions.join('; ') || 'unknown')}`,
15
+ ` Changed Files: ${f.changedFiles.join(', ')}`,
16
+ ].join('\n');
17
+ })
18
+ .join('\n\n');
19
+ const crossImpactBlock = ctx.crossImpacts.length > 0
20
+ ? ctx.crossImpacts.map((ci) => `- ${ci.sourceFamily} → ${ci.affectedFamily} (${ci.riskLevel}): ${ci.sharedDependency} — ${ci.evidence}`).join('\n')
21
+ : 'No cross-family impacts detected.';
22
+ const regressionBlock = ctx.regressionRisks.length > 0
23
+ ? ctx.regressionRisks.map((r) => `- ${r.familyId} (risk=${r.riskScore}): ${r.reason}`).join('\n')
24
+ : 'No regression risk data available.';
25
+ return [
26
+ 'You are a senior QA strategist designing the overall test strategy for a code change.',
27
+ '',
28
+ `IMPACTED FLOWS (${ctx.impactedFlows.length}):`,
29
+ flowsBlock,
30
+ '',
31
+ 'CROSS-FAMILY IMPACTS:',
32
+ crossImpactBlock,
33
+ '',
34
+ 'REGRESSION RISK:',
35
+ regressionBlock,
36
+ '',
37
+ 'TASK: Design a prioritized test strategy for each impacted flow.',
38
+ '',
39
+ 'For each flow, decide:',
40
+ '1. Approach: full-test (comprehensive), smoke-test (critical path only), skip, or manual-review',
41
+ '2. Priority: P0 (critical path), P1 (important), P2 (nice to have)',
42
+ '3. Test categories to cover (from: happy-path, edge-case, boundary, negative, state-transition, race-condition, permission, accessibility, performance)',
43
+ '4. Cross-impact risk level based on shared dependencies',
44
+ '',
45
+ 'Return strict JSON only with this shape:',
46
+ '{"strategy":[{"flowId":"<id>","flowName":"<name>","priority":"P0|P1|P2","approach":"full-test|smoke-test|skip|manual-review","rationale":"<why this approach>","testCategories":["happy-path","edge-case",...],"crossImpactRisk":"high|medium|low|none"}]}',
47
+ '',
48
+ 'Rules:',
49
+ '- P0 flows with create_spec or add_scenarios action should always get full-test.',
50
+ '- Flows with high cross-impact risk should be promoted to at least P1.',
51
+ '- Flows with high regression risk should include edge-case and boundary categories.',
52
+ '- Skip flows only if confidence < 30 AND no cross-impact risk.',
53
+ '- Include accessibility category for any flow involving interactive UI elements.',
54
+ '- Include permission category for any flow involving role-based features.',
55
+ '- Keep rationale concise (1-2 sentences) explaining why this approach was chosen.',
56
+ ].join('\n');
57
+ }
58
+ export function parseStrategistResponse(text) {
59
+ const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/i);
60
+ const candidates = fenced ? [fenced[1], text] : [text];
61
+ for (const candidate of candidates) {
62
+ const start = candidate.indexOf('{');
63
+ const end = candidate.lastIndexOf('}');
64
+ if (start < 0 || end <= start) {
65
+ continue;
66
+ }
67
+ const raw = candidate.slice(start, end + 1);
68
+ try {
69
+ const parsed = JSON.parse(raw);
70
+ if (parsed && Array.isArray(parsed.strategy)) {
71
+ return parsed;
72
+ }
73
+ }
74
+ catch {
75
+ continue;
76
+ }
77
+ }
78
+ return null;
79
+ }
@@ -0,0 +1,107 @@
1
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2
+ // See LICENSE.txt for license information.
3
+ import { formatApiSurfaceForPrompt } from '../knowledge/api_surface.js';
4
+ import { sanitizeForPrompt } from '../crew/sanitize.js';
5
+ export function buildTestDesignerPrompt(ctx) {
6
+ const relevantClasses = ctx.apiSurface.pageObjects
7
+ .map((po) => po.className)
8
+ .filter((name) => {
9
+ const lower = name.toLowerCase();
10
+ const hints = [ctx.flow.routeFamily, ctx.flow.featureId, ...ctx.flow.userActions.join(' ').split(/\s+/)]
11
+ .filter(Boolean)
12
+ .map((s) => s.toLowerCase().replace(/[^a-z]/g, ''));
13
+ return lower.includes('page') || hints.some((h) => h.length > 3 && lower.includes(h));
14
+ })
15
+ .slice(0, 10);
16
+ const apiBlock = relevantClasses.length > 0
17
+ ? formatApiSurfaceForPrompt(ctx.apiSurface, relevantClasses)
18
+ : 'No page objects available.';
19
+ const existingSpecsBlock = ctx.existingSpecs.length > 0
20
+ ? ctx.existingSpecs.map((s) => `- ${s.relativePath}: ${s.testTitles.join(', ')}`).join('\n')
21
+ : 'No existing specs.';
22
+ const crossImpactBlock = ctx.crossImpacts.length > 0
23
+ ? ctx.crossImpacts.map((ci) => `- ${ci.sourceFamily} → ${ci.affectedFamily}: ${ci.sharedDependency} (${ci.riskLevel})`).join('\n')
24
+ : 'None detected.';
25
+ const categories = ctx.strategy.testCategories.join(', ');
26
+ return [
27
+ 'You are a senior QA engineer designing comprehensive test cases for a Mattermost user flow.',
28
+ '',
29
+ `FLOW: ${ctx.flow.flowName}`,
30
+ `Flow ID: ${ctx.flow.flowId}`,
31
+ `Route Family: ${ctx.flow.routeFamily}${ctx.flow.featureId ? ` / ${ctx.flow.featureId}` : ''}`,
32
+ `Route: ${ctx.flow.specificRoute || '(not specified)'}`,
33
+ `Priority: ${ctx.strategy.priority}`,
34
+ `Approach: ${ctx.strategy.approach}`,
35
+ `User Actions: ${sanitizeForPrompt(ctx.flow.userActions.join('; ') || 'unknown')}`,
36
+ `Evidence: ${sanitizeForPrompt(ctx.flow.evidence)}`,
37
+ '',
38
+ `REQUIRED TEST CATEGORIES: ${categories}`,
39
+ '',
40
+ 'AVAILABLE PAGE OBJECTS:',
41
+ apiBlock,
42
+ '',
43
+ 'EXISTING SPECS (avoid duplicating these):',
44
+ existingSpecsBlock,
45
+ '',
46
+ 'CROSS-FAMILY IMPACTS:',
47
+ crossImpactBlock,
48
+ '',
49
+ 'TASK: Design structured test cases for this flow.',
50
+ '',
51
+ 'Return strict JSON only with this shape:',
52
+ '{"testDesign":{"flowId":"<id>","flowName":"<name>","testCases":[{"name":"<descriptive name>","type":"<category>","preconditions":["<state required>"],"steps":["<user action>"],"expectedOutcome":"<what should happen>","priority":"P0|P1|P2","rationale":"<why this test matters>"}]}}',
53
+ '',
54
+ 'TYPE VALUES: happy-path, edge-case, boundary, negative, state-transition, race-condition, permission, accessibility, performance',
55
+ '',
56
+ 'Rules:',
57
+ '- Every test must describe a specific USER ACTION, not an implementation detail.',
58
+ '- Steps must be concrete: "click Create Channel button" not "test channel creation".',
59
+ '- Include preconditions (logged-in role, existing data state, etc.).',
60
+ '- Reference only page objects and methods listed above.',
61
+ '- Include a mandatory rationale explaining why this specific test case matters.',
62
+ '- Do NOT duplicate tests already covered by existing specs.',
63
+ '- Maximum 15 test cases per flow.',
64
+ '- For accessibility: test keyboard navigation, screen reader support, ARIA labels.',
65
+ '- For performance: test with realistic data volumes, measure load times.',
66
+ '- For edge cases: test unicode input, max-length fields, empty states, concurrent edits.',
67
+ '',
68
+ 'FEW-SHOT EXAMPLES:',
69
+ '',
70
+ 'Edge case example:',
71
+ '```json',
72
+ '{"name":"channel creation with unicode characters and max-length name","type":"edge-case","preconditions":["logged in as team member","team has < 1000 channels"],"steps":["open create channel dialog","enter 64-character name with emoji and CJK characters","click Create"],"expectedOutcome":"channel created successfully, name renders correctly in sidebar and header","priority":"P1","rationale":"catches encoding issues in channel name storage and rendering"}',
73
+ '```',
74
+ '',
75
+ 'Permission example:',
76
+ '```json',
77
+ '{"name":"guest user cannot archive a public channel","type":"permission","preconditions":["logged in as guest user","guest has access to public channel"],"steps":["open channel header menu","look for Archive Channel option"],"expectedOutcome":"Archive Channel option is not visible in the menu","priority":"P0","rationale":"permission escalation bug — guests archiving channels could disrupt entire teams"}',
78
+ '```',
79
+ '',
80
+ 'Accessibility example:',
81
+ '```json',
82
+ '{"name":"keyboard navigation through channel switcher results","type":"accessibility","preconditions":["logged in","channel switcher open via Ctrl+K"],"steps":["type partial channel name","press ArrowDown to navigate results","press Enter to select"],"expectedOutcome":"focus moves visually and via aria-activedescendant, selected channel opens","priority":"P1","rationale":"screen reader users rely on keyboard navigation — broken focus management makes the app unusable"}',
83
+ '```',
84
+ ].join('\n');
85
+ }
86
+ export function parseTestDesignerResponse(text) {
87
+ const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/i);
88
+ const candidates = fenced ? [fenced[1], text] : [text];
89
+ for (const candidate of candidates) {
90
+ const start = candidate.indexOf('{');
91
+ const end = candidate.lastIndexOf('}');
92
+ if (start < 0 || end <= start) {
93
+ continue;
94
+ }
95
+ const raw = candidate.slice(start, end + 1);
96
+ try {
97
+ const parsed = JSON.parse(raw);
98
+ if (parsed?.testDesign?.testCases && Array.isArray(parsed.testDesign.testCases)) {
99
+ return parsed;
100
+ }
101
+ }
102
+ catch {
103
+ continue;
104
+ }
105
+ }
106
+ return null;
107
+ }
@@ -1,6 +1,7 @@
1
1
  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2
2
  // See LICENSE.txt for license information.
3
3
  import { AnthropicProvider } from './anthropic_provider.js';
4
+ import { logger } from './logger.js';
4
5
  import { CustomProvider } from './custom_provider.js';
5
6
  import { OllamaProvider } from './ollama_provider.js';
6
7
  import { OpenAIProvider } from './openai_provider.js';
@@ -131,8 +132,7 @@ export class LLMProviderFactory {
131
132
  const ollama = new OllamaProvider({});
132
133
  const health = await ollama.checkHealth();
133
134
  if (health.healthy) {
134
- // eslint-disable-next-line no-console
135
- console.log('Auto-detected Ollama provider (free, local)');
135
+ logger.info('Auto-detected Ollama provider (free, local)');
136
136
  return ollama;
137
137
  }
138
138
  throw new Error('No LLM provider available. Please either:\n' +
@@ -218,8 +218,7 @@ class HybridProvider {
218
218
  }
219
219
  async generateText(prompt, options) {
220
220
  // Use primary for text generation (free)
221
- // eslint-disable-next-line no-console
222
- console.log(`[Hybrid] Using ${this.primary.name} for text generation`);
221
+ logger.debug(`[Hybrid] Using ${this.primary.name} for text generation`);
223
222
  return await this.primary.generateText(prompt, options);
224
223
  }
225
224
  async analyzeImage(images, prompt, options) {
@@ -227,8 +226,7 @@ class HybridProvider {
227
226
  if (this.useFallbackFor.has('vision')) {
228
227
  // Use fallback if primary doesn't support vision
229
228
  if (!this.primary.capabilities.vision) {
230
- // eslint-disable-next-line no-console
231
- console.log(`[Hybrid] Using ${this.fallback.name} for vision analysis (primary doesn't support vision)`);
229
+ logger.debug(`[Hybrid] Using ${this.fallback.name} for vision analysis (primary doesn't support vision)`);
232
230
  if (!this.fallback.analyzeImage) {
233
231
  throw new UnsupportedCapabilityError(this.name, 'vision');
234
232
  }
@@ -237,8 +235,7 @@ class HybridProvider {
237
235
  }
238
236
  // Try primary first
239
237
  if (this.primary.analyzeImage) {
240
- // eslint-disable-next-line no-console
241
- console.log(`[Hybrid] Using ${this.primary.name} for vision analysis`);
238
+ logger.debug(`[Hybrid] Using ${this.primary.name} for vision analysis`);
242
239
  return await this.primary.analyzeImage(images, prompt, options);
243
240
  }
244
241
  throw new UnsupportedCapabilityError(this.name, 'vision');
@@ -248,8 +245,7 @@ class HybridProvider {
248
245
  if (!this.primary.streamText) {
249
246
  throw new UnsupportedCapabilityError(this.primary.name, 'streaming');
250
247
  }
251
- // eslint-disable-next-line no-console
252
- console.log(`[Hybrid] Using ${this.primary.name} for streaming`);
248
+ logger.debug(`[Hybrid] Using ${this.primary.name} for streaming`);
253
249
  yield* this.primary.streamText(prompt, options);
254
250
  }
255
251
  getUsageStats() {
@@ -2,6 +2,7 @@
2
2
  // See LICENSE.txt for license information.
3
3
  import { lstatSync, readdirSync, readFileSync } from 'fs';
4
4
  import { join, relative, resolve } from 'path';
5
+ import { logger } from '../logger.js';
5
6
  import { isGuessedRoute } from './types.js';
6
7
  const MAX_FILES_PER_FAMILY = 20;
7
8
  const MAX_LINES_PER_FILE = 50;
@@ -289,11 +290,11 @@ export async function enrichFamilies(families, scanned, projectRoot, provider, b
289
290
  // Truncate at the last complete section boundary to avoid malformed input
290
291
  const lastSectionEnd = prompt.lastIndexOf('\n---\n', MAX_PROMPT_CHARS);
291
292
  if (lastSectionEnd > 0) {
292
- console.warn(`[train] Prompt truncated from ${prompt.length} chars at section boundary`);
293
+ logger.warn(`[train] Prompt truncated from ${prompt.length} chars at section boundary`);
293
294
  prompt = prompt.slice(0, lastSectionEnd);
294
295
  }
295
296
  else {
296
- console.warn(`[train] Prompt truncated from ${prompt.length} to ${MAX_PROMPT_CHARS} chars`);
297
+ logger.warn(`[train] Prompt truncated from ${prompt.length} to ${MAX_PROMPT_CHARS} chars`);
297
298
  prompt = prompt.slice(0, MAX_PROMPT_CHARS);
298
299
  }
299
300
  }
@@ -325,7 +326,7 @@ export async function enrichFamilies(families, scanned, projectRoot, provider, b
325
326
  }
326
327
  catch (error) {
327
328
  // On LLM failure, keep families unchanged
328
- console.warn(`[train] LLM enrichment failed for chunk: ${error instanceof Error ? error.message : String(error)}`);
329
+ logger.warn(`[train] LLM enrichment failed for chunk: ${error instanceof Error ? error.message : String(error)}`);
329
330
  enriched.push(...chunk);
330
331
  }
331
332
  finally {
@@ -2,6 +2,7 @@
2
2
  // See LICENSE.txt for license information.
3
3
  import { execFileSync } from 'child_process';
4
4
  import { resolve } from 'path';
5
+ import { logger } from '../logger.js';
5
6
  import { bindFilesToFamilies } from '../knowledge/route_families.js';
6
7
  /**
7
8
  * Glob-style patterns for infrastructure / cross-cutting files that will never
@@ -103,7 +104,7 @@ export function getCommitFiles(projectRoot, since) {
103
104
  });
104
105
  }
105
106
  catch (error) {
106
- console.warn(`[train] git log failed: ${error instanceof Error ? error.message : String(error)}`);
107
+ logger.warn(`[train] git log failed: ${error instanceof Error ? error.message : String(error)}`);
107
108
  return [];
108
109
  }
109
110
  return parseGitLog(log);
package/dist/index.d.ts CHANGED
@@ -54,6 +54,23 @@ export type { PlanReport } from './agent/plan.js';
54
54
  export { runAgenticGeneration } from './agentic/runner.js';
55
55
  export type { ScenarioInput, AgenticRunOptions } from './agentic/runner.js';
56
56
  export type { AgenticConfig, AgenticResult, AgenticSummary, PlaywrightRunResult, TestFailure } from './agentic/types.js';
57
+ export { CrewOrchestrator } from './crew/orchestrator.js';
58
+ export type { CrewConfig, CrewResult } from './crew/orchestrator.js';
59
+ export type { CrewContext } from './crew/context.js';
60
+ export type { Agent, AgentTask, AgentResult, AgentMessage } from './crew/protocol.js';
61
+ export type { AgentRole, TestCaseType, TestCase, TestDesign, CrossImpact, Finding, RegressionRisk, StrategyEntry, } from './crew/types.js';
62
+ export type { WorkflowDef, WorkflowName } from './crew/workflows.js';
63
+ export { WORKFLOWS } from './crew/workflows.js';
64
+ export { ImpactAnalystAgent } from './agents/impact-analyst.js';
65
+ export { CoverageEvaluatorAgent } from './agents/coverage-evaluator.js';
66
+ export { GeneratorAgent } from './agents/generator.js';
67
+ export { ExecutorAgent } from './agents/executor.js';
68
+ export { HealerAgent } from './agents/healer.js';
69
+ export { ExplorerAgent } from './agents/explorer.js';
70
+ export { StrategistAgent } from './agents/strategist.js';
71
+ export { TestDesignerAgent } from './agents/test-designer.js';
72
+ export { CrossImpactAgent } from './agents/cross-impact.js';
73
+ export { RegressionAdvisorAgent } from './agents/regression-advisor.js';
57
74
  export { scanProject } from './training/scanner.js';
58
75
  export { mergeFamilies, detectStaleFamilies } from './training/merger.js';
59
76
  export { enrichFamilies } from './training/enricher.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // See LICENSE.txt for license information.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.runAgenticGeneration = exports.getSpecsForFamily = exports.buildSpecIndex = exports.loadOrBuildApiSurface = exports.buildApiSurface = exports.getUserFlowsForBinding = exports.getPriorityForBinding = exports.getCypressSpecDirsForBinding = exports.bindFilesToFamilies = exports.loadRouteFamilyManifest = exports.buildQualityFixPrompt = exports.buildHealPrompt = exports.renderHealMarkdown = exports.resolveHealTargets = exports.healFromReport = exports.runHealStage = exports.detectHallucinatedMethods = exports.parseGenerationResponse = exports.buildGenerationPrompt = exports.runGenerationStage = exports.runPipeline = exports.captureTraceabilityInput = exports.ingestTraceabilityInput = exports.finalizeGeneratedTests = exports.getAdaptiveThresholds = exports.readFlakyTests = exports.readCalibration = exports.appendFeedbackAndRecompute = exports.buildPlanFromImpact = exports.extractScenarios = exports.getPartialGaps = exports.getGapsWithSuppressed = exports.getGaps = exports.analyzeImpactV2 = exports.captureTraceability = exports.ingestTraceability = exports.handoffGeneratedTests = exports.recommendTestsDeterministic = exports.analyzeImpactDeterministic = exports.validateProviderSetup = exports.LLMProviderFactory = exports.CustomProvider = exports.checkOpenAISetup = exports.OpenAIProvider = exports.checkOllamaSetup = exports.OllamaProvider = exports.checkAnthropicSetup = exports.AnthropicProvider = exports.UnsupportedCapabilityError = exports.LLMProviderError = void 0;
6
- exports.formatValidationReport = exports.buildValidationReport = exports.validateCommit = exports.getCommitFiles = exports.enrichFamilies = exports.detectStaleFamilies = exports.mergeFamilies = exports.scanProject = void 0;
6
+ exports.formatValidationReport = exports.buildValidationReport = exports.validateCommit = exports.getCommitFiles = exports.enrichFamilies = exports.detectStaleFamilies = exports.mergeFamilies = exports.scanProject = exports.RegressionAdvisorAgent = exports.CrossImpactAgent = exports.TestDesignerAgent = exports.StrategistAgent = exports.ExplorerAgent = exports.HealerAgent = exports.ExecutorAgent = exports.GeneratorAgent = exports.CoverageEvaluatorAgent = exports.ImpactAnalystAgent = exports.WORKFLOWS = exports.CrewOrchestrator = void 0;
7
7
  var provider_interface_js_1 = require("./provider_interface.js");
8
8
  Object.defineProperty(exports, "LLMProviderError", { enumerable: true, get: function () { return provider_interface_js_1.LLMProviderError; } });
9
9
  Object.defineProperty(exports, "UnsupportedCapabilityError", { enumerable: true, get: function () { return provider_interface_js_1.UnsupportedCapabilityError; } });
@@ -84,6 +84,32 @@ Object.defineProperty(exports, "getSpecsForFamily", { enumerable: true, get: fun
84
84
  // Agentic generation
85
85
  var runner_js_1 = require("./agentic/runner.js");
86
86
  Object.defineProperty(exports, "runAgenticGeneration", { enumerable: true, get: function () { return runner_js_1.runAgenticGeneration; } });
87
+ // Crew (multi-agent QA workflows)
88
+ var orchestrator_js_2 = require("./crew/orchestrator.js");
89
+ Object.defineProperty(exports, "CrewOrchestrator", { enumerable: true, get: function () { return orchestrator_js_2.CrewOrchestrator; } });
90
+ var workflows_js_1 = require("./crew/workflows.js");
91
+ Object.defineProperty(exports, "WORKFLOWS", { enumerable: true, get: function () { return workflows_js_1.WORKFLOWS; } });
92
+ // Crew agents
93
+ var impact_analyst_js_1 = require("./agents/impact-analyst.js");
94
+ Object.defineProperty(exports, "ImpactAnalystAgent", { enumerable: true, get: function () { return impact_analyst_js_1.ImpactAnalystAgent; } });
95
+ var coverage_evaluator_js_1 = require("./agents/coverage-evaluator.js");
96
+ Object.defineProperty(exports, "CoverageEvaluatorAgent", { enumerable: true, get: function () { return coverage_evaluator_js_1.CoverageEvaluatorAgent; } });
97
+ var generator_js_1 = require("./agents/generator.js");
98
+ Object.defineProperty(exports, "GeneratorAgent", { enumerable: true, get: function () { return generator_js_1.GeneratorAgent; } });
99
+ var executor_js_1 = require("./agents/executor.js");
100
+ Object.defineProperty(exports, "ExecutorAgent", { enumerable: true, get: function () { return executor_js_1.ExecutorAgent; } });
101
+ var healer_js_1 = require("./agents/healer.js");
102
+ Object.defineProperty(exports, "HealerAgent", { enumerable: true, get: function () { return healer_js_1.HealerAgent; } });
103
+ var explorer_js_1 = require("./agents/explorer.js");
104
+ Object.defineProperty(exports, "ExplorerAgent", { enumerable: true, get: function () { return explorer_js_1.ExplorerAgent; } });
105
+ var strategist_js_1 = require("./agents/strategist.js");
106
+ Object.defineProperty(exports, "StrategistAgent", { enumerable: true, get: function () { return strategist_js_1.StrategistAgent; } });
107
+ var test_designer_js_1 = require("./agents/test-designer.js");
108
+ Object.defineProperty(exports, "TestDesignerAgent", { enumerable: true, get: function () { return test_designer_js_1.TestDesignerAgent; } });
109
+ var cross_impact_js_1 = require("./agents/cross-impact.js");
110
+ Object.defineProperty(exports, "CrossImpactAgent", { enumerable: true, get: function () { return cross_impact_js_1.CrossImpactAgent; } });
111
+ var regression_advisor_js_1 = require("./agents/regression-advisor.js");
112
+ Object.defineProperty(exports, "RegressionAdvisorAgent", { enumerable: true, get: function () { return regression_advisor_js_1.RegressionAdvisorAgent; } });
87
113
  // Training (route-families bootstrap and maintenance)
88
114
  var scanner_js_1 = require("./training/scanner.js");
89
115
  Object.defineProperty(exports, "scanProject", { enumerable: true, get: function () { return scanner_js_1.scanProject; } });
@@ -1 +1 @@
1
- {"version":3,"file":"route_families.d.ts","sourceRoot":"","sources":["../../src/knowledge/route_families.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route_families.d.ts","sourceRoot":"","sources":["../../src/knowledge/route_families.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,7 @@ exports.getRoutesForBinding = getRoutesForBinding;
16
16
  exports.clearManifestCache = clearManifestCache;
17
17
  const fs_1 = require("fs");
18
18
  const path_1 = require("path");
19
+ const logger_js_1 = require("../logger.js");
19
20
  const manifestCache = new Map();
20
21
  function matchesGlob(filePath, pattern) {
21
22
  const normalized = filePath.replace(/\\/g, '/');
@@ -168,8 +169,7 @@ function loadRouteFamilyManifest(testsRoot, config) {
168
169
  }
169
170
  }
170
171
  if (config?.strict) {
171
- // eslint-disable-next-line no-console
172
- console.warn('[e2e-agents] Route family manifest not found. The manifest is optional context for AI enrichment — create .e2e-ai-agents/route-families.json to enable family-level routing hints.');
172
+ logger_js_1.logger.warn('Route family manifest not found. Create .e2e-ai-agents/route-families.json to enable family-level routing hints.');
173
173
  }
174
174
  return null;
175
175
  }
package/dist/logger.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  /**
2
- * Simple structured logging system
3
- * Replaces 18 console.log statements with configurable logging
2
+ * Structured logging system.
4
3
  * Environment variable: LOG_LEVEL (ERROR, WARN, INFO, DEBUG)
5
4
  */
6
5
  export declare enum LogLevel {
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,oBAAY,QAAQ;IAChB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACZ;AAqCD,qBAAa,MAAM;IACf,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,QAAQ,CAAU;gBAEd,QAAQ,CAAC,EAAE,QAAQ;IAK/B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM/D,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAC,GAAG,EAAE,MAAM,MAAM,CAAA;KAAC;IAWzC,OAAO,CAAC,GAAG;CAoBd;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,oBAAY,QAAQ;IAChB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACZ;AAqCD,qBAAa,MAAM;IACf,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,QAAQ,CAAU;gBAEd,QAAQ,CAAC,EAAE,QAAQ;IAK/B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM/D,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAC,GAAG,EAAE,MAAM,MAAM,CAAA;KAAC;IAWzC,OAAO,CAAC,GAAG;CAoBd;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC"}
package/dist/logger.js CHANGED
@@ -4,8 +4,7 @@
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.logger = exports.Logger = exports.LogLevel = void 0;
6
6
  /**
7
- * Simple structured logging system
8
- * Replaces 18 console.log statements with configurable logging
7
+ * Structured logging system.
9
8
  * Environment variable: LOG_LEVEL (ERROR, WARN, INFO, DEBUG)
10
9
  */
11
10
  var LogLevel;
@@ -110,7 +110,7 @@ class OllamaProvider extends base_provider_js_1.BaseProvider {
110
110
  // SECURITY: Validate and sanitize URL
111
111
  const urlValidation = validateOllamaUrl(config.baseUrl);
112
112
  if (!urlValidation.valid && urlValidation.warning) {
113
- console.warn(urlValidation.warning);
113
+ logger_js_1.logger.warn(urlValidation.warning);
114
114
  }
115
115
  // SECURITY: Validate timeout
116
116
  const timeout = validateTimeout(config.timeout);
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Cross-Impact Analyst prompt — finds ripple effects across route families.
3
+ */
4
+ import type { RouteFamily } from '../knowledge/route_families.js';
5
+ export interface CrossImpactPromptContext {
6
+ changedFiles: string[];
7
+ families: RouteFamily[];
8
+ /** The families directly impacted by changed files */
9
+ directlyImpactedFamilyIds: string[];
10
+ }
11
+ export declare function buildCrossImpactPrompt(ctx: CrossImpactPromptContext): string;
12
+ export interface CrossImpactAgentResponse {
13
+ crossImpacts: Array<{
14
+ sourceFamily: string;
15
+ affectedFamily: string;
16
+ sharedDependency: string;
17
+ riskLevel: 'high' | 'medium' | 'low' | string;
18
+ evidence: string;
19
+ }>;
20
+ }
21
+ export declare function parseCrossImpactResponse(text: string): CrossImpactAgentResponse | null;
22
+ //# sourceMappingURL=cross-impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-impact.d.ts","sourceRoot":"","sources":["../../src/prompts/cross-impact.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gCAAgC,CAAC;AAIhE,MAAM,WAAW,wBAAwB;IACrC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,sDAAsD;IACtD,yBAAyB,EAAE,MAAM,EAAE,CAAC;CACvC;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,CA+C5E;AAED,MAAM,WAAW,wBAAwB;IACrC,YAAY,EAAE,KAAK,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;QAC9C,QAAQ,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACN;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAqBtF"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
3
+ // See LICENSE.txt for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.buildCrossImpactPrompt = buildCrossImpactPrompt;
6
+ exports.parseCrossImpactResponse = parseCrossImpactResponse;
7
+ const sanitize_js_1 = require("../crew/sanitize.js");
8
+ function buildCrossImpactPrompt(ctx) {
9
+ const familiesBlock = ctx.families
10
+ .map((f) => {
11
+ const paths = [
12
+ ...(f.webappPaths || []),
13
+ ...(f.serverPaths || []),
14
+ ...(f.components || []),
15
+ ];
16
+ return `- ${f.id}: routes=[${f.routes.join(', ')}] paths=[${paths.join(', ')}] pageObjects=[${(f.pageObjects || []).join(', ')}]`;
17
+ })
18
+ .join('\n');
19
+ const changedBlock = ctx.changedFiles.map((f) => (0, sanitize_js_1.sanitizeForPrompt)(f)).join('\n');
20
+ return [
21
+ 'You are analyzing code changes in Mattermost to identify cross-family ripple effects.',
22
+ 'When a change in one route family could affect another family through shared dependencies,',
23
+ 'that is a cross-impact.',
24
+ '',
25
+ `CHANGED FILES (${ctx.changedFiles.length}):`,
26
+ changedBlock,
27
+ '',
28
+ `DIRECTLY IMPACTED FAMILIES: ${ctx.directlyImpactedFamilyIds.join(', ')}`,
29
+ '',
30
+ `ALL ROUTE FAMILIES (${ctx.families.length}):`,
31
+ familiesBlock,
32
+ '',
33
+ 'TASK: Identify cross-family impacts. For each pair, explain the shared dependency.',
34
+ '',
35
+ 'Look for:',
36
+ '1. Shared webapp paths (same component used by multiple families)',
37
+ '2. Shared page objects (same PO class referenced by multiple families)',
38
+ '3. Shared API endpoints (changes affecting data used by multiple families)',
39
+ '4. Shared components (React components imported across family boundaries)',
40
+ '5. Shared state management (Redux stores, contexts used across families)',
41
+ '',
42
+ 'Return strict JSON only with this shape:',
43
+ '{"crossImpacts":[{"sourceFamily":"<directly impacted family>","affectedFamily":"<indirectly affected family>","sharedDependency":"<what connects them>","riskLevel":"high|medium|low","evidence":"<specific file/component/API that creates the dependency>"}]}',
44
+ '',
45
+ 'Rules:',
46
+ '- Only report cross-impacts where both families are in the manifest.',
47
+ '- sourceFamily must be one of the directly impacted families.',
48
+ '- affectedFamily must be DIFFERENT from sourceFamily.',
49
+ '- Risk levels: high = shared data model/state, medium = shared UI component, low = shared utility.',
50
+ '- Evidence must cite specific files, components, or API paths.',
51
+ '- Return empty array if no cross-impacts are found.',
52
+ ].join('\n');
53
+ }
54
+ function parseCrossImpactResponse(text) {
55
+ const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/i);
56
+ const candidates = fenced ? [fenced[1], text] : [text];
57
+ for (const candidate of candidates) {
58
+ const start = candidate.indexOf('{');
59
+ const end = candidate.lastIndexOf('}');
60
+ if (start < 0 || end <= start) {
61
+ continue;
62
+ }
63
+ const raw = candidate.slice(start, end + 1);
64
+ try {
65
+ const parsed = JSON.parse(raw);
66
+ if (parsed && Array.isArray(parsed.crossImpacts)) {
67
+ return parsed;
68
+ }
69
+ }
70
+ catch {
71
+ continue;
72
+ }
73
+ }
74
+ return null;
75
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Strategist prompt — designs overall test strategy from impact analysis,
3
+ * cross-impact data, and regression risk.
4
+ */
5
+ import type { FlowDecision } from '../validation/output_schema.js';
6
+ import type { CrossImpact, RegressionRisk } from '../crew/types.js';
7
+ export interface StrategistPromptContext {
8
+ impactedFlows: FlowDecision[];
9
+ crossImpacts: CrossImpact[];
10
+ regressionRisks: RegressionRisk[];
11
+ }
12
+ export declare function buildStrategistPrompt(ctx: StrategistPromptContext): string;
13
+ export interface StrategistAgentResponse {
14
+ strategy: Array<{
15
+ flowId: string;
16
+ flowName: string;
17
+ priority: 'P0' | 'P1' | 'P2' | string;
18
+ approach: 'full-test' | 'smoke-test' | 'skip' | 'manual-review' | string;
19
+ rationale: string;
20
+ testCategories: string[];
21
+ crossImpactRisk: 'high' | 'medium' | 'low' | 'none' | string;
22
+ }>;
23
+ }
24
+ export declare function parseStrategistResponse(text: string): StrategistAgentResponse | null;
25
+ //# sourceMappingURL=strategist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategist.d.ts","sourceRoot":"","sources":["../../src/prompts/strategist.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAC,WAAW,EAAE,cAAc,EAAgB,MAAM,kBAAkB,CAAC;AAGjF,MAAM,WAAW,uBAAuB;IACpC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,eAAe,EAAE,cAAc,EAAE,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,uBAAuB,GAAG,MAAM,CA4D1E;AAED,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,KAAK,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;QACtC,QAAQ,EAAE,WAAW,GAAG,YAAY,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,CAAC;QACzE,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,eAAe,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;KAChE,CAAC,CAAC;CACN;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAqBpF"}