@pinepaper.studio/mcp-server 1.4.3 → 1.5.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 +89 -0
- package/dist/__tests__/fixtures/mock-generators.d.ts +147 -0
- package/dist/__tests__/fixtures/mock-generators.d.ts.map +1 -1
- package/dist/__tests__/fixtures/mock-generators.js +85 -0
- package/dist/__tests__/fixtures/mock-generators.js.map +1 -1
- package/dist/agent/export-manager.d.ts +77 -0
- package/dist/agent/export-manager.d.ts.map +1 -0
- package/dist/agent/export-manager.js +465 -0
- package/dist/agent/export-manager.js.map +1 -0
- package/dist/agent/index.d.ts +9 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +12 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/session-manager.d.ts +109 -0
- package/dist/agent/session-manager.d.ts.map +1 -0
- package/dist/agent/session-manager.js +311 -0
- package/dist/agent/session-manager.js.map +1 -0
- package/dist/agent/types.d.ts +385 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +141 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/browser/index.d.ts +1 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/puppeteer-controller.d.ts +89 -5
- package/dist/browser/puppeteer-controller.d.ts.map +1 -1
- package/dist/browser/puppeteer-controller.js +412 -11
- package/dist/browser/puppeteer-controller.js.map +1 -1
- package/dist/cli.js +61 -65
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2769 -150
- package/dist/index.js.map +1 -1
- package/dist/metrics/types.d.ts +3 -1
- package/dist/metrics/types.d.ts.map +1 -1
- package/dist/prompts/index.d.ts +30 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +163 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/tools/compact-descriptions.d.ts +9 -0
- package/dist/tools/compact-descriptions.d.ts.map +1 -0
- package/dist/tools/compact-descriptions.js +291 -0
- package/dist/tools/compact-descriptions.js.map +1 -0
- package/dist/tools/definitions.d.ts +14 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +4954 -1552
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +1302 -19
- package/dist/tools/handlers.js.map +1 -1
- package/dist/tools/index.d.ts +4 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/minimal-descriptions.d.ts +9 -0
- package/dist/tools/minimal-descriptions.d.ts.map +1 -0
- package/dist/tools/minimal-descriptions.js +158 -0
- package/dist/tools/minimal-descriptions.js.map +1 -0
- package/dist/tools/toolkits.d.ts +51 -0
- package/dist/tools/toolkits.d.ts.map +1 -0
- package/dist/tools/toolkits.js +336 -0
- package/dist/tools/toolkits.js.map +1 -0
- package/dist/types/code-generator.d.ts +193 -1
- package/dist/types/code-generator.d.ts.map +1 -1
- package/dist/types/code-generator.js +2167 -26
- package/dist/types/code-generator.js.map +1 -1
- package/dist/types/schemas.d.ts +5278 -1141
- package/dist/types/schemas.d.ts.map +1 -1
- package/dist/types/schemas.js +863 -5
- package/dist/types/schemas.js.map +1 -1
- package/manifest.json +94 -2
- package/package.json +1 -1
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PinePaper Smart Export Manager
|
|
3
|
+
*
|
|
4
|
+
* Provides intelligent export recommendations and platform presets.
|
|
5
|
+
* Analyzes content to suggest optimal export formats.
|
|
6
|
+
*/
|
|
7
|
+
import { PLATFORM_PRESETS, } from './types.js';
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// EXPORT MANAGER CLASS
|
|
10
|
+
// =============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Manages smart exports with content analysis and platform presets.
|
|
13
|
+
*
|
|
14
|
+
* Features:
|
|
15
|
+
* - Content analysis (animations, colors, complexity)
|
|
16
|
+
* - Platform preset management
|
|
17
|
+
* - Optimal format recommendations
|
|
18
|
+
* - Export code generation
|
|
19
|
+
*/
|
|
20
|
+
export class SmartExportManager {
|
|
21
|
+
/**
|
|
22
|
+
* Get platform preset configuration
|
|
23
|
+
*/
|
|
24
|
+
getPreset(platform) {
|
|
25
|
+
return PLATFORM_PRESETS[platform];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* List all available platforms
|
|
29
|
+
*/
|
|
30
|
+
listPlatforms() {
|
|
31
|
+
return Object.keys(PLATFORM_PRESETS);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generate code to analyze canvas content
|
|
35
|
+
*/
|
|
36
|
+
generateAnalysisCode() {
|
|
37
|
+
return `
|
|
38
|
+
(function() {
|
|
39
|
+
const analysis = {
|
|
40
|
+
hasAnimations: false,
|
|
41
|
+
animationTypes: [],
|
|
42
|
+
colorComplexity: 'simple',
|
|
43
|
+
itemCount: 0,
|
|
44
|
+
canvasSize: { width: 0, height: 0 },
|
|
45
|
+
hasRelations: false,
|
|
46
|
+
relationTypes: [],
|
|
47
|
+
hasGradients: false,
|
|
48
|
+
hasShadows: false,
|
|
49
|
+
hasText: false,
|
|
50
|
+
hasImages: false,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// Get canvas size
|
|
54
|
+
if (app.canvasEl) {
|
|
55
|
+
analysis.canvasSize = {
|
|
56
|
+
width: app.canvasEl.width,
|
|
57
|
+
height: app.canvasEl.height
|
|
58
|
+
};
|
|
59
|
+
} else if (paper.view) {
|
|
60
|
+
analysis.canvasSize = {
|
|
61
|
+
width: paper.view.size.width,
|
|
62
|
+
height: paper.view.size.height
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Count items and analyze types
|
|
67
|
+
const items = app.itemRegistry ? app.itemRegistry.getAll() : [];
|
|
68
|
+
analysis.itemCount = items.length;
|
|
69
|
+
|
|
70
|
+
const animationSet = new Set();
|
|
71
|
+
const relationSet = new Set();
|
|
72
|
+
let hasGradient = false;
|
|
73
|
+
let hasShadow = false;
|
|
74
|
+
|
|
75
|
+
items.forEach(entry => {
|
|
76
|
+
const item = entry.item;
|
|
77
|
+
const data = item.data || {};
|
|
78
|
+
|
|
79
|
+
// Check for text
|
|
80
|
+
if (entry.type === 'text' || item.className === 'PointText') {
|
|
81
|
+
analysis.hasText = true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Check for images (raster items)
|
|
85
|
+
if (item.className === 'Raster') {
|
|
86
|
+
analysis.hasImages = true;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Check for animations
|
|
90
|
+
if (data.animationType) {
|
|
91
|
+
analysis.hasAnimations = true;
|
|
92
|
+
animationSet.add(data.animationType);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Check for gradients
|
|
96
|
+
if (item.fillColor && item.fillColor.gradient) {
|
|
97
|
+
hasGradient = true;
|
|
98
|
+
}
|
|
99
|
+
if (item.strokeColor && item.strokeColor.gradient) {
|
|
100
|
+
hasGradient = true;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Check for shadows
|
|
104
|
+
if (item.shadowColor || item.shadowBlur) {
|
|
105
|
+
hasShadow = true;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
analysis.animationTypes = Array.from(animationSet);
|
|
110
|
+
analysis.hasGradients = hasGradient;
|
|
111
|
+
analysis.hasShadows = hasShadow;
|
|
112
|
+
|
|
113
|
+
// Check for relations
|
|
114
|
+
if (app.relationRegistry) {
|
|
115
|
+
const relations = app.relationRegistry.getAll ? app.relationRegistry.getAll() : [];
|
|
116
|
+
analysis.hasRelations = relations.length > 0;
|
|
117
|
+
relations.forEach(rel => {
|
|
118
|
+
if (rel.relationType) {
|
|
119
|
+
relationSet.add(rel.relationType);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
analysis.relationTypes = Array.from(relationSet);
|
|
123
|
+
|
|
124
|
+
// Relations imply animations
|
|
125
|
+
if (analysis.hasRelations) {
|
|
126
|
+
analysis.hasAnimations = true;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Determine color complexity
|
|
131
|
+
if (hasGradient) {
|
|
132
|
+
analysis.colorComplexity = 'gradient';
|
|
133
|
+
} else if (analysis.itemCount > 20 || hasShadow) {
|
|
134
|
+
analysis.colorComplexity = 'complex';
|
|
135
|
+
} else {
|
|
136
|
+
analysis.colorComplexity = 'simple';
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return analysis;
|
|
140
|
+
})();
|
|
141
|
+
`.trim();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Recommend export format based on content analysis
|
|
145
|
+
*/
|
|
146
|
+
recommendFormat(analysis) {
|
|
147
|
+
const recommendations = [];
|
|
148
|
+
// Primary recommendation logic
|
|
149
|
+
if (analysis.hasAnimations) {
|
|
150
|
+
// Animated content
|
|
151
|
+
if (analysis.hasGradients || analysis.colorComplexity === 'complex') {
|
|
152
|
+
// Complex animations → WebM/MP4 for best quality
|
|
153
|
+
recommendations.push({
|
|
154
|
+
platform: 'web',
|
|
155
|
+
format: 'webm',
|
|
156
|
+
confidence: 0.9,
|
|
157
|
+
reason: 'Animated content with gradients renders best as WebM video',
|
|
158
|
+
warnings: analysis.hasImages ? ['Images may increase file size'] : undefined,
|
|
159
|
+
});
|
|
160
|
+
recommendations.push({
|
|
161
|
+
platform: 'instagram',
|
|
162
|
+
format: 'mp4',
|
|
163
|
+
confidence: 0.85,
|
|
164
|
+
reason: 'MP4 for social media compatibility with complex animations',
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Simple animations → SVG for web, GIF for social
|
|
169
|
+
recommendations.push({
|
|
170
|
+
platform: 'web',
|
|
171
|
+
format: 'svg',
|
|
172
|
+
confidence: 0.95,
|
|
173
|
+
reason: 'Simple animations export well as animated SVG',
|
|
174
|
+
});
|
|
175
|
+
recommendations.push({
|
|
176
|
+
platform: 'twitter',
|
|
177
|
+
format: 'gif',
|
|
178
|
+
confidence: 0.8,
|
|
179
|
+
reason: 'GIF for social media with simple animations',
|
|
180
|
+
warnings: ['GIF limited to 256 colors'],
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// Static content
|
|
186
|
+
if (analysis.colorComplexity === 'simple' && !analysis.hasImages) {
|
|
187
|
+
recommendations.push({
|
|
188
|
+
platform: 'web',
|
|
189
|
+
format: 'svg',
|
|
190
|
+
confidence: 0.95,
|
|
191
|
+
reason: 'Vector graphics best as SVG for scalability',
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
recommendations.push({
|
|
196
|
+
platform: 'instagram',
|
|
197
|
+
format: 'png',
|
|
198
|
+
confidence: 0.9,
|
|
199
|
+
reason: 'High quality static export as PNG',
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Add print recommendation if applicable
|
|
204
|
+
if (!analysis.hasAnimations && analysis.canvasSize.width > 1000) {
|
|
205
|
+
recommendations.push({
|
|
206
|
+
platform: 'print-a4',
|
|
207
|
+
format: 'pdf',
|
|
208
|
+
confidence: 0.7,
|
|
209
|
+
reason: 'High resolution suitable for print',
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
return recommendations;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Recommend platforms based on content analysis
|
|
216
|
+
*/
|
|
217
|
+
recommendPlatforms(analysis) {
|
|
218
|
+
const platforms = [];
|
|
219
|
+
const { width, height } = analysis.canvasSize;
|
|
220
|
+
const aspectRatio = width / height;
|
|
221
|
+
// Square content
|
|
222
|
+
if (Math.abs(aspectRatio - 1) < 0.1) {
|
|
223
|
+
platforms.push('instagram');
|
|
224
|
+
}
|
|
225
|
+
// Vertical content (9:16)
|
|
226
|
+
if (aspectRatio < 0.7) {
|
|
227
|
+
platforms.push('instagram-story', 'tiktok');
|
|
228
|
+
}
|
|
229
|
+
// Horizontal content (16:9)
|
|
230
|
+
if (aspectRatio > 1.5) {
|
|
231
|
+
platforms.push('youtube', 'youtube-thumbnail', 'twitter', 'linkedin');
|
|
232
|
+
}
|
|
233
|
+
// Web is always an option
|
|
234
|
+
platforms.push('web');
|
|
235
|
+
return platforms;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get optimal format for a specific platform based on content
|
|
239
|
+
*/
|
|
240
|
+
getOptimalFormat(platform, analysis) {
|
|
241
|
+
const preset = PLATFORM_PRESETS[platform];
|
|
242
|
+
if (analysis.hasAnimations) {
|
|
243
|
+
return preset.formats.animated;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
return preset.formats.static;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Generate export code for a specific platform
|
|
251
|
+
*/
|
|
252
|
+
generateExportCode(platform, format, options = {}) {
|
|
253
|
+
const preset = PLATFORM_PRESETS[platform];
|
|
254
|
+
const quality = options.quality || 'standard';
|
|
255
|
+
// Get quality settings
|
|
256
|
+
const qualitySettings = {
|
|
257
|
+
draft: { compression: 0.6, fps: 15, dpi: 72 },
|
|
258
|
+
standard: { compression: 0.85, fps: 30, dpi: 150 },
|
|
259
|
+
high: { compression: 0.95, fps: 60, dpi: 300 },
|
|
260
|
+
}[quality];
|
|
261
|
+
switch (format) {
|
|
262
|
+
case 'svg':
|
|
263
|
+
return this.generateSVGExportCode();
|
|
264
|
+
case 'png':
|
|
265
|
+
return this.generatePNGExportCode(qualitySettings.dpi);
|
|
266
|
+
case 'gif':
|
|
267
|
+
return this.generateGIFExportCode(qualitySettings.fps, qualitySettings.compression);
|
|
268
|
+
case 'mp4':
|
|
269
|
+
case 'webm':
|
|
270
|
+
return this.generateVideoExportCode(format, qualitySettings.fps, preset.dimensions);
|
|
271
|
+
case 'pdf':
|
|
272
|
+
return this.generatePDFExportCode(qualitySettings.dpi);
|
|
273
|
+
default:
|
|
274
|
+
return this.generateSVGExportCode();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Generate SVG export code
|
|
279
|
+
*/
|
|
280
|
+
generateSVGExportCode() {
|
|
281
|
+
return `
|
|
282
|
+
(async function() {
|
|
283
|
+
const svgString = app.exportAnimatedSVG();
|
|
284
|
+
const hasAnimations = svgString.includes('<animate') || svgString.includes('@keyframes');
|
|
285
|
+
|
|
286
|
+
return {
|
|
287
|
+
success: true,
|
|
288
|
+
format: 'svg',
|
|
289
|
+
data: svgString,
|
|
290
|
+
mimeType: 'image/svg+xml',
|
|
291
|
+
size: new Blob([svgString]).size,
|
|
292
|
+
hasAnimations
|
|
293
|
+
};
|
|
294
|
+
})();
|
|
295
|
+
`.trim();
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Generate PNG export code
|
|
299
|
+
*/
|
|
300
|
+
generatePNGExportCode(dpi) {
|
|
301
|
+
return `
|
|
302
|
+
(async function() {
|
|
303
|
+
// Use exportPrintPNG if available for high DPI
|
|
304
|
+
if (app.exportPrintPNG && ${dpi} >= 150) {
|
|
305
|
+
const dataUrl = await app.exportPrintPNG(${dpi});
|
|
306
|
+
return {
|
|
307
|
+
success: true,
|
|
308
|
+
format: 'png',
|
|
309
|
+
data: dataUrl,
|
|
310
|
+
mimeType: 'image/png',
|
|
311
|
+
dpi: ${dpi}
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Fallback to canvas export
|
|
316
|
+
const canvas = document.querySelector('canvas');
|
|
317
|
+
const dataUrl = canvas.toDataURL('image/png');
|
|
318
|
+
return {
|
|
319
|
+
success: true,
|
|
320
|
+
format: 'png',
|
|
321
|
+
data: dataUrl,
|
|
322
|
+
mimeType: 'image/png',
|
|
323
|
+
size: Math.round(dataUrl.length * 0.75)
|
|
324
|
+
};
|
|
325
|
+
})();
|
|
326
|
+
`.trim();
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Generate GIF export code
|
|
330
|
+
*/
|
|
331
|
+
generateGIFExportCode(fps, quality) {
|
|
332
|
+
return `
|
|
333
|
+
(async function() {
|
|
334
|
+
if (!app.exportEngine) {
|
|
335
|
+
return { success: false, error: 'GIF export not available' };
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
let blob;
|
|
339
|
+
if (app.exportEngine._quickExportVideo) {
|
|
340
|
+
const result = await app.exportEngine._quickExportVideo('gif', { fps: ${fps}, duration: 5 }, false);
|
|
341
|
+
blob = result && result.blob ? result.blob : null;
|
|
342
|
+
} else if (app.exportEngine.videoExporter) {
|
|
343
|
+
blob = await app.exportEngine.videoExporter.export({ format: 'gif', fps: ${fps}, duration: 5 });
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (!blob) {
|
|
347
|
+
return { success: false, error: 'GIF export returned no data' };
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
return new Promise((resolve) => {
|
|
351
|
+
const reader = new FileReader();
|
|
352
|
+
reader.onloadend = () => {
|
|
353
|
+
resolve({
|
|
354
|
+
success: true,
|
|
355
|
+
format: 'gif',
|
|
356
|
+
data: reader.result,
|
|
357
|
+
mimeType: 'image/gif',
|
|
358
|
+
size: blob.size
|
|
359
|
+
});
|
|
360
|
+
};
|
|
361
|
+
reader.readAsDataURL(blob);
|
|
362
|
+
});
|
|
363
|
+
})();
|
|
364
|
+
`.trim();
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Generate video export code (MP4/WebM)
|
|
368
|
+
*/
|
|
369
|
+
generateVideoExportCode(format, fps, dimensions) {
|
|
370
|
+
const mimeType = format === 'mp4' ? 'video/mp4' : 'video/webm';
|
|
371
|
+
return `
|
|
372
|
+
(async function() {
|
|
373
|
+
if (!app.exportEngine) {
|
|
374
|
+
return { success: false, error: '${format.toUpperCase()} export not available' };
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
let blob;
|
|
378
|
+
if (app.exportEngine._quickExportVideo) {
|
|
379
|
+
const result = await app.exportEngine._quickExportVideo('${format}', { fps: ${fps}, duration: 5 }, false);
|
|
380
|
+
blob = result && result.blob ? result.blob : null;
|
|
381
|
+
} else if (app.exportEngine.videoExporter) {
|
|
382
|
+
blob = await app.exportEngine.videoExporter.export({ format: '${format}', fps: ${fps}, duration: 5 });
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
if (!blob) {
|
|
386
|
+
return { success: false, error: '${format.toUpperCase()} export returned no data' };
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
return new Promise((resolve) => {
|
|
390
|
+
const reader = new FileReader();
|
|
391
|
+
reader.onloadend = () => {
|
|
392
|
+
resolve({
|
|
393
|
+
success: true,
|
|
394
|
+
format: '${format}',
|
|
395
|
+
data: reader.result,
|
|
396
|
+
mimeType: '${mimeType}',
|
|
397
|
+
size: blob.size
|
|
398
|
+
});
|
|
399
|
+
};
|
|
400
|
+
reader.readAsDataURL(blob);
|
|
401
|
+
});
|
|
402
|
+
})();
|
|
403
|
+
`.trim();
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Generate PDF export code
|
|
407
|
+
*/
|
|
408
|
+
generatePDFExportCode(dpi) {
|
|
409
|
+
return `
|
|
410
|
+
(async function() {
|
|
411
|
+
if (!app.exportEngine || !app.exportEngine.exportPDF) {
|
|
412
|
+
return { success: false, error: 'PDF export not available' };
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
const blob = await app.exportEngine.exportPDF({
|
|
416
|
+
dpi: ${dpi},
|
|
417
|
+
includeBleed: false
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
return new Promise((resolve) => {
|
|
421
|
+
const reader = new FileReader();
|
|
422
|
+
reader.onloadend = () => {
|
|
423
|
+
resolve({
|
|
424
|
+
success: true,
|
|
425
|
+
format: 'pdf',
|
|
426
|
+
data: reader.result,
|
|
427
|
+
mimeType: 'application/pdf',
|
|
428
|
+
size: blob.size,
|
|
429
|
+
dpi: ${dpi}
|
|
430
|
+
});
|
|
431
|
+
};
|
|
432
|
+
reader.readAsDataURL(blob);
|
|
433
|
+
});
|
|
434
|
+
})();
|
|
435
|
+
`.trim();
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Generate code to set canvas size from preset
|
|
439
|
+
*/
|
|
440
|
+
generateSetCanvasSizeCode(platform) {
|
|
441
|
+
const preset = PLATFORM_PRESETS[platform];
|
|
442
|
+
return `
|
|
443
|
+
// Set canvas size for ${platform}
|
|
444
|
+
app.setCanvasSize({
|
|
445
|
+
width: ${preset.dimensions.width},
|
|
446
|
+
height: ${preset.dimensions.height}
|
|
447
|
+
});
|
|
448
|
+
({ success: true, platform: '${platform}', dimensions: ${JSON.stringify(preset.dimensions)} });
|
|
449
|
+
`.trim();
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
// =============================================================================
|
|
453
|
+
// SINGLETON INSTANCE
|
|
454
|
+
// =============================================================================
|
|
455
|
+
let exportManagerInstance = null;
|
|
456
|
+
/**
|
|
457
|
+
* Get the singleton export manager instance
|
|
458
|
+
*/
|
|
459
|
+
export function getExportManager() {
|
|
460
|
+
if (!exportManagerInstance) {
|
|
461
|
+
exportManagerInstance = new SmartExportManager();
|
|
462
|
+
}
|
|
463
|
+
return exportManagerInstance;
|
|
464
|
+
}
|
|
465
|
+
//# sourceMappingURL=export-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-manager.js","sourceRoot":"","sources":["../../src/agent/export-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PinePaper Agent Flow Mode Module
|
|
3
|
+
*
|
|
4
|
+
* Provides optimized workflows for AI agent content automation pipelines.
|
|
5
|
+
*/
|
|
6
|
+
export * from './types.js';
|
|
7
|
+
export { AgentSessionManager, getSessionManager, resetSessionManager } from './session-manager.js';
|
|
8
|
+
export { SmartExportManager, getExportManager } from './export-manager.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGnG,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PinePaper Agent Flow Mode Module
|
|
3
|
+
*
|
|
4
|
+
* Provides optimized workflows for AI agent content automation pipelines.
|
|
5
|
+
*/
|
|
6
|
+
// Export types
|
|
7
|
+
export * from './types.js';
|
|
8
|
+
// Export session manager
|
|
9
|
+
export { AgentSessionManager, getSessionManager, resetSessionManager } from './session-manager.js';
|
|
10
|
+
// Export export manager
|
|
11
|
+
export { SmartExportManager, getExportManager } from './export-manager.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,cAAc,YAAY,CAAC;AAE3B,yBAAyB;AACzB,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEnG,wBAAwB;AACxB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PinePaper Agent Session Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages job/session lifecycle for agent workflows.
|
|
5
|
+
* Provides batch code execution, item tracking, and job state management.
|
|
6
|
+
*/
|
|
7
|
+
import type { JobContext, JobOptions, JobResult, ResetOptions, ScreenshotPolicy } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Manages agent job/session lifecycle.
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Job start/end with automatic tracking
|
|
13
|
+
* - Code queuing for batch execution
|
|
14
|
+
* - Item and relation tracking per job
|
|
15
|
+
* - Screenshot policy management
|
|
16
|
+
*/
|
|
17
|
+
export declare class AgentSessionManager {
|
|
18
|
+
private currentJob;
|
|
19
|
+
private jobHistory;
|
|
20
|
+
/**
|
|
21
|
+
* Generate a unique job ID
|
|
22
|
+
*/
|
|
23
|
+
private generateJobId;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a job is currently active
|
|
26
|
+
*/
|
|
27
|
+
hasActiveJob(): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Get the current job context
|
|
30
|
+
*/
|
|
31
|
+
getCurrentJob(): JobContext | null;
|
|
32
|
+
/**
|
|
33
|
+
* Start a new agent job
|
|
34
|
+
*/
|
|
35
|
+
startJob(options?: JobOptions): JobContext;
|
|
36
|
+
/**
|
|
37
|
+
* End the current job and return results
|
|
38
|
+
*/
|
|
39
|
+
endJob(): JobResult | null;
|
|
40
|
+
/**
|
|
41
|
+
* Queue code for batch execution
|
|
42
|
+
*/
|
|
43
|
+
queueCode(code: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Get queued code and clear the queue
|
|
46
|
+
*/
|
|
47
|
+
flushCodeQueue(): string[];
|
|
48
|
+
/**
|
|
49
|
+
* Get combined code from queue as a single script
|
|
50
|
+
*/
|
|
51
|
+
getCombinedCode(): string;
|
|
52
|
+
/**
|
|
53
|
+
* Check if there's queued code
|
|
54
|
+
*/
|
|
55
|
+
hasQueuedCode(): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Get queue size
|
|
58
|
+
*/
|
|
59
|
+
getQueueSize(): number;
|
|
60
|
+
/**
|
|
61
|
+
* Register an item created during the job
|
|
62
|
+
*/
|
|
63
|
+
registerItem(itemId: string): void;
|
|
64
|
+
/**
|
|
65
|
+
* Register a relation created during the job
|
|
66
|
+
*/
|
|
67
|
+
registerRelation(relationId: string): void;
|
|
68
|
+
/**
|
|
69
|
+
* Get screenshot policy for current job
|
|
70
|
+
*/
|
|
71
|
+
getScreenshotPolicy(): ScreenshotPolicy;
|
|
72
|
+
/**
|
|
73
|
+
* Check if screenshot should be taken based on policy and event
|
|
74
|
+
*/
|
|
75
|
+
shouldTakeScreenshot(event: 'operation' | 'error' | 'complete'): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Generate code for canvas reset
|
|
78
|
+
*/
|
|
79
|
+
generateResetCode(options?: ResetOptions): string;
|
|
80
|
+
/**
|
|
81
|
+
* Get job history
|
|
82
|
+
*/
|
|
83
|
+
getJobHistory(): JobResult[];
|
|
84
|
+
/**
|
|
85
|
+
* Clear job history
|
|
86
|
+
*/
|
|
87
|
+
clearHistory(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Get statistics about the current session
|
|
90
|
+
*/
|
|
91
|
+
getStats(): {
|
|
92
|
+
activeJob: boolean;
|
|
93
|
+
currentJobId: string | null;
|
|
94
|
+
currentJobDuration: number | null;
|
|
95
|
+
itemsInCurrentJob: number;
|
|
96
|
+
codeQueueSize: number;
|
|
97
|
+
completedJobs: number;
|
|
98
|
+
totalItemsCreated: number;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get the singleton session manager instance
|
|
103
|
+
*/
|
|
104
|
+
export declare function getSessionManager(): AgentSessionManager;
|
|
105
|
+
/**
|
|
106
|
+
* Reset the session manager (useful for testing)
|
|
107
|
+
*/
|
|
108
|
+
export declare function resetSessionManager(): void;
|
|
109
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/agent/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,SAAS,EACT,YAAY,EAKZ,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAWpB;;;;;;;;GAQG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,UAAU,CAAmB;IAErC;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,aAAa,IAAI,UAAU,GAAG,IAAI;IAIlC;;OAEG;IACH,QAAQ,CAAC,OAAO,GAAE,UAAe,GAAG,UAAU;IA4B9C;;OAEG;IACH,MAAM,IAAI,SAAS,GAAG,IAAI;IA4B1B;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS7B;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAU1B;;OAEG;IACH,eAAe,IAAI,MAAM;IAwCzB;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMlC;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAM1C;;OAEG;IACH,mBAAmB,IAAI,gBAAgB;IAIvC;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO;IAexE;;OAEG;IACH,iBAAiB,CAAC,OAAO,GAAE,YAAiB,GAAG,MAAM;IAwDrD;;OAEG;IACH,aAAa,IAAI,SAAS,EAAE;IAI5B;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,QAAQ,IAAI;QACV,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;KAC3B;CAcF;AAQD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,mBAAmB,CAKvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAQ1C"}
|