@pinepaper.studio/mcp-server 1.2.2 → 1.3.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 (61) hide show
  1. package/README.md +109 -2
  2. package/dist/assets/asset-manager.d.ts +75 -0
  3. package/dist/assets/asset-manager.d.ts.map +1 -0
  4. package/dist/assets/asset-manager.js +156 -0
  5. package/dist/assets/asset-manager.js.map +1 -0
  6. package/dist/assets/index.d.ts +12 -0
  7. package/dist/assets/index.d.ts.map +1 -0
  8. package/dist/assets/index.js +12 -0
  9. package/dist/assets/index.js.map +1 -0
  10. package/dist/assets/repositories/fontawesome.d.ts +43 -0
  11. package/dist/assets/repositories/fontawesome.d.ts.map +1 -0
  12. package/dist/assets/repositories/fontawesome.js +163 -0
  13. package/dist/assets/repositories/fontawesome.js.map +1 -0
  14. package/dist/assets/repositories/iconify.d.ts +44 -0
  15. package/dist/assets/repositories/iconify.d.ts.map +1 -0
  16. package/dist/assets/repositories/iconify.js +208 -0
  17. package/dist/assets/repositories/iconify.js.map +1 -0
  18. package/dist/assets/repositories/openclipart.d.ts +41 -0
  19. package/dist/assets/repositories/openclipart.d.ts.map +1 -0
  20. package/dist/assets/repositories/openclipart.js +138 -0
  21. package/dist/assets/repositories/openclipart.js.map +1 -0
  22. package/dist/assets/repositories/svgrepo.d.ts +61 -0
  23. package/dist/assets/repositories/svgrepo.d.ts.map +1 -0
  24. package/dist/assets/repositories/svgrepo.js +276 -0
  25. package/dist/assets/repositories/svgrepo.js.map +1 -0
  26. package/dist/assets/types.d.ts +85 -0
  27. package/dist/assets/types.d.ts.map +1 -0
  28. package/dist/assets/types.js +7 -0
  29. package/dist/assets/types.js.map +1 -0
  30. package/dist/execution/canvas-state.d.ts +65 -0
  31. package/dist/execution/canvas-state.d.ts.map +1 -0
  32. package/dist/execution/canvas-state.js +165 -0
  33. package/dist/execution/canvas-state.js.map +1 -0
  34. package/dist/execution/index.d.ts +8 -0
  35. package/dist/execution/index.d.ts.map +1 -0
  36. package/dist/execution/index.js +8 -0
  37. package/dist/execution/index.js.map +1 -0
  38. package/dist/metrics/index.d.ts +8 -0
  39. package/dist/metrics/index.d.ts.map +1 -0
  40. package/dist/metrics/index.js +8 -0
  41. package/dist/metrics/index.js.map +1 -0
  42. package/dist/metrics/performance-tracker.d.ts +96 -0
  43. package/dist/metrics/performance-tracker.d.ts.map +1 -0
  44. package/dist/metrics/performance-tracker.js +270 -0
  45. package/dist/metrics/performance-tracker.js.map +1 -0
  46. package/dist/metrics/types.d.ts +86 -0
  47. package/dist/metrics/types.d.ts.map +1 -0
  48. package/dist/metrics/types.js +7 -0
  49. package/dist/metrics/types.js.map +1 -0
  50. package/dist/tools/definitions.d.ts.map +1 -1
  51. package/dist/tools/definitions.js +360 -0
  52. package/dist/tools/definitions.js.map +1 -1
  53. package/dist/tools/handlers.d.ts.map +1 -1
  54. package/dist/tools/handlers.js +292 -37
  55. package/dist/tools/handlers.js.map +1 -1
  56. package/dist/types/schemas.d.ts +69 -0
  57. package/dist/types/schemas.d.ts.map +1 -1
  58. package/dist/types/schemas.js +28 -0
  59. package/dist/types/schemas.js.map +1 -1
  60. package/manifest.json +14 -2
  61. package/package.json +1 -1
package/README.md CHANGED
@@ -56,6 +56,54 @@ Open Claude Desktop and try:
56
56
 
