opencode-nanobanana 0.2.0 → 0.2.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/dist/index.d.ts +9 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -8
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +0 -15
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +214 -194
- package/dist/plugin.js.map +1 -1
- package/dist/providers/gemini.d.ts +11 -0
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +30 -0
- package/dist/providers/gemini.js.map +1 -1
- package/package.json +3 -3
- package/dist/platforms/android.d.ts +0 -94
- package/dist/platforms/android.d.ts.map +0 -1
- package/dist/platforms/android.js +0 -123
- package/dist/platforms/android.js.map +0 -1
- package/dist/platforms/ios.d.ts +0 -51
- package/dist/platforms/ios.d.ts.map +0 -1
- package/dist/platforms/ios.js +0 -149
- package/dist/platforms/ios.js.map +0 -1
- package/dist/platforms/macos.d.ts +0 -33
- package/dist/platforms/macos.d.ts.map +0 -1
- package/dist/platforms/macos.js +0 -50
- package/dist/platforms/macos.js.map +0 -1
- package/dist/platforms/watchos.d.ts +0 -36
- package/dist/platforms/watchos.d.ts.map +0 -1
- package/dist/platforms/watchos.js +0 -113
- package/dist/platforms/watchos.js.map +0 -1
- package/dist/platforms/web.d.ts +0 -64
- package/dist/platforms/web.d.ts.map +0 -1
- package/dist/platforms/web.js +0 -96
- package/dist/platforms/web.js.map +0 -1
- package/dist/tools/analyze/compare.d.ts +0 -12
- package/dist/tools/analyze/compare.d.ts.map +0 -1
- package/dist/tools/analyze/compare.js +0 -83
- package/dist/tools/analyze/compare.js.map +0 -1
- package/dist/tools/analyze/mockup.d.ts +0 -12
- package/dist/tools/analyze/mockup.d.ts.map +0 -1
- package/dist/tools/analyze/mockup.js +0 -88
- package/dist/tools/analyze/mockup.js.map +0 -1
- package/dist/tools/analyze/screenshot.d.ts +0 -12
- package/dist/tools/analyze/screenshot.d.ts.map +0 -1
- package/dist/tools/analyze/screenshot.js +0 -61
- package/dist/tools/analyze/screenshot.js.map +0 -1
- package/dist/tools/app-assets/app-icon.d.ts +0 -9
- package/dist/tools/app-assets/app-icon.d.ts.map +0 -1
- package/dist/tools/app-assets/app-icon.js +0 -133
- package/dist/tools/app-assets/app-icon.js.map +0 -1
- package/dist/tools/app-assets/device-mockup.d.ts +0 -9
- package/dist/tools/app-assets/device-mockup.d.ts.map +0 -1
- package/dist/tools/app-assets/device-mockup.js +0 -139
- package/dist/tools/app-assets/device-mockup.js.map +0 -1
- package/dist/tools/app-assets/launch-images.d.ts +0 -3
- package/dist/tools/app-assets/launch-images.d.ts.map +0 -1
- package/dist/tools/app-assets/launch-images.js +0 -171
- package/dist/tools/app-assets/launch-images.js.map +0 -1
- package/dist/tools/app-assets/resize-devices.d.ts +0 -14
- package/dist/tools/app-assets/resize-devices.d.ts.map +0 -1
- package/dist/tools/app-assets/resize-devices.js +0 -296
- package/dist/tools/app-assets/resize-devices.js.map +0 -1
- package/dist/tools/app-assets/screenshots.d.ts +0 -14
- package/dist/tools/app-assets/screenshots.d.ts.map +0 -1
- package/dist/tools/app-assets/screenshots.js +0 -186
- package/dist/tools/app-assets/screenshots.js.map +0 -1
- package/dist/tools/core/edit-image.d.ts +0 -12
- package/dist/tools/core/edit-image.d.ts.map +0 -1
- package/dist/tools/core/edit-image.js +0 -102
- package/dist/tools/core/edit-image.js.map +0 -1
- package/dist/tools/core/generate-image.d.ts +0 -12
- package/dist/tools/core/generate-image.d.ts.map +0 -1
- package/dist/tools/core/generate-image.js +0 -96
- package/dist/tools/core/generate-image.js.map +0 -1
- package/dist/tools/core/restore-image.d.ts +0 -12
- package/dist/tools/core/restore-image.d.ts.map +0 -1
- package/dist/tools/core/restore-image.js +0 -104
- package/dist/tools/core/restore-image.js.map +0 -1
- package/dist/tools/design/mockup-to-code.d.ts +0 -3
- package/dist/tools/design/mockup-to-code.d.ts.map +0 -1
- package/dist/tools/design/mockup-to-code.js +0 -311
- package/dist/tools/design/mockup-to-code.js.map +0 -1
- package/dist/tools/design/sketch-to-code.d.ts +0 -3
- package/dist/tools/design/sketch-to-code.d.ts.map +0 -1
- package/dist/tools/design/sketch-to-code.js +0 -325
- package/dist/tools/design/sketch-to-code.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Visual Toolkit
|
|
3
|
+
*
|
|
4
|
+
* A comprehensive plugin providing visual capabilities:
|
|
5
|
+
* - Image generation (Nano Banana)
|
|
6
|
+
* - Visual analysis
|
|
7
|
+
* - Design-to-code
|
|
8
|
+
* - App asset pipelines (iOS, Android, macOS, Web)
|
|
9
|
+
*/
|
|
9
10
|
export { default } from './plugin.js';
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Visual Toolkit
|
|
3
|
+
*
|
|
4
|
+
* A comprehensive plugin providing visual capabilities:
|
|
5
|
+
* - Image generation (Nano Banana)
|
|
6
|
+
* - Visual analysis
|
|
7
|
+
* - Design-to-code
|
|
8
|
+
* - App asset pipelines (iOS, Android, macOS, Web)
|
|
9
|
+
*/
|
|
10
|
+
// WORKAROUND for OpenCode v1.1.23 plugin loader bug:
|
|
11
|
+
// OpenCode v1.1.23's plugin loader incorrectly tries to call ALL exported
|
|
12
|
+
// functions during plugin loading, causing errors. We can only export the
|
|
13
|
+
// plugin default export until this is fixed upstream.
|
|
14
|
+
// See: https://github.com/anomalyco/opencode/issues/[ISSUE_NUMBER]
|
|
15
|
+
//
|
|
16
|
+
// Original exports (for programmatic API usage - currently disabled):
|
|
17
|
+
// export * from './providers/gemini.js';
|
|
18
|
+
// export * from './utils/file-handler.js';
|
|
19
|
+
// export * from './utils/image-processing.js';
|
|
20
|
+
// export * from './utils/ffmpeg.js';
|
|
21
|
+
// export * from './tools/video/generate-video.js';
|
|
22
|
+
// export * from './tools/video/image-to-video.js';
|
|
23
|
+
// export * from './tools/video/storyboard-video.js';
|
|
24
|
+
// export * from './tools/video/extend-video.js';
|
|
25
|
+
// Only export plugin for OpenCode
|
|
9
26
|
export { default } from './plugin.js';
|
|
10
27
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,qDAAqD;AACrD,0EAA0E;AAC1E,0EAA0E;AAC1E,sDAAsD;AACtD,mEAAmE;AACnE,EAAE;AACF,sEAAsE;AACtE,yCAAyC;AACzC,2CAA2C;AAC3C,+CAA+C;AAC/C,qCAAqC;AACrC,mDAAmD;AACnD,mDAAmD;AACnD,qDAAqD;AACrD,iDAAiD;AAEjD,kCAAkC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenCode Plugin Entry Point
|
|
3
|
-
*
|
|
4
|
-
* Exposes Nanobanana's visual capabilities as OpenCode tools.
|
|
5
|
-
* Uses the @opencode-ai/plugin SDK for tool definitions.
|
|
6
|
-
*/
|
|
7
1
|
import type { Plugin } from '@opencode-ai/plugin';
|
|
8
|
-
/**
|
|
9
|
-
* Nanobanana Plugin for OpenCode
|
|
10
|
-
*
|
|
11
|
-
* Provides visual AI capabilities:
|
|
12
|
-
* - Video generation (Veo 3)
|
|
13
|
-
* - Image to video animation
|
|
14
|
-
* - Storyboard video generation
|
|
15
|
-
* - Video extension
|
|
16
|
-
*/
|
|
17
2
|
declare const plugin: Plugin;
|
|
18
3
|
export default plugin;
|
|
19
4
|
//# sourceMappingURL=plugin.d.ts.map
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAqBlD,QAAA,MAAM,MAAM,EAAE,MA+Rb,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenCode Plugin Entry Point
|
|
3
|
-
*
|
|
4
|
-
* Exposes Nanobanana's visual capabilities as OpenCode tools.
|
|
5
|
-
* Uses the @opencode-ai/plugin SDK for tool definitions.
|
|
6
|
-
*/
|
|
7
1
|
import { tool } from '@opencode-ai/plugin/tool';
|
|
2
|
+
import { GeminiProvider } from './providers/gemini.js';
|
|
8
3
|
import { generateVideo } from './tools/video/generate-video.js';
|
|
9
4
|
import { imageToVideo } from './tools/video/image-to-video.js';
|
|
10
5
|
import { generateStoryboardVideo } from './tools/video/storyboard-video.js';
|
|
11
6
|
import { extendVideo } from './tools/video/extend-video.js';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
import { writeFile } from 'fs/promises';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { tmpdir } from 'os';
|
|
15
10
|
function getApiKey() {
|
|
16
11
|
const apiKey = process.env.GEMINI_API_KEY;
|
|
17
12
|
if (!apiKey) {
|
|
@@ -20,82 +15,69 @@ function getApiKey() {
|
|
|
20
15
|
}
|
|
21
16
|
return apiKey;
|
|
22
17
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Nanobanana Plugin for OpenCode
|
|
25
|
-
*
|
|
26
|
-
* Provides visual AI capabilities:
|
|
27
|
-
* - Video generation (Veo 3)
|
|
28
|
-
* - Image to video animation
|
|
29
|
-
* - Storyboard video generation
|
|
30
|
-
* - Video extension
|
|
31
|
-
*/
|
|
32
18
|
const plugin = async (_input) => {
|
|
33
19
|
return {
|
|
34
20
|
tool: {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
description: 'Generate a video from a text prompt using Google Veo 3. ' +
|
|
40
|
-
'Creates high-quality video content with native audio generation. ' +
|
|
41
|
-
'Supports various aspect ratios (16:9, 9:16) and resolutions (720p, 1080p). ' +
|
|
42
|
-
'Duration can be 4, 6, or 8 seconds.',
|
|
21
|
+
generate_image: tool({
|
|
22
|
+
description: 'Generate an image from a text prompt using Google Imagen 3. ' +
|
|
23
|
+
'Creates high-quality images for icons, illustrations, photos, art, and more. ' +
|
|
24
|
+
'Supports various aspect ratios: 1:1 (square), 3:4, 4:3, 9:16 (portrait), 16:9 (landscape).',
|
|
43
25
|
args: {
|
|
44
|
-
prompt: tool.schema.string().describe('Description of the
|
|
45
|
-
'Example: "A
|
|
26
|
+
prompt: tool.schema.string().describe('Description of the image to generate. Be specific about style, colors, composition, lighting. ' +
|
|
27
|
+
'Example: "A modern app icon with gradient blue-purple colors, minimalist design, rounded corners"'),
|
|
46
28
|
aspectRatio: tool.schema
|
|
47
|
-
.enum(['
|
|
48
|
-
.optional()
|
|
49
|
-
.describe('Aspect ratio for the video. Defaults to 16:9 (landscape)'),
|
|
50
|
-
resolution: tool.schema
|
|
51
|
-
.enum(['720p', '1080p'])
|
|
52
|
-
.optional()
|
|
53
|
-
.describe('Video resolution. Defaults to 720p'),
|
|
54
|
-
duration: tool.schema
|
|
55
|
-
.enum(['4', '6', '8'])
|
|
29
|
+
.enum(['1:1', '3:4', '4:3', '9:16', '16:9'])
|
|
56
30
|
.optional()
|
|
57
|
-
.describe('
|
|
31
|
+
.describe('Aspect ratio for the image. Defaults to 1:1 (square)'),
|
|
58
32
|
outputPath: tool.schema
|
|
59
33
|
.string()
|
|
60
34
|
.optional()
|
|
61
|
-
.describe('Path where the
|
|
35
|
+
.describe('Path where the image should be saved. If not provided, saves to temp directory'),
|
|
62
36
|
},
|
|
63
37
|
async execute(args, _context) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
apiKey
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
38
|
+
try {
|
|
39
|
+
const apiKey = getApiKey();
|
|
40
|
+
const provider = new GeminiProvider(apiKey);
|
|
41
|
+
const result = await provider.generateImage(args.prompt, {
|
|
42
|
+
aspectRatio: args.aspectRatio,
|
|
43
|
+
count: 1,
|
|
44
|
+
});
|
|
45
|
+
const outputPath = args.outputPath || join(tmpdir(), `image-${Date.now()}.png`);
|
|
46
|
+
await writeFile(outputPath, result.buffer);
|
|
47
|
+
return JSON.stringify({
|
|
48
|
+
success: true,
|
|
49
|
+
imagePath: outputPath,
|
|
50
|
+
mimeType: result.mimeType,
|
|
51
|
+
generationTime: `${(result.generationTime / 1000).toFixed(1)}s`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const err = error;
|
|
56
|
+
const errorMessage = err?.message || String(error);
|
|
57
|
+
const errorCode = err?.code || err?.status || 'UNKNOWN';
|
|
58
|
+
return JSON.stringify({
|
|
59
|
+
success: false,
|
|
60
|
+
error: errorMessage,
|
|
61
|
+
errorCode,
|
|
62
|
+
help: errorMessage.includes('API key') || errorMessage.includes('403') || errorMessage.includes('PERMISSION_DENIED')
|
|
63
|
+
? 'Please check your GEMINI_API_KEY environment variable. Get a new key at https://aistudio.google.com/app/apikey'
|
|
64
|
+
: 'Image generation failed. Check the error message for details.',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
80
67
|
},
|
|
81
68
|
}),
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
'Takes an existing image and brings it to life with motion and audio. ' +
|
|
88
|
-
'Useful for animating photos, product images, logos, or artwork.',
|
|
69
|
+
generate_video: tool({
|
|
70
|
+
description: 'Generate a video from a text prompt using Google Veo 3. ' +
|
|
71
|
+
'Creates high-quality video content with native audio generation. ' +
|
|
72
|
+
'Supports aspect ratios 16:9 (landscape) and 9:16 (portrait), resolutions 720p/1080p. ' +
|
|
73
|
+
'Duration: 4, 6, or 8 seconds.',
|
|
89
74
|
args: {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
.describe('Path to the image file to animate'),
|
|
93
|
-
prompt: tool.schema.string().describe('Description of the animation to apply. ' +
|
|
94
|
-
'Example: "Slow camera pan from left to right" or "Product rotates 360 degrees"'),
|
|
75
|
+
prompt: tool.schema.string().describe('Description of the video to generate. Be specific about action, scene, lighting, mood. ' +
|
|
76
|
+
'Example: "A serene mountain landscape at sunrise with fog rolling through the valley"'),
|
|
95
77
|
aspectRatio: tool.schema
|
|
96
78
|
.enum(['16:9', '9:16'])
|
|
97
79
|
.optional()
|
|
98
|
-
.describe('Aspect ratio
|
|
80
|
+
.describe('Aspect ratio. Defaults to 16:9 (landscape)'),
|
|
99
81
|
resolution: tool.schema
|
|
100
82
|
.enum(['720p', '1080p'])
|
|
101
83
|
.optional()
|
|
@@ -103,153 +85,191 @@ const plugin = async (_input) => {
|
|
|
103
85
|
duration: tool.schema
|
|
104
86
|
.enum(['4', '6', '8'])
|
|
105
87
|
.optional()
|
|
106
|
-
.describe('
|
|
88
|
+
.describe('Duration in seconds. Defaults to 8'),
|
|
107
89
|
outputPath: tool.schema
|
|
108
90
|
.string()
|
|
109
91
|
.optional()
|
|
110
92
|
.describe('Path where the video should be saved'),
|
|
111
93
|
},
|
|
112
94
|
async execute(args, _context) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
95
|
+
try {
|
|
96
|
+
const apiKey = getApiKey();
|
|
97
|
+
const result = await generateVideo({
|
|
98
|
+
apiKey,
|
|
99
|
+
prompt: args.prompt,
|
|
100
|
+
aspectRatio: args.aspectRatio,
|
|
101
|
+
resolution: args.resolution,
|
|
102
|
+
duration: args.duration ? parseInt(args.duration, 10) : undefined,
|
|
103
|
+
outputPath: args.outputPath,
|
|
104
|
+
});
|
|
105
|
+
return JSON.stringify({
|
|
106
|
+
success: true,
|
|
107
|
+
videoPath: result.videoPath,
|
|
108
|
+
generationTime: `${(result.generationTime / 1000).toFixed(1)}s`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
const err = error;
|
|
113
|
+
const errorMessage = err?.message || String(error);
|
|
114
|
+
const errorCode = err?.code || err?.status || 'UNKNOWN';
|
|
115
|
+
return JSON.stringify({
|
|
116
|
+
success: false,
|
|
117
|
+
error: errorMessage,
|
|
118
|
+
errorCode,
|
|
119
|
+
help: errorMessage.includes('API key') || errorMessage.includes('403') || errorMessage.includes('PERMISSION_DENIED')
|
|
120
|
+
? 'Please check your GEMINI_API_KEY environment variable'
|
|
121
|
+
: 'Video generation failed.',
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
}),
|
|
126
|
+
image_to_video: tool({
|
|
127
|
+
description: 'Animate a static image into a video using Google Veo 3. ' +
|
|
128
|
+
'Brings images to life with motion and audio. ' +
|
|
129
|
+
'Great for animating photos, product images, logos, or artwork.',
|
|
130
|
+
args: {
|
|
131
|
+
imagePath: tool.schema.string().describe('Path to the image file to animate'),
|
|
132
|
+
prompt: tool.schema.string().describe('Description of the animation. Example: "Slow camera pan from left to right" or "Product rotates 360 degrees"'),
|
|
133
|
+
aspectRatio: tool.schema.enum(['16:9', '9:16']).optional().describe('Aspect ratio. Defaults to 16:9'),
|
|
134
|
+
resolution: tool.schema.enum(['720p', '1080p']).optional().describe('Resolution. Defaults to 720p'),
|
|
135
|
+
duration: tool.schema.enum(['4', '6', '8']).optional().describe('Duration in seconds. Defaults to 8'),
|
|
136
|
+
outputPath: tool.schema.string().optional().describe('Path where the video should be saved'),
|
|
137
|
+
},
|
|
138
|
+
async execute(args, _context) {
|
|
139
|
+
try {
|
|
140
|
+
const apiKey = getApiKey();
|
|
141
|
+
const result = await imageToVideo({
|
|
142
|
+
apiKey,
|
|
143
|
+
imagePath: args.imagePath,
|
|
144
|
+
prompt: args.prompt,
|
|
145
|
+
aspectRatio: args.aspectRatio,
|
|
146
|
+
resolution: args.resolution,
|
|
147
|
+
duration: args.duration ? parseInt(args.duration, 10) : undefined,
|
|
148
|
+
outputPath: args.outputPath,
|
|
149
|
+
});
|
|
150
|
+
return JSON.stringify({
|
|
151
|
+
success: true,
|
|
152
|
+
videoPath: result.videoPath,
|
|
153
|
+
generationTime: `${(result.generationTime / 1000).toFixed(1)}s`,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
const err = error;
|
|
158
|
+
const errorMessage = err?.message || String(error);
|
|
159
|
+
const errorCode = err?.code || err?.status || 'UNKNOWN';
|
|
160
|
+
return JSON.stringify({
|
|
161
|
+
success: false,
|
|
162
|
+
error: errorMessage,
|
|
163
|
+
errorCode,
|
|
164
|
+
help: errorMessage.includes('API key') || errorMessage.includes('403') || errorMessage.includes('PERMISSION_DENIED')
|
|
165
|
+
? 'Please check your GEMINI_API_KEY environment variable'
|
|
166
|
+
: 'Image to video conversion failed.',
|
|
167
|
+
});
|
|
168
|
+
}
|
|
130
169
|
},
|
|
131
170
|
}),
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
mcp_generate_storyboard_video: tool({
|
|
136
|
-
description: 'Generate a multi-scene storyboard video by creating individual scenes ' +
|
|
137
|
-
'and stitching them together with transitions. Perfect for commercials, ' +
|
|
138
|
-
'narratives, product demos, or any video requiring multiple scenes. ' +
|
|
139
|
-
'Supports character consistency across scenes using reference images. ' +
|
|
140
|
-
'Requires FFmpeg to be installed.',
|
|
171
|
+
generate_storyboard_video: tool({
|
|
172
|
+
description: 'Generate a multi-scene storyboard video. Creates individual scenes and stitches them with transitions. ' +
|
|
173
|
+
'Perfect for commercials, narratives, product demos. Supports character consistency. Requires FFmpeg.',
|
|
141
174
|
args: {
|
|
142
175
|
scenes: tool.schema
|
|
143
176
|
.array(tool.schema.string())
|
|
144
|
-
.describe('Array of scene descriptions.
|
|
145
|
-
|
|
146
|
-
style: tool.schema
|
|
147
|
-
.string()
|
|
148
|
-
.optional()
|
|
149
|
-
.describe('Visual style to apply to all scenes. Examples: "cinematic", "commercial", "documentary"'),
|
|
177
|
+
.describe('Array of scene descriptions. Example: ["Coffee shop morning", "Barista making latte", "Customer enjoying coffee"]'),
|
|
178
|
+
style: tool.schema.string().optional().describe('Visual style for all scenes. Examples: "cinematic", "commercial"'),
|
|
150
179
|
characterDescription: tool.schema
|
|
151
180
|
.string()
|
|
152
181
|
.optional()
|
|
153
|
-
.describe('
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
.optional()
|
|
162
|
-
.describe('Aspect ratio for all scenes. Defaults to 16:9'),
|
|
163
|
-
transition: tool.schema
|
|
164
|
-
.enum(['cut', 'crossfade', 'fade'])
|
|
165
|
-
.optional()
|
|
166
|
-
.describe('Transition type between scenes. Defaults to crossfade'),
|
|
167
|
-
transitionDuration: tool.schema
|
|
168
|
-
.number()
|
|
169
|
-
.optional()
|
|
170
|
-
.describe('Transition duration in seconds. Defaults to 0.5'),
|
|
171
|
-
backgroundMusic: tool.schema
|
|
172
|
-
.string()
|
|
173
|
-
.optional()
|
|
174
|
-
.describe('Path to background music audio file'),
|
|
175
|
-
musicVolume: tool.schema
|
|
176
|
-
.number()
|
|
177
|
-
.optional()
|
|
178
|
-
.describe('Volume level for background music (0.0-1.0). Defaults to 0.3'),
|
|
179
|
-
outputPath: tool.schema
|
|
180
|
-
.string()
|
|
181
|
-
.optional()
|
|
182
|
-
.describe('Path where the final video should be saved'),
|
|
182
|
+
.describe('Main character description for consistency. Example: "Young woman with brown hair in red jacket"'),
|
|
183
|
+
referenceImages: tool.schema.array(tool.schema.string()).optional().describe('Paths to reference images (max 3)'),
|
|
184
|
+
aspectRatio: tool.schema.enum(['16:9', '9:16']).optional().describe('Aspect ratio. Defaults to 16:9'),
|
|
185
|
+
transition: tool.schema.enum(['cut', 'crossfade', 'fade']).optional().describe('Transition type. Defaults to crossfade'),
|
|
186
|
+
transitionDuration: tool.schema.number().optional().describe('Transition duration in seconds. Defaults to 0.5'),
|
|
187
|
+
backgroundMusic: tool.schema.string().optional().describe('Path to background music audio file'),
|
|
188
|
+
musicVolume: tool.schema.number().optional().describe('Background music volume (0.0-1.0). Defaults to 0.3'),
|
|
189
|
+
outputPath: tool.schema.string().optional().describe('Path where the final video should be saved'),
|
|
183
190
|
},
|
|
184
191
|
async execute(args, _context) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
192
|
+
try {
|
|
193
|
+
const apiKey = getApiKey();
|
|
194
|
+
const result = await generateStoryboardVideo({
|
|
195
|
+
apiKey,
|
|
196
|
+
scenes: args.scenes,
|
|
197
|
+
style: args.style,
|
|
198
|
+
characterDescription: args.characterDescription,
|
|
199
|
+
referenceImages: args.referenceImages,
|
|
200
|
+
aspectRatio: args.aspectRatio,
|
|
201
|
+
transition: args.transition,
|
|
202
|
+
transitionDuration: args.transitionDuration,
|
|
203
|
+
backgroundMusic: args.backgroundMusic,
|
|
204
|
+
musicVolume: args.musicVolume,
|
|
205
|
+
outputPath: args.outputPath,
|
|
206
|
+
});
|
|
207
|
+
return JSON.stringify({
|
|
208
|
+
success: true,
|
|
209
|
+
videoPath: result.videoPath,
|
|
210
|
+
totalTime: `${(result.totalTime / 1000).toFixed(1)}s`,
|
|
211
|
+
scenesGenerated: result.successCount,
|
|
212
|
+
scenesFailed: result.failureCount,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
const err = error;
|
|
217
|
+
const errorMessage = err?.message || String(error);
|
|
218
|
+
const errorCode = err?.code || err?.status || 'UNKNOWN';
|
|
219
|
+
return JSON.stringify({
|
|
220
|
+
success: false,
|
|
221
|
+
error: errorMessage,
|
|
222
|
+
errorCode,
|
|
223
|
+
help: errorMessage.includes('ffmpeg')
|
|
224
|
+
? 'FFmpeg is required. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)'
|
|
225
|
+
: errorMessage.includes('API key') || errorMessage.includes('403')
|
|
226
|
+
? 'Please check your GEMINI_API_KEY environment variable'
|
|
227
|
+
: 'Storyboard generation failed.',
|
|
228
|
+
});
|
|
229
|
+
}
|
|
210
230
|
},
|
|
211
231
|
}),
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
description: 'Extend an existing video with new content using Google Veo 3. ' +
|
|
217
|
-
'Seamlessly continues the video with AI-generated content matching the original style. ' +
|
|
218
|
-
'Useful for adding scenes, extending clips, or continuing narratives.',
|
|
232
|
+
extend_video: tool({
|
|
233
|
+
description: 'Extend an existing video with new AI-generated content using Veo 3. ' +
|
|
234
|
+
'Seamlessly continues the video matching the original style. ' +
|
|
235
|
+
'Useful for adding scenes or continuing narratives.',
|
|
219
236
|
args: {
|
|
220
|
-
videoPath: tool.schema
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
aspectRatio: tool.schema
|
|
226
|
-
.enum(['16:9', '9:16'])
|
|
227
|
-
.optional()
|
|
228
|
-
.describe('Aspect ratio for the extended video. Defaults to 16:9'),
|
|
229
|
-
resolution: tool.schema
|
|
230
|
-
.enum(['720p', '1080p'])
|
|
231
|
-
.optional()
|
|
232
|
-
.describe('Resolution for the extended video. Defaults to 720p'),
|
|
233
|
-
outputPath: tool.schema
|
|
234
|
-
.string()
|
|
235
|
-
.optional()
|
|
236
|
-
.describe('Path where the extended video should be saved'),
|
|
237
|
+
videoPath: tool.schema.string().describe('Path to the existing video to extend'),
|
|
238
|
+
prompt: tool.schema.string().describe('Description of the extension. Example: "Camera pans to reveal a stunning sunset"'),
|
|
239
|
+
aspectRatio: tool.schema.enum(['16:9', '9:16']).optional().describe('Aspect ratio. Defaults to 16:9'),
|
|
240
|
+
resolution: tool.schema.enum(['720p', '1080p']).optional().describe('Resolution. Defaults to 720p'),
|
|
241
|
+
outputPath: tool.schema.string().optional().describe('Path where the extended video should be saved'),
|
|
237
242
|
},
|
|
238
243
|
async execute(args, _context) {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
244
|
+
try {
|
|
245
|
+
const apiKey = getApiKey();
|
|
246
|
+
const result = await extendVideo({
|
|
247
|
+
apiKey,
|
|
248
|
+
videoPath: args.videoPath,
|
|
249
|
+
prompt: args.prompt,
|
|
250
|
+
aspectRatio: args.aspectRatio,
|
|
251
|
+
resolution: args.resolution,
|
|
252
|
+
outputPath: args.outputPath,
|
|
253
|
+
});
|
|
254
|
+
return JSON.stringify({
|
|
255
|
+
success: true,
|
|
256
|
+
videoPath: result.videoPath,
|
|
257
|
+
generationTime: `${(result.generationTime / 1000).toFixed(1)}s`,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
const err = error;
|
|
262
|
+
const errorMessage = err?.message || String(error);
|
|
263
|
+
const errorCode = err?.code || err?.status || 'UNKNOWN';
|
|
264
|
+
return JSON.stringify({
|
|
265
|
+
success: false,
|
|
266
|
+
error: errorMessage,
|
|
267
|
+
errorCode,
|
|
268
|
+
help: errorMessage.includes('API key') || errorMessage.includes('403')
|
|
269
|
+
? 'Please check your GEMINI_API_KEY environment variable'
|
|
270
|
+
: 'Video extension failed.',
|
|
271
|
+
});
|
|
272
|
+
}
|
|
253
273
|
},
|
|
254
274
|
}),
|
|
255
275
|
},
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|