@dtoolkit/dbrain 0.4.0 → 0.4.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/README.md CHANGED
@@ -107,6 +107,7 @@ Memories fade if you don't use them — like a real brain.
107
107
  | `wake_up` | Full identity load |
108
108
  | `overview` | Brain stats |
109
109
  | `share` | Push a fact to a connected shared brain |
110
+ | `compact` | Run compaction (dedup + tier recalc) |
110
111
 
111
112
  ## REST API
112
113
 
@@ -127,6 +128,8 @@ All endpoints require `Authorization: Bearer <token>` except `/health`.
127
128
  | `POST/GET/DELETE` | `/keys` | API key management (shared brains only) |
128
129
  | `PATCH` | `/keys/:id` | Update API key permissions |
129
130
  | `POST` | `/facts/:id/share` | Push a fact to a connected brain |
131
+ | `GET` | `/me` | Current user/admin info |
132
+ | `POST` | `/compact` | Run compaction (admin-only) |
130
133
 
131
134
  ## CLI commands
132
135
 
@@ -139,11 +142,22 @@ All endpoints require `Authorization: Bearer <token>` except `/health`.
139
142
  | `dbrain link <url>` | Client | Connect to a shared brain |
140
143
  | `dbrain unlink <name>` | Client | Disconnect from a shared brain |
141
144
  | `dbrain connections` | Client | List connections with health status |
145
+ | `dbrain compact [path]` | Server | Run compaction (dedup + tier recalc) |
146
+ | `dbrain configure [path]` | Server | Interactive config editor |
142
147
  | `dbrain keys <action>` | Server | Manage per-user API keys (shared brains) |
143
148
 
144
149
  ## Dashboard
145
150
 
146
- Web dashboard on port `7879`. Shows brain stats, entities with PARA categories, fact tiers, conversations, and full-text search.
151
+ Web dashboard on port `7879` (API port + 1). Single-file React 18 app CDN deps, no build step.
152
+
153
+ - Brain status with live pulse indicator and stats (entities, facts by tier, conversations).
154
+ - Entity grid with PARA category coloring and hot/warm/cold tier badges.
155
+ - Entity detail view with all facts.
156
+ - Conversation list with source, date, and click-to-view messages.
157
+ - Full-text search over all memories.
158
+ - Light / Dark themes (Cloud / Ocean).
159
+ - Mobile responsive with hamburger menu.
160
+ - Token-based auth (validated against `/memory/summary`).
147
161
 
148
162
  ## Stack
149
163
 
@@ -3,11 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
5
5
  <title>dbrain - Your distributed brain</title>
6
- <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
7
- <link rel="icon" type="image/svg+xml" href="/favicon.svg">
8
- <link rel="shortcut icon" href="/favicon.ico">
9
- <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
10
- <link rel="manifest" href="/site.webmanifest">
6
+ <link rel="icon" type="image/png" href="/logo-dbrain.png">
11
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
12
8
  <link href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,300;9..40,400;9..40,500;9..40,600;9..40,700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
13
9
  <script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
