egaki 0.0.1 → 0.0.2
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 +15 -0
- package/README.md +166 -0
- package/dist/chatgpt-auth.js +294 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +471 -0
- package/dist/credentials.d.ts +18 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +107 -0
- package/dist/login.d.ts +9 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +112 -0
- package/dist/model-catalog.d.ts +42 -0
- package/dist/model-catalog.d.ts.map +1 -0
- package/dist/model-catalog.js +729 -0
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +147 -0
- package/dist/subscription.d.ts +5 -0
- package/dist/subscription.d.ts.map +1 -0
- package/dist/subscription.js +192 -0
- package/package.json +68 -5
- package/src/cli.ts +679 -0
- package/src/credentials.ts +126 -0
- package/src/login.ts +163 -0
- package/src/model-catalog.ts +793 -0
- package/src/models.ts +197 -0
- package/src/subscription.ts +271 -0
- package/index.js +0 -1
package/dist/login.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Login command — interactive and non-interactive API key management.
|
|
2
|
+
// Interactive mode uses clack prompts for provider selection and key input.
|
|
3
|
+
// Non-interactive mode supports --provider + --key flags and stdin piping.
|
|
4
|
+
import { intro, outro, select, password, isCancel, cancel, log, note, } from '@clack/prompts';
|
|
5
|
+
import pc from 'picocolors';
|
|
6
|
+
import { PROVIDERS, saveProviderKey, removeProviderKey, getKeyStatus, readCredentials, } from './credentials.js';
|
|
7
|
+
export async function loginInteractive() {
|
|
8
|
+
intro(pc.bold('egaki login'));
|
|
9
|
+
const providerOptions = Object.entries(PROVIDERS).map(([key, info]) => {
|
|
10
|
+
const status = getKeyStatus(key);
|
|
11
|
+
const statusLabel = (() => {
|
|
12
|
+
if (status.source === 'env') {
|
|
13
|
+
return pc.green('(set via env)');
|
|
14
|
+
}
|
|
15
|
+
if (status.source === 'stored') {
|
|
16
|
+
return pc.green('(saved)');
|
|
17
|
+
}
|
|
18
|
+
return pc.dim('(not configured)');
|
|
19
|
+
})();
|
|
20
|
+
// Highlight the egaki option as recommended
|
|
21
|
+
const label = key === 'egaki'
|
|
22
|
+
? `${pc.bold(info.label)} ${pc.cyan('← recommended')} ${statusLabel}`
|
|
23
|
+
: `${info.label} ${statusLabel}`;
|
|
24
|
+
return {
|
|
25
|
+
value: key,
|
|
26
|
+
label,
|
|
27
|
+
hint: info.hint,
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
const provider = await select({
|
|
31
|
+
message: 'Select a provider to configure',
|
|
32
|
+
options: providerOptions,
|
|
33
|
+
});
|
|
34
|
+
if (isCancel(provider)) {
|
|
35
|
+
cancel('Login cancelled.');
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
const info = PROVIDERS[provider];
|
|
39
|
+
if (!info) {
|
|
40
|
+
log.error(`Unknown provider: ${provider}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
log.info(`${pc.dim('Env var:')} ${info.envVar} ${pc.dim('(also used by the CLI when set)')}`);
|
|
44
|
+
log.info(`${pc.dim('Get key:')} ${info.hint}`);
|
|
45
|
+
const key = await password({
|
|
46
|
+
message: `Paste your ${info.label} API key`,
|
|
47
|
+
validate: (value) => {
|
|
48
|
+
if (!value || value.trim().length === 0) {
|
|
49
|
+
return 'API key cannot be empty';
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
if (isCancel(key)) {
|
|
54
|
+
cancel('Login cancelled.');
|
|
55
|
+
process.exit(0);
|
|
56
|
+
}
|
|
57
|
+
saveProviderKey(provider, key.trim());
|
|
58
|
+
log.success(`${info.label} key saved`);
|
|
59
|
+
note(`You can also set ${pc.bold(info.envVar)} as an env var.\nThe CLI reads it automatically, so you can pass it inline too:\n ${pc.dim(`${info.envVar}=... egaki generate "prompt"`)}`, 'Tip');
|
|
60
|
+
outro('Done');
|
|
61
|
+
}
|
|
62
|
+
export function loginNonInteractive({ provider, key, }) {
|
|
63
|
+
const info = PROVIDERS[provider];
|
|
64
|
+
if (!info) {
|
|
65
|
+
const available = Object.keys(PROVIDERS).join(', ');
|
|
66
|
+
console.error(pc.red(`Unknown provider: ${provider}. Available: ${available}`));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
if (!key || key.trim().length === 0) {
|
|
70
|
+
console.error(pc.red('API key cannot be empty'));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
saveProviderKey(provider, key.trim());
|
|
74
|
+
console.log(pc.green(`${info.label} key saved`));
|
|
75
|
+
}
|
|
76
|
+
export function showLoginStatus() {
|
|
77
|
+
console.log(pc.bold('Configured providers:\n'));
|
|
78
|
+
for (const [key, info] of Object.entries(PROVIDERS)) {
|
|
79
|
+
const status = getKeyStatus(key);
|
|
80
|
+
const icon = status.available ? pc.green('*') : pc.dim('-');
|
|
81
|
+
const source = (() => {
|
|
82
|
+
if (status.source === 'env') {
|
|
83
|
+
return pc.cyan('(from env)');
|
|
84
|
+
}
|
|
85
|
+
if (status.source === 'stored') {
|
|
86
|
+
return pc.green('(saved)');
|
|
87
|
+
}
|
|
88
|
+
return pc.dim('(not set)');
|
|
89
|
+
})();
|
|
90
|
+
const envHint = pc.dim(` env: ${info.envVar} (set in shell or pass inline to CLI)`);
|
|
91
|
+
console.log(`${icon} ${info.label} ${source}`);
|
|
92
|
+
console.log(envHint);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export function removeLogin(provider) {
|
|
96
|
+
const info = PROVIDERS[provider];
|
|
97
|
+
if (!info) {
|
|
98
|
+
const available = Object.keys(PROVIDERS).join(', ');
|
|
99
|
+
console.error(pc.red(`Unknown provider: ${provider}. Available: ${available}`));
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
removeProviderKey(provider);
|
|
103
|
+
console.log(pc.green(`${info.label} key removed`));
|
|
104
|
+
}
|
|
105
|
+
// Read API key from stdin (for piping: echo "sk-xxx" | egaki login --provider google)
|
|
106
|
+
export async function readKeyFromStdin() {
|
|
107
|
+
const chunks = [];
|
|
108
|
+
for await (const chunk of process.stdin) {
|
|
109
|
+
chunks.push(chunk);
|
|
110
|
+
}
|
|
111
|
+
return Buffer.concat(chunks).toString('utf-8').trim();
|
|
112
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
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 ModelCost = PerImageCost | PerTokenCost;
|
|
14
|
+
export type ModelFeatures = {
|
|
15
|
+
/** supports input images for editing */
|
|
16
|
+
editing: boolean;
|
|
17
|
+
/** supports mask for inpainting */
|
|
18
|
+
inpainting: boolean;
|
|
19
|
+
/** supported aspect ratios */
|
|
20
|
+
aspectRatios: string[];
|
|
21
|
+
/** supported WIDTHxHEIGHT sizes (OpenAI models) */
|
|
22
|
+
sizes?: string[];
|
|
23
|
+
/** supports deterministic seed */
|
|
24
|
+
seed: boolean;
|
|
25
|
+
/** supports generating n > 1 images */
|
|
26
|
+
multipleImages: boolean;
|
|
27
|
+
};
|
|
28
|
+
export type ModelEntry = {
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
/** Optional longer description shown in `egaki models` output */
|
|
32
|
+
description?: string;
|
|
33
|
+
provider: string;
|
|
34
|
+
strategy: 'image' | 'text';
|
|
35
|
+
/** Release date in YYYY-MM-DD or YYYY-MM format */
|
|
36
|
+
released: string;
|
|
37
|
+
cost: ModelCost;
|
|
38
|
+
features: ModelFeatures;
|
|
39
|
+
};
|
|
40
|
+
export declare const CATALOG: ModelEntry[];
|
|
41
|
+
export declare function findModel(id: string): ModelEntry | undefined;
|
|
42
|
+
//# sourceMappingURL=model-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,WAAW,CAAA;IACjB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,WAAW,CAAA;IACjB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,CAAA;AAEnD,MAAM,MAAM,aAAa,GAAG;IAC1B,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAA;IAChB,mCAAmC;IACnC,UAAU,EAAE,OAAO,CAAA;IACnB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAA;IACb,uCAAuC;IACvC,cAAc,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAA;IAC1B,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,SAAS,CAAA;IACf,QAAQ,EAAE,aAAa,CAAA;CACxB,CAAA;AAgDD,eAAO,MAAM,OAAO,EAAE,UAAU,EA4qB/B,CAAA;AAMD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE5D"}
|