@shadowcoderr/context-graph 0.3.3 → 0.3.4

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 (36) hide show
  1. package/README.md +448 -88
  2. package/dist/analyzers/a11y-extractor.d.ts +19 -5
  3. package/dist/analyzers/a11y-extractor.d.ts.map +1 -1
  4. package/dist/analyzers/a11y-extractor.js +274 -104
  5. package/dist/analyzers/a11y-extractor.js.map +1 -1
  6. package/dist/analyzers/network-logger.d.ts +20 -2
  7. package/dist/analyzers/network-logger.d.ts.map +1 -1
  8. package/dist/analyzers/network-logger.js +122 -42
  9. package/dist/analyzers/network-logger.js.map +1 -1
  10. package/dist/analyzers/network-patterns.d.ts +73 -0
  11. package/dist/analyzers/network-patterns.d.ts.map +1 -0
  12. package/dist/analyzers/network-patterns.js +316 -0
  13. package/dist/analyzers/network-patterns.js.map +1 -0
  14. package/dist/analyzers/screenshot-capturer.d.ts +73 -0
  15. package/dist/analyzers/screenshot-capturer.d.ts.map +1 -0
  16. package/dist/analyzers/screenshot-capturer.js +190 -0
  17. package/dist/analyzers/screenshot-capturer.js.map +1 -0
  18. package/dist/cli/index.js +15 -6
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/core/capture-engine.d.ts +30 -25
  21. package/dist/core/capture-engine.d.ts.map +1 -1
  22. package/dist/core/capture-engine.js +290 -276
  23. package/dist/core/capture-engine.js.map +1 -1
  24. package/dist/exporters/ai-context-bundler.d.ts +88 -0
  25. package/dist/exporters/ai-context-bundler.d.ts.map +1 -0
  26. package/dist/exporters/ai-context-bundler.js +380 -0
  27. package/dist/exporters/ai-context-bundler.js.map +1 -0
  28. package/dist/security/redactor.d.ts +16 -0
  29. package/dist/security/redactor.d.ts.map +1 -1
  30. package/dist/security/redactor.js +127 -57
  31. package/dist/security/redactor.js.map +1 -1
  32. package/dist/storage/engine.d.ts +24 -21
  33. package/dist/storage/engine.d.ts.map +1 -1
  34. package/dist/storage/engine.js +208 -175
  35. package/dist/storage/engine.js.map +1 -1
  36. package/package.json +3 -3
