@pinepaper.studio/mcp-server 1.2.2 → 1.3.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.
- package/README.md +109 -2
- package/dist/assets/asset-manager.d.ts +75 -0
- package/dist/assets/asset-manager.d.ts.map +1 -0
- package/dist/assets/asset-manager.js +156 -0
- package/dist/assets/asset-manager.js.map +1 -0
- package/dist/assets/index.d.ts +12 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +12 -0
- package/dist/assets/index.js.map +1 -0
- package/dist/assets/repositories/fontawesome.d.ts +43 -0
- package/dist/assets/repositories/fontawesome.d.ts.map +1 -0
- package/dist/assets/repositories/fontawesome.js +163 -0
- package/dist/assets/repositories/fontawesome.js.map +1 -0
- package/dist/assets/repositories/iconify.d.ts +44 -0
- package/dist/assets/repositories/iconify.d.ts.map +1 -0
- package/dist/assets/repositories/iconify.js +208 -0
- package/dist/assets/repositories/iconify.js.map +1 -0
- package/dist/assets/repositories/openclipart.d.ts +41 -0
- package/dist/assets/repositories/openclipart.d.ts.map +1 -0
- package/dist/assets/repositories/openclipart.js +138 -0
- package/dist/assets/repositories/openclipart.js.map +1 -0
- package/dist/assets/repositories/svgrepo.d.ts +61 -0
- package/dist/assets/repositories/svgrepo.d.ts.map +1 -0
- package/dist/assets/repositories/svgrepo.js +276 -0
- package/dist/assets/repositories/svgrepo.js.map +1 -0
- package/dist/assets/types.d.ts +85 -0
- package/dist/assets/types.d.ts.map +1 -0
- package/dist/assets/types.js +7 -0
- package/dist/assets/types.js.map +1 -0
- package/dist/execution/canvas-state.d.ts +65 -0
- package/dist/execution/canvas-state.d.ts.map +1 -0
- package/dist/execution/canvas-state.js +165 -0
- package/dist/execution/canvas-state.js.map +1 -0
- package/dist/execution/index.d.ts +8 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +8 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/metrics/index.d.ts +8 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +8 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/performance-tracker.d.ts +96 -0
- package/dist/metrics/performance-tracker.d.ts.map +1 -0
- package/dist/metrics/performance-tracker.js +270 -0
- package/dist/metrics/performance-tracker.js.map +1 -0
- package/dist/metrics/types.d.ts +86 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +7 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +476 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +301 -37
- package/dist/tools/handlers.js.map +1 -1
- package/dist/tools/p5-compat/index.d.ts +8 -0
- package/dist/tools/p5-compat/index.d.ts.map +1 -0
- package/dist/tools/p5-compat/index.js +8 -0
- package/dist/tools/p5-compat/index.js.map +1 -0
- package/dist/tools/p5-compat/p5-helpers.d.ts +25 -0
- package/dist/tools/p5-compat/p5-helpers.d.ts.map +1 -0
- package/dist/tools/p5-compat/p5-helpers.js +399 -0
- package/dist/tools/p5-compat/p5-helpers.js.map +1 -0
- package/dist/types/code-generator.d.ts +4 -0
- package/dist/types/code-generator.d.ts.map +1 -1
- package/dist/types/code-generator.js +8 -0
- package/dist/types/code-generator.js.map +1 -1
- package/dist/types/schemas.d.ts +77 -0
- package/dist/types/schemas.d.ts.map +1 -1
- package/dist/types/schemas.js +34 -0
- package/dist/types/schemas.js.map +1 -1
- package/manifest.json +18 -2
- package/package.json +1 -1
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVGRepo Asset Repository Adapter
|
|
3
|
+
*
|
|
4
|
+
* Fetches SVG assets from svgrepo.com
|
|
5
|
+
* Repository info: 500,000+ free SVG icons with various licenses
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* SVGRepo adapter - Real implementation
|
|
9
|
+
*
|
|
10
|
+
* Searches and downloads SVG assets from svgrepo.com
|
|
11
|
+
*/
|
|
12
|
+
export class SVGRepoAdapter {
|
|
13
|
+
name = 'svgrepo';
|
|
14
|
+
baseUrl = 'https://www.svgrepo.com';
|
|
15
|
+
searchUrl = 'https://www.svgrepo.com/vectors';
|
|
16
|
+
/**
|
|
17
|
+
* Search for assets on SVGRepo
|
|
18
|
+
*
|
|
19
|
+
* @param query Search term (e.g., "rocket", "heart")
|
|
20
|
+
* @param limit Maximum results to return
|
|
21
|
+
*/
|
|
22
|
+
async search(query, limit) {
|
|
23
|
+
try {
|
|
24
|
+
// Encode query for URL
|
|
25
|
+
const encodedQuery = encodeURIComponent(query);
|
|
26
|
+
const searchUrl = `${this.searchUrl}/${encodedQuery}/1/`;
|
|
27
|
+
// Fetch search results page
|
|
28
|
+
const response = await fetch(searchUrl, {
|
|
29
|
+
headers: {
|
|
30
|
+
'User-Agent': 'PinePaper-MCP-Server/1.2.2',
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
throw new Error(`SVGRepo search failed: ${response.status} ${response.statusText}`);
|
|
35
|
+
}
|
|
36
|
+
const html = await response.text();
|
|
37
|
+
// Parse HTML to extract results
|
|
38
|
+
const results = this.parseSearchResults(html, limit);
|
|
39
|
+
// Convert to AssetResult format
|
|
40
|
+
return results.map((result) => ({
|
|
41
|
+
id: this.urlToAssetId(result.url),
|
|
42
|
+
repository: 'svgrepo',
|
|
43
|
+
title: result.title,
|
|
44
|
+
description: `${result.title} from SVGRepo`,
|
|
45
|
+
previewUrl: result.previewUrl,
|
|
46
|
+
downloadUrl: result.url,
|
|
47
|
+
license: this.parseLicenseFromPage(html), // Default license
|
|
48
|
+
tags: [query],
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
console.error('[SVGRepoAdapter] Search error:', error);
|
|
53
|
+
// Return empty results on error rather than throwing
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Download SVG content
|
|
59
|
+
*
|
|
60
|
+
* @param assetId Asset ID from search results (format: svgrepo_12345_slug)
|
|
61
|
+
*/
|
|
62
|
+
async download(assetId) {
|
|
63
|
+
try {
|
|
64
|
+
// Convert asset ID back to URL
|
|
65
|
+
const url = this.assetIdToUrl(assetId);
|
|
66
|
+
// Fetch the asset page to get download link
|
|
67
|
+
const pageResponse = await fetch(url, {
|
|
68
|
+
headers: {
|
|
69
|
+
'User-Agent': 'PinePaper-MCP-Server/1.2.2',
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
if (!pageResponse.ok) {
|
|
73
|
+
throw new Error(`Failed to fetch asset page: ${pageResponse.status}`);
|
|
74
|
+
}
|
|
75
|
+
const html = await pageResponse.text();
|
|
76
|
+
// Extract download URL from page
|
|
77
|
+
const downloadUrl = this.extractDownloadUrl(html, url);
|
|
78
|
+
if (!downloadUrl) {
|
|
79
|
+
throw new Error('Could not find download URL in page');
|
|
80
|
+
}
|
|
81
|
+
// Download the SVG file
|
|
82
|
+
const svgResponse = await fetch(downloadUrl, {
|
|
83
|
+
headers: {
|
|
84
|
+
'User-Agent': 'PinePaper-MCP-Server/1.2.2',
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
if (!svgResponse.ok) {
|
|
88
|
+
throw new Error(`Failed to download SVG: ${svgResponse.status}`);
|
|
89
|
+
}
|
|
90
|
+
const svg = await svgResponse.text();
|
|
91
|
+
// Validate it's actually SVG
|
|
92
|
+
if (!svg.trim().startsWith('<svg') && !svg.includes('<svg')) {
|
|
93
|
+
throw new Error('Downloaded content is not valid SVG');
|
|
94
|
+
}
|
|
95
|
+
return svg;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error('[SVGRepoAdapter] Download error:', error);
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get asset metadata
|
|
104
|
+
*
|
|
105
|
+
* @param assetId Asset ID
|
|
106
|
+
*/
|
|
107
|
+
async getMetadata(assetId) {
|
|
108
|
+
try {
|
|
109
|
+
const url = this.assetIdToUrl(assetId);
|
|
110
|
+
// Fetch page to extract metadata
|
|
111
|
+
const response = await fetch(url, {
|
|
112
|
+
headers: {
|
|
113
|
+
'User-Agent': 'PinePaper-MCP-Server/1.2.2',
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
const html = await response.text();
|
|
117
|
+
// Extract title
|
|
118
|
+
const titleMatch = html.match(/<title>([^<]+)<\/title>/i);
|
|
119
|
+
const title = titleMatch
|
|
120
|
+
? titleMatch[1].replace(' SVG Vector', '').replace(' - SVG Repo', '').trim()
|
|
121
|
+
: assetId;
|
|
122
|
+
// Extract license info
|
|
123
|
+
const license = this.parseLicenseFromPage(html);
|
|
124
|
+
return {
|
|
125
|
+
id: assetId,
|
|
126
|
+
repository: this.name,
|
|
127
|
+
title,
|
|
128
|
+
license,
|
|
129
|
+
downloadedAt: Date.now(),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error('[SVGRepoAdapter] Metadata error:', error);
|
|
134
|
+
// Return minimal metadata on error
|
|
135
|
+
return {
|
|
136
|
+
id: assetId,
|
|
137
|
+
repository: this.name,
|
|
138
|
+
title: assetId,
|
|
139
|
+
license: {
|
|
140
|
+
type: 'Unknown',
|
|
141
|
+
name: 'Unknown License',
|
|
142
|
+
requiresAttribution: true,
|
|
143
|
+
allowsCommercial: false,
|
|
144
|
+
},
|
|
145
|
+
downloadedAt: Date.now(),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Parse search results from HTML
|
|
151
|
+
*/
|
|
152
|
+
parseSearchResults(html, limit) {
|
|
153
|
+
const results = [];
|
|
154
|
+
// Look for SVG result cards in the HTML
|
|
155
|
+
// Pattern: <a href="/svg/123456/icon-name">
|
|
156
|
+
const linkRegex = /<a[^>]+href="(\/svg\/[^"]+)"[^>]*>/gi;
|
|
157
|
+
const titleRegex = /title="([^"]+)"/i;
|
|
158
|
+
const imgRegex = /<img[^>]+src="([^"]+)"/i;
|
|
159
|
+
let match;
|
|
160
|
+
const seenUrls = new Set();
|
|
161
|
+
while ((match = linkRegex.exec(html)) !== null && results.length < limit) {
|
|
162
|
+
const relativeUrl = match[1];
|
|
163
|
+
const fullUrl = `${this.baseUrl}${relativeUrl}`;
|
|
164
|
+
// Skip duplicates
|
|
165
|
+
if (seenUrls.has(fullUrl))
|
|
166
|
+
continue;
|
|
167
|
+
seenUrls.add(fullUrl);
|
|
168
|
+
// Get the surrounding HTML to extract title and image
|
|
169
|
+
const startIdx = match.index;
|
|
170
|
+
const endIdx = Math.min(startIdx + 500, html.length);
|
|
171
|
+
const surroundingHtml = html.substring(startIdx, endIdx);
|
|
172
|
+
// Extract title
|
|
173
|
+
const titleMatch = surroundingHtml.match(titleRegex);
|
|
174
|
+
const title = titleMatch
|
|
175
|
+
? titleMatch[1].replace(' SVG Vector', '').replace(' SVG File', '').trim()
|
|
176
|
+
: relativeUrl.split('/').pop() || 'Untitled';
|
|
177
|
+
// Extract preview image
|
|
178
|
+
const imgMatch = surroundingHtml.match(imgRegex);
|
|
179
|
+
const previewUrl = imgMatch ? imgMatch[1] : '';
|
|
180
|
+
results.push({
|
|
181
|
+
url: fullUrl,
|
|
182
|
+
title,
|
|
183
|
+
previewUrl: previewUrl.startsWith('http') ? previewUrl : `${this.baseUrl}${previewUrl}`,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return results;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Parse license information from page HTML
|
|
190
|
+
*/
|
|
191
|
+
parseLicenseFromPage(html) {
|
|
192
|
+
// Look for license information in the HTML
|
|
193
|
+
if (html.includes('CC0') || html.includes('Public Domain')) {
|
|
194
|
+
return {
|
|
195
|
+
type: 'CC0',
|
|
196
|
+
name: 'Public Domain (CC0)',
|
|
197
|
+
requiresAttribution: false,
|
|
198
|
+
allowsCommercial: true,
|
|
199
|
+
url: 'https://creativecommons.org/publicdomain/zero/1.0/',
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (html.includes('CC-BY')) {
|
|
203
|
+
return {
|
|
204
|
+
type: 'CC-BY-4.0',
|
|
205
|
+
name: 'Creative Commons Attribution 4.0',
|
|
206
|
+
requiresAttribution: true,
|
|
207
|
+
allowsCommercial: true,
|
|
208
|
+
url: 'https://creativecommons.org/licenses/by/4.0/',
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
// Default to requiring attribution to be safe
|
|
212
|
+
return {
|
|
213
|
+
type: 'Mixed',
|
|
214
|
+
name: 'Mixed Licenses (check individual asset)',
|
|
215
|
+
requiresAttribution: true,
|
|
216
|
+
allowsCommercial: true,
|
|
217
|
+
url: this.baseUrl,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Extract download URL from asset page
|
|
222
|
+
*/
|
|
223
|
+
extractDownloadUrl(html, assetUrl) {
|
|
224
|
+
// Try to find direct download link
|
|
225
|
+
// SVGRepo typically has download buttons with specific patterns
|
|
226
|
+
const downloadMatch = html.match(/href="([^"]*download[^"]*)"/i);
|
|
227
|
+
if (downloadMatch) {
|
|
228
|
+
const url = downloadMatch[1];
|
|
229
|
+
return url.startsWith('http') ? url : `${this.baseUrl}${url}`;
|
|
230
|
+
}
|
|
231
|
+
// Alternative: look for .svg file links
|
|
232
|
+
const svgMatch = html.match(/href="([^"]*\.svg)"/i);
|
|
233
|
+
if (svgMatch) {
|
|
234
|
+
const url = svgMatch[1];
|
|
235
|
+
return url.startsWith('http') ? url : `${this.baseUrl}${url}`;
|
|
236
|
+
}
|
|
237
|
+
// Fallback: try to construct download URL from asset URL
|
|
238
|
+
// Pattern: /svg/123456/name -> /download/123456/name.svg
|
|
239
|
+
const idMatch = assetUrl.match(/\/svg\/(\d+)\/([^/]+)/);
|
|
240
|
+
if (idMatch) {
|
|
241
|
+
return `${this.baseUrl}/download/${idMatch[1]}/${idMatch[2]}.svg`;
|
|
242
|
+
}
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Convert asset URL to asset ID
|
|
247
|
+
*/
|
|
248
|
+
urlToAssetId(url) {
|
|
249
|
+
// Extract ID and slug from URL
|
|
250
|
+
// Format: https://www.svgrepo.com/svg/123456/icon-name
|
|
251
|
+
const match = url.match(/\/svg\/(\d+)\/([^/]+)/);
|
|
252
|
+
if (match) {
|
|
253
|
+
return `svgrepo_${match[1]}_${match[2]}`;
|
|
254
|
+
}
|
|
255
|
+
// Fallback
|
|
256
|
+
return `svgrepo_${Date.now()}`;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Convert asset ID back to URL
|
|
260
|
+
*/
|
|
261
|
+
assetIdToUrl(assetId) {
|
|
262
|
+
// Format: svgrepo_123456_icon-name -> https://www.svgrepo.com/svg/123456/icon-name
|
|
263
|
+
const match = assetId.match(/svgrepo_(\d+)_(.+)/);
|
|
264
|
+
if (match) {
|
|
265
|
+
return `${this.baseUrl}/svg/${match[1]}/${match[2]}`;
|
|
266
|
+
}
|
|
267
|
+
throw new Error(`Invalid SVGRepo asset ID format: ${assetId}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Create SVGRepo adapter instance
|
|
272
|
+
*/
|
|
273
|
+
export function createSVGRepoAdapter() {
|
|
274
|
+
return new SVGRepoAdapter();
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=svgrepo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svgrepo.js","sourceRoot":"","sources":["../../../src/assets/repositories/svgrepo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset Fetching Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for fetching SVG assets from open repositories.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Asset license information
|
|
8
|
+
*/
|
|
9
|
+
export interface AssetLicense {
|
|
10
|
+
/** License type (e.g., 'CC0', 'MIT', 'Apache-2.0', 'CC-BY-4.0') */
|
|
11
|
+
type: string;
|
|
12
|
+
/** License name (human-readable) */
|
|
13
|
+
name: string;
|
|
14
|
+
/** Whether attribution is required */
|
|
15
|
+
requiresAttribution: boolean;
|
|
16
|
+
/** Whether commercial use is allowed */
|
|
17
|
+
allowsCommercial: boolean;
|
|
18
|
+
/** License URL for more information */
|
|
19
|
+
url?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Single asset search result
|
|
23
|
+
*/
|
|
24
|
+
export interface AssetResult {
|
|
25
|
+
/** Unique asset ID (e.g., 'svgrepo_12345', 'openclipart_67890') */
|
|
26
|
+
id: string;
|
|
27
|
+
/** Repository name */
|
|
28
|
+
repository: 'svgrepo' | 'openclipart' | 'iconify' | 'fontawesome';
|
|
29
|
+
/** Asset title/name */
|
|
30
|
+
title: string;
|
|
31
|
+
/** Asset description (if available) */
|
|
32
|
+
description?: string;
|
|
33
|
+
/** Preview URL (if available) */
|
|
34
|
+
previewUrl?: string;
|
|
35
|
+
/** Download URL for the SVG */
|
|
36
|
+
downloadUrl: string;
|
|
37
|
+
/** License information */
|
|
38
|
+
license: AssetLicense;
|
|
39
|
+
/** Tags/categories */
|
|
40
|
+
tags?: string[];
|
|
41
|
+
/** Author/creator (if available) */
|
|
42
|
+
author?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Asset metadata
|
|
46
|
+
*/
|
|
47
|
+
export interface AssetMetadata {
|
|
48
|
+
/** Asset ID */
|
|
49
|
+
id: string;
|
|
50
|
+
/** Repository */
|
|
51
|
+
repository: string;
|
|
52
|
+
/** Title */
|
|
53
|
+
title: string;
|
|
54
|
+
/** License */
|
|
55
|
+
license: AssetLicense;
|
|
56
|
+
/** Downloaded timestamp */
|
|
57
|
+
downloadedAt: number;
|
|
58
|
+
/** SVG content hash (for cache invalidation) */
|
|
59
|
+
contentHash?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Asset repository interface
|
|
63
|
+
*/
|
|
64
|
+
export interface AssetRepository {
|
|
65
|
+
/** Repository name */
|
|
66
|
+
name: string;
|
|
67
|
+
/** Search for assets */
|
|
68
|
+
search(query: string, limit: number): Promise<AssetResult[]>;
|
|
69
|
+
/** Download asset SVG content */
|
|
70
|
+
download(assetId: string): Promise<string>;
|
|
71
|
+
/** Get asset metadata */
|
|
72
|
+
getMetadata(assetId: string): Promise<AssetMetadata>;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Asset cache entry
|
|
76
|
+
*/
|
|
77
|
+
export interface AssetCacheEntry {
|
|
78
|
+
/** SVG content */
|
|
79
|
+
svg: string;
|
|
80
|
+
/** Metadata */
|
|
81
|
+
metadata: AssetMetadata;
|
|
82
|
+
/** Cached timestamp */
|
|
83
|
+
cachedAt: number;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/assets/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IAEb,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IAEb,sCAAsC;IACtC,mBAAmB,EAAE,OAAO,CAAC;IAE7B,wCAAwC;IACxC,gBAAgB,EAAE,OAAO,CAAC;IAE1B,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,EAAE,EAAE,MAAM,CAAC;IAEX,sBAAsB;IACtB,UAAU,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,aAAa,CAAC;IAElE,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IAEd,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IAEpB,0BAA0B;IAC1B,OAAO,EAAE,YAAY,CAAC;IAEtB,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,eAAe;IACf,EAAE,EAAE,MAAM,CAAC;IAEX,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;IAEnB,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IAEd,cAAc;IACd,OAAO,EAAE,YAAY,CAAC;IAEtB,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;IAErB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IAEb,wBAAwB;IACxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAE7D,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3C,yBAAyB;IACzB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kBAAkB;IAClB,GAAG,EAAE,MAAM,CAAC;IAEZ,eAAe;IACf,QAAQ,EAAE,aAAa,CAAC;IAExB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/assets/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canvas State Capture
|
|
3
|
+
*
|
|
4
|
+
* Captures canvas context for enhanced error messages and debugging.
|
|
5
|
+
* Provides structured information about what was on the canvas when errors occurred.
|
|
6
|
+
*/
|
|
7
|
+
import { PinePaperBrowserController } from '../browser/puppeteer-controller.js';
|
|
8
|
+
/**
|
|
9
|
+
* Canvas state snapshot for error context
|
|
10
|
+
*/
|
|
11
|
+
export interface CanvasState {
|
|
12
|
+
/** Total number of items on canvas */
|
|
13
|
+
itemCount: number;
|
|
14
|
+
/** Breakdown by item type */
|
|
15
|
+
itemTypes: Record<string, number>;
|
|
16
|
+
/** Canvas dimensions */
|
|
17
|
+
canvasSize: {
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
};
|
|
21
|
+
/** Relation statistics */
|
|
22
|
+
relations: {
|
|
23
|
+
total: number;
|
|
24
|
+
byType: Record<string, number>;
|
|
25
|
+
};
|
|
26
|
+
/** Recently created items (last 5) */
|
|
27
|
+
recentItems: Array<{
|
|
28
|
+
id: string;
|
|
29
|
+
type: string;
|
|
30
|
+
timestamp?: number;
|
|
31
|
+
}>;
|
|
32
|
+
/** Whether canvas is empty */
|
|
33
|
+
isEmpty: boolean;
|
|
34
|
+
/** Timestamp when captured */
|
|
35
|
+
capturedAt: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Error context with canvas state
|
|
39
|
+
*/
|
|
40
|
+
export interface ErrorContext {
|
|
41
|
+
/** Canvas state at time of error */
|
|
42
|
+
canvasState?: CanvasState;
|
|
43
|
+
/** Tool that caused the error */
|
|
44
|
+
toolName?: string;
|
|
45
|
+
/** Additional error metadata */
|
|
46
|
+
metadata?: Record<string, unknown>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Capture current canvas state for error reporting
|
|
50
|
+
*/
|
|
51
|
+
export declare function captureCanvasState(browserController: PinePaperBrowserController): Promise<CanvasState | null>;
|
|
52
|
+
/**
|
|
53
|
+
* Format canvas state for human-readable error messages
|
|
54
|
+
*/
|
|
55
|
+
export declare function formatCanvasState(state: CanvasState): string;
|
|
56
|
+
/**
|
|
57
|
+
* Format error context for inclusion in error responses
|
|
58
|
+
*/
|
|
59
|
+
export declare function formatErrorContext(context: ErrorContext): string;
|
|
60
|
+
/**
|
|
61
|
+
* Create minimal error context without canvas state
|
|
62
|
+
* (for errors that occur before browser connection)
|
|
63
|
+
*/
|
|
64
|
+
export declare function createMinimalErrorContext(toolName?: string, metadata?: Record<string, unknown>): ErrorContext;
|
|
65
|
+
//# sourceMappingURL=canvas-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-state.d.ts","sourceRoot":"","sources":["../../src/execution/canvas-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAElB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,wBAAwB;IACxB,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,0BAA0B;IAC1B,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC;IAEF,sCAAsC;IACtC,WAAW,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IAEH,8BAA8B;IAC9B,OAAO,EAAE,OAAO,CAAC;IAEjB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,iBAAiB,EAAE,0BAA0B,GAC5C,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAkF7B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA8C5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAqBhE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,YAAY,CAKd"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canvas State Capture
|
|
3
|
+
*
|
|
4
|
+
* Captures canvas context for enhanced error messages and debugging.
|
|
5
|
+
* Provides structured information about what was on the canvas when errors occurred.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Capture current canvas state for error reporting
|
|
9
|
+
*/
|
|
10
|
+
export async function captureCanvasState(browserController) {
|
|
11
|
+
if (!browserController.connected) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
// Query canvas state in a single browser execution
|
|
16
|
+
const stateCode = `
|
|
17
|
+
(function() {
|
|
18
|
+
const items = window.pinepaper.getItems();
|
|
19
|
+
const canvas = window.pinepaper.canvas;
|
|
20
|
+
|
|
21
|
+
// Count by type
|
|
22
|
+
const itemTypes = {};
|
|
23
|
+
items.forEach(item => {
|
|
24
|
+
const type = item.type || 'unknown';
|
|
25
|
+
itemTypes[type] = (itemTypes[type] || 0) + 1;
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Get relation stats
|
|
29
|
+
const relations = [];
|
|
30
|
+
items.forEach(item => {
|
|
31
|
+
if (item.relations) {
|
|
32
|
+
Object.keys(item.relations).forEach(targetId => {
|
|
33
|
+
const relationTypes = item.relations[targetId];
|
|
34
|
+
relationTypes.forEach(rel => {
|
|
35
|
+
relations.push({ type: rel.type });
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const relationsByType = {};
|
|
42
|
+
relations.forEach(rel => {
|
|
43
|
+
relationsByType[rel.type] = (relationsByType[rel.type] || 0) + 1;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Get recent items (last 5)
|
|
47
|
+
const recentItems = items
|
|
48
|
+
.slice(-5)
|
|
49
|
+
.map(item => ({
|
|
50
|
+
id: item.id,
|
|
51
|
+
type: item.type || 'unknown'
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
itemCount: items.length,
|
|
56
|
+
itemTypes: itemTypes,
|
|
57
|
+
canvasSize: {
|
|
58
|
+
width: canvas.width,
|
|
59
|
+
height: canvas.height
|
|
60
|
+
},
|
|
61
|
+
relations: {
|
|
62
|
+
total: relations.length,
|
|
63
|
+
byType: relationsByType
|
|
64
|
+
},
|
|
65
|
+
recentItems: recentItems,
|
|
66
|
+
isEmpty: items.length === 0
|
|
67
|
+
};
|
|
68
|
+
})();
|
|
69
|
+
`;
|
|
70
|
+
const result = await browserController.executeCode(stateCode, false);
|
|
71
|
+
if (result.success && result.result) {
|
|
72
|
+
// Parse the result
|
|
73
|
+
const state = typeof result.result === 'string'
|
|
74
|
+
? JSON.parse(result.result)
|
|
75
|
+
: result.result;
|
|
76
|
+
return {
|
|
77
|
+
...state,
|
|
78
|
+
capturedAt: Date.now(),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
// Don't throw errors from state capture - just return null
|
|
85
|
+
console.error('[CanvasState] Failed to capture state:', error);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format canvas state for human-readable error messages
|
|
91
|
+
*/
|
|
92
|
+
export function formatCanvasState(state) {
|
|
93
|
+
const lines = [];
|
|
94
|
+
lines.push('Canvas State:');
|
|
95
|
+
if (state.isEmpty) {
|
|
96
|
+
lines.push(' - Canvas is EMPTY (no items)');
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
lines.push(` - Total Items: ${state.itemCount}`);
|
|
100
|
+
// Item types
|
|
101
|
+
if (Object.keys(state.itemTypes).length > 0) {
|
|
102
|
+
lines.push(' - Item Types:');
|
|
103
|
+
Object.entries(state.itemTypes)
|
|
104
|
+
.sort(([, a], [, b]) => b - a) // Sort by count descending
|
|
105
|
+
.forEach(([type, count]) => {
|
|
106
|
+
lines.push(` • ${type}: ${count}`);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Relations
|
|
110
|
+
if (state.relations.total > 0) {
|
|
111
|
+
lines.push(` - Relations: ${state.relations.total}`);
|
|
112
|
+
if (Object.keys(state.relations.byType).length > 0) {
|
|
113
|
+
Object.entries(state.relations.byType)
|
|
114
|
+
.sort(([, a], [, b]) => b - a)
|
|
115
|
+
.forEach(([type, count]) => {
|
|
116
|
+
lines.push(` • ${type}: ${count}`);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
lines.push(' - Relations: None');
|
|
122
|
+
}
|
|
123
|
+
// Recent items
|
|
124
|
+
if (state.recentItems.length > 0) {
|
|
125
|
+
lines.push(' - Recent Items:');
|
|
126
|
+
state.recentItems.forEach(item => {
|
|
127
|
+
lines.push(` • ${item.id} (${item.type})`);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
lines.push(` - Canvas Size: ${state.canvasSize.width}x${state.canvasSize.height}`);
|
|
132
|
+
return lines.join('\n');
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Format error context for inclusion in error responses
|
|
136
|
+
*/
|
|
137
|
+
export function formatErrorContext(context) {
|
|
138
|
+
const lines = [];
|
|
139
|
+
if (context.toolName) {
|
|
140
|
+
lines.push(`Tool: ${context.toolName}`);
|
|
141
|
+
}
|
|
142
|
+
if (context.canvasState) {
|
|
143
|
+
lines.push('');
|
|
144
|
+
lines.push(formatCanvasState(context.canvasState));
|
|
145
|
+
}
|
|
146
|
+
if (context.metadata && Object.keys(context.metadata).length > 0) {
|
|
147
|
+
lines.push('');
|
|
148
|
+
lines.push('Additional Context:');
|
|
149
|
+
Object.entries(context.metadata).forEach(([key, value]) => {
|
|
150
|
+
lines.push(` - ${key}: ${JSON.stringify(value)}`);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return lines.join('\n');
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Create minimal error context without canvas state
|
|
157
|
+
* (for errors that occur before browser connection)
|
|
158
|
+
*/
|
|
159
|
+
export function createMinimalErrorContext(toolName, metadata) {
|
|
160
|
+
return {
|
|
161
|
+
toolName,
|
|
162
|
+
metadata,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=canvas-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-state.js","sourceRoot":"","sources":["../../src/execution/canvas-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,mBAAmB,CAAC"}
|