@sylix/coworker 1.1.5 → 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.
Files changed (190) hide show
  1. package/dist/cli/index.d.ts +3 -0
  2. package/dist/cli/index.d.ts.map +1 -0
  3. package/dist/cli/index.js +277 -0
  4. package/dist/cli/index.js.map +1 -0
  5. package/dist/config/AuthManager.d.ts +33 -0
  6. package/dist/config/AuthManager.d.ts.map +1 -0
  7. package/dist/config/AuthManager.js +181 -0
  8. package/dist/config/AuthManager.js.map +1 -0
  9. package/dist/config/SettingsManager.d.ts +25 -0
  10. package/dist/config/SettingsManager.d.ts.map +1 -0
  11. package/dist/config/SettingsManager.js +96 -0
  12. package/dist/config/SettingsManager.js.map +1 -0
  13. package/dist/core/CoWorkerAgent.d.ts +52 -0
  14. package/dist/core/CoWorkerAgent.d.ts.map +1 -0
  15. package/dist/core/CoWorkerAgent.js +308 -0
  16. package/dist/core/CoWorkerAgent.js.map +1 -0
  17. package/dist/mcp/MCPClientManager.d.ts +30 -0
  18. package/dist/mcp/MCPClientManager.d.ts.map +1 -0
  19. package/dist/mcp/MCPClientManager.js +100 -0
  20. package/dist/mcp/MCPClientManager.js.map +1 -0
  21. package/dist/permissions/PermissionInterceptor.d.ts +21 -0
  22. package/dist/permissions/PermissionInterceptor.d.ts.map +1 -0
  23. package/dist/permissions/PermissionInterceptor.js +104 -0
  24. package/dist/permissions/PermissionInterceptor.js.map +1 -0
  25. package/dist/session/SessionManager.d.ts +38 -0
  26. package/dist/session/SessionManager.d.ts.map +1 -0
  27. package/dist/session/SessionManager.js +129 -0
  28. package/dist/session/SessionManager.js.map +1 -0
  29. package/dist/skills/HookAndSkillManager.d.ts +37 -0
  30. package/dist/skills/HookAndSkillManager.d.ts.map +1 -0
  31. package/dist/skills/HookAndSkillManager.js +141 -0
  32. package/dist/skills/HookAndSkillManager.js.map +1 -0
  33. package/dist/task/TaskEngine.d.ts +29 -0
  34. package/dist/task/TaskEngine.d.ts.map +1 -0
  35. package/dist/task/TaskEngine.js +117 -0
  36. package/dist/task/TaskEngine.js.map +1 -0
  37. package/dist/tools/CronManager.d.ts +22 -0
  38. package/dist/tools/CronManager.d.ts.map +1 -0
  39. package/dist/tools/CronManager.js +44 -0
  40. package/dist/tools/CronManager.js.map +1 -0
  41. package/dist/tools/NativeTools.d.ts +33 -0
  42. package/dist/tools/NativeTools.d.ts.map +1 -0
  43. package/dist/tools/NativeTools.js +175 -0
  44. package/dist/tools/NativeTools.js.map +1 -0
  45. package/dist/tools/Schemas.d.ts +365 -0
  46. package/dist/tools/Schemas.d.ts.map +1 -0
  47. package/dist/tools/Schemas.js +177 -0
  48. package/dist/tools/Schemas.js.map +1 -0
  49. package/dist/ui/InkUI.d.ts +2 -0
  50. package/dist/ui/InkUI.d.ts.map +1 -0
  51. package/dist/ui/InkUI.js +11 -0
  52. package/dist/ui/InkUI.js.map +1 -0
  53. package/package.json +18 -8
  54. package/dist/agents/runner.d.ts +0 -19
  55. package/dist/agents/runner.d.ts.map +0 -1
  56. package/dist/agents/runner.js +0 -170
  57. package/dist/agents/runner.js.map +0 -1
  58. package/dist/api/sylix.d.ts +0 -53
  59. package/dist/api/sylix.d.ts.map +0 -1
  60. package/dist/api/sylix.js +0 -237
  61. package/dist/api/sylix.js.map +0 -1
  62. package/dist/cli.d.ts +0 -3
  63. package/dist/cli.d.ts.map +0 -1
  64. package/dist/cli.js +0 -371
  65. package/dist/cli.js.map +0 -1
  66. package/dist/commands/ask.d.ts +0 -2
  67. package/dist/commands/ask.d.ts.map +0 -1
  68. package/dist/commands/ask.js +0 -55
  69. package/dist/commands/ask.js.map +0 -1
  70. package/dist/commands/chat.d.ts +0 -8
  71. package/dist/commands/chat.d.ts.map +0 -1
  72. package/dist/commands/chat.js +0 -479
  73. package/dist/commands/chat.js.map +0 -1
  74. package/dist/commands/commit.d.ts +0 -2
  75. package/dist/commands/commit.d.ts.map +0 -1
  76. package/dist/commands/commit.js +0 -163
  77. package/dist/commands/commit.js.map +0 -1
  78. package/dist/commands/config.d.ts +0 -3
  79. package/dist/commands/config.d.ts.map +0 -1
  80. package/dist/commands/config.js +0 -101
  81. package/dist/commands/config.js.map +0 -1
  82. package/dist/commands/edit.d.ts +0 -2
  83. package/dist/commands/edit.d.ts.map +0 -1
  84. package/dist/commands/edit.js +0 -112
  85. package/dist/commands/edit.js.map +0 -1
  86. package/dist/commands/explain.d.ts +0 -2
  87. package/dist/commands/explain.d.ts.map +0 -1
  88. package/dist/commands/explain.js +0 -99
  89. package/dist/commands/explain.js.map +0 -1
  90. package/dist/commands/login.d.ts +0 -2
  91. package/dist/commands/login.d.ts.map +0 -1
  92. package/dist/commands/login.js +0 -151
  93. package/dist/commands/login.js.map +0 -1
  94. package/dist/commands/review.d.ts +0 -2
  95. package/dist/commands/review.d.ts.map +0 -1
  96. package/dist/commands/review.js +0 -137
  97. package/dist/commands/review.js.map +0 -1
  98. package/dist/commands/run.d.ts +0 -2
  99. package/dist/commands/run.d.ts.map +0 -1
  100. package/dist/commands/run.js +0 -136
  101. package/dist/commands/run.js.map +0 -1
  102. package/dist/config/settings.d.ts +0 -33
  103. package/dist/config/settings.d.ts.map +0 -1
  104. package/dist/config/settings.js +0 -72
  105. package/dist/config/settings.js.map +0 -1
  106. package/dist/context/reader.d.ts +0 -24
  107. package/dist/context/reader.d.ts.map +0 -1
  108. package/dist/context/reader.js +0 -209
  109. package/dist/context/reader.js.map +0 -1
  110. package/dist/hooks/engine.d.ts +0 -9
  111. package/dist/hooks/engine.d.ts.map +0 -1
  112. package/dist/hooks/engine.js +0 -85
  113. package/dist/hooks/engine.js.map +0 -1
  114. package/dist/mcp/client.d.ts +0 -15
  115. package/dist/mcp/client.d.ts.map +0 -1
  116. package/dist/mcp/client.js +0 -211
  117. package/dist/mcp/client.js.map +0 -1
  118. package/dist/mcp/transport.d.ts +0 -46
  119. package/dist/mcp/transport.d.ts.map +0 -1
  120. package/dist/mcp/transport.js +0 -196
  121. package/dist/mcp/transport.js.map +0 -1
  122. package/dist/memory/loader.d.ts +0 -41
  123. package/dist/memory/loader.d.ts.map +0 -1
  124. package/dist/memory/loader.js +0 -249
  125. package/dist/memory/loader.js.map +0 -1
  126. package/dist/permissions/manager.d.ts +0 -7
  127. package/dist/permissions/manager.d.ts.map +0 -1
  128. package/dist/permissions/manager.js +0 -125
  129. package/dist/permissions/manager.js.map +0 -1
  130. package/dist/scripts/postinstall.d.ts +0 -7
  131. package/dist/scripts/postinstall.d.ts.map +0 -1
  132. package/dist/scripts/postinstall.js +0 -23
  133. package/dist/scripts/postinstall.js.map +0 -1
  134. package/dist/session/memory.d.ts +0 -6
  135. package/dist/session/memory.d.ts.map +0 -1
  136. package/dist/session/memory.js +0 -81
  137. package/dist/session/memory.js.map +0 -1
  138. package/dist/session/store.d.ts +0 -19
  139. package/dist/session/store.d.ts.map +0 -1
  140. package/dist/session/store.js +0 -94
  141. package/dist/session/store.js.map +0 -1
  142. package/dist/tools/bash.d.ts +0 -2
  143. package/dist/tools/bash.d.ts.map +0 -1
  144. package/dist/tools/bash.js +0 -40
  145. package/dist/tools/bash.js.map +0 -1
  146. package/dist/tools/chrome.d.ts +0 -10
  147. package/dist/tools/chrome.d.ts.map +0 -1
  148. package/dist/tools/chrome.js +0 -228
  149. package/dist/tools/chrome.js.map +0 -1
  150. package/dist/tools/edit.d.ts +0 -2
  151. package/dist/tools/edit.d.ts.map +0 -1
  152. package/dist/tools/edit.js +0 -67
  153. package/dist/tools/edit.js.map +0 -1
  154. package/dist/tools/glob.d.ts +0 -10
  155. package/dist/tools/glob.d.ts.map +0 -1
  156. package/dist/tools/glob.js +0 -245
  157. package/dist/tools/glob.js.map +0 -1
  158. package/dist/tools/grep.d.ts +0 -10
  159. package/dist/tools/grep.d.ts.map +0 -1
  160. package/dist/tools/grep.js +0 -252
  161. package/dist/tools/grep.js.map +0 -1
  162. package/dist/tools/ls.d.ts +0 -2
  163. package/dist/tools/ls.d.ts.map +0 -1
  164. package/dist/tools/ls.js +0 -75
  165. package/dist/tools/ls.js.map +0 -1
  166. package/dist/tools/read.d.ts +0 -2
  167. package/dist/tools/read.d.ts.map +0 -1
  168. package/dist/tools/read.js +0 -72
  169. package/dist/tools/read.js.map +0 -1
  170. package/dist/tools/registry.d.ts +0 -3
  171. package/dist/tools/registry.d.ts.map +0 -1
  172. package/dist/tools/registry.js +0 -281
  173. package/dist/tools/registry.js.map +0 -1
  174. package/dist/tools/schema.json +0 -508
  175. package/dist/tools/task.d.ts +0 -11
  176. package/dist/tools/task.d.ts.map +0 -1
  177. package/dist/tools/task.js +0 -118
  178. package/dist/tools/task.js.map +0 -1
  179. package/dist/tools/web.d.ts +0 -3
  180. package/dist/tools/web.d.ts.map +0 -1
  181. package/dist/tools/web.js +0 -113
  182. package/dist/tools/web.js.map +0 -1
  183. package/dist/tools/write.d.ts +0 -18
  184. package/dist/tools/write.d.ts.map +0 -1
  185. package/dist/tools/write.js +0 -122
  186. package/dist/tools/write.js.map +0 -1
  187. package/dist/utils/output.d.ts +0 -62
  188. package/dist/utils/output.d.ts.map +0 -1
  189. package/dist/utils/output.js +0 -487
  190. package/dist/utils/output.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function bootstrapCoWorker(): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAqGA,wBAAsB,iBAAiB,kBAyHtC"}
