nexusforge-cli 1.0.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/bin/nexusforge +2 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +367 -0
- package/dist/index.js.map +1 -0
- package/dist/services/api.d.ts +51 -0
- package/dist/services/api.d.ts.map +1 -0
- package/dist/services/api.js +143 -0
- package/dist/services/api.js.map +1 -0
- package/dist/services/auth.d.ts +30 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +180 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/executor.d.ts +36 -0
- package/dist/services/executor.d.ts.map +1 -0
- package/dist/services/executor.js +206 -0
- package/dist/services/executor.js.map +1 -0
- package/dist/types/index.d.ts +85 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.d.ts +60 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +149 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/theme.d.ts +78 -0
- package/dist/utils/theme.d.ts.map +1 -0
- package/dist/utils/theme.js +140 -0
- package/dist/utils/theme.js.map +1 -0
- package/package.json +57 -0
- package/src/index.ts +427 -0
- package/src/services/api.ts +198 -0
- package/src/services/auth.ts +222 -0
- package/src/services/executor.ts +250 -0
- package/src/types/index.ts +104 -0
- package/src/utils/config.ts +172 -0
- package/src/utils/theme.ts +163 -0
- package/tsconfig.json +23 -0
package/bin/nexusforge
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* NexusForge CLI
|
|
4
|
+
*
|
|
5
|
+
* AI-powered development companion for your terminal.
|
|
6
|
+
* Like Claude Code, but for NexusForge.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* nexusforge - Start interactive chat
|
|
10
|
+
* nexusforge login - Authenticate with browser
|
|
11
|
+
* nexusforge logout - Clear credentials
|
|
12
|
+
* nexusforge status - Check connection status
|
|
13
|
+
* nexusforge --session X - Sync with web session
|
|
14
|
+
* nexusforge --help - Show help
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* NexusForge CLI
|
|
4
|
+
*
|
|
5
|
+
* AI-powered development companion for your terminal.
|
|
6
|
+
* Like Claude Code, but for NexusForge.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* nexusforge - Start interactive chat
|
|
10
|
+
* nexusforge login - Authenticate with browser
|
|
11
|
+
* nexusforge logout - Clear credentials
|
|
12
|
+
* nexusforge status - Check connection status
|
|
13
|
+
* nexusforge --session X - Sync with web session
|
|
14
|
+
* nexusforge --help - Show help
|
|
15
|
+
*/
|
|
16
|
+
import { Command } from 'commander';
|
|
17
|
+
import * as readline from 'readline';
|
|
18
|
+
import * as config from './utils/config.js';
|
|
19
|
+
import { displayWelcome, displayUserMessage, displayAssistantMessage, displaySystemMessage, style } from './utils/theme.js';
|
|
20
|
+
import { startDeviceAuth, logout, checkAuth, getCurrentUser } from './services/auth.js';
|
|
21
|
+
import * as api from './services/api.js';
|
|
22
|
+
import * as executor from './services/executor.js';
|
|
23
|
+
const VERSION = '1.0.0';
|
|
24
|
+
// Current conversation state
|
|
25
|
+
let conversationId;
|
|
26
|
+
let messages = [];
|
|
27
|
+
// Create CLI program
|
|
28
|
+
const program = new Command();
|
|
29
|
+
program
|
|
30
|
+
.name('nexusforge')
|
|
31
|
+
.description('NexusForge CLI - AI-powered development companion')
|
|
32
|
+
.version(VERSION);
|
|
33
|
+
// Login command
|
|
34
|
+
program
|
|
35
|
+
.command('login')
|
|
36
|
+
.description('Authenticate with NexusForge via browser')
|
|
37
|
+
.action(async () => {
|
|
38
|
+
const success = await startDeviceAuth();
|
|
39
|
+
process.exit(success ? 0 : 1);
|
|
40
|
+
});
|
|
41
|
+
// Logout command
|
|
42
|
+
program
|
|
43
|
+
.command('logout')
|
|
44
|
+
.description('Clear saved credentials')
|
|
45
|
+
.action(() => {
|
|
46
|
+
logout();
|
|
47
|
+
process.exit(0);
|
|
48
|
+
});
|
|
49
|
+
// Status command
|
|
50
|
+
program
|
|
51
|
+
.command('status')
|
|
52
|
+
.description('Check connection and authentication status')
|
|
53
|
+
.action(async () => {
|
|
54
|
+
console.log('');
|
|
55
|
+
console.log(style.assistant('NexusForge CLI Status'));
|
|
56
|
+
console.log(style.divider());
|
|
57
|
+
console.log('');
|
|
58
|
+
// Check auth
|
|
59
|
+
const isAuth = await checkAuth();
|
|
60
|
+
const user = getCurrentUser();
|
|
61
|
+
if (isAuth && user) {
|
|
62
|
+
displaySystemMessage(`Authenticated as: ${user.username}`, 'success');
|
|
63
|
+
}
|
|
64
|
+
else if (config.isAuthenticated()) {
|
|
65
|
+
displaySystemMessage('Token may be expired. Run "nexusforge login" to re-authenticate.', 'warning');
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
displaySystemMessage('Not authenticated. Run "nexusforge login" to authenticate.', 'warning');
|
|
69
|
+
}
|
|
70
|
+
// Check API health
|
|
71
|
+
const isHealthy = await api.checkHealth();
|
|
72
|
+
if (isHealthy) {
|
|
73
|
+
displaySystemMessage(`API: ${config.getApiUrl()} (healthy)`, 'success');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
displaySystemMessage(`API: ${config.getApiUrl()} (unreachable)`, 'error');
|
|
77
|
+
}
|
|
78
|
+
console.log('');
|
|
79
|
+
console.log(style.muted(`Config file: ${config.getConfigPath()}`));
|
|
80
|
+
console.log('');
|
|
81
|
+
process.exit(0);
|
|
82
|
+
});
|
|
83
|
+
// Main command (interactive chat)
|
|
84
|
+
program
|
|
85
|
+
.option('-s, --session <token>', 'Sync with a web session token')
|
|
86
|
+
.option('-m, --model <name>', 'Use a specific model')
|
|
87
|
+
.option('--cwd <path>', 'Set working directory')
|
|
88
|
+
.action(async (options) => {
|
|
89
|
+
// Change working directory if specified
|
|
90
|
+
if (options.cwd) {
|
|
91
|
+
if (!executor.changeCwd(options.cwd)) {
|
|
92
|
+
displaySystemMessage(`Cannot change to directory: ${options.cwd}`, 'error');
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Check authentication
|
|
97
|
+
if (!config.isAuthenticated()) {
|
|
98
|
+
displaySystemMessage('Not authenticated. Starting login...', 'info');
|
|
99
|
+
const success = await startDeviceAuth();
|
|
100
|
+
if (!success) {
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Sync with web session if provided
|
|
105
|
+
if (options.session) {
|
|
106
|
+
try {
|
|
107
|
+
displaySystemMessage('Syncing with web session...', 'info');
|
|
108
|
+
const session = await api.getSessionStatus(options.session);
|
|
109
|
+
conversationId = session.conversation_id;
|
|
110
|
+
displaySystemMessage(`Synced with conversation: ${conversationId}`, 'success');
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
displaySystemMessage('Failed to sync with session. Starting fresh.', 'warning');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Display welcome screen
|
|
117
|
+
const user = getCurrentUser();
|
|
118
|
+
displayWelcome(VERSION, config.getApiUrl(), options.model || config.get('defaultModel') || 'NexusForge');
|
|
119
|
+
if (user?.username) {
|
|
120
|
+
displaySystemMessage(`Logged in as ${user.username}`, 'success');
|
|
121
|
+
}
|
|
122
|
+
// Start interactive loop
|
|
123
|
+
await startInteractiveChat(options.model);
|
|
124
|
+
});
|
|
125
|
+
// Parse arguments
|
|
126
|
+
program.parse();
|
|
127
|
+
/**
|
|
128
|
+
* Start the interactive chat loop
|
|
129
|
+
*/
|
|
130
|
+
async function startInteractiveChat(model) {
|
|
131
|
+
const rl = readline.createInterface({
|
|
132
|
+
input: process.stdin,
|
|
133
|
+
output: process.stdout,
|
|
134
|
+
});
|
|
135
|
+
const promptUser = () => {
|
|
136
|
+
rl.question(`${style.userLabel('You')} ${style.prompt('❯')} `, async (input) => {
|
|
137
|
+
const trimmedInput = input.trim();
|
|
138
|
+
if (!trimmedInput) {
|
|
139
|
+
promptUser();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Handle slash commands
|
|
143
|
+
if (trimmedInput.startsWith('/')) {
|
|
144
|
+
await handleSlashCommand(trimmedInput, rl);
|
|
145
|
+
promptUser();
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Send message to AI
|
|
149
|
+
try {
|
|
150
|
+
console.log('');
|
|
151
|
+
process.stdout.write(`${style.assistantLabel('NexusForge')} ${style.prompt('❯')} `);
|
|
152
|
+
// Stream response
|
|
153
|
+
let fullResponse = '';
|
|
154
|
+
for await (const chunk of api.streamMessage(trimmedInput, conversationId, model)) {
|
|
155
|
+
process.stdout.write(style.assistant(chunk));
|
|
156
|
+
fullResponse += chunk;
|
|
157
|
+
}
|
|
158
|
+
console.log('\n');
|
|
159
|
+
// Store messages
|
|
160
|
+
messages.push({ role: 'user', content: trimmedInput });
|
|
161
|
+
messages.push({ role: 'assistant', content: fullResponse });
|
|
162
|
+
// Check for executable commands in response
|
|
163
|
+
const commands = executor.parseCommandsFromResponse(fullResponse);
|
|
164
|
+
if (commands.length > 0 && config.get('autoExecute')) {
|
|
165
|
+
await promptToExecuteCommands(commands, rl);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
170
|
+
displaySystemMessage(`Error: ${errorMessage}`, 'error');
|
|
171
|
+
}
|
|
172
|
+
promptUser();
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
promptUser();
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Handle slash commands
|
|
179
|
+
*/
|
|
180
|
+
async function handleSlashCommand(input, rl) {
|
|
181
|
+
const parts = input.slice(1).split(/\s+/);
|
|
182
|
+
const command = parts[0].toLowerCase();
|
|
183
|
+
const args = parts.slice(1);
|
|
184
|
+
switch (command) {
|
|
185
|
+
case 'help':
|
|
186
|
+
case 'h':
|
|
187
|
+
displayHelp();
|
|
188
|
+
break;
|
|
189
|
+
case 'exit':
|
|
190
|
+
case 'quit':
|
|
191
|
+
case 'q':
|
|
192
|
+
console.log('');
|
|
193
|
+
displaySystemMessage('Goodbye!', 'info');
|
|
194
|
+
rl.close();
|
|
195
|
+
process.exit(0);
|
|
196
|
+
case 'clear':
|
|
197
|
+
case 'c':
|
|
198
|
+
console.clear();
|
|
199
|
+
displayWelcome(VERSION, config.getApiUrl(), config.get('defaultModel') || 'NexusForge');
|
|
200
|
+
break;
|
|
201
|
+
case 'history':
|
|
202
|
+
displayHistory();
|
|
203
|
+
break;
|
|
204
|
+
case 'resume':
|
|
205
|
+
await resumeConversation(args[0]);
|
|
206
|
+
break;
|
|
207
|
+
case 'model':
|
|
208
|
+
if (args[0]) {
|
|
209
|
+
config.set('defaultModel', args[0]);
|
|
210
|
+
displaySystemMessage(`Model set to: ${args[0]}`, 'success');
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
displaySystemMessage(`Current model: ${config.get('defaultModel')}`, 'info');
|
|
214
|
+
}
|
|
215
|
+
break;
|
|
216
|
+
case 'status':
|
|
217
|
+
await displayStatus();
|
|
218
|
+
break;
|
|
219
|
+
case 'read':
|
|
220
|
+
if (args[0]) {
|
|
221
|
+
await readFile(args[0]);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
displaySystemMessage('Usage: /read <file_path>', 'warning');
|
|
225
|
+
}
|
|
226
|
+
break;
|
|
227
|
+
case 'exec':
|
|
228
|
+
case 'run':
|
|
229
|
+
if (args.length > 0) {
|
|
230
|
+
const cmd = args.join(' ');
|
|
231
|
+
const result = await executor.executeCommandStream(cmd, undefined, (data) => process.stdout.write(data), (data) => process.stderr.write(style.error(data)));
|
|
232
|
+
executor.displayCommandResult(result);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
displaySystemMessage('Usage: /exec <command>', 'warning');
|
|
236
|
+
}
|
|
237
|
+
break;
|
|
238
|
+
default:
|
|
239
|
+
displaySystemMessage(`Unknown command: /${command}. Type /help for available commands.`, 'warning');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Display help
|
|
244
|
+
*/
|
|
245
|
+
function displayHelp() {
|
|
246
|
+
console.log('');
|
|
247
|
+
console.log(style.assistant('Available Commands:'));
|
|
248
|
+
console.log(style.divider());
|
|
249
|
+
console.log('');
|
|
250
|
+
console.log(` ${style.prompt('/help, /h')} - Show this help`);
|
|
251
|
+
console.log(` ${style.prompt('/exit, /q')} - Exit CLI`);
|
|
252
|
+
console.log(` ${style.prompt('/clear, /c')} - Clear screen`);
|
|
253
|
+
console.log(` ${style.prompt('/history')} - Show conversation history`);
|
|
254
|
+
console.log(` ${style.prompt('/resume [id]')} - Resume a previous conversation`);
|
|
255
|
+
console.log(` ${style.prompt('/model [name]')} - Get or set the model`);
|
|
256
|
+
console.log(` ${style.prompt('/status')} - Show connection status`);
|
|
257
|
+
console.log(` ${style.prompt('/read <path>')} - Read a file into context`);
|
|
258
|
+
console.log(` ${style.prompt('/exec <cmd>')} - Execute a shell command`);
|
|
259
|
+
console.log('');
|
|
260
|
+
console.log(style.muted('Just type your message to chat with NexusForge!'));
|
|
261
|
+
console.log('');
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Display conversation history
|
|
265
|
+
*/
|
|
266
|
+
function displayHistory() {
|
|
267
|
+
console.log('');
|
|
268
|
+
if (messages.length === 0) {
|
|
269
|
+
displaySystemMessage('No messages in current conversation.', 'info');
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
console.log(style.assistant('Conversation History:'));
|
|
273
|
+
console.log(style.divider());
|
|
274
|
+
console.log('');
|
|
275
|
+
for (const msg of messages) {
|
|
276
|
+
if (msg.role === 'user') {
|
|
277
|
+
displayUserMessage(msg.content);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
displayAssistantMessage(msg.content.substring(0, 200) + (msg.content.length > 200 ? '...' : ''));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Resume a previous conversation
|
|
286
|
+
*/
|
|
287
|
+
async function resumeConversation(id) {
|
|
288
|
+
displaySystemMessage('Resume functionality coming soon!', 'info');
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Display current status
|
|
292
|
+
*/
|
|
293
|
+
async function displayStatus() {
|
|
294
|
+
console.log('');
|
|
295
|
+
const user = getCurrentUser();
|
|
296
|
+
displaySystemMessage(`User: ${user?.username || 'Unknown'}`, 'info');
|
|
297
|
+
displaySystemMessage(`API: ${config.getApiUrl()}`, 'info');
|
|
298
|
+
displaySystemMessage(`Model: ${config.get('defaultModel')}`, 'info');
|
|
299
|
+
displaySystemMessage(`Conversation: ${conversationId || 'New'}`, 'info');
|
|
300
|
+
displaySystemMessage(`Messages: ${messages.length}`, 'info');
|
|
301
|
+
displaySystemMessage(`CWD: ${executor.getCwd()}`, 'info');
|
|
302
|
+
console.log('');
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Read a file and display it
|
|
306
|
+
*/
|
|
307
|
+
async function readFile(path) {
|
|
308
|
+
const fs = await import('fs/promises');
|
|
309
|
+
try {
|
|
310
|
+
const content = await fs.readFile(path, 'utf-8');
|
|
311
|
+
console.log('');
|
|
312
|
+
console.log(style.muted(`--- ${path} ---`));
|
|
313
|
+
console.log(style.code(content));
|
|
314
|
+
console.log(style.muted(`--- end ${path} ---`));
|
|
315
|
+
console.log('');
|
|
316
|
+
displaySystemMessage(`File "${path}" added to context.`, 'success');
|
|
317
|
+
}
|
|
318
|
+
catch (error) {
|
|
319
|
+
displaySystemMessage(`Cannot read file: ${path}`, 'error');
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Prompt user to execute detected commands
|
|
324
|
+
*/
|
|
325
|
+
async function promptToExecuteCommands(commands, rl) {
|
|
326
|
+
console.log('');
|
|
327
|
+
displaySystemMessage(`Found ${commands.length} command(s) in response:`, 'info');
|
|
328
|
+
for (let i = 0; i < commands.length; i++) {
|
|
329
|
+
console.log(style.muted(` ${i + 1}. ${commands[i]}`));
|
|
330
|
+
}
|
|
331
|
+
console.log('');
|
|
332
|
+
return new Promise((resolve) => {
|
|
333
|
+
rl.question(`${style.prompt('Execute these commands? [y/N/1-n]: ')}`, async (answer) => {
|
|
334
|
+
const trimmed = answer.trim().toLowerCase();
|
|
335
|
+
if (trimmed === 'y' || trimmed === 'yes') {
|
|
336
|
+
// Execute all commands
|
|
337
|
+
for (const cmd of commands) {
|
|
338
|
+
if (executor.isDangerous(cmd)) {
|
|
339
|
+
displaySystemMessage(`Skipping dangerous command: ${cmd}`, 'warning');
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
const result = await executor.executeCommandStream(cmd, undefined, (data) => process.stdout.write(data), (data) => process.stderr.write(style.error(data)));
|
|
343
|
+
if (result.exitCode !== 0) {
|
|
344
|
+
displaySystemMessage(`Command failed with exit code ${result.exitCode}`, 'error');
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
else if (/^\d+$/.test(trimmed)) {
|
|
350
|
+
// Execute specific command
|
|
351
|
+
const index = parseInt(trimmed, 10) - 1;
|
|
352
|
+
if (index >= 0 && index < commands.length) {
|
|
353
|
+
const cmd = commands[index];
|
|
354
|
+
if (executor.isDangerous(cmd)) {
|
|
355
|
+
displaySystemMessage(`Cannot execute dangerous command`, 'error');
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
const result = await executor.executeCommandStream(cmd, undefined, (data) => process.stdout.write(data), (data) => process.stderr.write(style.error(data)));
|
|
359
|
+
executor.displayCommandResult(result);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
resolve();
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NexusForge CLI API Service
|
|
3
|
+
*
|
|
4
|
+
* Handles all API communication with NexusConnectBridge backend.
|
|
5
|
+
*/
|
|
6
|
+
import type { ChatMessage, ChatResponse, CLISession, FileContext } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Send a chat message and get response
|
|
9
|
+
*/
|
|
10
|
+
export declare function sendMessage(message: string, conversationId?: string, model?: string, fileContext?: FileContext[]): Promise<ChatResponse>;
|
|
11
|
+
/**
|
|
12
|
+
* Stream a chat message response
|
|
13
|
+
*/
|
|
14
|
+
export declare function streamMessage(message: string, conversationId?: string, model?: string, fileContext?: FileContext[]): AsyncGenerator<string, void, unknown>;
|
|
15
|
+
/**
|
|
16
|
+
* Create a new CLI session
|
|
17
|
+
*/
|
|
18
|
+
export declare function createSession(conversationId?: string, workingDirectory?: string): Promise<CLISession>;
|
|
19
|
+
/**
|
|
20
|
+
* Get session status
|
|
21
|
+
*/
|
|
22
|
+
export declare function getSessionStatus(sessionToken: string): Promise<CLISession>;
|
|
23
|
+
/**
|
|
24
|
+
* Log a command execution
|
|
25
|
+
*/
|
|
26
|
+
export declare function logCommandExecution(data: {
|
|
27
|
+
command: string;
|
|
28
|
+
workingDirectory: string;
|
|
29
|
+
exitCode?: number;
|
|
30
|
+
output?: string;
|
|
31
|
+
duration?: number;
|
|
32
|
+
}): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Sync conversation from web
|
|
35
|
+
*/
|
|
36
|
+
export declare function syncConversation(conversationId: string, sinceMessageId?: string): Promise<{
|
|
37
|
+
conversation_id: string;
|
|
38
|
+
title?: string;
|
|
39
|
+
model: string;
|
|
40
|
+
messages: ChatMessage[];
|
|
41
|
+
has_more: boolean;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Get available models
|
|
45
|
+
*/
|
|
46
|
+
export declare function getModels(): Promise<string[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Check API health
|
|
49
|
+
*/
|
|
50
|
+
export declare function checkHealth(): Promise<boolean>;
|
|
51
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAkC3B;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,EACvB,KAAK,CAAC,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,EAAE,GAC1B,OAAO,CAAC,YAAY,CAAC,CAUvB;AAED;;GAEG;AACH,wBAAuB,aAAa,CAClC,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,EACvB,KAAK,CAAC,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,EAAE,GAC1B,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAmCvC;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,cAAc,CAAC,EAAE,MAAM,EACvB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAEhF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;IACT,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC,CAQD;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAQpD"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NexusForge CLI API Service
|
|
3
|
+
*
|
|
4
|
+
* Handles all API communication with NexusConnectBridge backend.
|
|
5
|
+
*/
|
|
6
|
+
import * as config from '../utils/config.js';
|
|
7
|
+
/**
|
|
8
|
+
* Make an authenticated API request
|
|
9
|
+
*/
|
|
10
|
+
async function apiRequest(endpoint, options = {}) {
|
|
11
|
+
const apiUrl = config.getApiUrl();
|
|
12
|
+
const token = config.getAccessToken();
|
|
13
|
+
const headers = {
|
|
14
|
+
'Content-Type': 'application/json',
|
|
15
|
+
...(options.headers || {}),
|
|
16
|
+
};
|
|
17
|
+
if (token) {
|
|
18
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
19
|
+
}
|
|
20
|
+
const response = await fetch(`${apiUrl}${endpoint}`, {
|
|
21
|
+
...options,
|
|
22
|
+
headers,
|
|
23
|
+
});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
const errorText = await response.text();
|
|
26
|
+
throw new Error(`API error (${response.status}): ${errorText}`);
|
|
27
|
+
}
|
|
28
|
+
return response.json();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Send a chat message and get response
|
|
32
|
+
*/
|
|
33
|
+
export async function sendMessage(message, conversationId, model, fileContext) {
|
|
34
|
+
return apiRequest('/cli/chat', {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
body: JSON.stringify({
|
|
37
|
+
message,
|
|
38
|
+
conversation_id: conversationId,
|
|
39
|
+
model,
|
|
40
|
+
file_context: fileContext,
|
|
41
|
+
}),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Stream a chat message response
|
|
46
|
+
*/
|
|
47
|
+
export async function* streamMessage(message, conversationId, model, fileContext) {
|
|
48
|
+
const apiUrl = config.getApiUrl();
|
|
49
|
+
const token = config.getAccessToken();
|
|
50
|
+
const response = await fetch(`${apiUrl}/ai/chat/stream`, {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: {
|
|
53
|
+
'Content-Type': 'application/json',
|
|
54
|
+
Authorization: token ? `Bearer ${token}` : '',
|
|
55
|
+
},
|
|
56
|
+
body: JSON.stringify({
|
|
57
|
+
message,
|
|
58
|
+
conversation_id: conversationId,
|
|
59
|
+
model,
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
throw new Error(`API error: ${response.statusText}`);
|
|
64
|
+
}
|
|
65
|
+
const reader = response.body?.getReader();
|
|
66
|
+
if (!reader) {
|
|
67
|
+
throw new Error('No response body');
|
|
68
|
+
}
|
|
69
|
+
const decoder = new TextDecoder();
|
|
70
|
+
while (true) {
|
|
71
|
+
const { done, value } = await reader.read();
|
|
72
|
+
if (done)
|
|
73
|
+
break;
|
|
74
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
75
|
+
yield chunk;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a new CLI session
|
|
80
|
+
*/
|
|
81
|
+
export async function createSession(conversationId, workingDirectory) {
|
|
82
|
+
return apiRequest('/cli/sessions', {
|
|
83
|
+
method: 'POST',
|
|
84
|
+
body: JSON.stringify({
|
|
85
|
+
conversation_id: conversationId,
|
|
86
|
+
working_directory: workingDirectory,
|
|
87
|
+
}),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get session status
|
|
92
|
+
*/
|
|
93
|
+
export async function getSessionStatus(sessionToken) {
|
|
94
|
+
return apiRequest(`/cli/sessions/${sessionToken}`);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Log a command execution
|
|
98
|
+
*/
|
|
99
|
+
export async function logCommandExecution(data) {
|
|
100
|
+
await apiRequest('/cli/execute', {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
body: JSON.stringify({
|
|
103
|
+
command: data.command,
|
|
104
|
+
working_directory: data.workingDirectory,
|
|
105
|
+
exit_code: data.exitCode,
|
|
106
|
+
output: data.output,
|
|
107
|
+
duration_ms: data.duration,
|
|
108
|
+
}),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Sync conversation from web
|
|
113
|
+
*/
|
|
114
|
+
export async function syncConversation(conversationId, sinceMessageId) {
|
|
115
|
+
return apiRequest('/cli/sync', {
|
|
116
|
+
method: 'POST',
|
|
117
|
+
body: JSON.stringify({
|
|
118
|
+
conversation_id: conversationId,
|
|
119
|
+
since_message_id: sinceMessageId,
|
|
120
|
+
}),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get available models
|
|
125
|
+
*/
|
|
126
|
+
export async function getModels() {
|
|
127
|
+
const response = await apiRequest('/ai/models');
|
|
128
|
+
return response.models.map((m) => m.name);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check API health
|
|
132
|
+
*/
|
|
133
|
+
export async function checkHealth() {
|
|
134
|
+
try {
|
|
135
|
+
const apiUrl = config.getApiUrl();
|
|
136
|
+
const response = await fetch(`${apiUrl.replace('/api/v1/bridge', '')}/health`);
|
|
137
|
+
return response.ok;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NexusForge CLI Authentication Service
|
|
3
|
+
*
|
|
4
|
+
* Handles device authorization flow (like Claude Code):
|
|
5
|
+
* 1. CLI requests device code
|
|
6
|
+
* 2. CLI displays verification URL
|
|
7
|
+
* 3. User opens URL in browser and authorizes
|
|
8
|
+
* 4. CLI polls for authorization
|
|
9
|
+
* 5. CLI saves token on success
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Start the device authorization flow
|
|
13
|
+
*/
|
|
14
|
+
export declare function startDeviceAuth(): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Check if current token is valid
|
|
17
|
+
*/
|
|
18
|
+
export declare function checkAuth(): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Logout - clear stored credentials
|
|
21
|
+
*/
|
|
22
|
+
export declare function logout(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Get current user info
|
|
25
|
+
*/
|
|
26
|
+
export declare function getCurrentUser(): {
|
|
27
|
+
username?: string;
|
|
28
|
+
email?: string;
|
|
29
|
+
} | null;
|
|
30
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAyExD;AAwED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAqBlD;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,IAAI,CAG7B;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS7E"}
|