oh-my-claude-sisyphus 1.8.0-beta.2 → 1.9.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/README.md +67 -4
- package/dist/agents/model-lists.d.ts +26 -0
- package/dist/agents/model-lists.d.ts.map +1 -0
- package/dist/agents/model-lists.js +62 -0
- package/dist/agents/model-lists.js.map +1 -0
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +13 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/manager.d.ts +54 -0
- package/dist/auth/manager.d.ts.map +1 -0
- package/dist/auth/manager.js +248 -0
- package/dist/auth/manager.js.map +1 -0
- package/dist/auth/oauth-google.d.ts +47 -0
- package/dist/auth/oauth-google.d.ts.map +1 -0
- package/dist/auth/oauth-google.js +280 -0
- package/dist/auth/oauth-google.js.map +1 -0
- package/dist/auth/oauth-openai.d.ts +46 -0
- package/dist/auth/oauth-openai.d.ts.map +1 -0
- package/dist/auth/oauth-openai.js +264 -0
- package/dist/auth/oauth-openai.js.map +1 -0
- package/dist/auth/pkce.d.ts +14 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +35 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/storage.d.ts +52 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +230 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/auth/types.d.ts +76 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +5 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/features/builtin-skills/skills.d.ts.map +1 -1
- package/dist/features/builtin-skills/skills.js +2152 -219
- package/dist/features/builtin-skills/skills.js.map +1 -1
- package/dist/installer/hooks.d.ts +95 -3
- package/dist/installer/hooks.d.ts.map +1 -1
- package/dist/installer/hooks.js +384 -5
- package/dist/installer/hooks.js.map +1 -1
- package/dist/installer/index.d.ts +18 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +1761 -302
- package/dist/installer/index.js.map +1 -1
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +10 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/registry.d.ts +29 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +162 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/router.d.ts +40 -0
- package/dist/providers/router.d.ts.map +1 -0
- package/dist/providers/router.js +88 -0
- package/dist/providers/router.js.map +1 -0
- package/dist/providers/types.d.ts +92 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +27 -0
- package/dist/providers/types.js.map +1 -0
- package/package.json +2 -1
- package/scripts/install.sh +1 -1
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
*Like Sisyphus, these agents persist until every task is complete.*
|
|
14
14
|
|
|
15
|
-
[Install](#quick-install) • [Usage](#usage) • [Agents](#the-eleven-agents) • [Website](https://yeachan-heo.github.io/oh-my-claude-sisyphus-website)
|
|
15
|
+
[Install](#quick-install) • [Usage](#usage) • [Agents](#the-eleven-agents) • [Architecture](docs/ARCHITECTURE.md) • [Website](https://yeachan-heo.github.io/oh-my-claude-sisyphus-website)
|
|
16
16
|
|
|
17
17
|
</div>
|
|
18
18
|
|
|
@@ -34,19 +34,21 @@
|
|
|
34
34
|
|
|
35
35
|
## Quick Install
|
|
36
36
|
|
|
37
|
-
### One-liner (recommended)
|
|
37
|
+
### One-liner (macOS/Linux - recommended)
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
curl -fsSL https://raw.githubusercontent.com/Yeachan-Heo/oh-my-claude-sisyphus/main/scripts/install.sh | bash
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
### Via npm
|
|
43
|
+
### Via npm (All platforms including Windows)
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
46
|
npm install -g oh-my-claude-sisyphus
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
> **Windows Users**: This is the only supported installation method. Requires Node.js 18+.
|
|
50
|
+
|
|
51
|
+
### Manual Install (macOS/Linux)
|
|
50
52
|
|
|
51
53
|
```bash
|
|
52
54
|
git clone https://github.com/Yeachan-Heo/oh-my-claude-sisyphus.git
|
|
@@ -230,6 +232,55 @@ Skills are automatically activated via slash commands or magic keywords.
|
|
|
230
232
|
|
|
231
233
|
---
|
|
232
234
|
|
|
235
|
+
## Intelligent Skill Activation
|
|
236
|
+
|
|
237
|
+
> **New in v1.8.0**: Skills are no longer mutually exclusive. Claude automatically combines skills based on task requirements.
|
|
238
|
+
|
|
239
|
+
### Skill Layers
|
|
240
|
+
|
|
241
|
+
Skills work in **three composable layers**:
|
|
242
|
+
|
|
243
|
+
| Layer | Skills | Purpose |
|
|
244
|
+
|-------|--------|---------|
|
|
245
|
+
| **Execution** | sisyphus, orchestrator, prometheus | HOW you work (pick primary) |
|
|
246
|
+
| **Enhancement** | ultrawork, git-master, frontend-ui-ux | ADD capabilities (stack multiple) |
|
|
247
|
+
| **Guarantee** | ralph-loop | ENSURE completion |
|
|
248
|
+
|
|
249
|
+
**Combination Formula:** `[Execution] + [0-N Enhancements] + [Optional Guarantee]`
|
|
250
|
+
|
|
251
|
+
### Task Type → Skill Selection
|
|
252
|
+
|
|
253
|
+
Claude uses judgment to detect task type and activate appropriate skill combinations:
|
|
254
|
+
|
|
255
|
+
| Task Type | Skill Combination | When |
|
|
256
|
+
|-----------|-------------------|------|
|
|
257
|
+
| Multi-step implementation | `sisyphus` | Building features, refactoring |
|
|
258
|
+
| + parallel subtasks | `sisyphus + ultrawork` | 3+ independent subtasks |
|
|
259
|
+
| + multi-file changes | `sisyphus + git-master` | Changes span 3+ files |
|
|
260
|
+
| + must complete | `sisyphus + ralph-loop` | User emphasizes completion |
|
|
261
|
+
| UI/frontend work | `sisyphus + frontend-ui-ux` | Components, styling |
|
|
262
|
+
| Complex debugging | `oracle` → `sisyphus` | Root cause → fix |
|
|
263
|
+
| Strategic planning | `prometheus` | Need plan first |
|
|
264
|
+
| Maximum performance | `ultrawork` (stacks) | Speed critical |
|
|
265
|
+
|
|
266
|
+
### Examples
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
"Add dark mode with proper commits"
|
|
270
|
+
→ sisyphus + frontend-ui-ux + git-master
|
|
271
|
+
|
|
272
|
+
"ultrawork: refactor the entire API layer"
|
|
273
|
+
→ ultrawork + sisyphus + git-master
|
|
274
|
+
|
|
275
|
+
"Plan auth system, then implement it completely"
|
|
276
|
+
→ prometheus (first) → sisyphus + ralph-loop (after plan)
|
|
277
|
+
|
|
278
|
+
"Fix this bug, don't stop until it's done"
|
|
279
|
+
→ sisyphus + ralph-loop
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
233
284
|
## The Eleven Agents
|
|
234
285
|
|
|
235
286
|
Claude will automatically delegate to these specialized agents:
|
|
@@ -543,6 +594,18 @@ If you're coming from oh-my-opencode:
|
|
|
543
594
|
|
|
544
595
|
- [Claude Code](https://docs.anthropic.com/claude-code) installed
|
|
545
596
|
- Anthropic API key (`ANTHROPIC_API_KEY` environment variable)
|
|
597
|
+
- **Windows**: Node.js 18+ (for npm installation)
|
|
598
|
+
- **macOS/Linux**: Bash shell (default) or Node.js 18+ (optional)
|
|
599
|
+
|
|
600
|
+
### Platform Support
|
|
601
|
+
|
|
602
|
+
| Platform | Install Method | Hook Type |
|
|
603
|
+
|----------|---------------|-----------|
|
|
604
|
+
| **Windows** | `npm install -g` | Node.js (.mjs) |
|
|
605
|
+
| **macOS** | curl or npm | Bash (.sh) |
|
|
606
|
+
| **Linux** | curl or npm | Bash (.sh) |
|
|
607
|
+
|
|
608
|
+
> **Advanced**: Set `SISYPHUS_USE_NODE_HOOKS=1` to use Node.js hooks on macOS/Linux.
|
|
546
609
|
|
|
547
610
|
## License
|
|
548
611
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default model lists for each agent
|
|
3
|
+
*
|
|
4
|
+
* Each agent has an ordered list of preferred models.
|
|
5
|
+
* The first authenticated model is used; falls back through the list.
|
|
6
|
+
*/
|
|
7
|
+
import type { ModelId } from '../providers/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Model lists categorized by capability tier
|
|
10
|
+
*/
|
|
11
|
+
/** High-capability models (for complex analysis, planning, debugging) */
|
|
12
|
+
export declare const OPUS_TIER_MODELS: ModelId[];
|
|
13
|
+
/** Balanced models (for implementation, coordination) */
|
|
14
|
+
export declare const SONNET_TIER_MODELS: ModelId[];
|
|
15
|
+
/** Fast/cheap models (for search, simple tasks) */
|
|
16
|
+
export declare const HAIKU_TIER_MODELS: ModelId[];
|
|
17
|
+
/**
|
|
18
|
+
* Default model lists for each agent
|
|
19
|
+
* These can be overridden in user config
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_AGENT_MODELS: Record<string, ModelId[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Get default models for an agent
|
|
24
|
+
*/
|
|
25
|
+
export declare function getDefaultModelsForAgent(agentName: string): ModelId[];
|
|
26
|
+
//# sourceMappingURL=model-lists.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-lists.d.ts","sourceRoot":"","sources":["../../src/agents/model-lists.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD;;GAEG;AAEH,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,EAAE,OAAO,EAIrC,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,EAAE,OAAO,EAIvC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAItC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAyB1D,CAAC;AAEF;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAErE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default model lists for each agent
|
|
3
|
+
*
|
|
4
|
+
* Each agent has an ordered list of preferred models.
|
|
5
|
+
* The first authenticated model is used; falls back through the list.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Model lists categorized by capability tier
|
|
9
|
+
*/
|
|
10
|
+
/** High-capability models (for complex analysis, planning, debugging) */
|
|
11
|
+
export const OPUS_TIER_MODELS = [
|
|
12
|
+
'anthropic/claude-opus-4-5',
|
|
13
|
+
'openai/gpt-4o',
|
|
14
|
+
'google/gemini-2.0-flash',
|
|
15
|
+
];
|
|
16
|
+
/** Balanced models (for implementation, coordination) */
|
|
17
|
+
export const SONNET_TIER_MODELS = [
|
|
18
|
+
'anthropic/claude-sonnet-4-5',
|
|
19
|
+
'openai/gpt-4o-mini',
|
|
20
|
+
'google/gemini-2.0-flash',
|
|
21
|
+
];
|
|
22
|
+
/** Fast/cheap models (for search, simple tasks) */
|
|
23
|
+
export const HAIKU_TIER_MODELS = [
|
|
24
|
+
'anthropic/claude-haiku-4-5',
|
|
25
|
+
'google/gemini-2.0-flash-lite',
|
|
26
|
+
'openai/gpt-4o-mini',
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Default model lists for each agent
|
|
30
|
+
* These can be overridden in user config
|
|
31
|
+
*/
|
|
32
|
+
export const DEFAULT_AGENT_MODELS = {
|
|
33
|
+
// Opus-tier agents (complex analysis, planning)
|
|
34
|
+
oracle: [
|
|
35
|
+
'openai/gpt-4o', // Prefer GPT-4o for complex reasoning
|
|
36
|
+
'anthropic/claude-opus-4-5',
|
|
37
|
+
'google/gemini-2.0-flash',
|
|
38
|
+
],
|
|
39
|
+
momus: OPUS_TIER_MODELS, // Plan reviewer
|
|
40
|
+
metis: OPUS_TIER_MODELS, // Pre-planning analyst
|
|
41
|
+
prometheus: OPUS_TIER_MODELS, // Strategic planner
|
|
42
|
+
// Sonnet-tier agents (balanced implementation)
|
|
43
|
+
librarian: SONNET_TIER_MODELS,
|
|
44
|
+
'sisyphus-junior': SONNET_TIER_MODELS,
|
|
45
|
+
'frontend-engineer': SONNET_TIER_MODELS,
|
|
46
|
+
'orchestrator-sisyphus': SONNET_TIER_MODELS,
|
|
47
|
+
'multimodal-looker': SONNET_TIER_MODELS,
|
|
48
|
+
// Haiku-tier agents (fast, cheap)
|
|
49
|
+
explore: [
|
|
50
|
+
'google/gemini-2.0-flash-lite', // Prefer fast Gemini
|
|
51
|
+
'anthropic/claude-haiku-4-5',
|
|
52
|
+
'openai/gpt-4o-mini',
|
|
53
|
+
],
|
|
54
|
+
'document-writer': HAIKU_TIER_MODELS,
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Get default models for an agent
|
|
58
|
+
*/
|
|
59
|
+
export function getDefaultModelsForAgent(agentName) {
|
|
60
|
+
return DEFAULT_AGENT_MODELS[agentName] || SONNET_TIER_MODELS;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=model-lists.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-lists.js","sourceRoot":"","sources":["../../src/agents/model-lists.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAc;IACzC,2BAA2B;IAC3B,eAAe;IACf,yBAAyB;CAC1B,CAAC;AAEF,yDAAyD;AACzD,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,6BAA6B;IAC7B,oBAAoB;IACpB,yBAAyB;CAC1B,CAAC;AAEF,mDAAmD;AACnD,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,4BAA4B;IAC5B,8BAA8B;IAC9B,oBAAoB;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA8B;IAC7D,gDAAgD;IAChD,MAAM,EAAE;QACN,eAAe,EAAY,sCAAsC;QACjE,2BAA2B;QAC3B,yBAAyB;KAC1B;IACD,KAAK,EAAE,gBAAgB,EAAM,gBAAgB;IAC7C,KAAK,EAAE,gBAAgB,EAAM,uBAAuB;IACpD,UAAU,EAAE,gBAAgB,EAAE,oBAAoB;IAElD,+CAA+C;IAC/C,SAAS,EAAE,kBAAkB;IAC7B,iBAAiB,EAAE,kBAAkB;IACrC,mBAAmB,EAAE,kBAAkB;IACvC,uBAAuB,EAAE,kBAAkB;IAC3C,mBAAmB,EAAE,kBAAkB;IAEvC,kCAAkC;IAClC,OAAO,EAAE;QACP,8BAA8B,EAAE,qBAAqB;QACrD,4BAA4B;QAC5B,oBAAoB;KACrB;IACD,iBAAiB,EAAE,iBAAiB;CACrC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,OAAO,oBAAoB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication module exports
|
|
3
|
+
*/
|
|
4
|
+
export type { StoredCredential, AuthStatus, ConnectOptions, OAuthResult, PKCEData, } from './types.js';
|
|
5
|
+
export { CredentialStorage, getCredentialStorage } from './storage.js';
|
|
6
|
+
export { generatePKCE, verifyState } from './pkce.js';
|
|
7
|
+
export { OpenAIOAuth, createOpenAIOAuth, OPENAI_OAUTH_CONFIG } from './oauth-openai.js';
|
|
8
|
+
export { GoogleOAuth, createGoogleOAuth, GOOGLE_OAUTH_CONFIG } from './oauth-google.js';
|
|
9
|
+
export { AuthManager, getAuthManager } from './manager.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,WAAW,EACX,QAAQ,GACT,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGtD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication module exports
|
|
3
|
+
*/
|
|
4
|
+
// Storage
|
|
5
|
+
export { CredentialStorage, getCredentialStorage } from './storage.js';
|
|
6
|
+
// PKCE
|
|
7
|
+
export { generatePKCE, verifyState } from './pkce.js';
|
|
8
|
+
// OAuth providers
|
|
9
|
+
export { OpenAIOAuth, createOpenAIOAuth, OPENAI_OAUTH_CONFIG } from './oauth-openai.js';
|
|
10
|
+
export { GoogleOAuth, createGoogleOAuth, GOOGLE_OAUTH_CONFIG } from './oauth-google.js';
|
|
11
|
+
// Manager
|
|
12
|
+
export { AuthManager, getAuthManager } from './manager.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,UAAU;AACV,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEvE,OAAO;AACP,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEtD,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExF,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,248 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/auth/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|