figma-console-mcp 0.1.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 (118) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +328 -0
  3. package/dist/browser/base.d.ts +50 -0
  4. package/dist/browser/base.d.ts.map +1 -0
  5. package/dist/browser/base.js +6 -0
  6. package/dist/browser/base.js.map +1 -0
  7. package/dist/browser/local.d.ts +66 -0
  8. package/dist/browser/local.d.ts.map +1 -0
  9. package/dist/browser/local.js +223 -0
  10. package/dist/browser/local.js.map +1 -0
  11. package/dist/cloudflare/browser/base.js +5 -0
  12. package/dist/cloudflare/browser/cloudflare.js +156 -0
  13. package/dist/cloudflare/browser-manager.js +157 -0
  14. package/dist/cloudflare/core/config.js +161 -0
  15. package/dist/cloudflare/core/console-monitor.js +382 -0
  16. package/dist/cloudflare/core/enrichment/enrichment-service.js +272 -0
  17. package/dist/cloudflare/core/enrichment/index.js +7 -0
  18. package/dist/cloudflare/core/enrichment/relationship-mapper.js +351 -0
  19. package/dist/cloudflare/core/enrichment/style-resolver.js +326 -0
  20. package/dist/cloudflare/core/figma-api.js +273 -0
  21. package/dist/cloudflare/core/figma-desktop-connector.js +383 -0
  22. package/dist/cloudflare/core/figma-style-extractor.js +311 -0
  23. package/dist/cloudflare/core/figma-tools.js +2299 -0
  24. package/dist/cloudflare/core/logger.js +53 -0
  25. package/dist/cloudflare/core/snippet-injector.js +96 -0
  26. package/dist/cloudflare/core/types/enriched.js +5 -0
  27. package/dist/cloudflare/core/types/index.js +4 -0
  28. package/dist/cloudflare/index.js +1059 -0
  29. package/dist/cloudflare/test-browser.js +88 -0
  30. package/dist/config.d.ts +17 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +141 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/core/config.d.ts +17 -0
  35. package/dist/core/config.d.ts.map +1 -0
  36. package/dist/core/config.js +162 -0
  37. package/dist/core/config.js.map +1 -0
  38. package/dist/core/console-monitor.d.ts +81 -0
  39. package/dist/core/console-monitor.d.ts.map +1 -0
  40. package/dist/core/console-monitor.js +383 -0
  41. package/dist/core/console-monitor.js.map +1 -0
  42. package/dist/core/enrichment/enrichment-service.d.ts +52 -0
  43. package/dist/core/enrichment/enrichment-service.d.ts.map +1 -0
  44. package/dist/core/enrichment/enrichment-service.js +273 -0
  45. package/dist/core/enrichment/enrichment-service.js.map +1 -0
  46. package/dist/core/enrichment/index.d.ts +8 -0
  47. package/dist/core/enrichment/index.d.ts.map +1 -0
  48. package/dist/core/enrichment/index.js +8 -0
  49. package/dist/core/enrichment/index.js.map +1 -0
  50. package/dist/core/enrichment/relationship-mapper.d.ts +106 -0
  51. package/dist/core/enrichment/relationship-mapper.d.ts.map +1 -0
  52. package/dist/core/enrichment/relationship-mapper.js +352 -0
  53. package/dist/core/enrichment/relationship-mapper.js.map +1 -0
  54. package/dist/core/enrichment/style-resolver.d.ts +80 -0
  55. package/dist/core/enrichment/style-resolver.d.ts.map +1 -0
  56. package/dist/core/enrichment/style-resolver.js +327 -0
  57. package/dist/core/enrichment/style-resolver.js.map +1 -0
  58. package/dist/core/figma-api.d.ts +137 -0
  59. package/dist/core/figma-api.d.ts.map +1 -0
  60. package/dist/core/figma-api.js +274 -0
  61. package/dist/core/figma-api.js.map +1 -0
  62. package/dist/core/figma-desktop-connector.d.ts +52 -0
  63. package/dist/core/figma-desktop-connector.d.ts.map +1 -0
  64. package/dist/core/figma-desktop-connector.js +384 -0
  65. package/dist/core/figma-desktop-connector.js.map +1 -0
  66. package/dist/core/figma-style-extractor.d.ts +76 -0
  67. package/dist/core/figma-style-extractor.d.ts.map +1 -0
  68. package/dist/core/figma-style-extractor.js +312 -0
  69. package/dist/core/figma-style-extractor.js.map +1 -0
  70. package/dist/core/figma-tools.d.ts +15 -0
  71. package/dist/core/figma-tools.d.ts.map +1 -0
  72. package/dist/core/figma-tools.js +2300 -0
  73. package/dist/core/figma-tools.js.map +1 -0
  74. package/dist/core/logger.d.ts +22 -0
  75. package/dist/core/logger.d.ts.map +1 -0
  76. package/dist/core/logger.js +54 -0
  77. package/dist/core/logger.js.map +1 -0
  78. package/dist/core/snippet-injector.d.ts +24 -0
  79. package/dist/core/snippet-injector.d.ts.map +1 -0
  80. package/dist/core/snippet-injector.js +97 -0
  81. package/dist/core/snippet-injector.js.map +1 -0
  82. package/dist/core/types/enriched.d.ts +213 -0
  83. package/dist/core/types/enriched.d.ts.map +1 -0
  84. package/dist/core/types/enriched.js +6 -0
  85. package/dist/core/types/enriched.js.map +1 -0
  86. package/dist/core/types/index.d.ts +112 -0
  87. package/dist/core/types/index.d.ts.map +1 -0
  88. package/dist/core/types/index.js +5 -0
  89. package/dist/core/types/index.js.map +1 -0
  90. package/dist/index.d.ts +8 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +72 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/local.d.ts +57 -0
  95. package/dist/local.d.ts.map +1 -0
  96. package/dist/local.js +668 -0
  97. package/dist/local.js.map +1 -0
  98. package/dist/logger.d.ts +22 -0
  99. package/dist/logger.d.ts.map +1 -0
  100. package/dist/logger.js +45 -0
  101. package/dist/logger.js.map +1 -0
  102. package/dist/server.d.ts +40 -0
  103. package/dist/server.d.ts.map +1 -0
  104. package/dist/server.js +99 -0
  105. package/dist/server.js.map +1 -0
  106. package/dist/tools/index.d.ts +15 -0
  107. package/dist/tools/index.d.ts.map +1 -0
  108. package/dist/tools/index.js +184 -0
  109. package/dist/tools/index.js.map +1 -0
  110. package/dist/types/index.d.ts +102 -0
  111. package/dist/types/index.d.ts.map +1 -0
  112. package/dist/types/index.js +6 -0
  113. package/dist/types/index.js.map +1 -0
  114. package/figma-desktop-bridge/README.md +232 -0
  115. package/figma-desktop-bridge/code.js +133 -0
  116. package/figma-desktop-bridge/manifest.json +13 -0
  117. package/figma-desktop-bridge/ui.html +200 -0
  118. package/package.json +77 -0
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Test script to verify Browser Rendering API access
3
+ * Run with: npx wrangler dev and visit /test-browser
4
+ */
5
+ import puppeteer from '@cloudflare/puppeteer';
6
+ export async function testBrowserRendering(env) {
7
+ const results = {
8
+ timestamp: new Date().toISOString(),
9
+ tests: [],
10
+ };
11
+ // Test 1: Check BROWSER binding exists
12
+ results.tests.push({
13
+ name: 'BROWSER binding exists',
14
+ passed: !!env.BROWSER,
15
+ details: env.BROWSER ? 'BROWSER binding found' : 'BROWSER binding missing',
16
+ });
17
+ if (!env.BROWSER) {
18
+ return {
19
+ ...results,
20
+ overall: 'FAILED',
21
+ message: 'BROWSER binding not found. Check wrangler.jsonc configuration.',
22
+ };
23
+ }
24
+ // Test 2: Try to launch browser
25
+ try {
26
+ const browser = await puppeteer.launch(env.BROWSER, { keep_alive: 60000 });
27
+ results.tests.push({
28
+ name: 'Browser launch',
29
+ passed: true,
30
+ details: 'Successfully launched browser instance',
31
+ });
32
+ // Test 3: Try to create page
33
+ try {
34
+ const page = await browser.newPage();
35
+ results.tests.push({
36
+ name: 'Create browser page',
37
+ passed: true,
38
+ details: 'Successfully created new page',
39
+ });
40
+ // Test 4: Try to navigate
41
+ try {
42
+ await page.goto('https://example.com', { waitUntil: 'networkidle0' });
43
+ results.tests.push({
44
+ name: 'Navigate to URL',
45
+ passed: true,
46
+ details: 'Successfully navigated to example.com',
47
+ });
48
+ // Test 5: Get page title
49
+ const title = await page.title();
50
+ results.tests.push({
51
+ name: 'Read page content',
52
+ passed: true,
53
+ details: `Page title: "${title}"`,
54
+ });
55
+ await page.close();
56
+ }
57
+ catch (error) {
58
+ results.tests.push({
59
+ name: 'Navigate to URL',
60
+ passed: false,
61
+ error: error instanceof Error ? error.message : String(error),
62
+ });
63
+ }
64
+ }
65
+ catch (error) {
66
+ results.tests.push({
67
+ name: 'Create browser page',
68
+ passed: false,
69
+ error: error instanceof Error ? error.message : String(error),
70
+ });
71
+ }
72
+ await browser.close();
73
+ }
74
+ catch (error) {
75
+ results.tests.push({
76
+ name: 'Browser launch',
77
+ passed: false,
78
+ error: error instanceof Error ? error.message : String(error),
79
+ hint: 'Browser Rendering API may not be enabled on your account',
80
+ });
81
+ }
82
+ const allPassed = results.tests.every((test) => test.passed);
83
+ return {
84
+ ...results,
85
+ overall: allPassed ? 'PASSED' : 'FAILED',
86
+ summary: `${results.tests.filter((t) => t.passed).length}/${results.tests.length} tests passed`,
87
+ };
88
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Configuration management for Figma Console MCP server
3
+ */
4
+ import type { ServerConfig } from './types/index.js';
5
+ /**
6
+ * Load configuration from file or use defaults
7
+ */
8
+ export declare function loadConfig(): ServerConfig;
9
+ /**
10
+ * Validate configuration
11
+ */
12
+ export declare function validateConfig(config: ServerConfig): void;
13
+ /**
14
+ * Get configuration with validation
15
+ */
16
+ export declare function getConfig(): ServerConfig;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA6CrD;;GAEG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAqBzC;AA0BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAkCzD;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,YAAY,CAIxC"}
package/dist/config.js ADDED
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration management for Figma Console MCP server
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadConfig = loadConfig;
7
+ exports.validateConfig = validateConfig;
8
+ exports.getConfig = getConfig;
9
+ const fs_1 = require("fs");
10
+ const os_1 = require("os");
11
+ const path_1 = require("path");
12
+ /**
13
+ * Default configuration values
14
+ */
15
+ const DEFAULT_CONFIG = {
16
+ browser: {
17
+ headless: false,
18
+ args: [
19
+ '--disable-blink-features=AutomationControlled',
20
+ '--disable-dev-shm-usage',
21
+ '--no-sandbox', // Note: Only use in trusted environments
22
+ ],
23
+ },
24
+ console: {
25
+ bufferSize: 1000,
26
+ filterLevels: ['log', 'info', 'warn', 'error', 'debug'],
27
+ truncation: {
28
+ maxStringLength: 500,
29
+ maxArrayLength: 10,
30
+ maxObjectDepth: 3,
31
+ removeDuplicates: true,
32
+ },
33
+ },
34
+ screenshots: {
35
+ defaultFormat: 'png',
36
+ quality: 90,
37
+ storePath: (0, path_1.join)(process.env.TMPDIR || '/tmp', 'figma-console-mcp', 'screenshots'),
38
+ },
39
+ };
40
+ /**
41
+ * Possible config file locations (checked in order)
42
+ */
43
+ const CONFIG_PATHS = [
44
+ // Environment variable override
45
+ process.env.FIGMA_CONSOLE_CONFIG,
46
+ // Project-local config
47
+ (0, path_1.join)(process.cwd(), '.figma-console-mcp.json'),
48
+ (0, path_1.join)(process.cwd(), 'figma-console-mcp.json'),
49
+ // User home config
50
+ (0, path_1.join)((0, os_1.homedir)(), '.config', 'figma-console-mcp', 'config.json'),
51
+ (0, path_1.join)((0, os_1.homedir)(), '.figma-console-mcp.json'),
52
+ ].filter((path) => path !== undefined);
53
+ /**
54
+ * Load configuration from file or use defaults
55
+ */
56
+ function loadConfig() {
57
+ // Try to load from config file
58
+ for (const configPath of CONFIG_PATHS) {
59
+ if ((0, fs_1.existsSync)(configPath)) {
60
+ try {
61
+ const fileContent = (0, fs_1.readFileSync)(configPath, 'utf-8');
62
+ const userConfig = JSON.parse(fileContent);
63
+ // Deep merge with defaults
64
+ const config = mergeConfig(DEFAULT_CONFIG, userConfig);
65
+ return config;
66
+ }
67
+ catch (error) {
68
+ console.error(`Failed to load config from ${configPath}:`, error);
69
+ // Continue to next config path
70
+ }
71
+ }
72
+ }
73
+ // No config file found, use defaults
74
+ return DEFAULT_CONFIG;
75
+ }
76
+ /**
77
+ * Deep merge two configuration objects
78
+ */
79
+ function mergeConfig(defaults, overrides) {
80
+ return {
81
+ browser: {
82
+ ...defaults.browser,
83
+ ...(overrides.browser || {}),
84
+ },
85
+ console: {
86
+ ...defaults.console,
87
+ ...(overrides.console || {}),
88
+ truncation: {
89
+ ...defaults.console.truncation,
90
+ ...(overrides.console?.truncation || {}),
91
+ },
92
+ },
93
+ screenshots: {
94
+ ...defaults.screenshots,
95
+ ...(overrides.screenshots || {}),
96
+ },
97
+ };
98
+ }
99
+ /**
100
+ * Validate configuration
101
+ */
102
+ function validateConfig(config) {
103
+ // Validate browser config
104
+ if (!Array.isArray(config.browser.args)) {
105
+ throw new Error('browser.args must be an array');
106
+ }
107
+ // Validate console config
108
+ if (config.console.bufferSize <= 0) {
109
+ throw new Error('console.bufferSize must be positive');
110
+ }
111
+ if (!Array.isArray(config.console.filterLevels)) {
112
+ throw new Error('console.filterLevels must be an array');
113
+ }
114
+ // Validate truncation config
115
+ const { truncation } = config.console;
116
+ if (truncation.maxStringLength <= 0) {
117
+ throw new Error('console.truncation.maxStringLength must be positive');
118
+ }
119
+ if (truncation.maxArrayLength <= 0) {
120
+ throw new Error('console.truncation.maxArrayLength must be positive');
121
+ }
122
+ if (truncation.maxObjectDepth <= 0) {
123
+ throw new Error('console.truncation.maxObjectDepth must be positive');
124
+ }
125
+ // Validate screenshot config
126
+ if (!['png', 'jpeg'].includes(config.screenshots.defaultFormat)) {
127
+ throw new Error('screenshots.defaultFormat must be "png" or "jpeg"');
128
+ }
129
+ if (config.screenshots.quality < 0 || config.screenshots.quality > 100) {
130
+ throw new Error('screenshots.quality must be between 0 and 100');
131
+ }
132
+ }
133
+ /**
134
+ * Get configuration with validation
135
+ */
136
+ function getConfig() {
137
+ const config = loadConfig();
138
+ validateConfig(config);
139
+ return config;
140
+ }
141
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Configuration management for Figma Console MCP server
3
+ */
4
+ import type { ServerConfig } from './types/index.js';
5
+ /**
6
+ * Load configuration from file or use defaults
7
+ */
8
+ export declare function loadConfig(): ServerConfig;
9
+ /**
10
+ * Validate configuration
11
+ */
12
+ export declare function validateConfig(config: ServerConfig): void;
13
+ /**
14
+ * Get configuration with validation
15
+ */
16
+ export declare function getConfig(): ServerConfig;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAqErD;;GAEG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAqBzC;AA+BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAkCzD;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,YAAY,CAIxC"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Configuration management for Figma Console MCP server
3
+ */
4
+ import { readFileSync, existsSync } from 'fs';
5
+ import { homedir } from 'os';
6
+ import { join } from 'path';
7
+ /**
8
+ * Auto-detect server mode based on environment
9
+ */
10
+ function detectMode() {
11
+ // If running in Workers environment, return cloudflare
12
+ if (typeof globalThis !== 'undefined' && 'caches' in globalThis) {
13
+ return 'cloudflare';
14
+ }
15
+ // Explicit env var override
16
+ const modeEnv = process.env.FIGMA_MCP_MODE?.toLowerCase();
17
+ if (modeEnv === 'local' || modeEnv === 'cloudflare') {
18
+ return modeEnv;
19
+ }
20
+ // Default to local for Node.js environments
21
+ return 'local';
22
+ }
23
+ /**
24
+ * Default configuration values
25
+ */
26
+ const DEFAULT_CONFIG = {
27
+ mode: detectMode(),
28
+ browser: {
29
+ headless: false,
30
+ args: [
31
+ '--disable-blink-features=AutomationControlled',
32
+ '--disable-dev-shm-usage',
33
+ '--no-sandbox', // Note: Only use in trusted environments
34
+ ],
35
+ },
36
+ console: {
37
+ bufferSize: 1000,
38
+ filterLevels: ['log', 'info', 'warn', 'error', 'debug'],
39
+ truncation: {
40
+ maxStringLength: 500,
41
+ maxArrayLength: 10,
42
+ maxObjectDepth: 3,
43
+ removeDuplicates: true,
44
+ },
45
+ },
46
+ screenshots: {
47
+ defaultFormat: 'png',
48
+ quality: 90,
49
+ storePath: join(process.env.TMPDIR || '/tmp', 'figma-console-mcp', 'screenshots'),
50
+ },
51
+ local: {
52
+ debugHost: process.env.FIGMA_DEBUG_HOST || 'localhost',
53
+ debugPort: parseInt(process.env.FIGMA_DEBUG_PORT || '9222', 10),
54
+ },
55
+ };
56
+ /**
57
+ * Possible config file locations (checked in order)
58
+ */
59
+ const CONFIG_PATHS = [
60
+ // Environment variable override
61
+ process.env.FIGMA_CONSOLE_CONFIG,
62
+ // Project-local config
63
+ join(process.cwd(), '.figma-console-mcp.json'),
64
+ join(process.cwd(), 'figma-console-mcp.json'),
65
+ // User home config
66
+ join(homedir(), '.config', 'figma-console-mcp', 'config.json'),
67
+ join(homedir(), '.figma-console-mcp.json'),
68
+ ].filter((path) => path !== undefined);
69
+ /**
70
+ * Load configuration from file or use defaults
71
+ */
72
+ export function loadConfig() {
73
+ // Try to load from config file
74
+ for (const configPath of CONFIG_PATHS) {
75
+ if (existsSync(configPath)) {
76
+ try {
77
+ const fileContent = readFileSync(configPath, 'utf-8');
78
+ const userConfig = JSON.parse(fileContent);
79
+ // Deep merge with defaults
80
+ const config = mergeConfig(DEFAULT_CONFIG, userConfig);
81
+ return config;
82
+ }
83
+ catch (error) {
84
+ console.error(`Failed to load config from ${configPath}:`, error);
85
+ // Continue to next config path
86
+ }
87
+ }
88
+ }
89
+ // No config file found, use defaults
90
+ return DEFAULT_CONFIG;
91
+ }
92
+ /**
93
+ * Deep merge two configuration objects
94
+ */
95
+ function mergeConfig(defaults, overrides) {
96
+ return {
97
+ mode: overrides.mode || defaults.mode,
98
+ browser: {
99
+ ...defaults.browser,
100
+ ...(overrides.browser || {}),
101
+ },
102
+ console: {
103
+ ...defaults.console,
104
+ ...(overrides.console || {}),
105
+ truncation: {
106
+ ...defaults.console.truncation,
107
+ ...(overrides.console?.truncation || {}),
108
+ },
109
+ },
110
+ screenshots: {
111
+ ...defaults.screenshots,
112
+ ...(overrides.screenshots || {}),
113
+ },
114
+ local: {
115
+ ...defaults.local,
116
+ ...(overrides.local || {}),
117
+ },
118
+ };
119
+ }
120
+ /**
121
+ * Validate configuration
122
+ */
123
+ export function validateConfig(config) {
124
+ // Validate browser config
125
+ if (!Array.isArray(config.browser.args)) {
126
+ throw new Error('browser.args must be an array');
127
+ }
128
+ // Validate console config
129
+ if (config.console.bufferSize <= 0) {
130
+ throw new Error('console.bufferSize must be positive');
131
+ }
132
+ if (!Array.isArray(config.console.filterLevels)) {
133
+ throw new Error('console.filterLevels must be an array');
134
+ }
135
+ // Validate truncation config
136
+ const { truncation } = config.console;
137
+ if (truncation.maxStringLength <= 0) {
138
+ throw new Error('console.truncation.maxStringLength must be positive');
139
+ }
140
+ if (truncation.maxArrayLength <= 0) {
141
+ throw new Error('console.truncation.maxArrayLength must be positive');
142
+ }
143
+ if (truncation.maxObjectDepth <= 0) {
144
+ throw new Error('console.truncation.maxObjectDepth must be positive');
145
+ }
146
+ // Validate screenshot config
147
+ if (!['png', 'jpeg'].includes(config.screenshots.defaultFormat)) {
148
+ throw new Error('screenshots.defaultFormat must be "png" or "jpeg"');
149
+ }
150
+ if (config.screenshots.quality < 0 || config.screenshots.quality > 100) {
151
+ throw new Error('screenshots.quality must be between 0 and 100');
152
+ }
153
+ }
154
+ /**
155
+ * Get configuration with validation
156
+ */
157
+ export function getConfig() {
158
+ const config = loadConfig();
159
+ validateConfig(config);
160
+ return config;
161
+ }
162
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Console Monitor
3
+ * Captures and manages console logs from Figma plugins via Chrome DevTools Protocol
4
+ * Monitors both main page console AND Web Worker consoles (where Figma plugins run)
5
+ */
6
+ import type { ConsoleLogEntry, ConsoleConfig } from './types/index.js';
7
+ /**
8
+ * Console Monitor
9
+ * Listens to page console events and maintains a circular buffer of logs
10
+ * Also monitors Web Workers to capture Figma plugin console logs
11
+ */
12
+ export declare class ConsoleMonitor {
13
+ private logs;
14
+ private config;
15
+ private isMonitoring;
16
+ private page;
17
+ private workers;
18
+ constructor(config: ConsoleConfig);
19
+ /**
20
+ * Start monitoring console logs on a page
21
+ * Accepts any puppeteer Page type (puppeteer-core or @cloudflare/puppeteer)
22
+ */
23
+ startMonitoring(page: any): Promise<void>;
24
+ /**
25
+ * Attach console listeners to a Web Worker
26
+ * This captures Figma plugin console logs
27
+ */
28
+ private attachWorkerListeners;
29
+ /**
30
+ * Process console message from Puppeteer
31
+ * @param msg - Console message from page or worker
32
+ * @param context - Where the message came from ('page' or 'worker')
33
+ * @param workerUrl - URL of the worker (if context is 'worker')
34
+ */
35
+ private processConsoleMessage;
36
+ /**
37
+ * Determine if log is from plugin or Figma based on URL
38
+ */
39
+ private determineSource;
40
+ /**
41
+ * Add log to circular buffer
42
+ */
43
+ private addLog;
44
+ /**
45
+ * Truncate string to max length
46
+ */
47
+ private truncateString;
48
+ /**
49
+ * Truncate value (string, array, object) intelligently
50
+ * Based on AgentDesk pattern to prevent context overflow
51
+ */
52
+ private truncateValue;
53
+ /**
54
+ * Get logs with optional filtering
55
+ */
56
+ getLogs(options?: {
57
+ count?: number;
58
+ level?: ConsoleLogEntry['level'] | 'all';
59
+ since?: number;
60
+ }): ConsoleLogEntry[];
61
+ /**
62
+ * Clear log buffer
63
+ */
64
+ clear(): number;
65
+ /**
66
+ * Stop monitoring
67
+ */
68
+ stopMonitoring(): void;
69
+ /**
70
+ * Get monitoring status
71
+ */
72
+ getStatus(): {
73
+ isMonitoring: boolean;
74
+ logCount: number;
75
+ bufferSize: number;
76
+ workerCount: number;
77
+ oldestTimestamp: number;
78
+ newestTimestamp: number;
79
+ };
80
+ }
81
+ //# sourceMappingURL=console-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-monitor.d.ts","sourceRoot":"","sources":["../../src/core/console-monitor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQvE;;;;GAIG;AACH,qBAAa,cAAc;IAC1B,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,OAAO,CAA6B;gBAEhC,MAAM,EAAE,aAAa;IAIjC;;;OAGG;IACG,eAAe,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IA4I/C;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAgC7B;;;;;OAKG;YACW,qBAAqB;IAqEnC;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACH,OAAO,CAAC,MAAM;IAWd;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAqDrB;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QACzC,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,eAAe,EAAE;IAqBrB;;OAEG;IACH,KAAK,IAAI,MAAM;IAOf;;OAEG;IACH,cAAc,IAAI,IAAI;IAWtB;;OAEG;IACH,SAAS;;;;;;;;CAUT"}