@mmmbuto/nexuscli 0.7.7 → 0.7.8

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 (32) hide show
  1. package/README.md +20 -32
  2. package/bin/nexuscli.js +6 -6
  3. package/frontend/dist/assets/{index-CHOlrfA0.css → index-WfmfixF4.css} +1 -1
  4. package/frontend/dist/index.html +2 -2
  5. package/lib/server/.env.example +1 -1
  6. package/lib/server/lib/pty-adapter.js +1 -15
  7. package/lib/server/routes/codex.js +9 -2
  8. package/lib/server/routes/gemini.js +9 -3
  9. package/lib/server/routes/sessions.js +15 -0
  10. package/lib/server/server.js +9 -0
  11. package/lib/server/services/claude-wrapper.js +1 -11
  12. package/lib/server/services/codex-output-parser.js +0 -8
  13. package/lib/server/services/codex-wrapper.js +3 -3
  14. package/lib/server/services/context-bridge.js +143 -24
  15. package/lib/server/services/gemini-wrapper.js +4 -3
  16. package/lib/server/services/session-importer.js +155 -0
  17. package/lib/server/services/workspace-manager.js +2 -7
  18. package/lib/server/tests/performance.test.js +1 -1
  19. package/lib/server/tests/services.test.js +2 -2
  20. package/package.json +1 -1
  21. package/lib/server/db.js.old +0 -225
  22. package/lib/server/docs/API_WRAPPER_CONTRACT.md +0 -682
  23. package/lib/server/docs/ARCHITECTURE.md +0 -441
  24. package/lib/server/docs/DATABASE_SCHEMA.md +0 -783
  25. package/lib/server/docs/DESIGN_PRINCIPLES.md +0 -598
  26. package/lib/server/docs/NEXUSCHAT_ANALYSIS.md +0 -488
  27. package/lib/server/docs/PIPELINE_INTEGRATION.md +0 -636
  28. package/lib/server/docs/README.md +0 -272
  29. package/lib/server/docs/UI_DESIGN.md +0 -916
  30. package/lib/server/services/base-cli-wrapper.js +0 -137
  31. package/lib/server/services/cli-loader.js.backup +0 -446
  32. /package/frontend/dist/assets/{index-BAY_sRAu.js → index-BbBoc8w4.js} +0 -0
