@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
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
|
-
|
|
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":"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"}
|