@@ -0,0 +1,73 @@
1
+ import { Page } from '@playwright/test';
2
+ export interface ScreenshotOptions {
3
+ fullPage: boolean;
4
+ format: 'png' | 'jpeg' | 'webp';
5
+ quality?: number;
6
+ elementTargeting: boolean;
7
+ maxElements: number;
8
+ timeout: number;
9
+ }
10
+ export interface ScreenshotResult {
11
+ fullPagePath?: string | undefined;
12
+ elementPaths: Array<{
13
+ elementId: string;
14
+ path: string;
15
+ selector: string;
16
+ label?: string | undefined;
17
+ }>;
18
+ capturedAt: string;
19
+ dimensions?: {
20
+ width: number;
21
+ height: number;
22
+ } | undefined;
23
+ }
24
+ export declare class ScreenshotCapturer {
25
+ private options;
26
+ constructor(options?: Partial<ScreenshotOptions>);
27
+ /**
28
+ * Capture a full-page screenshot and return the saved path, or null on failure.
29
+ */
30
+ captureFullPage(page: Page, outputDir: string, _captureId: string): Promise<string | null>;
31
+ /**
32
+ * Capture individual element screenshots for key interactive elements.
33
+ * Elements that are not visible, off-screen, or zero-size are skipped gracefully.
34
+ */
35
+ captureElementScreenshots(page: Page, outputDir: string, _captureId: string, elements: Array<{
36
+ elementId: string;
37
+ selector: string;
38
+ label?: string;
39
+ }>): Promise<ScreenshotResult['elementPaths']>;
40
+ /**
41
+ * Orchestrates capturing screenshots for a page. Returns a ScreenshotResult
42
+ * with all paths. The caller is responsible for creating `pageDir`.
43
+ */
44
+ capturePageScreenshots(page: Page, pageDir: string, captureId: string, interactiveElements?: Array<{
45
+ elementId: string;
46
+ selector: string;
47
+ label?: string;
48
+ }>): Promise<ScreenshotResult>;
49
+ /**
50
+ * Build a list of element descriptors suitable for element screenshot capture
51
+ * from locators data.
52
+ */
53
+ static buildElementTargets(locatorsElements: Array<{
54
+ elementId: string;
55
+ tagName: string;
56
+ text?: string;
57
+ attributes: Record<string, any>;
58
+ computedState: {
59
+ isVisible: boolean;
60
+ isEnabled: boolean;
61
+ };
62
+ locators: Array<{
63
+ strategy: string;
64
+ value: string;
65
+ isUnique?: boolean;
66
+ }>;
67
+ }>): Array<{
68
+ elementId: string;
69
+ selector: string;
70
+ label?: string;
71
+ }>;
72
+ }
73
+ //# sourceMappingURL=screenshot-capturer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot-capturer.d.ts","sourceRoot":"","sources":["../../src/analyzers/screenshot-capturer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAKxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,KAAK,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC5B,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,SAAS,CAAC;CACf;AAWD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAIhD;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA6BhG;;;OAGG;IACG,yBAAyB,CAC7B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GACvE,OAAO,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAmD5C;;;OAGG;IACG,sBAAsB,CAC1B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,mBAAmB,GAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAM,GACvF,OAAO,CAAC,gBAAgB,CAAC;IAqC5B;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CACxB,gBAAgB,EAAE,KAAK,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,aAAa,EAAE;YAAE,SAAS,EAAE,OAAO,CAAC;YAAC,SAAS,EAAE,OAAO,CAAA;SAAE,CAAC;QAC1D,QAAQ,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KAC1E,CAAC,GACD,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA0BlE"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ScreenshotCapturer = void 0;
37
+ const fs = __importStar(require("fs-extra"));
38
+ const path = __importStar(require("path"));
39
+ const logger_1 = require("../utils/logger");
40
+ const DEFAULT_OPTIONS = {
41
+ fullPage: true,
42
+ format: 'png',
43
+ quality: 90,
44
+ elementTargeting: false,
45
+ maxElements: 10,
46
+ timeout: 15000,
47
+ };
48
+ class ScreenshotCapturer {
49
+ options;
50
+ constructor(options) {
51
+ this.options = { ...DEFAULT_OPTIONS, ...options };
52
+ }
53
+ /**
54
+ * Capture a full-page screenshot and return the saved path, or null on failure.
55
+ */
56
+ async captureFullPage(page, outputDir, _captureId) {
57
+ try {
58
+ await fs.ensureDir(outputDir);
59
+ const filename = `screenshot.${this.options.format}`;
60
+ const filepath = path.join(outputDir, filename);
61
+ const screenshotOpts = {
62
+ path: filepath,
63
+ fullPage: this.options.fullPage,
64
+ type: this.options.format === 'webp' ? 'png' : this.options.format, // Playwright screenshot doesn't support webp directly in some versions, fallback to png for type if it's webp or just cast to any
65
+ animations: 'disabled',
66
+ timeout: this.options.timeout,
67
+ };
68
+ // quality only applies to lossy formats
69
+ if (this.options.format !== 'png' && this.options.quality !== undefined) {
70
+ screenshotOpts.quality = this.options.quality;
71
+ }
72
+ await page.screenshot(screenshotOpts);
73
+ logger_1.logger.info(`Full-page screenshot saved: ${filepath}`);
74
+ return filepath;
75
+ }
76
+ catch (error) {
77
+ logger_1.logger.warn(`Failed to capture full-page screenshot: ${error.message}`);
78
+ return null;
79
+ }
80
+ }
81
+ /**
82
+ * Capture individual element screenshots for key interactive elements.
83
+ * Elements that are not visible, off-screen, or zero-size are skipped gracefully.
84
+ */
85
+ async captureElementScreenshots(page, outputDir, _captureId, elements) {
86
+ const results = [];
87
+ await fs.ensureDir(outputDir);
88
+ const batch = elements.slice(0, this.options.maxElements);
89
+ for (const element of batch) {
90
+ try {
91
+ const locator = page.locator(element.selector).first();
92
+ const count = await locator.count().catch(() => 0);
93
+ if (count === 0)
94
+ continue;
95
+ const isVisible = await locator.isVisible({ timeout: 2000 }).catch(() => false);
96
+ if (!isVisible)
97
+ continue;
98
+ const box = await locator.boundingBox().catch(() => null);
99
+ if (!box || box.width === 0 || box.height === 0)
100
+ continue;
101
+ const safe = element.elementId.replace(/[^a-z0-9_-]/gi, '_');
102
+ const filename = `element_${safe}.${this.options.format}`;
103
+ const filepath = path.join(outputDir, filename);
104
+ const eleOpts = {
105
+ path: filepath,
106
+ type: this.options.format === 'webp' ? 'png' : this.options.format,
107
+ animations: 'disabled',
108
+ timeout: this.options.timeout,
109
+ };
110
+ if (this.options.format !== 'png' && this.options.quality !== undefined) {
111
+ eleOpts.quality = this.options.quality;
112
+ }
113
+ await locator.screenshot(eleOpts);
114
+ results.push({
115
+ elementId: element.elementId,
116
+ path: filepath,
117
+ selector: element.selector,
118
+ label: element.label || undefined
119
+ });
120
+ logger_1.logger.debug(`Element screenshot saved: ${filepath}`);
121
+ }
122
+ catch (error) {
123
+ logger_1.logger.debug(`Skipping element screenshot (${element.elementId}): ${error.message}`);
124
+ }
125
+ }
126
+ return results;
127
+ }
128
+ /**
129
+ * Orchestrates capturing screenshots for a page. Returns a ScreenshotResult
130
+ * with all paths. The caller is responsible for creating `pageDir`.
131
+ */
132
+ async capturePageScreenshots(page, pageDir, captureId, interactiveElements = []) {
133
+ const screenshotsDir = path.join(pageDir, 'screenshots');
134
+ const result = {
135
+ elementPaths: [],
136
+ capturedAt: new Date().toISOString(),
137
+ };
138
+ // Full-page screenshot
139
+ const fullPagePath = await this.captureFullPage(page, screenshotsDir, captureId);
140
+ if (fullPagePath) {
141
+ result.fullPagePath = fullPagePath;
142
+ // Attempt to read dimensions via viewport
143
+ try {
144
+ const vp = page.viewportSize();
145
+ if (vp) {
146
+ result.dimensions = { width: vp.width, height: vp.height };
147
+ }
148
+ }
149
+ catch (error) {
150
+ logger_1.logger.debug(`Failed to get viewport size: ${error.message}`);
151
+ }
152
+ }
153
+ // Optional element-level screenshots
154
+ if (this.options.elementTargeting && interactiveElements.length > 0) {
155
+ const elementsDir = path.join(screenshotsDir, 'elements');
156
+ result.elementPaths = await this.captureElementScreenshots(page, elementsDir, captureId, interactiveElements);
157
+ }
158
+ return result;
159
+ }
160
+ /**
161
+ * Build a list of element descriptors suitable for element screenshot capture
162
+ * from locators data.
163
+ */
164
+ static buildElementTargets(locatorsElements) {
165
+ return locatorsElements
166
+ .filter(el => el.computedState.isVisible && el.computedState.isEnabled)
167
+ .filter(el => ['button', 'a', 'input', 'select', 'textarea'].includes(el.tagName))
168
+ .map(el => {
169
+ // Prefer a unique locator or fall back to the first available
170
+ const best = el.locators.find(l => l.isUnique && l.strategy === 'testid') ||
171
+ el.locators.find(l => l.isUnique && l.strategy === 'role') ||
172
+ el.locators.find(l => l.isUnique) ||
173
+ el.locators[0];
174
+ if (!best)
175
+ return null;
176
+ return {
177
+ elementId: el.elementId,
178
+ selector: el.attributes?.['data-testid']
179
+ ? `[data-testid="${el.attributes['data-testid']}"]`
180
+ : el.attributes?.id
181
+ ? `#${el.attributes.id}`
182
+ : best.value,
183
+ label: el.text?.trim().substring(0, 40) || el.attributes?.['aria-label'] || undefined,
184
+ };
185
+ })
186
+ .filter(Boolean);
187
+ }
188
+ }
189
+ exports.ScreenshotCapturer = ScreenshotCapturer;
190
+ //# sourceMappingURL=screenshot-capturer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot-capturer.js","sourceRoot":"","sources":["../../src/analyzers/screenshot-capturer.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -113,13 +113,22 @@ program.action(async (startUrl, options) => {
113
113
  await runtime.setupPage(page);
