egaki 0.5.0 → 0.7.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 (280) hide show
  1. package/CHANGELOG.md +188 -0
  2. package/dist/cli/cache-utils.d.ts +33 -0
  3. package/dist/cli/cache-utils.d.ts.map +1 -0
  4. package/dist/cli/cache-utils.js +157 -0
  5. package/dist/cli/cached-generate.d.ts +105 -0
  6. package/dist/cli/cached-generate.d.ts.map +1 -0
  7. package/dist/cli/cached-generate.js +208 -0
  8. package/dist/cli/cached-generate.test.d.ts +11 -0
  9. package/dist/cli/cached-generate.test.d.ts.map +1 -0
  10. package/dist/cli/cached-generate.test.js +431 -0
  11. package/dist/cli/cartesia-provider.d.ts +16 -0
  12. package/dist/cli/cartesia-provider.d.ts.map +1 -0
  13. package/dist/cli/cartesia-provider.js +184 -0
  14. package/dist/cli/chatgpt-auth.d.ts.map +1 -0
  15. package/dist/cli/cli.d.ts +4 -0
  16. package/dist/cli/cli.d.ts.map +1 -0
  17. package/dist/cli/cli.js +1329 -0
  18. package/dist/cli/clone-generate.d.ts +26 -0
  19. package/dist/cli/clone-generate.d.ts.map +1 -0
  20. package/dist/cli/clone-generate.js +148 -0
  21. package/dist/{credentials.d.ts → cli/credentials.d.ts} +11 -2
  22. package/dist/cli/credentials.d.ts.map +1 -0
  23. package/dist/{credentials.js → cli/credentials.js} +88 -5
  24. package/dist/cli/elevenlabs-speech-provider.d.ts +26 -0
  25. package/dist/cli/elevenlabs-speech-provider.d.ts.map +1 -0
  26. package/dist/cli/elevenlabs-speech-provider.js +199 -0
  27. package/dist/cli/generate.d.ts +140 -0
  28. package/dist/cli/generate.d.ts.map +1 -0
  29. package/dist/cli/generate.js +604 -0
  30. package/dist/cli/generate.test.d.ts +2 -0
  31. package/dist/cli/generate.test.d.ts.map +1 -0
  32. package/dist/cli/generate.test.js +131 -0
  33. package/dist/cli/login.d.ts.map +1 -0
  34. package/dist/{login.js → cli/login.js} +45 -4
  35. package/dist/cli/main.d.ts +3 -0
  36. package/dist/cli/main.d.ts.map +1 -0
  37. package/dist/cli/main.js +7 -0
  38. package/dist/cli/model-catalog.d.ts +141 -0
  39. package/dist/cli/model-catalog.d.ts.map +1 -0
  40. package/dist/cli/model-catalog.js +2135 -0
  41. package/dist/{models.d.ts → cli/models.d.ts} +16 -9
  42. package/dist/cli/models.d.ts.map +1 -0
  43. package/dist/cli/models.js +313 -0
  44. package/dist/cli/open-browser.d.ts.map +1 -0
  45. package/dist/cli/openai-speech-provider.d.ts +3 -0
  46. package/dist/cli/openai-speech-provider.d.ts.map +1 -0
  47. package/dist/cli/openai-speech-provider.js +28 -0
  48. package/dist/cli/separation-generate.d.ts +34 -0
  49. package/dist/cli/separation-generate.d.ts.map +1 -0
  50. package/dist/cli/separation-generate.js +117 -0
  51. package/dist/cli/speech-catalog.d.ts +35 -0
  52. package/dist/cli/speech-catalog.d.ts.map +1 -0
  53. package/dist/cli/speech-catalog.js +195 -0
  54. package/dist/cli/speech-generate.d.ts +86 -0
  55. package/dist/cli/speech-generate.d.ts.map +1 -0
  56. package/dist/cli/speech-generate.js +156 -0
  57. package/dist/cli/speech-models.d.ts +8 -0
  58. package/dist/cli/speech-models.d.ts.map +1 -0
  59. package/dist/cli/speech-models.js +109 -0
  60. package/dist/cli/speech-provider.test.d.ts +2 -0
  61. package/dist/cli/speech-provider.test.d.ts.map +1 -0
  62. package/dist/cli/speech-provider.test.js +197 -0
  63. package/dist/cli/subscription.d.ts.map +1 -0
  64. package/dist/cli/transcription-catalog.d.ts +35 -0
  65. package/dist/cli/transcription-catalog.d.ts.map +1 -0
  66. package/dist/cli/transcription-catalog.js +192 -0
  67. package/dist/cli/transcription-generate.d.ts +62 -0
  68. package/dist/cli/transcription-generate.d.ts.map +1 -0
  69. package/dist/cli/transcription-generate.js +144 -0
  70. package/dist/cli/transcription-models.d.ts +9 -0
  71. package/dist/cli/transcription-models.d.ts.map +1 -0
  72. package/dist/cli/transcription-models.js +100 -0
  73. package/dist/cli/transcription-providers.d.ts +22 -0
  74. package/dist/cli/transcription-providers.d.ts.map +1 -0
  75. package/dist/cli/transcription-providers.js +290 -0
  76. package/dist/cli/video-model-catalog.d.ts +2 -0
  77. package/dist/cli/video-model-catalog.d.ts.map +1 -0
  78. package/dist/cli/video-model-catalog.js +5 -0
  79. package/dist/cli/xai-auth.d.ts +29 -0
  80. package/dist/cli/xai-auth.d.ts.map +1 -0
  81. package/dist/cli/xai-auth.js +325 -0
  82. package/dist/vite/angled-screen.d.ts +57 -0
  83. package/dist/vite/angled-screen.d.ts.map +1 -0
  84. package/dist/vite/angled-screen.js +115 -0
  85. package/dist/vite/app.d.ts +51 -0
  86. package/dist/vite/app.d.ts.map +1 -0
  87. package/dist/vite/app.js +150 -0
  88. package/dist/vite/bands-shader.d.ts +47 -0
  89. package/dist/vite/bands-shader.d.ts.map +1 -0
  90. package/dist/vite/bands-shader.js +267 -0
  91. package/dist/vite/code-block.d.ts +107 -0
  92. package/dist/vite/code-block.d.ts.map +1 -0
  93. package/dist/vite/code-block.js +641 -0
  94. package/dist/vite/components.d.ts +36 -0
  95. package/dist/vite/components.d.ts.map +1 -0
  96. package/dist/vite/components.js +113 -0
  97. package/dist/vite/dispersion-rings-shader.d.ts +44 -0
  98. package/dist/vite/dispersion-rings-shader.d.ts.map +1 -0
  99. package/dist/vite/dispersion-rings-shader.js +282 -0
  100. package/dist/vite/easing-curves.d.ts +129 -0
  101. package/dist/vite/easing-curves.d.ts.map +1 -0
  102. package/dist/vite/easing-curves.js +584 -0
  103. package/dist/vite/easing-curves.test.d.ts +2 -0
  104. package/dist/vite/easing-curves.test.d.ts.map +1 -0
  105. package/dist/vite/easing-curves.test.js +200 -0
  106. package/dist/vite/generated-media-client.d.ts +35 -0
  107. package/dist/vite/generated-media-client.d.ts.map +1 -0
  108. package/dist/vite/generated-media-client.js +76 -0
  109. package/dist/vite/keyframes.d.ts +129 -0
  110. package/dist/vite/keyframes.d.ts.map +1 -0
  111. package/dist/vite/keyframes.js +194 -0
  112. package/dist/vite/layout-editor.d.ts +45 -0
  113. package/dist/vite/layout-editor.d.ts.map +1 -0
  114. package/dist/vite/layout-editor.js +587 -0
  115. package/dist/vite/layout-transition.d.ts +136 -0
  116. package/dist/vite/layout-transition.d.ts.map +1 -0
  117. package/dist/vite/layout-transition.js +581 -0
  118. package/dist/vite/liquid-gradient-shader.d.ts +62 -0
  119. package/dist/vite/liquid-gradient-shader.d.ts.map +1 -0
  120. package/dist/vite/liquid-gradient-shader.js +413 -0
  121. package/dist/vite/mdx-client.d.ts +15 -0
  122. package/dist/vite/mdx-client.d.ts.map +1 -0
  123. package/dist/vite/mdx-client.js +265 -0
  124. package/dist/vite/mdx-parse.d.ts +102 -0
  125. package/dist/vite/mdx-parse.d.ts.map +1 -0
  126. package/dist/vite/mdx-parse.js +251 -0
  127. package/dist/vite/mdx-provided-components.d.ts +18 -0
  128. package/dist/vite/mdx-provided-components.d.ts.map +1 -0
  129. package/dist/vite/mdx-provided-components.js +14 -0
  130. package/dist/vite/mdx-video.d.ts +327 -0
  131. package/dist/vite/mdx-video.d.ts.map +1 -0
  132. package/dist/vite/mdx-video.js +596 -0
  133. package/dist/vite/mdx-video.test.d.ts +9 -0
  134. package/dist/vite/mdx-video.test.d.ts.map +1 -0
  135. package/dist/vite/mdx-video.test.js +1945 -0
  136. package/dist/vite/media-components.d.ts +45 -0
  137. package/dist/vite/media-components.d.ts.map +1 -0
  138. package/dist/vite/media-components.js +355 -0
  139. package/dist/vite/media-duration-store.d.ts +66 -0
  140. package/dist/vite/media-duration-store.d.ts.map +1 -0
  141. package/dist/vite/media-duration-store.js +204 -0
  142. package/dist/vite/player-page.d.ts +35 -0
  143. package/dist/vite/player-page.d.ts.map +1 -0
  144. package/dist/vite/player-page.js +720 -0
  145. package/dist/vite/render-client.d.ts +18 -0
  146. package/dist/vite/render-client.d.ts.map +1 -0
  147. package/dist/vite/render-client.js +67 -0
  148. package/dist/vite/sdk.d.ts +221 -0
  149. package/dist/vite/sdk.d.ts.map +1 -0
  150. package/dist/vite/sdk.js +355 -0
  151. package/dist/vite/server-components.d.ts +55 -0
  152. package/dist/vite/server-components.d.ts.map +1 -0
  153. package/dist/vite/server-components.js +156 -0
  154. package/dist/vite/server-mdx.d.ts +74 -0
  155. package/dist/vite/server-mdx.d.ts.map +1 -0
  156. package/dist/vite/server-mdx.js +259 -0
  157. package/dist/vite/shader-renderer.d.ts +48 -0
  158. package/dist/vite/shader-renderer.d.ts.map +1 -0
  159. package/dist/vite/shader-renderer.js +411 -0
  160. package/dist/vite/store-hooks.d.ts +12 -0
  161. package/dist/vite/store-hooks.d.ts.map +1 -0
  162. package/dist/vite/store-hooks.js +93 -0
  163. package/dist/vite/store.d.ts +75 -0
  164. package/dist/vite/store.d.ts.map +1 -0
  165. package/dist/vite/store.js +52 -0
  166. package/dist/vite/store.test.d.ts +6 -0
  167. package/dist/vite/store.test.d.ts.map +1 -0
  168. package/dist/vite/store.test.js +172 -0
  169. package/dist/vite/tweakpane-hook.d.ts +94 -0
  170. package/dist/vite/tweakpane-hook.d.ts.map +1 -0
  171. package/dist/vite/tweakpane-hook.js +450 -0
  172. package/dist/vite/vite-plugin.d.ts +28 -0
  173. package/dist/vite/vite-plugin.d.ts.map +1 -0
  174. package/dist/vite/vite-plugin.js +538 -0
  175. package/dist/vite/wave-gradient-shader.d.ts +41 -0
  176. package/dist/vite/wave-gradient-shader.d.ts.map +1 -0
  177. package/dist/vite/wave-gradient-shader.js +207 -0
  178. package/package.json +103 -25
  179. package/skills/egaki/SKILL.md +162 -1
  180. package/src/cli/cache-utils.ts +169 -0
  181. package/src/cli/cached-generate.test.ts +531 -0
  182. package/src/cli/cached-generate.ts +348 -0
  183. package/src/cli/cartesia-provider.ts +249 -0
  184. package/src/cli/cli.ts +1818 -0
  185. package/src/cli/clone-generate.ts +202 -0
  186. package/src/{credentials.ts → cli/credentials.ts} +90 -7
  187. package/src/cli/elevenlabs-speech-provider.ts +243 -0
  188. package/src/cli/generate.test.ts +166 -0
  189. package/src/cli/generate.ts +912 -0
  190. package/src/{login.ts → cli/login.ts} +48 -3
  191. package/src/cli/main.ts +8 -0
  192. package/src/cli/model-catalog.ts +2336 -0
  193. package/src/cli/models.ts +408 -0
  194. package/src/cli/openai-speech-provider.ts +34 -0
  195. package/src/cli/separation-generate.ts +187 -0
  196. package/src/cli/speech-catalog.ts +253 -0
  197. package/src/cli/speech-generate.ts +275 -0
  198. package/src/cli/speech-models.ts +146 -0
  199. package/src/cli/speech-provider.test.ts +226 -0
  200. package/src/cli/transcription-catalog.ts +250 -0
  201. package/src/cli/transcription-generate.ts +214 -0
  202. package/src/cli/transcription-models.ts +136 -0
  203. package/src/cli/transcription-providers.ts +427 -0
  204. package/src/cli/video-model-catalog.ts +14 -0
  205. package/src/cli/xai-auth.ts +396 -0
  206. package/src/vite/angled-screen.tsx +214 -0
  207. package/src/vite/app.tsx +197 -0
  208. package/src/vite/bands-shader.tsx +319 -0
  209. package/src/vite/code-block.tsx +939 -0
  210. package/src/vite/components.tsx +278 -0
  211. package/src/vite/dispersion-rings-shader.tsx +331 -0
  212. package/src/vite/easing-curves.test.ts +232 -0
  213. package/src/vite/easing-curves.ts +743 -0
  214. package/src/vite/generated-media-client.tsx +121 -0
  215. package/src/vite/keyframes.tsx +347 -0
  216. package/src/vite/layout-editor.tsx +709 -0
  217. package/src/vite/layout-transition.tsx +706 -0
  218. package/src/vite/liquid-gradient-shader.tsx +474 -0
  219. package/src/vite/mdx-client.tsx +420 -0
  220. package/src/vite/mdx-parse.ts +343 -0
  221. package/src/vite/mdx-provided-components.ts +19 -0
  222. package/src/vite/mdx-video.test.tsx +2219 -0
  223. package/src/vite/mdx-video.tsx +976 -0
  224. package/src/vite/media-components.tsx +473 -0
  225. package/src/vite/media-duration-store.ts +225 -0
  226. package/src/vite/motion-timing.ts +194 -0
  227. package/src/vite/player-page.tsx +1107 -0
  228. package/src/vite/render-client.ts +84 -0
  229. package/src/vite/sdk.ts +598 -0
  230. package/src/vite/server-components.tsx +241 -0
  231. package/src/vite/server-mdx.ts +285 -0
  232. package/src/vite/shader-renderer.tsx +535 -0
  233. package/src/vite/store-hooks.ts +117 -0
  234. package/src/vite/store.test.ts +202 -0
  235. package/src/vite/store.ts +115 -0
  236. package/src/vite/styles.css +21 -0
  237. package/src/vite/tweakpane-hook.tsx +593 -0
  238. package/src/vite/virtual-modules.d.ts +30 -0
  239. package/src/vite/vite-plugin.ts +584 -0
  240. package/src/vite/wave-gradient-shader.tsx +253 -0
  241. package/README.md +0 -266
  242. package/dist/antigravity-auth.d.ts +0 -15
  243. package/dist/antigravity-auth.d.ts.map +0 -1
  244. package/dist/antigravity-auth.js +0 -544
  245. package/dist/antigravity-image.d.ts +0 -11
  246. package/dist/antigravity-image.d.ts.map +0 -1
  247. package/dist/antigravity-image.js +0 -285
  248. package/dist/chatgpt-auth.d.ts.map +0 -1
  249. package/dist/cli.d.ts +0 -3
  250. package/dist/cli.d.ts.map +0 -1
  251. package/dist/cli.js +0 -968
  252. package/dist/credentials.d.ts.map +0 -1
  253. package/dist/gateway-model-candidates.generated.d.ts +0 -11
  254. package/dist/gateway-model-candidates.generated.d.ts.map +0 -1
  255. package/dist/gateway-model-candidates.generated.js +0 -64
  256. package/dist/login.d.ts.map +0 -1
  257. package/dist/model-catalog.d.ts +0 -42
  258. package/dist/model-catalog.d.ts.map +0 -1
  259. package/dist/model-catalog.js +0 -1001
  260. package/dist/models.d.ts.map +0 -1
  261. package/dist/models.js +0 -246
  262. package/dist/open-browser.d.ts.map +0 -1
  263. package/dist/subscription.d.ts.map +0 -1
  264. package/dist/video-model-catalog.d.ts +0 -52
  265. package/dist/video-model-catalog.d.ts.map +0 -1
  266. package/dist/video-model-catalog.js +0 -306
  267. package/src/cli.ts +0 -1378
  268. package/src/model-catalog.ts +0 -1077
  269. package/src/models.ts +0 -309
  270. package/src/video-model-catalog.ts +0 -363
  271. /package/dist/{chatgpt-auth.d.ts → cli/chatgpt-auth.d.ts} +0 -0
  272. /package/dist/{chatgpt-auth.js → cli/chatgpt-auth.js} +0 -0
  273. /package/dist/{login.d.ts → cli/login.d.ts} +0 -0
  274. /package/dist/{open-browser.d.ts → cli/open-browser.d.ts} +0 -0
  275. /package/dist/{open-browser.js → cli/open-browser.js} +0 -0
  276. /package/dist/{subscription.d.ts → cli/subscription.d.ts} +0 -0
  277. /package/dist/{subscription.js → cli/subscription.js} +0 -0
  278. /package/src/{chatgpt-auth.ts → cli/chatgpt-auth.ts} +0 -0
  279. /package/src/{open-browser.ts → cli/open-browser.ts} +0 -0
  280. /package/src/{subscription.ts → cli/subscription.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.5.0",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
- "main": "./dist/cli.js",
6
- "types": "./dist/cli.d.ts",
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
- "./src": {
14
- "types": "./src/cli.ts",
15
- "default": "./src/cli.ts"
14
+ "./generate": {
15
+ "types": "./dist/cli/generate.d.ts",
16
+ "default": "./dist/cli/generate.js"
16
17
  },
17
- "./src/*": {
18
- "types": "./src/*.ts",
19
- "default": "./src/*.ts"
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": "./src/cli/cached-generate.ts",
32
+ "default": "./src/cli/cached-generate.ts"
33
+ },
34
+ "./vite": {
35
+ "types": "./src/vite/vite-plugin.ts",
36
+ "default": "./src/vite/vite-plugin.ts"
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
- "description": "AI image and video generation CLI",
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,41 +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": {
50
- "@ai-sdk/fal": "2.0.21",
82
+ "@ai-sdk/bytedance": "^1.0.14",
83
+ "@ai-sdk/fal": "2.0.34",
51
84
  "@ai-sdk/google": "3.0.33",
52
- "@ai-sdk/google-vertex": "^4.0.95",
85
+ "@ai-sdk/google-vertex": "^4.0.137",
53
86
  "@ai-sdk/openai": "3.0.36",
54
87
  "@ai-sdk/replicate": "2.0.20",
88
+ "@ai-sdk/xai": "^3.0.92",
55
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",
56
97
  "ai": "6.0.103",
57
98
  "eventsource-parser": "^3.0.6",
58
- "goke": "^6.6.1",
99
+ "goke": "^6.12.1",
59
100
  "js-yaml": "^4.1.1",
101
+ "mediabunny": "^1.46.0",
102
+ "moveable": "^0.53.0",
60
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",
61
109
  "string-dedent": "^3.0.2",
62
- "zod": "^4.3.6"
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
+ }
63
139
  },
64
140
  "devDependencies": {
65
141
  "@types/js-yaml": "^4.0.9",
66
- "@types/node": "^25.3.0",
67
- "tsx": "^4.21.0",
68
- "typescript": "^5.9.3"
142
+ "@types/react": "^19.2.17",
143
+ "@vitejs/plugin-react": "^6.0.2",
144
+ "vite": "^8.0.10",
145
+ "vitest": "^4.1.8"
69
146
  },
70
147
  "scripts": {
71
- "dev": "tsx src/cli.ts",
72
- "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"
73
151
  }
74
152
  }
@@ -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.