opencode-copilot-multi-fix 1.1.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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/bin/cli.js +26 -0
  4. package/dist/commands/multi-copilot.d.ts +18 -0
  5. package/dist/commands/multi-copilot.d.ts.map +1 -0
  6. package/dist/commands/multi-copilot.js +403 -0
  7. package/dist/commands/multi-copilot.js.map +1 -0
  8. package/dist/config/writer.d.ts +22 -0
  9. package/dist/config/writer.d.ts.map +1 -0
  10. package/dist/config/writer.js +143 -0
  11. package/dist/config/writer.js.map +1 -0
  12. package/dist/discovery/accounts.d.ts +24 -0
  13. package/dist/discovery/accounts.d.ts.map +1 -0
  14. package/dist/discovery/accounts.js +128 -0
  15. package/dist/discovery/accounts.js.map +1 -0
  16. package/dist/discovery/models.d.ts +32 -0
  17. package/dist/discovery/models.d.ts.map +1 -0
  18. package/dist/discovery/models.js +124 -0
  19. package/dist/discovery/models.js.map +1 -0
  20. package/dist/discovery/username.d.ts +8 -0
  21. package/dist/discovery/username.d.ts.map +1 -0
  22. package/dist/discovery/username.js +47 -0
  23. package/dist/discovery/username.js.map +1 -0
  24. package/dist/index.d.ts +31 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +82 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/provider.d.ts +16 -0
  29. package/dist/provider.d.ts.map +1 -0
  30. package/dist/provider.js +174 -0
  31. package/dist/provider.js.map +1 -0
  32. package/dist/storage/auth.d.ts +21 -0
  33. package/dist/storage/auth.d.ts.map +1 -0
  34. package/dist/storage/auth.js +130 -0
  35. package/dist/storage/auth.js.map +1 -0
  36. package/dist/storage/pool.d.ts +29 -0
  37. package/dist/storage/pool.d.ts.map +1 -0
  38. package/dist/storage/pool.js +152 -0
  39. package/dist/storage/pool.js.map +1 -0
  40. package/dist/types.d.ts +108 -0
  41. package/dist/types.d.ts.map +1 -0
  42. package/dist/types.js +32 -0
  43. package/dist/types.js.map +1 -0
  44. package/dist/utils/errors.d.ts +28 -0
  45. package/dist/utils/errors.d.ts.map +1 -0
  46. package/dist/utils/errors.js +52 -0
  47. package/dist/utils/errors.js.map +1 -0
  48. package/dist/utils/jsonc.d.ts +20 -0
  49. package/dist/utils/jsonc.d.ts.map +1 -0
  50. package/dist/utils/jsonc.js +91 -0
  51. package/dist/utils/jsonc.js.map +1 -0
  52. package/dist/utils/logger.d.ts +11 -0
  53. package/dist/utils/logger.d.ts.map +1 -0
  54. package/dist/utils/logger.js +53 -0
  55. package/dist/utils/logger.js.map +1 -0
  56. package/package.json +71 -0
  57. package/scripts/postinstall.js +86 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Valerio Fantozzi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,172 @@