114
114
  if (finalStartUrl) {
115
115
  spinner.text = `Navigating to ${finalStartUrl}...`;
116
- await page.goto(finalStartUrl, { waitUntil: 'networkidle' });
117
- // Give a moment for any post-load scripts to run
118
- await new Promise(r => setTimeout(r, 1000));
119
- // Ensure initial page is captured (fallback if events didn't fire)
120
- await runtime.capturePageIfNeeded(page);
116
+ try {
117
+ await page.goto(finalStartUrl, { waitUntil: 'domcontentloaded' });
118
+ spinner.succeed(`Navigated to ${finalStartUrl}`);
119
+ // Give a moment for any post-load scripts to run
120
+ await new Promise(r => setTimeout(r, 1000));
121
+ // Ensure initial page is captured (fallback if events didn't fire)
122
+ await runtime.capturePageIfNeeded(page);
123
+ }
124
+ catch (error) {
125
+ spinner.fail(`Failed to navigate to ${finalStartUrl}`);
126
+ throw error;
127
+ }
128
+ }
129
+ else {
130
+ spinner.stop();
121
131
  }
122
- spinner.stop();
123
132
  console.log(chalk_1.default.green('✓ Browser ready!'));
124
133
  console.log(chalk_1.default.blue('Navigate through the application. Each page will be captured automatically.'));
