@bilalba/fig-mcp 1.0.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 (186) hide show
  1. package/README.md +112 -0
  2. package/dist/compare-get-vector.d.ts +2 -0
  3. package/dist/compare-get-vector.d.ts.map +1 -0
  4. package/dist/compare-get-vector.js +124 -0
  5. package/dist/compare-get-vector.js.map +1 -0
  6. package/dist/compare-mcp-vs-direct.d.ts +2 -0
  7. package/dist/compare-mcp-vs-direct.d.ts.map +1 -0
  8. package/dist/compare-mcp-vs-direct.js +173 -0
  9. package/dist/compare-mcp-vs-direct.js.map +1 -0
  10. package/dist/compare-renderers.d.ts +2 -0
  11. package/dist/compare-renderers.d.ts.map +1 -0
  12. package/dist/compare-renderers.js +110 -0
  13. package/dist/compare-renderers.js.map +1 -0
  14. package/dist/debug/debug-stroke-geom.d.ts +2 -0
  15. package/dist/debug/debug-stroke-geom.d.ts.map +1 -0
  16. package/dist/debug/debug-stroke-geom.js +67 -0
  17. package/dist/debug/debug-stroke-geom.js.map +1 -0
  18. package/dist/debug/debug-transforms.d.ts +2 -0
  19. package/dist/debug/debug-transforms.d.ts.map +1 -0
  20. package/dist/debug/debug-transforms.js +97 -0
  21. package/dist/debug/debug-transforms.js.map +1 -0
  22. package/dist/debug/debug-vertex.d.ts +2 -0
  23. package/dist/debug/debug-vertex.d.ts.map +1 -0
  24. package/dist/debug/debug-vertex.js +72 -0
  25. package/dist/debug/debug-vertex.js.map +1 -0
  26. package/dist/debug-group.d.ts +5 -0
  27. package/dist/debug-group.d.ts.map +1 -0
  28. package/dist/debug-group.js +44 -0
  29. package/dist/debug-group.js.map +1 -0
  30. package/dist/debug-stroke-geom.d.ts +2 -0
  31. package/dist/debug-stroke-geom.d.ts.map +1 -0
  32. package/dist/debug-stroke-geom.js +67 -0
  33. package/dist/debug-stroke-geom.js.map +1 -0
  34. package/dist/debug-transforms.d.ts +2 -0
  35. package/dist/debug-transforms.d.ts.map +1 -0
  36. package/dist/debug-transforms.js +97 -0
  37. package/dist/debug-transforms.js.map +1 -0
  38. package/dist/debug-vertex.d.ts +2 -0
  39. package/dist/debug-vertex.d.ts.map +1 -0
  40. package/dist/debug-vertex.js +72 -0
  41. package/dist/debug-vertex.js.map +1 -0
  42. package/dist/decode-vector-network.d.ts +5 -0
  43. package/dist/decode-vector-network.d.ts.map +1 -0
  44. package/dist/decode-vector-network.js +160 -0
  45. package/dist/decode-vector-network.js.map +1 -0
  46. package/dist/experimental/paint-utils.d.ts +35 -0
  47. package/dist/experimental/paint-utils.d.ts.map +1 -0
  48. package/dist/experimental/paint-utils.js +105 -0
  49. package/dist/experimental/paint-utils.js.map +1 -0
  50. package/dist/experimental/render-screen-v2.d.ts +32 -0
  51. package/dist/experimental/render-screen-v2.d.ts.map +1 -0
  52. package/dist/experimental/render-screen-v2.js +366 -0
  53. package/dist/experimental/render-screen-v2.js.map +1 -0
  54. package/dist/experimental/render-screen.d.ts +26 -0
  55. package/dist/experimental/render-screen.d.ts.map +1 -0
  56. package/dist/experimental/render-screen.js +547 -0
  57. package/dist/experimental/render-screen.js.map +1 -0
  58. package/dist/experimental/render-types.d.ts +43 -0
  59. package/dist/experimental/render-types.d.ts.map +1 -0
  60. package/dist/experimental/render-types.js +22 -0
  61. package/dist/experimental/render-types.js.map +1 -0
  62. package/dist/experimental/render-utils.d.ts +38 -0
  63. package/dist/experimental/render-utils.d.ts.map +1 -0
  64. package/dist/experimental/render-utils.js +126 -0
  65. package/dist/experimental/render-utils.js.map +1 -0
  66. package/dist/experimental/screenshot.d.ts +11 -0
  67. package/dist/experimental/screenshot.d.ts.map +1 -0
  68. package/dist/experimental/screenshot.js +26 -0
  69. package/dist/experimental/screenshot.js.map +1 -0
  70. package/dist/experimental/vector-renderer.d.ts +31 -0
  71. package/dist/experimental/vector-renderer.d.ts.map +1 -0
  72. package/dist/experimental/vector-renderer.js +427 -0
  73. package/dist/experimental/vector-renderer.js.map +1 -0
  74. package/dist/explore-images.d.ts +9 -0
  75. package/dist/explore-images.d.ts.map +1 -0
  76. package/dist/explore-images.js +307 -0
  77. package/dist/explore-images.js.map +1 -0
  78. package/dist/http-server.d.ts +8 -0
  79. package/dist/http-server.d.ts.map +1 -0
  80. package/dist/http-server.js +95 -0
  81. package/dist/http-server.js.map +1 -0
  82. package/dist/index.d.ts +9 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +34 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/inspect-fig.d.ts +16 -0
  87. package/dist/inspect-fig.d.ts.map +1 -0
  88. package/dist/inspect-fig.js +134 -0
  89. package/dist/inspect-fig.js.map +1 -0
  90. package/dist/inspect-frame.d.ts +2 -0
  91. package/dist/inspect-frame.d.ts.map +1 -0
  92. package/dist/inspect-frame.js +90 -0
  93. package/dist/inspect-frame.js.map +1 -0
  94. package/dist/inspect-nodes.d.ts +5 -0
  95. package/dist/inspect-nodes.d.ts.map +1 -0
  96. package/dist/inspect-nodes.js +193 -0
  97. package/dist/inspect-nodes.js.map +1 -0
  98. package/dist/mcp/server.d.ts +38 -0
  99. package/dist/mcp/server.d.ts.map +1 -0
  100. package/dist/mcp/server.js +1524 -0
  101. package/dist/mcp/server.js.map +1 -0
  102. package/dist/parser/fig-reader.d.ts +29 -0
  103. package/dist/parser/fig-reader.d.ts.map +1 -0
  104. package/dist/parser/fig-reader.js +182 -0
  105. package/dist/parser/fig-reader.js.map +1 -0
  106. package/dist/parser/index.d.ts +48 -0
  107. package/dist/parser/index.d.ts.map +1 -0
  108. package/dist/parser/index.js +106 -0
  109. package/dist/parser/index.js.map +1 -0
  110. package/dist/parser/kiwi-parser.d.ts +66 -0
  111. package/dist/parser/kiwi-parser.d.ts.map +1 -0
  112. package/dist/parser/kiwi-parser.js +491 -0
  113. package/dist/parser/kiwi-parser.js.map +1 -0
  114. package/dist/parser/layout-inference.d.ts +63 -0
  115. package/dist/parser/layout-inference.d.ts.map +1 -0
  116. package/dist/parser/layout-inference.js +446 -0
  117. package/dist/parser/layout-inference.js.map +1 -0
  118. package/dist/parser/types.d.ts +286 -0
  119. package/dist/parser/types.d.ts.map +1 -0
  120. package/dist/parser/types.js +6 -0
  121. package/dist/parser/types.js.map +1 -0
  122. package/dist/render-single.d.ts +2 -0
  123. package/dist/render-single.d.ts.map +1 -0
  124. package/dist/render-single.js +53 -0
  125. package/dist/render-single.js.map +1 -0
  126. package/dist/renderer/index.d.ts +16 -0
  127. package/dist/renderer/index.d.ts.map +1 -0
  128. package/dist/renderer/index.js +18 -0
  129. package/dist/renderer/index.js.map +1 -0
  130. package/dist/renderer/paint-utils.d.ts +35 -0
  131. package/dist/renderer/paint-utils.d.ts.map +1 -0
  132. package/dist/renderer/paint-utils.js +105 -0
  133. package/dist/renderer/paint-utils.js.map +1 -0
  134. package/dist/renderer/render-screen.d.ts +26 -0
  135. package/dist/renderer/render-screen.d.ts.map +1 -0
  136. package/dist/renderer/render-screen.js +547 -0
  137. package/dist/renderer/render-screen.js.map +1 -0
  138. package/dist/renderer/render-types.d.ts +43 -0
  139. package/dist/renderer/render-types.d.ts.map +1 -0
  140. package/dist/renderer/render-types.js +22 -0
  141. package/dist/renderer/render-types.js.map +1 -0
  142. package/dist/renderer/render-utils.d.ts +38 -0
  143. package/dist/renderer/render-utils.d.ts.map +1 -0
  144. package/dist/renderer/render-utils.js +126 -0
  145. package/dist/renderer/render-utils.js.map +1 -0
  146. package/dist/renderer/screenshot.d.ts +11 -0
  147. package/dist/renderer/screenshot.d.ts.map +1 -0
  148. package/dist/renderer/screenshot.js +26 -0
  149. package/dist/renderer/screenshot.js.map +1 -0
  150. package/dist/renderer/vector-renderer.d.ts +31 -0
  151. package/dist/renderer/vector-renderer.d.ts.map +1 -0
  152. package/dist/renderer/vector-renderer.js +427 -0
  153. package/dist/renderer/vector-renderer.js.map +1 -0
  154. package/dist/shared-config.d.ts +9 -0
  155. package/dist/shared-config.d.ts.map +1 -0
  156. package/dist/shared-config.js +9 -0
  157. package/dist/shared-config.js.map +1 -0
  158. package/dist/test-parser.d.ts +3 -0
  159. package/dist/test-parser.d.ts.map +1 -0
  160. package/dist/test-parser.js +74 -0
  161. package/dist/test-parser.js.map +1 -0
  162. package/dist/test-render-v2.d.ts +5 -0
  163. package/dist/test-render-v2.d.ts.map +1 -0
  164. package/dist/test-render-v2.js +76 -0
  165. package/dist/test-render-v2.js.map +1 -0
  166. package/dist/test-render.d.ts +5 -0
  167. package/dist/test-render.d.ts.map +1 -0
  168. package/dist/test-render.js +76 -0
  169. package/dist/test-render.js.map +1 -0
  170. package/dist/vector-export.d.ts +52 -0
  171. package/dist/vector-export.d.ts.map +1 -0
  172. package/dist/vector-export.js +628 -0
  173. package/dist/vector-export.js.map +1 -0
  174. package/dist/web-viewer/build-client.d.ts +6 -0
  175. package/dist/web-viewer/build-client.d.ts.map +1 -0
  176. package/dist/web-viewer/build-client.js +36 -0
  177. package/dist/web-viewer/build-client.js.map +1 -0
  178. package/dist/web-viewer/client/viewer.d.ts +7 -0
  179. package/dist/web-viewer/client/viewer.d.ts.map +1 -0
  180. package/dist/web-viewer/client/viewer.js +873 -0
  181. package/dist/web-viewer/client/viewer.js.map +1 -0
  182. package/dist/web-viewer/server.d.ts +16 -0
  183. package/dist/web-viewer/server.d.ts.map +1 -0
  184. package/dist/web-viewer/server.js +420 -0
  185. package/dist/web-viewer/server.js.map +1 -0
  186. package/package.json +66 -0