1
+ # opencode-copilot-multi
2
+
3
+ [![npm version](https://img.shields.io/npm/v/opencode-copilot-multi.svg)](https://www.npmjs.com/package/opencode-copilot-multi)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen)](https://nodejs.org/)
6
+
7
+ OpenCode plugin for seamless switching between **multiple GitHub Copilot accounts** in a single session.
8
+
9
+ ## ✨ Features
10
+
11
+ - 🔄 **Multi-account support** - Use 2+ GitHub Copilot accounts simultaneously
12
+ - 🎯 **Per-model labeling** - Models appear as `username:model-name`
13
+ - 🔒 **Secure** - OAuth tokens stored locally with 0600 permissions
14
+ - ⚡ **Non-blocking** - Lazy loads, zero impact on OpenCode startup
15
+ - 🔄 **Auto token refresh** - 5-minute buffer before expiry
16
+ - 📱 **Cross-platform** - macOS, Linux, Windows
17
+
18
+ ## 📋 Supported Models
19
+
20
+ **Claude**: Opus/Sonnet/Haiku (all versions)
21
+ **OpenAI**: GPT-5, GPT-4o, o1, o3-mini
22
+ **Google**: Gemini 2.5 Pro, Gemini 3
23
+
24
+ **15+ models** total. New models auto-detected when you authenticate.
25
+
26
+ ## 🔧 Installation
27
+
28
+ ### Option 1: Global (Recommended)
29
+ ```bash
30
+ npm install -g opencode-copilot-multi
31
+ # Restart OpenCode
32
+ ```
33
+
34
+ ### Option 2: Via NPX
35
+ ```bash
36
+ npx opencode-copilot-multi@latest add
37
+ ```
38
+
39
+ ### Option 3: Manual
40
+ Edit `~/.config/opencode/opencode.json`:
41
+ ```json
42
+ {
43
+ "plugin": ["opencode-copilot-multi"]
44
+ }
45
+ ```
46
+
47
+ ## 🎯 Quick Start
48
+
49
+ 1. **Add account**
50
+ ```bash
51
+ opencode-copilot-multi add
52
+ ```
53
+ - Launches OpenCode auth
54
+ - Select "GitHub Copilot"
55
+ - Complete OAuth
56
+
57
+ 2. **Restart OpenCode** - models now appear
58
+
59
+ 3. **Select model** - e.g., `john:claude-sonnet-4`
60
+
61
+ 4. **Add more accounts** - Run `add` again
62
+
63
+ ## 🛠️ CLI Commands
64
+
65
+ ```bash
66
+ opencode-copilot-multi list # Show all accounts
67
+ opencode-copilot-multi add # Add GitHub Copilot account
68
+ opencode-copilot-multi remove <username> # Remove account
69
+ opencode-copilot-multi clear [--force] # Remove all accounts
70
+ opencode-copilot-multi install # Register plugin (auto-run)
71
+ opencode-copilot-multi --help # Show help
72
+ ```
73
+
74
+ ## ⚙️ System Requirements
75
+
76
+ - **Node.js**: ≥ 18.0.0
77
+ - **OpenCode**: Latest version
78
+ - **GitHub Copilot**: Active subscription
79
+
80
+ ## 🐛 Troubleshooting
81
+
82
+ ### No models appearing
83
+ 1. Run: `opencode-copilot-multi list`
84
+ 2. If empty, run: `opencode-copilot-multi add`
85
+ 3. Restart OpenCode
86
+ 4. Check logs: `tail ~/.local/share/opencode/log/copilot-multi.log`
87
+
88
+ ### Token refresh errors
89
+ Re-authenticate:
90
+ ```bash
91
+ opencode-copilot-multi remove <username>
92
+ opencode-copilot-multi add
93
+ ```
94
+
95
+ ### Plugin not loading
96
+ ```bash
97
+ opencode-copilot-multi install
98
+ # Restart OpenCode
99
+ ```
100
+
101
+ ## 📚 Documentation
102
+
103
+ - **[ARCHITECTURE.md](ARCHITECTURE.md)** - System design, diagrams, patterns
104
+ - **[CONTRIBUTING.md](CONTRIBUTING.md)** - How to contribute
105
+ - **[SECURITY.md](SECURITY.md)** - Token security, vulnerability process
106
+ - **[CHANGELOG.md](CHANGELOG.md)** - Version history
107
+
108
+ ## 🏗️ How It Works
109
+
110
+ When you select `john:claude-sonnet-4`:
111
+
112
+ 1. **Parser** extracts username + model
113
+ 2. **Pool lookup** finds account by username
114
+ 3. **Token check** refreshes if expiring
115
+ 4. **API call** routes to GitHub Copilot with account's token
116
+ 5. **Response** returned to OpenCode
117
+
118
+ See [ARCHITECTURE.md](ARCHITECTURE.md) for detailed flow diagrams.
119
+
120
+ ## 🔐 Security
121
+
122
+ - **Storage**: `~/.local/share/opencode/copilot-multi-accounts.json` (0600)
123
+ - **Tokens**: OAuth only, no passwords
124
+ - **Refresh**: Auto 5 minutes before expiry
125
+ - **No telemetry**: Offline by design
126
+
127
+ See [SECURITY.md](SECURITY.md) for complete details.
128
+
129
+ ## 🧪 Development
130
+
131
+ ```bash
132
+ npm install
133
+ npm run build # Compile TypeScript
134
+ npm run watch # Watch & rebuild
135
+ npm link # Link globally for testing
136
+ ```
137
+
138
+ **Project structure**:
139
+ ```
140
+ src/
141
+ ├── index.ts # Plugin entry
142
+ ├── provider.ts # Custom fetch handler
143
+ ├── storage/ # Account pool & auth
144
+ ├── discovery/ # Account detection
145
+ ├── config/ # Config management
146
+ ├── commands/ # CLI commands
147
+ └── utils/ # Helpers
148
+ ```
149
+
150
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development workflow.
151
+
152
+ ## 📄 License
153
+
154
+ MIT © 2025 Valerio Fantozzi
155
+
156
+ ## 🤝 Contributing
157
+
158
+ Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for:
159
+ - Code style guidelines
160
+ - Development setup
161
+ - PR process
162
+ - Areas for contribution
163
+
164
+ ## 🆘 Support
165
+
166
+ - **Issues**: [GitHub Issues](https://github.com/iamvaleriofantozzi/opencode-copilot-multi/issues)
167
+ - **Discussions**: [GitHub Discussions](https://github.com/iamvaleriofantozzi/opencode-copilot-multi/discussions)
168
+ - **Security**: See [SECURITY.md](SECURITY.md)
169
+
170
+ ---
171
+
172
+ **Made with ❤️ by Valerio Fantozzi**
package/bin/cli.js ADDED
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI for managing OpenCode Copilot Multi-Account plugin
4
+ *
5
+ * Usage:
6
+ * opencode-copilot-multi list
7
+ * opencode-copilot-multi add # runs opencode auth login (select GitHub Copilot)
8
+ * opencode-copilot-multi remove <username>
9
+ * opencode-copilot-multi clear [--force]
10
+ */
11
+ import { executeMultiCopilotCommand } from '../dist/commands/multi-copilot.js';
12
+ async function main() {
13
+ const args = process.argv.slice(2);
14
+ const command = args.join(' ').trim() || 'help';
15
+ try {
16
+ const result = await executeMultiCopilotCommand(command);
17
+ console.log(result.output);
18
+ process.exit(result.success ? 0 : 1);
19
+ }
20
+ catch (error) {
21
+ console.error('Error:', error instanceof Error ? error.message : String(error));
22
+ process.exit(1);
23
+ }
24
+ }
25
+ main();
26
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Multi-copilot command handler
3
+ *
4
+ * Subcommands:
5
+ * - list: Show all accounts in the pool
6
+ * - add: Run GitHub Copilot login and sync
7
+ * - remove <username>: Remove a specific account
8
+ * - clear: Remove all accounts
9
+ */
10
+ export interface CommandResult {
11
+ output: string;
12
+ success: boolean;
13
+ }
14
+ /**
15
+ * Parse and execute multi-copilot command
16
+ */
17
+ export declare function executeMultiCopilotCommand(args: string): Promise<CommandResult>;
18
+ //# sourceMappingURL=multi-copilot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-copilot.d.ts","sourceRoot":"","sources":["../../src/commands/multi-copilot.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAyBD;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAqCrF"}
@@ -0,0 +1,403 @@
1
+ /**
2
+ * Multi-copilot command handler
3
+ *
4
+ * Subcommands:
5
+ * - list: Show all accounts in the pool
6
+ * - add: Run GitHub Copilot login and sync
7
+ * - remove <username>: Remove a specific account
8
+ * - clear: Remove all accounts
9
+ */
10
+ import { spawn } from 'child_process';
11
+ import readline from 'readline';
12
+ import { getAccountPool, saveAccountPool } from '../storage/pool.js';
13
+ import { writeModelsToConfig, ensurePluginInstalled } from '../config/writer.js';
14
+ import { logger } from '../utils/logger.js';
15
+ import { getGitHubCopilotAuth, generateAccountId, registerProviderInAuthJson } from '../storage/auth.js';
16
+ import { syncAccounts } from '../discovery/accounts.js';
17
+ // ANSI Color codes
18
+ const colors = {
19
+ reset: '\x1b[0m',
20
+ bold: '\x1b[1m',
21
+ dim: '\x1b[2m',
22
+ // Colors
23
+ cyan: '\x1b[36m',
24
+ blue: '\x1b[34m',
25
+ green: '\x1b[32m',
26
+ yellow: '\x1b[33m',
27
+ red: '\x1b[31m',
28
+ magenta: '\x1b[35m',
29
+ gray: '\x1b[90m',
30
+ // Bright colors
31
+ brightCyan: '\x1b[96m',
32
+ brightGreen: '\x1b[92m',
33
+ brightYellow: '\x1b[93m',
34
+ };
35
+ const c = colors; // Shorthand
36
+ /**
37
+ * Parse and execute multi-copilot command
38
+ */
39
+ export async function executeMultiCopilotCommand(args) {
40
+ const parts = args.trim().split(/\s+/);
41
+ const subcommand = parts[0]?.toLowerCase() || 'help';
42
+ const subargs = parts.slice(1);
43
+ switch (subcommand) {
44
+ case 'install':
45
+ return await installPlugin();
46
+ case 'list':
47
+ case 'ls':
48
+ return await listAccounts();
49
+ case 'add':
50
+ return await addAccount();
51
+ case 'remove':
52
+ case 'rm':
53
+ if (!subargs[0]) {
54
+ return {
55
+ output: `\n${c.red}✗${c.reset} ${c.bold}Usage:${c.reset} opencode-copilot-multi remove ${c.dim}<username>${c.reset}\n`,
56
+ success: false
57
+ };
58
+ }
59
+ return await removeAccount(subargs[0]);
60
+ case 'clear':
61
+ // Check for --force or -f flag
62
+ const force = subargs.includes('--force') || subargs.includes('-f');
63
+ return await clearAccounts(force);
64
+ case 'help':
65
+ case '--help':
66
+ case '-h':
67
+ default:
68
+ return showHelp();
69
+ }
70
+ }
71
+ async function installPlugin() {
72
+ try {
73
+ // Step 1: Register plugin in opencode.json(c)
74
+ const wasInstalled = await ensurePluginInstalled();
75
+ // Step 2: Register provider in auth.json (always do this, even if already installed)
76
+ const authRegistered = await registerProviderInAuthJson();
77
+ if (!authRegistered) {
78
+ logger.warn('Failed to register provider in auth.json, but continuing...');
79
+ }
80
+ if (wasInstalled) {
81
+ const output = [
82
+ '',
83
+ `${c.green}✓${c.reset} ${c.bold}Plugin installed in OpenCode${c.reset}`,
84
+ '',
85
+ `${c.dim}✓ Added to opencode.json(c)${c.reset}`,
86
+ `${c.dim}✓ Registered in auth.json${c.reset}`,
87
+ '',
88
+ `${c.dim}Restart OpenCode to load the plugin${c.reset}`,
89
+ ''
90
+ ].join('\n');
91
+ return { output, success: true };
92
+ }
93
+ else {
94
+ const output = [
95
+ '',
96
+ `${c.yellow}ℹ${c.reset} ${c.bold}Plugin already installed${c.reset}`,
97
+ '',
98
+ `${c.dim}The plugin is already configured in opencode.json(c)${c.reset}`,
99
+ `${c.dim}✓ Verified auth.json registration${c.reset}`,
100
+ ''
101
+ ].join('\n');
102
+ return { output, success: true };
103
+ }
104
+ }
105
+ catch (error) {
106
+ logger.error('Failed to install plugin', {
107
+ error: error instanceof Error ? error.message : String(error)
108
+ });
109
+ const output = [
110
+ '',
111
+ `${c.red}✗${c.reset} Failed to install plugin`,
112
+ '',
113
+ `${c.dim}Error: ${error instanceof Error ? error.message : String(error)}${c.reset}`,
114
+ ''
115
+ ].join('\n');
116
+ return { output, success: false };
117
+ }
118
+ }
119
+ async function listAccounts() {
120
+ const pool = await getAccountPool();
121
+ if (pool.accounts.length === 0) {
122
+ const output = [
123
+ '',
124
+ `${c.yellow}📭 No GitHub Copilot accounts configured${c.reset}`,
125
+ '',
126
+ `${c.dim}To add an account:${c.reset}`,
127
+ ` ${c.cyan}1.${c.reset} Run: ${c.brightCyan}opencode-copilot-multi add${c.reset}`,
128
+ ` ${c.cyan}2.${c.reset} Select ${c.bold}"GitHub Copilot"${c.reset}`,
129
+ ` ${c.cyan}3.${c.reset} Complete authentication`,
130
+ ` ${c.cyan}4.${c.reset} Restart OpenCode`,
131
+ ''
132
+ ].join('\n');
133
+ return { output, success: true };
134
+ }
135
+ const lines = [
136
+ '',
137
+ `${c.bold}${c.cyan}👥 GitHub Copilot Accounts${c.reset} ${c.dim}(${pool.accounts.length})${c.reset}`,
138
+ '',
139
+ `${c.gray}┌─────┬────────────────────┬─────────┬───────────────┐${c.reset}`,
140
+ `${c.gray}│${c.reset} ${c.bold}#${c.reset} ${c.gray}│${c.reset} ${c.bold}Username${c.reset} ${c.gray}│${c.reset} ${c.bold}Models${c.reset} ${c.gray}│${c.reset} ${c.bold}Added${c.reset} ${c.gray}│${c.reset}`,
141
+ `${c.gray}├─────┼────────────────────┼─────────┼───────────────┤${c.reset}`,
142
+ ];
143
+ pool.accounts.forEach((account, index) => {
144
+ const addedDate = new Date(account.addedAt).toLocaleDateString('en-US', {
145
+ month: 'short',
146
+ day: 'numeric',
147
+ year: 'numeric'
148
+ });
149
+ const username = account.username.padEnd(18).substring(0, 18);
150
+ const models = String(account.models.length).padStart(7);
151
+ const num = String(index + 1).padStart(3);
152
+ lines.push(`${c.gray}│${c.reset} ${c.cyan}${num}${c.reset} ${c.gray}│${c.reset} ${c.green}${username}${c.reset} ${c.gray}│${c.reset}${models} ${c.gray}│${c.reset} ${c.dim}${addedDate.padEnd(13)}${c.reset} ${c.gray}│${c.reset}`);
153
+ });
154
+ lines.push(`${c.gray}└─────┴────────────────────┴─────────┴───────────────┘${c.reset}`);
155
+ lines.push('');
156
+ return { output: lines.join('\n'), success: true };
157
+ }
158
+ async function runOpencodeLogin() {
159
+ return new Promise((resolve) => {
160
+ const command = process.platform === 'win32' ? 'opencode.exe' : 'opencode';
161
+ const login = spawn(command, ['auth', 'login'], { stdio: 'inherit' });
162
+ login.on('error', (error) => {
163
+ logger.error('Failed to start opencode auth login', {
164
+ error: error instanceof Error ? error.message : String(error)
165
+ });
166
+ resolve(false);
167
+ });
168
+ login.on('exit', (code) => {
169
+ resolve(code === 0);
170
+ });
171
+ });
172
+ }
173
+ async function addAccount() {
174
+ try {
175
+ const poolBefore = await getAccountPool();
176
+ const existingIds = new Set(poolBefore.accounts.map(account => account.id));
177
+ const loginSuccess = await runOpencodeLogin();
178
+ if (!loginSuccess) {
179
+ return {
180
+ output: `\n${c.red}✗${c.reset} GitHub Copilot login cancelled or failed\n`,
181
+ success: false
182
+ };
183
+ }
184
+ await syncAccounts();
185
+ const auth = await getGitHubCopilotAuth();
186
+ if (!auth) {
187
+ const output = [
188
+ '',
189
+ `${c.red}✗${c.reset} ${c.bold}No GitHub Copilot auth found after login${c.reset}`,
190
+ '',
191
+ `${c.dim}Make sure you selected:${c.reset} ${c.brightCyan}GitHub Copilot${c.reset}`,
192
+ ''
193
+ ].join('\n');
194
+ return { output, success: false };
195
+ }
196
+ const accountId = generateAccountId(auth.refresh);
197
+ const poolAfter = await getAccountPool();
198
+ const account = poolAfter.accounts.find(a => a.id === accountId);
199
+ if (!account) {
200
+ const output = [
201
+ '',
202
+ `${c.red}✗${c.reset} ${c.bold}Account not found in pool after login${c.reset}`,
203
+ '',
204
+ `${c.dim}Try restarting OpenCode and running:${c.reset} ${c.brightCyan}opencode-copilot-multi list${c.reset}`,
205
+ ''
206
+ ].join('\n');
207
+ return { output, success: false };
208
+ }
209
+ const alreadyExists = existingIds.has(accountId);
210
+ const statusLine = alreadyExists
211
+ ? `${c.yellow}ℹ${c.reset} ${c.bold}Account already in pool${c.reset} ${c.dim}(tokens updated)${c.reset}`
212
+ : `${c.green}✓${c.reset} ${c.bold}Account added to pool${c.reset}`;
213
+ const output = [
214
+ '',
215
+ statusLine,
216
+ '',
217
+ ` Username: ${c.green}${account.username}${c.reset}`,
218
+ ` Models: ${c.cyan}${account.models.length}${c.reset}`,
219
+ '',
220
+ `${c.dim}Restart OpenCode to load updated models${c.reset}`,
221
+ ''
222
+ ].join('\n');
223
+ return { output, success: true };
224
+ }
225
+ catch (error) {
226
+ logger.error('Failed to add account', {
227
+ error: error instanceof Error ? error.message : String(error)
228
+ });
229
+ const output = [
230
+ '',
231
+ `${c.red}✗${c.reset} Failed to add account`,
232
+ '',
233
+ `${c.dim}Error: ${error instanceof Error ? error.message : String(error)}${c.reset}`,
234
+ ''
235
+ ].join('\n');
236
+ return { output, success: false };
237
+ }
238
+ }
239
+ async function removeAccount(username) {
240
+ const pool = await getAccountPool();
241
+ const accountIndex = pool.accounts.findIndex(a => a.username.toLowerCase() === username.toLowerCase());
242
+ if (accountIndex === -1) {
243
+ const available = pool.accounts.map(a => ` ${c.cyan}•${c.reset} ${c.green}${a.username}${c.reset}`).join('\n');
244
+ const output = [
245
+ '',
246
+ `${c.red}✗${c.reset} Account ${c.bold}"${username}"${c.reset} not found`,
247
+ '',
248
+ available ? `${c.dim}Available accounts:${c.reset}\n${available}` : `${c.yellow}No accounts configured${c.reset}`,
249
+ ''
250
+ ].join('\n');
251
+ return { output, success: false };
252
+ }
253
+ const removed = pool.accounts.splice(accountIndex, 1)[0];
254
+ pool.lastUpdated = Date.now();
255
+ await saveAccountPool(pool);
256
+ await writeModelsToConfig(pool.accounts);
257
+ logger.info(`Account removed: ${removed.username}`);
258
+ const output = [
259
+ '',
260
+ `${c.green}✓${c.reset} Account ${c.bold}${c.green}"${removed.username}"${c.reset} removed successfully`,
261
+ '',
262
+ `${c.dim}${pool.accounts.length} account(s) remaining${c.reset}`,
263
+ ''
264
+ ].join('\n');
265
+ return { output, success: true };
266
+ }
267
+ async function clearAccounts(force = false) {
268
+ const pool = await getAccountPool();
269
+ const count = pool.accounts.length;
270
+ if (count === 0) {
271
+ return {
272
+ output: `\n${c.yellow}📭 No accounts to clear${c.reset}\n`,
273
+ success: true
274
+ };
275
+ }
276
+ // List accounts that will be removed
277
+ const accountList = pool.accounts.map(a => ` ${c.red}×${c.reset} ${c.dim}${a.username}${c.reset}`).join('\n');
278
+ // If --force flag, skip confirmation
279
+ if (force) {
280
+ pool.accounts = [];
281
+ pool.lastUpdated = Date.now();
282
+ await saveAccountPool(pool);
283
+ await writeModelsToConfig([]);
284
+ logger.info(`All accounts cleared (${count} removed) - forced`);
285
+ const output = [
286
+ '',
287
+ `${c.green}✓${c.reset} Cleared ${c.bold}${count}${c.reset} account(s)`,
288
+ '',
289
+ `${c.dim}To add accounts, use: ${c.cyan}opencode auth login${c.reset}`,
290
+ ''
291
+ ].join('\n');
292
+ return { output, success: true };
293
+ }
294
+ // Show confirmation prompt
295
+ const confirmOutput = [
296
+ '',
297
+ `${c.yellow}⚠️ Warning${c.reset}`,
298
+ '',
299
+ `This will remove ${c.bold}${count}${c.reset} account(s):`,
300
+ '',
301
+ accountList,
302
+ '',
303
+ `${c.dim}All models will be removed from OpenCode.${c.reset}`,
304
+ '',
305
+ `${c.bold}Are you sure?${c.reset} ${c.dim}[y/N]${c.reset} `,
306
+ ].join('\n');
307
+ // Print confirmation and wait for input
308
+ process.stdout.write(confirmOutput);
309
+ // Read user input
310
+ const rl = readline.createInterface({
311
+ input: process.stdin,
312
+ output: process.stdout,
313
+ terminal: false
314
+ });
315
+ return new Promise((resolve) => {
316
+ rl.question('', async (answer) => {
317
+ rl.close();
318
+ const confirmed = answer.trim().toLowerCase() === 'y' || answer.trim().toLowerCase() === 'yes';
319
+ if (!confirmed) {
320
+ const output = [
321
+ '',
322
+ `${c.dim}Cancelled. No accounts were removed.${c.reset}`,
323
+ ''
324
+ ].join('\n');
325
+ resolve({ output, success: false });
326
+ return;
327
+ }
328
+ // User confirmed - proceed with clear
329
+ pool.accounts = [];
330
+ pool.lastUpdated = Date.now();
331
+ await saveAccountPool(pool);
332
+ await writeModelsToConfig([]);
333
+ logger.info(`All accounts cleared (${count} removed)`);
334
+ const output = [
335
+ '',
336
+ `${c.green}✓${c.reset} Cleared ${c.bold}${count}${c.reset} account(s)`,
337
+ '',
338
+ `${c.dim}To add accounts, use: ${c.cyan}opencode auth login${c.reset}`,
339
+ ''
340
+ ].join('\n');
341
+ resolve({ output, success: true });
342
+ });
343
+ });
344
+ }
345
+ function showHelp() {
346
+ const help = `
347
+ ${c.bold}${c.cyan}opencode-copilot-multi${c.reset} ${c.dim}v1.0.0${c.reset}
348
+ ${c.dim}Manage multiple GitHub Copilot accounts in OpenCode${c.reset}
349
+
350
+ ${c.bold}${c.yellow}USAGE${c.reset}
351
+ ${c.brightCyan}opencode-copilot-multi${c.reset} ${c.dim}<command> [options]${c.reset}
352
+
353
+ ${c.bold}${c.yellow}COMMANDS${c.reset}
354
+ ${c.green}install${c.reset} Install plugin in OpenCode config
355
+ ${c.green}list${c.reset} List all configured accounts
356
+ ${c.green}add${c.reset} Login GitHub Copilot and sync account
357
+ ${c.green}remove${c.reset} ${c.dim}<user>${c.reset} Remove a specific account
358
+ ${c.green}clear${c.reset} Remove all accounts ${c.dim}(asks for confirmation)${c.reset}
359
+ ${c.green}help${c.reset} Show this help message
360
+
361
+ ${c.bold}${c.yellow}OPTIONS${c.reset}
362
+ ${c.cyan}--force${c.reset}, ${c.cyan}-f${c.reset} Skip confirmation prompt for ${c.green}clear${c.reset} command
363
+
364
+ ${c.bold}${c.yellow}ALIASES${c.reset}
365
+ ${c.cyan}ls${c.reset} ${c.dim}→${c.reset} list
366
+ ${c.cyan}rm${c.reset} ${c.dim}→${c.reset} remove
367
+
368
+ ${c.bold}${c.yellow}EXAMPLES${c.reset}
369
+ ${c.dim}# Install plugin in OpenCode${c.reset}
370
+ ${c.brightCyan}$${c.reset} opencode-copilot-multi install
371
+
372
+ ${c.dim}# List all accounts${c.reset}
373
+ ${c.brightCyan}$${c.reset} opencode-copilot-multi list
374
+
375
+ ${c.dim}# Login and add an account${c.reset}
376
+ ${c.brightCyan}$${c.reset} opencode-copilot-multi add
377
+
378
+ ${c.dim}# Remove a specific account${c.reset}
379
+ ${c.brightCyan}$${c.reset} opencode-copilot-multi remove ${c.dim}github-username${c.reset}
380
+
381
+ ${c.dim}# Clear all accounts (with confirmation)${c.reset}
382
+ ${c.brightCyan}$${c.reset} opencode-copilot-multi clear
383
+
384
+ ${c.dim}# Clear all accounts (skip confirmation)${c.reset}
385
+ ${c.brightCyan}$${c.reset} opencode-copilot-multi clear --force
386
+
387
+ ${c.bold}${c.yellow}INSTALLATION${c.reset}
388
+ ${c.cyan}1.${c.reset} Run: ${c.brightCyan}opencode-copilot-multi install${c.reset}
389
+ ${c.cyan}2.${c.reset} Restart OpenCode
390
+
391
+ ${c.bold}${c.yellow}ADDING ACCOUNTS${c.reset}
392
+ ${c.cyan}1.${c.reset} Run: ${c.brightCyan}opencode-copilot-multi add${c.reset}
393
+ ${c.cyan}2.${c.reset} Select ${c.bold}"GitHub Copilot"${c.reset}
394
+ ${c.cyan}3.${c.reset} Complete authentication
395
+ ${c.cyan}4.${c.reset} Restart OpenCode
396
+
397
+ ${c.dim}This command runs:${c.reset} ${c.brightCyan}opencode auth login${c.reset}
398
+
399
+ ${c.dim}More info: ${c.blue}https://github.com/valeriofantozzi/opencode-copilot-multi${c.reset}
400
+ `;
401
+ return { output: help, success: true };
402
+ }
403
+ //# sourceMappingURL=multi-copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-copilot.js","sourceRoot":"","sources":["../../src/commands/multi-copilot.ts"],"names":[],"mappings":"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"}