125
134
  console.log(chalk_1.default.yellow('Press Ctrl+C to stop and save all data...'));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -6,47 +6,52 @@ export declare class CaptureEngine {
6
6
  private a11yExtractor;
7
7
  private locatorGenerator;
8
8
  private networkLogger;
9
+ private screenshotCapturer;
9
10
  private redactor;
10
11
  private validator;
11
12
  constructor(config: Config);
12
13
  attachNetworkListeners(page: Page): Promise<void>;
13
- capturePageSnapshot(page: Page, config: Config, consoleMessages?: any[]): Promise<PageSnapshot>;
14
+ /**
15
+ * Capture a full snapshot of the current page state.
16
+ *
17
+ * @param page — Playwright Page instance
18
+ * @param config — Active configuration
19
+ * @param consoleMessages — Console messages buffered by BrowserAdapter
20
+ * @param pageDir — If provided, full-page screenshots are captured here.
21
+ * The caller is responsible for ensuring the directory
22
+ * exists before passing this parameter.
23
+ */
24
+ capturePageSnapshot(page: Page, config: Config, consoleMessages?: any[], pageDir?: string): Promise<PageSnapshot>;
14
25
  private getFrameHierarchy;
15
- getRedactionAudit(): import("../types/storage").RedactionAuditEntry[];
16
- private generatePageName;
17
- private sanitize;
18
26
  /**
19
- * Compute a content hash for change detection
20
- * Combines DOM, accessibility tree, and locators into a single hash
27
+ * Compute a structural fingerprint of the page for change detection.
28
+ *
29
+ * Instead of truncating the raw HTML at 5 000 chars (which causes SPAs with
30
+ * large identical `<head>` sections to hash identically across routes), we
31
+ * extract a token stream of `tagName[#id][@role]` from the DOM. This is
32
+ * order-sensitive, compact, and captures the semantic structure without
33
+ * being affected by text-content changes that don't alter layout.
21
34
  */
22
35
  private computeContentHash;
23
36
  /**
24
- * Normalize DOM for hashing by removing dynamic content
37
+ * Extract a structural token stream from HTML rather than truncating text.
38
+ * Produces strings like `div#app@main|button|input@textbox` — semantically
39
+ * rich but immune to text-content noise and `<head>` boilerplate.
40
+ *
41
+ * Up to 500 tokens are extracted to bound memory usage while covering
42
+ * enough of the page to reliably detect structural changes.
25
43
  */
26
44
  private normalizeDomForHash;
27
- /**
28
- * Normalize accessibility tree for hashing
29
- */
30
45
  private normalizeA11yForHash;
31
- /**
32
- * Capture page state information
33
- */
46
+ private generatePageName;
47
+ private sanitizeName;
34
48
  private capturePageState;
35
- /**
36
- * Capture network request summary
37
- */
38
49
  private captureNetworkSummary;
39
- /**
40
- * Capture enhanced timing metrics
41
- */
42
50
  private captureEnhancedTiming;
43
- /**
44
- * Enhance locators data with CSS styles, viewport info, and form details
45
- */
46
51
  private enhanceLocatorsData;
47
- /**
48
- * Capture form field details
49
- */
50
52
  private captureFormFieldDetails;
53
+ getRedactionAudit(): import("../types/storage").RedactionAuditEntry[];
54
+ /** Network event count — passed to StorageEngine for statistics */
55
+ getNetworkEventCount(): number;
51
56
  }