@@ -1,225 +0,0 @@
1
- const initSqlJs = require('sql.js');
2
- const path = require('path');
3
- const fs = require('fs');
4
-
5
- // Detect environment (Linux vs Termux)
6
- const isTermux = process.env.PREFIX?.includes('com.termux');
7
-
8
- // Database directory
9
- const dbDir = isTermux
10
- ? path.join(process.env.HOME, '.nexuscli')
11
- : process.env.NEXUSCLI_DB_DIR || '/var/lib/nexuscli';
12
-
13
- // Database file path
14
- const dbPath = path.join(dbDir, 'nexuscli.db');
15
-
16
- // Ensure directory exists
17
- if (!fs.existsSync(dbDir)) {
18
- fs.mkdirSync(dbDir, { recursive: true });
19
- console.log(`✅ Created database directory: ${dbDir}`);
20
- }
21
-
22
- let db = null;
23
-
24
- // Initialize database
25
- async function initDb() {
26
- const SQL = await initSqlJs();
27
-
28
- // Load existing database or create new
29
- if (fs.existsSync(dbPath)) {
30
- const buffer = fs.readFileSync(dbPath);
31
- db = new SQL.Database(buffer);
32
- console.log(`✅ Database loaded: ${dbPath}`);
33
- } else {
34
- db = new SQL.Database();
35
- console.log(`✅ Database created: ${dbPath}`);
36
- }
37
-
38
- // Initialize schema
39
- initSchema();
40
-
41
- // Auto-save every 5 seconds
42
- setInterval(saveDb, 5000);
43
-
44
- return db;
45
- }
46
-
47
- // Save database to file
48
- function saveDb() {
49
- if (!db) return;
50
- const data = db.export();
51
- const buffer = Buffer.from(data);
52
- fs.writeFileSync(dbPath, buffer);
53
- }
54
-
55
- // Initialize schema
56
- function initSchema() {
57
- db.run(`
58
- -- Conversations table
59
- CREATE TABLE IF NOT EXISTS conversations (
60
- id TEXT PRIMARY KEY,
61
- title TEXT NOT NULL,
62
- created_at INTEGER NOT NULL,
63
- updated_at INTEGER NOT NULL,
64
- metadata TEXT
65
- );
66
-
67
- CREATE INDEX IF NOT EXISTS idx_conversations_updated_at
68
- ON conversations(updated_at DESC);
69
-
70
- -- Messages table
71
- CREATE TABLE IF NOT EXISTS messages (
72
- id TEXT PRIMARY KEY,
73
- conversation_id TEXT NOT NULL,
74
- role TEXT NOT NULL CHECK(role IN ('user', 'assistant', 'system')),
75
- content TEXT NOT NULL,
76
- created_at INTEGER NOT NULL,
77
- metadata TEXT,
78
- FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE
79
- );
80
-
81
- CREATE INDEX IF NOT EXISTS idx_messages_conversation_id
82
- ON messages(conversation_id);
83
-
84
- CREATE INDEX IF NOT EXISTS idx_messages_created_at
85
- ON messages(created_at ASC);
86
-
87
- -- Jobs table
88
- CREATE TABLE IF NOT EXISTS jobs (
89
- id TEXT PRIMARY KEY,
90
- conversation_id TEXT,
91
- message_id TEXT,
92
- node_id TEXT NOT NULL,
93
- tool TEXT NOT NULL,
94
- command TEXT NOT NULL,
95
- status TEXT NOT NULL CHECK(status IN ('queued', 'executing', 'completed', 'failed', 'cancelled')),
96
- exit_code INTEGER,
97
- stdout TEXT,
98
- stderr TEXT,
99
- duration INTEGER,
100
- created_at INTEGER NOT NULL,
101
- started_at INTEGER,
102
- completed_at INTEGER,
103
- FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE SET NULL,
104
- FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE SET NULL
105
- );
106
-
107
- CREATE INDEX IF NOT EXISTS idx_jobs_conversation_id
108
- ON jobs(conversation_id);
109
-
110
- CREATE INDEX IF NOT EXISTS idx_jobs_status
111
- ON jobs(status);
112
-
113
- CREATE INDEX IF NOT EXISTS idx_jobs_created_at
114
- ON jobs(created_at DESC);
115
-
116
- -- Users table
117
- CREATE TABLE IF NOT EXISTS users (
118
- id TEXT PRIMARY KEY,
119
- username TEXT UNIQUE NOT NULL,
120
- password_hash TEXT NOT NULL,
121
- role TEXT NOT NULL DEFAULT 'user' CHECK(role IN ('admin', 'user')),
122
- is_locked INTEGER NOT NULL DEFAULT 0,
123
- failed_attempts INTEGER NOT NULL DEFAULT 0,
124
- last_failed_attempt INTEGER,
125
- locked_until INTEGER,
126
- created_at INTEGER NOT NULL,
127
- last_login INTEGER
128
- );
129
-
130
- CREATE INDEX IF NOT EXISTS idx_users_username
131
- ON users(username);
132
-
133
- -- Login attempts table (for rate limiting)
134
- CREATE TABLE IF NOT EXISTS login_attempts (
135
- id INTEGER PRIMARY KEY AUTOINCREMENT,
136
- ip_address TEXT NOT NULL,
137
- username TEXT,
138
- success INTEGER NOT NULL DEFAULT 0,
139
- timestamp INTEGER NOT NULL
140
- );
141
-
142
- CREATE INDEX IF NOT EXISTS idx_login_attempts_ip
143
- ON login_attempts(ip_address, timestamp DESC);
144
-
145
- CREATE INDEX IF NOT EXISTS idx_login_attempts_timestamp
146
- ON login_attempts(timestamp DESC);
147
-
148
- -- Nodes table (optional - for multi-node setups)
149
- CREATE TABLE IF NOT EXISTS nodes (
150
- id TEXT PRIMARY KEY,
151
- hostname TEXT NOT NULL,
152
- ip_address TEXT,
153
- status TEXT NOT NULL CHECK(status IN ('online', 'offline', 'error')),
154
- capabilities TEXT,
155
- last_heartbeat INTEGER,
156
- created_at INTEGER NOT NULL
157
- );
158
-
159
- CREATE INDEX IF NOT EXISTS idx_nodes_status
160
- ON nodes(status);
161
- `);
162
-
163
- console.log('✅ Database schema initialized');
164
- }
165
-
166
- // Prepare statement (sql.js uses db.prepare)
167
- function prepare(sql) {
168
- const stmt = db.prepare(sql);
169
- return {
170
- run: (...params) => {
171
- stmt.bind(params);
172
- stmt.step();
173
- stmt.reset();
174
- saveDb(); // Auto-save on write
175
- },
176
- get: (...params) => {
177
- stmt.bind(params);
178
- const result = stmt.step() ? stmt.getAsObject() : null;
179
- stmt.reset();
180
- return result;
181
- },
182
- all: (...params) => {
183
- stmt.bind(params);
184
- const results = [];
185
- while (stmt.step()) {
186
- results.push(stmt.getAsObject());
187
- }
188
- stmt.reset();
189
- return results;
190
- }
191
- };
192
- }
193
-
194
- // Graceful shutdown
195
- process.on('exit', () => {
196
- if (db) {
197
- saveDb();
198
- db.close();
199
- console.log('✅ Database connection closed');
200
- }
201
- });
202
-
203
- process.on('SIGINT', () => {
204
- if (db) {
205
- saveDb();
206
- db.close();
207
- console.log('✅ Database connection closed (SIGINT)');
208
- }
209
- process.exit(0);
210
- });
211
-
212
- process.on('SIGTERM', () => {
213
- if (db) {
214
- saveDb();
215
- db.close();
216
- }
217
- });
218
-
219
- // Export db object (initialized async)
220
- module.exports = {
221
- initDb,
222
- getDb: () => db,
223
- prepare,
224
- saveDb
225
- };