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,131 @@
1
+ // Tests for the programmatic generation API (generate.ts).
2
+ // Tests the error-as-value pattern and validation logic without
3
+ // making actual API calls (no credentials needed).
4
+ import { describe, it, expect } from 'vitest';
5
+ import { generateImage, generateVideo, calculateCost, buildImageProviderOptions, buildVideoProviderOptions, ValidationError, } from './generate.js';
6
+ describe('generateImage', () => {
7
+ it('returns ValidationError for unknown model', async () => {
8
+ const result = await generateImage({
9
+ prompt: 'test',
10
+ model: 'nonexistent-model-xyz',
11
+ });
12
+ expect(result).toBeInstanceOf(ValidationError);
13
+ expect(result.message).toMatch(/Unknown model/);
14
+ });
15
+ });
16
+ describe('generateVideo', () => {
17
+ it('returns Error for unknown model', async () => {
18
+ const result = await generateVideo({
19
+ prompt: 'test',
20
+ model: 'nonexistent-model-xyz',
21
+ });
22
+ expect(result).toBeInstanceOf(Error);
23
+ expect(result.message).toMatch(/Unknown model/);
24
+ });
25
+ it('returns Error when using image model as video model', async () => {
26
+ const result = await generateVideo({
27
+ prompt: 'test',
28
+ model: 'imagen-4.0-generate-001',
29
+ });
30
+ expect(result).toBeInstanceOf(Error);
31
+ expect(result.message).toMatch(/not a video model/);
32
+ });
33
+ it('returns Error when reference-to-video mode has no reference images', async () => {
34
+ const result = await generateVideo({
35
+ prompt: 'test',
36
+ model: 'veo-3.1-fast-generate-001',
37
+ mode: 'reference-to-video',
38
+ });
39
+ expect(result).toBeInstanceOf(ValidationError);
40
+ expect(result.message).toMatch(/referenceImages is required/);
41
+ });
42
+ it('returns Error when edit-video mode has no videoUrl', async () => {
43
+ const result = await generateVideo({
44
+ prompt: 'test',
45
+ model: 'grok-imagine-video',
46
+ mode: 'edit-video',
47
+ inputImage: new Uint8Array([1, 2, 3]),
48
+ });
49
+ expect(result).toBeInstanceOf(ValidationError);
50
+ expect(result.message).toMatch(/videoUrl is required/);
51
+ });
52
+ });
53
+ describe('calculateCost', () => {
54
+ it('calculates per-image cost', () => {
55
+ const cost = calculateCost({ type: 'per-image', perImage: 0.04 }, {}, 3);
56
+ expect(cost).toBeCloseTo(0.12);
57
+ });
58
+ it('calculates per-token cost', () => {
59
+ const cost = calculateCost({ type: 'per-token', inputPerM: 1.25, outputPerM: 5.0 }, { inputTokens: 1000, outputTokens: 500 });
60
+ // (1000 * 1.25 + 500 * 5.0) / 1_000_000 = 0.00375
61
+ expect(cost).toBeCloseTo(0.00375);
62
+ });
63
+ it('calculates per-video-second cost', () => {
64
+ const cost = calculateCost({
65
+ type: 'per-video-second',
66
+ defaultDurationSec: 5,
67
+ tiers: [{ costPerSecond: 0.05 }],
68
+ }, { durationSeconds: 10 });
69
+ expect(cost).toBeCloseTo(0.5);
70
+ });
71
+ it('uses default duration when none specified', () => {
72
+ const cost = calculateCost({
73
+ type: 'per-video-second',
74
+ defaultDurationSec: 5,
75
+ tiers: [{ costPerSecond: 0.05 }],
76
+ }, {});
77
+ expect(cost).toBeCloseTo(0.25);
78
+ });
79
+ it('returns null for unknown cost type', () => {
80
+ const cost = calculateCost({ type: 'unknown' }, {});
81
+ expect(cost).toBeNull();
82
+ });
83
+ });
84
+ describe('buildImageProviderOptions', () => {
85
+ it('builds google options with person generation', () => {
86
+ const opts = buildImageProviderOptions('google', {
87
+ allowPeople: true,
88
+ aspectRatio: '16:9',
89
+ });
90
+ expect(opts.google).toEqual({
91
+ personGeneration: 'allow_all',
92
+ aspectRatio: '16:9',
93
+ });
94
+ });
95
+ it('builds xai options with quality', () => {
96
+ const opts = buildImageProviderOptions('xai', {
97
+ allowPeople: false,
98
+ quality: 'high',
99
+ resolution: '4k',
100
+ });
101
+ expect(opts.xai).toEqual({
102
+ quality: 'high',
103
+ resolution: '4k',
104
+ });
105
+ });
106
+ it('returns empty for unknown provider', () => {
107
+ const opts = buildImageProviderOptions('unknown-provider', {
108
+ allowPeople: false,
109
+ });
110
+ expect(opts).toEqual({});
111
+ });
112
+ });
113
+ describe('buildVideoProviderOptions', () => {
114
+ it('builds xai edit-video options', () => {
115
+ const opts = buildVideoProviderOptions('xai', {
116
+ mode: 'edit-video',
117
+ videoUrl: 'https://example.com/video.mp4',
118
+ model: 'grok-imagine-video',
119
+ });
120
+ expect(opts?.xai).toEqual({
121
+ mode: 'edit-video',
122
+ videoUrl: 'https://example.com/video.mp4',
123
+ });
124
+ });
125
+ it('returns undefined for provider with no options', () => {
126
+ const opts = buildVideoProviderOptions('google', {
127
+ model: 'veo-3.1-fast-generate-001',
128
+ });
129
+ expect(opts).toBeUndefined();
130
+ });
131
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/cli/login.ts"],"names":[],"mappings":"AA4BA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkGtD;AAED,wBAAsB,mBAAmB,CAAC,EACxC,QAAQ,EACR,GAAG,GACJ,EAAE;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiChB;AAED,wBAAgB,eAAe,IAAI,IAAI,CA2DtC;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAalD;AAGD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAMxD"}
@@ -4,8 +4,9 @@
4
4
  // ChatGPT OAuth uses a browser flow instead of pasting a key.
5
5
  import { intro, outro, select, password, isCancel, cancel, log, note, } from '@clack/prompts';
6
6
  import pc from 'picocolors';
7
- import { PROVIDERS, saveProviderKey, removeProviderKey, getKeyStatus, getChatGptAuth, saveChatGptAuth, } from './credentials.js';
7
+ import { PROVIDERS, saveProviderKey, removeProviderKey, getKeyStatus, getChatGptAuth, saveChatGptAuth, getXaiAuth, saveXaiAuth, } from './credentials.js';
8
8
  import { chatGptOAuthLogin, extractPlanType } from './chatgpt-auth.js';
9
+ import { xaiOAuthLogin } from './xai-auth.js';
9
10
  export async function loginInteractive() {
10
11
  intro(pc.bold('egaki login'));
11
12
  const providerOptions = Object.entries(PROVIDERS).map(([key, info]) => {
@@ -18,9 +19,17 @@ export async function loginInteractive() {
18
19
  return pc.green('(saved)');
19
20
  }
20
21
  if (status.source === 'oauth') {
21
- const auth = getChatGptAuth();
22
- const email = auth?.email;
23
- return pc.green(`(signed in${email ? ` as ${email}` : ''})`);
22
+ if (key === 'chatgpt') {
23
+ const auth = getChatGptAuth();
24
+ const email = auth?.email;
25
+ return pc.green(`(signed in${email ? ` as ${email}` : ''})`);
26
+ }
27
+ if (key === 'xai-oauth') {
28
+ const auth = getXaiAuth();
29
+ const email = auth?.email;
30
+ return pc.green(`(signed in${email ? ` as ${email}` : ''})`);
31
+ }
32
+ return pc.green('(signed in)');
24
33
  }
25
34
  return pc.dim('(not configured)');
26
35
  })();
@@ -54,6 +63,13 @@ export async function loginInteractive() {
54
63
  outro('Done — ChatGPT OAuth saved');
55
64
  return;
56
65
  }
66
+ // xAI Grok Build uses browser OAuth
67
+ if (provider === 'xai-oauth') {
68
+ const auth = await xaiOAuthLogin();
69
+ saveXaiAuth(auth);
70
+ outro('Done — xAI OAuth saved');
71
+ return;
72
+ }
57
73
  log.info(`${pc.dim('Env var:')} ${info.envVar} ${pc.dim('(also used by the CLI when set)')}`);
58
74
  log.info(`${pc.dim('Get key:')} ${info.hint}`);
59
75
  const key = await password({
@@ -87,6 +103,13 @@ export async function loginNonInteractive({ provider, key, }) {
87
103
  console.log(pc.green('ChatGPT OAuth saved'));
88
104
  return;
89
105
  }
106
+ // xAI Grok Build uses browser OAuth — key flag is not needed
107
+ if (provider === 'xai-oauth') {
108
+ const auth = await xaiOAuthLogin();
109
+ saveXaiAuth(auth);
110
+ console.log(pc.green('xAI OAuth saved'));
111
+ return;
112
+ }
90
113
  if (!key || key.trim().length === 0) {
91
114
  console.error(pc.red('API key cannot be empty'));
92
115
  process.exit(1);
@@ -117,6 +140,24 @@ export function showLoginStatus() {
117
140
  }
118
141
  continue;
119
142
  }
143
+ if (key === 'xai-oauth') {
144
+ const auth = getXaiAuth();
145
+ if (auth) {
146
+ const email = auth.email ?? 'unknown';
147
+ const expired = auth.expires < Date.now();
148
+ const expiryLabel = expired
149
+ ? pc.yellow('(token expired, will auto-refresh)')
150
+ : pc.dim('(token valid)');
151
+ console.log(`${pc.green('*')} ${info.label} ${pc.green('(signed in)')}`);
152
+ console.log(pc.dim(` account: ${email}`));
153
+ console.log(` ${expiryLabel}`);
154
+ }
155
+ else {
156
+ console.log(`${pc.dim('-')} ${info.label} ${pc.dim('(not signed in)')}`);
157
+ console.log(pc.dim(` run: egaki login → select xAI Grok Build`));
158
+ }
159
+ continue;
160
+ }
120
161
  const icon = status.available ? pc.green('*') : pc.dim('-');
121
162
  const source = (() => {
122
163
  if (status.source === 'env') {
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ // Entrypoint that imports the CLI instance and runs it.
3
+ // cli.ts defines all commands but does not call parse() so that
4
+ // other tools (like goke's generateDocs) can import the CLI without
5
+ // triggering argument parsing.
6
+ import { cli } from './cli.js';
7
+ await cli.parse();
@@ -0,0 +1,141 @@
1
+ export type PerImageCost = {
2
+ type: 'per-image';
3
+ /** USD per image at default quality/resolution */
4
+ perImage: number;
5
+ };
6
+ export type PerTokenCost = {
7
+ type: 'per-token';
8
+ /** USD per million input tokens */
9
+ inputPerM: number;
10
+ /** USD per million output tokens */
11
+ outputPerM: number;
12
+ };
13
+ export type VideoDurationPricingTier = {
14
+ /** USD per second for this variant */
15
+ costPerSecond: number;
16
+ /** Optional resolution discriminator (e.g. 720p, 1080p, 4k) */
17
+ resolution?: string;
18
+ /** Optional mode discriminator (e.g. std, pro) */
19
+ mode?: string;
20
+ /** Optional audio discriminator */
21
+ audio?: boolean;
22
+ /** Optional discriminator for whether image/video input is present (i2v/r2v vs t2v) */
23
+ hasVideoInput?: boolean;
24
+ };
25
+ export type PerVideoSecondCost = {
26
+ type: 'per-video-second';
27
+ /** Fallback duration when request does not specify one (seconds) */
28
+ defaultDurationSec: number;
29
+ tiers: VideoDurationPricingTier[];
30
+ };
31
+ export type UnknownCost = {
32
+ type: 'unknown';
33
+ };
34
+ export type ModelCost = PerImageCost | PerTokenCost;
35
+ export type VideoModelCost = PerVideoSecondCost | UnknownCost;
36
+ export type AnyCost = ModelCost | VideoModelCost;
37
+ export type ProviderOption = {
38
+ /** CLI flag name, e.g. 'quality', 'output-format' */
39
+ flag: string;
40
+ /** The key sent to providerOptions.{provider}.{key} */
41
+ providerKey: string;
42
+ /** Human description for --help */
43
+ description: string;
44
+ /** Enum values if constrained, shown in flag description */
45
+ values?: string[];
46
+ /** Server-side default when not specified */
47
+ defaultValue?: string;
48
+ /** Value type */
49
+ type: 'string' | 'number' | 'boolean';
50
+ /** Whether this flag accepts multiple values (array) */
51
+ array?: boolean;
52
+ };
53
+ export type ModelFeatures = {
54
+ /** supports input images for editing */
55
+ editing: boolean;
56
+ /** supports mask for inpainting */
57
+ inpainting: boolean;
58
+ /** supported aspect ratios */
59
+ aspectRatios: string[];
60
+ /** supported WIDTHxHEIGHT sizes (OpenAI models) */
61
+ sizes?: string[];
62
+ /** supports deterministic seed */
63
+ seed: boolean;
64
+ /** supports generating n > 1 images */
65
+ multipleImages: boolean;
66
+ };
67
+ export type VideoModelFeatures = {
68
+ /** Supports text prompt to video generation */
69
+ textToVideo: boolean;
70
+ /** Supports image-to-video prompt object ({ image, text }) */
71
+ imageToVideo: boolean;
72
+ /** Optional capabilities exposed by provider */
73
+ capabilities: Array<'t2v' | 'i2v' | 'r2v' | 'motion-control' | 'editing' | 'extension'>;
74
+ /** Optional supported aspect ratios */
75
+ aspectRatios?: string[];
76
+ /** Optional supported resolutions */
77
+ resolutions?: string[];
78
+ /** Optional duration range in seconds */
79
+ durationRangeSec?: {
80
+ min: number;
81
+ max: number;
82
+ };
83
+ seed: boolean;
84
+ multipleVideos: boolean;
85
+ };
86
+ export type ImageModelEntry = {
87
+ id: string;
88
+ name: string;
89
+ description?: string;
90
+ provider: string;
91
+ strategy: 'image' | 'text';
92
+ /** Release date in YYYY-MM-DD or YYYY-MM format */
93
+ released: string;
94
+ cost: ModelCost;
95
+ features: ModelFeatures;
96
+ /** Provider-specific options passable via providerOptions.{provider} */
97
+ providerOptions?: ProviderOption[];
98
+ };
99
+ export type VideoModelEntry = {
100
+ id: string;
101
+ name: string;
102
+ description?: string;
103
+ provider: string;
104
+ strategy: 'video';
105
+ released: string;
106
+ cost: VideoModelCost;
107
+ features: VideoModelFeatures;
108
+ /** Provider-specific options passable via providerOptions.{provider} */
109
+ providerOptions?: ProviderOption[];
110
+ };
111
+ /** @deprecated Use ImageModelEntry instead */
112
+ export type ModelEntry = ImageModelEntry;
113
+ export type { SpeechModelEntry } from './speech-catalog.js';
114
+ export type AnyModelEntry = ImageModelEntry | VideoModelEntry;
115
+ export declare const CATALOG: ModelEntry[];
116
+ export declare const VIDEO_CATALOG: VideoModelEntry[];
117
+ /**
118
+ * Collect the valid values for a CLI flag across all providers in the catalog.
119
+ * Returns a map of provider name → enum values array. Only includes providers
120
+ * that declare values for the given flag. Used by cli.ts to auto-generate
121
+ * flag descriptions like "xAI: low, medium, high. OpenAI: auto, low, medium, high".
122
+ */
123
+ export declare function getProviderValuesForFlag(flag: string, catalogs?: AnyModelEntry[][]): Map<string, string[]>;
124
+ /**
125
+ * Build a human-readable description suffix listing provider-specific values
126
+ * for a flag. Includes default values when available.
127
+ * Example: "xai: low, medium, high (default: medium). openai: auto, low, medium, high (default: auto)"
128
+ */
129
+ export declare function describeProviderValues(flag: string, catalogs?: AnyModelEntry[][]): string;
130
+ /**
131
+ * Find the ProviderOption definition for a given flag and provider from a model entry.
132
+ * Returns undefined if the model doesn't support this flag.
133
+ */
134
+ export declare function findProviderOption(entry: AnyModelEntry, flag: string): ProviderOption | undefined;
135
+ export declare function findModel(id: string): ImageModelEntry | undefined;
136
+ export declare function findVideoModel(id: string): VideoModelEntry | undefined;
137
+ export declare function findAnyModel(id: string): AnyModelEntry | undefined;
138
+ export { SPEECH_CATALOG, findSpeechModel } from './speech-catalog.js';
139
+ export { TRANSCRIPTION_CATALOG, findTranscriptionModel } from './transcription-catalog.js';
140
+ export type { TranscriptionModelEntry } from './transcription-catalog.js';
141
+ //# sourceMappingURL=model-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../../src/cli/model-catalog.ts"],"names":[],"mappings":"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"}