52
57
  //# sourceMappingURL=capture-engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capture-engine.d.ts","sourceRoot":"","sources":["../../src/core/capture-engine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAShD,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,SAAS,CAAgB;gBAErB,MAAM,EAAE,MAAM;IASpB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAE,GAAG,EAAO,GAAG,OAAO,CAAC,YAAY,CAAC;YAwG3F,iBAAiB;IAkB/B,iBAAiB;IAIjB,OAAO,CAAC,gBAAgB;IA8CxB,OAAO,CAAC,QAAQ;IAIhB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;YACW,gBAAgB;IAgE9B;;OAEG;YACW,qBAAqB;IA2CnC;;OAEG;YACW,qBAAqB;IA6BnC;;OAEG;YACW,mBAAmB;IA8GjC;;OAEG;YACW,uBAAuB;CAuEtC"}
1
+ {"version":3,"file":"capture-engine.d.ts","sourceRoot":"","sources":["../../src/core/capture-engine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAUhD,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,SAAS,CAAgB;gBAErB,MAAM,EAAE,MAAM;IAgBpB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;;;;;;;;OASG;IACG,mBAAmB,CACvB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,GAAG,EAAO,EAC3B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC;YAgJV,iBAAiB;IAuB/B;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,gBAAgB;IA0CxB,OAAO,CAAC,YAAY;YAUN,gBAAgB;YA4DhB,qBAAqB;YAwCrB,qBAAqB;YA8BrB,mBAAmB;YAyHnB,uBAAuB;IA6DrC,iBAAiB;IAIjB,mEAAmE;IACnE,oBAAoB,IAAI,MAAM;CAG/B"}