mulmocast 1.1.11 → 1.2.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.
- package/assets/templates/html.json +11 -0
- package/lib/actions/image_agents.d.ts +1 -1
- package/lib/actions/image_references.js +2 -2
- package/lib/actions/images.js +6 -30
- package/lib/agents/image_genai_agent.d.ts +5 -0
- package/lib/agents/image_genai_agent.js +52 -0
- package/lib/agents/index.d.ts +3 -3
- package/lib/agents/index.js +3 -3
- package/lib/agents/movie_genai_agent.d.ts +9 -0
- package/lib/agents/movie_genai_agent.js +86 -0
- package/lib/cli/helpers.js +3 -1
- package/lib/methods/mulmo_beat.js +1 -1
- package/lib/types/agent.d.ts +7 -1
- package/lib/types/schema.d.ts +33 -33
- package/lib/types/schema.js +2 -2
- package/lib/utils/context.d.ts +5 -5
- package/lib/utils/filters.js +7 -1
- package/lib/utils/inquirer.js +15 -22
- package/lib/utils/prompt.d.ts +1 -1
- package/lib/utils/prompt.js +1 -1
- package/lib/utils/provider2agent.d.ts +1 -1
- package/lib/utils/provider2agent.js +5 -5
- package/lib/utils/utils.js +4 -4
- package/package.json +8 -6
- package/scripts/test/test_genai.json +47 -0
- package/scripts/test/test_media_mock.json +245 -0
package/lib/utils/utils.js
CHANGED
|
@@ -54,8 +54,8 @@ export const settings2GraphAIConfig = (settings, env) => {
|
|
|
54
54
|
apiKey: getKey("IMAGE", "OPENAI_API_KEY"),
|
|
55
55
|
baseURL: getKey("IMAGE", "OPENAI_BASE_URL"),
|
|
56
56
|
},
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
imageGenAIAgent: {
|
|
58
|
+
apiKey: getKey("IMAGE", "GEMINI_API_KEY"),
|
|
59
59
|
},
|
|
60
60
|
anthropicAgent: {
|
|
61
61
|
apiKey: getKey("LLM", "ANTHROPIC_API_TOKEN"),
|
|
@@ -63,8 +63,8 @@ export const settings2GraphAIConfig = (settings, env) => {
|
|
|
63
63
|
movieReplicateAgent: {
|
|
64
64
|
apiKey: getKey("MOVIE", "REPLICATE_API_TOKEN"),
|
|
65
65
|
},
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
movieGenAIAgent: {
|
|
67
|
+
apiKey: getKey("MOVIE", "GEMINI_API_KEY"),
|
|
68
68
|
},
|
|
69
69
|
ttsNijivoiceAgent: {
|
|
70
70
|
apiKey: getKey("TTS", "NIJIVOICE_API_KEY"),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mulmocast",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.node.js",
|
|
@@ -66,15 +66,18 @@
|
|
|
66
66
|
"homepage": "https://github.com/receptron/mulmocast-cli#readme",
|
|
67
67
|
"dependencies": {
|
|
68
68
|
"@google-cloud/text-to-speech": "^6.2.0",
|
|
69
|
+
"@google/genai": "^1.13.0",
|
|
69
70
|
"@graphai/anthropic_agent": "^2.0.5",
|
|
70
71
|
"@graphai/browserless_agent": "^2.0.1",
|
|
71
72
|
"@graphai/gemini_agent": "^2.0.0",
|
|
72
73
|
"@graphai/groq_agent": "^2.0.0",
|
|
73
|
-
"@graphai/input_agents": "^1.0.
|
|
74
|
+
"@graphai/input_agents": "^1.0.2",
|
|
74
75
|
"@graphai/openai_agent": "^2.0.3",
|
|
75
76
|
"@graphai/stream_agent_filter": "^2.0.2",
|
|
76
77
|
"@graphai/vanilla": "^2.0.6",
|
|
77
78
|
"@graphai/vanilla_node_agents": "^2.0.1",
|
|
79
|
+
"@inquirer/input": "^4.2.1",
|
|
80
|
+
"@inquirer/select": "^4.3.1",
|
|
78
81
|
"@modelcontextprotocol/sdk": "^1.15.1",
|
|
79
82
|
"@tavily/core": "^0.5.9",
|
|
80
83
|
"canvas": "^3.1.2",
|
|
@@ -83,12 +86,11 @@
|
|
|
83
86
|
"fluent-ffmpeg": "^2.1.3",
|
|
84
87
|
"google-auth-library": "^10.1.0",
|
|
85
88
|
"graphai": "^2.0.13",
|
|
86
|
-
"inquirer": "^12.9.0",
|
|
87
89
|
"marked": "^16.1.2",
|
|
88
90
|
"ora": "^8.2.0",
|
|
89
|
-
"puppeteer": "^24.
|
|
91
|
+
"puppeteer": "^24.16.0",
|
|
90
92
|
"replicate": "^1.0.1",
|
|
91
|
-
"yaml": "^2.8.
|
|
93
|
+
"yaml": "^2.8.1",
|
|
92
94
|
"yargs": "^18.0.0",
|
|
93
95
|
"zod": "^3.25.76",
|
|
94
96
|
"zod-to-json-schema": "^3.24.6"
|
|
@@ -101,7 +103,7 @@
|
|
|
101
103
|
"@types/yargs": "^17.0.33",
|
|
102
104
|
"eslint": "^9.32.0",
|
|
103
105
|
"eslint-config-prettier": "^10.1.8",
|
|
104
|
-
"eslint-plugin-prettier": "^5.5.
|
|
106
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
105
107
|
"eslint-plugin-sonarjs": "^3.0.4",
|
|
106
108
|
"prettier": "^3.6.2",
|
|
107
109
|
"ts-node": "^10.9.2",
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$mulmocast": { "version": "1.1" },
|
|
3
|
+
"imageParams": {
|
|
4
|
+
"provider": "google",
|
|
5
|
+
"style": "<style>Photo realistic.</style>"
|
|
6
|
+
},
|
|
7
|
+
"movieParams": {
|
|
8
|
+
"provider": "google"
|
|
9
|
+
},
|
|
10
|
+
"lang": "en",
|
|
11
|
+
"beats": [
|
|
12
|
+
{
|
|
13
|
+
"id": "imagen_3",
|
|
14
|
+
"text": "image generated by imagen-3",
|
|
15
|
+
"imagePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
|
|
16
|
+
"imageParams": {
|
|
17
|
+
"model": "imagen-3.0-generate-002"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "imagen_4",
|
|
22
|
+
"text": "image generated by imagen-4",
|
|
23
|
+
"imagePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "imagen_4_ultra",
|
|
27
|
+
"text": "image generated by imagen-4",
|
|
28
|
+
"imagePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
|
|
29
|
+
"imageParams": {
|
|
30
|
+
"model": "imagen-4.0-ultra-generate-preview-06-06"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "genai_veo2",
|
|
35
|
+
"text": "movie generated by veo2",
|
|
36
|
+
"duration": 5,
|
|
37
|
+
"moviePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "genai_veo2_image",
|
|
41
|
+
"text": "movie generated by veo2 with image",
|
|
42
|
+
"duration": 5,
|
|
43
|
+
"imagePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
|
|
44
|
+
"moviePrompt": "a woman takes a selfie with her phone"
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$mulmocast": {
|
|
3
|
+
"version": "1.1"
|
|
4
|
+
},
|
|
5
|
+
"lang": "en",
|
|
6
|
+
"title": "Media Test",
|
|
7
|
+
"references": [
|
|
8
|
+
{
|
|
9
|
+
"url": "https://www.mulmocast.com",
|
|
10
|
+
"title": "Mulmocast",
|
|
11
|
+
"type": "article"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"speechParams": {
|
|
15
|
+
"speakers": {
|
|
16
|
+
"Presenter": {
|
|
17
|
+
"voiceId": "shimmer",
|
|
18
|
+
"displayName": {
|
|
19
|
+
"en": "Presenter"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"beats": [
|
|
25
|
+
{
|
|
26
|
+
"id": "first",
|
|
27
|
+
"speaker": "Presenter",
|
|
28
|
+
"text": "This is a local image.",
|
|
29
|
+
"image": {
|
|
30
|
+
"type": "image",
|
|
31
|
+
"source": {
|
|
32
|
+
"kind": "path",
|
|
33
|
+
"path": "../../assets/images/mulmocast_credit.png"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"speaker": "Presenter",
|
|
39
|
+
"text": "This is a reference beat.",
|
|
40
|
+
"duration": 0.5,
|
|
41
|
+
"image": {
|
|
42
|
+
"type": "beat",
|
|
43
|
+
"id": "first"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"speaker": "Presenter",
|
|
48
|
+
"text": "",
|
|
49
|
+
"duration": 0.5,
|
|
50
|
+
"id": "{1A57B3F5-B6CB-4948-96BB-6F018DCCBBD4}",
|
|
51
|
+
"image": {
|
|
52
|
+
"type": "textSlide",
|
|
53
|
+
"slide": {
|
|
54
|
+
"title": "No Audio",
|
|
55
|
+
"bullets": ["0.5 seconds"]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"speaker": "Presenter",
|
|
61
|
+
"text": "This is a remote image.",
|
|
62
|
+
"image": {
|
|
63
|
+
"type": "image",
|
|
64
|
+
"source": {
|
|
65
|
+
"kind": "url",
|
|
66
|
+
"url": "https://raw.githubusercontent.com/receptron/mulmocast-cli/refs/heads/main/assets/images/mulmocast_credit.png"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"speaker": "Presenter",
|
|
72
|
+
"text": "",
|
|
73
|
+
"duration": 2,
|
|
74
|
+
"image": {
|
|
75
|
+
"type": "textSlide",
|
|
76
|
+
"slide": {
|
|
77
|
+
"title": "No Audio",
|
|
78
|
+
"bullets": ["2 seconds"]
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"speaker": "Presenter",
|
|
84
|
+
"text": "This is a local movie with audio.",
|
|
85
|
+
"image": {
|
|
86
|
+
"type": "movie",
|
|
87
|
+
"source": {
|
|
88
|
+
"kind": "url",
|
|
89
|
+
"url": "https://github.com/receptron/mulmocast-media/raw/refs/heads/main/test/pingpong.mov"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"speaker": "Presenter",
|
|
95
|
+
"text": "",
|
|
96
|
+
"image": {
|
|
97
|
+
"type": "textSlide",
|
|
98
|
+
"slide": {
|
|
99
|
+
"title": "Local Audio Test",
|
|
100
|
+
"bullets": ["Something"]
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"audio": {
|
|
104
|
+
"type": "audio",
|
|
105
|
+
"source": {
|
|
106
|
+
"kind": "path",
|
|
107
|
+
"path": "../../assets/audio/local_voice.mp3"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"speaker": "Presenter",
|
|
113
|
+
"text": "This is a bulleted list in text slide format.",
|
|
114
|
+
"image": {
|
|
115
|
+
"type": "textSlide",
|
|
116
|
+
"slide": {
|
|
117
|
+
"title": "Human Evolution",
|
|
118
|
+
"bullets": [
|
|
119
|
+
"Early Primates",
|
|
120
|
+
"Hominids and Hominins",
|
|
121
|
+
"Australopithecus",
|
|
122
|
+
"Genus Homo Emerges",
|
|
123
|
+
"Homo erectus and Migration",
|
|
124
|
+
"Neanderthals and Other Archaic Humans",
|
|
125
|
+
"Homo sapiens"
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"speaker": "Presenter",
|
|
132
|
+
"text": "This is a table in markdown format.",
|
|
133
|
+
"image": {
|
|
134
|
+
"type": "markdown",
|
|
135
|
+
"markdown": [
|
|
136
|
+
"# Markdown Table Example",
|
|
137
|
+
"### Table",
|
|
138
|
+
"| Item | In Stock | Price |",
|
|
139
|
+
"| :---------------- | :------: | ----: |",
|
|
140
|
+
"| Python Hat | True | 23.99 |",
|
|
141
|
+
"| SQL Hat | True | 23.99 |",
|
|
142
|
+
"| Codecademy Tee | False | 19.99 |",
|
|
143
|
+
"| Codecademy Hoodie | False | 42.99 |",
|
|
144
|
+
"### Paragraph",
|
|
145
|
+
"This is a paragraph."
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"speaker": "Presenter",
|
|
151
|
+
"text": "This is a chart in chart format.",
|
|
152
|
+
"image": {
|
|
153
|
+
"type": "chart",
|
|
154
|
+
"title": "Sales and Profits (from Jan to June)",
|
|
155
|
+
"chartData": {
|
|
156
|
+
"type": "bar",
|
|
157
|
+
"data": {
|
|
158
|
+
"labels": ["January", "February", "March", "April", "May", "June"],
|
|
159
|
+
"datasets": [
|
|
160
|
+
{
|
|
161
|
+
"label": "Revenue ($1000s)",
|
|
162
|
+
"data": [120, 135, 180, 155, 170, 190],
|
|
163
|
+
"backgroundColor": "rgba(54, 162, 235, 0.5)",
|
|
164
|
+
"borderColor": "rgba(54, 162, 235, 1)",
|
|
165
|
+
"borderWidth": 1
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"label": "Profit ($1000s)",
|
|
169
|
+
"data": [45, 52, 68, 53, 61, 73],
|
|
170
|
+
"backgroundColor": "rgba(75, 192, 192, 0.5)",
|
|
171
|
+
"borderColor": "rgba(75, 192, 192, 1)",
|
|
172
|
+
"borderWidth": 1
|
|
173
|
+
}
|
|
174
|
+
]
|
|
175
|
+
},
|
|
176
|
+
"options": {
|
|
177
|
+
"responsive": true,
|
|
178
|
+
"animation": false
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"speaker": "Presenter",
|
|
185
|
+
"text": "This is a diagram in mermaid format.",
|
|
186
|
+
"image": {
|
|
187
|
+
"type": "mermaid",
|
|
188
|
+
"title": "Business Process Flow",
|
|
189
|
+
"code": {
|
|
190
|
+
"kind": "text",
|
|
191
|
+
"text": "graph LR\n A[Market Research] --> B[Product Planning]\n B --> C[Development]\n C --> D[Testing]\n D --> E[Manufacturing]\n E --> F[Marketing]\n F --> G[Sales]\n G --> H[Customer Support]\n H --> A"
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"speaker": "Presenter",
|
|
197
|
+
"text": "This is a tailwind html format.",
|
|
198
|
+
"image": {
|
|
199
|
+
"type": "html_tailwind",
|
|
200
|
+
"html": [
|
|
201
|
+
"<main class=\"flex-grow\">",
|
|
202
|
+
" <!-- Hero Section -->",
|
|
203
|
+
" <section class=\"bg-blue-600 text-white py-20\">",
|
|
204
|
+
" <div class=\"container mx-auto px-6 text-center\">",
|
|
205
|
+
" <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">Welcome to Mulmocast</h1>",
|
|
206
|
+
" <p class=\"text-lg md:text-xl mb-8\">A modern web experience powered by Tailwind CSS</p>",
|
|
207
|
+
" <a href=\"#features\" class=\"bg-white text-blue-600 px-6 py-3 rounded-lg font-semibold shadow hover:bg-gray-100 transition\">",
|
|
208
|
+
" Learn More",
|
|
209
|
+
" </a>",
|
|
210
|
+
" </div>",
|
|
211
|
+
" </section>",
|
|
212
|
+
"",
|
|
213
|
+
" <!-- Features Section -->",
|
|
214
|
+
" <section id=\"features\" class=\"py-16 bg-gray-100\">",
|
|
215
|
+
" <div class=\"container mx-auto px-6\">",
|
|
216
|
+
" <div class=\"grid grid-cols-1 md:grid-cols-3 gap-8 text-center\">",
|
|
217
|
+
" <div>",
|
|
218
|
+
" <div class=\"text-blue-600 text-4xl mb-2\">⚡</div>",
|
|
219
|
+
" <h3 class=\"text-xl font-semibold mb-2\">Fast</h3>",
|
|
220
|
+
" <p class=\"text-gray-600\">Built with performance in mind using modern tools.</p>",
|
|
221
|
+
" </div>",
|
|
222
|
+
" <div>",
|
|
223
|
+
" <div class=\"text-blue-600 text-4xl mb-2\">🎨</div>",
|
|
224
|
+
" <h3 class=\"text-xl font-semibold mb-2\">Beautiful</h3>",
|
|
225
|
+
" <p class=\"text-gray-600\">Styled with Tailwind CSS for clean, responsive design.</p>",
|
|
226
|
+
" </div>",
|
|
227
|
+
" <div>",
|
|
228
|
+
" <div class=\"text-blue-600 text-4xl mb-2\">🚀</div>",
|
|
229
|
+
" <h3 class=\"text-xl font-semibold mb-2\">Launch Ready</h3>",
|
|
230
|
+
" <p class=\"text-gray-600\">Easy to deploy and extend for your next big idea.</p>",
|
|
231
|
+
" </div>",
|
|
232
|
+
" </div>",
|
|
233
|
+
" </div>",
|
|
234
|
+
" </section>",
|
|
235
|
+
"</main>",
|
|
236
|
+
"",
|
|
237
|
+
"<!-- Footer -->",
|
|
238
|
+
"<footer class=\"bg-white text-gray-500 text-center py-6 border-t\">",
|
|
239
|
+
" 2025 Mulmocast.",
|
|
240
|
+
"</footer>"
|
|
241
|
+
]
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
]
|
|
245
|
+
}
|