monty-autonomous-fullstack-dev-multillm 1.0.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/LICENSE +81 -0
- package/README.md +608 -0
- package/bin/cli.js +448 -0
- package/dist/agents/coding.d.ts +15 -0
- package/dist/agents/coding.d.ts.map +1 -0
- package/dist/agents/coding.js +189 -0
- package/dist/agents/coding.js.map +1 -0
- package/dist/agents/initializer.d.ts +15 -0
- package/dist/agents/initializer.d.ts.map +1 -0
- package/dist/agents/initializer.js +87 -0
- package/dist/agents/initializer.js.map +1 -0
- package/dist/agents/prompts/arbitrator.md +143 -0
- package/dist/agents/prompts/coding.md +247 -0
- package/dist/agents/prompts/initializer.md +98 -0
- package/dist/config/agent-config.d.ts +103 -0
- package/dist/config/agent-config.d.ts.map +1 -0
- package/dist/config/agent-config.js +138 -0
- package/dist/config/agent-config.js.map +1 -0
- package/dist/config/auth-config.d.ts +152 -0
- package/dist/config/auth-config.d.ts.map +1 -0
- package/dist/config/auth-config.js +139 -0
- package/dist/config/auth-config.js.map +1 -0
- package/dist/config/mcp-config.d.ts +109 -0
- package/dist/config/mcp-config.d.ts.map +1 -0
- package/dist/config/mcp-config.js +234 -0
- package/dist/config/mcp-config.js.map +1 -0
- package/dist/config/provider-config.d.ts +139 -0
- package/dist/config/provider-config.d.ts.map +1 -0
- package/dist/config/provider-config.js +344 -0
- package/dist/config/provider-config.js.map +1 -0
- package/dist/config/subagents-config.d.ts +85 -0
- package/dist/config/subagents-config.d.ts.map +1 -0
- package/dist/config/subagents-config.js +430 -0
- package/dist/config/subagents-config.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +385 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/arbitrator.d.ts +93 -0
- package/dist/orchestrator/arbitrator.d.ts.map +1 -0
- package/dist/orchestrator/arbitrator.js +330 -0
- package/dist/orchestrator/arbitrator.js.map +1 -0
- package/dist/orchestrator/index.d.ts +113 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +217 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/review-coordinator.d.ts +143 -0
- package/dist/orchestrator/review-coordinator.d.ts.map +1 -0
- package/dist/orchestrator/review-coordinator.js +401 -0
- package/dist/orchestrator/review-coordinator.js.map +1 -0
- package/dist/orchestrator/task-classifier.d.ts +87 -0
- package/dist/orchestrator/task-classifier.d.ts.map +1 -0
- package/dist/orchestrator/task-classifier.js +250 -0
- package/dist/orchestrator/task-classifier.js.map +1 -0
- package/dist/providers/anthropic-provider.d.ts +64 -0
- package/dist/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/providers/anthropic-provider.js +264 -0
- package/dist/providers/anthropic-provider.js.map +1 -0
- package/dist/providers/base-provider.d.ts +219 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +143 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/cursor-provider.d.ts +82 -0
- package/dist/providers/cursor-provider.d.ts.map +1 -0
- package/dist/providers/cursor-provider.js +321 -0
- package/dist/providers/cursor-provider.js.map +1 -0
- package/dist/providers/google-provider.d.ts +75 -0
- package/dist/providers/google-provider.d.ts.map +1 -0
- package/dist/providers/google-provider.js +274 -0
- package/dist/providers/google-provider.js.map +1 -0
- package/dist/providers/index.d.ts +92 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +233 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-provider.d.ts +83 -0
- package/dist/providers/openai-provider.d.ts.map +1 -0
- package/dist/providers/openai-provider.js +295 -0
- package/dist/providers/openai-provider.js.map +1 -0
- package/dist/templates/feature_list.template.json +66 -0
- package/dist/templates/progress.template.txt +51 -0
- package/dist/utils/auth-manager.d.ts +121 -0
- package/dist/utils/auth-manager.d.ts.map +1 -0
- package/dist/utils/auth-manager.js +560 -0
- package/dist/utils/auth-manager.js.map +1 -0
- package/dist/utils/budget-enforcer.d.ts +181 -0
- package/dist/utils/budget-enforcer.d.ts.map +1 -0
- package/dist/utils/budget-enforcer.js +386 -0
- package/dist/utils/budget-enforcer.js.map +1 -0
- package/dist/utils/chatgpt-detector.d.ts +51 -0
- package/dist/utils/chatgpt-detector.d.ts.map +1 -0
- package/dist/utils/chatgpt-detector.js +274 -0
- package/dist/utils/chatgpt-detector.js.map +1 -0
- package/dist/utils/claude-code-detector.d.ts +39 -0
- package/dist/utils/claude-code-detector.d.ts.map +1 -0
- package/dist/utils/claude-code-detector.js +153 -0
- package/dist/utils/claude-code-detector.js.map +1 -0
- package/dist/utils/code-quality.d.ts +58 -0
- package/dist/utils/code-quality.d.ts.map +1 -0
- package/dist/utils/code-quality.js +258 -0
- package/dist/utils/code-quality.js.map +1 -0
- package/dist/utils/context-primer.d.ts +50 -0
- package/dist/utils/context-primer.d.ts.map +1 -0
- package/dist/utils/context-primer.js +429 -0
- package/dist/utils/context-primer.js.map +1 -0
- package/dist/utils/dependency-management.d.ts +40 -0
- package/dist/utils/dependency-management.d.ts.map +1 -0
- package/dist/utils/dependency-management.js +123 -0
- package/dist/utils/dependency-management.js.map +1 -0
- package/dist/utils/environment-validation.d.ts +33 -0
- package/dist/utils/environment-validation.d.ts.map +1 -0
- package/dist/utils/environment-validation.js +136 -0
- package/dist/utils/environment-validation.js.map +1 -0
- package/dist/utils/error-recovery.d.ts +60 -0
- package/dist/utils/error-recovery.d.ts.map +1 -0
- package/dist/utils/error-recovery.js +183 -0
- package/dist/utils/error-recovery.js.map +1 -0
- package/dist/utils/feature-list.d.ts +102 -0
- package/dist/utils/feature-list.d.ts.map +1 -0
- package/dist/utils/feature-list.js +191 -0
- package/dist/utils/feature-list.js.map +1 -0
- package/dist/utils/gemini-detector.d.ts +65 -0
- package/dist/utils/gemini-detector.d.ts.map +1 -0
- package/dist/utils/gemini-detector.js +340 -0
- package/dist/utils/gemini-detector.js.map +1 -0
- package/dist/utils/git-utils.d.ts +48 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +110 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/health-check.d.ts +32 -0
- package/dist/utils/health-check.d.ts.map +1 -0
- package/dist/utils/health-check.js +152 -0
- package/dist/utils/health-check.js.map +1 -0
- package/dist/utils/hooks-manager.d.ts +154 -0
- package/dist/utils/hooks-manager.d.ts.map +1 -0
- package/dist/utils/hooks-manager.js +359 -0
- package/dist/utils/hooks-manager.js.map +1 -0
- package/dist/utils/multi-auth-manager.d.ts +144 -0
- package/dist/utils/multi-auth-manager.d.ts.map +1 -0
- package/dist/utils/multi-auth-manager.js +588 -0
- package/dist/utils/multi-auth-manager.js.map +1 -0
- package/dist/utils/progress.d.ts +49 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +209 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/project-detection.d.ts +40 -0
- package/dist/utils/project-detection.d.ts.map +1 -0
- package/dist/utils/project-detection.js +230 -0
- package/dist/utils/project-detection.js.map +1 -0
- package/dist/utils/session-manager.d.ts +119 -0
- package/dist/utils/session-manager.d.ts.map +1 -0
- package/dist/utils/session-manager.js +389 -0
- package/dist/utils/session-manager.js.map +1 -0
- package/dist/utils/skills-manager.d.ts +113 -0
- package/dist/utils/skills-manager.d.ts.map +1 -0
- package/dist/utils/skills-manager.js +332 -0
- package/dist/utils/skills-manager.js.map +1 -0
- package/dist/utils/structured-output.d.ts +117 -0
- package/dist/utils/structured-output.d.ts.map +1 -0
- package/dist/utils/structured-output.js +191 -0
- package/dist/utils/structured-output.js.map +1 -0
- package/dist/utils/subagent-manager.d.ts +143 -0
- package/dist/utils/subagent-manager.d.ts.map +1 -0
- package/dist/utils/subagent-manager.js +326 -0
- package/dist/utils/subagent-manager.js.map +1 -0
- package/dist/utils/supabase-setup.d.ts +50 -0
- package/dist/utils/supabase-setup.d.ts.map +1 -0
- package/dist/utils/supabase-setup.js +151 -0
- package/dist/utils/supabase-setup.js.map +1 -0
- package/dist/utils/token-refresh.d.ts +21 -0
- package/dist/utils/token-refresh.d.ts.map +1 -0
- package/dist/utils/token-refresh.js +77 -0
- package/dist/utils/token-refresh.js.map +1 -0
- package/dist/utils/tos-warning.d.ts +115 -0
- package/dist/utils/tos-warning.d.ts.map +1 -0
- package/dist/utils/tos-warning.js +304 -0
- package/dist/utils/tos-warning.js.map +1 -0
- package/dist/utils/usage-monitor.d.ts +156 -0
- package/dist/utils/usage-monitor.d.ts.map +1 -0
- package/dist/utils/usage-monitor.js +296 -0
- package/dist/utils/usage-monitor.js.map +1 -0
- package/package.json +105 -0
- package/scripts/init.ps1 +73 -0
- package/scripts/init.sh +86 -0
- package/scripts/test-auth.sh +90 -0
- package/templates/feature_list.template.json +66 -0
- package/templates/progress.template.txt +51 -0
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Manager
|
|
3
|
+
* Handles user authentication, credential storage, and subscription validation.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
6
|
+
* Licensed under CC BY-NC 4.0
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
|
|
9
|
+
import { createInterface } from 'readline';
|
|
10
|
+
import open from 'open';
|
|
11
|
+
import { authConfig, AUTH_ENV_VARS, } from '../config/auth-config.js';
|
|
12
|
+
import { detectClaudeCodeCredentials, getDaysUntilExpiration, getClaudeCodePaths } from './claude-code-detector.js';
|
|
13
|
+
import { isTokenExpired, refreshSubscriptionToken } from './token-refresh.js';
|
|
14
|
+
/**
|
|
15
|
+
* AuthManager - Singleton for managing authentication state
|
|
16
|
+
*/
|
|
17
|
+
export class AuthManager {
|
|
18
|
+
static instance;
|
|
19
|
+
session;
|
|
20
|
+
constructor() {
|
|
21
|
+
this.session = {
|
|
22
|
+
isAuthenticated: false,
|
|
23
|
+
credentials: null,
|
|
24
|
+
lastValidated: null,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the singleton instance
|
|
29
|
+
*/
|
|
30
|
+
static getInstance() {
|
|
31
|
+
if (!AuthManager.instance) {
|
|
32
|
+
AuthManager.instance = new AuthManager();
|
|
33
|
+
}
|
|
34
|
+
return AuthManager.instance;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Ensure the config directory exists
|
|
38
|
+
*/
|
|
39
|
+
ensureConfigDir() {
|
|
40
|
+
if (!existsSync(authConfig.configDir)) {
|
|
41
|
+
mkdirSync(authConfig.configDir, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Load credentials from file
|
|
46
|
+
*/
|
|
47
|
+
loadCredentials() {
|
|
48
|
+
try {
|
|
49
|
+
if (existsSync(authConfig.credentialsPath)) {
|
|
50
|
+
const data = readFileSync(authConfig.credentialsPath, 'utf-8');
|
|
51
|
+
return JSON.parse(data);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error('Failed to load credentials:', error);
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Save credentials to file
|
|
61
|
+
*/
|
|
62
|
+
saveCredentials(credentials) {
|
|
63
|
+
this.ensureConfigDir();
|
|
64
|
+
// Store credentials with restricted permissions (0600)
|
|
65
|
+
writeFileSync(authConfig.credentialsPath, JSON.stringify(credentials, null, 2), {
|
|
66
|
+
mode: 0o600,
|
|
67
|
+
});
|
|
68
|
+
// CRITICAL: On Windows, mode parameter is ignored. Set permissions explicitly.
|
|
69
|
+
if (process.platform === 'win32') {
|
|
70
|
+
try {
|
|
71
|
+
const { execSync } = require('child_process');
|
|
72
|
+
// Remove inheritance and grant full control to current user only
|
|
73
|
+
execSync(`icacls "${authConfig.credentialsPath}" /inheritance:r /grant:r "%USERNAME%:F"`, {
|
|
74
|
+
stdio: 'ignore',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.warn('Warning: Could not set Windows file permissions for credentials file');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
this.session.credentials = credentials;
|
|
82
|
+
this.session.isAuthenticated = true;
|
|
83
|
+
this.session.lastValidated = Date.now();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Clear stored credentials (logout)
|
|
87
|
+
*/
|
|
88
|
+
clearCredentials() {
|
|
89
|
+
try {
|
|
90
|
+
if (existsSync(authConfig.credentialsPath)) {
|
|
91
|
+
unlinkSync(authConfig.credentialsPath);
|
|
92
|
+
}
|
|
93
|
+
if (existsSync(authConfig.sessionPath)) {
|
|
94
|
+
unlinkSync(authConfig.sessionPath);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
// Ignore errors during cleanup
|
|
99
|
+
}
|
|
100
|
+
this.session = {
|
|
101
|
+
isAuthenticated: false,
|
|
102
|
+
credentials: null,
|
|
103
|
+
lastValidated: null,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if user is authenticated (from file or environment)
|
|
108
|
+
*/
|
|
109
|
+
isAuthenticated() {
|
|
110
|
+
// Check environment variables first
|
|
111
|
+
if (process.env[AUTH_ENV_VARS.API_KEY] || process.env[AUTH_ENV_VARS.SUBSCRIPTION_KEY]) {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
// Check stored credentials
|
|
115
|
+
const credentials = this.loadCredentials();
|
|
116
|
+
if (credentials) {
|
|
117
|
+
// Check if token is expired
|
|
118
|
+
if (credentials.expiresAt && credentials.expiresAt < Date.now()) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
this.session.credentials = credentials;
|
|
122
|
+
this.session.isAuthenticated = true;
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the API key synchronously (without token refresh)
|
|
129
|
+
* Used for display and environment setting where refresh isn't needed
|
|
130
|
+
*/
|
|
131
|
+
getApiKeySync() {
|
|
132
|
+
// Priority: env var > stored subscription key > stored API key
|
|
133
|
+
const subscriptionKey = process.env[AUTH_ENV_VARS.SUBSCRIPTION_KEY];
|
|
134
|
+
if (subscriptionKey) {
|
|
135
|
+
return subscriptionKey;
|
|
136
|
+
}
|
|
137
|
+
const apiKey = process.env[AUTH_ENV_VARS.API_KEY];
|
|
138
|
+
if (apiKey) {
|
|
139
|
+
return apiKey;
|
|
140
|
+
}
|
|
141
|
+
const credentials = this.loadCredentials();
|
|
142
|
+
if (credentials) {
|
|
143
|
+
return credentials.subscriptionKey || credentials.apiKey || null;
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get the API key to use (from stored credentials or environment)
|
|
149
|
+
* Automatically attempts to refresh expired tokens
|
|
150
|
+
*/
|
|
151
|
+
async getApiKey() {
|
|
152
|
+
// Priority: env var > stored subscription key > stored API key
|
|
153
|
+
const subscriptionKey = process.env[AUTH_ENV_VARS.SUBSCRIPTION_KEY];
|
|
154
|
+
if (subscriptionKey) {
|
|
155
|
+
return subscriptionKey;
|
|
156
|
+
}
|
|
157
|
+
const apiKey = process.env[AUTH_ENV_VARS.API_KEY];
|
|
158
|
+
if (apiKey) {
|
|
159
|
+
return apiKey;
|
|
160
|
+
}
|
|
161
|
+
const credentials = this.loadCredentials();
|
|
162
|
+
if (credentials) {
|
|
163
|
+
// Check if token is expired
|
|
164
|
+
if (isTokenExpired(credentials.expiresAt)) {
|
|
165
|
+
console.log('Token expired, attempting refresh...');
|
|
166
|
+
if (credentials.refreshToken && credentials.method === 'subscription') {
|
|
167
|
+
// Attempt to refresh the token
|
|
168
|
+
const refreshed = await refreshSubscriptionToken(credentials.refreshToken);
|
|
169
|
+
if (refreshed) {
|
|
170
|
+
this.saveCredentials(refreshed);
|
|
171
|
+
console.log('✓ Token refreshed successfully');
|
|
172
|
+
return refreshed.subscriptionKey || refreshed.apiKey || null;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
console.error('✗ Token refresh failed');
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// If we reach here, refresh failed or not possible
|
|
179
|
+
console.error('Token expired and could not be refreshed. Please run: monty login');
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
return credentials.subscriptionKey || credentials.apiKey || null;
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get current auth method
|
|
188
|
+
*/
|
|
189
|
+
getAuthMethod() {
|
|
190
|
+
if (process.env[AUTH_ENV_VARS.SUBSCRIPTION_KEY]) {
|
|
191
|
+
return 'subscription';
|
|
192
|
+
}
|
|
193
|
+
if (process.env[AUTH_ENV_VARS.API_KEY]) {
|
|
194
|
+
return 'api_key';
|
|
195
|
+
}
|
|
196
|
+
const credentials = this.loadCredentials();
|
|
197
|
+
return credentials?.method || null;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get user info for display
|
|
201
|
+
*/
|
|
202
|
+
getUserInfo() {
|
|
203
|
+
const credentials = this.loadCredentials();
|
|
204
|
+
const apiKey = this.getApiKeySync();
|
|
205
|
+
return {
|
|
206
|
+
authenticated: this.isAuthenticated(),
|
|
207
|
+
method: this.getAuthMethod(),
|
|
208
|
+
email: credentials?.email || null,
|
|
209
|
+
tier: credentials?.tier || null,
|
|
210
|
+
keyPreview: apiKey ? `${apiKey.slice(0, 8)}...${apiKey.slice(-4)}` : null,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Attempt to auto-detect Claude Code subscription credentials
|
|
215
|
+
* Checks paths defined in authConfig.claudeCodePaths
|
|
216
|
+
*/
|
|
217
|
+
async autoDetectClaudeCode() {
|
|
218
|
+
console.log('Checking for existing Claude Code subscription credentials...');
|
|
219
|
+
console.log(' Checking paths:', getClaudeCodePaths().join(', '));
|
|
220
|
+
try {
|
|
221
|
+
const claudeCreds = await detectClaudeCodeCredentials();
|
|
222
|
+
if (claudeCreds) {
|
|
223
|
+
console.log('✓ Found Claude Code subscription credentials!');
|
|
224
|
+
const daysRemaining = getDaysUntilExpiration(claudeCreds.expiresAt);
|
|
225
|
+
if (daysRemaining !== null) {
|
|
226
|
+
console.log(`✓ Token is valid (expires in ${daysRemaining} days)`);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
console.log('✓ Token is valid');
|
|
230
|
+
}
|
|
231
|
+
// Determine tier from credentials if available
|
|
232
|
+
const tier = claudeCreds.tier || 'pro';
|
|
233
|
+
const credentials = {
|
|
234
|
+
method: 'subscription',
|
|
235
|
+
source: 'auto-detect',
|
|
236
|
+
subscriptionKey: claudeCreds.accessToken,
|
|
237
|
+
refreshToken: claudeCreds.refreshToken,
|
|
238
|
+
tier,
|
|
239
|
+
userId: `user_${Date.now()}`,
|
|
240
|
+
// Normalize expiresAt to milliseconds
|
|
241
|
+
expiresAt: claudeCreds.expiresAt
|
|
242
|
+
? (claudeCreds.expiresAt > 1e12 ? claudeCreds.expiresAt : claudeCreds.expiresAt * 1000)
|
|
243
|
+
: undefined,
|
|
244
|
+
};
|
|
245
|
+
this.saveCredentials(credentials);
|
|
246
|
+
console.log('✓ Imported successfully');
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
console.log('No Claude Code subscription credentials found.');
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
console.error('Error detecting Claude Code credentials:', error);
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Interactive login flow
|
|
259
|
+
* Supports:
|
|
260
|
+
* 1. Auto-detection of Claude Code subscription credentials
|
|
261
|
+
* 2. OAuth login via claude.ai (for Pro/Max/Team/Enterprise subscribers)
|
|
262
|
+
* 3. Manual Anthropic API key entry
|
|
263
|
+
*/
|
|
264
|
+
async login(options) {
|
|
265
|
+
const rl = createInterface({
|
|
266
|
+
input: process.stdin,
|
|
267
|
+
output: process.stdout,
|
|
268
|
+
});
|
|
269
|
+
const question = (prompt) => {
|
|
270
|
+
return new Promise((resolve) => {
|
|
271
|
+
rl.question(prompt, (answer) => {
|
|
272
|
+
resolve(answer.trim());
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
try {
|
|
277
|
+
// Auto-detect first if no specific method requested
|
|
278
|
+
if (!options?.method && !options?.key) {
|
|
279
|
+
const autoDetected = await this.autoDetectClaudeCode();
|
|
280
|
+
if (autoDetected) {
|
|
281
|
+
rl.close();
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
console.log('\n╔══════════════════════════════════════════════════════════════╗');
|
|
286
|
+
console.log('║ Monty Agent Authentication ║');
|
|
287
|
+
console.log('╚══════════════════════════════════════════════════════════════╝\n');
|
|
288
|
+
let method = options?.method || 'subscription';
|
|
289
|
+
let key = options?.key || '';
|
|
290
|
+
let email = options?.email || '';
|
|
291
|
+
let source = 'manual';
|
|
292
|
+
// If method not provided, ask user
|
|
293
|
+
if (!options?.method) {
|
|
294
|
+
console.log('Select authentication method:\n');
|
|
295
|
+
console.log(' 1. Login with Claude Subscription (Pro/Max/Team/Enterprise) - Recommended');
|
|
296
|
+
console.log(' Uses Claude Code CLI to authenticate with your claude.ai account\n');
|
|
297
|
+
console.log(' 2. Use Anthropic API Key (from console.anthropic.com)');
|
|
298
|
+
console.log(' For developers with API access\n');
|
|
299
|
+
const choice = await question('Enter choice (1 or 2): ');
|
|
300
|
+
if (choice === '2') {
|
|
301
|
+
method = 'api_key';
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
method = 'subscription';
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Handle subscription login via Claude Code CLI
|
|
308
|
+
if (!key && method === 'subscription') {
|
|
309
|
+
console.log('\n─────────────────────────────────────────────────────────────');
|
|
310
|
+
console.log(' Claude Subscription Login');
|
|
311
|
+
console.log('─────────────────────────────────────────────────────────────\n');
|
|
312
|
+
console.log('To authenticate with your Claude subscription:\n');
|
|
313
|
+
console.log(' Step 1: Run "claude login" in your terminal');
|
|
314
|
+
console.log(' This will open a browser to authenticate with claude.ai\n');
|
|
315
|
+
console.log(' Step 2: After authenticating, run "monty login" again');
|
|
316
|
+
console.log(' Monty will automatically detect your credentials\n');
|
|
317
|
+
const proceed = await question('Have you already run "claude login"? (y/N): ');
|
|
318
|
+
if (proceed.toLowerCase() === 'y') {
|
|
319
|
+
// Try auto-detection again
|
|
320
|
+
console.log('\nRe-checking for Claude Code credentials...');
|
|
321
|
+
const detected = await this.autoDetectClaudeCode();
|
|
322
|
+
if (detected) {
|
|
323
|
+
rl.close();
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
console.log('\nStill no credentials found. Please ensure "claude login" completed successfully.\n');
|
|
327
|
+
}
|
|
328
|
+
const openClaude = await question('Would you like to open Claude Code installation page? (y/N): ');
|
|
329
|
+
if (openClaude.toLowerCase() === 'y') {
|
|
330
|
+
try {
|
|
331
|
+
await open('https://docs.anthropic.com/en/docs/claude-code/getting-started');
|
|
332
|
+
console.log('✓ Browser opened to Claude Code documentation\n');
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
console.log('Could not open browser. Visit: https://docs.anthropic.com/en/docs/claude-code/getting-started\n');
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
const useApiKey = await question('Would you like to use an Anthropic API key instead? (y/N): ');
|
|
339
|
+
if (useApiKey.toLowerCase() === 'y') {
|
|
340
|
+
method = 'api_key';
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
console.log('\nPlease run "claude login" first, then try "monty login" again.\n');
|
|
344
|
+
rl.close();
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Get API key manually
|
|
349
|
+
if (!key && method === 'api_key') {
|
|
350
|
+
console.log('\n─────────────────────────────────────────────────────────────');
|
|
351
|
+
console.log(' Anthropic API Key Entry');
|
|
352
|
+
console.log('─────────────────────────────────────────────────────────────\n');
|
|
353
|
+
console.log('To get your Anthropic API key:');
|
|
354
|
+
console.log(' 1. Go to https://console.anthropic.com/settings/keys');
|
|
355
|
+
console.log(' 2. Create a new key or copy an existing one\n');
|
|
356
|
+
const openBrowser = await question('Open browser to get API key? (y/N): ');
|
|
357
|
+
if (openBrowser.toLowerCase() === 'y') {
|
|
358
|
+
try {
|
|
359
|
+
await open('https://console.anthropic.com/settings/keys');
|
|
360
|
+
console.log('✓ Browser opened to Anthropic Console\n');
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
console.log('Could not open browser. Please visit the URL manually.\n');
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
key = await question('API key (sk-ant-...): ');
|
|
367
|
+
source = 'manual';
|
|
368
|
+
}
|
|
369
|
+
// Validate key format
|
|
370
|
+
if (!key || key.length < 20) {
|
|
371
|
+
console.log('\n✗ Error: Invalid key format. Key appears too short.');
|
|
372
|
+
rl.close();
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
// Optional: get email for display purposes
|
|
376
|
+
if (!email) {
|
|
377
|
+
email = await question('\nEmail (optional, press Enter to skip): ');
|
|
378
|
+
}
|
|
379
|
+
// Validate the key by making a test API call
|
|
380
|
+
console.log('\nValidating credentials...');
|
|
381
|
+
const isValid = await this.validateKey(key);
|
|
382
|
+
if (!isValid) {
|
|
383
|
+
console.log('\n✗ Error: Could not validate credentials. Please check your key and try again.');
|
|
384
|
+
rl.close();
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
console.log('✓ Credentials validated');
|
|
388
|
+
// Save credentials
|
|
389
|
+
const credentials = {
|
|
390
|
+
method,
|
|
391
|
+
source,
|
|
392
|
+
...(method === 'subscription' ? { subscriptionKey: key } : { apiKey: key }),
|
|
393
|
+
email: email || undefined,
|
|
394
|
+
tier: 'pro', // Default, would be fetched from API in production
|
|
395
|
+
userId: `user_${Date.now()}`,
|
|
396
|
+
};
|
|
397
|
+
this.saveCredentials(credentials);
|
|
398
|
+
console.log('\n═══════════════════════════════════════════════════════════════');
|
|
399
|
+
console.log(' ✓ Login Successful!');
|
|
400
|
+
console.log('═══════════════════════════════════════════════════════════════\n');
|
|
401
|
+
console.log(` Method: ${method === 'subscription' ? 'Claude Subscription' : 'Anthropic API Key'}`);
|
|
402
|
+
console.log(` Source: ${source}`);
|
|
403
|
+
if (email) {
|
|
404
|
+
console.log(` Email: ${email}`);
|
|
405
|
+
}
|
|
406
|
+
console.log(` Key: ${key.slice(0, 8)}...${key.slice(-4)}`);
|
|
407
|
+
console.log('\n Credentials saved to: ~/.monty/credentials.json');
|
|
408
|
+
console.log('\n You can now run "monty init" or "monty code" to start.\n');
|
|
409
|
+
rl.close();
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
console.error('Login failed:', error);
|
|
414
|
+
rl.close();
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Validate an API key by making a test request
|
|
420
|
+
*/
|
|
421
|
+
async validateKey(key) {
|
|
422
|
+
try {
|
|
423
|
+
// Make a minimal API request to validate the key
|
|
424
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
425
|
+
method: 'POST',
|
|
426
|
+
headers: {
|
|
427
|
+
'Content-Type': 'application/json',
|
|
428
|
+
'x-api-key': key,
|
|
429
|
+
'anthropic-version': '2023-06-01',
|
|
430
|
+
},
|
|
431
|
+
body: JSON.stringify({
|
|
432
|
+
model: 'claude-3-haiku-20240307',
|
|
433
|
+
max_tokens: 1,
|
|
434
|
+
messages: [{ role: 'user', content: 'hi' }],
|
|
435
|
+
}),
|
|
436
|
+
});
|
|
437
|
+
// 200 = valid, 401 = invalid key, 400 = valid key but bad request (still valid)
|
|
438
|
+
return response.status === 200 || response.status === 400;
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
// Network error - assume key might be valid, let actual usage fail if not
|
|
442
|
+
console.warn('Could not validate key online, proceeding anyway...');
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Logout - clear credentials
|
|
448
|
+
*/
|
|
449
|
+
logout() {
|
|
450
|
+
const wasAuthenticated = this.isAuthenticated();
|
|
451
|
+
this.clearCredentials();
|
|
452
|
+
if (wasAuthenticated) {
|
|
453
|
+
console.log('\nYou have been logged out.');
|
|
454
|
+
console.log('Your credentials have been removed from ~/.monty/credentials.json\n');
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
console.log('\nYou were not logged in.\n');
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Display current auth status (whoami)
|
|
462
|
+
*/
|
|
463
|
+
whoami() {
|
|
464
|
+
const info = this.getUserInfo();
|
|
465
|
+
const credentials = this.loadCredentials();
|
|
466
|
+
console.log('\n╔══════════════════════════════════════════════════════════════╗');
|
|
467
|
+
console.log('║ Monty Agent - Current User ║');
|
|
468
|
+
console.log('╚══════════════════════════════════════════════════════════════╝\n');
|
|
469
|
+
if (!info.authenticated) {
|
|
470
|
+
console.log(' Status: Not authenticated\n');
|
|
471
|
+
console.log(' Run "monty login" to authenticate.\n');
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
console.log(' Status: ✓ Authenticated');
|
|
475
|
+
console.log(` Method: ${info.method === 'subscription' ? 'Claude Subscription' : 'Anthropic API Key'}`);
|
|
476
|
+
if (credentials?.source) {
|
|
477
|
+
console.log(` Source: ${credentials.source}`);
|
|
478
|
+
}
|
|
479
|
+
if (info.email) {
|
|
480
|
+
console.log(` Email: ${info.email}`);
|
|
481
|
+
}
|
|
482
|
+
if (info.tier) {
|
|
483
|
+
const tierDisplay = info.tier.charAt(0).toUpperCase() + info.tier.slice(1);
|
|
484
|
+
console.log(` Tier: ${tierDisplay}`);
|
|
485
|
+
}
|
|
486
|
+
if (info.keyPreview) {
|
|
487
|
+
console.log(` Key: ${info.keyPreview}`);
|
|
488
|
+
}
|
|
489
|
+
// Check if using environment variable
|
|
490
|
+
if (process.env[AUTH_ENV_VARS.SUBSCRIPTION_KEY] || process.env[AUTH_ENV_VARS.API_KEY]) {
|
|
491
|
+
console.log('\n Note: Using credentials from environment variable');
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
console.log('\n Credentials: ~/.monty/credentials.json');
|
|
495
|
+
}
|
|
496
|
+
console.log('');
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Set environment variable for child processes
|
|
500
|
+
*/
|
|
501
|
+
setEnvForChildProcess() {
|
|
502
|
+
const apiKey = this.getApiKeySync();
|
|
503
|
+
if (apiKey) {
|
|
504
|
+
// SDK only reads ANTHROPIC_API_KEY, so just set that one variable
|
|
505
|
+
process.env[AUTH_ENV_VARS.API_KEY] = apiKey;
|
|
506
|
+
// Log which authentication method is being used (for debugging)
|
|
507
|
+
const method = this.getAuthMethod();
|
|
508
|
+
if (method === 'subscription') {
|
|
509
|
+
console.log('✓ Authentication configured: Claude subscription');
|
|
510
|
+
}
|
|
511
|
+
else if (method === 'api_key') {
|
|
512
|
+
console.log('✓ Authentication configured: API key');
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
console.log('✓ Authentication configured');
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Check authentication and return status for CLI
|
|
521
|
+
*/
|
|
522
|
+
checkAuth() {
|
|
523
|
+
if (this.isAuthenticated()) {
|
|
524
|
+
return {
|
|
525
|
+
authenticated: true,
|
|
526
|
+
message: 'Authenticated',
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
return {
|
|
530
|
+
authenticated: false,
|
|
531
|
+
message: `Not authenticated. Run "monty login" to sign in, or set ${AUTH_ENV_VARS.API_KEY} environment variable.`,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
// Export singleton instance
|
|
536
|
+
export const authManager = AuthManager.getInstance();
|
|
537
|
+
// Export convenience functions
|
|
538
|
+
export function isAuthenticated() {
|
|
539
|
+
return authManager.isAuthenticated();
|
|
540
|
+
}
|
|
541
|
+
export function getApiKey() {
|
|
542
|
+
return authManager.getApiKeySync();
|
|
543
|
+
}
|
|
544
|
+
export function login(options) {
|
|
545
|
+
return authManager.login(options);
|
|
546
|
+
}
|
|
547
|
+
export function logout() {
|
|
548
|
+
authManager.logout();
|
|
549
|
+
}
|
|
550
|
+
export function whoami() {
|
|
551
|
+
authManager.whoami();
|
|
552
|
+
}
|
|
553
|
+
export function checkAuth() {
|
|
554
|
+
return authManager.checkAuth();
|
|
555
|
+
}
|
|
556
|
+
export function setEnvForChildProcess() {
|
|
557
|
+
authManager.setEnvForChildProcess();
|
|
558
|
+
}
|
|
559
|
+
export default authManager;
|
|
560
|
+
//# sourceMappingURL=auth-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-manager.js","sourceRoot":"","sources":["../../src/utils/auth-manager.ts"],"names":[],"mappings":"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"}
|