@effectnode/media 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/bin/effectnode-media +2 -0
  2. package/dist/backend/index.d.ts +8 -0
  3. package/dist/backend/index.js +13 -0
  4. package/dist/backend/movie-backend/agent/agent-backend.d.ts +16 -0
  5. package/dist/backend/movie-backend/agent/agent-backend.js +703 -0
  6. package/dist/backend/movie-backend/agent/storyprompt.d.ts +1 -0
  7. package/dist/backend/movie-backend/agent/storyprompt.js +90 -0
  8. package/dist/backend/movie-backend/agent/tools/edit-image.d.ts +3 -0
  9. package/dist/backend/movie-backend/agent/tools/edit-image.js +192 -0
  10. package/dist/backend/movie-backend/agent/tools/get-time.d.ts +3 -0
  11. package/dist/backend/movie-backend/agent/tools/get-time.js +7 -0
  12. package/dist/backend/movie-backend/agent/tools/grep-files.d.ts +3 -0
  13. package/dist/backend/movie-backend/agent/tools/grep-files.js +59 -0
  14. package/dist/backend/movie-backend/agent/tools/image-to-video-generation.d.ts +3 -0
  15. package/dist/backend/movie-backend/agent/tools/image-to-video-generation.js +160 -0
  16. package/dist/backend/movie-backend/agent/tools/index.d.ts +7 -0
  17. package/dist/backend/movie-backend/agent/tools/index.js +59 -0
  18. package/dist/backend/movie-backend/agent/tools/list-files.d.ts +3 -0
  19. package/dist/backend/movie-backend/agent/tools/list-files.js +17 -0
  20. package/dist/backend/movie-backend/agent/tools/read-file.d.ts +3 -0
  21. package/dist/backend/movie-backend/agent/tools/read-file.js +28 -0
  22. package/dist/backend/movie-backend/agent/tools/remove-file.d.ts +3 -0
  23. package/dist/backend/movie-backend/agent/tools/remove-file.js +22 -0
  24. package/dist/backend/movie-backend/agent/tools/rename-file.d.ts +3 -0
  25. package/dist/backend/movie-backend/agent/tools/rename-file.js +37 -0
  26. package/dist/backend/movie-backend/agent/tools/show-image.d.ts +3 -0
  27. package/dist/backend/movie-backend/agent/tools/show-image.js +28 -0
  28. package/dist/backend/movie-backend/agent/tools/stitch-videos.d.ts +3 -0
  29. package/dist/backend/movie-backend/agent/tools/stitch-videos.js +96 -0
  30. package/dist/backend/movie-backend/agent/tools/text-to-video-generation.d.ts +3 -0
  31. package/dist/backend/movie-backend/agent/tools/text-to-video-generation.js +125 -0
  32. package/dist/backend/movie-backend/agent/tools/types.d.ts +15 -0
  33. package/dist/backend/movie-backend/agent/tools/types.js +1 -0
  34. package/dist/backend/movie-backend/agent/tools/update-file.d.ts +3 -0
  35. package/dist/backend/movie-backend/agent/tools/update-file.js +27 -0
  36. package/dist/backend/movie-backend/agent/tools/write-file.d.ts +3 -0
  37. package/dist/backend/movie-backend/agent/tools/write-file.js +26 -0
  38. package/dist/backend/movie-backend/agent/workspace.d.ts +25 -0
  39. package/dist/backend/movie-backend/agent/workspace.js +124 -0
  40. package/dist/backend/movie-backend/core.d.ts +4 -0
  41. package/dist/backend/movie-backend/core.js +1167 -0
  42. package/dist/backend/movie-backend/generation-queue.d.ts +24 -0
  43. package/dist/backend/movie-backend/generation-queue.js +766 -0
  44. package/dist/backend/movie-backend/process.d.ts +21 -0
  45. package/dist/backend/movie-backend/process.js +98 -0
  46. package/dist/backend/movie-backend/render-media.d.ts +48 -0
  47. package/dist/backend/movie-backend/render-media.js +3311 -0
  48. package/dist/backend/routes/health.d.ts +1 -0
  49. package/dist/backend/routes/health.js +9 -0
  50. package/dist/backend/routes/index.d.ts +1 -0
  51. package/dist/backend/routes/index.js +11 -0
  52. package/dist/backend/routes/media.d.ts +1 -0
  53. package/dist/backend/routes/media.js +13 -0
  54. package/dist/backend/routes/projects.d.ts +8 -0
  55. package/dist/backend/routes/projects.js +68 -0
  56. package/dist/backend/routes/voice.d.ts +1 -0
  57. package/dist/backend/routes/voice.js +39 -0
  58. package/dist/backend/routes.d.ts +1 -0
  59. package/dist/backend/routes.js +20 -0
  60. package/dist/backend/server.d.ts +1 -0
  61. package/dist/backend/server.js +23 -0
  62. package/dist/backend/workspace.d.ts +5 -0
  63. package/dist/backend/workspace.js +27 -0
  64. package/dist/backend/ws/index.d.ts +3 -0
  65. package/dist/backend/ws/index.js +27 -0
  66. package/dist/backend/ws/messages.d.ts +8 -0
  67. package/dist/backend/ws/messages.js +21 -0
  68. package/dist/backend/ws.d.ts +3 -0
  69. package/dist/backend/ws.js +29 -0
  70. package/dist/index.d.ts +2 -0
  71. package/dist/index.js +80 -0
  72. package/frontend/index.html +22 -0
  73. package/frontend/public/ffmpeg/ffmpeg-core.js +16 -0
  74. package/frontend/public/ffmpeg/ffmpeg-core.wasm +0 -0
  75. package/frontend/src/index.css +46 -0
  76. package/frontend/src/main.tsx +13 -0
  77. package/frontend/src/movie-app/AppRouter.tsx +14 -0
  78. package/frontend/src/movie-app/MediaStudio.tsx +9 -0
  79. package/frontend/src/movie-app/SetupPage.tsx +293 -0
  80. package/frontend/src/movie-app/components/AgentWorkspace.tsx +574 -0
  81. package/frontend/src/movie-app/components/ChatUI/ChatUI.tsx +655 -0
  82. package/frontend/src/movie-app/components/ChatUI/MarkdownMessage.tsx +267 -0
  83. package/frontend/src/movie-app/components/EditorTabs/AgentTab.tsx +61 -0
  84. package/frontend/src/movie-app/components/EditorTabs/BatchImageToVideoTab.tsx +927 -0
  85. package/frontend/src/movie-app/components/EditorTabs/BatchVideoTab.tsx +777 -0
  86. package/frontend/src/movie-app/components/EditorTabs/BatchVoiceVideoTab.tsx +913 -0
  87. package/frontend/src/movie-app/components/EditorTabs/CharacterSheet.tsx +234 -0
  88. package/frontend/src/movie-app/components/EditorTabs/CharactersTab.tsx +664 -0
  89. package/frontend/src/movie-app/components/EditorTabs/CropTool.tsx +251 -0
  90. package/frontend/src/movie-app/components/EditorTabs/ExtendVideoTab.tsx +305 -0
  91. package/frontend/src/movie-app/components/EditorTabs/ExtractImageTab.tsx +249 -0
  92. package/frontend/src/movie-app/components/EditorTabs/FastImageEditTab.tsx +555 -0
  93. package/frontend/src/movie-app/components/EditorTabs/GenerateVideoTab.tsx +722 -0
  94. package/frontend/src/movie-app/components/EditorTabs/LlmServerTab.tsx +40 -0
  95. package/frontend/src/movie-app/components/EditorTabs/MlxVlmServerPanel.tsx +490 -0
  96. package/frontend/src/movie-app/components/EditorTabs/MovieStudioTab.tsx +938 -0
  97. package/frontend/src/movie-app/components/EditorTabs/ReferencesToVideoTab.tsx +881 -0
  98. package/frontend/src/movie-app/components/EditorTabs/SceneVisualTab.tsx +267 -0
  99. package/frontend/src/movie-app/components/EditorTabs/StoryWriterTab.tsx +51 -0
  100. package/frontend/src/movie-app/components/EditorTabs/TaskQueuePanel.tsx +246 -0
  101. package/frontend/src/movie-app/components/EditorTabs/TerminalLogPanel.tsx +49 -0
  102. package/frontend/src/movie-app/components/EditorTabs/TextToImageTab.tsx +574 -0
  103. package/frontend/src/movie-app/components/EditorTabs/VoiceChatPanel.tsx +320 -0
  104. package/frontend/src/movie-app/components/ProjectEditorPage.tsx +636 -0
  105. package/frontend/src/movie-app/components/ProjectManager.tsx +381 -0
  106. package/frontend/src/movie-app/index.css +46 -0
  107. package/frontend/src/movie-app/index.html +16 -0
  108. package/frontend/src/movie-app/lambobo.png +0 -0
  109. package/frontend/src/movie-app/lib/batchImageToVideoStorage.ts +69 -0
  110. package/frontend/src/movie-app/lib/batchVideoStorage.ts +68 -0
  111. package/frontend/src/movie-app/lib/batchVoiceStorage.ts +75 -0
  112. package/frontend/src/movie-app/lib/ffmpeg.ts +42 -0
  113. package/frontend/src/movie-app/lib/referencesToVideoStorage.ts +64 -0
  114. package/frontend/src/movie-app/lib/textToImageStorage.ts +61 -0
  115. package/frontend/src/movie-app/public/ffmpeg/ffmpeg-core.js +16 -0
  116. package/frontend/src/movie-app/public/ffmpeg/ffmpeg-core.wasm +0 -0
  117. package/frontend/src/movie-app/stores/batchImageToVideoStore.ts +736 -0
  118. package/frontend/src/movie-app/stores/batchVideoStore.ts +670 -0
  119. package/frontend/src/movie-app/stores/batchVoiceStore.ts +990 -0
  120. package/frontend/src/movie-app/stores/characterStore.ts +109 -0
  121. package/frontend/src/movie-app/stores/chatStore.ts +459 -0
  122. package/frontend/src/movie-app/stores/generationStore.ts +2140 -0
  123. package/frontend/src/movie-app/stores/logStore.ts +25 -0
  124. package/frontend/src/movie-app/stores/movieStudioStore.ts +709 -0
  125. package/frontend/src/movie-app/stores/projectStore.ts +124 -0
  126. package/frontend/src/movie-app/stores/queueStore.ts +214 -0
  127. package/frontend/src/movie-app/stores/referencesToVideoStore.ts +467 -0
  128. package/frontend/src/movie-app/stores/sceneVisualStore.ts +251 -0
  129. package/frontend/src/movie-app/stores/voiceChatStore.ts +170 -0
  130. package/frontend/src/movie-app/stores/workspaceStore.ts +158 -0
  131. package/frontend/src/vite-env.d.ts +1 -0
  132. package/frontend/tsconfig.json +19 -0
  133. package/package.json +65 -0