@@ -297,10 +293,10 @@ html,body{height:100%;font-family:var(--font);background:var(--bg);color:var(--t
297
293
  .login-card{
298
294
  position:relative;z-index:1;background:var(--surface);
299
295
  border:1px solid var(--border);border-radius:16px;
300
- padding:40px 44px;width:400px;text-align:center;
296
+ padding:40px 44px;width:400px;max-width:calc(100vw - 32px);text-align:center;
301
297
  box-shadow:0 20px 60px oklch(0 0 0/.12),0 0 0 1px oklch(from var(--accent) l c h /.08);
302
298
  }
303
- .login-logo{width:200px;height:auto;margin:0 auto 24px;display:block}
299
+ .login-logo{width:280px;max-width:100%;height:auto;margin:0 auto 28px;display:block}
304
300
  .login-token-label{font-size:13px;color:var(--text-2);margin-bottom:10px;text-align:left}
305
301
  .login-input{
306
302
  width:100%;padding:11px 14px;background:var(--surface-2);
@@ -312,10 +308,47 @@ html,body{height:100%;font-family:var(--font);background:var(--bg);color:var(--t
312
308
  .login-input.err{border-color:#e53e3e}
313
309
  .login-hint{font-size:12px;color:var(--text-3);margin-bottom:14px}
314
310
  .login-err{font-size:12px;color:#e53e3e;margin-bottom:14px}
311
+ .login-btn{
312
+ width:100%;padding:11px;background:var(--accent);color:#fff;border:none;
313
+ border-radius:var(--r);font-family:var(--font);font-size:14px;font-weight:600;cursor:pointer;
314
+ transition:opacity .12s;
315
+ }
316
+ .login-btn:hover{opacity:.9}
315
317
 
316
318
  /* ── LOADING ────────────────────────────── */
317
319
  .loading{display:flex;align-items:center;justify-content:center;height:60vh;color:var(--text-3);font-size:13px}
318
320
  .empty{color:var(--text-3);font-size:13px;padding:32px;text-align:center;background:var(--surface);border-radius:var(--r);border:1px solid var(--border-subtle)}
321
+
322
+ /* ── MOBILE HAMBURGER ──────────────────── */
323
+ .mobile-toggle{
324
+ display:none;position:fixed;top:12px;left:12px;z-index:60;
325
+ width:32px;height:32px;border-radius:6px;border:none;
326
+ background:none;cursor:pointer;align-items:center;justify-content:center;
327
+ padding:0;
328
+ }
329
+ .mobile-toggle svg{color:var(--text-2)}
330
+ .sidebar-overlay{display:none;position:fixed;inset:0;z-index:45;background:oklch(0 0 0/.3)}
331
+
332
+ /* ── RESPONSIVE ────────────────────────── */
333
+ @media(max-width:768px){
334
+ .mobile-toggle{display:flex}
335
+ .sidebar{transform:translateX(-100%);transition:transform .2s}
336
+ .sidebar.open{transform:translateX(0)}
337
+ .sidebar-overlay.open{display:block}
338
+ .main{margin-left:0}
339
+ .topbar{padding:0 16px;padding-left:52px}
340
+ .page{padding:20px 16px 60px}
341
+ .stats-row{grid-template-columns:repeat(2,1fr)}
342
+ .entity-grid{grid-template-columns:1fr}
343
+ .conv-grid{grid-template-columns:repeat(auto-fill,minmax(140px,1fr))}
344
+ .meta-grid{grid-template-columns:1fr}
345
+ .detail-stat-row{flex-direction:column}
346
+ .detail-stat{border-right:none;border-bottom:1px solid var(--border-subtle)}
347
+ .detail-stat:last-child{border-bottom:none}
348
+ .login-card{padding:28px 20px}
349
+ .login-logo{width:100%}
350
+ .form-row{flex-direction:column}
351
+ }
319
352
  </style>
320
353
  </head>
321
354
  <body>
@@ -423,7 +456,7 @@ const BrainIcon = () => (
423
456
  </svg>
424
457
  );
425
458
 
426
- function Sidebar({ route, nav, palette, onTogglePalette, brain, connections, user, onLogout, activeBrain, onBrainSwitch }) {
459
+ function Sidebar({ route, nav, palette, onTogglePalette, brain, connections, user, onLogout, activeBrain, onBrainSwitch, sidebarOpen }) {
427
460
  const brainItems = [
428
461
  { name: null, label: brain.name || 'My Brain', badge: brain.brainType, online: true },
429
462
  ...(connections || []).map(c => ({
@@ -459,9 +492,9 @@ function Sidebar({ route, nav, palette, onTogglePalette, brain, connections, use
459
492
  };
460
493
 
461
494
  return (
462
- <aside className="sidebar">
495
+ <aside className={`sidebar ${sidebarOpen ? 'open' : ''}`}>
463
496
  <div className="sb-logo">
464
- <img src="/logo-image.png" alt="dbrain" />
497
+ <img src="/logo-dbrain.png" alt="dbrain" />
465
498
  <div className="sb-logo-info">
466
499
  <span className="sb-logo-text">dbrain</span>
467
500
  <span className="sb-version">v{brain.version}</span>
@@ -493,13 +526,13 @@ function Sidebar({ route, nav, palette, onTogglePalette, brain, connections, use
493
526
  <button className={`palette-toggle-opt ${palette === 'ocean' ? 'active' : ''}`} onClick={() => onTogglePalette('ocean')}>&#9679; Dark</button>
494
527
  </div>
495
528
  </div>
496
- {user && <div className="sb-user">
529
+ <div className="sb-user">
497
530
  <div className="sb-user-info">
498
- <span className="sb-user-name">{user.userName}</span>
499
- <span className="sb-user-role">{user.isAdmin ? 'admin' : user.permissions}</span>
531
+ <span className="sb-user-name">{user ? user.userName : 'Admin'}</span>
532
+ <span className="sb-user-role">{user ? (user.isAdmin ? 'admin' : user.permissions) : ''}</span>
500
533
  </div>
501
534
  <button className="sb-logout" onClick={onLogout}>Logout</button>
502
- </div>}
535
+ </div>
503
536
  </div>
504
537
  </aside>
505
538
  );
@@ -509,29 +542,31 @@ function Sidebar({ route, nav, palette, onTogglePalette, brain, connections, use
509
542
  function LoginPage({ onLogin }) {
510
543
  const [token, setToken] = useState('');
511
544
  const [err, setErr] = useState('');
512
- const [loading, setLoading] = useState(false);
513
- const submit = () => {
545
+ const handleSubmit = async (e) => {
546
+ e.preventDefault();
514
547
  if (!token.trim()) return;
515
- setLoading(true); setErr('');
516
- fetch(`${API_BASE}/health`, { headers: { 'Authorization': `Bearer ${token}` } })
517
- .then(r => { if (!r.ok) throw new Error('Invalid token'); return r.json(); })
518
- .then(() => onLogin(token))
519
- .catch(() => { setErr('Invalid token or brain unreachable.'); setLoading(false); });
548
+ try {
549
+ const r = await fetch(`${API_BASE}/memory/summary`, { headers: { 'Authorization': `Bearer ${token}` } });
550
+ if (!r.ok) throw new Error('fail');
551
+ onLogin(token);
552
+ } catch {
553
+ setErr('Invalid token or brain unreachable.');
554
+ }
520
555
  };
521
556
  return (
522
557
  <div className="login-bg">
523
- <div className="login-card">
524
- <img src="logo-complete.png" alt="dbrain" className="login-logo" />
525
- <p className="login-token-label">Access token</p>
558
+ <form className="login-card" onSubmit={handleSubmit}>
559
+ <img src="/logo-dbrain-complete.png" alt="dbrain" className="login-logo" />
560
+ <div className="login-token-label">Access token</div>
526
561
  <input className={`login-input${err ? ' err' : ''}`} type="password"
527
562
  placeholder="sk-dbr_..." value={token}
528
- onChange={e => { setToken(e.target.value); setErr(''); }}
529
- onKeyDown={e => e.key === 'Enter' && submit()} autoFocus spellCheck="false" />
563
+ onChange={e => { setToken(e.target.value); setErr(''); }} autoFocus />
530
564
  {err
531
- ? <p className="login-err">{err}</p>
532
- : <p className="login-hint">{loading ? 'Connecting...' : 'Press Enter to connect'}</p>
565
+ ? <div className="login-err">{err}</div>
566
+ : <div className="login-hint">Find your token in ~/.dbrain/config.json</div>
533
567
  }
534
- </div>
568
+ <button className="login-btn" type="submit">Connect</button>
569
+ </form>
535
570
  </div>
536
571
  );
537
572
  }
@@ -1040,6 +1075,7 @@ function App() {
1040
1075
  const [connections, setConnections] = useState([]);
1041
1076
  const [user, setUser] = useState(null);
1042
1077
  const [activeBrain, setActiveBrain] = useState(null);
1078
+ const [sidebarOpen, setSidebarOpen] = useState(false);
1043
1079
  const authed = Boolean(token);
1044
1080
 
1045
1081
  const togglePalette = (p) => {
@@ -1103,10 +1139,16 @@ function App() {
1103
1139
  return <DashboardPage nav={nav} overview={overview} conversations={conversations} brainName={activeBrainName} />;
1104
1140
  };
1105
1141
 
1142
+ const mobileNav = (path) => { nav(path); setSidebarOpen(false); };
1143
+
1106
1144
  return (
1107
1145
  <div className="shell">
1108
- <Sidebar route={route} nav={nav} palette={palette} onTogglePalette={togglePalette} brain={brain} connections={connections} user={user}
1109
- activeBrain={activeBrain} onBrainSwitch={handleBrainSwitch}
1146
+ <button className="mobile-toggle" onClick={() => setSidebarOpen(!sidebarOpen)}>
1147
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M3 12h18M3 6h18M3 18h18"/></svg>
1148
+ </button>
1149
+ <div className={`sidebar-overlay ${sidebarOpen ? 'open' : ''}`} onClick={() => setSidebarOpen(false)} />
1150
+ <Sidebar route={route} nav={mobileNav} palette={palette} onTogglePalette={togglePalette} brain={brain} connections={connections} user={user}
1151
+ activeBrain={activeBrain} onBrainSwitch={(name) => { handleBrainSwitch(name); setSidebarOpen(false); }} sidebarOpen={sidebarOpen}
1110
1152
  onLogout={() => { localStorage.removeItem(TOKEN_KEY); setToken(''); setHealth(null); setUser(null); setActiveBrain(null); nav('#/login'); }} />
1111
1153
  <div className="main">{renderPage()}</div>
1112
1154
  </div>
Binary file
@@ -12,17 +12,17 @@ const MIME = {
12
12
  };
13
13
  export function startDashboard(port) {
14
14
  const app = Fastify();
15
- const logoC = readFileSync(join(__dirname, 'logo-complete.png'));
16
- const logoI = readFileSync(join(__dirname, 'logo-image.png'));
15
+ const logoSquare = readFileSync(join(__dirname, 'logo-dbrain.png'));
16
+ const logoComplete = readFileSync(join(__dirname, 'logo-dbrain-complete.png'));
17
17
  app.get('/', (_, reply) => {
18
18
  const html = readFileSync(join(__dirname, 'index.html'), 'utf-8');
19
19
  reply.type('text/html').send(html);
20
20
  });
21
- app.get('/logo-image.png', (_, reply) => {
22
- reply.type('image/png').send(logoI);
21
+ app.get('/logo-dbrain.png', (_, reply) => {
22
+ reply.type('image/png').send(logoSquare);
23
23
  });
24
- app.get('/logo-complete.png', (_, reply) => {
25
- reply.type('image/png').send(logoC);
24
+ app.get('/logo-dbrain-complete.png', (_, reply) => {
25
+ reply.type('image/png').send(logoComplete);
26
26
  });
27
27
  app.get('/:file', (req, reply) => {
28
28
  const { file } = req.params;
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dtoolkit/dbrain",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Your distributed mind. Persistent knowledge across all your AIs.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -44,7 +44,7 @@
44
44
  "picocolors": "^1.1.1",
45
45
  "zod": "^4.4.2",
46
46
  "@dtoolkit/core": "0.5.0",
47
- "@dtoolkit/sdk": "0.4.1"
47
+ "@dtoolkit/sdk": "0.5.0"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/better-sqlite3": "^7.6.13",
Binary file
Binary file