@sylix/coworker 1.2.0 → 1.2.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/dist/cli/index.d.ts +0 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +136 -42
- package/dist/cli/index.js.map +1 -1
- package/dist/config/AuthManager.d.ts +33 -0
- package/dist/config/AuthManager.d.ts.map +1 -0
- package/dist/config/AuthManager.js +181 -0
- package/dist/config/AuthManager.js.map +1 -0
- package/package.json +1 -1
package/dist/cli/index.d.ts
CHANGED
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAqGA,wBAAsB,iBAAiB,kBAyHtC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -37,30 +37,101 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
37
37
|
exports.bootstrapCoWorker = bootstrapCoWorker;
|
|
38
38
|
const commander_1 = require("commander");
|
|
39
39
|
const CoWorkerAgent_1 = require("../core/CoWorkerAgent");
|
|
40
|
+
const AuthManager_1 = require("../config/AuthManager");
|
|
40
41
|
const child_process_1 = require("child_process");
|
|
41
42
|
const http = __importStar(require("http"));
|
|
42
43
|
const ws_1 = require("ws");
|
|
44
|
+
const readline = __importStar(require("readline"));
|
|
43
45
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
+
* CoWorker CLI — Interactive Agentic Coding Assistant.
|
|
47
|
+
* Default behavior: launches an interactive chat REPL (like Claude Code).
|
|
46
48
|
*/
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// INTERACTIVE CHAT REPL
|
|
51
|
+
// ============================================================================
|
|
52
|
+
async function runInteractiveChat(agent) {
|
|
53
|
+
const rl = readline.createInterface({
|
|
54
|
+
input: process.stdin,
|
|
55
|
+
output: process.stdout,
|
|
56
|
+
terminal: true
|
|
57
|
+
});
|
|
58
|
+
// Welcome banner
|
|
59
|
+
console.log('\n\x1b[36m╔══════════════════════════════════════════════════╗\x1b[0m');
|
|
60
|
+
console.log('\x1b[36m║\x1b[0m \x1b[1m🤖 CoWorker\x1b[0m by Sylix \x1b[36m║\x1b[0m');
|
|
61
|
+
console.log('\x1b[36m║\x1b[0m Autonomous AI Coding Agent \x1b[36m║\x1b[0m');
|
|
62
|
+
console.log('\x1b[36m╚══════════════════════════════════════════════════╝\x1b[0m');
|
|
63
|
+
console.log(`\x1b[90m cwd: ${process.cwd()}\x1b[0m`);
|
|
64
|
+
console.log(`\x1b[90m model: helix-1.2 | session: ${agent.sessions.currentSessionId.substring(0, 8)}...\x1b[0m`);
|
|
65
|
+
console.log(`\x1b[90m Type your prompt. Press Ctrl+C to exit.\x1b[0m\n`);
|
|
66
|
+
const prompt = () => {
|
|
67
|
+
return new Promise((resolve) => {
|
|
68
|
+
rl.question('\x1b[1m\x1b[36m>\x1b[0m ', (answer) => {
|
|
69
|
+
resolve(answer.trim());
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
// Main REPL loop
|
|
74
|
+
while (true) {
|
|
75
|
+
const input = await prompt();
|
|
76
|
+
// Handle special commands
|
|
77
|
+
if (!input)
|
|
78
|
+
continue;
|
|
79
|
+
if (input === '/exit' || input === '/quit') {
|
|
80
|
+
console.log('\n\x1b[90mGoodbye! 👋\x1b[0m\n');
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
if (input === '/clear') {
|
|
84
|
+
console.clear();
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (input === '/status') {
|
|
88
|
+
await AuthManager_1.AuthManager.status();
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (input === '/help') {
|
|
92
|
+
console.log(`
|
|
93
|
+
\x1b[36m Commands:\x1b[0m
|
|
94
|
+
/help Show this help
|
|
95
|
+
/clear Clear the screen
|
|
96
|
+
/status Show auth & session status
|
|
97
|
+
/compact Show context usage
|
|
98
|
+
/exit Exit CoWorker
|
|
99
|
+
`);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (input === '/compact') {
|
|
103
|
+
const msgCount = agent.sessions.state.messages.length;
|
|
104
|
+
const totalChars = agent.sessions.state.messages.reduce((a, m) => a + m.content.length, 0);
|
|
105
|
+
const estimatedTokens = Math.ceil(totalChars / 4);
|
|
106
|
+
console.log(`\x1b[90m Messages: ${msgCount} | Est. tokens: ${estimatedTokens}/12000 | Session: ${agent.sessions.currentSessionId.substring(0, 8)}\x1b[0m\n`);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
// Run the agentic loop
|
|
110
|
+
console.log(''); // blank line before response
|
|
111
|
+
try {
|
|
112
|
+
for await (const chunk of agent.chat(input)) {
|
|
113
|
+
process.stdout.write(chunk);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
console.error(`\n\x1b[31m✗ Error: ${err.message}\x1b[0m`);
|
|
118
|
+
}
|
|
119
|
+
console.log('\n'); // blank lines after response
|
|
56
120
|
}
|
|
121
|
+
rl.close();
|
|
122
|
+
process.exit(0);
|
|
123
|
+
}
|
|
124
|
+
// ============================================================================
|
|
125
|
+
// CLI SETUP
|
|
126
|
+
// ============================================================================
|
|
127
|
+
async function bootstrapCoWorker() {
|
|
57
128
|
const program = new commander_1.Command();
|
|
58
129
|
program.allowUnknownOption();
|
|
59
130
|
program.passThroughOptions();
|
|
60
131
|
program
|
|
61
132
|
.name('coworker')
|
|
62
|
-
.description('Autonomous
|
|
63
|
-
.version('1.
|
|
133
|
+
.description('CoWorker — Autonomous AI Coding Agent by Sylix')
|
|
134
|
+
.version('1.2.0')
|
|
64
135
|
.option('-p, --print', 'One-shot mode, process and exit')
|
|
65
136
|
.option('-c, --continue', 'Resume most recent session')
|
|
66
137
|
.option('-r, --resume <id>', 'Resume specific session UUID')
|
|
@@ -69,24 +140,43 @@ async function bootstrapCoWorker() {
|
|
|
69
140
|
.option('--model <name>', 'Override default model', 'helix-1.2')
|
|
70
141
|
.option('--dangerously-skip-permissions', 'Bypass all security policies')
|
|
71
142
|
.option('--remote-control <port>', 'Start REST/WebSocket server for IDE access');
|
|
143
|
+
// ==================== AUTH COMMANDS ====================
|
|
144
|
+
program
|
|
145
|
+
.command('login')
|
|
146
|
+
.description('Authenticate with your Sylix account')
|
|
147
|
+
.action(async () => {
|
|
148
|
+
await AuthManager_1.AuthManager.login();
|
|
149
|
+
});
|
|
150
|
+
program
|
|
151
|
+
.command('logout')
|
|
152
|
+
.description('Remove saved credentials')
|
|
153
|
+
.action(async () => {
|
|
154
|
+
await AuthManager_1.AuthManager.logout();
|
|
155
|
+
});
|
|
156
|
+
program
|
|
157
|
+
.command('status')
|
|
158
|
+
.description('Show authentication and account status')
|
|
159
|
+
.action(async () => {
|
|
160
|
+
await AuthManager_1.AuthManager.status();
|
|
161
|
+
});
|
|
162
|
+
// ==================== UTILITY COMMANDS ====================
|
|
72
163
|
program
|
|
73
164
|
.command('update')
|
|
74
165
|
.description('Auto-update the CoWorker CLI')
|
|
75
166
|
.action(() => {
|
|
76
167
|
console.log('Downloading latest release...');
|
|
77
|
-
(0, child_process_1.spawnSync)('npm', ['install', '-g', 'coworker'], { stdio: 'inherit' });
|
|
78
|
-
process.exit(0);
|
|
79
|
-
});
|
|
80
|
-
program
|
|
81
|
-
.command('auth <action>')
|
|
82
|
-
.description('Manage authentication (login/logout/status)')
|
|
83
|
-
.action((action) => {
|
|
84
|
-
console.log(`Authentication ${action} is active.`);
|
|
168
|
+
(0, child_process_1.spawnSync)('npm', ['install', '-g', '@sylix/coworker'], { stdio: 'inherit' });
|
|
85
169
|
process.exit(0);
|
|
86
170
|
});
|
|
87
171
|
program.parse(process.argv);
|
|
88
172
|
const options = program.opts();
|
|
89
|
-
|
|
173
|
+
// If a subcommand was run (login, logout, status, update), commander handles it
|
|
174
|
+
// and we should not continue. Check if args contain a known subcommand:
|
|
175
|
+
const subcommands = ['login', 'logout', 'status', 'update'];
|
|
176
|
+
if (process.argv.length > 2 && subcommands.includes(process.argv[2])) {
|
|
177
|
+
return; // Subcommand handles its own lifecycle
|
|
178
|
+
}
|
|
179
|
+
// ==================== WORKTREE ISOLATION ====================
|
|
90
180
|
if (options.worktree) {
|
|
91
181
|
console.log(`[Isolating Agent...] Creating Git Worktree: coworker-task`);
|
|
92
182
|
try {
|
|
@@ -99,12 +189,13 @@ async function bootstrapCoWorker() {
|
|
|
99
189
|
process.exit(1);
|
|
100
190
|
}
|
|
101
191
|
}
|
|
192
|
+
// ==================== HEADLESS / REMOTE MODE ====================
|
|
102
193
|
if (options.remoteControl) {
|
|
103
194
|
const port = parseInt(options.remoteControl, 10);
|
|
104
195
|
startHeadlessServer(port);
|
|
105
196
|
return;
|
|
106
197
|
}
|
|
107
|
-
//
|
|
198
|
+
// ==================== AGENT BOOTSTRAP ====================
|
|
108
199
|
let sessionId = undefined;
|
|
109
200
|
if (options.resume)
|
|
110
201
|
sessionId = options.resume;
|
|
@@ -114,36 +205,37 @@ async function bootstrapCoWorker() {
|
|
|
114
205
|
if (sessionId) {
|
|
115
206
|
agent.sessions.currentSessionId = sessionId;
|
|
116
207
|
}
|
|
117
|
-
// Boot async subsystems (Settings, MCP servers, Skills)
|
|
118
208
|
await agent.boot();
|
|
119
|
-
// Apply --dangerously-skip-permissions if provided
|
|
120
209
|
if (options.dangerouslySkipPermissions) {
|
|
121
210
|
console.log('\x1b[31m⚠️ WARNING: All permission checks are DISABLED.\x1b[0m');
|
|
122
211
|
agent.permissions = { intercept: async () => true };
|
|
123
212
|
}
|
|
124
|
-
//
|
|
213
|
+
// ==================== MODE SELECTION ====================
|
|
125
214
|
if (options.print && program.args.length > 0) {
|
|
126
|
-
|
|
215
|
+
// One-shot mode: process prompt and exit
|
|
216
|
+
await runOneShot(agent, program.args.join(' '), options.outputFormat);
|
|
127
217
|
}
|
|
128
|
-
else if (
|
|
129
|
-
//
|
|
130
|
-
const
|
|
131
|
-
|
|
218
|
+
else if (program.args.length > 0) {
|
|
219
|
+
// Prompt provided as args — run it, then drop into interactive
|
|
220
|
+
const initialPrompt = program.args.join(' ');
|
|
221
|
+
console.log(''); // spacing
|
|
222
|
+
for await (const chunk of agent.chat(initialPrompt)) {
|
|
223
|
+
process.stdout.write(chunk);
|
|
224
|
+
}
|
|
225
|
+
console.log('\n');
|
|
226
|
+
// Then drop into interactive mode
|
|
227
|
+
await runInteractiveChat(agent);
|
|
132
228
|
}
|
|
133
229
|
else {
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
if (prompt) {
|
|
137
|
-
runOneShot(agent, prompt, options.outputFormat);
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
console.log('CoWorker ready. Use --print to send a prompt.');
|
|
141
|
-
}
|
|
230
|
+
// No prompt — launch interactive chat REPL (default, like Claude Code)
|
|
231
|
+
await runInteractiveChat(agent);
|
|
142
232
|
}
|
|
143
233
|
}
|
|
234
|
+
// ============================================================================
|
|
235
|
+
// ONE-SHOT MODE
|
|
236
|
+
// ============================================================================
|
|
144
237
|
async function runOneShot(agent, prompt, format) {
|
|
145
238
|
let outputText = '';
|
|
146
|
-
// Stream the generator
|
|
147
239
|
for await (const chunk of agent.chat(prompt)) {
|
|
148
240
|
if (format === 'text') {
|
|
149
241
|
process.stdout.write(chunk);
|
|
@@ -155,12 +247,14 @@ async function runOneShot(agent, prompt, format) {
|
|
|
155
247
|
}
|
|
156
248
|
process.exit(0);
|
|
157
249
|
}
|
|
250
|
+
// ============================================================================
|
|
251
|
+
// HEADLESS / REMOTE CONTROL SERVER
|
|
252
|
+
// ============================================================================
|
|
158
253
|
function startHeadlessServer(port) {
|
|
159
254
|
const server = http.createServer();
|
|
160
255
|
const wss = new ws_1.WebSocketServer({ server });
|
|
161
256
|
wss.on('connection', (ws) => {
|
|
162
257
|
console.log('[Remote-Control] IDE Connected via WebSocket');
|
|
163
|
-
// Each IDE window instance gets its own agent session tracking
|
|
164
258
|
const remoteAgent = new CoWorkerAgent_1.CoWorkerAgent({ model: 'helix-1.2', role: 'General' });
|
|
165
259
|
ws.on('message', async (data) => {
|
|
166
260
|
const { prompt, sessionId } = JSON.parse(data.toString());
|
|
@@ -176,7 +270,7 @@ function startHeadlessServer(port) {
|
|
|
176
270
|
console.log(`[Remote-Control] Listening for headless connections on port ${port}...`);
|
|
177
271
|
});
|
|
178
272
|
}
|
|
179
|
-
// Self-execute
|
|
273
|
+
// Self-execute
|
|
180
274
|
if (require.main === module) {
|
|
181
275
|
bootstrapCoWorker();
|
|
182
276
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface AuthData {
|
|
2
|
+
access_token: string;
|
|
3
|
+
refresh_token: string;
|
|
4
|
+
user: {
|
|
5
|
+
id: string;
|
|
6
|
+
email: string;
|
|
7
|
+
};
|
|
8
|
+
expires_at: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Manages Device Code OAuth authentication for the CoWorker CLI.
|
|
12
|
+
* Flow: CLI requests device code → user authorizes on website → CLI polls for token.
|
|
13
|
+
*/
|
|
14
|
+
export declare class AuthManager {
|
|
15
|
+
/**
|
|
16
|
+
* Device Code login flow — opens browser, polls for authorization.
|
|
17
|
+
*/
|
|
18
|
+
static login(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Removes saved credentials.
|
|
21
|
+
*/
|
|
22
|
+
static logout(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Shows current authentication status.
|
|
25
|
+
*/
|
|
26
|
+
static status(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Returns the stored access token, or null if not logged in.
|
|
29
|
+
*/
|
|
30
|
+
static getToken(): Promise<string | null>;
|
|
31
|
+
private static loadAuth;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=AuthManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../../src/config/AuthManager.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,WAAW;IAEtB;;OAEG;WACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyFnC;;OAEG;WACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IASpC;;OAEG;WACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBpC;;OAEG;WACU,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;mBAO1B,QAAQ;CAQ9B"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.AuthManager = void 0;
|
|
40
|
+
const fs = __importStar(require("fs/promises"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
44
|
+
const AUTH_FILE = path.join(os.homedir(), '.coworker', 'auth.json');
|
|
45
|
+
const API_BASE = 'https://api.sylixide.com/v1/auth';
|
|
46
|
+
/**
|
|
47
|
+
* Manages Device Code OAuth authentication for the CoWorker CLI.
|
|
48
|
+
* Flow: CLI requests device code → user authorizes on website → CLI polls for token.
|
|
49
|
+
*/
|
|
50
|
+
class AuthManager {
|
|
51
|
+
/**
|
|
52
|
+
* Device Code login flow — opens browser, polls for authorization.
|
|
53
|
+
*/
|
|
54
|
+
static async login() {
|
|
55
|
+
const deviceId = `coworker-cli-${os.hostname()}-${Date.now().toString(36)}`;
|
|
56
|
+
console.log('\n\x1b[36m🔐 CoWorker Login\x1b[0m\n');
|
|
57
|
+
console.log('Requesting device code...');
|
|
58
|
+
// Step 1: Request device code
|
|
59
|
+
let codeResponse;
|
|
60
|
+
try {
|
|
61
|
+
const res = await (0, node_fetch_1.default)(`${API_BASE}/device/code`, {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
headers: { 'Content-Type': 'application/json' },
|
|
64
|
+
body: JSON.stringify({ device_id: deviceId, device_name: 'CoWorker CLI' })
|
|
65
|
+
});
|
|
66
|
+
codeResponse = await res.json();
|
|
67
|
+
if (!codeResponse.success) {
|
|
68
|
+
console.error(`\x1b[31m✗ Failed to get device code: ${codeResponse.error_description || codeResponse.error}\x1b[0m`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
console.error(`\x1b[31m✗ Could not connect to Sylix servers: ${err.message}\x1b[0m`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
const { device_code, user_code, verification_uri_complete } = codeResponse;
|
|
77
|
+
// Step 2: Show code and open browser
|
|
78
|
+
console.log(`\n Your one-time code: \x1b[1m\x1b[33m${user_code}\x1b[0m\n`);
|
|
79
|
+
console.log(` Open this URL to authorize:\n \x1b[4m${verification_uri_complete}\x1b[0m\n`);
|
|
80
|
+
// Try to open browser
|
|
81
|
+
try {
|
|
82
|
+
const open = (await Promise.resolve().then(() => __importStar(require('open')))).default;
|
|
83
|
+
await open(verification_uri_complete);
|
|
84
|
+
console.log(' \x1b[32m✓ Browser opened automatically\x1b[0m');
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
console.log(' (Open the URL above manually in your browser)');
|
|
88
|
+
}
|
|
89
|
+
console.log('\n Waiting for authorization...\n');
|
|
90
|
+
// Step 3: Poll for token
|
|
91
|
+
const maxAttempts = 360; // 30 minutes at 5s intervals
|
|
92
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
93
|
+
await new Promise(r => setTimeout(r, 5000)); // 5 second interval
|
|
94
|
+
try {
|
|
95
|
+
const res = await (0, node_fetch_1.default)(`${API_BASE}/device/token`, {
|
|
96
|
+
method: 'POST',
|
|
97
|
+
headers: { 'Content-Type': 'application/json' },
|
|
98
|
+
body: JSON.stringify({ device_code })
|
|
99
|
+
});
|
|
100
|
+
const tokenData = await res.json();
|
|
101
|
+
if (tokenData.success) {
|
|
102
|
+
// Save token
|
|
103
|
+
const authData = {
|
|
104
|
+
access_token: tokenData.access_token,
|
|
105
|
+
refresh_token: tokenData.refresh_token,
|
|
106
|
+
user: tokenData.user,
|
|
107
|
+
expires_at: Math.floor(Date.now() / 1000) + tokenData.expires_in
|
|
108
|
+
};
|
|
109
|
+
await fs.mkdir(path.dirname(AUTH_FILE), { recursive: true });
|
|
110
|
+
await fs.writeFile(AUTH_FILE, JSON.stringify(authData, null, 2), 'utf8');
|
|
111
|
+
console.log(` \x1b[32m✓ Logged in as \x1b[1m${tokenData.user.email}\x1b[0m\n`);
|
|
112
|
+
process.exit(0);
|
|
113
|
+
}
|
|
114
|
+
if (tokenData.error === 'authorization_pending') {
|
|
115
|
+
process.stdout.write('.');
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
// Any other error is terminal
|
|
119
|
+
console.error(`\n\x1b[31m✗ ${tokenData.error_description || tokenData.error}\x1b[0m`);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
// Network error during poll — retry
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
console.error('\n\x1b[31m✗ Login timed out. Please try again.\x1b[0m');
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Removes saved credentials.
|
|
132
|
+
*/
|
|
133
|
+
static async logout() {
|
|
134
|
+
try {
|
|
135
|
+
await fs.unlink(AUTH_FILE);
|
|
136
|
+
console.log('\x1b[32m✓ Logged out successfully.\x1b[0m');
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
console.log('Already logged out (no saved credentials).');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Shows current authentication status.
|
|
144
|
+
*/
|
|
145
|
+
static async status() {
|
|
146
|
+
const authData = await this.loadAuth();
|
|
147
|
+
if (!authData) {
|
|
148
|
+
console.log('\x1b[33m⚠ Not logged in.\x1b[0m Run \x1b[1mcoworker login\x1b[0m to authenticate.');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const expiresDate = new Date(authData.expires_at * 1000);
|
|
152
|
+
const isExpired = Date.now() > authData.expires_at * 1000;
|
|
153
|
+
console.log(`\n\x1b[36m🔐 CoWorker Auth Status\x1b[0m\n`);
|
|
154
|
+
console.log(` Account: \x1b[1m${authData.user.email}\x1b[0m`);
|
|
155
|
+
console.log(` User ID: ${authData.user.id}`);
|
|
156
|
+
console.log(` Expires: ${expiresDate.toLocaleDateString()} ${expiresDate.toLocaleTimeString()}`);
|
|
157
|
+
console.log(` Status: ${isExpired ? '\x1b[31mExpired\x1b[0m — run \x1b[1mcoworker login\x1b[0m' : '\x1b[32mActive\x1b[0m'}\n`);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Returns the stored access token, or null if not logged in.
|
|
161
|
+
*/
|
|
162
|
+
static async getToken() {
|
|
163
|
+
const authData = await this.loadAuth();
|
|
164
|
+
if (!authData)
|
|
165
|
+
return null;
|
|
166
|
+
if (Date.now() > authData.expires_at * 1000)
|
|
167
|
+
return null;
|
|
168
|
+
return authData.access_token;
|
|
169
|
+
}
|
|
170
|
+
static async loadAuth() {
|
|
171
|
+
try {
|
|
172
|
+
const content = await fs.readFile(AUTH_FILE, 'utf8');
|
|
173
|
+
return JSON.parse(content);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
exports.AuthManager = AuthManager;
|
|
181
|
+
//# sourceMappingURL=AuthManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../../src/config/AuthManager.ts"],"names":[],"mappings":"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"}
|