nyxora 1.6.3 → 1.6.4

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/CHANGELOG.md CHANGED
@@ -5,6 +5,29 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.6.4]
9
+
10
+ ### Added
11
+ - **Node.js Native Database Engine**: Migrated the core `logger.ts` memory subsystem to use the built-in `node:sqlite` engine (Node 22+), maintaining ultra-fast 100% synchronous operations while dramatically reducing dependency bloat.
12
+ - **Next-Gen OS Keyring (N-API)**: Migrated `keytar` to `@napi-rs/keyring`. This replaces legacy C++ bindings with modern Rust/NAPI-RS, retaining identical OS-level security (Mac Keychain, Windows Credential Manager) while eliminating the `prebuild-install` deprecation warning and streamlining global installation.
13
+
14
+ ### Removed
15
+ - `better-sqlite3` and `keytar` dependencies entirely removed from the monorepo architecture.
16
+
17
+ ## [1.6.3]
18
+
19
+ ### Added
20
+ - Implemented **Zero-Click Multi-Session** for instantaneous chat creation and switching.
21
+ - Introduced **Smart Auto-Naming** for automatic contextual session titles.
22
+
23
+ ### Changed
24
+ - **Redesigned Sidebar Architecture**: enhanced utility-centric design, significantly reducing gaps for a compact, elegant look.
25
+ - Integrated **OS-Native Keyring**, replacing legacy AES-256-GCM and Master Password mechanics.
26
+ - Updated and cleaned up legacy cryptography references in VitePress guides and README.
27
+
28
+ ### Fixed
29
+ - Resolved deeply-nested monorepo CI/CD deployment failures by isolating `package-lock.json` and mitigating peer-dependency conflicts.
30
+
8
31
  ## [1.4.5]
9
32
 
10
33
  ### Fixed
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "nyxora",
3
- "version": "1.6.3",
3
+ "version": "1.6.4",
4
4
  "license": "MIT",
5
5
  "workspaces": [
6
6
  "packages/*"
7
7
  ],
8
8
  "bin": {
9
- "nyxora": "./bin/nyxora.mjs"
9
+ "nyxora": "bin/nyxora.mjs"
10
10
  },
11
11
  "scripts": {
12
12
  "start": "node ./bin/nyxora.mjs start",
@@ -19,7 +19,6 @@
19
19
  },
20
20
  "dependencies": {
21
21
  "@clack/prompts": "^1.4.0",
22
- "better-sqlite3": "^12.10.0",
23
22
  "concurrently": "^9.2.1",
24
23
  "cors": "^2.8.6",
25
24
  "dotenv": "^17.4.2",
@@ -27,7 +26,7 @@
27
26
  "express-rate-limit": "^7.5.0",
28
27
  "helmet": "^8.0.0",
29
28
  "jsonwebtoken": "^9.0.2",
30
- "keytar": "^7.9.0",
29
+ "@napi-rs/keyring": "^1.3.0",
31
30
  "open": "^11.0.0",
32
31
  "openai": "^6.39.0",
33
32
  "picocolors": "^1.1.1",
@@ -1,11 +1,10 @@
1
1
  {
2
2
  "name": "@nyxora/core",
3
- "version": "1.6.3",
3
+ "version": "1.6.4",
4
4
  "private": true,
5
5
  "main": "src/gateway/server.ts",
6
6
  "dependencies": {
7
7
  "@clack/prompts": "^1.4.0",
8
- "better-sqlite3": "^12.10.0",
9
8
  "cors": "^2.8.6",
10
9
  "express": "^5.2.1",
11
10
  "express-rate-limit": "^7.5.0",
@@ -284,8 +284,9 @@ Provider: ${config.llm.provider}`;
284
284
  // Save Private Key to OS Keyring or fallback to .env
285
285
  if (privateKey) {
286
286
  try {
287
- const keytar = require('keytar');
288
- await keytar.setPassword('nyxora', 'wallet', privateKey as string);
287
+ const { Entry } = require('@napi-rs/keyring');
288
+ const entry = new Entry('nyxora', 'wallet');
289
+ await entry.setPassword(privateKey as string);
289
290
  console.log(pc.green('Private key saved securely to OS Keyring.'));
290
291
  } catch (error) {
291
292
  console.warn(pc.yellow('Failed to save to OS Keyring (Module mismatch or headless server). Falling back to local vault.key'));
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import crypto from 'crypto';
4
- import Database from 'better-sqlite3';
4
+ import { DatabaseSync } from 'node:sqlite';
5
5
  import { loadConfig } from '../config/parser';
6
6
  import { getPath } from '../config/paths';
7
7
 
@@ -21,7 +21,7 @@ export interface ChatSession {
21
21
  }
22
22
 
23
23
  export class Logger {
24
- private db: Database.Database;
24
+ private db: DatabaseSync;
25
25
 
26
26
  constructor() {
27
27
  const config = loadConfig() || {};
@@ -37,7 +37,7 @@ export class Logger {
37
37
  fs.mkdirSync(dir, { recursive: true });
38
38
  }
39
39
 
40
- this.db = new Database(fullPath);
40
+ this.db = new DatabaseSync(fullPath);
41
41
  this.initDb();
42
42
  }
43
43
 
@@ -86,17 +86,24 @@ export class Logger {
86
86
  VALUES (@role, @content, @name, @tool_call_id, @tool_calls)
87
87
  `);
88
88
 
89
- const insertMany = this.db.transaction((entries: any[]) => {
90
- for (const entry of entries) {
91
- insert.run({
92
- role: entry.role,
93
- content: entry.content || '',
94
- name: entry.name || null,
95
- tool_call_id: entry.tool_call_id || null,
96
- tool_calls: entry.tool_calls ? JSON.stringify(entry.tool_calls) : null
97
- });
89
+ const insertMany = (entries: any[]) => {
90
+ this.db.exec('BEGIN TRANSACTION');
91
+ try {
92
+ for (const entry of entries) {
93
+ insert.run({
94
+ role: entry.role,
95
+ content: entry.content || '',
96
+ name: entry.name || null,
97
+ tool_call_id: entry.tool_call_id || null,
98
+ tool_calls: entry.tool_calls ? JSON.stringify(entry.tool_calls) : null
99
+ });
100
+ }
101
+ this.db.exec('COMMIT');
102
+ } catch (e) {
103
+ this.db.exec('ROLLBACK');
104
+ throw e;
98
105
  }
99
- });
106
+ };
100
107
 
101
108
  insertMany(oldMemory);
102
109
  console.log('[Nyxora Memory] Successfully migrated memory.json to SQLite database (Atomic Storage).');
@@ -112,7 +119,7 @@ export class Logger {
112
119
 
113
120
  public getSessions(): ChatSession[] {
114
121
  const rows = this.db.prepare('SELECT id, title, timestamp FROM sessions ORDER BY timestamp DESC').all();
115
- return rows as ChatSession[];
122
+ return rows as unknown as ChatSession[];
116
123
  }
117
124
 
118
125
  public createSession(title: string): string {