@@ -0,0 +1,277 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.bootstrapCoWorker = bootstrapCoWorker;
38
+ const commander_1 = require("commander");
39
+ const CoWorkerAgent_1 = require("../core/CoWorkerAgent");
40
+ const AuthManager_1 = require("../config/AuthManager");
41
+ const child_process_1 = require("child_process");
42
+ const http = __importStar(require("http"));
43
+ const ws_1 = require("ws");
44
+ const readline = __importStar(require("readline"));
45
+ /**
46
+ * CoWorker CLI — Interactive Agentic Coding Assistant.
47
+ * Default behavior: launches an interactive chat REPL (like Claude Code).
48
+ */
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
120
+ }
121
+ rl.close();
122
+ process.exit(0);
123
+ }
124
+ // ============================================================================
125
+ // CLI SETUP
126
+ // ============================================================================
127
+ async function bootstrapCoWorker() {
128
+ const program = new commander_1.Command();
129
+ program.allowUnknownOption();
130
+ program.passThroughOptions();
131
+ program
132
+ .name('coworker')
133
+ .description('CoWorker — Autonomous AI Coding Agent by Sylix')
134
+ .version('1.2.0')
135
+ .option('-p, --print', 'One-shot mode, process and exit')
136
+ .option('-c, --continue', 'Resume most recent session')
137
+ .option('-r, --resume <id>', 'Resume specific session UUID')
138
+ .option('-w, --worktree', 'Run in an isolated git worktree branch')
139
+ .option('--output-format <format>', 'text | json', 'text')
140
+ .option('--model <name>', 'Override default model', 'helix-1.2')
141
+ .option('--dangerously-skip-permissions', 'Bypass all security policies')
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 ====================
163
+ program
164
+ .command('update')
165
+ .description('Auto-update the CoWorker CLI')
166
+ .action(() => {
167
+ console.log('Downloading latest release...');
168
+ (0, child_process_1.spawnSync)('npm', ['install', '-g', '@sylix/coworker'], { stdio: 'inherit' });
169
+ process.exit(0);
170
+ });
171
+ program.parse(process.argv);
172
+ const options = program.opts();
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 ====================
180
+ if (options.worktree) {
181
+ console.log(`[Isolating Agent...] Creating Git Worktree: coworker-task`);
182
+ try {
183
+ (0, child_process_1.spawnSync)('git', ['worktree', 'add', '../coworker-task', '-b', `coworker/temp-${Date.now()}`]);
184
+ process.chdir('../coworker-task');
185
+ console.log(`[Isolated] Changed directory to protected worktree.`);
186
+ }
187
+ catch {
188
+ console.error('Failed to create Git worktree. Ensure repo is clean.');
189
+ process.exit(1);
190
+ }
191
+ }
192
+ // ==================== HEADLESS / REMOTE MODE ====================
193
+ if (options.remoteControl) {
194
+ const port = parseInt(options.remoteControl, 10);
195
+ startHeadlessServer(port);
196
+ return;
197
+ }
198
+ // ==================== AGENT BOOTSTRAP ====================
199
+ let sessionId = undefined;
200
+ if (options.resume)
201
+ sessionId = options.resume;
202
+ else if (options.continue)
203
+ sessionId = 'latest';
204
+ const agent = new CoWorkerAgent_1.CoWorkerAgent({ model: options.model, role: 'General' });
205
+ if (sessionId) {
206
+ agent.sessions.currentSessionId = sessionId;
207
+ }
208
+ await agent.boot();
209
+ if (options.dangerouslySkipPermissions) {
210
+ console.log('\x1b[31m⚠️ WARNING: All permission checks are DISABLED.\x1b[0m');
211
+ agent.permissions = { intercept: async () => true };
212
+ }
213
+ // ==================== MODE SELECTION ====================
214
+ if (options.print && program.args.length > 0) {
215
+ // One-shot mode: process prompt and exit
216
+ await runOneShot(agent, program.args.join(' '), options.outputFormat);
217
+ }
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);
228
+ }
229
+ else {
230
+ // No prompt — launch interactive chat REPL (default, like Claude Code)
231
+ await runInteractiveChat(agent);
232
+ }
233
+ }
234
+ // ============================================================================
235
+ // ONE-SHOT MODE
236
+ // ============================================================================
237
+ async function runOneShot(agent, prompt, format) {
238
+ let outputText = '';
239
+ for await (const chunk of agent.chat(prompt)) {
240
+ if (format === 'text') {
241
+ process.stdout.write(chunk);
242
+ }
243
+ outputText += chunk;
244
+ }
245
+ if (format === 'json') {
246
+ console.log(JSON.stringify({ response: outputText }));
247
+ }
248
+ process.exit(0);
249
+ }
250
+ // ============================================================================
251
+ // HEADLESS / REMOTE CONTROL SERVER
252
+ // ============================================================================
253
+ function startHeadlessServer(port) {
254
+ const server = http.createServer();
255
+ const wss = new ws_1.WebSocketServer({ server });
256
+ wss.on('connection', (ws) => {
257
+ console.log('[Remote-Control] IDE Connected via WebSocket');
258
+ const remoteAgent = new CoWorkerAgent_1.CoWorkerAgent({ model: 'helix-1.2', role: 'General' });
259
+ ws.on('message', async (data) => {
260
+ const { prompt, sessionId } = JSON.parse(data.toString());
261
+ if (sessionId)
262
+ remoteAgent.sessions.currentSessionId = sessionId;
263
+ for await (const chunk of remoteAgent.chat(prompt)) {
264
+ ws.send(JSON.stringify({ type: 'stream', chunk }));
265
+ }
266
+ ws.send(JSON.stringify({ type: 'done' }));
267
+ });
268
+ });
269
+ server.listen(port, () => {
270
+ console.log(`[Remote-Control] Listening for headless connections on port ${port}...`);
271
+ });
272
+ }
273
+ // Self-execute
274
+ if (require.main === module) {
275
+ bootstrapCoWorker();
276
+ }
277
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,25 @@
1
+ export interface CoWorkerSettings {
2
+ allow: string[];
3
+ deny: string[];
4
+ mcpServers: Record<string, {
5
+ command: string;
6
+ args: string[];
7
+ }>;
8
+ worktree: {
9
+ symlinkDirectories: string[];
10
+ sparsePaths: string[];
11
+ };
12
+ mainBranch: string;
13
+ }
14
+ /**
15
+ * Phase 8: Settings JSON Parser.
16
+ * Loads user configurations from ~/.coworker/settings.json or the local project directory.
17
+ */
18
+ export declare class SettingsManager {
19
+ private globalPath;
20
+ private localPath;
21
+ config: CoWorkerSettings;
22
+ loadSettings(): Promise<CoWorkerSettings>;
23
+ private merge;
24
+ }
25
+ //# sourceMappingURL=SettingsManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsManager.d.ts","sourceRoot":"","sources":["../../src/config/SettingsManager.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAChE,QAAQ,EAAE;QACR,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,SAAS,CAA0D;IAEpE,MAAM,EAAE,gBAAgB,CAS7B;IAEI,YAAY,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAsB/C,OAAO,CAAC,KAAK;CAWd"}
@@ -0,0 +1,96 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SettingsManager = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ /**
41
+ * Phase 8: Settings JSON Parser.
42
+ * Loads user configurations from ~/.coworker/settings.json or the local project directory.
43
+ */
44
+ class SettingsManager {
45
+ constructor() {
46
+ this.globalPath = path.join(os.homedir(), '.coworker', 'settings.json');
47
+ this.localPath = path.join(process.cwd(), '.coworker', 'settings.json');
48
+ this.config = {
49
+ allow: [],
50
+ deny: [],
51
+ mcpServers: {},
52
+ worktree: {
53
+ symlinkDirectories: ['node_modules'],
54
+ sparsePaths: []
55
+ },
56
+ mainBranch: 'main'
57
+ };
58
+ }
59
+ async loadSettings() {
60
+ try {
61
+ // Load global first
62
+ const globalData = await fs.readFile(this.globalPath, 'utf8');
63
+ const globalParsed = JSON.parse(globalData);
64
+ this.merge(globalParsed);
65
+ }
66
+ catch {
67
+ // Global doesn't exist
68
+ }
69
+ try {
70
+ // Override with local
71
+ const localData = await fs.readFile(this.localPath, 'utf8');
72
+ const localParsed = JSON.parse(localData);
73
+ this.merge(localParsed);
74
+ }
75
+ catch {
76
+ // Local doesn't exist
77
+ }
78
+ return this.config;
79
+ }
80
+ merge(partial) {
81
+ if (partial.allow)
82
+ this.config.allow.push(...partial.allow);
83
+ if (partial.deny)
84
+ this.config.deny.push(...partial.deny);
85
+ if (partial.mcpServers) {
86
+ this.config.mcpServers = { ...this.config.mcpServers, ...partial.mcpServers };
87
+ }
88
+ if (partial.mainBranch)
89
+ this.config.mainBranch = partial.mainBranch;
90
+ if (partial.worktree) {
91
+ this.config.worktree = { ...this.config.worktree, ...partial.worktree };
92
+ }
93
+ }
94
+ }
95
+ exports.SettingsManager = SettingsManager;
96
+ //# sourceMappingURL=SettingsManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsManager.js","sourceRoot":"","sources":["../../src/config/SettingsManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAC7B,uCAAyB;AAazB;;;GAGG;AACH,MAAa,eAAe;IAA5B;QACU,eAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QACnE,cAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QAEpE,WAAM,GAAqB;YAChC,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE;gBACR,kBAAkB,EAAE,CAAC,cAAc,CAAC;gBACpC,WAAW,EAAE,EAAE;aAChB;YACD,UAAU,EAAE,MAAM;SACnB,CAAC;IAmCJ,CAAC;IAjCC,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC;YACH,oBAAoB;YACpB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;QAED,IAAI,CAAC;YACH,sBAAsB;YACtB,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,OAAkC;QAC9C,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,IAAI;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QAChF,CAAC;QACD,IAAI,OAAO,CAAC,UAAU;YAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACpE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC1E,CAAC;IACH,CAAC;CACF;AAhDD,0CAgDC"}