@polderlabs/bizar 4.5.0 → 4.5.2
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/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js +1 -0
- package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js.map +1 -0
- package/bizar-dash/dist/assets/main-B4OfGAwz.js +361 -0
- package/bizar-dash/dist/assets/main-B4OfGAwz.js.map +1 -0
- package/bizar-dash/dist/assets/main-DAlLdW8I.css +1 -0
- package/bizar-dash/dist/assets/{mobile--0FBIKX3.js → mobile-BRhoDOUz.js} +1 -2
- package/bizar-dash/dist/assets/{mobile--0FBIKX3.js.map → mobile-BRhoDOUz.js.map} +1 -1
- package/bizar-dash/dist/assets/{mobile-OgRp8VIb.js → mobile-lbH6szyX.js} +2 -3
- package/bizar-dash/dist/assets/mobile-lbH6szyX.js.map +1 -0
- package/bizar-dash/dist/index.html +3 -3
- package/bizar-dash/dist/mobile.html +2 -2
- package/bizar-dash/skills/bizar/SKILL.md +20 -0
- package/bizar-dash/skills/headroom/SKILL.md +94 -0
- package/bizar-dash/skills/lightrag/SKILL.md +11 -0
- package/bizar-dash/skills/obsidian/SKILL.md +13 -0
- package/bizar-dash/src/server/api.mjs +6 -0
- package/bizar-dash/src/server/headroom.mjs +647 -0
- package/bizar-dash/src/server/memory-lightrag.mjs +281 -6
- package/bizar-dash/src/server/memory-obsidian.mjs +230 -0
- package/bizar-dash/src/server/memory-store.mjs +151 -0
- package/bizar-dash/src/server/mods-loader.mjs +13 -5
- package/bizar-dash/src/server/providers-store.mjs +73 -1
- package/bizar-dash/src/server/routes/_shared.mjs +17 -0
- package/bizar-dash/src/server/routes/chat.mjs +38 -0
- package/bizar-dash/src/server/routes/headroom.mjs +126 -0
- package/bizar-dash/src/server/routes/lightrag.mjs +6 -2
- package/bizar-dash/src/server/routes/memory.mjs +439 -4
- package/bizar-dash/src/server/schedules-runner.mjs +4 -4
- package/bizar-dash/src/server/server.mjs +55 -37
- package/bizar-dash/src/server/watcher.mjs +2 -2
- package/bizar-dash/src/web/App.tsx +42 -6
- package/bizar-dash/src/web/components/HeadroomSettings.tsx +418 -0
- package/bizar-dash/src/web/components/HeadroomStatus.tsx +158 -0
- package/bizar-dash/src/web/components/Toast.tsx +1 -1
- package/bizar-dash/src/web/components/Topbar.tsx +3 -1
- package/bizar-dash/src/web/lib/api.ts +12 -11
- package/bizar-dash/src/web/lib/types.ts +16 -0
- package/bizar-dash/src/web/main.tsx +1 -0
- package/bizar-dash/src/web/styles/chat.css +2 -0
- package/bizar-dash/src/web/styles/main.css +52 -23
- package/bizar-dash/src/web/styles/memory.css +955 -0
- package/bizar-dash/src/web/styles/tasks.css +2 -0
- package/bizar-dash/src/web/views/Memory.tsx +141 -0
- package/bizar-dash/src/web/views/MiniMaxUsage.tsx +3 -2
- package/bizar-dash/src/web/views/Overview.tsx +7 -2
- package/bizar-dash/src/web/views/Settings.tsx +32 -1
- package/bizar-dash/src/web/views/Skills.tsx +3 -2
- package/bizar-dash/src/web/views/Tasks.tsx +4 -3
- package/bizar-dash/src/web/views/memory/ConfigPanel.tsx +289 -0
- package/bizar-dash/src/web/views/memory/GitSyncPanel.tsx +220 -0
- package/bizar-dash/src/web/views/memory/LightragPanel.tsx +307 -0
- package/bizar-dash/src/web/views/memory/MemoryOverview.tsx +356 -0
- package/bizar-dash/src/web/views/memory/MemoryStatusCard.tsx +160 -0
- package/bizar-dash/src/web/views/memory/ObsidianPanel.tsx +642 -0
- package/bizar-dash/src/web/views/memory/SemanticSearchPanel.tsx +194 -0
- package/bizar-dash/tests/cli-bugfixes.test.mjs +151 -0
- package/bizar-dash/tests/frontend-bugfixes.test.mjs +151 -0
- package/bizar-dash/tests/headroom-install.test.mjs +173 -0
- package/bizar-dash/tests/headroom-settings.test.mjs +126 -0
- package/bizar-dash/tests/headroom-status.test.mjs +117 -0
- package/bizar-dash/tests/memory-lightrag-extended.test.mjs +162 -0
- package/bizar-dash/tests/memory-obsidian.test.mjs +269 -0
- package/bizar-dash/tests/memory-tab.test.mjs +322 -0
- package/bizar-dash/tests/mod-upgrade.node.test.mjs +1 -1
- package/bizar-dash/tests/server-bugfixes.test.mjs +318 -0
- package/bizar-dash/tests/submit-feedback.test.mjs +6 -6
- package/cli/artifact.mjs +11 -4
- package/cli/bin.mjs +211 -12
- package/cli/doctor.mjs +5 -3
- package/cli/memory.mjs +65 -21
- package/cli/provision.mjs +8 -2
- package/install.sh +1 -2
- package/package.json +3 -3
- package/bizar-dash/dist/assets/main-CDFKHzBg.css +0 -1
- package/bizar-dash/dist/assets/main-NYFpS2wY.js +0 -312
- package/bizar-dash/dist/assets/main-NYFpS2wY.js.map +0 -1
- package/bizar-dash/dist/assets/mobile-OgRp8VIb.js.map +0 -1
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
Activity,
|
|
23
23
|
Radio,
|
|
24
24
|
Coins,
|
|
25
|
+
Brain,
|
|
25
26
|
type LucideIcon,
|
|
26
27
|
} from 'lucide-react';
|
|
27
28
|
import { cn } from '../lib/utils';
|
|
@@ -46,6 +47,7 @@ export const TABS: TabDef[] = [
|
|
|
46
47
|
{ id: 'activity', label: 'Activity', icon: Activity },
|
|
47
48
|
{ id: 'background', label: 'Active', icon: Radio },
|
|
48
49
|
{ id: 'skills', label: 'Skills', icon: Sparkles },
|
|
50
|
+
{ id: 'memory', label: 'Memory', icon: Brain },
|
|
49
51
|
{ id: 'mods', label: 'Mods', icon: Puzzle },
|
|
50
52
|
{ id: 'schedules', label: 'Schedules', icon: Clock },
|
|
51
53
|
{ id: 'history', label: 'History', icon: HistoryIcon },
|
|
@@ -137,7 +139,7 @@ export function Topbar({
|
|
|
137
139
|
</div>
|
|
138
140
|
</div>
|
|
139
141
|
{showTabs && (
|
|
140
|
-
<nav className="tabs-row" role="tablist">
|
|
142
|
+
<nav className="tabs-row" role="tablist" aria-label="Primary tabs">
|
|
141
143
|
{TABS.map((tab) => {
|
|
142
144
|
const Icon = tab.icon;
|
|
143
145
|
const active = tab.id === activeTab;
|
|
@@ -135,8 +135,8 @@ class ApiClient {
|
|
|
135
135
|
* @example
|
|
136
136
|
* const r = await api.get<ProjectList>('/projects');
|
|
137
137
|
*/
|
|
138
|
-
async get<T>(path: string): Promise<T> {
|
|
139
|
-
return this.req<T>('GET', path);
|
|
138
|
+
async get<T>(path: string, signal?: AbortSignal): Promise<T> {
|
|
139
|
+
return this.req<T>('GET', path, undefined, signal);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
/**
|
|
@@ -145,8 +145,8 @@ class ApiClient {
|
|
|
145
145
|
* IMPORTANT: do NOT include the `/api` prefix in `path` — the
|
|
146
146
|
* wrapper adds it. Use the unprefixed form: `api.post('/fs/mkdir', body)`.
|
|
147
147
|
*/
|
|
148
|
-
async post<T>(path: string, body?: unknown): Promise<T> {
|
|
149
|
-
return this.req<T>('POST', path, body);
|
|
148
|
+
async post<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {
|
|
149
|
+
return this.req<T>('POST', path, body, signal);
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
/**
|
|
@@ -155,8 +155,8 @@ class ApiClient {
|
|
|
155
155
|
* IMPORTANT: do NOT include the `/api` prefix in `path` — the
|
|
156
156
|
* wrapper adds it. Use the unprefixed form: `api.put('/settings', body)`.
|
|
157
157
|
*/
|
|
158
|
-
async put<T>(path: string, body?: unknown): Promise<T> {
|
|
159
|
-
return this.req<T>('PUT', path, body);
|
|
158
|
+
async put<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {
|
|
159
|
+
return this.req<T>('PUT', path, body, signal);
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
/**
|
|
@@ -165,8 +165,8 @@ class ApiClient {
|
|
|
165
165
|
* IMPORTANT: do NOT include the `/api` prefix in `path` — the
|
|
166
166
|
* wrapper adds it. Use the unprefixed form: `api.patch('/settings', body)`.
|
|
167
167
|
*/
|
|
168
|
-
async patch<T>(path: string, body?: unknown): Promise<T> {
|
|
169
|
-
return this.req<T>('PATCH', path, body);
|
|
168
|
+
async patch<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {
|
|
169
|
+
return this.req<T>('PATCH', path, body, signal);
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
/**
|
|
@@ -175,11 +175,11 @@ class ApiClient {
|
|
|
175
175
|
* IMPORTANT: do NOT include the `/api` prefix in `path` — the
|
|
176
176
|
* wrapper adds it. Use the unprefixed form: `api.del('/projects/123')`.
|
|
177
177
|
*/
|
|
178
|
-
async del<T = unknown>(path: string): Promise<T> {
|
|
179
|
-
return this.req<T>('DELETE', path);
|
|
178
|
+
async del<T = unknown>(path: string, signal?: AbortSignal): Promise<T> {
|
|
179
|
+
return this.req<T>('DELETE', path, undefined, signal);
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
-
private async req<T>(method: string, path: string, body?: unknown): Promise<T> {
|
|
182
|
+
private async req<T>(method: string, path: string, body?: unknown, signal?: AbortSignal): Promise<T> {
|
|
183
183
|
const headers: Record<string, string> = { 'Content-Type': 'application/json' };
|
|
184
184
|
const tok = this.getToken();
|
|
185
185
|
if (tok) headers.Authorization = `Bearer ${tok}`;
|
|
@@ -187,6 +187,7 @@ class ApiClient {
|
|
|
187
187
|
if (body !== undefined && body !== null) {
|
|
188
188
|
opts.body = typeof body === 'string' ? body : JSON.stringify(body);
|
|
189
189
|
}
|
|
190
|
+
if (signal) opts.signal = signal;
|
|
190
191
|
const r = await fetch(this.base + path, opts);
|
|
191
192
|
const ct = r.headers.get('content-type') || '';
|
|
192
193
|
if (ct.includes('application/json')) {
|
|
@@ -277,6 +277,22 @@ export type Settings = {
|
|
|
277
277
|
baseUrl: string;
|
|
278
278
|
chatBaseUrl: string;
|
|
279
279
|
};
|
|
280
|
+
// v5.0.0 — Headroom context compression settings.
|
|
281
|
+
headroom?: HeadroomSettings;
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
export type HeadroomSettings = {
|
|
285
|
+
enabled: boolean;
|
|
286
|
+
autoInstall: boolean;
|
|
287
|
+
port: number;
|
|
288
|
+
host: string;
|
|
289
|
+
outputShaper: boolean;
|
|
290
|
+
telemetry: boolean;
|
|
291
|
+
budget: number;
|
|
292
|
+
backend: string;
|
|
293
|
+
autoStart: boolean;
|
|
294
|
+
autoWrap: boolean;
|
|
295
|
+
routeAllProviders: boolean;
|
|
280
296
|
};
|
|
281
297
|
|
|
282
298
|
export type SettingsResponse = {
|
|
@@ -1376,6 +1376,8 @@
|
|
|
1376
1376
|
border-radius: var(--radius-lg); padding: 0.875rem 1.125rem;
|
|
1377
1377
|
transition: border-color var(--motion-base) var(--motion-ease);
|
|
1378
1378
|
max-width: 880px; width: 100%; align-self: flex-start;
|
|
1379
|
+
content-visibility: auto;
|
|
1380
|
+
contain-intrinsic-size: 0 80px;
|
|
1379
1381
|
}
|
|
1380
1382
|
.chat-message-user { background: var(--bg-2); }
|
|
1381
1383
|
.chat-message-pinned { border-left: 2px solid var(--accent); }
|
|
@@ -129,10 +129,10 @@ pre,
|
|
|
129
129
|
--accent-glow: rgba(139, 92, 246, 0.18);
|
|
130
130
|
--accent-soft: rgba(139, 92, 246, 0.08);
|
|
131
131
|
|
|
132
|
-
--success:
|
|
133
|
-
--warning:
|
|
134
|
-
--error:
|
|
135
|
-
--info:
|
|
132
|
+
--success: oklch(0.72 0.16 145);
|
|
133
|
+
--warning: oklch(0.78 0.14 70);
|
|
134
|
+
--error: oklch(0.66 0.20 25);
|
|
135
|
+
--info: oklch(0.72 0.13 235);
|
|
136
136
|
--success-soft: rgba(52, 211, 153, 0.15);
|
|
137
137
|
--error-soft: rgba(248, 113, 113, 0.12);
|
|
138
138
|
--warning-soft: rgba(251, 191, 36, 0.15);
|
|
@@ -155,7 +155,7 @@ pre,
|
|
|
155
155
|
'Inter var', 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto,
|
|
156
156
|
sans-serif;
|
|
157
157
|
|
|
158
|
-
/* Spacing scale (8pt) */
|
|
158
|
+
/* Spacing scale (8pt + extra for spacious layouts) */
|
|
159
159
|
--space-1: 4px;
|
|
160
160
|
--space-2: 8px;
|
|
161
161
|
--space-3: 12px;
|
|
@@ -165,6 +165,9 @@ pre,
|
|
|
165
165
|
--space-8: 32px;
|
|
166
166
|
--space-10: 40px;
|
|
167
167
|
--space-12: 48px;
|
|
168
|
+
--space-16: 64px;
|
|
169
|
+
--space-20: 80px;
|
|
170
|
+
--space-24: 96px;
|
|
168
171
|
|
|
169
172
|
/* v4.6.0 — Semantic spacing aliases. These mirror the existing
|
|
170
173
|
--space-* numeric scale so existing rules stay untouched, and
|
|
@@ -179,10 +182,10 @@ pre,
|
|
|
179
182
|
--spacing-xl: var(--space-6); /* 24px — page-level padding */
|
|
180
183
|
|
|
181
184
|
/* Radius */
|
|
182
|
-
--radius-sm:
|
|
185
|
+
--radius-sm: 6px;
|
|
183
186
|
--radius: 8px;
|
|
184
187
|
--radius-md: 10px;
|
|
185
|
-
--radius-lg:
|
|
188
|
+
--radius-lg: 14px;
|
|
186
189
|
--radius-xl: 16px;
|
|
187
190
|
|
|
188
191
|
/* Shadows */
|
|
@@ -197,28 +200,15 @@ pre,
|
|
|
197
200
|
|
|
198
201
|
/* Motion */
|
|
199
202
|
--motion-fast: 120ms;
|
|
200
|
-
--motion-base:
|
|
201
|
-
--motion-slow:
|
|
203
|
+
--motion-base: 200ms;
|
|
204
|
+
--motion-slow: 320ms;
|
|
202
205
|
--ease: cubic-bezier(0.4, 0, 0.2, 1);
|
|
206
|
+
--motion-ease: cubic-bezier(0.2, 0, 0, 1);
|
|
203
207
|
|
|
204
208
|
/* v3.21.x — Semantic and surface tokens for chat UI overhaul */
|
|
205
209
|
--surface-0: var(--bg);
|
|
206
210
|
--surface-1: color-mix(in oklab, var(--bg) 92%, var(--text) 8%);
|
|
207
211
|
--surface-2: color-mix(in oklab, var(--bg) 84%, var(--text) 16%);
|
|
208
|
-
--success: oklch(0.72 0.16 145);
|
|
209
|
-
--warning: oklch(0.78 0.14 70);
|
|
210
|
-
--error: oklch(0.66 0.20 25);
|
|
211
|
-
--info: oklch(0.72 0.13 235);
|
|
212
|
-
--radius-sm: 6px;
|
|
213
|
-
--radius-md: 10px;
|
|
214
|
-
--radius-lg: 14px;
|
|
215
|
-
--motion-fast: 120ms;
|
|
216
|
-
--motion-base: 200ms;
|
|
217
|
-
--motion-slow: 320ms;
|
|
218
|
-
--motion-ease: cubic-bezier(0.2, 0, 0, 1);
|
|
219
|
-
--space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px;
|
|
220
|
-
--space-5: 20px; --space-6: 24px; --space-8: 32px; --space-10: 40px;
|
|
221
|
-
--space-12: 48px; --space-16: 64px; --space-20: 80px; --space-24: 96px;
|
|
222
212
|
|
|
223
213
|
/* v3.21.x — Gemini-inspired surface tokens for chat UI overhaul.
|
|
224
214
|
--bg-1, --bg-2 are NEW names that don't conflict with --bg / --bg-elev. */
|
|
@@ -429,6 +419,41 @@ pre,
|
|
|
429
419
|
font-size: 12px;
|
|
430
420
|
}
|
|
431
421
|
|
|
422
|
+
/* v4.5.x — Per-view render-error fallback shown by App's ErrorBoundary.
|
|
423
|
+
Different from .boot-error (which fires before any view mounts). */
|
|
424
|
+
.view-error-fallback {
|
|
425
|
+
max-width: 560px;
|
|
426
|
+
margin: var(--space-12) auto;
|
|
427
|
+
padding: var(--space-6);
|
|
428
|
+
background: var(--bg-elev);
|
|
429
|
+
border: 1px solid var(--error);
|
|
430
|
+
border-radius: var(--radius-lg);
|
|
431
|
+
box-shadow: var(--shadow-2);
|
|
432
|
+
display: flex;
|
|
433
|
+
gap: var(--space-4);
|
|
434
|
+
align-items: flex-start;
|
|
435
|
+
}
|
|
436
|
+
.view-error-fallback > svg {
|
|
437
|
+
color: var(--error);
|
|
438
|
+
flex-shrink: 0;
|
|
439
|
+
margin-top: 2px;
|
|
440
|
+
}
|
|
441
|
+
.view-error-fallback .view-error-body {
|
|
442
|
+
display: flex;
|
|
443
|
+
flex-direction: column;
|
|
444
|
+
gap: var(--space-2);
|
|
445
|
+
min-width: 0;
|
|
446
|
+
}
|
|
447
|
+
.view-error-fallback pre {
|
|
448
|
+
background: var(--bg);
|
|
449
|
+
padding: var(--space-2) var(--space-3);
|
|
450
|
+
border-radius: var(--radius-sm);
|
|
451
|
+
font-size: 12px;
|
|
452
|
+
white-space: pre-wrap;
|
|
453
|
+
word-break: break-word;
|
|
454
|
+
margin: 0;
|
|
455
|
+
}
|
|
456
|
+
|
|
432
457
|
/* v3.6.2 — Token-entry form on boot-error screen */
|
|
433
458
|
.token-entry-form {
|
|
434
459
|
margin: var(--space-4) 0;
|
|
@@ -1438,6 +1463,8 @@ pre,
|
|
|
1438
1463
|
font-family: var(--font-mono);
|
|
1439
1464
|
border-left: 2px solid var(--border);
|
|
1440
1465
|
align-items: baseline;
|
|
1466
|
+
content-visibility: auto;
|
|
1467
|
+
contain-intrinsic-size: 0 80px;
|
|
1441
1468
|
}
|
|
1442
1469
|
|
|
1443
1470
|
.activity-item:hover {
|
|
@@ -3207,6 +3234,8 @@ pre,
|
|
|
3207
3234
|
box-shadow var(--motion-base) var(--ease),
|
|
3208
3235
|
transform var(--motion-fast) var(--ease),
|
|
3209
3236
|
background var(--motion-base) var(--ease);
|
|
3237
|
+
content-visibility: auto;
|
|
3238
|
+
contain-intrinsic-size: 0 80px;
|
|
3210
3239
|
}
|
|
3211
3240
|
.task-card::before {
|
|
3212
3241
|
content: '';
|