@@ -0,0 +1,293 @@
1
+ import { useEffect, useState, useRef } from "react";
2
+ import { useNavigate } from "react-router-dom";
3
+ import { useLogStore, type LogEntry } from "./stores/logStore";
4
+
5
+ interface StepStatus {
6
+ step: string;
7
+ label: string;
8
+ status: "pending" | "running" | "completed" | "error";
9
+ error?: string;
10
+ }
11
+
12
+ function SetupPage({ port = 8765 }) {
13
+ const [steps, setSteps] = useState<StepStatus[]>([]);
14
+ const [complete, setComplete] = useState(false);
15
+ const [error, setError] = useState<string | null>(null);
16
+ const navigate = useNavigate();
17
+ const addLog = useLogStore((s) => s.addLog);
18
+ const logs = useLogStore((s) => s.logs);
19
+ const logEndRef = useRef<HTMLDivElement>(null);
20
+
21
+ useEffect(() => {
22
+ const eventSource = new EventSource(`http://localhost:${port}/api/setup`);
23
+
24
+ eventSource.addEventListener("progress", (e: MessageEvent) => {
25
+ const data = JSON.parse(e.data);
26
+ setSteps((prev) => {
27
+ const existing = prev.findIndex((s) => s.step === data.step);
28
+ if (existing >= 0) {
29
+ const updated = [...prev];
30
+ updated[existing] = {
31
+ step: data.step,
32
+ label: data.label,
33
+ status: data.status,
34
+ error: data.error,
35
+ };
36
+ return updated;
37
+ }
38
+ return [
39
+ ...prev,
40
+ {
41
+ step: data.step,
42
+ label: data.label,
43
+ status: data.status,
44
+ error: data.error,
45
+ },
46
+ ];
47
+ });
48
+ });
49
+
50
+ eventSource.addEventListener("error", (e: MessageEvent) => {
51
+ try {
52
+ const data = JSON.parse(e.data);
53
+ setError(data.error);
54
+ } catch {
55
+ setError("Setup failed");
56
+ }
57
+ eventSource.close();
58
+ });
59
+
60
+ eventSource.addEventListener("complete", (e: MessageEvent) => {
61
+ const data = JSON.parse(e.data);
62
+ console.log("Setup complete:", data);
63
+ setComplete(true);
64
+
65
+ if (data.success) {
66
+ navigate("/app");
67
+ }
68
+
69
+ eventSource.close();
70
+ });
71
+
72
+ eventSource.addEventListener("log", (e: MessageEvent) => {
73
+ try {
74
+ const data = JSON.parse(e.data);
75
+ addLog({
76
+ message: data.text ?? JSON.stringify(data),
77
+ level: data.level ?? "info",
78
+ });
79
+ } catch {
80
+ addLog({ message: e.data, level: "info" });
81
+ }
82
+ });
83
+
84
+ eventSource.onerror = () => {
85
+ setError("Connection lost");
86
+ eventSource.close();
87
+ };
88
+
89
+ return () => {
90
+ eventSource.close();
91
+ };
92
+ }, [navigate, addLog]);
93
+
94
+ useEffect(() => {
95
+ logEndRef.current?.scrollIntoView({ behavior: "smooth" });
96
+ }, [logs]);
97
+
98
+ const StatusIcon = ({ status }: { status: StepStatus["status"] }) => {
99
+ switch (status) {
100
+ case "running":
101
+ return (
102
+ <svg
103
+ width="18"
104
+ height="18"
105
+ viewBox="0 0 24 24"
106
+ fill="none"
107
+ stroke="currentColor"
108
+ strokeWidth="2"
109
+ >
110
+ <circle
111
+ cx="12"
112
+ cy="12"
113
+ r="10"
114
+ strokeDasharray="32"
115
+ strokeDashoffset="32"
116
+ >
117
+ <animate
118
+ attributeName="stroke-dashoffset"
119
+ from="64"
120
+ to="0"
121
+ dur="1.5s"
122
+ repeatCount="indefinite"
123
+ />
124
+ </circle>
125
+ </svg>
126
+ );
127
+ case "completed":
128
+ return (
129
+ <svg
130
+ width="18"
131
+ height="18"
132
+ viewBox="0 0 24 24"
133
+ fill="none"
134
+ stroke="#22c55e"
135
+ strokeWidth="2"
136
+ >
137
+ <circle cx="12" cy="12" r="10" />
138
+ <path d="M8 12l3 3 5-5" />
139
+ </svg>
140
+ );
141
+ case "error":
142
+ return (
143
+ <svg
144
+ width="18"
145
+ height="18"
146
+ viewBox="0 0 24 24"
147
+ fill="none"
148
+ stroke="#ef4444"
149
+ strokeWidth="2"
150
+ >
151
+ <circle cx="12" cy="12" r="10" />
152
+ <path d="M15 9l-6 6M9 9l6 6" />
153
+ </svg>
154
+ );
155
+ default:
156
+ return (
157
+ <svg
158
+ width="18"
159
+ height="18"
160
+ viewBox="0 0 24 24"
161
+ fill="none"
162
+ stroke="#9ca3af"
163
+ strokeWidth="2"
164
+ >
165
+ <circle cx="12" cy="12" r="10" />
166
+ </svg>
167
+ );
168
+ }
169
+ };
170
+
171
+ const LogIcon = ({ level }: { level: LogEntry["level"] }) => {
172
+ switch (level) {
173
+ case "error":
174
+ return (
175
+ <svg
176
+ width="14"
177
+ height="14"
178
+ viewBox="0 0 24 24"
179
+ fill="none"
180
+ stroke="#ef4444"
181
+ strokeWidth="2"
182
+ className="shrink-0"
183
+ >
184
+ <circle cx="12" cy="12" r="10" />
185
+ <path d="M15 9l-6 6M9 9l6 6" />
186
+ </svg>
187
+ );
188
+ case "warn":
189
+ return (
190
+ <svg
191
+ width="14"
192
+ height="14"
193
+ viewBox="0 0 24 24"
194
+ fill="none"
195
+ stroke="#f59e0b"
196
+ strokeWidth="2"
197
+ className="shrink-0"
198
+ >
199
+ <path d="M12 2L2 22h20L12 2z" />
200
+ <line x1="12" y1="9" x2="12" y2="14" />
201
+ <circle cx="12" cy="18" r="0.5" fill="#f59e0b" />
202
+ </svg>
203
+ );
204
+ default:
205
+ return (
206
+ <svg
207
+ width="14"
208
+ height="14"
209
+ viewBox="0 0 24 24"
210
+ fill="none"
211
+ stroke="#6b7280"
212
+ strokeWidth="2"
213
+ className="shrink-0"
214
+ >
215
+ <circle cx="12" cy="12" r="3" />
216
+ <circle cx="12" cy="12" r="10" />
217
+ </svg>
218
+ );
219
+ }
220
+ };
221
+
222
+ const formatTime = (ts: number) => {
223
+ const d = new Date(ts);
224
+ return d.toLocaleTimeString();
225
+ };
226
+
227
+ return (
228
+ <div className="flex flex-col h-screen p-8 font-sans bg-ink-50 text-ink-800">
229
+ <h2 className="text-lg font-semibold mb-4 text-ink-900">
230
+ Media Studio Setup
231
+ </h2>
232
+
233
+ {error && <div className="text-red-600 mb-4">Error: {error}</div>}
234
+ {complete && !error && (
235
+ <div className="text-ink-600 mb-4 font-bold">
236
+ Setup complete! Server running on port {port}
237
+ </div>
238
+ )}
239
+ <div className="mb-4">
240
+ {steps.map((step, i) => (
241
+ <div
242
+ key={i}
243
+ className="flex items-center gap-2 py-2 transition-opacity"
244
+ style={{ opacity: step.status === "pending" ? 0.5 : 1 }}
245
+ >
246
+ <StatusIcon status={step.status} />
247
+ <span className="text-sm">{step.label}</span>
248
+ </div>
249
+ ))}
250
+ </div>
251
+ {/* Log display panel */}
252
+ <div className="flex-1 flex flex-col min-h-0 border border-ink-200 rounded-2xl overflow-hidden bg-white shadow-card">
253
+ <div className="flex items-center justify-between px-4 py-2.5 bg-ink-50 border-b border-ink-200">
254
+ <span className="text-xs font-semibold text-ink-600/80 uppercase tracking-wider">
255
+ Logs
256
+ </span>
257
+ <span className="text-xs text-ink-500">{logs.length} entries</span>
258
+ </div>
259
+ <div className="flex-1 overflow-y-auto p-4 font-mono text-xs leading-relaxed">
260
+ {logs.length === 0 ? (
261
+ <div className="text-ink-500 italic">Waiting for logs...</div>
262
+ ) : (
263
+ logs.map((entry) => (
264
+ <div
265
+ key={entry.id}
266
+ className="flex items-start gap-2 py-0.5 hover:bg-ink-100 rounded px-1"
267
+ >
268
+ <LogIcon level={entry.level} />
269
+ <span className="text-ink-500 shrink-0 select-none">
270
+ {formatTime(entry.timestamp)}
271
+ </span>
272
+ <span
273
+ className={
274
+ entry.level === "error"
275
+ ? "text-red-600"
276
+ : entry.level === "warn"
277
+ ? "text-amber-600"
278
+ : "text-ink-700"
279
+ }
280
+ >
281
+ {entry.message}
282
+ </span>
283
+ </div>
284
+ ))
285
+ )}
286
+ <div ref={logEndRef} />
287
+ </div>
288
+ </div>
289
+ </div>
290
+ );
291
+ }
292
+
293
+ export default SetupPage;