@@ -0,0 +1,307 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Explore image references in .fig files
4
+ *
5
+ * This script traces how images are referenced in fillPaints and
6
+ * how those references map to files in the images/ folder.
7
+ */
8
+ import { readFigFile } from "./parser/fig-reader.js";
9
+ import { parseCanvasFig } from "./parser/kiwi-parser.js";
10
+ async function exploreImages(filePath) {
11
+ console.log(`\n${"=".repeat(60)}`);
12
+ console.log(`Exploring images in: ${filePath}`);
13
+ console.log("=".repeat(60));
14
+ // Read the archive
15
+ const archive = await readFigFile(filePath);
16
+ console.log(`\n📁 Images in archive (${archive.images.size} files):`);
17
+ const imageNames = Array.from(archive.images.keys()).sort();
18
+ for (const name of imageNames.slice(0, 20)) {
19
+ const data = archive.images.get(name);
20
+ console.log(` - ${name} (${data.length} bytes)`);
21
+ }
22
+ if (imageNames.length > 20) {
23
+ console.log(` ... and ${imageNames.length - 20} more`);
24
+ }
25
+ // Check if image names look like hashes
26
+ console.log(`\n🔍 Analyzing image filenames:`);
27
+ const hexPattern = /^[0-9a-f]+$/i;
28
+ const hashLike = imageNames.filter(n => hexPattern.test(n));
29
+ console.log(` - Hash-like names: ${hashLike.length}/${imageNames.length}`);
30
+ if (hashLike.length > 0) {
31
+ console.log(` - Sample: ${hashLike.slice(0, 3).join(", ")}`);
32
+ console.log(` - Length: ${hashLike[0]?.length} chars`);
33
+ }
34
+ // Parse the canvas
35
+ const parsed = parseCanvasFig(archive.canvasFig);
36
+ const nodeChanges = parsed.message["nodeChanges"];
37
+ if (!Array.isArray(nodeChanges)) {
38
+ console.log("No nodeChanges array found");
39
+ return;
40
+ }
41
+ console.log(`\n🌳 Scanning ${nodeChanges.length} nodes for image references...`);
42
+ const imageRefs = [];
43
+ const allPaintTypes = new Set();
44
+ const imageRelatedFields = new Set();
45
+ // Scan all nodes
46
+ for (const change of nodeChanges) {
47
+ if (!change || typeof change !== "object")
48
+ continue;
49
+ const node = change;
50
+ const nodeName = String(node["name"] || "Unnamed");
51
+ const nodeType = String(node["type"] || "UNKNOWN");
52
+ const guid = node["guid"];
53
+ const nodeGuid = guid ? `${guid.sessionID}:${guid.localID}` : "?:?";
54
+ // Check fillPaints
55
+ const fillPaints = node["fillPaints"];
56
+ if (Array.isArray(fillPaints)) {
57
+ for (let i = 0; i < fillPaints.length; i++) {
58
+ const paint = fillPaints[i];
59
+ if (!paint || typeof paint !== "object")
60
+ continue;
61
+ const paintType = String(paint["type"] || "UNKNOWN");
62
+ allPaintTypes.add(paintType);
63
+ // Track all fields in paints that might be image-related
64
+ for (const key of Object.keys(paint)) {
65
+ if (key.toLowerCase().includes("image") ||
66
+ key.toLowerCase().includes("hash") ||
67
+ key.toLowerCase().includes("thumb") ||
68
+ key.toLowerCase().includes("blob")) {
69
+ imageRelatedFields.add(key);
70
+ }
71
+ }
72
+ // Look for image-related properties
73
+ if (paint["image"] !== undefined ||
74
+ paint["imageHash"] !== undefined ||
75
+ paint["imageThumbnail"] !== undefined ||
76
+ paintType === "IMAGE") {
77
+ imageRefs.push({
78
+ nodeName,
79
+ nodeGuid,
80
+ nodeType,
81
+ paintIndex: i,
82
+ paintType,
83
+ image: paint["image"],
84
+ imageHash: paint["imageHash"],
85
+ imageThumbnail: paint["imageThumbnail"],
86
+ rawPaint: paint,
87
+ });
88
+ }
89
+ }
90
+ }
91
+ // Also check for other image-related fields at node level
92
+ for (const key of Object.keys(node)) {
93
+ if (key.toLowerCase().includes("image") ||
94
+ key.toLowerCase().includes("hash") ||
95
+ key.toLowerCase().includes("thumb")) {
96
+ if (node[key] !== undefined && node[key] !== null) {
97
+ imageRelatedFields.add(`node.${key}`);
98
+ }
99
+ }
100
+ }
101
+ }
102
+ console.log(`\n🎨 Paint types found: ${Array.from(allPaintTypes).join(", ")}`);
103
+ console.log(`\n🖼️ Image-related fields found: ${Array.from(imageRelatedFields).join(", ")}`);
104
+ console.log(`\n📷 Found ${imageRefs.length} image references in paints:`);
105
+ // Show detailed info for first few
106
+ for (const ref of imageRefs.slice(0, 10)) {
107
+ console.log(`\n Node: "${ref.nodeName}" (${ref.nodeType}) [${ref.nodeGuid}]`);
108
+ console.log(` Paint type: ${ref.paintType}`);
109
+ if (ref.image !== undefined) {
110
+ console.log(` image: ${JSON.stringify(ref.image)}`);
111
+ }
112
+ if (ref.imageHash !== undefined) {
113
+ console.log(` imageHash: ${JSON.stringify(ref.imageHash)}`);
114
+ }
115
+ if (ref.imageThumbnail !== undefined) {
116
+ console.log(` imageThumbnail: ${JSON.stringify(ref.imageThumbnail)}`);
117
+ }
118
+ // Show all paint fields for debugging
119
+ console.log(` All paint fields: ${Object.keys(ref.rawPaint).join(", ")}`);
120
+ }
121
+ if (imageRefs.length > 10) {
122
+ console.log(`\n ... and ${imageRefs.length - 10} more image references`);
123
+ }
124
+ // Try to correlate hashes to filenames
125
+ console.log(`\n🔗 Attempting to correlate image references to files...`);
126
+ // Extract unique image/hash values
127
+ const uniqueImageValues = new Set();
128
+ for (const ref of imageRefs) {
129
+ if (ref.image) {
130
+ const imgVal = typeof ref.image === "object"
131
+ ? JSON.stringify(ref.image)
132
+ : String(ref.image);
133
+ uniqueImageValues.add(imgVal);
134
+ }
135
+ if (ref.imageHash) {
136
+ const hashVal = typeof ref.imageHash === "object"
137
+ ? JSON.stringify(ref.imageHash)
138
+ : String(ref.imageHash);
139
+ uniqueImageValues.add(hashVal);
140
+ }
141
+ }
142
+ console.log(` Unique image/hash values: ${uniqueImageValues.size}`);
143
+ for (const val of Array.from(uniqueImageValues).slice(0, 5)) {
144
+ console.log(` - ${val}`);
145
+ // Check if it matches any filename
146
+ const parsed = tryParseImageRef(val);
147
+ if (parsed) {
148
+ const matchingFile = imageNames.find(n => n === parsed ||
149
+ n.includes(parsed) ||
150
+ parsed.includes(n));
151
+ if (matchingFile) {
152
+ console.log(` ✓ MATCHES FILE: ${matchingFile}`);
153
+ }
154
+ }
155
+ }
156
+ // Dump a complete sample node with IMAGE paint
157
+ if (imageRefs.length > 0) {
158
+ console.log(`\n📋 Complete raw paint data for first IMAGE reference:`);
159
+ console.log(JSON.stringify(imageRefs[0]?.rawPaint, null, 2));
160
+ }
161
+ }
162
+ function tryParseImageRef(val) {
163
+ try {
164
+ const obj = JSON.parse(val);
165
+ // If it's an object with specific fields, try to extract the hash
166
+ if (obj && typeof obj === "object") {
167
+ // Check common hash field names
168
+ for (const key of ["hash", "id", "guid", "ref"]) {
169
+ if (obj[key])
170
+ return String(obj[key]);
171
+ }
172
+ }
173
+ return null;
174
+ }
175
+ catch {
176
+ // Not JSON, maybe it's already a hash string
177
+ return val;
178
+ }
179
+ }
180
+ /**
181
+ * Convert the hash byte object {0: byte, 1: byte, ...} to hex string
182
+ */
183
+ function hashBytesToHex(hashObj) {
184
+ const bytes = [];
185
+ for (let i = 0; i < 20; i++) {
186
+ if (hashObj[String(i)] !== undefined) {
187
+ bytes.push(hashObj[String(i)]);
188
+ }
189
+ }
190
+ return bytes.map(b => b.toString(16).padStart(2, "0")).join("");
191
+ }
192
+ async function verifyHashCorrelation(filePath) {
193
+ console.log(`\n${"=".repeat(60)}`);
194
+ console.log(`VERIFYING HASH → FILENAME CORRELATION`);
195
+ console.log("=".repeat(60));
196
+ const archive = await readFigFile(filePath);
197
+ const parsed = parseCanvasFig(archive.canvasFig);
198
+ const nodeChanges = parsed.message["nodeChanges"];
199
+ const imageNames = new Set(Array.from(archive.images.keys()));
200
+ let matched = 0;
201
+ let unmatched = 0;
202
+ const unmatchedHashes = [];
203
+ for (const change of nodeChanges) {
204
+ if (!change || typeof change !== "object")
205
+ continue;
206
+ const node = change;
207
+ const fillPaints = node["fillPaints"];
208
+ if (!Array.isArray(fillPaints))
209
+ continue;
210
+ for (const paint of fillPaints) {
211
+ if (!paint || typeof paint !== "object")
212
+ continue;
213
+ const p = paint;
214
+ // Check image field
215
+ const image = p["image"];
216
+ if (image?.hash) {
217
+ const hexHash = hashBytesToHex(image.hash);
218
+ if (imageNames.has(hexHash)) {
219
+ matched++;
220
+ }
221
+ else {
222
+ unmatched++;
223
+ if (unmatchedHashes.length < 5) {
224
+ unmatchedHashes.push(hexHash);
225
+ }
226
+ }
227
+ }
228
+ // Check imageThumbnail field
229
+ const thumb = p["imageThumbnail"];
230
+ if (thumb?.hash) {
231
+ const hexHash = hashBytesToHex(thumb.hash);
232
+ if (imageNames.has(hexHash)) {
233
+ matched++;
234
+ }
235
+ else {
236
+ unmatched++;
237
+ if (unmatchedHashes.length < 5) {
238
+ unmatchedHashes.push(`thumb:${hexHash}`);
239
+ }
240
+ }
241
+ }
242
+ }
243
+ }
244
+ console.log(`\n✅ Matched hashes: ${matched}`);
245
+ console.log(`❌ Unmatched hashes: ${unmatched}`);
246
+ if (unmatchedHashes.length > 0) {
247
+ console.log(`\nUnmatched samples:`);
248
+ for (const h of unmatchedHashes) {
249
+ console.log(` - ${h}`);
250
+ }
251
+ }
252
+ // Show a few successful correlations
253
+ console.log(`\n📋 Sample correlations (first 5):`);
254
+ let shown = 0;
255
+ for (const change of nodeChanges) {
256
+ if (shown >= 5)
257
+ break;
258
+ if (!change || typeof change !== "object")
259
+ continue;
260
+ const node = change;
261
+ const fillPaints = node["fillPaints"];
262
+ if (!Array.isArray(fillPaints))
263
+ continue;
264
+ for (const paint of fillPaints) {
265
+ if (shown >= 5)
266
+ break;
267
+ if (!paint || typeof paint !== "object")
268
+ continue;
269
+ const p = paint;
270
+ const image = p["image"];
271
+ if (image?.hash) {
272
+ const hexHash = hashBytesToHex(image.hash);
273
+ if (imageNames.has(hexHash)) {
274
+ const imageData = archive.images.get(hexHash);
275
+ const nodeName = String(node["name"] || "Unnamed");
276
+ const dims = `${p["originalImageWidth"]}x${p["originalImageHeight"]}`;
277
+ console.log(` "${nodeName}" → ${hexHash} (${imageData.length} bytes, ${dims})`);
278
+ shown++;
279
+ }
280
+ }
281
+ }
282
+ }
283
+ // Detect image format by magic bytes
284
+ console.log(`\n🔍 Image format detection (first 5):`);
285
+ let formatShown = 0;
286
+ for (const [name, data] of archive.images) {
287
+ if (formatShown >= 5)
288
+ break;
289
+ let format = "unknown";
290
+ if (data[0] === 0xFF && data[1] === 0xD8)
291
+ format = "JPEG";
292
+ else if (data[0] === 0x89 && data[1] === 0x50 && data[2] === 0x4E && data[3] === 0x47)
293
+ format = "PNG";
294
+ else if (data[0] === 0x47 && data[1] === 0x49 && data[2] === 0x46)
295
+ format = "GIF";
296
+ else if (data[0] === 0x52 && data[1] === 0x49 && data[2] === 0x46 && data[3] === 0x46)
297
+ format = "WebP";
298
+ console.log(` ${name.slice(0, 12)}... → ${format} (${data.length} bytes)`);
299
+ formatShown++;
300
+ }
301
+ }
302
+ // Main
303
+ const filePath = process.argv[2] || "/Users/billy/Downloads/AutoDevice (Copy).fig";
304
+ exploreImages(filePath)
305
+ .then(() => verifyHashCorrelation(filePath))
306
+ .catch(console.error);
307
+ //# sourceMappingURL=explore-images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explore-images.js","sourceRoot":"","sources":["../src/explore-images.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAc,MAAM,yBAAyB,CAAC;AAcrE,KAAK,UAAU,aAAa,CAAC,QAAgB;IAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,mBAAmB;IACnB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,cAAc,CAAC;IAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAc,CAAC;IAE/D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,CAAC,MAAM,gCAAgC,CAAC,CAAC;IAEjF,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE7C,iBAAiB;IACjB,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QACpD,MAAM,IAAI,GAAG,MAAiC,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAyD,CAAC;QAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAEpE,mBAAmB;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAc,CAAC;QACnD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAA4B,CAAC;gBACvD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAAE,SAAS;gBAElD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC;gBACrD,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAE7B,yDAAyD;gBACzD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;wBACnC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;wBAClC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;wBACnC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;wBACvC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBAED,oCAAoC;gBACpC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,SAAS;oBAC5B,KAAK,CAAC,WAAW,CAAC,KAAK,SAAS;oBAChC,KAAK,CAAC,gBAAgB,CAAC,KAAK,SAAS;oBACrC,SAAS,KAAK,OAAO,EAAE,CAAC;oBAC1B,SAAS,CAAC,IAAI,CAAC;wBACb,QAAQ;wBACR,QAAQ;wBACR,QAAQ;wBACR,UAAU,EAAE,CAAC;wBACb,SAAS;wBACT,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;wBACrB,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC;wBAC7B,cAAc,EAAE,KAAK,CAAC,gBAAgB,CAAC;wBACvC,QAAQ,EAAE,KAAK;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACnC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAClC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;oBAClD,kBAAkB,CAAC,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,sCAAsC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE/F,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,CAAC,MAAM,8BAA8B,CAAC,CAAC;IAE1E,mCAAmC;IACnC,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAEhD,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,MAAM,GAAG,EAAE,wBAAwB,CAAC,CAAC;IAC5E,CAAC;IAED,uCAAuC;IACvC,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IAEzE,mCAAmC;IACnC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;gBAC1C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC3B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACtB,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;gBAC/C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;gBAC/B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1B,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;QAE5B,mCAAmC;QACnC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACvC,CAAC,KAAK,MAAM;gBACZ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAClB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnB,CAAC;YACF,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,kEAAkE;QAClE,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,gCAAgC;YAChC,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;gBAChD,IAAI,GAAG,CAAC,GAAG,CAAC;oBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;QAC7C,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAA+B;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAc,CAAC;IAE/D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QACpD,MAAM,IAAI,GAAG,MAAiC,CAAC;QAE/C,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAc,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE,SAAS;QAEzC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAClD,MAAM,CAAC,GAAG,KAAgC,CAAC;YAE3C,oBAAoB;YACpB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAkD,CAAC;YAC1E,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,SAAS,EAAE,CAAC;oBACZ,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC/B,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,6BAA6B;YAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,gBAAgB,CAAkD,CAAC;YACnF,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,SAAS,EAAE,CAAC;oBACZ,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC/B,eAAe,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;IAEhD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,IAAI,CAAC;YAAE,MAAM;QACtB,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QACpD,MAAM,IAAI,GAAG,MAAiC,CAAC;QAE/C,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAc,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE,SAAS;QAEzC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,KAAK,IAAI,CAAC;gBAAE,MAAM;YACtB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAClD,MAAM,CAAC,GAAG,KAAgC,CAAC;YAE3C,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAkD,CAAC;YAC1E,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;oBAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC;oBACnD,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBACtE,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,OAAO,OAAO,KAAK,SAAS,CAAC,MAAM,WAAW,IAAI,GAAG,CAAC,CAAC;oBACjF,KAAK,EAAE,CAAC;gBACV,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1C,IAAI,WAAW,IAAI,CAAC;YAAE,MAAM;QAC5B,IAAI,MAAM,GAAG,SAAS,CAAC;QACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,MAAM,GAAG,MAAM,CAAC;aACrD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,MAAM,GAAG,KAAK,CAAC;aACjG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,MAAM,GAAG,KAAK,CAAC;aAC7E,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,MAAM,GAAG,MAAM,CAAC;QACvG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,MAAM,KAAK,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;QAC5E,WAAW,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,OAAO;AACP,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,8CAA8C,CAAC;AACnF,aAAa,CAAC,QAAQ,CAAC;KACpB,IAAI,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;KAC3C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * HTTP Server for serving images from .fig files
3
+ *
4
+ * Runs alongside the MCP server to serve images via HTTP URLs
5
+ * instead of base64 blobs through MCP.
6
+ */
7
+ export declare function startHttpServer(): void;
8
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,wBAAgB,eAAe,IAAI,IAAI,CA8FtC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * HTTP Server for serving images from .fig files
3
+ *
4
+ * Runs alongside the MCP server to serve images via HTTP URLs
5
+ * instead of base64 blobs through MCP.
6
+ */
7
+ import http from "http";
8
+ import { getOrParseFigFile, detectImageFormat, normalizeImageHash } from "./mcp/server.js";
9
+ import { config } from "./shared-config.js";
10
+ const DEFAULT_PORT = 3847;
11
+ const MAX_PORT_ATTEMPTS = 10;
12
+ export function startHttpServer() {
13
+ const server = http.createServer(async (req, res) => {
14
+ const url = new URL(req.url, `http://localhost:${config.httpPort}`);
15
+ const parts = url.pathname.split("/").filter(Boolean);
16
+ try {
17
+ // GET /image/:encodedFilePath/:hash
18
+ if (parts[0] === "image" && parts.length >= 3) {
19
+ const filePath = decodeURIComponent(parts[1]);
20
+ const hash = parts[2].toLowerCase();
21
+ const { images } = await getOrParseFigFile(filePath);
22
+ const normalized = normalizeImageHash(hash);
23
+ const data = images.get(normalized ?? hash) ?? images.get(hash);
24
+ if (!data) {
25
+ res.writeHead(404, { "Content-Type": "text/plain" });
26
+ res.end(`Image not found: ${hash}`);
27
+ return;
28
+ }
29
+ const format = detectImageFormat(data);
30
+ const mimeType = format === "jpeg"
31
+ ? "image/jpeg"
32
+ : format === "png"
33
+ ? "image/png"
34
+ : format === "gif"
35
+ ? "image/gif"
36
+ : format === "webp"
37
+ ? "image/webp"
38
+ : "application/octet-stream";
39
+ res.writeHead(200, {
40
+ "Content-Type": mimeType,
41
+ "Content-Length": data.length,
42
+ "Cache-Control": "public, max-age=31536000", // Images are content-addressed, cache forever
43
+ });
44
+ res.end(Buffer.from(data));
45
+ return;
46
+ }
47
+ // GET /thumbnail/:encodedFilePath
48
+ if (parts[0] === "thumbnail" && parts.length >= 2) {
49
+ const filePath = decodeURIComponent(parts[1]);
50
+ const { thumbnail } = await getOrParseFigFile(filePath);
51
+ if (!thumbnail) {
52
+ res.writeHead(404, { "Content-Type": "text/plain" });
53
+ res.end("Thumbnail not found");
54
+ return;
55
+ }
56
+ res.writeHead(200, {
57
+ "Content-Type": "image/png",
58
+ "Content-Length": thumbnail.length,
59
+ "Cache-Control": "public, max-age=3600", // Cache thumbnails for 1 hour
60
+ });
61
+ res.end(Buffer.from(thumbnail));
62
+ return;
63
+ }
64
+ // Not found
65
+ res.writeHead(404, { "Content-Type": "text/plain" });
66
+ res.end("Not found");
67
+ }
68
+ catch (error) {
69
+ console.error("HTTP server error:", error);
70
+ res.writeHead(500, { "Content-Type": "text/plain" });
71
+ res.end(`Error: ${error instanceof Error ? error.message : String(error)}`);
72
+ }
73
+ });
74
+ function tryListen(port, attempt) {
75
+ server.once("error", (err) => {
76
+ if (err.code === "EADDRINUSE" && attempt < MAX_PORT_ATTEMPTS) {
77
+ // Port is busy, try the next one
78
+ const nextPort = port + 1;
79
+ console.error(`Port ${port} in use, trying ${nextPort}...`);
80
+ tryListen(nextPort, attempt + 1);
81
+ }
82
+ else {
83
+ // Give up after max attempts or on other errors
84
+ console.error(`HTTP server error: ${err.message}`);
85
+ // Don't exit - let MCP server continue without HTTP image serving
86
+ }
87
+ });
88
+ server.listen(port, () => {
89
+ config.httpPort = port;
90
+ console.error(`HTTP image server running on http://localhost:${port}`);
91
+ });
92
+ }
93
+ tryListen(DEFAULT_PORT, 1);
94
+ }
95
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fig MCP Server - Main entry point
4
+ *
5
+ * An MCP server for parsing .fig files and providing
6
+ * structured design information for implementation.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fig MCP Server - Main entry point
4
+ *
5
+ * An MCP server for parsing .fig files and providing
6
+ * structured design information for implementation.
7
+ */
8
+ import open from "open";
9
+ import { startServer } from "./mcp/server.js";
10
+ import { startHttpServer } from "./http-server.js";
11
+ import { createServer as createViewerServer } from "./web-viewer/server.js";
12
+ const args = process.argv.slice(2);
13
+ if (args[0] === "viewer") {
14
+ const figFile = args[1];
15
+ const port = parseInt(args[2] || "3000", 10);
16
+ if (!figFile) {
17
+ console.error("Usage: fig-mcp viewer /path/to/file.fig [port]");
18
+ process.exit(1);
19
+ }
20
+ const viewerServer = createViewerServer({ figFile, port });
21
+ viewerServer.start((url) => {
22
+ void open(url);
23
+ });
24
+ }
25
+ else {
26
+ // Start HTTP server for image serving
27
+ startHttpServer();
28
+ // Start MCP server
29
+ startServer().catch((error) => {
30
+ console.error("Failed to start server:", error);
31
+ process.exit(1);
32
+ });
33
+ }
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;KAAM,CAAC;IACN,sCAAsC;IACtC,eAAe,EAAE,CAAC;IAElB,mBAAmB;IACnB,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fig Inspector - Command-line tool to inspect .fig files
4
+ *
5
+ * Usage:
6
+ * npx tsx src/inspect-fig.ts <file.fig> [command]
7
+ *
8
+ * Commands:
9
+ * list - List archive contents
10
+ * schema - Show kiwi schema info
11
+ * summary - Show document structure summary
12
+ * raw - Show raw message (truncated)
13
+ * json - Output simplified JSON
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=inspect-fig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect-fig.d.ts","sourceRoot":"","sources":["../src/inspect-fig.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fig Inspector - Command-line tool to inspect .fig files
4
+ *
5
+ * Usage:
6
+ * npx tsx src/inspect-fig.ts <file.fig> [command]
7
+ *
8
+ * Commands:
9
+ * list - List archive contents
10
+ * schema - Show kiwi schema info
11
+ * summary - Show document structure summary
12
+ * raw - Show raw message (truncated)
13
+ * json - Output simplified JSON
14
+ */
15
+ import { readFigFile, listFigContents, parseCanvasFig, getSchemaInfo, extractDocumentTree, getDocumentSummary, simplifyNode, countNodesByType, } from "./parser/index.js";
16
+ async function main() {
17
+ const args = process.argv.slice(2);
18
+ if (args.length === 0) {
19
+ console.log(`
20
+ Fig Inspector - Inspect .fig files
21
+
22
+ Usage:
23
+ npx tsx src/inspect-fig.ts <file.fig> [command]
24
+
25
+ Commands:
26
+ list - List archive contents
27
+ schema - Show kiwi schema info
28
+ summary - Show document structure summary (default)
29
+ raw - Show raw message (truncated)
30
+ json - Output simplified JSON
31
+ stats - Show node type statistics
32
+ `);
33
+ process.exit(0);
34
+ }
35
+ const filePath = args[0];
36
+ const command = args[1] ?? "summary";
37
+ try {
38
+ switch (command) {
39
+ case "list": {
40
+ const contents = await listFigContents(filePath);
41
+ console.log("Archive contents:");
42
+ for (const file of contents) {
43
+ console.log(` ${file}`);
44
+ }
45
+ break;
46
+ }
47
+ case "schema": {
48
+ const archive = await readFigFile(filePath);
49
+ const parsed = parseCanvasFig(archive.canvasFig);
50
+ const schemaInfo = getSchemaInfo(parsed.schema);
51
+ console.log(`Version: ${parsed.version}`);
52
+ console.log(`\nSchema definitions (${schemaInfo.definitionCount}):\n`);
53
+ for (const def of schemaInfo.definitions) {
54
+ console.log(`${def.kind} ${def.name} {`);
55
+ for (const field of def.fields) {
56
+ const arrayMark = field.isArray ? "[]" : "";
57
+ console.log(` ${field.name}: ${field.type}${arrayMark}`);
58
+ }
59
+ console.log(`}\n`);
60
+ }
61
+ break;
62
+ }
63
+ case "summary": {
64
+ const archive = await readFigFile(filePath);
65
+ console.log(`Meta: ${JSON.stringify(archive.meta, null, 2)}`);
66
+ console.log(`\nImages: ${archive.images.size}`);
67
+ const parsed = parseCanvasFig(archive.canvasFig);
68
+ console.log(`Version: ${parsed.version}`);
69
+ const document = extractDocumentTree(parsed.message);
70
+ if (document) {
71
+ console.log(`\nDocument Structure:`);
72
+ console.log(getDocumentSummary(document));
73
+ }
74
+ else {
75
+ console.log("\nCould not extract document tree");
76
+ console.log("Raw message keys:", Object.keys(parsed.message));
77
+ }
78
+ break;
79
+ }
80
+ case "raw": {
81
+ const archive = await readFigFile(filePath);
82
+ const parsed = parseCanvasFig(archive.canvasFig);
83
+ let json = JSON.stringify(parsed.message, null, 2);
84
+ if (json.length > 50000) {
85
+ json = json.substring(0, 50000) + "\n\n... [truncated]";
86
+ }
87
+ console.log(json);
88
+ break;
89
+ }
90
+ case "json": {
91
+ const archive = await readFigFile(filePath);
92
+ const parsed = parseCanvasFig(archive.canvasFig);
93
+ const document = extractDocumentTree(parsed.message);
94
+ if (document) {
95
+ const simplified = simplifyNode(document);
96
+ console.log(JSON.stringify(simplified, null, 2));
97
+ }
98
+ else {
99
+ console.error("Could not extract document tree");
100
+ process.exit(1);
101
+ }
102
+ break;
103
+ }
104
+ case "stats": {
105
+ const archive = await readFigFile(filePath);
106
+ const parsed = parseCanvasFig(archive.canvasFig);
107
+ const document = extractDocumentTree(parsed.message);
108
+ if (document) {
109
+ const counts = countNodesByType(document);
110
+ console.log("Node type counts:");
111
+ const sorted = Object.entries(counts).sort(([, a], [, b]) => b - a);
112
+ for (const [type, count] of sorted) {
113
+ console.log(` ${type}: ${count}`);
114
+ }
115
+ console.log(`\nTotal: ${Object.values(counts).reduce((a, b) => a + b, 0)}`);
116
+ }
117
+ else {
118
+ console.error("Could not extract document tree");
119
+ process.exit(1);
120
+ }
121
+ break;
122
+ }
123
+ default:
124
+ console.error(`Unknown command: ${command}`);
125
+ process.exit(1);
126
+ }
127
+ }
128
+ catch (error) {
129
+ console.error("Error:", error instanceof Error ? error.message : error);
130
+ process.exit(1);
131
+ }
132
+ }
133
+ main();
134
+ //# sourceMappingURL=inspect-fig.js.map