57
57
  ## Features
58
58
 
59
+ ### 🔍 Asset Search & Import (NEW in v1.3.0)
60
+
61
+ Search and import free SVG assets from multiple repositories:
62
+
63
+ ```
64
+ "Search for a rocket icon"
65
+ "Import a cat illustration"
66
+ "Add a user avatar icon"
67
+ ```
68
+
69
+ **Supported Repositories:**
70
+ - **SVGRepo**: 500,000+ icons with various licenses
71
+ - **OpenClipart**: 150,000+ public domain clipart (CC0)
72
+ - **Iconify**: 200,000+ icons from multiple icon sets
73
+ - **Font Awesome**: 2,000+ free icons (CC BY 4.0)
74
+
75
+ **Tools:**
76
+ - `pinepaper_search_assets` - Search across all repositories
77
+ - `pinepaper_import_asset` - Import and place on canvas
78
+
79
+ ### 📊 Performance Metrics (NEW in v1.3.0)
80
+
81
+ Built-in performance tracking helps Claude optimize workflows:
82
+
83
+ - Automatic timing for all tool operations
84
+ - Phase breakdown (validation, code generation, execution, screenshots)
85
+ - Export formats: summary, detailed JSON, CSV
86
+ - Self-optimization through `pinepaper_get_performance_metrics`
87
+
88
+ **Example workflow:**
89
+ ```
90
+ 1. Run your scene creation workflow
91
+ 2. Call pinepaper_get_performance_metrics
92
+ 3. Identify bottlenecks (e.g., individual creates vs batch)
93
+ 4. Adjust approach and re-run
94
+ ```
95
+
96
+ ### 🐛 Enhanced Error Messages (NEW in v1.3.0)
97
+
98
+ Errors now include canvas context for easier debugging:
99
+
100
+ - Total item count and types
101
+ - Active relations
102
+ - Recent items created
103
+ - Canvas state at time of error
104
+
105
+ Makes troubleshooting much faster and more precise.
106
+
59
107
  ### 🎨 Item Creation
60
108
 
61
109
  Create text, shapes, and custom graphics:
@@ -127,6 +175,11 @@ Outputs pairs like:
127
175
  | `pinepaper_create_item` | Create text, shapes, graphics |
128
176
  | `pinepaper_modify_item` | Change item properties |
129
177
  | `pinepaper_delete_item` | Remove an item |
178
+ | `pinepaper_batch_create` | Create multiple items at once |
179
+ | `pinepaper_batch_modify` | Modify multiple items at once |
180
+ | `pinepaper_create_grid` | Create items in a grid layout |
181
+ | `pinepaper_create_glossy_sphere` | Create 3D glossy sphere effect |
182
+ | `pinepaper_create_diagonal_stripes` | Create diagonal stripe pattern |
130
183
 
131
184
  ### Relation Tools
132
185
  | Tool | Description |
@@ -153,11 +206,18 @@ Outputs pairs like:
153
206
  |------|-------------|
154
207
  | `pinepaper_apply_effect` | Apply sparkle, blast effects |
155
208
 
209
+ ### Asset Tools (NEW)
210
+ | Tool | Description |
211
+ |------|-------------|
212
+ | `pinepaper_search_assets` | Search for SVG assets across repositories |
213
+ | `pinepaper_import_asset` | Import asset from search results |
214
+
156
215
  ### Query Tools
157
216
  | Tool | Description |
158
217
  |------|-------------|
159
218
  | `pinepaper_get_items` | Get canvas items |
160
219
  | `pinepaper_get_relation_stats` | Relation statistics |
220
+ | `pinepaper_get_performance_metrics` | Get execution timing metrics (NEW) |
161
221
 
162
222
  ### Canvas Tools
163
223
  | Tool | Description |
@@ -366,10 +426,57 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.
366
426
  | `PINEPAPER_DEBUG` | Enable debug logging | `false` |
367
427
  | `PINEPAPER_LOG_LEVEL` | Log level (error/warn/info/debug) | `info` |
