egaki 0.6.0 → 0.7.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/CHANGELOG.md +145 -9
- package/dist/cli/cache-utils.d.ts +33 -0
- package/dist/cli/cache-utils.d.ts.map +1 -0
- package/dist/cli/cache-utils.js +157 -0
- package/dist/cli/cached-generate.d.ts +105 -0
- package/dist/cli/cached-generate.d.ts.map +1 -0
- package/dist/cli/cached-generate.js +208 -0
- package/dist/cli/cached-generate.test.d.ts +11 -0
- package/dist/cli/cached-generate.test.d.ts.map +1 -0
- package/dist/cli/cached-generate.test.js +431 -0
- package/dist/cli/cartesia-provider.d.ts +16 -0
- package/dist/cli/cartesia-provider.d.ts.map +1 -0
- package/dist/cli/cartesia-provider.js +184 -0
- package/dist/cli/chatgpt-auth.d.ts.map +1 -0
- package/dist/cli/cli.d.ts +4 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/{cli.js → cli/cli.js} +626 -600
- package/dist/cli/clone-generate.d.ts +26 -0
- package/dist/cli/clone-generate.d.ts.map +1 -0
- package/dist/cli/clone-generate.js +148 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/{credentials.js → cli/credentials.js} +20 -0
- package/dist/cli/elevenlabs-speech-provider.d.ts +26 -0
- package/dist/cli/elevenlabs-speech-provider.d.ts.map +1 -0
- package/dist/cli/elevenlabs-speech-provider.js +199 -0
- package/dist/cli/generate.d.ts +140 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +604 -0
- package/dist/cli/generate.test.d.ts +2 -0
- package/dist/cli/generate.test.d.ts.map +1 -0
- package/dist/cli/generate.test.js +131 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +7 -0
- package/dist/{model-catalog.d.ts → cli/model-catalog.d.ts} +6 -0
- package/dist/cli/model-catalog.d.ts.map +1 -0
- package/dist/{model-catalog.js → cli/model-catalog.js} +714 -4
- package/dist/{models.d.ts → cli/models.d.ts} +12 -5
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/{models.js → cli/models.js} +58 -57
- package/dist/cli/open-browser.d.ts.map +1 -0
- package/dist/cli/openai-speech-provider.d.ts +3 -0
- package/dist/cli/openai-speech-provider.d.ts.map +1 -0
- package/dist/cli/openai-speech-provider.js +28 -0
- package/dist/cli/separation-generate.d.ts +34 -0
- package/dist/cli/separation-generate.d.ts.map +1 -0
- package/dist/cli/separation-generate.js +117 -0
- package/dist/cli/speech-catalog.d.ts +35 -0
- package/dist/cli/speech-catalog.d.ts.map +1 -0
- package/dist/cli/speech-catalog.js +195 -0
- package/dist/cli/speech-generate.d.ts +86 -0
- package/dist/cli/speech-generate.d.ts.map +1 -0
- package/dist/cli/speech-generate.js +156 -0
- package/dist/cli/speech-models.d.ts +8 -0
- package/dist/cli/speech-models.d.ts.map +1 -0
- package/dist/cli/speech-models.js +109 -0
- package/dist/cli/speech-provider.test.d.ts +2 -0
- package/dist/cli/speech-provider.test.d.ts.map +1 -0
- package/dist/cli/speech-provider.test.js +197 -0
- package/dist/cli/subscription.d.ts.map +1 -0
- package/dist/cli/transcription-catalog.d.ts +35 -0
- package/dist/cli/transcription-catalog.d.ts.map +1 -0
- package/dist/cli/transcription-catalog.js +192 -0
- package/dist/cli/transcription-generate.d.ts +62 -0
- package/dist/cli/transcription-generate.d.ts.map +1 -0
- package/dist/cli/transcription-generate.js +144 -0
- package/dist/cli/transcription-models.d.ts +9 -0
- package/dist/cli/transcription-models.d.ts.map +1 -0
- package/dist/cli/transcription-models.js +100 -0
- package/dist/cli/transcription-providers.d.ts +22 -0
- package/dist/cli/transcription-providers.d.ts.map +1 -0
- package/dist/cli/transcription-providers.js +290 -0
- package/dist/cli/video-model-catalog.d.ts.map +1 -0
- package/dist/cli/xai-auth.d.ts.map +1 -0
- package/dist/{xai-auth.js → cli/xai-auth.js} +1 -1
- package/dist/vite/angled-screen.d.ts +57 -0
- package/dist/vite/angled-screen.d.ts.map +1 -0
- package/dist/vite/angled-screen.js +115 -0
- package/dist/vite/app.d.ts +51 -0
- package/dist/vite/app.d.ts.map +1 -0
- package/dist/vite/app.js +150 -0
- package/dist/vite/bands-shader.d.ts +47 -0
- package/dist/vite/bands-shader.d.ts.map +1 -0
- package/dist/vite/bands-shader.js +267 -0
- package/dist/vite/code-block.d.ts +107 -0
- package/dist/vite/code-block.d.ts.map +1 -0
- package/dist/vite/code-block.js +641 -0
- package/dist/vite/components.d.ts +36 -0
- package/dist/vite/components.d.ts.map +1 -0
- package/dist/vite/components.js +113 -0
- package/dist/vite/dispersion-rings-shader.d.ts +44 -0
- package/dist/vite/dispersion-rings-shader.d.ts.map +1 -0
- package/dist/vite/dispersion-rings-shader.js +282 -0
- package/dist/vite/easing-curves.d.ts +129 -0
- package/dist/vite/easing-curves.d.ts.map +1 -0
- package/dist/vite/easing-curves.js +584 -0
- package/dist/vite/easing-curves.test.d.ts +2 -0
- package/dist/vite/easing-curves.test.d.ts.map +1 -0
- package/dist/vite/easing-curves.test.js +200 -0
- package/dist/vite/generated-media-client.d.ts +35 -0
- package/dist/vite/generated-media-client.d.ts.map +1 -0
- package/dist/vite/generated-media-client.js +76 -0
- package/dist/vite/keyframes.d.ts +129 -0
- package/dist/vite/keyframes.d.ts.map +1 -0
- package/dist/vite/keyframes.js +194 -0
- package/dist/vite/layout-editor.d.ts +45 -0
- package/dist/vite/layout-editor.d.ts.map +1 -0
- package/dist/vite/layout-editor.js +587 -0
- package/dist/vite/layout-transition.d.ts +136 -0
- package/dist/vite/layout-transition.d.ts.map +1 -0
- package/dist/vite/layout-transition.js +581 -0
- package/dist/vite/liquid-gradient-shader.d.ts +62 -0
- package/dist/vite/liquid-gradient-shader.d.ts.map +1 -0
- package/dist/vite/liquid-gradient-shader.js +413 -0
- package/dist/vite/mdx-client.d.ts +15 -0
- package/dist/vite/mdx-client.d.ts.map +1 -0
- package/dist/vite/mdx-client.js +265 -0
- package/dist/vite/mdx-parse.d.ts +102 -0
- package/dist/vite/mdx-parse.d.ts.map +1 -0
- package/dist/vite/mdx-parse.js +251 -0
- package/dist/vite/mdx-provided-components.d.ts +18 -0
- package/dist/vite/mdx-provided-components.d.ts.map +1 -0
- package/dist/vite/mdx-provided-components.js +14 -0
- package/dist/vite/mdx-video.d.ts +327 -0
- package/dist/vite/mdx-video.d.ts.map +1 -0
- package/dist/vite/mdx-video.js +596 -0
- package/dist/vite/mdx-video.test.d.ts +9 -0
- package/dist/vite/mdx-video.test.d.ts.map +1 -0
- package/dist/vite/mdx-video.test.js +1945 -0
- package/dist/vite/media-components.d.ts +45 -0
- package/dist/vite/media-components.d.ts.map +1 -0
- package/dist/vite/media-components.js +355 -0
- package/dist/vite/media-duration-store.d.ts +66 -0
- package/dist/vite/media-duration-store.d.ts.map +1 -0
- package/dist/vite/media-duration-store.js +204 -0
- package/dist/vite/player-page.d.ts +35 -0
- package/dist/vite/player-page.d.ts.map +1 -0
- package/dist/vite/player-page.js +720 -0
- package/dist/vite/render-client.d.ts +18 -0
- package/dist/vite/render-client.d.ts.map +1 -0
- package/dist/vite/render-client.js +67 -0
- package/dist/vite/sdk.d.ts +221 -0
- package/dist/vite/sdk.d.ts.map +1 -0
- package/dist/vite/sdk.js +355 -0
- package/dist/vite/server-components.d.ts +55 -0
- package/dist/vite/server-components.d.ts.map +1 -0
- package/dist/vite/server-components.js +156 -0
- package/dist/vite/server-mdx.d.ts +74 -0
- package/dist/vite/server-mdx.d.ts.map +1 -0
- package/dist/vite/server-mdx.js +259 -0
- package/dist/vite/shader-renderer.d.ts +48 -0
- package/dist/vite/shader-renderer.d.ts.map +1 -0
- package/dist/vite/shader-renderer.js +411 -0
- package/dist/vite/store-hooks.d.ts +12 -0
- package/dist/vite/store-hooks.d.ts.map +1 -0
- package/dist/vite/store-hooks.js +93 -0
- package/dist/vite/store.d.ts +75 -0
- package/dist/vite/store.d.ts.map +1 -0
- package/dist/vite/store.js +52 -0
- package/dist/vite/store.test.d.ts +6 -0
- package/dist/vite/store.test.d.ts.map +1 -0
- package/dist/vite/store.test.js +172 -0
- package/dist/vite/tweakpane-hook.d.ts +94 -0
- package/dist/vite/tweakpane-hook.d.ts.map +1 -0
- package/dist/vite/tweakpane-hook.js +450 -0
- package/dist/vite/vite-plugin.d.ts +28 -0
- package/dist/vite/vite-plugin.d.ts.map +1 -0
- package/dist/vite/vite-plugin.js +539 -0
- package/dist/vite/wave-gradient-shader.d.ts +41 -0
- package/dist/vite/wave-gradient-shader.d.ts.map +1 -0
- package/dist/vite/wave-gradient-shader.js +207 -0
- package/package.json +101 -24
- package/skills/egaki/SKILL.md +162 -1
- package/src/cli/cache-utils.ts +169 -0
- package/src/cli/cached-generate.test.ts +531 -0
- package/src/cli/cached-generate.ts +348 -0
- package/src/cli/cartesia-provider.ts +249 -0
- package/src/{cli.ts → cli/cli.ts} +836 -884
- package/src/cli/clone-generate.ts +202 -0
- package/src/{credentials.ts → cli/credentials.ts} +20 -0
- package/src/cli/elevenlabs-speech-provider.ts +243 -0
- package/src/cli/generate.test.ts +166 -0
- package/src/cli/generate.ts +912 -0
- package/src/cli/main.ts +8 -0
- package/src/{model-catalog.ts → cli/model-catalog.ts} +787 -58
- package/src/{models.ts → cli/models.ts} +65 -86
- package/src/cli/openai-speech-provider.ts +34 -0
- package/src/cli/separation-generate.ts +187 -0
- package/src/cli/speech-catalog.ts +253 -0
- package/src/cli/speech-generate.ts +275 -0
- package/src/cli/speech-models.ts +146 -0
- package/src/cli/speech-provider.test.ts +226 -0
- package/src/cli/transcription-catalog.ts +250 -0
- package/src/cli/transcription-generate.ts +214 -0
- package/src/cli/transcription-models.ts +136 -0
- package/src/cli/transcription-providers.ts +427 -0
- package/src/{xai-auth.ts → cli/xai-auth.ts} +1 -1
- package/src/vite/angled-screen.tsx +214 -0
- package/src/vite/app.tsx +197 -0
- package/src/vite/bands-shader.tsx +319 -0
- package/src/vite/code-block.tsx +939 -0
- package/src/vite/components.tsx +278 -0
- package/src/vite/dispersion-rings-shader.tsx +331 -0
- package/src/vite/easing-curves.test.ts +232 -0
- package/src/vite/easing-curves.ts +743 -0
- package/src/vite/generated-media-client.tsx +121 -0
- package/src/vite/keyframes.tsx +347 -0
- package/src/vite/layout-editor.tsx +709 -0
- package/src/vite/layout-transition.tsx +706 -0
- package/src/vite/liquid-gradient-shader.tsx +474 -0
- package/src/vite/mdx-client.tsx +420 -0
- package/src/vite/mdx-parse.ts +343 -0
- package/src/vite/mdx-provided-components.ts +19 -0
- package/src/vite/mdx-video.test.tsx +2219 -0
- package/src/vite/mdx-video.tsx +976 -0
- package/src/vite/media-components.tsx +473 -0
- package/src/vite/media-duration-store.ts +225 -0
- package/src/vite/motion-timing.ts +194 -0
- package/src/vite/player-page.tsx +1107 -0
- package/src/vite/render-client.ts +84 -0
- package/src/vite/sdk.ts +598 -0
- package/src/vite/server-components.tsx +241 -0
- package/src/vite/server-mdx.ts +285 -0
- package/src/vite/shader-renderer.tsx +535 -0
- package/src/vite/store-hooks.ts +117 -0
- package/src/vite/store.test.ts +202 -0
- package/src/vite/store.ts +115 -0
- package/src/vite/styles.css +21 -0
- package/src/vite/tweakpane-hook.tsx +593 -0
- package/src/vite/virtual-modules.d.ts +30 -0
- package/src/vite/vite-plugin.ts +585 -0
- package/src/vite/wave-gradient-shader.tsx +253 -0
- package/README.md +0 -370
- package/dist/antigravity-auth.d.ts +0 -15
- package/dist/antigravity-auth.d.ts.map +0 -1
- package/dist/antigravity-auth.js +0 -544
- package/dist/antigravity-image.d.ts +0 -11
- package/dist/antigravity-image.d.ts.map +0 -1
- package/dist/antigravity-image.js +0 -285
- package/dist/chatgpt-auth.d.ts.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/credentials.d.ts.map +0 -1
- package/dist/gateway-model-candidates.generated.d.ts +0 -11
- package/dist/gateway-model-candidates.generated.d.ts.map +0 -1
- package/dist/gateway-model-candidates.generated.js +0 -64
- package/dist/login.d.ts.map +0 -1
- package/dist/model-catalog.d.ts.map +0 -1
- package/dist/models.d.ts.map +0 -1
- package/dist/open-browser.d.ts.map +0 -1
- package/dist/subscription.d.ts.map +0 -1
- package/dist/video-model-catalog.d.ts.map +0 -1
- package/dist/xai-auth.d.ts.map +0 -1
- /package/dist/{chatgpt-auth.d.ts → cli/chatgpt-auth.d.ts} +0 -0
- /package/dist/{chatgpt-auth.js → cli/chatgpt-auth.js} +0 -0
- /package/dist/{credentials.d.ts → cli/credentials.d.ts} +0 -0
- /package/dist/{login.d.ts → cli/login.d.ts} +0 -0
- /package/dist/{login.js → cli/login.js} +0 -0
- /package/dist/{open-browser.d.ts → cli/open-browser.d.ts} +0 -0
- /package/dist/{open-browser.js → cli/open-browser.js} +0 -0
- /package/dist/{subscription.d.ts → cli/subscription.d.ts} +0 -0
- /package/dist/{subscription.js → cli/subscription.js} +0 -0
- /package/dist/{video-model-catalog.d.ts → cli/video-model-catalog.d.ts} +0 -0
- /package/dist/{video-model-catalog.js → cli/video-model-catalog.js} +0 -0
- /package/dist/{xai-auth.d.ts → cli/xai-auth.d.ts} +0 -0
- /package/src/{chatgpt-auth.ts → cli/chatgpt-auth.ts} +0 -0
- /package/src/{login.ts → cli/login.ts} +0 -0
- /package/src/{open-browser.ts → cli/open-browser.ts} +0 -0
- /package/src/{subscription.ts → cli/subscription.ts} +0 -0
- /package/src/{video-model-catalog.ts → cli/video-model-catalog.ts} +0 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { defineShader } from "./shader-renderer.js";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Fragment shader body
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
/**
|
|
7
|
+
* Raw GLSL fragment body from GradientWave.js.
|
|
8
|
+
* The defineShader engine prepends #version, precision, v_uv, fragColor,
|
|
9
|
+
* uniform declarations, and built-in uniforms automatically.
|
|
10
|
+
*
|
|
11
|
+
* Algorithm overview:
|
|
12
|
+
* 1. Noise rotation: seed-derived hash noise determines a rotation angle
|
|
13
|
+
* per pixel, creating an organic swirling base pattern
|
|
14
|
+
* 2. Wave warp: UV coordinates are distorted by a seed-modulated wave
|
|
15
|
+
* function with configurable frequency, angle, amplitude, and softness
|
|
16
|
+
* 3. Layer blend: the rotated UVs and warped UVs are mixed via blendAmount,
|
|
17
|
+
* then two color layers (each a smoothstep gradient between 2 colors)
|
|
18
|
+
* are combined with a vertical smoothstep for the final output
|
|
19
|
+
* 4. Tone mapping: a subtle S-curve (col*col + 0.5*sqrt(col)) is mixed in
|
|
20
|
+
* at 30% to add richness
|
|
21
|
+
*/
|
|
22
|
+
const FRAGMENT_SOURCE = `
|
|
23
|
+
#define S(a,b,t) smoothstep(a,b,t)
|
|
24
|
+
|
|
25
|
+
mat2 Rot(float a) {
|
|
26
|
+
float s = sin(a), c = cos(a);
|
|
27
|
+
return mat2(c, -s, s, c);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
vec2 hash(vec2 p) {
|
|
31
|
+
float s = u_seed;
|
|
32
|
+
vec2 k1 = vec2(2127.1 + s * 13.37, 81.17 + s * 7.31);
|
|
33
|
+
vec2 k2 = vec2(1269.5 + s * 11.13, 283.37 + s * 5.79);
|
|
34
|
+
p = vec2(dot(p, k1), dot(p, k2));
|
|
35
|
+
return fract(sin(p) * (43758.5453 + s * 1.618));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
float noise(in vec2 p) {
|
|
39
|
+
vec2 i = floor(p);
|
|
40
|
+
vec2 f = fract(p);
|
|
41
|
+
vec2 u = f * f * (3.0 - 2.0 * f);
|
|
42
|
+
float n = mix(
|
|
43
|
+
mix(dot(-1.0 + 2.0 * hash(i), f),
|
|
44
|
+
dot(-1.0 + 2.0 * hash(i + vec2(1.0, 0.0)), f - vec2(1.0, 0.0)), u.x),
|
|
45
|
+
mix(dot(-1.0 + 2.0 * hash(i + vec2(0.0, 1.0)), f - vec2(0.0, 1.0)),
|
|
46
|
+
dot(-1.0 + 2.0 * hash(i + vec2(1.0, 1.0)), f - vec2(1.0, 1.0)), u.x),
|
|
47
|
+
u.y
|
|
48
|
+
);
|
|
49
|
+
return 0.5 + 0.5 * n;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
vec3 getColor(int idx) {
|
|
53
|
+
if (u_colors_length < 1) return vec3(0.0);
|
|
54
|
+
int safeIdx = clamp(idx, 0, u_colors_length - 1);
|
|
55
|
+
return u_colors[safeIdx].rgb;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
float seedF(float base) {
|
|
59
|
+
return base * (1.0 + 0.5 * sin(u_seed * 3.17 + base));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
vec2 warpUV(vec2 uv) {
|
|
63
|
+
float t = u_time * u_waveSpeed;
|
|
64
|
+
|
|
65
|
+
float angleOffset = sin(u_seed * 2.73) * 30.0;
|
|
66
|
+
mat2 dirRot = Rot(radians(u_waveAngle + angleOffset));
|
|
67
|
+
vec2 ruv = dirRot * uv;
|
|
68
|
+
|
|
69
|
+
float fxMod = seedF(u_waveFreqX);
|
|
70
|
+
float fyMod = seedF(u_waveFreqY);
|
|
71
|
+
|
|
72
|
+
float phaseX = fract(sin(u_seed * 7.19) * 437.58) * 6.2832;
|
|
73
|
+
float phaseY = fract(cos(u_seed * 3.41) * 291.37) * 6.2832;
|
|
74
|
+
|
|
75
|
+
// Core wave with seed-dependent harmonics
|
|
76
|
+
float harmonic = sin(u_seed * 1.23) * 0.5;
|
|
77
|
+
float a = fyMod * ruv.y - sin(ruv.x * fxMod + ruv.y - t + phaseX);
|
|
78
|
+
a += harmonic * sin(ruv.x * fxMod * 2.0 + ruv.y * 0.5 + t * 0.7 + phaseY);
|
|
79
|
+
|
|
80
|
+
// Smoothstep mask
|
|
81
|
+
a = smoothstep(
|
|
82
|
+
cos(a) * u_maskSoftness,
|
|
83
|
+
sin(a) * u_maskSoftness + 3.,
|
|
84
|
+
cos(a - fyMod * ruv.y) - sin(a - fxMod * ruv.x)
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
a *= u_waveAmplitude;
|
|
88
|
+
|
|
89
|
+
uv = cos(a) * uv + sin(a) * vec2(-uv.y, uv.x);
|
|
90
|
+
return uv;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
void main() {
|
|
94
|
+
vec2 fragCoord = v_uv * u_resolution;
|
|
95
|
+
vec2 uv = fragCoord / u_resolution.xy;
|
|
96
|
+
float ratio = u_resolution.x / u_resolution.y;
|
|
97
|
+
float t = u_time * u_waveSpeed;
|
|
98
|
+
|
|
99
|
+
vec2 tuv = uv - 0.5;
|
|
100
|
+
|
|
101
|
+
vec2 seedShift = vec2(sin(u_seed * 4.37), cos(u_seed * 5.91)) * 100.0;
|
|
102
|
+
float degree = noise(vec2(t * 0.1, tuv.x * tuv.y) + seedShift);
|
|
103
|
+
tuv.y *= 1.0 / ratio;
|
|
104
|
+
tuv *= Rot(radians((degree - 0.5) * 720.0 + 180.0));
|
|
105
|
+
tuv.y *= ratio;
|
|
106
|
+
|
|
107
|
+
// Seed-rotate uv2 before warping
|
|
108
|
+
vec2 uv2 = (fragCoord * 2.0 - u_resolution.xy) / (u_resolution.x + u_resolution.y) * 2.0;
|
|
109
|
+
float preRotAngle = fract(sin(u_seed * 5.63) * 173.29) * 6.2832;
|
|
110
|
+
uv2 *= Rot(preRotAngle);
|
|
111
|
+
vec2 warped = warpUV(uv2) * 0.5 + 0.5;
|
|
112
|
+
|
|
113
|
+
vec2 blendUV = mix(tuv, warped - 0.5, u_blendAmount);
|
|
114
|
+
|
|
115
|
+
float layerRot1 = -5.0 + sin(u_seed * 1.83) * 20.0;
|
|
116
|
+
float layerRot2 = 10.0 + cos(u_seed * 2.47) * 20.0;
|
|
117
|
+
|
|
118
|
+
vec3 c0 = getColor(0);
|
|
119
|
+
vec3 c1 = getColor(1);
|
|
120
|
+
vec3 c2 = getColor(2);
|
|
121
|
+
vec3 c3 = getColor(3);
|
|
122
|
+
|
|
123
|
+
vec3 layer1 = mix(c0, c2, S(-0.3, 0.3, (blendUV * Rot(radians(layerRot1))).x));
|
|
124
|
+
vec3 layer2 = mix(c3, c1, S(-0.3, 0.3, (blendUV * Rot(radians(layerRot2))).x));
|
|
125
|
+
vec3 col = mix(layer1, layer2, S(0.3, -0.3, blendUV.y));
|
|
126
|
+
|
|
127
|
+
col = mix(col, col * col + 0.5 * sqrt(col), 0.3);
|
|
128
|
+
|
|
129
|
+
fragColor = vec4(col, 1.0);
|
|
130
|
+
}
|
|
131
|
+
`;
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// Component
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
/**
|
|
136
|
+
* Property controls matching the original Framer GradientWave module.
|
|
137
|
+
* Ranges, defaults, and step sizes are preserved from the original.
|
|
138
|
+
*/
|
|
139
|
+
export const WaveGradientShader = defineShader({
|
|
140
|
+
title: 'WaveGradientShader',
|
|
141
|
+
fragment: FRAGMENT_SOURCE,
|
|
142
|
+
propertyControls: {
|
|
143
|
+
colors: {
|
|
144
|
+
type: 'array',
|
|
145
|
+
control: { type: 'color' },
|
|
146
|
+
maxCount: 4,
|
|
147
|
+
maxVisible: 4,
|
|
148
|
+
defaultValue: ['#FF3624', '#9EABFF', '#FFAE00', '#E29EFF'],
|
|
149
|
+
},
|
|
150
|
+
seed: {
|
|
151
|
+
type: 'number',
|
|
152
|
+
defaultValue: 32,
|
|
153
|
+
min: 0,
|
|
154
|
+
max: 100,
|
|
155
|
+
step: 1,
|
|
156
|
+
},
|
|
157
|
+
waveSpeed: {
|
|
158
|
+
type: 'number',
|
|
159
|
+
defaultValue: 1.5,
|
|
160
|
+
min: 0,
|
|
161
|
+
max: 3,
|
|
162
|
+
step: 0.01,
|
|
163
|
+
},
|
|
164
|
+
waveFreqX: {
|
|
165
|
+
type: 'number',
|
|
166
|
+
defaultValue: 0.9,
|
|
167
|
+
min: 0.1,
|
|
168
|
+
max: 6,
|
|
169
|
+
step: 0.1,
|
|
170
|
+
},
|
|
171
|
+
waveFreqY: {
|
|
172
|
+
type: 'number',
|
|
173
|
+
defaultValue: 6,
|
|
174
|
+
min: 0.1,
|
|
175
|
+
max: 6,
|
|
176
|
+
step: 0.1,
|
|
177
|
+
},
|
|
178
|
+
waveAngle: {
|
|
179
|
+
type: 'number',
|
|
180
|
+
defaultValue: 105,
|
|
181
|
+
min: -180,
|
|
182
|
+
max: 180,
|
|
183
|
+
step: 1,
|
|
184
|
+
},
|
|
185
|
+
waveAmplitude: {
|
|
186
|
+
type: 'number',
|
|
187
|
+
defaultValue: 2.1,
|
|
188
|
+
min: 0.5,
|
|
189
|
+
max: 3,
|
|
190
|
+
step: 0.01,
|
|
191
|
+
},
|
|
192
|
+
maskSoftness: {
|
|
193
|
+
type: 'number',
|
|
194
|
+
defaultValue: 0.74,
|
|
195
|
+
min: 0.01,
|
|
196
|
+
max: 2,
|
|
197
|
+
step: 0.01,
|
|
198
|
+
},
|
|
199
|
+
blendAmount: {
|
|
200
|
+
type: 'number',
|
|
201
|
+
defaultValue: 0.54,
|
|
202
|
+
min: 0,
|
|
203
|
+
max: 1,
|
|
204
|
+
step: 0.01,
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
});
|
package/package.json
CHANGED
|
@@ -1,30 +1,58 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "egaki",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"description": "AI image, video, and speech generation CLI with MDX-to-video framework",
|
|
6
|
+
"main": "./dist/cli/main.js",
|
|
7
|
+
"types": "./dist/cli/cli.d.ts",
|
|
7
8
|
"exports": {
|
|
8
9
|
"./package.json": "./package.json",
|
|
9
10
|
".": {
|
|
10
|
-
"types": "./dist/cli.d.ts",
|
|
11
|
-
"default": "./dist/cli.js"
|
|
11
|
+
"types": "./dist/cli/cli.d.ts",
|
|
12
|
+
"default": "./dist/cli/cli.js"
|
|
12
13
|
},
|
|
13
|
-
"./
|
|
14
|
-
"types": "./
|
|
15
|
-
"default": "./
|
|
14
|
+
"./generate": {
|
|
15
|
+
"types": "./dist/cli/generate.d.ts",
|
|
16
|
+
"default": "./dist/cli/generate.js"
|
|
16
17
|
},
|
|
17
|
-
"./
|
|
18
|
-
"types": "./src
|
|
19
|
-
"default": "./src
|
|
18
|
+
"./video": {
|
|
19
|
+
"types": "./src/vite/mdx-video.tsx",
|
|
20
|
+
"default": "./src/vite/mdx-video.tsx"
|
|
21
|
+
},
|
|
22
|
+
"./text-to-speech": {
|
|
23
|
+
"types": "./src/vite/server-components.tsx",
|
|
24
|
+
"default": "./src/vite/server-components.tsx"
|
|
25
|
+
},
|
|
26
|
+
"./generate-media": {
|
|
27
|
+
"types": "./src/vite/server-components.tsx",
|
|
28
|
+
"default": "./src/vite/server-components.tsx"
|
|
29
|
+
},
|
|
30
|
+
"./cached-generate": {
|
|
31
|
+
"types": "./dist/cli/cached-generate.d.ts",
|
|
32
|
+
"default": "./dist/cli/cached-generate.js"
|
|
33
|
+
},
|
|
34
|
+
"./vite": {
|
|
35
|
+
"types": "./dist/vite/vite-plugin.d.ts",
|
|
36
|
+
"default": "./dist/vite/vite-plugin.js"
|
|
37
|
+
},
|
|
38
|
+
"./mdx-components": {
|
|
39
|
+
"types": "./src/vite/mdx-provided-components.ts",
|
|
40
|
+
"default": "./src/vite/mdx-provided-components.ts"
|
|
41
|
+
},
|
|
42
|
+
"./src/cli/*": {
|
|
43
|
+
"types": "./src/cli/*.ts",
|
|
44
|
+
"default": "./src/cli/*.ts"
|
|
45
|
+
},
|
|
46
|
+
"./src/vite/*": {
|
|
47
|
+
"types": "./src/vite/*.tsx",
|
|
48
|
+
"default": "./src/vite/*.tsx"
|
|
20
49
|
}
|
|
21
50
|
},
|
|
22
|
-
"
|
|
23
|
-
"bin": "dist/cli.js",
|
|
51
|
+
"bin": "dist/cli/main.js",
|
|
24
52
|
"repository": {
|
|
25
53
|
"type": "git",
|
|
26
54
|
"url": "https://github.com/remorses/egaki.git",
|
|
27
|
-
"directory": "
|
|
55
|
+
"directory": "cli"
|
|
28
56
|
},
|
|
29
57
|
"homepage": "https://github.com/remorses/egaki#readme",
|
|
30
58
|
"bugs": {
|
|
@@ -34,42 +62,91 @@
|
|
|
34
62
|
"src",
|
|
35
63
|
"dist",
|
|
36
64
|
"skills",
|
|
37
|
-
"README.md",
|
|
38
65
|
"CHANGELOG.md"
|
|
39
66
|
],
|
|
40
67
|
"keywords": [
|
|
41
68
|
"ai",
|
|
42
69
|
"image",
|
|
43
70
|
"video",
|
|
71
|
+
"speech",
|
|
72
|
+
"tts",
|
|
44
73
|
"generation",
|
|
45
74
|
"cli",
|
|
46
|
-
"gemini"
|
|
75
|
+
"gemini",
|
|
76
|
+
"remotion",
|
|
77
|
+
"mdx",
|
|
78
|
+
"vite"
|
|
47
79
|
],
|
|
48
80
|
"license": "MIT",
|
|
49
81
|
"dependencies": {
|
|
82
|
+
"@ai-sdk/bytedance": "^1.0.14",
|
|
50
83
|
"@ai-sdk/fal": "2.0.34",
|
|
51
84
|
"@ai-sdk/google": "3.0.33",
|
|
52
|
-
"@ai-sdk/google-vertex": "^4.0.
|
|
85
|
+
"@ai-sdk/google-vertex": "^4.0.137",
|
|
53
86
|
"@ai-sdk/openai": "3.0.36",
|
|
54
87
|
"@ai-sdk/replicate": "2.0.20",
|
|
55
|
-
"@ai-sdk/xai": "^3.0.
|
|
88
|
+
"@ai-sdk/xai": "^3.0.92",
|
|
56
89
|
"@clack/prompts": "^1.0.1",
|
|
90
|
+
"@fal-ai/client": "^1.10.1",
|
|
91
|
+
"@remotion/media": "4.0.475",
|
|
92
|
+
"@remotion/player": "4.0.475",
|
|
93
|
+
"@remotion/web-renderer": "4.0.475",
|
|
94
|
+
"@tailwindcss/vite": "^4.2.2",
|
|
95
|
+
"@tweakpane/core": "^2.0.5",
|
|
96
|
+
"@tweakpane/plugin-essentials": "^0.2.1",
|
|
57
97
|
"ai": "6.0.103",
|
|
58
98
|
"eventsource-parser": "^3.0.6",
|
|
59
99
|
"goke": "^6.12.1",
|
|
60
100
|
"js-yaml": "^4.1.1",
|
|
101
|
+
"mediabunny": "^1.46.0",
|
|
102
|
+
"moveable": "^0.53.0",
|
|
61
103
|
"picocolors": "^1.1.1",
|
|
104
|
+
"react": "19.2.7",
|
|
105
|
+
"react-dom": "19.2.7",
|
|
106
|
+
"remotion": "4.0.475",
|
|
107
|
+
"safe-mdx": "^1.11.3",
|
|
108
|
+
"shiki": "^4.2.0",
|
|
62
109
|
"string-dedent": "^3.0.2",
|
|
63
|
-
"
|
|
110
|
+
"tailwindcss": "^4.3.0",
|
|
111
|
+
"tweakpane": "^4.0.5",
|
|
112
|
+
"yaml": "^2.9.0",
|
|
113
|
+
"zod": "^4.3.6",
|
|
114
|
+
"zustand": "^5.0.14"
|
|
115
|
+
},
|
|
116
|
+
"peerDependencies": {
|
|
117
|
+
"@vitejs/plugin-react": ">=6",
|
|
118
|
+
"motion": ">=12",
|
|
119
|
+
"motion-dom": ">=12",
|
|
120
|
+
"motion-utils": ">=12",
|
|
121
|
+
"spiceflow": ">=1.26.0-rsc.5"
|
|
122
|
+
},
|
|
123
|
+
"peerDependenciesMeta": {
|
|
124
|
+
"@vitejs/plugin-react": {
|
|
125
|
+
"optional": true
|
|
126
|
+
},
|
|
127
|
+
"motion": {
|
|
128
|
+
"optional": true
|
|
129
|
+
},
|
|
130
|
+
"motion-dom": {
|
|
131
|
+
"optional": true
|
|
132
|
+
},
|
|
133
|
+
"motion-utils": {
|
|
134
|
+
"optional": true
|
|
135
|
+
},
|
|
136
|
+
"spiceflow": {
|
|
137
|
+
"optional": true
|
|
138
|
+
}
|
|
64
139
|
},
|
|
65
140
|
"devDependencies": {
|
|
66
141
|
"@types/js-yaml": "^4.0.9",
|
|
67
|
-
"@types/
|
|
68
|
-
"
|
|
69
|
-
"
|
|
142
|
+
"@types/react": "^19.2.17",
|
|
143
|
+
"@vitejs/plugin-react": "^6.0.2",
|
|
144
|
+
"vite": "^8.0.10",
|
|
145
|
+
"vitest": "^4.1.8"
|
|
70
146
|
},
|
|
71
147
|
"scripts": {
|
|
72
|
-
"dev": "tsx src/cli.ts",
|
|
73
|
-
"build": "tsc && chmod +x dist/cli.js"
|
|
148
|
+
"dev": "tsx src/cli/cli.ts",
|
|
149
|
+
"build": "tsc && chmod +x dist/cli/main.js",
|
|
150
|
+
"test": "vitest run"
|
|
74
151
|
}
|
|
75
152
|
}
|
package/skills/egaki/SKILL.md
CHANGED
|
@@ -10,7 +10,7 @@ description: >
|
|
|
10
10
|
|
|
11
11
|
Generate AI images and videos from the terminal.
|
|
12
12
|
Use this for text-to-image, image editing, mask-based edits, text-to-video,
|
|
13
|
-
image-to-video, and model discovery.
|
|
13
|
+
image-to-video, audio stem separation, and model discovery.
|
|
14
14
|
|
|
15
15
|
## Install
|
|
16
16
|
|
|
@@ -54,6 +54,23 @@ The `--model` / `-m` flag is **optional** on both `egaki image` and `egaki video
|
|
|
54
54
|
|
|
55
55
|
Agents should always pass `-m` explicitly to avoid the interactive picker.
|
|
56
56
|
|
|
57
|
+
### Preferred image models
|
|
58
|
+
|
|
59
|
+
When the user does not specify a model, prefer these in order:
|
|
60
|
+
|
|
61
|
+
1. **`gpt-image-1`** (or `gpt-image-2` / `chatgpt-image-latest` if available)
|
|
62
|
+
2. **`grok-imagine-image`** (xAI Grok)
|
|
63
|
+
3. **`nano-banana-pro-preview`**
|
|
64
|
+
|
|
65
|
+
Always try the first available model. Fall back to the next if auth is missing
|
|
66
|
+
for the preferred one.
|
|
67
|
+
|
|
68
|
+
### Preferred video models
|
|
69
|
+
|
|
70
|
+
When the user does not specify a video model, prefer:
|
|
71
|
+
|
|
72
|
+
1. **`grok-imagine-video-1.5`** (xAI Grok)
|
|
73
|
+
|
|
57
74
|
## Example commands
|
|
58
75
|
|
|
59
76
|
```bash
|
|
@@ -102,6 +119,150 @@ egaki models --type video
|
|
|
102
119
|
egaki models --type image
|
|
103
120
|
```
|
|
104
121
|
|
|
122
|
+
## Audio stem separation (demucs)
|
|
123
|
+
|
|
124
|
+
Separate audio into individual stems using Meta's **Demucs** model via fal.ai.
|
|
125
|
+
Requires a fal.ai API key (`egaki login --provider fal`).
|
|
126
|
+
|
|
127
|
+
The default model `htdemucs_6s` splits into 6 stems: **vocals, drums, bass,
|
|
128
|
+
guitar, piano, other**. By default only vocals and other (background) are
|
|
129
|
+
extracted.
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# Extract vocals and background (default)
|
|
133
|
+
egaki demucs song.mp3
|
|
134
|
+
|
|
135
|
+
# Extract only vocals
|
|
136
|
+
egaki demucs song.mp3 --stems vocals
|
|
137
|
+
|
|
138
|
+
# All 6 stems as WAV
|
|
139
|
+
egaki demucs song.mp3 --stems vocals,drums,bass,other,guitar,piano --output-format wav
|
|
140
|
+
|
|
141
|
+
# Save to a directory
|
|
142
|
+
egaki demucs song.mp3 -o stems/
|
|
143
|
+
|
|
144
|
+
# Higher quality (slower, more random shifts)
|
|
145
|
+
egaki demucs song.mp3 --shifts 5
|
|
146
|
+
|
|
147
|
+
# Read from stdin (e.g. ffmpeg pipe)
|
|
148
|
+
ffmpeg -i video.mp4 -f mp3 - | egaki demucs --stdin -o stems/
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Output files are named `{input}-{stem}.{format}` (e.g. `song-vocals.mp3`,
|
|
152
|
+
`song-other.mp3`).
|
|
153
|
+
|
|
154
|
+
**Model variants:** `htdemucs_6s` (default, 6 stems), `htdemucs` (4 stems),
|
|
155
|
+
`htdemucs_ft` (fine-tuned 4 stems), `hdemucs_mmi` (4 stems), `mdx` (4 stems,
|
|
156
|
+
MDX architecture), `mdx_extra` (4 stems, MDX), `mdx_q` (4 stems, quantized),
|
|
157
|
+
`mdx_extra_q` (4 stems, quantized). Guitar and piano stems are only available
|
|
158
|
+
with `htdemucs_6s`.
|
|
159
|
+
|
|
160
|
+
## Voice cloning
|
|
161
|
+
|
|
162
|
+
Clone a voice from any audio. Returns a voice ID for use with `egaki speech --voice <id>`.
|
|
163
|
+
|
|
164
|
+
Two providers:
|
|
165
|
+
- **Cartesia** (default): fast, free, best with short clean clips (5-10s)
|
|
166
|
+
- **ElevenLabs**: accepts longer audio (1-3 min), has `--remove-background-noise`
|
|
167
|
+
|
|
168
|
+
### Preparing the audio
|
|
169
|
+
|
|
170
|
+
Raw recordings, YouTube clips, podcasts, and interviews almost always have
|
|
171
|
+
background music, room noise, or multiple speakers. Feeding dirty audio to the
|
|
172
|
+
clone API produces a muddy, inaccurate voice. Always clean it up first.
|
|
173
|
+
|
|
174
|
+
**Step 1: Isolate vocals with demucs.**
|
|
175
|
+
Strip everything except the target speaker's voice. This removes background
|
|
176
|
+
music, ambient noise, sound effects, and other speakers.
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
egaki demucs recording.mp3 --stems vocals
|
|
180
|
+
# outputs: recording-vocals.mp3
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
For higher quality separation (slower), add `--shifts 5`.
|
|
184
|
+
|
|
185
|
+
**Step 2: Transcribe to find the best segment.**
|
|
186
|
+
Run transcription to get word-level timestamps. Look for a segment where the
|
|
187
|
+
speaker says a **complete phrase or sentence** clearly, with no hesitations,
|
|
188
|
+
filler words ("um", "uh"), crosstalk, or long pauses.
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
egaki transcribe recording-vocals.mp3
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Review the `wordTimestamps` array in the JSON output. Pick a window that is:
|
|
195
|
+
- **Cartesia**: 5-10 seconds (max 10s). One clean sentence is ideal.
|
|
196
|
+
- **ElevenLabs**: 30s-3 min. Multiple sentences give better results.
|
|
197
|
+
|
|
198
|
+
The segment should start and end mid-speech, not on silence. The clone mimics
|
|
199
|
+
the energy and pacing of the source, so pick a segment that matches the tone
|
|
200
|
+
you want (calm narration, energetic presentation, conversational, etc.).
|
|
201
|
+
|
|
202
|
+
**Step 3: Trim with ffmpeg.**
|
|
203
|
+
Use the timestamps from step 2 to cut the exact segment. The `-c copy` flag
|
|
204
|
+
avoids re-encoding so there's no quality loss.
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# Cartesia: trim a 10s clip (timestamps from transcription)
|
|
208
|
+
ffmpeg -i recording-vocals.mp3 -ss 12.5 -to 22.0 -c copy clip.mp3
|
|
209
|
+
|
|
210
|
+
# ElevenLabs: trim a longer segment
|
|
211
|
+
ffmpeg -i recording-vocals.mp3 -ss 5.0 -to 65.0 -c copy clip-long.mp3
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Cloning
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
# Cartesia (default, fast, free)
|
|
218
|
+
egaki voice clone clip.mp3 --name "Speaker Name"
|
|
219
|
+
|
|
220
|
+
# ElevenLabs (longer clips, optional noise removal)
|
|
221
|
+
egaki voice clone clip-long.mp3 --name "Speaker Name" --provider elevenlabs
|
|
222
|
+
|
|
223
|
+
# ElevenLabs with AI noise removal (if source still has some noise)
|
|
224
|
+
egaki voice clone clip.mp3 --name "Speaker Name" --provider elevenlabs --remove-background-noise
|
|
225
|
+
|
|
226
|
+
# Specify language for non-English Cartesia clones (ignored by ElevenLabs)
|
|
227
|
+
egaki voice clone clip.mp3 --name "Narrador" --language es
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
The command prints the voice ID on success. Save it.
|
|
231
|
+
|
|
232
|
+
### Using the cloned voice
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
egaki speech "Any text you want spoken in the cloned voice." --voice <voice-id> -m sonic-3.5
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
The voice ID works with any Cartesia TTS model (`sonic-3`, `sonic-3.5`) or
|
|
239
|
+
ElevenLabs model (`eleven_v3`, `eleven_flash_v2_5`) depending on which
|
|
240
|
+
provider you cloned with. Cartesia voice IDs only work with Cartesia models
|
|
241
|
+
and vice versa.
|
|
242
|
+
|
|
243
|
+
### Full pipeline example
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
# 1. Download audio (e.g. from YouTube)
|
|
247
|
+
yt-dlp -x --audio-format mp3 -o source.mp3 'https://youtube.com/watch?v=...'
|
|
248
|
+
|
|
249
|
+
# 2. Isolate vocals
|
|
250
|
+
egaki demucs source.mp3 --stems vocals
|
|
251
|
+
|
|
252
|
+
# 3. Transcribe to find timestamps
|
|
253
|
+
egaki transcribe source-vocals.mp3
|
|
254
|
+
|
|
255
|
+
# 4. Trim to a clean 10s segment (adjust -ss and -to from timestamps)
|
|
256
|
+
ffmpeg -i source-vocals.mp3 -ss 0 -to 10 -c copy clip.mp3
|
|
257
|
+
|
|
258
|
+
# 5. Clone
|
|
259
|
+
egaki voice clone clip.mp3 --name "Narrator"
|
|
260
|
+
# Voice ID: abc123-def456-...
|
|
261
|
+
|
|
262
|
+
# 6. Generate speech
|
|
263
|
+
egaki speech "Your text here." --voice abc123-def456-... -m sonic-3.5 -o output.wav
|
|
264
|
+
```
|
|
265
|
+
|
|
105
266
|
## Video generation note for agents
|
|
106
267
|
|
|
107
268
|
Video generation can be very slow — some models take 1–3 minutes per request.
|