popeye-cli 1.0.1 → 1.2.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.
- package/.env.example +24 -1
- package/CONTRIBUTING.md +275 -0
- package/OPEN_SOURCE_MANIFESTO.md +172 -0
- package/README.md +832 -123
- package/dist/adapters/claude.d.ts +19 -4
- package/dist/adapters/claude.d.ts.map +1 -1
- package/dist/adapters/claude.js +908 -42
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/gemini.d.ts +55 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +318 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/grok.d.ts +73 -0
- package/dist/adapters/grok.d.ts.map +1 -0
- package/dist/adapters/grok.js +430 -0
- package/dist/adapters/grok.js.map +1 -0
- package/dist/adapters/openai.d.ts +1 -1
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +47 -8
- package/dist/adapters/openai.js.map +1 -1
- package/dist/auth/claude.d.ts +11 -9
- package/dist/auth/claude.d.ts.map +1 -1
- package/dist/auth/claude.js +107 -71
- package/dist/auth/claude.js.map +1 -1
- package/dist/auth/gemini.d.ts +58 -0
- package/dist/auth/gemini.d.ts.map +1 -0
- package/dist/auth/gemini.js +172 -0
- package/dist/auth/gemini.js.map +1 -0
- package/dist/auth/grok.d.ts +73 -0
- package/dist/auth/grok.d.ts.map +1 -0
- package/dist/auth/grok.js +211 -0
- package/dist/auth/grok.js.map +1 -0
- package/dist/auth/index.d.ts +14 -7
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +41 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/keychain.d.ts +20 -7
- package/dist/auth/keychain.d.ts.map +1 -1
- package/dist/auth/keychain.js +85 -29
- package/dist/auth/keychain.js.map +1 -1
- package/dist/auth/openai.d.ts +2 -2
- package/dist/auth/openai.d.ts.map +1 -1
- package/dist/auth/openai.js +30 -32
- package/dist/auth/openai.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +1 -1
- package/dist/cli/commands/auth.d.ts.map +1 -1
- package/dist/cli/commands/auth.js +79 -8
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +15 -4
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +1494 -114
- package/dist/cli/interactive.js.map +1 -1
- package/dist/config/defaults.d.ts +9 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +19 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +19 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +33 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +47 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +29 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/generators/fullstack.d.ts +32 -0
- package/dist/generators/fullstack.d.ts.map +1 -0
- package/dist/generators/fullstack.js +497 -0
- package/dist/generators/fullstack.js.map +1 -0
- package/dist/generators/index.d.ts +4 -3
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +15 -1
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/python.d.ts +17 -1
- package/dist/generators/python.d.ts.map +1 -1
- package/dist/generators/python.js +34 -20
- package/dist/generators/python.js.map +1 -1
- package/dist/generators/templates/fullstack.d.ts +113 -0
- package/dist/generators/templates/fullstack.d.ts.map +1 -0
- package/dist/generators/templates/fullstack.js +1004 -0
- package/dist/generators/templates/fullstack.js.map +1 -0
- package/dist/generators/typescript.d.ts +19 -1
- package/dist/generators/typescript.d.ts.map +1 -1
- package/dist/generators/typescript.js +37 -20
- package/dist/generators/typescript.js.map +1 -1
- package/dist/state/index.d.ts +108 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +551 -4
- package/dist/state/index.js.map +1 -1
- package/dist/state/registry.d.ts +52 -0
- package/dist/state/registry.d.ts.map +1 -0
- package/dist/state/registry.js +215 -0
- package/dist/state/registry.js.map +1 -0
- package/dist/types/cli.d.ts +8 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/cli.js.map +1 -1
- package/dist/types/consensus.d.ts +186 -4
- package/dist/types/consensus.d.ts.map +1 -1
- package/dist/types/consensus.js +35 -3
- package/dist/types/consensus.js.map +1 -1
- package/dist/types/project.d.ts +76 -0
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/project.js +1 -1
- package/dist/types/project.js.map +1 -1
- package/dist/types/workflow.d.ts +217 -16
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +40 -1
- package/dist/types/workflow.js.map +1 -1
- package/dist/workflow/auto-fix.d.ts +45 -0
- package/dist/workflow/auto-fix.d.ts.map +1 -0
- package/dist/workflow/auto-fix.js +274 -0
- package/dist/workflow/auto-fix.js.map +1 -0
- package/dist/workflow/consensus.d.ts +70 -2
- package/dist/workflow/consensus.d.ts.map +1 -1
- package/dist/workflow/consensus.js +872 -17
- package/dist/workflow/consensus.js.map +1 -1
- package/dist/workflow/execution-mode.d.ts +10 -4
- package/dist/workflow/execution-mode.d.ts.map +1 -1
- package/dist/workflow/execution-mode.js +547 -58
- package/dist/workflow/execution-mode.js.map +1 -1
- package/dist/workflow/index.d.ts +14 -2
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +69 -6
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/milestone-workflow.d.ts +34 -0
- package/dist/workflow/milestone-workflow.d.ts.map +1 -0
- package/dist/workflow/milestone-workflow.js +414 -0
- package/dist/workflow/milestone-workflow.js.map +1 -0
- package/dist/workflow/plan-mode.d.ts +80 -3
- package/dist/workflow/plan-mode.d.ts.map +1 -1
- package/dist/workflow/plan-mode.js +767 -49
- package/dist/workflow/plan-mode.js.map +1 -1
- package/dist/workflow/plan-storage.d.ts +386 -0
- package/dist/workflow/plan-storage.d.ts.map +1 -0
- package/dist/workflow/plan-storage.js +878 -0
- package/dist/workflow/plan-storage.js.map +1 -0
- package/dist/workflow/project-verification.d.ts +37 -0
- package/dist/workflow/project-verification.d.ts.map +1 -0
- package/dist/workflow/project-verification.js +381 -0
- package/dist/workflow/project-verification.js.map +1 -0
- package/dist/workflow/task-workflow.d.ts +37 -0
- package/dist/workflow/task-workflow.d.ts.map +1 -0
- package/dist/workflow/task-workflow.js +386 -0
- package/dist/workflow/task-workflow.js.map +1 -0
- package/dist/workflow/test-runner.d.ts +9 -0
- package/dist/workflow/test-runner.d.ts.map +1 -1
- package/dist/workflow/test-runner.js +101 -5
- package/dist/workflow/test-runner.js.map +1 -1
- package/dist/workflow/ui-designer.d.ts +82 -0
- package/dist/workflow/ui-designer.d.ts.map +1 -0
- package/dist/workflow/ui-designer.js +234 -0
- package/dist/workflow/ui-designer.js.map +1 -0
- package/dist/workflow/ui-setup.d.ts +58 -0
- package/dist/workflow/ui-setup.d.ts.map +1 -0
- package/dist/workflow/ui-setup.js +685 -0
- package/dist/workflow/ui-setup.js.map +1 -0
- package/dist/workflow/ui-verification.d.ts +114 -0
- package/dist/workflow/ui-verification.d.ts.map +1 -0
- package/dist/workflow/ui-verification.js +258 -0
- package/dist/workflow/ui-verification.js.map +1 -0
- package/dist/workflow/workflow-logger.d.ts +110 -0
- package/dist/workflow/workflow-logger.d.ts.map +1 -0
- package/dist/workflow/workflow-logger.js +267 -0
- package/dist/workflow/workflow-logger.js.map +1 -0
- package/dist/workflow/workspace-manager.d.ts +342 -0
- package/dist/workflow/workspace-manager.d.ts.map +1 -0
- package/dist/workflow/workspace-manager.js +733 -0
- package/dist/workflow/workspace-manager.js.map +1 -0
- package/package.json +2 -2
- package/src/adapters/claude.ts +1067 -47
- package/src/adapters/gemini.ts +373 -0
- package/src/adapters/grok.ts +492 -0
- package/src/adapters/openai.ts +48 -9
- package/src/auth/claude.ts +120 -78
- package/src/auth/gemini.ts +207 -0
- package/src/auth/grok.ts +255 -0
- package/src/auth/index.ts +47 -9
- package/src/auth/keychain.ts +95 -28
- package/src/auth/openai.ts +29 -36
- package/src/cli/commands/auth.ts +89 -10
- package/src/cli/commands/create.ts +13 -4
- package/src/cli/interactive.ts +1774 -142
- package/src/config/defaults.ts +19 -2
- package/src/config/index.ts +36 -1
- package/src/config/schema.ts +30 -1
- package/src/generators/fullstack.ts +551 -0
- package/src/generators/index.ts +25 -1
- package/src/generators/python.ts +65 -20
- package/src/generators/templates/fullstack.ts +1047 -0
- package/src/generators/typescript.ts +69 -20
- package/src/state/index.ts +713 -4
- package/src/state/registry.ts +278 -0
- package/src/types/cli.ts +8 -0
- package/src/types/consensus.ts +197 -6
- package/src/types/project.ts +82 -1
- package/src/types/workflow.ts +90 -1
- package/src/workflow/auto-fix.ts +340 -0
- package/src/workflow/consensus.ts +1180 -16
- package/src/workflow/execution-mode.ts +673 -74
- package/src/workflow/index.ts +95 -6
- package/src/workflow/milestone-workflow.ts +576 -0
- package/src/workflow/plan-mode.ts +924 -50
- package/src/workflow/plan-storage.ts +1282 -0
- package/src/workflow/project-verification.ts +471 -0
- package/src/workflow/task-workflow.ts +528 -0
- package/src/workflow/test-runner.ts +120 -5
- package/src/workflow/ui-designer.ts +337 -0
- package/src/workflow/ui-setup.ts +797 -0
- package/src/workflow/ui-verification.ts +357 -0
- package/src/workflow/workflow-logger.ts +353 -0
- package/src/workflow/workspace-manager.ts +912 -0
- package/tests/config/config.test.ts +1 -1
- package/tests/types/consensus.test.ts +3 -3
- package/tests/workflow/plan-mode.test.ts +213 -0
- package/tests/workflow/test-runner.test.ts +5 -3
package/dist/auth/claude.js
CHANGED
|
@@ -1,101 +1,142 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Claude CLI authentication module
|
|
3
|
-
*
|
|
3
|
+
* Checks for Claude Code CLI installation and authentication status
|
|
4
4
|
*/
|
|
5
|
-
import
|
|
5
|
+
import { spawn } from 'node:child_process';
|
|
6
6
|
import { getClaudeCredential, setClaudeCredential, deleteClaudeCredential } from './keychain.js';
|
|
7
|
-
import { startAuthCallbackServer, findAvailablePort, getCallbackUrl } from './server.js';
|
|
8
7
|
/**
|
|
9
|
-
*
|
|
10
|
-
|
|
8
|
+
* Run a command and capture output
|
|
9
|
+
*/
|
|
10
|
+
function runCommand(command, args) {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
const proc = spawn(command, args, {
|
|
13
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
14
|
+
shell: true,
|
|
15
|
+
});
|
|
16
|
+
let stdout = '';
|
|
17
|
+
let stderr = '';
|
|
18
|
+
proc.stdout?.on('data', (data) => {
|
|
19
|
+
stdout += data.toString();
|
|
20
|
+
});
|
|
21
|
+
proc.stderr?.on('data', (data) => {
|
|
22
|
+
stderr += data.toString();
|
|
23
|
+
});
|
|
24
|
+
proc.on('close', (code) => {
|
|
25
|
+
resolve({ stdout, stderr, code: code ?? 1 });
|
|
26
|
+
});
|
|
27
|
+
proc.on('error', () => {
|
|
28
|
+
resolve({ stdout, stderr, code: 1 });
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if Claude Code CLI is installed
|
|
34
|
+
*/
|
|
35
|
+
export async function isClaudeCLIInstalled() {
|
|
36
|
+
try {
|
|
37
|
+
const result = await runCommand('claude', ['--version']);
|
|
38
|
+
return result.code === 0;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Check if Claude Code CLI is authenticated
|
|
46
|
+
* Uses 'claude auth status' to check authentication
|
|
11
47
|
*/
|
|
12
48
|
export async function checkClaudeCLIAuth() {
|
|
13
49
|
try {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
50
|
+
// First check if CLI is installed
|
|
51
|
+
const installed = await isClaudeCLIInstalled();
|
|
52
|
+
if (!installed) {
|
|
53
|
+
return {
|
|
54
|
+
authenticated: false,
|
|
55
|
+
cliInstalled: false,
|
|
56
|
+
error: 'Claude Code CLI is not installed',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Check auth status by running a simple command
|
|
60
|
+
// The SDK will fail if not authenticated
|
|
61
|
+
const result = await runCommand('claude', ['-p', 'echo "auth check"', '--output-format', 'json']);
|
|
62
|
+
if (result.code === 0) {
|
|
63
|
+
// Also check keychain for cached status
|
|
64
|
+
const cached = await getClaudeCredential();
|
|
65
|
+
return {
|
|
66
|
+
authenticated: true,
|
|
67
|
+
cliInstalled: true,
|
|
68
|
+
user: cached ? 'authenticated' : 'claude-user',
|
|
69
|
+
};
|
|
17
70
|
}
|
|
18
|
-
//
|
|
19
|
-
|
|
71
|
+
// Check if the error indicates auth issues
|
|
72
|
+
const output = result.stdout + result.stderr;
|
|
73
|
+
if (output.includes('not logged in') || output.includes('authenticate') || output.includes('login')) {
|
|
74
|
+
return {
|
|
75
|
+
authenticated: false,
|
|
76
|
+
cliInstalled: true,
|
|
77
|
+
error: 'Not logged in to Claude Code',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Some other error - assume authenticated if CLI is installed
|
|
81
|
+
// The actual auth check will happen when we try to use the SDK
|
|
20
82
|
return {
|
|
21
83
|
authenticated: true,
|
|
22
|
-
|
|
84
|
+
cliInstalled: true,
|
|
23
85
|
};
|
|
24
86
|
}
|
|
25
87
|
catch (error) {
|
|
26
88
|
return {
|
|
27
89
|
authenticated: false,
|
|
90
|
+
cliInstalled: false,
|
|
28
91
|
error: error instanceof Error ? error.message : 'Unknown error',
|
|
29
92
|
};
|
|
30
93
|
}
|
|
31
94
|
}
|
|
32
95
|
/**
|
|
33
|
-
* Authenticate with Claude CLI
|
|
34
|
-
*
|
|
35
|
-
* @returns Promise that resolves to true if authentication was successful
|
|
96
|
+
* Authenticate with Claude Code CLI
|
|
97
|
+
* Opens the Claude login flow
|
|
36
98
|
*/
|
|
37
99
|
export async function authenticateClaude() {
|
|
100
|
+
// Check if CLI is installed
|
|
101
|
+
const installed = await isClaudeCLIInstalled();
|
|
102
|
+
if (!installed) {
|
|
103
|
+
console.log('\nClaude Code CLI is not installed.');
|
|
104
|
+
console.log('\nTo install Claude Code CLI:');
|
|
105
|
+
console.log(' npm install -g @anthropic-ai/claude-code');
|
|
106
|
+
console.log('\nOr visit: https://claude.ai/download\n');
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
38
109
|
// Check if already authenticated
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
41
|
-
console.log('Already authenticated with Claude CLI');
|
|
110
|
+
const status = await checkClaudeCLIAuth();
|
|
111
|
+
if (status.authenticated) {
|
|
112
|
+
console.log('Already authenticated with Claude Code CLI.');
|
|
113
|
+
await setClaudeCredential('authenticated');
|
|
42
114
|
return true;
|
|
43
115
|
}
|
|
44
|
-
console.log('
|
|
45
|
-
console.log('
|
|
116
|
+
console.log('\nClaude Code CLI authentication required.');
|
|
117
|
+
console.log('\nPlease run the following command in your terminal:');
|
|
118
|
+
console.log('\n claude login\n');
|
|
119
|
+
console.log('After logging in, restart Popeye.\n');
|
|
120
|
+
// Try to open the login flow
|
|
46
121
|
try {
|
|
47
|
-
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
port,
|
|
53
|
-
type: 'claude',
|
|
54
|
-
timeout: 300000, // 5 minutes
|
|
55
|
-
});
|
|
56
|
-
// Build the login URL
|
|
57
|
-
// Note: This is a placeholder URL. The actual Claude OAuth URL would be provided by Anthropic
|
|
58
|
-
const loginUrl = buildClaudeLoginUrl(callbackUrl);
|
|
59
|
-
console.log(`Waiting for authentication...`);
|
|
60
|
-
console.log(`(Browser opened to: ${loginUrl})\n`);
|
|
61
|
-
// Open the browser to the login URL
|
|
62
|
-
await open(loginUrl);
|
|
63
|
-
// Wait for the callback
|
|
64
|
-
const result = await authPromise;
|
|
65
|
-
if (result.success && result.token) {
|
|
66
|
-
// Store the token securely
|
|
67
|
-
await setClaudeCredential(result.token);
|
|
68
|
-
console.log('Claude CLI authenticated successfully!\n');
|
|
122
|
+
console.log('Attempting to open Claude login...\n');
|
|
123
|
+
const result = await runCommand('claude', ['login']);
|
|
124
|
+
if (result.code === 0) {
|
|
125
|
+
await setClaudeCredential('authenticated');
|
|
126
|
+
console.log('Claude Code CLI authenticated successfully!\n');
|
|
69
127
|
return true;
|
|
70
128
|
}
|
|
71
129
|
else {
|
|
72
|
-
console.
|
|
130
|
+
console.log('Login process exited. Please run "claude login" manually if needed.\n');
|
|
73
131
|
return false;
|
|
74
132
|
}
|
|
75
133
|
}
|
|
76
|
-
catch
|
|
77
|
-
console.
|
|
134
|
+
catch {
|
|
135
|
+
console.log('Could not start login automatically.');
|
|
136
|
+
console.log('Please run "claude login" manually.\n');
|
|
78
137
|
return false;
|
|
79
138
|
}
|
|
80
139
|
}
|
|
81
|
-
/**
|
|
82
|
-
* Build the Claude login URL with the callback redirect
|
|
83
|
-
*
|
|
84
|
-
* @param callbackUrl - The local callback URL
|
|
85
|
-
* @returns The full login URL
|
|
86
|
-
*/
|
|
87
|
-
function buildClaudeLoginUrl(callbackUrl) {
|
|
88
|
-
// This is a placeholder implementation
|
|
89
|
-
// The actual URL would be provided by Anthropic's OAuth configuration
|
|
90
|
-
const baseUrl = 'https://claude.ai/login';
|
|
91
|
-
const params = new URLSearchParams({
|
|
92
|
-
redirect_uri: callbackUrl,
|
|
93
|
-
client_id: 'popeye-cli',
|
|
94
|
-
response_type: 'code',
|
|
95
|
-
scope: 'cli',
|
|
96
|
-
});
|
|
97
|
-
return `${baseUrl}?${params.toString()}`;
|
|
98
|
-
}
|
|
99
140
|
/**
|
|
100
141
|
* Logout from Claude CLI
|
|
101
142
|
* Removes stored credentials
|
|
@@ -103,31 +144,26 @@ function buildClaudeLoginUrl(callbackUrl) {
|
|
|
103
144
|
export async function logoutClaude() {
|
|
104
145
|
const deleted = await deleteClaudeCredential();
|
|
105
146
|
if (deleted) {
|
|
106
|
-
console.log('Claude CLI credentials removed.');
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
console.log('No Claude CLI credentials found.');
|
|
147
|
+
console.log('Claude CLI credentials removed from Popeye.');
|
|
110
148
|
}
|
|
149
|
+
console.log('\nTo fully logout from Claude Code CLI, run:');
|
|
150
|
+
console.log(' claude logout\n');
|
|
111
151
|
}
|
|
112
152
|
/**
|
|
113
153
|
* Refresh Claude CLI authentication
|
|
114
|
-
* Re-authenticates if the current token is expired or invalid
|
|
115
154
|
*/
|
|
116
155
|
export async function refreshClaudeAuth() {
|
|
117
|
-
// Remove existing credentials
|
|
118
156
|
await deleteClaudeCredential();
|
|
119
|
-
// Re-authenticate
|
|
120
157
|
return authenticateClaude();
|
|
121
158
|
}
|
|
122
159
|
/**
|
|
123
|
-
* Get the Claude CLI token for API
|
|
160
|
+
* Get the Claude CLI token (placeholder for API compatibility)
|
|
124
161
|
*/
|
|
125
162
|
export async function getClaudeToken() {
|
|
126
163
|
return getClaudeCredential();
|
|
127
164
|
}
|
|
128
165
|
/**
|
|
129
166
|
* Ensure Claude CLI is authenticated
|
|
130
|
-
* Prompts for authentication if not already authenticated
|
|
131
167
|
*/
|
|
132
168
|
export async function ensureClaudeAuth() {
|
|
133
169
|
const status = await checkClaudeCLIAuth();
|
package/dist/auth/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/auth/claude.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/auth/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Gemini API authentication module
|
|
3
|
+
* Handles API key validation and storage
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Gemini authentication status
|
|
7
|
+
*/
|
|
8
|
+
export interface GeminiAuthStatus {
|
|
9
|
+
authenticated: boolean;
|
|
10
|
+
keyLastFour?: string;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validate a Gemini API key by making a test API call
|
|
15
|
+
*
|
|
16
|
+
* @param apiKey - The API key to validate
|
|
17
|
+
* @returns True if the key is valid
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateGeminiToken(apiKey: string): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Check if Gemini is already authenticated
|
|
22
|
+
* Checks keychain first, then environment variable
|
|
23
|
+
*/
|
|
24
|
+
export declare function checkGeminiAuth(): Promise<GeminiAuthStatus>;
|
|
25
|
+
/**
|
|
26
|
+
* Prompt for API key in the terminal
|
|
27
|
+
*
|
|
28
|
+
* @returns The entered API key or null if cancelled
|
|
29
|
+
*/
|
|
30
|
+
export declare function promptForGeminiAPIKey(): Promise<string | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Authenticate with Gemini API
|
|
33
|
+
*
|
|
34
|
+
* @returns True if authentication was successful
|
|
35
|
+
*/
|
|
36
|
+
export declare function authenticateGemini(): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Authenticate with a provided API key (for CLI --api-key option)
|
|
39
|
+
*
|
|
40
|
+
* @param apiKey - The API key to use
|
|
41
|
+
* @returns True if authentication was successful
|
|
42
|
+
*/
|
|
43
|
+
export declare function authenticateGeminiWithKey(apiKey: string): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Logout from Gemini API
|
|
46
|
+
* Removes stored credentials
|
|
47
|
+
*/
|
|
48
|
+
export declare function logoutGemini(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Get the Gemini API key for API calls
|
|
51
|
+
*/
|
|
52
|
+
export declare function getGeminiToken(): Promise<string | null>;
|
|
53
|
+
/**
|
|
54
|
+
* Ensure Gemini is authenticated
|
|
55
|
+
* Prompts for authentication if not already authenticated
|
|
56
|
+
*/
|
|
57
|
+
export declare function ensureGeminiAuth(): Promise<boolean>;
|
|
58
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/auth/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB1E;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA4BjE;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBpE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAqC3D;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAchF;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQzD"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Gemini API authentication module
|
|
3
|
+
* Handles API key validation and storage
|
|
4
|
+
*/
|
|
5
|
+
import * as readline from 'node:readline';
|
|
6
|
+
import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
7
|
+
import { getGeminiCredential, setGeminiCredential, deleteGeminiCredential, maskCredential, } from './keychain.js';
|
|
8
|
+
/**
|
|
9
|
+
* Validate a Gemini API key by making a test API call
|
|
10
|
+
*
|
|
11
|
+
* @param apiKey - The API key to validate
|
|
12
|
+
* @returns True if the key is valid
|
|
13
|
+
*/
|
|
14
|
+
export async function validateGeminiToken(apiKey) {
|
|
15
|
+
try {
|
|
16
|
+
const client = new GoogleGenerativeAI(apiKey);
|
|
17
|
+
const model = client.getGenerativeModel({ model: 'gemini-2.0-flash' });
|
|
18
|
+
// Test the key by making a simple request
|
|
19
|
+
await model.generateContent('Say "OK"');
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
// Check for authentication errors
|
|
24
|
+
const errorMessage = error instanceof Error ? error.message : '';
|
|
25
|
+
if (errorMessage.includes('API_KEY_INVALID') || errorMessage.includes('401')) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
// For other errors, assume the key might be valid
|
|
29
|
+
console.warn('Could not fully validate Gemini key:', error);
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if Gemini is already authenticated
|
|
35
|
+
* Checks keychain first, then environment variable
|
|
36
|
+
*/
|
|
37
|
+
export async function checkGeminiAuth() {
|
|
38
|
+
try {
|
|
39
|
+
const apiKey = await getGeminiCredential();
|
|
40
|
+
if (!apiKey) {
|
|
41
|
+
return { authenticated: false };
|
|
42
|
+
}
|
|
43
|
+
// Validate the key
|
|
44
|
+
const isValid = await validateGeminiToken(apiKey);
|
|
45
|
+
if (!isValid) {
|
|
46
|
+
return {
|
|
47
|
+
authenticated: false,
|
|
48
|
+
error: 'Stored API key is invalid',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
authenticated: true,
|
|
53
|
+
keyLastFour: maskCredential(apiKey),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return {
|
|
58
|
+
authenticated: false,
|
|
59
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Prompt for API key in the terminal
|
|
65
|
+
*
|
|
66
|
+
* @returns The entered API key or null if cancelled
|
|
67
|
+
*/
|
|
68
|
+
export async function promptForGeminiAPIKey() {
|
|
69
|
+
return new Promise((resolve) => {
|
|
70
|
+
const rl = readline.createInterface({
|
|
71
|
+
input: process.stdin,
|
|
72
|
+
output: process.stdout,
|
|
73
|
+
});
|
|
74
|
+
console.log('\nGet your API key from: https://aistudio.google.com/app/apikey\n');
|
|
75
|
+
rl.question('Enter your Gemini API key: ', (answer) => {
|
|
76
|
+
rl.close();
|
|
77
|
+
const key = answer.trim();
|
|
78
|
+
if (key) {
|
|
79
|
+
resolve(key);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
resolve(null);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Authenticate with Gemini API
|
|
89
|
+
*
|
|
90
|
+
* @returns True if authentication was successful
|
|
91
|
+
*/
|
|
92
|
+
export async function authenticateGemini() {
|
|
93
|
+
// Check if already authenticated
|
|
94
|
+
const existingAuth = await checkGeminiAuth();
|
|
95
|
+
if (existingAuth.authenticated) {
|
|
96
|
+
console.log('Already authenticated with Gemini API');
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
console.log('Gemini API key required for arbitration.');
|
|
100
|
+
try {
|
|
101
|
+
// Prompt for the API key
|
|
102
|
+
const apiKey = await promptForGeminiAPIKey();
|
|
103
|
+
if (!apiKey) {
|
|
104
|
+
console.error('\nNo API key provided');
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
// Validate the token
|
|
108
|
+
console.log('\nValidating API key...');
|
|
109
|
+
const isValid = await validateGeminiToken(apiKey);
|
|
110
|
+
if (!isValid) {
|
|
111
|
+
console.error('Invalid Gemini API key');
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
// Store the token
|
|
115
|
+
await setGeminiCredential(apiKey);
|
|
116
|
+
console.log('Gemini API authenticated successfully!\n');
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error(`Authentication error: ${error instanceof Error ? error.message : error}`);
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Authenticate with a provided API key (for CLI --api-key option)
|
|
126
|
+
*
|
|
127
|
+
* @param apiKey - The API key to use
|
|
128
|
+
* @returns True if authentication was successful
|
|
129
|
+
*/
|
|
130
|
+
export async function authenticateGeminiWithKey(apiKey) {
|
|
131
|
+
// Validate the token
|
|
132
|
+
const isValid = await validateGeminiToken(apiKey);
|
|
133
|
+
if (!isValid) {
|
|
134
|
+
console.error('Invalid Gemini API key');
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
// Store the token
|
|
138
|
+
await setGeminiCredential(apiKey);
|
|
139
|
+
console.log('Gemini API authenticated successfully!\n');
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Logout from Gemini API
|
|
144
|
+
* Removes stored credentials
|
|
145
|
+
*/
|
|
146
|
+
export async function logoutGemini() {
|
|
147
|
+
const deleted = await deleteGeminiCredential();
|
|
148
|
+
if (deleted) {
|
|
149
|
+
console.log('Gemini API credentials removed.');
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
console.log('No Gemini API credentials found.');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get the Gemini API key for API calls
|
|
157
|
+
*/
|
|
158
|
+
export async function getGeminiToken() {
|
|
159
|
+
return getGeminiCredential();
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Ensure Gemini is authenticated
|
|
163
|
+
* Prompts for authentication if not already authenticated
|
|
164
|
+
*/
|
|
165
|
+
export async function ensureGeminiAuth() {
|
|
166
|
+
const status = await checkGeminiAuth();
|
|
167
|
+
if (status.authenticated) {
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
return authenticateGemini();
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/auth/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* xAI Grok API authentication module
|
|
3
|
+
* Handles API key validation and storage
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Grok API URL (OpenAI-compatible)
|
|
7
|
+
*/
|
|
8
|
+
export declare const GROK_API_URL = "https://api.x.ai/v1";
|
|
9
|
+
/**
|
|
10
|
+
* Grok authentication status
|
|
11
|
+
*/
|
|
12
|
+
export interface GrokAuthStatus {
|
|
13
|
+
authenticated: boolean;
|
|
14
|
+
keyLastFour?: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validate a Grok API key by making a test API call
|
|
19
|
+
*
|
|
20
|
+
* @param apiKey - The API key to validate
|
|
21
|
+
* @returns True if the key is valid
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateGrokToken(apiKey: string): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Get the Grok API credential
|
|
26
|
+
*/
|
|
27
|
+
export declare function getGrokCredential(): Promise<string | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Set the Grok API credential
|
|
30
|
+
*/
|
|
31
|
+
export declare function setGrokCredential(apiKey: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Delete the Grok API credential
|
|
34
|
+
*/
|
|
35
|
+
export declare function deleteGrokCredential(): Promise<boolean>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if Grok is already authenticated
|
|
38
|
+
*/
|
|
39
|
+
export declare function checkGrokAuth(): Promise<GrokAuthStatus>;
|
|
40
|
+
/**
|
|
41
|
+
* Prompt for API key in the terminal
|
|
42
|
+
*
|
|
43
|
+
* @returns The entered API key or null if cancelled
|
|
44
|
+
*/
|
|
45
|
+
export declare function promptForGrokAPIKey(): Promise<string | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Authenticate with Grok API
|
|
48
|
+
*
|
|
49
|
+
* @returns True if authentication was successful
|
|
50
|
+
*/
|
|
51
|
+
export declare function authenticateGrok(): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Authenticate with a provided API key (for CLI --api-key option)
|
|
54
|
+
*
|
|
55
|
+
* @param apiKey - The API key to use
|
|
56
|
+
* @returns True if authentication was successful
|
|
57
|
+
*/
|
|
58
|
+
export declare function authenticateGrokWithKey(apiKey: string): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* Logout from Grok API
|
|
61
|
+
* Removes stored credentials
|
|
62
|
+
*/
|
|
63
|
+
export declare function logoutGrok(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Get the Grok API key for API calls
|
|
66
|
+
*/
|
|
67
|
+
export declare function getGrokToken(): Promise<string | null>;
|
|
68
|
+
/**
|
|
69
|
+
* Ensure Grok is authenticated
|
|
70
|
+
* Prompts for authentication if not already authenticated
|
|
71
|
+
*/
|
|
72
|
+
export declare function ensureGrokAuth(): Promise<boolean>;
|
|
73
|
+
//# sourceMappingURL=grok.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grok.d.ts","sourceRoot":"","sources":["../../src/auth/grok.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;GAEG;AACH,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAOlD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BxE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOhE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7D;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC,CA4B7D;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBlE;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAqCzD;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAc9E;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAOhD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE3D;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAQvD"}
|