368
428
  | `PINEPAPER_LOCALE` | Language locale code | `en` |
429
+ | `PINEPAPER_METRICS_ENABLED` | Enable performance metrics tracking | `true` |
430
+ | `PINEPAPER_METRICS_RETENTION` | Max metrics to retain in memory | `1000` |
431
+ | `PINEPAPER_SCREENSHOT_MODE` | Screenshot mode (on_request/always/never) | `on_request` |
432
+
433
+ ### Performance Metrics
434
+
435
+ PinePaper MCP Server includes built-in performance tracking to help Claude optimize workflows by identifying bottlenecks and choosing faster alternatives.
436
+
437
+ **Key Features:**
438
+ - ⚡ Automatic timing for all tool operations
439
+ - 📊 Phase breakdown (validation, code generation, browser execution, screenshots)
440
+ - 🎯 Real-time query via `pinepaper_get_performance_metrics` tool
441
+ - 📈 Export formats: summary, JSON, CSV
442
+ - 💾 In-memory storage (resets on restart)
443
+ - 🚀 Minimal overhead (~1ms per operation)
444
+
445
+ **Quick Example:**
446
+
447
+ ```
448
+ Claude: "Let me check if batch operations are faster"
449
+ → pinepaper_get_performance_metrics(format: 'summary')
450
+
451
+ Result:
452
+ - pinepaper_create_item: avg 145ms
453
+ - pinepaper_batch_create (10 items): avg 298ms (~30ms per item)
454
+
455
+ Claude: "I'll use batch_create for the next 20 items"
456
+ ```
457
+
458
+ **Configuration:**
459
+
460
+ ```bash
461
+ # Disable metrics if not needed
462
+ export PINEPAPER_METRICS_ENABLED=false
463
+
464
+ # Increase retention for long sessions
465
+ export PINEPAPER_METRICS_RETENTION=5000
466
+ ```
467
+
468
+ **Learn More:** See [docs/PERFORMANCE_METRICS.md](docs/PERFORMANCE_METRICS.md) for complete documentation.
469
+
470
+ ## Documentation
471
+
472
+ ### Guides
473
+
474
+ - **[Workflow Guide](docs/WORKFLOW_GUIDE.md)** - Decision trees, multi-step patterns, performance optimization, and troubleshooting
475
+ - **[Performance Metrics](docs/PERFORMANCE_METRICS.md)** - In-memory metrics system for Claude self-optimization
476
+ - **[PinePaper Reference](docs/CLAUDE_Pinepaper_v1_beta.md)** - Complete PinePaper Studio API reference
369
477
 
370
- ## API Documentation
478
+ ### External Documentation
371
479
 
