oh-my-claude-sisyphus 1.11.2 → 2.0.1
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/README.md +37 -12
- package/dist/__tests__/example.test.d.ts +2 -0
- package/dist/__tests__/example.test.d.ts.map +1 -0
- package/dist/__tests__/example.test.js +20 -0
- package/dist/__tests__/example.test.js.map +1 -0
- package/dist/__tests__/hooks.test.d.ts +2 -0
- package/dist/__tests__/hooks.test.d.ts.map +1 -0
- package/dist/__tests__/hooks.test.js +644 -0
- package/dist/__tests__/hooks.test.js.map +1 -0
- package/dist/__tests__/installer.test.d.ts +2 -0
- package/dist/__tests__/installer.test.d.ts.map +1 -0
- package/dist/__tests__/installer.test.js +369 -0
- package/dist/__tests__/installer.test.js.map +1 -0
- package/dist/__tests__/model-routing.test.d.ts +2 -0
- package/dist/__tests__/model-routing.test.d.ts.map +1 -0
- package/dist/__tests__/model-routing.test.js +814 -0
- package/dist/__tests__/model-routing.test.js.map +1 -0
- package/dist/__tests__/skills.test.d.ts +2 -0
- package/dist/__tests__/skills.test.d.ts.map +1 -0
- package/dist/__tests__/skills.test.js +126 -0
- package/dist/__tests__/skills.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +77 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/agents/definitions.d.ts +1 -1
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +35 -3
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +3 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/oracle.d.ts.map +1 -1
- package/dist/agents/oracle.js +43 -1
- package/dist/agents/oracle.js.map +1 -1
- package/dist/agents/orchestrator-sisyphus.js +2 -2
- package/dist/agents/orchestrator-sisyphus.js.map +1 -1
- package/dist/cli/index.js +22 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +49 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/features/auto-update.d.ts.map +1 -1
- package/dist/features/auto-update.js +14 -3
- package/dist/features/auto-update.js.map +1 -1
- package/dist/features/builtin-skills/skills.d.ts.map +1 -1
- package/dist/features/builtin-skills/skills.js +0 -1351
- package/dist/features/builtin-skills/skills.js.map +1 -1
- package/dist/features/index.d.ts +1 -0
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +14 -0
- package/dist/features/index.js.map +1 -1
- package/dist/features/model-routing/index.d.ts +34 -0
- package/dist/features/model-routing/index.d.ts.map +1 -0
- package/dist/features/model-routing/index.js +48 -0
- package/dist/features/model-routing/index.js.map +1 -0
- package/dist/features/model-routing/prompts/haiku.d.ts +54 -0
- package/dist/features/model-routing/prompts/haiku.d.ts.map +1 -0
- package/dist/features/model-routing/prompts/haiku.js +141 -0
- package/dist/features/model-routing/prompts/haiku.js.map +1 -0
- package/dist/features/model-routing/prompts/index.d.ts +45 -0
- package/dist/features/model-routing/prompts/index.d.ts.map +1 -0
- package/dist/features/model-routing/prompts/index.js +116 -0
- package/dist/features/model-routing/prompts/index.js.map +1 -0
- package/dist/features/model-routing/prompts/opus.d.ts +34 -0
- package/dist/features/model-routing/prompts/opus.d.ts.map +1 -0
- package/dist/features/model-routing/prompts/opus.js +153 -0
- package/dist/features/model-routing/prompts/opus.js.map +1 -0
- package/dist/features/model-routing/prompts/sonnet.d.ts +38 -0
- package/dist/features/model-routing/prompts/sonnet.d.ts.map +1 -0
- package/dist/features/model-routing/prompts/sonnet.js +149 -0
- package/dist/features/model-routing/prompts/sonnet.js.map +1 -0
- package/dist/features/model-routing/router.d.ts +92 -0
- package/dist/features/model-routing/router.d.ts.map +1 -0
- package/dist/features/model-routing/router.js +267 -0
- package/dist/features/model-routing/router.js.map +1 -0
- package/dist/features/model-routing/rules.d.ts +32 -0
- package/dist/features/model-routing/rules.d.ts.map +1 -0
- package/dist/features/model-routing/rules.js +224 -0
- package/dist/features/model-routing/rules.js.map +1 -0
- package/dist/features/model-routing/scorer.d.ts +35 -0
- package/dist/features/model-routing/scorer.d.ts.map +1 -0
- package/dist/features/model-routing/scorer.js +241 -0
- package/dist/features/model-routing/scorer.js.map +1 -0
- package/dist/features/model-routing/signals.d.ts +26 -0
- package/dist/features/model-routing/signals.d.ts.map +1 -0
- package/dist/features/model-routing/signals.js +283 -0
- package/dist/features/model-routing/signals.js.map +1 -0
- package/dist/features/model-routing/types.d.ts +195 -0
- package/dist/features/model-routing/types.d.ts.map +1 -0
- package/dist/features/model-routing/types.js +86 -0
- package/dist/features/model-routing/types.js.map +1 -0
- package/dist/hooks/agent-usage-reminder/index.d.ts +1 -1
- package/dist/hooks/agent-usage-reminder/index.d.ts.map +1 -1
- package/dist/hooks/agent-usage-reminder/index.js +1 -1
- package/dist/hooks/agent-usage-reminder/index.js.map +1 -1
- package/dist/hooks/auto-slash-command/executor.js.map +1 -1
- package/dist/hooks/auto-slash-command/index.d.ts +3 -3
- package/dist/hooks/auto-slash-command/index.d.ts.map +1 -1
- package/dist/hooks/auto-slash-command/index.js.map +1 -1
- package/dist/hooks/background-notification/index.js +1 -1
- package/dist/hooks/background-notification/index.js.map +1 -1
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/comment-checker/filters.d.ts +1 -1
- package/dist/hooks/comment-checker/filters.d.ts.map +1 -1
- package/dist/hooks/comment-checker/filters.js +1 -1
- package/dist/hooks/comment-checker/filters.js.map +1 -1
- package/dist/hooks/comment-checker/index.js +1 -1
- package/dist/hooks/comment-checker/index.js.map +1 -1
- package/dist/hooks/context-window-limit-recovery/index.d.ts.map +1 -1
- package/dist/hooks/context-window-limit-recovery/index.js.map +1 -1
- package/dist/hooks/index.d.ts +3 -3
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -3
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/keyword-detector/index.d.ts +1 -1
- package/dist/hooks/keyword-detector/index.d.ts.map +1 -1
- package/dist/hooks/keyword-detector/index.js +1 -1
- package/dist/hooks/keyword-detector/index.js.map +1 -1
- package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
- package/dist/hooks/persistent-mode/index.js.map +1 -1
- package/dist/hooks/plugin-patterns/index.d.ts.map +1 -1
- package/dist/hooks/plugin-patterns/index.js +12 -22
- package/dist/hooks/plugin-patterns/index.js.map +1 -1
- package/dist/hooks/preemptive-compaction/index.d.ts +2 -2
- package/dist/hooks/preemptive-compaction/index.d.ts.map +1 -1
- package/dist/hooks/preemptive-compaction/index.js +1 -11
- package/dist/hooks/preemptive-compaction/index.js.map +1 -1
- package/dist/hooks/ralph-loop/index.js.map +1 -1
- package/dist/hooks/rules-injector/matcher.js +1 -1
- package/dist/hooks/rules-injector/matcher.js.map +1 -1
- package/dist/hooks/session-recovery/index.d.ts +1 -1
- package/dist/hooks/session-recovery/index.d.ts.map +1 -1
- package/dist/hooks/session-recovery/index.js +1 -1
- package/dist/hooks/session-recovery/index.js.map +1 -1
- package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +1 -1
- package/dist/hooks/sisyphus-orchestrator/index.js.map +1 -1
- package/dist/hooks/ultrawork-state/index.js +1 -1
- package/dist/hooks/ultrawork-state/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/installer/hooks.d.ts +1 -1
- package/dist/installer/hooks.js +1 -1
- package/dist/installer/index.d.ts +8 -7
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +648 -2141
- package/dist/installer/index.js.map +1 -1
- package/dist/shared/types.d.ts +25 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/tools/lsp/servers.d.ts.map +1 -1
- package/dist/tools/lsp/servers.js +2 -14
- package/dist/tools/lsp/servers.js.map +1 -1
- package/package.json +18 -10
- package/scripts/install.sh +236 -260
- package/scripts/test-pr25.sh +525 -0
- package/dist/agents/model-lists.d.ts +0 -26
- package/dist/agents/model-lists.d.ts.map +0 -1
- package/dist/agents/model-lists.js +0 -62
- package/dist/agents/model-lists.js.map +0 -1
- package/dist/auth/index.d.ts +0 -10
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -13
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/manager.d.ts +0 -54
- package/dist/auth/manager.d.ts.map +0 -1
- package/dist/auth/manager.js +0 -248
- package/dist/auth/manager.js.map +0 -1
- package/dist/auth/oauth-google.d.ts +0 -47
- package/dist/auth/oauth-google.d.ts.map +0 -1
- package/dist/auth/oauth-google.js +0 -280
- package/dist/auth/oauth-google.js.map +0 -1
- package/dist/auth/oauth-openai.d.ts +0 -46
- package/dist/auth/oauth-openai.d.ts.map +0 -1
- package/dist/auth/oauth-openai.js +0 -264
- package/dist/auth/oauth-openai.js.map +0 -1
- package/dist/auth/pkce.d.ts +0 -14
- package/dist/auth/pkce.d.ts.map +0 -1
- package/dist/auth/pkce.js +0 -35
- package/dist/auth/pkce.js.map +0 -1
- package/dist/auth/storage.d.ts +0 -52
- package/dist/auth/storage.d.ts.map +0 -1
- package/dist/auth/storage.js +0 -230
- package/dist/auth/storage.js.map +0 -1
- package/dist/auth/types.d.ts +0 -76
- package/dist/auth/types.d.ts.map +0 -1
- package/dist/auth/types.js +0 -5
- package/dist/auth/types.js.map +0 -1
- package/dist/providers/index.d.ts +0 -8
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -10
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/registry.d.ts +0 -29
- package/dist/providers/registry.d.ts.map +0 -1
- package/dist/providers/registry.js +0 -162
- package/dist/providers/registry.js.map +0 -1
- package/dist/providers/router.d.ts +0 -40
- package/dist/providers/router.d.ts.map +0 -1
- package/dist/providers/router.js +0 -88
- package/dist/providers/router.js.map +0 -1
- package/dist/providers/types.d.ts +0 -92
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -27
- package/dist/providers/types.js.map +0 -1
package/dist/auth/manager.d.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unified authentication manager for all providers
|
|
3
|
-
*/
|
|
4
|
-
import type { ProviderType } from '../providers/types.js';
|
|
5
|
-
import type { AuthStatus, ConnectOptions } from './types.js';
|
|
6
|
-
/**
|
|
7
|
-
* Authentication manager
|
|
8
|
-
*/
|
|
9
|
-
export declare class AuthManager {
|
|
10
|
-
private storage;
|
|
11
|
-
private openaiOAuth;
|
|
12
|
-
private googleOAuth;
|
|
13
|
-
constructor();
|
|
14
|
-
/**
|
|
15
|
-
* Connect to a provider
|
|
16
|
-
*
|
|
17
|
-
* For OAuth providers (openai, google): Opens browser for authentication
|
|
18
|
-
* For API key providers (anthropic, openrouter): Requires apiKey in options
|
|
19
|
-
*/
|
|
20
|
-
connect(provider: ProviderType, options?: ConnectOptions): Promise<void>;
|
|
21
|
-
/**
|
|
22
|
-
* Disconnect from a provider
|
|
23
|
-
*/
|
|
24
|
-
logout(provider: ProviderType): Promise<void>;
|
|
25
|
-
/**
|
|
26
|
-
* Get authentication status for all providers
|
|
27
|
-
*/
|
|
28
|
-
getStatus(): Promise<AuthStatus[]>;
|
|
29
|
-
/**
|
|
30
|
-
* Get authentication status for a specific provider
|
|
31
|
-
*/
|
|
32
|
-
getStatusForProvider(provider: ProviderType): Promise<AuthStatus>;
|
|
33
|
-
/**
|
|
34
|
-
* Check if a provider is authenticated
|
|
35
|
-
*/
|
|
36
|
-
isAuthenticated(provider: ProviderType): Promise<boolean>;
|
|
37
|
-
/**
|
|
38
|
-
* Get access token for a provider (auto-refreshes if needed)
|
|
39
|
-
*/
|
|
40
|
-
getAccessToken(provider: ProviderType): Promise<string | null>;
|
|
41
|
-
/**
|
|
42
|
-
* Get authorization headers for a provider
|
|
43
|
-
*/
|
|
44
|
-
getHeaders(provider: ProviderType): Promise<Record<string, string>>;
|
|
45
|
-
/**
|
|
46
|
-
* Refresh OAuth tokens if they're close to expiring
|
|
47
|
-
*/
|
|
48
|
-
private refreshIfNeeded;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Get the auth manager instance
|
|
52
|
-
*/
|
|
53
|
-
export declare function getAuthManager(): AuthManager;
|
|
54
|
-
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/auth/manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAU7D;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAc;;IAQjC;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C9E;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAKxC;;OAEG;IACG,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IA4DvE;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/D;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBpE;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAuCzE;;OAEG;YACW,eAAe;CA+B9B;AAOD;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
|
package/dist/auth/manager.js
DELETED
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unified authentication manager for all providers
|
|
3
|
-
*/
|
|
4
|
-
import { getCredentialStorage } from './storage.js';
|
|
5
|
-
import { createOpenAIOAuth } from './oauth-openai.js';
|
|
6
|
-
import { createGoogleOAuth } from './oauth-google.js';
|
|
7
|
-
/**
|
|
8
|
-
* Time before expiry to refresh tokens (5 minutes)
|
|
9
|
-
*/
|
|
10
|
-
const REFRESH_THRESHOLD_MS = 5 * 60 * 1000;
|
|
11
|
-
/**
|
|
12
|
-
* Authentication manager
|
|
13
|
-
*/
|
|
14
|
-
export class AuthManager {
|
|
15
|
-
storage;
|
|
16
|
-
openaiOAuth;
|
|
17
|
-
googleOAuth;
|
|
18
|
-
constructor() {
|
|
19
|
-
this.storage = getCredentialStorage();
|
|
20
|
-
this.openaiOAuth = createOpenAIOAuth();
|
|
21
|
-
this.googleOAuth = createGoogleOAuth();
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Connect to a provider
|
|
25
|
-
*
|
|
26
|
-
* For OAuth providers (openai, google): Opens browser for authentication
|
|
27
|
-
* For API key providers (anthropic, openrouter): Requires apiKey in options
|
|
28
|
-
*/
|
|
29
|
-
async connect(provider, options) {
|
|
30
|
-
// Check if already connected and not forcing
|
|
31
|
-
if (!options?.force && await this.isAuthenticated(provider)) {
|
|
32
|
-
const status = await this.getStatusForProvider(provider);
|
|
33
|
-
console.log(`Already connected to ${provider}${status.email ? ` as ${status.email}` : ''}.`);
|
|
34
|
-
console.log('Use --force to re-authenticate.');
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
switch (provider) {
|
|
38
|
-
case 'openai': {
|
|
39
|
-
const result = await this.openaiOAuth.authenticate();
|
|
40
|
-
if (result.success && result.tokens) {
|
|
41
|
-
await this.storage.storeOAuthTokens('openai', result.tokens, result.email);
|
|
42
|
-
console.log(`\nConnected to OpenAI${result.email ? ` as ${result.email}` : ''}.`);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
throw new Error(result.error || 'OpenAI authentication failed');
|
|
46
|
-
}
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
case 'google': {
|
|
50
|
-
const result = await this.googleOAuth.authenticate();
|
|
51
|
-
if (result.success && result.tokens) {
|
|
52
|
-
await this.storage.storeOAuthTokens('google', result.tokens, result.email);
|
|
53
|
-
console.log(`\nConnected to Google${result.email ? ` as ${result.email}` : ''}.`);
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
throw new Error(result.error || 'Google authentication failed');
|
|
57
|
-
}
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
case 'anthropic':
|
|
61
|
-
case 'openrouter': {
|
|
62
|
-
if (!options?.apiKey) {
|
|
63
|
-
throw new Error(`API key required for ${provider}. Use /connect ${provider} <api-key>`);
|
|
64
|
-
}
|
|
65
|
-
await this.storage.storeApiKey(provider, options.apiKey);
|
|
66
|
-
console.log(`Connected to ${provider}.`);
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
default:
|
|
70
|
-
throw new Error(`Unknown provider: ${provider}`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Disconnect from a provider
|
|
75
|
-
*/
|
|
76
|
-
async logout(provider) {
|
|
77
|
-
await this.storage.delete(provider);
|
|
78
|
-
console.log(`Disconnected from ${provider}.`);
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Get authentication status for all providers
|
|
82
|
-
*/
|
|
83
|
-
async getStatus() {
|
|
84
|
-
const providers = ['anthropic', 'openai', 'google', 'openrouter'];
|
|
85
|
-
return Promise.all(providers.map(p => this.getStatusForProvider(p)));
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Get authentication status for a specific provider
|
|
89
|
-
*/
|
|
90
|
-
async getStatusForProvider(provider) {
|
|
91
|
-
// Check environment variables for API key providers
|
|
92
|
-
if (provider === 'anthropic' && process.env.ANTHROPIC_API_KEY) {
|
|
93
|
-
return {
|
|
94
|
-
provider,
|
|
95
|
-
authenticated: true,
|
|
96
|
-
authType: 'api_key',
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
if (provider === 'openrouter' && process.env.OPENROUTER_API_KEY) {
|
|
100
|
-
return {
|
|
101
|
-
provider,
|
|
102
|
-
authenticated: true,
|
|
103
|
-
authType: 'api_key',
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
const credential = await this.storage.getCredential(provider);
|
|
107
|
-
if (!credential) {
|
|
108
|
-
return {
|
|
109
|
-
provider,
|
|
110
|
-
authenticated: false,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
// Check if OAuth token is expired
|
|
114
|
-
if (credential.type === 'oauth' && credential.expiresAt) {
|
|
115
|
-
if (Date.now() > credential.expiresAt) {
|
|
116
|
-
// Try to refresh
|
|
117
|
-
try {
|
|
118
|
-
await this.refreshIfNeeded(provider);
|
|
119
|
-
const refreshed = await this.storage.getCredential(provider);
|
|
120
|
-
return {
|
|
121
|
-
provider,
|
|
122
|
-
authenticated: true,
|
|
123
|
-
authType: 'oauth',
|
|
124
|
-
expiresAt: refreshed?.expiresAt,
|
|
125
|
-
email: refreshed?.email,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
return {
|
|
130
|
-
provider,
|
|
131
|
-
authenticated: false,
|
|
132
|
-
error: 'Token expired and refresh failed',
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return {
|
|
138
|
-
provider,
|
|
139
|
-
authenticated: true,
|
|
140
|
-
authType: credential.type,
|
|
141
|
-
expiresAt: credential.expiresAt,
|
|
142
|
-
email: credential.email,
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Check if a provider is authenticated
|
|
147
|
-
*/
|
|
148
|
-
async isAuthenticated(provider) {
|
|
149
|
-
const status = await this.getStatusForProvider(provider);
|
|
150
|
-
return status.authenticated;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Get access token for a provider (auto-refreshes if needed)
|
|
154
|
-
*/
|
|
155
|
-
async getAccessToken(provider) {
|
|
156
|
-
// Check environment variables first
|
|
157
|
-
if (provider === 'anthropic' && process.env.ANTHROPIC_API_KEY) {
|
|
158
|
-
return process.env.ANTHROPIC_API_KEY;
|
|
159
|
-
}
|
|
160
|
-
if (provider === 'openrouter' && process.env.OPENROUTER_API_KEY) {
|
|
161
|
-
return process.env.OPENROUTER_API_KEY;
|
|
162
|
-
}
|
|
163
|
-
// Auto-refresh OAuth tokens if needed
|
|
164
|
-
if (provider === 'openai' || provider === 'google') {
|
|
165
|
-
await this.refreshIfNeeded(provider);
|
|
166
|
-
}
|
|
167
|
-
const credential = await this.storage.getCredential(provider);
|
|
168
|
-
return credential?.accessToken || null;
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Get authorization headers for a provider
|
|
172
|
-
*/
|
|
173
|
-
async getHeaders(provider) {
|
|
174
|
-
const token = await this.getAccessToken(provider);
|
|
175
|
-
if (!token) {
|
|
176
|
-
throw new Error(`Not authenticated with ${provider}. Run /connect ${provider}`);
|
|
177
|
-
}
|
|
178
|
-
switch (provider) {
|
|
179
|
-
case 'anthropic':
|
|
180
|
-
return {
|
|
181
|
-
'x-api-key': token,
|
|
182
|
-
'anthropic-version': '2023-06-01',
|
|
183
|
-
'content-type': 'application/json',
|
|
184
|
-
};
|
|
185
|
-
case 'openai':
|
|
186
|
-
return {
|
|
187
|
-
Authorization: `Bearer ${token}`,
|
|
188
|
-
'Content-Type': 'application/json',
|
|
189
|
-
};
|
|
190
|
-
case 'google':
|
|
191
|
-
return {
|
|
192
|
-
Authorization: `Bearer ${token}`,
|
|
193
|
-
'Content-Type': 'application/json',
|
|
194
|
-
};
|
|
195
|
-
case 'openrouter':
|
|
196
|
-
return {
|
|
197
|
-
Authorization: `Bearer ${token}`,
|
|
198
|
-
'Content-Type': 'application/json',
|
|
199
|
-
'HTTP-Referer': 'https://github.com/your-repo', // Required by OpenRouter
|
|
200
|
-
};
|
|
201
|
-
default:
|
|
202
|
-
throw new Error(`Unknown provider: ${provider}`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Refresh OAuth tokens if they're close to expiring
|
|
207
|
-
*/
|
|
208
|
-
async refreshIfNeeded(provider) {
|
|
209
|
-
const credential = await this.storage.getOAuthTokens(provider);
|
|
210
|
-
if (!credential) {
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
// Check if refresh is needed (5 minutes before expiry)
|
|
214
|
-
if (credential.expiresAt && Date.now() > credential.expiresAt - REFRESH_THRESHOLD_MS) {
|
|
215
|
-
if (!credential.refreshToken) {
|
|
216
|
-
throw new Error(`No refresh token available for ${provider}. Please re-authenticate.`);
|
|
217
|
-
}
|
|
218
|
-
console.log(`Refreshing ${provider} token...`);
|
|
219
|
-
try {
|
|
220
|
-
let newTokens;
|
|
221
|
-
if (provider === 'openai') {
|
|
222
|
-
newTokens = await this.openaiOAuth.refreshTokens(credential.refreshToken);
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
newTokens = await this.googleOAuth.refreshTokens(credential.refreshToken);
|
|
226
|
-
}
|
|
227
|
-
await this.storage.storeOAuthTokens(provider, newTokens, credential.email);
|
|
228
|
-
}
|
|
229
|
-
catch (err) {
|
|
230
|
-
throw new Error(`Failed to refresh ${provider} token: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Singleton auth manager instance
|
|
237
|
-
*/
|
|
238
|
-
let authManagerInstance = null;
|
|
239
|
-
/**
|
|
240
|
-
* Get the auth manager instance
|
|
241
|
-
*/
|
|
242
|
-
export function getAuthManager() {
|
|
243
|
-
if (!authManagerInstance) {
|
|
244
|
-
authManagerInstance = new AuthManager();
|
|
245
|
-
}
|
|
246
|
-
return authManagerInstance;
|
|
247
|
-
}
|
|
248
|
-
//# sourceMappingURL=manager.js.map
|
package/dist/auth/manager.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/auth/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Google OAuth 2.0 implementation for consumer Google accounts
|
|
3
|
-
*
|
|
4
|
-
* Uses the same OAuth flow as Gemini CLI
|
|
5
|
-
*/
|
|
6
|
-
import type { OAuthTokens, OAuthConfig } from '../providers/types.js';
|
|
7
|
-
import type { OAuthResult, PKCEData } from './types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Google OAuth configuration
|
|
10
|
-
* These are the same credentials used by Gemini CLI
|
|
11
|
-
*/
|
|
12
|
-
export declare const GOOGLE_OAUTH_CONFIG: OAuthConfig;
|
|
13
|
-
/**
|
|
14
|
-
* Google OAuth handler
|
|
15
|
-
*/
|
|
16
|
-
export declare class GoogleOAuth {
|
|
17
|
-
private config;
|
|
18
|
-
constructor(config?: OAuthConfig);
|
|
19
|
-
/**
|
|
20
|
-
* Generate the authorization URL for the OAuth flow
|
|
21
|
-
*/
|
|
22
|
-
getAuthorizationUrl(pkce: PKCEData, redirectUri: string): string;
|
|
23
|
-
/**
|
|
24
|
-
* Exchange authorization code for tokens
|
|
25
|
-
*/
|
|
26
|
-
exchangeCodeForTokens(code: string, codeVerifier: string, redirectUri: string): Promise<OAuthTokens>;
|
|
27
|
-
/**
|
|
28
|
-
* Refresh tokens using refresh token
|
|
29
|
-
*/
|
|
30
|
-
refreshTokens(refreshToken: string): Promise<OAuthTokens>;
|
|
31
|
-
/**
|
|
32
|
-
* Get user info from Google
|
|
33
|
-
*/
|
|
34
|
-
getUserInfo(accessToken: string): Promise<{
|
|
35
|
-
email?: string;
|
|
36
|
-
}>;
|
|
37
|
-
/**
|
|
38
|
-
* Run the full OAuth authentication flow
|
|
39
|
-
* Opens a browser and waits for callback
|
|
40
|
-
*/
|
|
41
|
-
authenticate(): Promise<OAuthResult>;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Create Google OAuth handler instance
|
|
45
|
-
*/
|
|
46
|
-
export declare function createGoogleOAuth(): GoogleOAuth;
|
|
47
|
-
//# sourceMappingURL=oauth-google.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-google.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-google.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA2BxD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAOjC,CAAC;AAwBF;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,GAAE,WAAiC;IAIrD;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAgBhE;;OAEG;IACG,qBAAqB,CACzB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC;IAsCvB;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAoC/D;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBnE;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;CA8G3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C"}
|
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Google OAuth 2.0 implementation for consumer Google accounts
|
|
3
|
-
*
|
|
4
|
-
* Uses the same OAuth flow as Gemini CLI
|
|
5
|
-
*/
|
|
6
|
-
import * as http from 'http';
|
|
7
|
-
import * as net from 'net';
|
|
8
|
-
import { exec } from 'child_process';
|
|
9
|
-
import { URL, URLSearchParams } from 'url';
|
|
10
|
-
import { generatePKCE, verifyState } from './pkce.js';
|
|
11
|
-
/**
|
|
12
|
-
* Open URL in default browser (cross-platform)
|
|
13
|
-
*/
|
|
14
|
-
function openBrowser(url) {
|
|
15
|
-
const platform = process.platform;
|
|
16
|
-
let command;
|
|
17
|
-
if (platform === 'darwin') {
|
|
18
|
-
command = `open "${url}"`;
|
|
19
|
-
}
|
|
20
|
-
else if (platform === 'win32') {
|
|
21
|
-
command = `start "" "${url}"`;
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
// Linux and others
|
|
25
|
-
command = `xdg-open "${url}"`;
|
|
26
|
-
}
|
|
27
|
-
exec(command, (error) => {
|
|
28
|
-
if (error) {
|
|
29
|
-
console.log('Could not open browser automatically.');
|
|
30
|
-
console.log(`Please visit: ${url}`);
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Google OAuth configuration
|
|
36
|
-
* These are the same credentials used by Gemini CLI
|
|
37
|
-
*/
|
|
38
|
-
export const GOOGLE_OAUTH_CONFIG = {
|
|
39
|
-
clientId: '681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com',
|
|
40
|
-
clientSecret: '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',
|
|
41
|
-
authUrl: 'https://accounts.google.com/o/oauth2/auth',
|
|
42
|
-
tokenUrl: 'https://oauth2.googleapis.com/token',
|
|
43
|
-
redirectUri: 'http://localhost:45289', // Will be updated with dynamic port
|
|
44
|
-
scopes: ['https://www.googleapis.com/auth/cloud-platform'],
|
|
45
|
-
};
|
|
46
|
-
/**
|
|
47
|
-
* Find an available port for the OAuth callback
|
|
48
|
-
*/
|
|
49
|
-
async function findAvailablePort(startPort = 45289) {
|
|
50
|
-
return new Promise((resolve, reject) => {
|
|
51
|
-
const server = net.createServer();
|
|
52
|
-
server.unref();
|
|
53
|
-
server.on('error', (err) => {
|
|
54
|
-
if (err.code === 'EADDRINUSE') {
|
|
55
|
-
// Try next port
|
|
56
|
-
findAvailablePort(startPort + 1).then(resolve).catch(reject);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
reject(err);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
server.listen(startPort, '127.0.0.1', () => {
|
|
63
|
-
const address = server.address();
|
|
64
|
-
server.close(() => resolve(address.port));
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Google OAuth handler
|
|
70
|
-
*/
|
|
71
|
-
export class GoogleOAuth {
|
|
72
|
-
config;
|
|
73
|
-
constructor(config = GOOGLE_OAUTH_CONFIG) {
|
|
74
|
-
this.config = config;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Generate the authorization URL for the OAuth flow
|
|
78
|
-
*/
|
|
79
|
-
getAuthorizationUrl(pkce, redirectUri) {
|
|
80
|
-
const params = new URLSearchParams({
|
|
81
|
-
response_type: 'code',
|
|
82
|
-
client_id: this.config.clientId,
|
|
83
|
-
redirect_uri: redirectUri,
|
|
84
|
-
scope: this.config.scopes.join(' '),
|
|
85
|
-
code_challenge: pkce.codeChallenge,
|
|
86
|
-
code_challenge_method: 'S256',
|
|
87
|
-
access_type: 'offline',
|
|
88
|
-
prompt: 'consent',
|
|
89
|
-
state: pkce.state,
|
|
90
|
-
});
|
|
91
|
-
return `${this.config.authUrl}?${params.toString()}`;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Exchange authorization code for tokens
|
|
95
|
-
*/
|
|
96
|
-
async exchangeCodeForTokens(code, codeVerifier, redirectUri) {
|
|
97
|
-
const response = await fetch(this.config.tokenUrl, {
|
|
98
|
-
method: 'POST',
|
|
99
|
-
headers: {
|
|
100
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
101
|
-
},
|
|
102
|
-
body: new URLSearchParams({
|
|
103
|
-
grant_type: 'authorization_code',
|
|
104
|
-
code,
|
|
105
|
-
redirect_uri: redirectUri,
|
|
106
|
-
client_id: this.config.clientId,
|
|
107
|
-
client_secret: this.config.clientSecret || '',
|
|
108
|
-
code_verifier: codeVerifier,
|
|
109
|
-
}),
|
|
110
|
-
});
|
|
111
|
-
if (!response.ok) {
|
|
112
|
-
const error = await response.text();
|
|
113
|
-
throw new Error(`Token exchange failed: ${error}`);
|
|
114
|
-
}
|
|
115
|
-
const data = await response.json();
|
|
116
|
-
return {
|
|
117
|
-
accessToken: data.access_token,
|
|
118
|
-
refreshToken: data.refresh_token,
|
|
119
|
-
idToken: data.id_token,
|
|
120
|
-
expiresAt: Date.now() + (data.expires_in * 1000),
|
|
121
|
-
tokenType: data.token_type,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Refresh tokens using refresh token
|
|
126
|
-
*/
|
|
127
|
-
async refreshTokens(refreshToken) {
|
|
128
|
-
const response = await fetch(this.config.tokenUrl, {
|
|
129
|
-
method: 'POST',
|
|
130
|
-
headers: {
|
|
131
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
132
|
-
},
|
|
133
|
-
body: new URLSearchParams({
|
|
134
|
-
grant_type: 'refresh_token',
|
|
135
|
-
refresh_token: refreshToken,
|
|
136
|
-
client_id: this.config.clientId,
|
|
137
|
-
client_secret: this.config.clientSecret || '',
|
|
138
|
-
}),
|
|
139
|
-
});
|
|
140
|
-
if (!response.ok) {
|
|
141
|
-
const error = await response.text();
|
|
142
|
-
throw new Error(`Token refresh failed: ${error}`);
|
|
143
|
-
}
|
|
144
|
-
const data = await response.json();
|
|
145
|
-
return {
|
|
146
|
-
accessToken: data.access_token,
|
|
147
|
-
refreshToken: data.refresh_token || refreshToken,
|
|
148
|
-
idToken: data.id_token,
|
|
149
|
-
expiresAt: Date.now() + (data.expires_in * 1000),
|
|
150
|
-
tokenType: data.token_type,
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Get user info from Google
|
|
155
|
-
*/
|
|
156
|
-
async getUserInfo(accessToken) {
|
|
157
|
-
try {
|
|
158
|
-
const response = await fetch('https://www.googleapis.com/oauth2/v2/userinfo', {
|
|
159
|
-
headers: {
|
|
160
|
-
Authorization: `Bearer ${accessToken}`,
|
|
161
|
-
},
|
|
162
|
-
});
|
|
163
|
-
if (response.ok) {
|
|
164
|
-
const data = await response.json();
|
|
165
|
-
return { email: data.email };
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
catch {
|
|
169
|
-
// Ignore errors
|
|
170
|
-
}
|
|
171
|
-
return {};
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Run the full OAuth authentication flow
|
|
175
|
-
* Opens a browser and waits for callback
|
|
176
|
-
*/
|
|
177
|
-
async authenticate() {
|
|
178
|
-
// Find available port
|
|
179
|
-
const port = await findAvailablePort();
|
|
180
|
-
const redirectUri = `http://localhost:${port}`;
|
|
181
|
-
const pkce = generatePKCE();
|
|
182
|
-
const authUrl = this.getAuthorizationUrl(pkce, redirectUri);
|
|
183
|
-
return new Promise((resolve) => {
|
|
184
|
-
const server = http.createServer(async (req, res) => {
|
|
185
|
-
const url = new URL(req.url, `http://localhost:${port}`);
|
|
186
|
-
// Handle the root callback (Google redirects to root)
|
|
187
|
-
if (url.pathname === '/' || url.pathname === '/callback') {
|
|
188
|
-
const code = url.searchParams.get('code');
|
|
189
|
-
const returnedState = url.searchParams.get('state');
|
|
190
|
-
const error = url.searchParams.get('error');
|
|
191
|
-
// Handle errors
|
|
192
|
-
if (error) {
|
|
193
|
-
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
194
|
-
res.end(`
|
|
195
|
-
<html>
|
|
196
|
-
<body style="font-family: system-ui; padding: 40px; text-align: center;">
|
|
197
|
-
<h1>Authentication Failed</h1>
|
|
198
|
-
<p>Error: ${error}</p>
|
|
199
|
-
<p>You can close this window.</p>
|
|
200
|
-
</body>
|
|
201
|
-
</html>
|
|
202
|
-
`);
|
|
203
|
-
server.close();
|
|
204
|
-
resolve({ success: false, error });
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
// Verify state
|
|
208
|
-
if (!returnedState || !verifyState(pkce.state, returnedState)) {
|
|
209
|
-
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
210
|
-
res.end(`
|
|
211
|
-
<html>
|
|
212
|
-
<body style="font-family: system-ui; padding: 40px; text-align: center;">
|
|
213
|
-
<h1>Authentication Failed</h1>
|
|
214
|
-
<p>State mismatch - possible CSRF attack.</p>
|
|
215
|
-
<p>You can close this window.</p>
|
|
216
|
-
</body>
|
|
217
|
-
</html>
|
|
218
|
-
`);
|
|
219
|
-
server.close();
|
|
220
|
-
resolve({ success: false, error: 'State mismatch' });
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
// Exchange code for tokens
|
|
224
|
-
if (code) {
|
|
225
|
-
try {
|
|
226
|
-
const tokens = await this.exchangeCodeForTokens(code, pkce.codeVerifier, redirectUri);
|
|
227
|
-
// Get user email
|
|
228
|
-
const { email } = await this.getUserInfo(tokens.accessToken);
|
|
229
|
-
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
230
|
-
res.end(`
|
|
231
|
-
<html>
|
|
232
|
-
<body style="font-family: system-ui; padding: 40px; text-align: center;">
|
|
233
|
-
<h1>Authentication Successful!</h1>
|
|
234
|
-
<p>You are now connected to Google${email ? ` as ${email}` : ''}.</p>
|
|
235
|
-
<p>You can close this window and return to the terminal.</p>
|
|
236
|
-
</body>
|
|
237
|
-
</html>
|
|
238
|
-
`);
|
|
239
|
-
server.close();
|
|
240
|
-
resolve({ success: true, tokens, email });
|
|
241
|
-
}
|
|
242
|
-
catch (err) {
|
|
243
|
-
res.writeHead(500, { 'Content-Type': 'text/html' });
|
|
244
|
-
res.end(`
|
|
245
|
-
<html>
|
|
246
|
-
<body style="font-family: system-ui; padding: 40px; text-align: center;">
|
|
247
|
-
<h1>Authentication Failed</h1>
|
|
248
|
-
<p>Error: ${err instanceof Error ? err.message : 'Unknown error'}</p>
|
|
249
|
-
<p>You can close this window.</p>
|
|
250
|
-
</body>
|
|
251
|
-
</html>
|
|
252
|
-
`);
|
|
253
|
-
server.close();
|
|
254
|
-
resolve({ success: false, error: err instanceof Error ? err.message : 'Unknown error' });
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
// Start server
|
|
260
|
-
server.listen(port, '127.0.0.1', () => {
|
|
261
|
-
console.log('\nOpening browser for Google authentication...');
|
|
262
|
-
console.log(`If the browser doesn't open, visit: ${authUrl}\n`);
|
|
263
|
-
// Try to open browser
|
|
264
|
-
openBrowser(authUrl);
|
|
265
|
-
});
|
|
266
|
-
// Timeout after 5 minutes
|
|
267
|
-
setTimeout(() => {
|
|
268
|
-
server.close();
|
|
269
|
-
resolve({ success: false, error: 'Authentication timeout (5 minutes)' });
|
|
270
|
-
}, 5 * 60 * 1000);
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Create Google OAuth handler instance
|
|
276
|
-
*/
|
|
277
|
-
export function createGoogleOAuth() {
|
|
278
|
-
return new GoogleOAuth();
|
|
279
|
-
}
|
|
280
|
-
//# sourceMappingURL=oauth-google.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-google.js","sourceRoot":"","sources":["../../src/auth/oauth-google.ts"],"names":[],"mappings":"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"}
|