372
- Full API documentation available at:
373
480
  - [PinePaper API Docs](https://pinepaper.studio/docs/api)
374
481
  - [MCP Tools Specification](https://pinepaper.studio/docs/mcp)
375
482
 
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Asset Manager
3
+ *
4
+ * Coordinates asset searching, downloading, and caching across multiple repositories.
5
+ */
6
+ import { AssetRepository, AssetResult, AssetMetadata, AssetCacheEntry } from './types.js';
7
+ /**
8
+ * Asset Manager configuration
9
+ */
10
+ export interface AssetManagerConfig {
11
+ /** Cache directory (default: .pinepaper-cache/assets) */
12
+ cacheDir?: string;
13
+ /** Enable caching (default: true) */
14
+ enableCache?: boolean;
15
+ /** Maximum cache size in MB (default: 100) */
16
+ maxCacheSizeMB?: number;
17
+ /** Repositories to enable (default: all) */
18
+ repositories?: ('svgrepo' | 'openclipart' | 'iconify' | 'fontawesome')[];
19
+ }
20
+ /**
21
+ * Asset Manager
22
+ *
23
+ * Provides unified interface for searching and downloading assets from multiple repositories.
24
+ */
25
+ export declare class AssetManager {
26
+ private repositories;
27
+ private cache;
28
+ private config;
29
+ constructor(config?: AssetManagerConfig);
30
+ /**
31
+ * Register an asset repository
32
+ */
33
+ registerRepository(repository: AssetRepository): void;
34
+ /**
35
+ * Search for assets across repositories
36
+ *
37
+ * @param query Search term
38
+ * @param repository Specific repository to search (or 'all' for all repositories)
39
+ * @param limit Maximum results per repository
40
+ */
41
+ search(query: string, repository?: string, limit?: number): Promise<AssetResult[]>;
42
+ /**
43
+ * Download asset SVG content
44
+ *
45
+ * @param assetId Asset ID from search results
46
+ */
47
+ download(assetId: string): Promise<{
48
+ svg: string;
49
+ metadata: AssetMetadata;
50
+ }>;
51
+ /**
52
+ * Get asset from cache
53
+ */
54
+ getCached(assetId: string): AssetCacheEntry | null;
55
+ /**
56
+ * Clear cache
57
+ */
58
+ clearCache(): void;
59
+ /**
60
+ * Get cache statistics
61
+ */
62
+ getCacheStats(): {
63
+ size: number;
64
+ keys: string[];
65
+ };
66
+ }
67
+ /**
68
+ * Get or create the global asset manager instance
69
+ */
70
+ export declare function getAssetManager(config?: AssetManagerConfig): AssetManager;
71
+ /**
72
+ * Reset the global asset manager (mainly for testing)
73
+ */
74
+ export declare function resetAssetManager(): void;
75
+ //# sourceMappingURL=asset-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-manager.d.ts","sourceRoot":"","sources":["../../src/assets/asset-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAM1F;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,qCAAqC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,CAAC,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC;CAC1E;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,GAAE,kBAAuB;IAuB3C;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAIrD;;;;;;OAMG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,MAAc,EAC1B,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC;IA8BzB;;;;OAIG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,aAAa,CAAA;KAAE,CAAC;IAqClF;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAIlD;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,aAAa,IAAI;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB;CAMF;AAKD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAKzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Asset Manager
3
+ *
4
+ * Coordinates asset searching, downloading, and caching across multiple repositories.
5
+ */
6
+ import { createSVGRepoAdapter } from './repositories/svgrepo.js';
7
+ import { createOpenClipartAdapter } from './repositories/openclipart.js';
8
+ import { createIconifyAdapter } from './repositories/iconify.js';
9
+ import { createFontAwesomeAdapter } from './repositories/fontawesome.js';
10
+ /**
11
+ * Asset Manager
12
+ *
13
+ * Provides unified interface for searching and downloading assets from multiple repositories.
14
+ */
15
+ export class AssetManager {
16
+ repositories = new Map();
17
+ cache = new Map();
18
+ config;
19
+ constructor(config = {}) {
20
+ this.config = {
21
+ cacheDir: config.cacheDir || '.pinepaper-cache/assets',
22
+ enableCache: config.enableCache ?? true,
23
+ maxCacheSizeMB: config.maxCacheSizeMB || 100,
24
+ repositories: config.repositories || ['svgrepo', 'openclipart', 'iconify', 'fontawesome'],
25
+ };
26
+ // Register default repositories based on config
27
+ if (this.config.repositories?.includes('svgrepo')) {
28
+ this.registerRepository(createSVGRepoAdapter());
29
+ }
30
+ if (this.config.repositories?.includes('openclipart')) {
31
+ this.registerRepository(createOpenClipartAdapter());
32
+ }
33
+ if (this.config.repositories?.includes('iconify')) {
34
+ this.registerRepository(createIconifyAdapter());
35
+ }
36
+ if (this.config.repositories?.includes('fontawesome')) {
37
+ this.registerRepository(createFontAwesomeAdapter());
38
+ }
39
+ }
40
+ /**
41
+ * Register an asset repository
42
+ */
43
+ registerRepository(repository) {
44
+ this.repositories.set(repository.name, repository);
45
+ }
46
+ /**
47
+ * Search for assets across repositories
48
+ *
49
+ * @param query Search term
50
+ * @param repository Specific repository to search (or 'all' for all repositories)
51
+ * @param limit Maximum results per repository
52
+ */
53
+ async search(query, repository = 'all', limit = 10) {
54
+ const results = [];
55
+ if (repository === 'all') {
56
+ // Search all repositories
57
+ for (const [_, repo] of this.repositories) {
58
+ try {
59
+ const repoResults = await repo.search(query, limit);
60
+ results.push(...repoResults);
61
+ }
62
+ catch (error) {
63
+ console.error(`[AssetManager] Error searching ${repo.name}:`, error);
64
+ // Continue with other repositories
65
+ }
66
+ }
67
+ }
68
+ else {
69
+ // Search specific repository
70
+ const repo = this.repositories.get(repository);
71
+ if (!repo) {
72
+ throw new Error(`Repository '${repository}' not found`);
73
+ }
74
+ const repoResults = await repo.search(query, limit);
75
+ results.push(...repoResults);
76
+ }
77
+ // Sort by relevance (for now, just return as-is)
78
+ // In production, implement relevance scoring
79
+ return results.slice(0, limit);
80
+ }
81
+ /**
82
+ * Download asset SVG content
83
+ *
84
+ * @param assetId Asset ID from search results
85
+ */
86
+ async download(assetId) {
87
+ // Check cache first
88
+ if (this.config.enableCache) {
89
+ const cached = this.cache.get(assetId);
90
+ if (cached) {
91
+ return {
92
+ svg: cached.svg,
93
+ metadata: cached.metadata,
94
+ };
95
+ }
96
+ }
97
+ // Extract repository from asset ID (format: "repository_id")
98
+ const parts = assetId.split('_');
99
+ const repositoryName = parts[0];
100
+ const repository = this.repositories.get(repositoryName);
101
+ if (!repository) {
102
+ throw new Error(`Repository '${repositoryName}' not found in asset ID: ${assetId}`);
103
+ }
104
+ // Download asset
105
+ const svg = await repository.download(assetId);
106
+ const metadata = await repository.getMetadata(assetId);
107
+ // Cache the result
108
+ if (this.config.enableCache) {
109
+ this.cache.set(assetId, {
110
+ svg,
111
+ metadata,
112
+ cachedAt: Date.now(),
113
+ });
114
+ }
115
+ return { svg, metadata };
116
+ }
117
+ /**
118
+ * Get asset from cache
119
+ */
120
+ getCached(assetId) {
121
+ return this.cache.get(assetId) || null;
122
+ }
123
+ /**
124
+ * Clear cache
125
+ */
126
+ clearCache() {
127
+ this.cache.clear();
128
+ }
129
+ /**
130
+ * Get cache statistics
131
+ */
132
+ getCacheStats() {
133
+ return {
134
+ size: this.cache.size,
135
+ keys: Array.from(this.cache.keys()),
136
+ };
137
+ }
138
+ }
139
+ // Global singleton instance
140
+ let globalAssetManager = null;
141
+ /**
142
+ * Get or create the global asset manager instance
143
+ */
144
+ export function getAssetManager(config) {
145
+ if (!globalAssetManager) {
146
+ globalAssetManager = new AssetManager(config);
147
+ }
148
+ return globalAssetManager;
149
+ }
150
+ /**
151
+ * Reset the global asset manager (mainly for testing)
152
+ */
153
+ export function resetAssetManager() {
154
+ globalAssetManager = null;
155
+ }
156
+ //# sourceMappingURL=asset-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-manager.js","sourceRoot":"","sources":["../../src/assets/asset-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Assets Module
3
+ *
4
+ * Asset fetching from open SVG repositories (SVGRepo, OpenClipart, Iconify, FontAwesome)
5
+ */
6
+ export * from './types.js';
7
+ export * from './asset-manager.js';
8
+ export * from './repositories/svgrepo.js';
9
+ export * from './repositories/openclipart.js';
10
+ export * from './repositories/iconify.js';
11
+ export * from './repositories/fontawesome.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assets/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Assets Module
3
+ *
4
+ * Asset fetching from open SVG repositories (SVGRepo, OpenClipart, Iconify, FontAwesome)
5
+ */
6
+ export * from './types.js';
7
+ export * from './asset-manager.js';
8
+ export * from './repositories/svgrepo.js';
9
+ export * from './repositories/openclipart.js';
10
+ export * from './repositories/iconify.js';
11
+ export * from './repositories/fontawesome.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assets/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Font Awesome Asset Repository Adapter
3
+ *
4
+ * Fetches free SVG icons from Font Awesome
5
+ * Repository info: 2,000+ free icons (CC BY 4.0 license)
6
+ */
7
+ import { AssetRepository, AssetResult, AssetMetadata } from '../types.js';
8
+ /**
9
+ * Font Awesome adapter
10
+ *
11
+ * Provides access to Font Awesome free icons
12
+ * Note: This uses the CDN for SVG delivery since Font Awesome doesn't have a public search API
13
+ */
14
+ export declare class FontAwesomeAdapter implements AssetRepository {
15
+ name: string;
16
+ private cdnBase;
17
+ /**
18
+ * Font Awesome Free icon categories and common icons
19
+ * Since FA doesn't have a public search API, we maintain a curated list
20
+ */
21
+ private iconDatabase;
22
+ /**
23
+ * Search for icons
24
+ */
25
+ search(query: string, limit: number): Promise<AssetResult[]>;
26
+ /**
27
+ * Create asset result for an icon
28
+ */
29
+ private createResult;
30
+ /**
31
+ * Download SVG content
32
+ */
33
+ download(assetId: string): Promise<string>;
34
+ /**
35
+ * Get asset metadata
36
+ */
37
+ getMetadata(assetId: string): Promise<AssetMetadata>;
38
+ }
39
+ /**
40
+ * Create Font Awesome adapter instance
41
+ */
42
+ export declare function createFontAwesomeAdapter(): AssetRepository;
43
+ //# sourceMappingURL=fontawesome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontawesome.d.ts","sourceRoot":"","sources":["../../../src/assets/repositories/fontawesome.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAkBxF;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,eAAe;IACxD,IAAI,SAAiB;IAErB,OAAO,CAAC,OAAO,CAAoE;IAEnF;;;OAGG;IACH,OAAO,CAAC,YAAY,CAgClB;IAEF;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA6BlE;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmChD;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAe3D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,eAAe,CAE1D"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Font Awesome Asset Repository Adapter
3
+ *
4
+ * Fetches free SVG icons from Font Awesome
5
+ * Repository info: 2,000+ free icons (CC BY 4.0 license)
6
+ */
7
+ /**
8
+ * Font Awesome adapter
9
+ *
10
+ * Provides access to Font Awesome free icons
11
+ * Note: This uses the CDN for SVG delivery since Font Awesome doesn't have a public search API
12
+ */
13
+ export class FontAwesomeAdapter {
14
+ name = 'fontawesome';
15
+ cdnBase = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/svgs';
16
+ /**
17
+ * Font Awesome Free icon categories and common icons
18
+ * Since FA doesn't have a public search API, we maintain a curated list
19
+ */
20
+ iconDatabase = {
21
+ 'user': ['user', 'user-circle', 'user-plus', 'user-minus', 'user-check', 'users'],
22
+ 'arrow': ['arrow-up', 'arrow-down', 'arrow-left', 'arrow-right', 'arrows'],
23
+ 'heart': ['heart', 'heart-circle-check', 'heart-pulse'],
24
+ 'star': ['star', 'star-half'],
25
+ 'home': ['home', 'house'],
26
+ 'search': ['search', 'magnifying-glass'],
27
+ 'settings': ['gear', 'cog', 'sliders'],
28
+ 'mail': ['envelope', 'envelope-open', 'at'],
29
+ 'phone': ['phone', 'mobile'],
30
+ 'calendar': ['calendar', 'calendar-days'],
31
+ 'clock': ['clock', 'hourglass'],
32
+ 'check': ['check', 'check-circle', 'circle-check'],
33
+ 'cross': ['xmark', 'times', 'circle-xmark'],
34
+ 'plus': ['plus', 'circle-plus'],
35
+ 'minus': ['minus', 'circle-minus'],
36
+ 'trash': ['trash', 'trash-can'],
37
+ 'edit': ['pen', 'pencil', 'pen-to-square'],
38
+ 'file': ['file', 'file-lines', 'folder'],
39
+ 'image': ['image', 'images', 'photo'],
40
+ 'music': ['music', 'volume-high'],
41
+ 'video': ['video', 'film'],
42
+ 'download': ['download', 'cloud-arrow-down'],
43
+ 'upload': ['upload', 'cloud-arrow-up'],
44
+ 'link': ['link', 'chain'],
45
+ 'lock': ['lock', 'unlock'],
46
+ 'eye': ['eye', 'eye-slash'],
47
+ 'location': ['location-dot', 'map-marker', 'map'],
48
+ 'comment': ['comment', 'comments', 'message'],
49
+ 'share': ['share', 'share-nodes'],
50
+ 'print': ['print'],
51
+ 'save': ['floppy-disk', 'save'],
52
+ };
53
+ /**
54
+ * Search for icons
55
+ */
56
+ async search(query, limit) {
57
+ const results = [];
58
+ const lowerQuery = query.toLowerCase();
59
+ // Search through our icon database
60
+ for (const [category, icons] of Object.entries(this.iconDatabase)) {
61
+ // Match category or icon names
62
+ if (category.includes(lowerQuery)) {
63
+ // Add all icons from matching category
64
+ for (const iconName of icons) {
65
+ if (results.length >= limit)
66
+ break;
67
+ results.push(this.createResult(iconName, 'solid'));
68
+ }
69
+ }
70
+ else {
71
+ // Search individual icon names
72
+ for (const iconName of icons) {
73
+ if (results.length >= limit)
74
+ break;
75
+ if (iconName.includes(lowerQuery)) {
76
+ results.push(this.createResult(iconName, 'solid'));
77
+ }
78
+ }
79
+ }
80
+ if (results.length >= limit)
81
+ break;
82
+ }
83
+ return results;
84
+ }
85
+ /**
86
+ * Create asset result for an icon
87
+ */
88
+ createResult(iconName, style) {
89
+ return {
90
+ id: `fontawesome_${style}_${iconName}`,
91
+ repository: 'fontawesome',
92
+ title: iconName.replace(/-/g, ' '),
93
+ description: `Font Awesome ${style} ${iconName} icon`,
94
+ previewUrl: `${this.cdnBase}/${style}/${iconName}.svg`,
95
+ downloadUrl: `${this.cdnBase}/${style}/${iconName}.svg`,
96
+ license: {
97
+ type: 'CC-BY-4.0',
98
+ name: 'Creative Commons Attribution 4.0',
99
+ requiresAttribution: true,
100
+ allowsCommercial: true,
101
+ url: 'https://fontawesome.com/license/free',
102
+ },
103
+ tags: [iconName, style],
104
+ };
105
+ }
106
+ /**
107
+ * Download SVG content
108
+ */
109
+ async download(assetId) {
110
+ try {
111
+ // Parse asset ID: fontawesome_solid_icon-name
112
+ const match = assetId.match(/fontawesome_([^_]+)_(.+)/);
113
+ if (!match) {
114
+ throw new Error(`Invalid FontAwesome asset ID: ${assetId}`);
115
+ }
116
+ const [, style, iconName] = match;
117
+ const svgUrl = `${this.cdnBase}/${style}/${iconName}.svg`;
118
+ const response = await fetch(svgUrl, {
119
+ headers: {
120
+ 'User-Agent': 'PinePaper-MCP-Server/1.2.2',
121
+ },
122
+ });
123
+ if (!response.ok) {
124
+ throw new Error(`Failed to download icon: ${response.status}`);
125
+ }
126
+ const svg = await response.text();
127
+ // Validate SVG
128
+ if (!svg.trim().startsWith('<svg') && !svg.includes('<svg')) {
129
+ throw new Error('Downloaded content is not valid SVG');
130
+ }
131
+ return svg;
132
+ }
133
+ catch (error) {
134
+ console.error('[FontAwesomeAdapter] Download error:', error);
135
+ throw error;
136
+ }
137
+ }
138
+ /**
139
+ * Get asset metadata
140
+ */
141
+ async getMetadata(assetId) {
142
+ return {
143
+ id: assetId,
144
+ repository: this.name,
145
+ title: assetId.replace('fontawesome_', '').replace(/_/g, ' '),
146
+ license: {
147
+ type: 'CC-BY-4.0',
148
+ name: 'Creative Commons Attribution 4.0',
149
+ requiresAttribution: true,
150
+ allowsCommercial: true,
151
+ url: 'https://fontawesome.com/license/free',
152
+ },
153
+ downloadedAt: Date.now(),
154
+ };
155
+ }
156
+ }
157
+ /**
158
+ * Create Font Awesome adapter instance
159
+ */
160
+ export function createFontAwesomeAdapter() {
161
+ return new FontAwesomeAdapter();
162
+ }
163
+ //# sourceMappingURL=fontawesome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontawesome.js","sourceRoot":"","sources":["../../../src/assets/repositories/fontawesome.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IAC7B,IAAI,GAAG,aAAa,CAAC;IAEb,OAAO,GAAG,gEAAgE,CAAC;IAEnF;;;OAGG;IACK,YAAY,GAA6B;QAC/C,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC;QACjF,OAAO,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC;QAC1E,OAAO,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,aAAa,CAAC;QACvD,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;QAC7B,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,EAAE,CAAC,QAAQ,EAAE,kBAAkB,CAAC;QACxC,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;QACtC,MAAM,EAAE,CAAC,UAAU,EAAE,eAAe,EAAE,IAAI,CAAC;QAC3C,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC5B,UAAU,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC;QACzC,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;QAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC;QAClD,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;QAC3C,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;QAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;QAClC,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;QAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,CAAC;QAC1C,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;QACxC,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC;QACrC,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC;QACjC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;QAC1B,UAAU,EAAE,CAAC,UAAU,EAAE,kBAAkB,CAAC;QAC5C,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC;QACtC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC1B,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;QAC3B,UAAU,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,KAAK,CAAC;QACjD,SAAS,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC;QAC7C,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC;QACjC,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;KAChC,CAAC;IAEF;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,KAAa;QACvC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEvC,mCAAmC;QACnC,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAClE,+BAA+B;YAC/B,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClC,uCAAuC;gBACvC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;oBAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;wBAAE,MAAM;oBACnC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,+BAA+B;gBAC/B,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;oBAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;wBAAE,MAAM;oBACnC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBAClC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;gBAAE,MAAM;QACrC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,QAAgB,EAAE,KAAqC;QAC1E,OAAO;YACL,EAAE,EAAE,eAAe,KAAK,IAAI,QAAQ,EAAE;YACtC,UAAU,EAAE,aAAa;YACzB,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;YAClC,WAAW,EAAE,gBAAgB,KAAK,IAAI,QAAQ,OAAO;YACrD,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,QAAQ,MAAM;YACtD,WAAW,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,QAAQ,MAAM;YACvD,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,kCAAkC;gBACxC,mBAAmB,EAAE,IAAI;gBACzB,gBAAgB,EAAE,IAAI;gBACtB,GAAG,EAAE,sCAAsC;aAC5C;YACD,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;SACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,IAAI,CAAC;YACH,8CAA8C;YAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACxD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;YAClC,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,QAAQ,MAAM,CAAC;YAE1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;gBACnC,OAAO,EAAE;oBACP,YAAY,EAAE,4BAA4B;iBAC3C;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAElC,eAAe;YACf,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,OAAO;YACL,EAAE,EAAE,OAAO;YACX,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;YAC7D,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,kCAAkC;gBACxC,mBAAmB,EAAE,IAAI;gBACzB,gBAAgB,EAAE,IAAI;gBACtB,GAAG,EAAE,sCAAsC;aAC5C;YACD,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,kBAAkB,EAAE,CAAC;AAClC,CAAC"}