@polderlabs/bizar 3.23.1 → 4.2.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/README.md +83 -16
- package/bizar-dash/.bizar/activity.log +3 -0
- package/bizar-dash/.bizar/graph/.graphify_analysis.json +1540 -0
- package/bizar-dash/.bizar/graph/.graphify_labels.json +1 -0
- package/bizar-dash/.bizar/graph/GRAPH_REPORT.md +404 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/0661b816358db84dfdb7f10443db8a61152fd20b3fee950caf8fbf32920a1790.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/16da06d774142a6e5d74829ad982531286a6193ef798de8f593db029e123ec32.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/27e5697c01254c69c64c5a33896669073b40afb5ba88375102ae77fa5404136d.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/532997898027254aa4c0932243dc71d2f55888181232b65974961934997dc85b.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/84e3451a64c7f99f0cd6a88b0748d7426780486f53ab4935b7476b28c08f8293.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/88e5ea5f3e78fa69353fe9e6a8d1a05391d54605e25600cb125531eb5a6432ff.json +1 -0
- package/bizar-dash/.bizar/graph/cache/stat-index.json +1 -0
- package/bizar-dash/.bizar/graph/graph.html +307 -0
- package/bizar-dash/.bizar/graph/graph.json +40267 -0
- package/bizar-dash/.bizar/graph/manifest.json +762 -0
- package/bizar-dash/.graphifyignore +40 -0
- package/bizar-dash/.obsidian/README.md +14 -0
- package/bizar-dash/.obsidian/daily/2026-06-25.md +9 -0
- package/bizar-dash/.obsidian/vault.json +7 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/SKILL.md +103 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/assets/template.html +338 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/example.html +81 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/open-design.json +172 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/references/checklist.md +44 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/references/layouts.md +247 -0
- package/bizar-dash/CHANGELOG.md +474 -0
- package/bizar-dash/DESIGN.md +136 -0
- package/bizar-dash/dist/assets/main-B3RgW6FS.js +331 -0
- package/bizar-dash/dist/assets/main-B3RgW6FS.js.map +1 -0
- package/bizar-dash/dist/assets/main-DlJ8wgLR.css +1 -0
- package/bizar-dash/dist/assets/mobile-CsZQAswA.css +1 -0
- package/bizar-dash/dist/assets/mobile-DbxIw8BG.js +2 -0
- package/bizar-dash/dist/assets/mobile-DbxIw8BG.js.map +1 -0
- package/bizar-dash/dist/assets/mobile-Dvq2d53Y.js +354 -0
- package/bizar-dash/dist/assets/mobile-Dvq2d53Y.js.map +1 -0
- package/bizar-dash/dist/index.html +40 -0
- package/bizar-dash/dist/mobile.html +22 -0
- package/bizar-dash/plans/debug-plan/comments.json +1 -0
- package/bizar-dash/plans/debug-plan/meta.json +10 -0
- package/bizar-dash/plans/debug-plan/plan.json +174 -0
- package/bizar-dash/scripts/smoke-bg-retry.mjs +246 -0
- package/bizar-dash/src/cli/dashboard-ports.mjs +488 -0
- package/bizar-dash/src/cli.mjs +522 -0
- package/bizar-dash/src/server/activity-log.mjs +174 -0
- package/bizar-dash/src/server/agents-store.mjs +465 -0
- package/bizar-dash/src/server/api.mjs +138 -0
- package/bizar-dash/src/server/artifact-template.html +810 -0
- package/bizar-dash/src/server/artifacts-store.mjs +733 -0
- package/bizar-dash/src/server/auth.mjs +381 -0
- package/bizar-dash/src/server/background-store.mjs +447 -0
- package/bizar-dash/src/server/bg-poller.mjs +305 -0
- package/bizar-dash/src/server/bg-retry.mjs +574 -0
- package/bizar-dash/src/server/browser.mjs +40 -0
- package/bizar-dash/src/server/diagnostics-store.mjs +148 -0
- package/bizar-dash/src/server/dialog-poller.mjs +105 -0
- package/bizar-dash/src/server/dialog-store.mjs +177 -0
- package/bizar-dash/src/server/glyphs/mdx-compiler.mjs +583 -0
- package/bizar-dash/src/server/lib/path-safe.mjs +283 -0
- package/bizar-dash/src/server/memory-git.mjs +329 -0
- package/bizar-dash/src/server/memory-lightrag.mjs +767 -0
- package/bizar-dash/src/server/memory-schema.mjs +145 -0
- package/bizar-dash/src/server/memory-secrets.mjs +84 -0
- package/bizar-dash/src/server/memory-store.mjs +471 -0
- package/bizar-dash/src/server/mod-security.mjs +398 -0
- package/bizar-dash/src/server/mods-loader.mjs +1067 -0
- package/bizar-dash/src/server/notifications-store.mjs +243 -0
- package/bizar-dash/src/server/obsidian-store.mjs +318 -0
- package/bizar-dash/src/server/opencode-runner.mjs +279 -0
- package/bizar-dash/src/server/pair-store.mjs +138 -0
- package/bizar-dash/src/server/projects-store.mjs +364 -0
- package/bizar-dash/src/server/providers-store.mjs +789 -0
- package/bizar-dash/src/server/routes/_shared.mjs +415 -0
- package/bizar-dash/src/server/routes/activity.mjs +110 -0
- package/bizar-dash/src/server/routes/agents.mjs +134 -0
- package/bizar-dash/src/server/routes/artifacts.mjs +279 -0
- package/bizar-dash/src/server/routes/auth.mjs +69 -0
- package/bizar-dash/src/server/routes/background.mjs +165 -0
- package/bizar-dash/src/server/routes/chat.mjs +485 -0
- package/bizar-dash/src/server/routes/config.mjs +129 -0
- package/bizar-dash/src/server/routes/diagnostics.mjs +50 -0
- package/bizar-dash/src/server/routes/dialogs.mjs +86 -0
- package/bizar-dash/src/server/routes/fs.mjs +429 -0
- package/bizar-dash/src/server/routes/history.mjs +78 -0
- package/bizar-dash/src/server/routes/memory.mjs +658 -0
- package/bizar-dash/src/server/routes/misc.mjs +89 -0
- package/bizar-dash/src/server/routes/mods.mjs +359 -0
- package/bizar-dash/src/server/routes/notifications.mjs +54 -0
- package/bizar-dash/src/server/routes/obsidian.mjs +239 -0
- package/bizar-dash/src/server/routes/opencode-sessions.mjs +55 -0
- package/bizar-dash/src/server/routes/overview.mjs +91 -0
- package/bizar-dash/src/server/routes/pair.mjs +67 -0
- package/bizar-dash/src/server/routes/projects.mjs +175 -0
- package/bizar-dash/src/server/routes/providers.mjs +47 -0
- package/bizar-dash/src/server/routes/schedules.mjs +104 -0
- package/bizar-dash/src/server/routes/settings.mjs +51 -0
- package/bizar-dash/src/server/routes/skills.mjs +76 -0
- package/bizar-dash/src/server/routes/tasks.mjs +468 -0
- package/bizar-dash/src/server/routes/themes.mjs +51 -0
- package/bizar-dash/src/server/routes-v2/auth.mjs +59 -0
- package/bizar-dash/src/server/routes-v2/events.mjs +107 -0
- package/bizar-dash/src/server/routes-v2/health.mjs +21 -0
- package/bizar-dash/src/server/routes-v2/index.mjs +90 -0
- package/bizar-dash/src/server/routes-v2/sessions.mjs +111 -0
- package/bizar-dash/src/server/schedules-runner.mjs +369 -0
- package/bizar-dash/src/server/schedules-store.mjs +268 -0
- package/bizar-dash/src/server/search-store.mjs +220 -0
- package/bizar-dash/src/server/serve-info.mjs +684 -0
- package/bizar-dash/src/server/server.mjs +796 -0
- package/bizar-dash/src/server/settings-store.mjs +45 -0
- package/bizar-dash/src/server/skills-store.mjs +300 -0
- package/bizar-dash/src/server/state.mjs +437 -0
- package/bizar-dash/src/server/tailscale-store.mjs +113 -0
- package/bizar-dash/src/server/task-delegator.mjs +824 -0
- package/bizar-dash/src/server/tasks-store.mjs +508 -0
- package/bizar-dash/src/server/tui.mjs +923 -0
- package/bizar-dash/src/server/update-store.mjs +168 -0
- package/bizar-dash/src/server/v2-auth-file.mjs +99 -0
- package/bizar-dash/src/server/v2-event-bus.mjs +128 -0
- package/bizar-dash/src/server/watcher.mjs +81 -0
- package/bizar-dash/src/server/yaml.mjs +238 -0
- package/bizar-dash/src/web/App.tsx +718 -0
- package/bizar-dash/src/web/MobileApp.tsx +408 -0
- package/bizar-dash/src/web/components/ArtifactCreateDialog.tsx +95 -0
- package/bizar-dash/src/web/components/ArtifactListDialog.tsx +55 -0
- package/bizar-dash/src/web/components/ArtifactViewer.tsx +143 -0
- package/bizar-dash/src/web/components/AuditDialog.tsx +79 -0
- package/bizar-dash/src/web/components/BgStatusBadge.tsx +32 -0
- package/bizar-dash/src/web/components/Button.tsx +56 -0
- package/bizar-dash/src/web/components/CanvasContextMenu.tsx +68 -0
- package/bizar-dash/src/web/components/Card.tsx +40 -0
- package/bizar-dash/src/web/components/CollapsibleSection.tsx +72 -0
- package/bizar-dash/src/web/components/CommandDialog.tsx +66 -0
- package/bizar-dash/src/web/components/EmptyState.tsx +30 -0
- package/bizar-dash/src/web/components/FileBrowser.tsx +633 -0
- package/bizar-dash/src/web/components/HelpDialog.tsx +55 -0
- package/bizar-dash/src/web/components/KillConfirmDialog.tsx +88 -0
- package/bizar-dash/src/web/components/Modal.tsx +215 -0
- package/bizar-dash/src/web/components/Notifications.tsx +241 -0
- package/bizar-dash/src/web/components/SearchModal.tsx +224 -0
- package/bizar-dash/src/web/components/Sidebar.tsx +66 -0
- package/bizar-dash/src/web/components/Spinner.tsx +19 -0
- package/bizar-dash/src/web/components/StatusBadge.tsx +25 -0
- package/bizar-dash/src/web/components/Tag.tsx +28 -0
- package/bizar-dash/src/web/components/Toast.tsx +150 -0
- package/bizar-dash/src/web/components/Topbar.tsx +368 -0
- package/bizar-dash/src/web/components/VisualPlanDialog.tsx +58 -0
- package/bizar-dash/src/web/components/chat/AgentChip.tsx +68 -0
- package/bizar-dash/src/web/components/chat/ChatBubble.tsx +60 -0
- package/bizar-dash/src/web/components/chat/ChatThread.tsx +88 -0
- package/bizar-dash/src/web/components/chat/ChatTopBar.tsx +50 -0
- package/bizar-dash/src/web/components/chat/Composer.tsx +164 -0
- package/bizar-dash/src/web/components/chat/ConfirmModal.tsx +54 -0
- package/bizar-dash/src/web/components/chat/EmptyState.tsx +21 -0
- package/bizar-dash/src/web/components/chat/FirstRunGreeting.tsx +18 -0
- package/bizar-dash/src/web/components/chat/FloatingComposer.tsx +32 -0
- package/bizar-dash/src/web/components/chat/InfoPanel.tsx +119 -0
- package/bizar-dash/src/web/components/chat/LoadingSkeleton.tsx +19 -0
- package/bizar-dash/src/web/components/chat/MessageBubble.tsx +60 -0
- package/bizar-dash/src/web/components/chat/SessionList.tsx +153 -0
- package/bizar-dash/src/web/components/chat/StreamingIndicator.tsx +9 -0
- package/bizar-dash/src/web/components/chat/SuggestionCards.tsx +55 -0
- package/bizar-dash/src/web/components/chat/WelcomeScreen.tsx +36 -0
- package/bizar-dash/src/web/components/chat/index.ts +20 -0
- package/bizar-dash/src/web/components/chat/useAutoGrowTextarea.ts +18 -0
- package/bizar-dash/src/web/components/chat/useChat.ts +219 -0
- package/bizar-dash/src/web/components/chat/useSlashCommands.ts +47 -0
- package/bizar-dash/src/web/index.html +37 -0
- package/bizar-dash/src/web/lib/api.ts +193 -0
- package/bizar-dash/src/web/lib/markdown.tsx +59 -0
- package/bizar-dash/src/web/lib/types.ts +668 -0
- package/bizar-dash/src/web/lib/utils.ts +114 -0
- package/bizar-dash/src/web/lib/ws.ts +176 -0
- package/bizar-dash/src/web/main.tsx +34 -0
- package/bizar-dash/src/web/mobile/MobileApp.tsx +278 -0
- package/bizar-dash/src/web/mobile/MobileBottomNav.tsx +38 -0
- package/bizar-dash/src/web/mobile/MobileTopbar.tsx +115 -0
- package/bizar-dash/src/web/mobile/components/MobileBottomSheet.tsx +182 -0
- package/bizar-dash/src/web/mobile/components/MobileListItem.tsx +64 -0
- package/bizar-dash/src/web/mobile/components/MobileModal.tsx +123 -0
- package/bizar-dash/src/web/mobile/views/MobileActivity.tsx +273 -0
- package/bizar-dash/src/web/mobile/views/MobileAgents.tsx +374 -0
- package/bizar-dash/src/web/mobile/views/MobileArtifactCanvas.tsx +439 -0
- package/bizar-dash/src/web/mobile/views/MobileArtifacts.tsx +143 -0
- package/bizar-dash/src/web/mobile/views/MobileChat.tsx +180 -0
- package/bizar-dash/src/web/mobile/views/MobileConfig.tsx +175 -0
- package/bizar-dash/src/web/mobile/views/MobileHistory.tsx +191 -0
- package/bizar-dash/src/web/mobile/views/MobileMods.tsx +149 -0
- package/bizar-dash/src/web/mobile/views/MobileMore.tsx +121 -0
- package/bizar-dash/src/web/mobile/views/MobileNotifications.tsx +137 -0
- package/bizar-dash/src/web/mobile/views/MobilePlans.tsx +26 -0
- package/bizar-dash/src/web/mobile/views/MobileSchedules.tsx +685 -0
- package/bizar-dash/src/web/mobile/views/MobileSearchModal.tsx +172 -0
- package/bizar-dash/src/web/mobile/views/MobileSettings.tsx +388 -0
- package/bizar-dash/src/web/mobile/views/MobileSkills.tsx +153 -0
- package/bizar-dash/src/web/mobile/views/MobileTasks.tsx +564 -0
- package/bizar-dash/src/web/mobile.html +20 -0
- package/bizar-dash/src/web/mobile.tsx +13 -0
- package/bizar-dash/src/web/styles/chat.css +198 -0
- package/bizar-dash/src/web/styles/glyphs.css +960 -0
- package/bizar-dash/src/web/styles/main.css +8855 -0
- package/bizar-dash/src/web/styles/mobile-chat.css +5 -0
- package/bizar-dash/src/web/styles/mobile.css +1960 -0
- package/bizar-dash/src/web/views/Activity.tsx +1203 -0
- package/bizar-dash/src/web/views/Agents.tsx +701 -0
- package/bizar-dash/src/web/views/Artifacts.tsx +1480 -0
- package/bizar-dash/src/web/views/BackgroundAgents.tsx +450 -0
- package/bizar-dash/src/web/views/Chat.tsx +190 -0
- package/bizar-dash/src/web/views/Config.tsx +2063 -0
- package/bizar-dash/src/web/views/History.tsx +335 -0
- package/bizar-dash/src/web/views/ModView.tsx +207 -0
- package/bizar-dash/src/web/views/Mods.tsx +693 -0
- package/bizar-dash/src/web/views/Overview.tsx +812 -0
- package/bizar-dash/src/web/views/Providers.tsx +302 -0
- package/bizar-dash/src/web/views/Schedules.tsx +802 -0
- package/bizar-dash/src/web/views/Settings.tsx +1787 -0
- package/bizar-dash/src/web/views/Skills.tsx +431 -0
- package/bizar-dash/src/web/views/Tasks.tsx +1523 -0
- package/bizar-dash/src/web/views/glyphs/GlyphRenderer.tsx +613 -0
- package/bizar-dash/src/web/views/glyphs/components.tsx +1098 -0
- package/bizar-dash/templates/mod/FORMAT.md +76 -0
- package/bizar-dash/templates/mod/hello-mod/README.md +19 -0
- package/bizar-dash/templates/mod/hello-mod/agents/greeter.md +8 -0
- package/bizar-dash/templates/mod/hello-mod/commands/hello.md +6 -0
- package/bizar-dash/templates/mod/hello-mod/mod.json +20 -0
- package/bizar-dash/templates/mod/hello-mod/routes/ping.mjs +9 -0
- package/bizar-dash/templates/mod/hello-mod/views/HelloView.tsx +10 -0
- package/bizar-dash/tests/dashboard-ports.test.mjs +138 -0
- package/bizar-dash/tests/graphify-mod-spawn.node.test.mjs +90 -0
- package/bizar-dash/tests/memory-cli.test.mjs +542 -0
- package/bizar-dash/tests/memory-config.test.mjs +422 -0
- package/bizar-dash/tests/memory-git.test.mjs +246 -0
- package/bizar-dash/tests/memory-lightrag.test.mjs +153 -0
- package/bizar-dash/tests/memory-protocol-drift.test.mjs +45 -0
- package/bizar-dash/tests/memory-schema.test.mjs +198 -0
- package/bizar-dash/tests/memory-secrets.test.mjs +121 -0
- package/bizar-dash/tests/memory-store.test.mjs +390 -0
- package/bizar-dash/tests/memory-sync.test.mjs +141 -0
- package/bizar-dash/tests/mod-instructions.node.test.mjs +188 -0
- package/bizar-dash/tests/mod-security.test.mjs +273 -0
- package/bizar-dash/tests/mod-upgrade.node.test.mjs +357 -0
- package/bizar-dash/tests/no-agent-browser.node.test.mjs +98 -0
- package/bizar-dash/tests/obsidian-back-compat.test.mjs +199 -0
- package/bizar-dash/tests/opencode-runner.test.mjs +172 -0
- package/bizar-dash/tests/path-safe.test.mjs +108 -0
- package/bizar-dash/tests/providers-store-backup-keys.node.test.mjs +333 -0
- package/bizar-dash/tests/smoke-v2.mjs +212 -0
- package/bizar-dash/tests/strip-thinking.test.mjs +175 -0
- package/bizar-dash/tests/submit-feedback.test.mjs +353 -0
- package/bizar-dash/tests/tmux-wrap.test.mjs +145 -0
- package/bizar-dash/tests/yaml.test.mjs +128 -0
- package/bizar-dash/tsconfig.json +23 -0
- package/bizar-dash/vite.config.ts +27 -0
- package/cli/atomic.mjs +73 -0
- package/cli/banner.mjs +1 -1
- package/cli/bin.mjs +44 -47
- package/cli/bootstrap.mjs +1 -1
- package/cli/copy.mjs +25 -16
- package/cli/dev-link.mjs +17 -1
- package/cli/doctor.mjs +4 -4
- package/cli/doctor.test.mjs +2 -2
- package/cli/init.mjs +135 -1
- package/cli/install.mjs +31 -39
- package/cli/memory-constants.mjs +59 -0
- package/cli/memory.mjs +1436 -0
- package/cli/service.mjs +5 -6
- package/cli/utils.mjs +6 -3
- package/config/AGENTS.md +7 -7
- package/config/agents/_shared/AGENT_BASELINE.md +59 -61
- package/config/opencode.json +13 -38
- package/config/skills/memory-protocol/SKILL.md +105 -0
- package/config/skills/obsidian/SKILL.md +270 -65
- package/install.sh +59 -19
- package/package.json +49 -14
- package/packages/sdk/LICENSE +21 -0
- package/packages/sdk/README.md +80 -0
- package/packages/sdk/src/client.ts +183 -0
- package/packages/sdk/src/errors.ts +120 -0
- package/packages/sdk/src/events.ts +153 -0
- package/packages/sdk/src/index.ts +63 -0
- package/packages/sdk/src/types.ts +176 -0
- package/packages/sdk/src/version.ts +4 -0
- package/packages/sdk/tests/client.test.ts +217 -0
- package/packages/sdk/tests/errors.test.ts +108 -0
- package/packages/sdk/tests/events.test.ts +139 -0
- package/packages/sdk/tests/fixtures/fetch-mock.ts +152 -0
- package/packages/sdk/tests/fixtures/sse-mock.ts +30 -0
- package/packages/sdk/tsconfig.json +25 -0
- package/packages/sdk/vitest.config.ts +9 -0
- package/plugins/bizar/LICENSE +21 -0
- package/plugins/bizar/README.md +448 -0
- package/plugins/bizar/dist/index.js +29901 -0
- package/plugins/bizar/index.ts +1491 -0
- package/plugins/bizar/scripts/check-forbidden-imports.sh +33 -0
- package/plugins/bizar/src/background-state.ts +551 -0
- package/plugins/bizar/src/background.ts +1250 -0
- package/plugins/bizar/src/commands-impl.ts +464 -0
- package/plugins/bizar/src/commands.ts +1168 -0
- package/plugins/bizar/src/dashboard-client.ts +233 -0
- package/plugins/bizar/src/event-stream.ts +606 -0
- package/plugins/bizar/src/fingerprint.ts +120 -0
- package/plugins/bizar/src/handoff.ts +79 -0
- package/plugins/bizar/src/http-client.ts +467 -0
- package/plugins/bizar/src/key-rotation.ts +218 -0
- package/plugins/bizar/src/logger.ts +144 -0
- package/plugins/bizar/src/loop.ts +176 -0
- package/plugins/bizar/src/opencode-runner.ts +390 -0
- package/plugins/bizar/src/options.ts +421 -0
- package/plugins/bizar/src/plan-fs.ts +323 -0
- package/plugins/bizar/src/reasoning-clean.ts +454 -0
- package/plugins/bizar/src/report.ts +178 -0
- package/plugins/bizar/src/research-prompt.ts +35 -0
- package/plugins/bizar/src/serve-info.ts +228 -0
- package/plugins/bizar/src/serve.ts +496 -0
- package/plugins/bizar/src/settings.ts +349 -0
- package/plugins/bizar/src/state.ts +298 -0
- package/plugins/bizar/src/tools/bg-collect.ts +104 -0
- package/plugins/bizar/src/tools/bg-get-comments.ts +239 -0
- package/plugins/bizar/src/tools/bg-kill.ts +87 -0
- package/plugins/bizar/src/tools/bg-spawn.ts +401 -0
- package/plugins/bizar/src/tools/bg-status.ts +99 -0
- package/plugins/bizar/src/tools/open-kb.ts +191 -0
- package/plugins/bizar/src/tools/plan-action.ts +767 -0
- package/plugins/bizar/src/tools/read-glyph-feedback.ts +170 -0
- package/plugins/bizar/src/tools/wait-for-feedback.ts +402 -0
- package/plugins/bizar/tests/attach-handler-bug.test.ts +169 -0
- package/plugins/bizar/tests/background-state.test.ts +277 -0
- package/plugins/bizar/tests/background.test.ts +402 -0
- package/plugins/bizar/tests/block.test.ts +195 -0
- package/plugins/bizar/tests/canonical-key-order.test.ts +75 -0
- package/plugins/bizar/tests/commands-impl.test.ts +442 -0
- package/plugins/bizar/tests/commands.test.ts +584 -0
- package/plugins/bizar/tests/config.test.ts +122 -0
- package/plugins/bizar/tests/dashboard-client.test.ts +159 -0
- package/plugins/bizar/tests/dispose.test.ts +336 -0
- package/plugins/bizar/tests/event-stream.test.ts +409 -0
- package/plugins/bizar/tests/event.test.ts +262 -0
- package/plugins/bizar/tests/fingerprint.test.ts +162 -0
- package/plugins/bizar/tests/http-client.test.ts +404 -0
- package/plugins/bizar/tests/init-helpers.test.ts +203 -0
- package/plugins/bizar/tests/integration/slash-command.test.ts +348 -0
- package/plugins/bizar/tests/integration/tool-routing.test.ts +314 -0
- package/plugins/bizar/tests/key-rotation.test.ts +396 -0
- package/plugins/bizar/tests/loop.test.ts +397 -0
- package/plugins/bizar/tests/options.test.ts +276 -0
- package/plugins/bizar/tests/reasoning-clean.test.ts +422 -0
- package/plugins/bizar/tests/serve.test.ts +339 -0
- package/plugins/bizar/tests/settings.test.ts +351 -0
- package/plugins/bizar/tests/stall-think.test.ts +750 -0
- package/plugins/bizar/tests/state.test.ts +276 -0
- package/plugins/bizar/tests/tools/bg-collect.test.ts +337 -0
- package/plugins/bizar/tests/tools/bg-get-comments.test.ts +485 -0
- package/plugins/bizar/tests/tools/bg-kill.test.ts +235 -0
- package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +147 -0
- package/plugins/bizar/tests/tools/bg-spawn.test.ts +311 -0
- package/plugins/bizar/tests/tools/bg-status.test.ts +217 -0
- package/plugins/bizar/tests/tools/opencode-runner.test.ts +115 -0
- package/plugins/bizar/tests/tools/plan-action.test.ts +599 -0
- package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +253 -0
- package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +390 -0
- package/plugins/bizar/tests/update-deadlock.test.ts +145 -0
- package/plugins/bizar/tsconfig.json +29 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
# @polderlabs/bizar-dash — Changelog
|
|
2
|
+
|
|
3
|
+
## v3.19.0 — Obsidian vault + browser-harness agent + Plans→Artifacts rename
|
|
4
|
+
|
|
5
|
+
### Highlights
|
|
6
|
+
|
|
7
|
+
- **Plans renamed to Artifacts.** The old `Plans` tab is now `Artifacts`. The view, server route (`/api/artifacts`), store, CLI subcommand (`bizar artifact`), templates, and on-disk path are all renamed. Artifacts are what agents generate to surface design choices, options, or implementation paths — the user reviews them and approves/rejects/modifies. Same semantics, new naming.
|
|
8
|
+
- **Per-project Obsidian vault (`/api/obsidian/*`).** Every project now has an `.obsidian/` directory inside its worktree that gets git-tracked. The vault holds long-term agent memory (markdown notes with YAML frontmatter). Standard subdirs: `daily/`, `decisions/`, `patterns/`, `api/`, `tasks/`. Dashboard exposes CRUD + full-text search + auto-rebuild of `INDEX.md`. The Hindsight memory MCP server has been removed from BizarHarness entirely; Obsidian is the new long-term memory.
|
|
9
|
+
- **Ponytail mod** (npm: `@dietrichgebert/ponytail`). Records the active ponytail level (lite/full/ultra/off) in `.obsidian/ponytail/state.json` so any agent that reads the vault at session start picks it up. Dashboard view for switching the level. Install separately: `npx @dietrichgebert/ponytail install --scope=user`.
|
|
10
|
+
- **Impeccable mod** (npm: `impeccable`). Wraps `npx impeccable detect` and stores the last scan report in `.obsidian/impeccable/`. Dashboard view shows findings + stat cards. Install separately: `npx impeccable skills install -y --scope=user`.
|
|
11
|
+
- **`browser-harness` agent** (`config/agents/browser-harness.md`). Drives a headless Chromium via the Chrome DevTools Protocol for E2E verification, screenshots, smoke tests, and visual regression. Never edits code — reports findings with file:line references.
|
|
12
|
+
|
|
13
|
+
### Files added (1)
|
|
14
|
+
|
|
15
|
+
- `src/server/obsidian-store.mjs` — vault CRUD + search + init + INDEX rebuild
|
|
16
|
+
|
|
17
|
+
### Files added (route)
|
|
18
|
+
|
|
19
|
+
- `src/server/routes/obsidian.mjs` — `GET/POST /api/obsidian`, `GET/POST/DELETE /api/obsidian/notes`, `GET /api/obsidian/search`, `POST /api/obsidian/index`
|
|
20
|
+
|
|
21
|
+
### Files added (mods)
|
|
22
|
+
|
|
23
|
+
- `mods-examples/ponytail/{mod.json,route.mjs,web/index.html}` + mirrored in `bizar-mods/mods/ponytail/`
|
|
24
|
+
- `mods-examples/impeccable/{mod.json,route.mjs,web/index.html}` + mirrored in `bizar-mods/mods/impeccable/`
|
|
25
|
+
|
|
26
|
+
### Files added (agent)
|
|
27
|
+
|
|
28
|
+
- `config/agents/browser-harness.md`
|
|
29
|
+
|
|
30
|
+
### Test results
|
|
31
|
+
|
|
32
|
+
- `vite build`: succeeds; new features present in `dist/`
|
|
33
|
+
- `bun test tests/mod-security.test.mjs`: 26/26 pass (no regression)
|
|
34
|
+
- TypeScript: clean for the routes and mods; one phantom TS warning about a phantom literal that doesn't exist anywhere in source — Vite/esbuild compilation works regardless
|
|
35
|
+
|
|
36
|
+
## v3.18.0 — Settings tabs work + chat info panel hideable + mod install fix
|
|
37
|
+
|
|
38
|
+
### Highlights
|
|
39
|
+
|
|
40
|
+
- **Settings subnav is now a real tab strip** that hides non-matching sections via inline-style `display: none`. The v3.17.0 CSS-attribute-selector approach worked in isolation but a stale scroll-detection useEffect kept resetting the active tab. Now removed. URL hash deep-links (`#settings-theme`) still work.
|
|
41
|
+
- **Mod install from registry fixed.** `installFromRegistry` now accepts the `downloadUrl` field directly, plus tries both `mods/<id>/<version>/` and the flat `mods/<id>/` paths as fallbacks. `installFromUrl` also fetches `web/index.html` so mods with self-contained web views round-trip cleanly. The `bizar-mods` registry.json now includes `downloadUrl` pointing at the flat-path on GitHub.
|
|
42
|
+
- **Chat info panel (right sidebar) is hideable.** New "Info" button in the chat header toggles the right sidebar (Session info, Agents, Active MCPs, Slash commands). When hidden, a floating "Show info" restore button appears.
|
|
43
|
+
- **Version constant fixed.** The header used to show `v3.6.1` regardless of the actual installed version. Now reads `v3.18.0`.
|
|
44
|
+
|
|
45
|
+
## v3.17.0 — Settings section filter + graphify removed
|
|
46
|
+
|
|
47
|
+
### Highlights
|
|
48
|
+
|
|
49
|
+
- **Settings section filter.** v3.16.0's subnav scrolled to sections; v3.17.0 actually filters — clicking a subnav button shows ONLY that section, with a "Showing only X" banner and a one-click escape. URL hash deep-links (`#settings-theme`) still work.
|
|
50
|
+
- **graphify removed.** Deleted `src/server/routes/graph.mjs`, `src/web/views/Graph.tsx`, and the Graph tab from TABS + VIEW_MAP. Graph is now provided exclusively by the graphify mod (installable from the registry).
|
|
51
|
+
- **`dist/` rebuilt.** This version's UI features (settings filter) are present in the published `dist/` (v3.17.0 fixes the v3.16.0 invisibility regression from v3.16.2).
|
|
52
|
+
|
|
53
|
+
## v3.16.2 — Rebuild `dist/` so the v3.16.0 UI changes are actually served
|
|
54
|
+
|
|
55
|
+
> **Critical**: v3.15.0 through v3.16.1 all shipped `src/` changes but the `dist/` build was never regenerated. The dashboard's web UI is served from `dist/` (Vite output), not `src/`. Result: every UI change from v3.15.0 onward (activity log overhaul, settings subnav, chat floating input, mods registry browser, provider auto-detect banner) was invisible in the running dashboard — only the new server-side API routes were live. Fixed by running `vite build` and bumping to v3.16.2.
|
|
56
|
+
|
|
57
|
+
### Verification
|
|
58
|
+
|
|
59
|
+
`dist/assets/main-*.css` now contains: `settings-subnav`, `chat-input-floating`, `mods-registry`, `autodetect-banner`, `activity-hidden-banner`, `activity-log-table`. `dist/assets/main-*.js` contains `AutoDetect`, `ActivityLog`, etc.
|
|
60
|
+
|
|
61
|
+
## v3.16.1 — Hotfix: dashboard crash on `bizar dash start`
|
|
62
|
+
|
|
63
|
+
> **Critical bug**: `bizar dash start` failed with `The requested module '../state.mjs' does not provide an export named 'state'`. v3.15.0 and v3.16.0 both shipped this regression because `routes/activity.mjs` did `import { state } from '../state.mjs'`. The `state` object is created per-server-instance via `createState()` in `server.mjs:178` and threaded through `api.mjs` as a dependency — it's never a module-level export. Fixed by removing the bogus import and reading `state` from the factory function's argument (matching every other router).
|
|
64
|
+
|
|
65
|
+
### Files changed (1)
|
|
66
|
+
|
|
67
|
+
- `src/server/routes/activity.mjs` — removed `import { state } from '../state.mjs'`; uses `{ state }` from the factory parameter; added defensive 503 if state is missing.
|
|
68
|
+
|
|
69
|
+
## v3.16.0 — UI overhaul: settings subnav, chat floating input, mods registry browser, provider auto-detect
|
|
70
|
+
|
|
71
|
+
### Highlights
|
|
72
|
+
|
|
73
|
+
- **Settings subnav** — sticky horizontal nav with 13 sections (Theme, Layout, General, Service, Tailscale, Notifications, Auth, Agents, Dashboard, Background, Updates, Activity, About). Active section auto-highlights on scroll, click-to-scroll smooth-into-view.
|
|
74
|
+
- **Chat floating input** — composer wrapped in a glass-style sticky bottom box with accent border on focus and a backdrop-blur background. No UX changes other than positioning.
|
|
75
|
+
- **Providers moved into Config** — top-level Providers tab removed (lived in Config already).
|
|
76
|
+
- **Mods registry browser** — collapsible card-grid in the Mods tab. Each card shows name, version with upgrade badge, description, author, homepage, permissions, and an Install button that POSTs `{ id }` to `/api/mods`.
|
|
77
|
+
- **Provider auto-detect banner** — `Config → Providers` now has an AutoDetectBanner that scans env vars + opencode.json for 9 known providers (Anthropic, OpenAI, Google, Mistral, Groq, Cohere, OpenRouter, DeepSeek, MiniMax), validates key formats, optionally probes `/models` with 1.5s timeout, and lets you add configured providers to opencode.json with one click.
|
|
78
|
+
- **`GET /api/providers/auto-detect`** — JSON endpoint mirroring the banner.
|
|
79
|
+
|
|
80
|
+
### Files changed (8)
|
|
81
|
+
|
|
82
|
+
- `src/server/providers-store.mjs` — new `KNOWN_PROVIDERS` + `autoDetect({ probe })`.
|
|
83
|
+
- `src/server/routes/providers.mjs` — new `/providers/auto-detect` route.
|
|
84
|
+
- `src/web/App.tsx` — removed Providers from VIEW_MAP.
|
|
85
|
+
- `src/web/components/Topbar.tsx` — removed Providers tab + Cloud icon.
|
|
86
|
+
- `src/web/views/Chat.tsx` — `.chat-input-floating` wrapper.
|
|
87
|
+
- `src/web/views/Config.tsx` — new `AutoDetectBanner` component.
|
|
88
|
+
- `src/web/views/Mods.tsx` — registry browser state + UI.
|
|
89
|
+
- `src/web/views/Settings.tsx` — section IDs + subnav.
|
|
90
|
+
- `src/web/styles/main.css` — ~7 KB of new CSS.
|
|
91
|
+
|
|
92
|
+
### Test results
|
|
93
|
+
|
|
94
|
+
- `tsc --noEmit` passes.
|
|
95
|
+
- `bun test tests/mod-security.test.mjs` — 26/26 pass (no regression from v3.15.0).
|
|
96
|
+
|
|
97
|
+
## v3.15.0 — Activity log overhaul: hide from overview + full log in Settings
|
|
98
|
+
|
|
99
|
+
### Highlights
|
|
100
|
+
|
|
101
|
+
- **Hide from overview** — every Recent Activity card now has an X button to hide
|
|
102
|
+
it from the Overview feed. Hiding is **non-destructive**: the entry stays in
|
|
103
|
+
the full activity log, just out of the feed. A persistent "X items hidden"
|
|
104
|
+
banner with a one-click "Show them again" link surfaces the hidden set.
|
|
105
|
+
- **Hide all / Show all** — two new buttons in the activity header. "Hide all"
|
|
106
|
+
hides every currently-visible item; "Show all" restores everything.
|
|
107
|
+
- **Settings → Activity Log** — a new full-history card in Settings with a
|
|
108
|
+
filter box, "show hidden" toggle, restore-one / restore-all actions, and a
|
|
109
|
+
tabular log (200 rows visible, scroll for more). Backed by
|
|
110
|
+
`~/.cache/bizar/activity-hidden.json` for persistence.
|
|
111
|
+
- **New REST surface** — `/api/activity` (full log), `/api/activity/hidden`
|
|
112
|
+
(list), `/api/activity/hide` (POST + DELETE + DELETE/:key).
|
|
113
|
+
|
|
114
|
+
### Files added (1)
|
|
115
|
+
|
|
116
|
+
- `src/server/routes/activity.mjs`
|
|
117
|
+
|
|
118
|
+
### Files changed (4)
|
|
119
|
+
|
|
120
|
+
- `src/server/api.mjs` — mounts `createActivityRouter({ state })`.
|
|
121
|
+
- `src/web/views/Overview.tsx` — per-item hide button + banner + hide-all.
|
|
122
|
+
- `src/web/views/Settings.tsx` — new `ActivityLogCard` (filter + restore).
|
|
123
|
+
- `src/web/styles/main.css` — `.overview-feed-head-actions`,
|
|
124
|
+
`.activity-hidden-banner`, `.activity-feed-row-main`, `.activity-feed-hide-btn`,
|
|
125
|
+
`.activity-log-toolbar`, `.activity-log-table`, etc.
|
|
126
|
+
|
|
127
|
+
### Test results
|
|
128
|
+
|
|
129
|
+
- TypeScript: `tsc --noEmit` passes.
|
|
130
|
+
- Mod-security: 26/26 tests still pass (no regression from v3.14.0).
|
|
131
|
+
|
|
132
|
+
## v3.14.0 — Mod security layer + public mod registry
|
|
133
|
+
|
|
134
|
+
> **Security + ecosystem:** Mods now run with permission enforcement, integrity verification, and audit logging. New `/api/mods/registry` endpoint fetches the official mod registry from `DrB0rk/bizarre-mods`. Mods repo template + authoring guide added.
|
|
135
|
+
|
|
136
|
+
### Highlights
|
|
137
|
+
|
|
138
|
+
- **Mod security layer (`src/server/mod-security.mjs`).** Mods declare permissions in `mod.json`; the loader enforces them at every privileged action:
|
|
139
|
+
- **Filesystem sandboxing** — mods get scoped `readFileSync` / `writeFileSync` helpers. Paths outside `fs:read:<scope>` / `fs:write:<scope>` throw. Scope syntax: exact path, directory with implicit recursion, `/*` suffix, or `~/` home-relative.
|
|
140
|
+
- **Subprocess allowlist** — only whitelisted binaries (`bizar`, `opencode`, `python3`, `git`, `node`, `npm`, `pip`, `uv`, `headroom`, `jq`, `graphify`, `pipx`, `opencode-ai`) can be spawned without an explicit `process:spawn:<bin>` permission. Path-style binaries (`/bin/ls`) require explicit permission.
|
|
141
|
+
- **Integrity hash** — every mod's files are SHA-256-hashed at install time; the hash is stored under `_integrity` in `mod.json`. On every load the hash is recomputed; a mismatch triggers a critical warning and refuses to load the mod's routes until reinstalled.
|
|
142
|
+
- **Audit log** — every privileged action is logged as JSON lines to `~/.cache/bizar/logs/mod-audit.log` with timestamp, mod id, mod version, action, and details. Inspect via `GET /api/mods/audit?mod=<id>&limit=200`.
|
|
143
|
+
- **Public mod registry.** New `bizarre-mods` repo at `DrB0rk/bizarre-mods` is the canonical source of mods. `GET /api/mods/registry` fetches `registry.json` and annotates each entry with installed state and upgrade hints. `POST /api/mods { id }` installs from the registry.
|
|
144
|
+
- **Mods repo template.** New `templates/mod-template/` shows the canonical mod structure with `mod.json`, `route.mjs`, and `views/registry.json` examples.
|
|
145
|
+
- **Authoring guide.** New `docs/MOD-AUTHORING.md` covers permissions, route file shape, view registration, frontend-component caveats, and the PR submission checklist.
|
|
146
|
+
|
|
147
|
+
### Files added (3)
|
|
148
|
+
|
|
149
|
+
- `bizar-dash/src/server/mod-security.mjs` — permission parsing, fs sandbox, subprocess allowlist, integrity hash, audit writer.
|
|
150
|
+
- `bizar-dash/tests/mod-security.test.mjs` — 26 tests covering parsing, sandbox, allowlist, hashing, integrity verification, context creation.
|
|
151
|
+
|
|
152
|
+
### Files changed (3)
|
|
153
|
+
|
|
154
|
+
- `bizar-dash/src/server/mods-loader.mjs` — wires the security context into `loadModRouters`, computes and stores the integrity hash in `installFromPath`, exposes `installFromRegistry` and `fetchRegistry`. Mods whose integrity hash mismatches are refused at load time with a critical warning.
|
|
155
|
+
- `bizar-dash/src/server/routes/mods.mjs` — adds `GET /api/mods/registry`, `GET /api/mods/audit`, and a registry-aware install path on `POST /api/mods` (accepts `{ id }` OR `{ path }`).
|
|
156
|
+
- `bizar-dash/src/server/cli.mjs` — reordered `start` vs `--bg`/`--detach` dispatch (fixes `bizar dash start --bg` actually backgrounding).
|
|
157
|
+
|
|
158
|
+
### Companion repo (separate git repo)
|
|
159
|
+
|
|
160
|
+
- `bizarre-mods/` — `DrB0rk/bizarre-mods`. Contains `registry.json` listing available mods, `mods/graphify/` (the extracted graphify mod), `templates/mod-template/` (starter), and `docs/MOD-AUTHORING.md` (full guide). Configured as the default registry URL in `mods-loader.mjs:DEFAULT_REGISTRY_URL`.
|
|
161
|
+
|
|
162
|
+
### Test results
|
|
163
|
+
|
|
164
|
+
- New: 26 mod-security tests pass.
|
|
165
|
+
- Total: 282 plugin tests + 19 dashboard smoke tests still pass.
|
|
166
|
+
- TypeScript typecheck clean.
|
|
167
|
+
|
|
168
|
+
### v1 limitations (transparent)
|
|
169
|
+
|
|
170
|
+
A malicious mod could still bypass the sandbox by importing `node:fs` / `node:child_process` directly. v2 will close this gap with a `vm`-based sandbox or worker-thread isolation. Until then, the security layer makes the mod's *intent* explicit (declared permissions, audit trail, integrity hash) so users can review what they're installing and detect tampering.
|
|
171
|
+
|
|
172
|
+
## v3.13.0 — 2026-06-25
|
|
173
|
+
|
|
174
|
+
### Highlights
|
|
175
|
+
|
|
176
|
+
- **Knowledge-graph view (Graph tab).** New top-bar entry "Graph" with Network icon. Embeds the project's `.bizar/graph/graph.html` (graphify's interactive vis-network visualization) via an iframe. Shows live node/edge/community counts in the header; has a "Build / Rebuild" button that runs `bizar graph build` detached via the new `/api/graph/build` endpoint and polls `/api/graph/build/:jobId/status` until done. The button works offline — no LLM key required, falls through to the AST-cache path that ships with `@polderlabs/bizar` v3.15.0+.
|
|
177
|
+
|
|
178
|
+
- **`bizar dash start --bg` now actually backgrounds.** Previously the CLI dispatch checked `args.includes('--bg')` AFTER the `args[0] === 'start'` branch, so `bizar dash start --bg` always fell through to the foreground `startDashboard` and blocked. v3.13.0 checks `--bg` inside the `start` branch first and uses `startDashboard({ bg: true })` which returns after writing the PID/PORT files instead of blocking on a signal handler. The launching shell gets immediate control back; the dashboard keeps running in the spawned node process. Same fix for `--detach`.
|
|
179
|
+
|
|
180
|
+
### Files added (6)
|
|
181
|
+
|
|
182
|
+
- `bizar-dash/src/server/routes/graph.mjs` — `GET /status`, `GET /html`, `GET /report`, `POST /build`, `GET /build/:jobId/status`. Resolves `.bizar/graph/` from the active project (via `projectsStore.active()`), not from a request-controlled path.
|
|
183
|
+
- `bizar-dash/src/web/views/Graph.tsx` — view with stats header, "Build / Rebuild" button, build-poll loop, empty state for projects without a graph yet, and iframe-based rendering of `graph.html` via `/api/graph/html`.
|
|
184
|
+
|
|
185
|
+
### Files changed (4)
|
|
186
|
+
|
|
187
|
+
- `bizar-dash/src/server/api.mjs` — wires `createGraphRouter` into the v1 router.
|
|
188
|
+
- `bizar-dash/src/web/App.tsx` — adds `graph: Graph` to VIEW_MAP.
|
|
189
|
+
- `bizar-dash/src/web/components/Topbar.tsx` — adds `Graph` to TABS (Network icon, between `background` and `skills`).
|
|
190
|
+
- `bizar-dash/src/web/styles/main.css` — `.graph-building-banner`, `.graph-iframe-wrap`, `.graph-iframe`, `.graph-meta`, `.graph-empty-actions` (~60 lines).
|
|
191
|
+
- `bizar-dash/src/cli.mjs` — reordered `start` vs `--bg`/`--detach` dispatch; `startDashboard` accepts `bg` option and returns without blocking when set; added `detachAfterBoot()`.
|
|
192
|
+
|
|
193
|
+
### Compatibility
|
|
194
|
+
|
|
195
|
+
- Same wire format as v3.12.x — all existing endpoints unchanged.
|
|
196
|
+
- Requires `@polderlabs/bizar` v3.15.0+ for the `bizar graph build` CLI invoked by the Build button (older versions still work but don't have the offline cache fallback).
|
|
197
|
+
|
|
198
|
+
## v3.11.0 — 2026-06-23
|
|
199
|
+
|
|
200
|
+
### Added
|
|
201
|
+
- **Interactive file browser in the Add Project dialog.** New `GET /api/fs?path=<absolute>` endpoint returns a structured listing (`{ path, parent, entries[] }`) for the file picker. Server-side allow-list enforces `os.homedir()` + the configured `dashboard.projectsDirectory`; first-level dotdirs under home (`.ssh`, `.aws`, …) are blocked as roots and silently filtered from listings. All filesystem errors map to structured JSON (`not_found` / `permission_denied` / `not_a_directory` / `forbidden`).
|
|
202
|
+
- **New setting: `dashboard.projectsDirectory`** (string, default `''`). When set, the server will scan it for project roots on startup and the `POST /api/projects/scan` endpoint will rescan on demand. Detection: a directory counts as a project if it contains any of `.git/`, `.bizar/`, `package.json`, `Cargo.toml`, `pyproject.toml`, `go.mod`, `pom.xml`, `build.gradle`, `build.gradle.kts`. One-level scan only — won't recurse into detected projects.
|
|
203
|
+
- **`projectsStore.scanDirectory(rootDir)`** — public method that walks one level deep, stats each marker per child (catching per-file errors), and adds detected projects via the existing `add()` path. Idempotent. Returns `{ added, skipped, scanned, error? }`.
|
|
204
|
+
- **`POST /api/projects/scan`** — validates that the configured `projectsDirectory` lives under home (rejects with `forbidden` otherwise), runs `scanDirectory()`, and broadcasts a `project:change` event with `kind: 'added'` for each newly registered project so connected clients refresh immediately.
|
|
205
|
+
|
|
206
|
+
### Files
|
|
207
|
+
- `bizar-dash/src/server/routes/fs.mjs` — **new** — `createFsRouter({ state })` factory; `GET /api/fs` handler.
|
|
208
|
+
- `bizar-dash/src/server/lib/path-safe.mjs` — **new** — `resolveSafePath`, `defaultAllowedRoots`, `isDotRoot` helpers shared between `fs.mjs` and the scan route.
|
|
209
|
+
- `bizar-dash/src/server/routes/_shared.mjs` — `DEFAULT_SETTINGS.dashboard` gains `projectsDirectory: ''` (default value is empty so existing installs see no change).
|
|
210
|
+
- `bizar-dash/src/server/routes/projects.mjs` — adds `POST /api/projects/scan`.
|
|
211
|
+
- `bizar-dash/src/server/projects-store.mjs` — adds `PROJECT_ROOT_MARKERS` const + `scanDirectory(rootDir, { maxDepth })` method; adds `node:fs/promises` import.
|
|
212
|
+
- `bizar-dash/src/server/api.mjs` — mounts `createFsRouter` immediately after the projects router.
|
|
213
|
+
- `bizar-dash/src/server/server.mjs` — fires a one-shot `scanDirectory()` on startup when the setting is set; logs added/skipped/scanned counts; never blocks boot.
|
|
214
|
+
|
|
215
|
+
### Verified
|
|
216
|
+
- `node --check` passes for every modified/new server file.
|
|
217
|
+
- TypeScript (no server-side changes affect frontend types).
|
|
218
|
+
|
|
219
|
+
### Security hardening
|
|
220
|
+
|
|
221
|
+
- Added `dashboard.allowedRoots: string[]` setting — operators can
|
|
222
|
+
declare additional filesystem roots (e.g., `/workspace`,
|
|
223
|
+
`/srv/projects`) beyond `os.homedir()` for the file browser and
|
|
224
|
+
project scanner. Each entry must itself be inside home; entries
|
|
225
|
+
that escape are silently dropped server-side.
|
|
226
|
+
- Added `POST /api/fs/mkdir` to allow creating project directories
|
|
227
|
+
from the file browser. Parent must be in the allow-list; name is
|
|
228
|
+
validated against a denylist of unsafe characters; returns 409 if
|
|
229
|
+
the entry already exists.
|
|
230
|
+
- `GET /api/fs` now caps responses at 500 entries and reports a
|
|
231
|
+
`truncated` flag plus `totalEntries` so huge directories
|
|
232
|
+
(`node_modules`, Go module cache) don't OOM the browser.
|
|
233
|
+
- `PUT /api/settings` now validates `dashboard.projectsDirectory`
|
|
234
|
+
and `dashboard.allowedRoots` server-side, rejecting unsafe values
|
|
235
|
+
with a structured 400 instead of writing them to disk.
|
|
236
|
+
- **Frontend:** live warnings on the `allowedRoots` textarea mirror the server's validation; pre-flight path check in the Add Project dialog prevents 404s on stale selections.
|
|
237
|
+
|
|
238
|
+
### Background agent dispatch fix
|
|
239
|
+
|
|
240
|
+
- Fixed root cause: `pingOpencodeServe` was returning false for a
|
|
241
|
+
live opencode serve instance because (a) it pings an HTTP
|
|
242
|
+
endpoint that requires Basic auth and any auth-quirk (stale
|
|
243
|
+
password file, version mismatch, wrong realm) made the probe
|
|
244
|
+
fail with 401 even though the opencode process was perfectly
|
|
245
|
+
healthy and answering other requests, AND (b) `readServeInfo`
|
|
246
|
+
had a strict 6-field schema that returned `null` when the
|
|
247
|
+
on-disk `serve.json` only contained `{password, pid, port}` —
|
|
248
|
+
which is what the current plugin build actually writes. The
|
|
249
|
+
null then cascaded into `dispatchToBackground` short-circuiting
|
|
250
|
+
on the `if (serveInfo && serveReachable)` guard at
|
|
251
|
+
`task-delegator.mjs:563`, marking every new bg instance as
|
|
252
|
+
`dispatchPending: true` and never creating a tmux session.
|
|
253
|
+
Now uses a TCP-connect port-open check via
|
|
254
|
+
`net.createConnection` (so the probe does not depend on HTTP
|
|
255
|
+
auth or endpoint shape) and the read schema derives `baseUrl`
|
|
256
|
+
from `port` when missing, with `worktree`/`startedAt`
|
|
257
|
+
defaulting to empty/`0` rather than failing the read.
|
|
258
|
+
- Fixed path-concatenation fragility for the bg `worktree`
|
|
259
|
+
fallback: `task-delegator.mjs` now uses `projectRoot` as a
|
|
260
|
+
fallback for the opencode serve's `?directory=` query param
|
|
261
|
+
when serve-info omits `worktree`, so spawns succeed even on
|
|
262
|
+
installs where the plugin has not yet written a full serve.json.
|
|
263
|
+
- Added `lib/path-safe.mjs` helpers (`deriveAbsoluteBgLogPath`,
|
|
264
|
+
`isBrokenBgLogPath`) that always produce an absolute path
|
|
265
|
+
(falling back to `~/.cache/bizar/logs/<id>.log`) and detect the
|
|
266
|
+
`//.opencode/log/...` shape produced when an older plugin build
|
|
267
|
+
concatenated an empty `worktree` to the logPath.
|
|
268
|
+
- Added a periodic retry loop (`bg-retry.mjs`, every 30s, started
|
|
269
|
+
by `server.mjs` on boot) that re-runs dispatch for any bg
|
|
270
|
+
instance stuck in `dispatchPending: true` with
|
|
271
|
+
`toolCallCount === 0` for more than 30 seconds. Caps each
|
|
272
|
+
instance at 10 retries before marking it as `failed` with
|
|
273
|
+
`error: "exceeded max dispatch retries"`. Repairs broken
|
|
274
|
+
logPath values atomically before re-dispatching.
|
|
275
|
+
- Added `POST /api/background/:id/retry` for manual unstick —
|
|
276
|
+
resets `retryCount: 0`, `dispatchPending: true`, and calls
|
|
277
|
+
`retryDispatchOnce` immediately without waiting for the next
|
|
278
|
+
periodic tick.
|
|
279
|
+
|
|
280
|
+
### Files
|
|
281
|
+
- `bizar-dash/src/server/routes/_shared.mjs` — `DEFAULT_SETTINGS.dashboard` gains `allowedRoots: []`; new `validateDashboardSettings()` + `writeSettings()` now validates before persisting.
|
|
282
|
+
- `bizar-dash/src/server/lib/path-safe.mjs` — new `buildAllowedRootsFromSettings({ settings, home })` helper.
|
|
283
|
+
- `bizar-dash/src/server/routes/fs.mjs` — `POST /api/fs/mkdir`; `GET /api/fs` now caps at 500 entries and reports `truncated` / `totalEntries`; switched to the new `buildAllowedRootsFromSettings` helper.
|
|
284
|
+
- `bizar-dash/src/server/routes/projects.mjs` — `POST /api/projects/scan` uses the expanded allow-list.
|
|
285
|
+
- `bizar-dash/src/server/server.mjs` — startup scan rebuilds and logs the allow-list, re-validates the configured `projectsDirectory`.
|
|
286
|
+
|
|
287
|
+
## v3.5.4 — 2026-06-19
|
|
288
|
+
|
|
289
|
+
### Changed
|
|
290
|
+
- **Activity page fully overhauled — now a live timeline.** The v3.5.2 graph-of-all-agents view has been replaced with a Gantt-style time-axis timeline:
|
|
291
|
+
- X-axis is time (1m / 5m / 30m / 1h zoom levels); Y-axis is lanes (one per BG instance + tasks assigned greedily)
|
|
292
|
+
- Tasks rendered as bars: pulsing border for `doing`, translucent dashed for `queued`, faded for `done`
|
|
293
|
+
- Vertical red "now" line updates every second and re-anchors when it nears the right edge
|
|
294
|
+
- Live event stream (left column) and detail panel (right column when a bar is clicked) are now proper sibling grid columns — no more absolute-positioned overlays obscuring the canvas
|
|
295
|
+
- Mobile: stream collapses to a toggleable drawer; detail panel slides up from the bottom
|
|
296
|
+
- Polling cadence: `/background` + `/activity` every 3s; now-line redraw every 1s
|
|
297
|
+
|
|
298
|
+
### Fixed
|
|
299
|
+
- **Plans canvas appeared blank when opening a plan.** Root cause: `.plans-canvas-wrap` had no `flex: 1` or `height: 100%`, so its absolutely-positioned `.canvas-root` child had nothing to anchor to and collapsed to toolbar height. Fixed by adding `flex: 1; height: 100%` to `.plans-canvas-wrap`, making `.plan-canvas-wrapper` a proper flex column, and changing `.canvas-root` from `position: absolute; inset: 0` to `position: relative; flex: 1; min-height: 0` so it claims remaining flex space.
|
|
300
|
+
|
|
301
|
+
### Cleanup
|
|
302
|
+
- Removed 121 lines of dead duplicate Activity CSS at `main.css:3499-3619` (the v3.3.2 absolute-positioned block that conflicted with the v3.3.1 flex version at line 4751+). The v3.5.4 rewrite uses entirely new class names (`.tl-*` prefix) so the old `.activity-canvas-*` and `.activity-timeline-*` rules are no longer referenced anywhere.
|
|
303
|
+
|
|
304
|
+
### Files
|
|
305
|
+
- `bizar-dash/src/web/views/Activity.tsx` — full rewrite (761 → 1155 lines)
|
|
306
|
+
- `bizar-dash/src/web/styles/main.css` — appended `/* v3.5.4 Activity timeline view */` block (lines 5819-6356); removed dead v3.3.2 Activity block (lines 3499-3619)
|
|
307
|
+
|
|
308
|
+
## v3.4.0 — 2026-06-19
|
|
309
|
+
|
|
310
|
+
### Fixed
|
|
311
|
+
- **Pervasive theme bug — all colors + shadows now respond to theme change**. Audit of every hardcoded `rgba(...)` in `main.css`. Replaced with theme-aware CSS variables: `--accent-glow`, `--accent-soft`, `--success-soft`, `--error-soft`, `--warning-soft`, `--overlay-bg`, `--shadow-color-strong`. Sidebar text, drop shadows, modal backdrops, status pills, badge borders, focus rings all switch correctly between dark/light.
|
|
312
|
+
|
|
313
|
+
### Added
|
|
314
|
+
- **Config page rewrite — sidebar nav + fully editable Providers/MCPs**: two-column layout with left nav (OpenCode / Providers / MCPs / Diagnostics / Export). Add, edit, delete, toggle for both providers and MCPs through proper modal forms.
|
|
315
|
+
- **MCP store — supports new opencode.json format**: handles `command: [...]` array, `type: "remote"` with `url`/`headers`/`oauth`, and the legacy `command: "string"` + `args: [...]` shape.
|
|
316
|
+
- **Tasks horizontal kanban**: 4 columns side-by-side with horizontal scroll fallback on narrow viewports.
|
|
317
|
+
- **Tasks compact toolbar**: single-row layout with grouped Search / Filter / Sort labels + actions on the right.
|
|
318
|
+
- **Activity visual timeline canvas**: new "Timeline" mode (alongside Graph view). X-axis = time, Y-axis = lane per agent. Event kind filter, zoom controls, hover tooltips, click-to-detail.
|
|
319
|
+
- **Overview — big no-frame hero**: 48px gradient title, 160px min-height textarea, glow focus ring, quick-action chips.
|
|
320
|
+
- **History view (new tab)**: cross-project history with time range filter, per-project expandable timelines, JSON export.
|
|
321
|
+
- **New `/api/history` endpoint** with `?since=` + `?limit=` query params.
|
|
322
|
+
|
|
323
|
+
### Changed
|
|
324
|
+
- `about.version` → `3.4.0` in `api.mjs`; `VERSION` → `v3.4.0` in `App.tsx`; diagnostics-store `version` → `3.4.0`.
|
|
325
|
+
|
|
326
|
+
### Verified
|
|
327
|
+
- TypeScript: 0 errors.
|
|
328
|
+
- Vite build: success (537 KB JS, 85 KB CSS).
|
|
329
|
+
- Existing test suite: 140/140 pass.
|
|
330
|
+
|
|
331
|
+
## v3.3.0 — 2026-06-19
|
|
332
|
+
|
|
333
|
+
### Fixed
|
|
334
|
+
- **Mods page broken**: Mods view always loaded stale snapshot data. Now fetches fresh from `/api/mods` on mount so newly installed mods appear immediately without a full page refresh.
|
|
335
|
+
- **Chat redirect after actions**: "Submit to Odin" modal now calls `preventDefault()`/`stopPropagation()` on the submit handler to prevent a stray click/key-repeat from triggering digit-key tab switches after modal close. App keyboard handler also gates digit shortcuts with a 250ms `safeUntil` window after any click.
|
|
336
|
+
|
|
337
|
+
### Added
|
|
338
|
+
- **Notifications system** (`notifications-store.mjs` + `/api/notifications*`): Per-user append-only notification stream at `~/.config/bizar/notifications.jsonl`. Endpoints: `GET /notifications`, `POST /notifications/:id/read`, `POST /notifications/read-all`, `DELETE /notifications/:id`. Task completion and blocking automatically fire notifications. Bell icon component (`Notifications.tsx`) with severity icons, unread badge, mark-read, mark-all, and dismiss.
|
|
339
|
+
- **`POST /api/tasks/:id/progress`**: Agents can push `{ progress, step, agent }` updates to paint live progress bars in the Tasks view via WebSocket `task:progress` events.
|
|
340
|
+
- **`GET /api/activity/session`**: Activity events scoped to the last hour (or `?since=<iso>`), with a list of agent names that participated in the session. Powers the Activity canvas session-filtering (UI pending).
|
|
341
|
+
- **Custom themes API** (`state.mjs` + `/api/themes*`): `GET /api/themes` lists saved themes; `POST /api/themes` saves a named theme; `DELETE /api/themes/:name` removes one. Themes stored at `~/.config/bizar/themes.json`.
|
|
342
|
+
- **Skills collapsible categories** (`Skills.tsx`): Category filter buttons above the skills grid. `GET /api/skills?category=foo` filters server-side. Category list loaded from `skillsStore.CATEGORIES`.
|
|
343
|
+
- **`POST /api/plans/:slug/questions/:qid/respond`**: Records a user's choice on a canvas question element, marks it resolved, drops a notification for the agent, and broadcasts `plan:change`.
|
|
344
|
+
- **Task notifications on completion/block**: `PATCH /api/tasks/:id/status` now fires a `success` notification when status→`done` and a `warning` notification when status→`blocked`.
|
|
345
|
+
- **`CrossViewState` type + `crossState` prop** in App shell: Scratch state channel for cross-view handoffs (e.g. "Open in chat" from Agents tab) without URL state.
|
|
346
|
+
|
|
347
|
+
### Changed
|
|
348
|
+
- `about.version` → `3.3.0` in `api.mjs`; `VERSION` → `v3.3.0` in `App.tsx`; diagnostics-store `version` → `3.3.0`.
|
|
349
|
+
- `DEFAULT_SETTINGS.theme` gains `animations` and `compactMode` fields.
|
|
350
|
+
- `Task` type gains `progress`, `currentStep`, `progressAgent`, `progressHistory` fields surfaced from `metadata`.
|
|
351
|
+
|
|
352
|
+
### Verified
|
|
353
|
+
- TypeScript: 0 errors.
|
|
354
|
+
- Build: passes.
|
|
355
|
+
- API smoke test: `/api/health`, `/api/notifications`, `/api/projects`, `/api/agents` all return 2xx.
|
|
356
|
+
- `cli/plan.test.mjs`: 140 tests, all pass.
|
|
357
|
+
|
|
358
|
+
## v3.2.2 — 2026-06-19
|
|
359
|
+
|
|
360
|
+
### Fixed
|
|
361
|
+
- **npm install no longer requires allow-scripts approval** for the parent `@polderlabs/bizar` package. Setup now self-bootstraps on first bin invocation.
|
|
362
|
+
|
|
363
|
+
## v3.2.1 — 2026-06-19
|
|
364
|
+
|
|
365
|
+
### Added
|
|
366
|
+
- **Install prompts**: `npm install -g @polderlabs/bizar` now prompts to install `@polderlabs/bizar-plugin` (required for /bizar in opencode) and `@polderlabs/bizar-dash` (optional web/TUI dashboard). Defaults to yes. Set `BIZAR_SKIP_OPTIONAL_INSTALLS=1` to skip. Non-TTY environments skip prompts automatically.
|
|
367
|
+
|
|
368
|
+
## v3.2.0 — 2026-06-19
|
|
369
|
+
|
|
370
|
+
### Fixed
|
|
371
|
+
- **Redirect-to-home on click**: digit-key shortcuts (`1`, `2`, …) firing inside any form control / dialog / contenteditable region. Shell's `App.tsx` keyboard handler now bails out on focusable elements (`<input>`, `<textarea>`, `<select>`, `<button>`, `<option>`, `<label>`, `[contenteditable]`) and on targets inside `<form>`, `[role="dialog"]`, `[contenteditable]`, `[data-no-key]`. Also short-circuits when `Shift` is held.
|
|
372
|
+
- **`/api/agents/hierarchy` returned 404**. Route was declared *after* `/agents/:name`, so Express matched it as an agent name. Reordered so `/agents/stuck` and `/agents/hierarchy` are mounted before the `:name` catch-all.
|
|
373
|
+
|
|
374
|
+
### Added
|
|
375
|
+
- **Task delegation** (`task-delegator.mjs`): `POST /api/tasks/submit` accepts `{ title, description, priority, tags }` from the Tasks view's "Submit to Odin" modal. Splits into ≤5 subtasks using heuristic keywords (`implement / test / docs / design / research / refactor`), assigns each to the best-fit agent via rule-of-thumb matching, and best-effort dispatches via the plugin CLI to the bg infrastructure.
|
|
376
|
+
- **Background agents via tmux** (`background-store.mjs`): `GET /api/background`, `GET /api/background/:id`, `GET /api/background/:id/output?lines=`, `POST /api/background/:id/message`, `DELETE /api/background/:id`. Walks `~/.cache/bizar/bg/`, `~/.config/opencode/bg/`, `~/.bizar/bg/` for instance state files; enriches with live tmux session info.
|
|
377
|
+
- **Agent hierarchy**: `GET /api/agents/hierarchy` returns a tree. 13 agents mapped to levels 0–3. New `level` / `parent` / `role` fields on `Agent` type and on every snapshot.
|
|
378
|
+
- **Activity canvas + detail panel**: new `src/web/views/Activity.tsx` (690 LoC). Pan/zoom SVG, three node kinds (agent / task / bg) with status-tinted borders, three edge kinds (hierarchy / assignment / subtask), grid background, zoom controls, legend, and a 360px right-side detail panel with meta + (for bg) live output + send/kill + (for all) per-node activity log + comment thread + create-follow-up-task form.
|
|
379
|
+
- **Activity log + comments**: `activity-log.mjs` writes a JSONL append-only log at `~/.config/opencode/activity.jsonl` (auto-rotates at 5MB). `GET /api/activity[?nodeId|kind]`, `POST /api/activity`, `POST /api/comments` (node-scoped), `POST /api/nodes/:nodeId/tasks` (creates a task tagged with the node id).
|
|
380
|
+
- **`data-task-parent` attribute** on task cards, for cross-references in the canvas / parent relationships in the future.
|
|
381
|
+
|
|
382
|
+
### Changed
|
|
383
|
+
- `api.mjs` — `about.version` → `3.2.0`; all new routes added; route order fixed.
|
|
384
|
+
- `App.tsx` — imports + mounts `Activity`; broader digit-key guard; `VERSION` → `v3.2.0`.
|
|
385
|
+
- `Topbar.tsx` — adds the Activity tab.
|
|
386
|
+
- `types.ts` — `Agent` gains `level` / `parent` / `role`; `Task` gains `subtasks` (string[]) and `metadata` (Record).
|
|
387
|
+
- `agents-store.mjs` — `HIERARCHY` map + `buildHierarchyTree(agents)` helper.
|
|
388
|
+
- `tasks-store.mjs` — `subtasks` and `metadata` on create; metadata merges on update.
|
|
389
|
+
- `diagnostics-store.mjs` — `version` → `3.2.0`.
|
|
390
|
+
- `main.css` — +340 lines for `.view-activity` / `.activity-canvas` / `.activity-detail` / zoom controls / legend / per-node panel.
|
|
391
|
+
|
|
392
|
+
### Verified
|
|
393
|
+
- Type-check: 0 errors.
|
|
394
|
+
- Build: passes.
|
|
395
|
+
- Smoke tests: `/api/health`, `/api/tasks/submit`, `/api/agents/hierarchy`, `/api/background`, `/api/activity`, `/api/agents`, `/api/projects`, `/api/search`, `/api/diagnostics`, `/api/comments` all return 2xx.
|
|
396
|
+
- The global install at `~/.local/npm/lib/node_modules/@polderlabs/bizar-dash` was synced in place (no publish).
|
|
397
|
+
|
|
398
|
+
## v3.1.1 — 2026-06-19
|
|
399
|
+
|
|
400
|
+
### Fixed
|
|
401
|
+
- **Sidebar (and topbar) disappeared on chat/plans/skills tabs.** The "fullscreen" CSS used `position: fixed; inset: 0; z-index: 5` which covered the entire viewport including the sidebar. Now these views fill the content area (`flex: 1`) while the sidebar and topbar stay visible above.
|
|
402
|
+
|
|
403
|
+
## v3.0.3 — 2026-06-19
|
|
404
|
+
|
|
405
|
+
### Fixed
|
|
406
|
+
- **Sidebar layout broken in `topnav` / `sidebar` / `both` modes.** The CSS at `src/web/styles/main.css:3130-3144` set `.app[data-layout="sidebar"] { display: grid; grid-template-columns: 200px 1fr; }` and tried to hide the topbar `.tabs`, but there was no actual `<aside>` element — the grid created a 200px gap with nothing in it, the topbar tabs were hidden, and the content area was squeezed or overlapped the topbar. Now there's a real `Sidebar` component (`src/web/components/Sidebar.tsx`) that renders when `layout !== 'topnav'`. The shell is now flex-based: `.app` → `.topbar` → `.layout-body` (flex row) → `[<Sidebar />] <main.content>`. The topbar tabs row is conditionally rendered via a new `showTabs` prop (false in sidebar/both modes). Mobile (≤900px) collapses the sidebar to a fixed drawer.
|
|
407
|
+
- **Chat composer squished.** The `<textarea className="chat-input">` lived in a single `.chat-composer-row` with the agent selector, model input, attach button, and Send button all competing for horizontal space. The composer is now a proper floating chatbox at the bottom of `.chat-main`: a `.chat-composer-toolbar` row on top (agent + model + attach + keyboard hint) and a `.chat-composer-input` row below (full-width `<textarea>` + square Send button). The textarea auto-grows up to 240px via `useLayoutEffect`.
|
|
408
|
+
- **Config "Advanced" section clipping.** Tabs didn't wrap, panels were tiny, at narrow widths things overlapped. Now the section uses a proper collapsible header (chevron + title + description), the tabs wrap (`flex-wrap: wrap`), the body has `min-height: 320px`, and the JSON editor collapses to single column under 1100px. The editor panel was extracted into a `ConfigEditorPanel` component.
|
|
409
|
+
- **Comprehensive UI polish.** Consolidated duplicate `.chat-list` / `.chat-composer` / `.chat-input` CSS rules; removed dead `.tabs` rules in favour of `.tabs-row`; added focus rings on chat input/selects/attach button; added smooth 120ms transitions on hover/focus; `.view-chat` and `.view-config` now fill their parent's height so the floating chat layout has space to fill.
|
|
410
|
+
|
|
411
|
+
### Added
|
|
412
|
+
- `src/web/components/Sidebar.tsx` — new vertical nav rail component with proper `role="tablist"` / `role="tab"` semantics, hover/active transitions, ellipsised labels.
|
|
413
|
+
|
|
414
|
+
### Changed
|
|
415
|
+
- `src/web/App.tsx` — restructured with `<div className="layout-body">` wrapping `<Sidebar />` (conditional) + `<main className="content">`. `VERSION` constant bumped to `v3.0.3`.
|
|
416
|
+
- `src/web/components/Topbar.tsx` — two-row layout: `.topbar-row` (56px fixed: brand + project selector + search + ws status) + optional `.tabs-row`. New `showTabs?: boolean` prop (default `true`).
|
|
417
|
+
- `src/web/views/Chat.tsx` — composer restructured (toolbar + input row, full-width textarea, square send button, auto-grow).
|
|
418
|
+
- `src/web/views/Config.tsx` — Advanced section is a proper collapsible card with icon + title + description + chevron. `ConfigEditorPanel` extracted.
|
|
419
|
+
- `src/web/styles/main.css` — major pass:
|
|
420
|
+
- Replaced broken 200px grid with proper flex layout (`.layout-body`).
|
|
421
|
+
- Added `.sidebar` / `.sidebar-nav` / `.sidebar-tab` / `.sidebar-tab-active` styles.
|
|
422
|
+
- Added `.topbar-row` / `.tabs-row` for the slim two-row topbar.
|
|
423
|
+
- Added `.chat-composer-toolbar` / `.chat-composer-input` / `.send-btn` / `.attach-btn` / `.toolbar-spacer` / `.hint` for the floating composer.
|
|
424
|
+
- Consolidated `.chat-list` / `.chat-composer` / `.chat-input` definitions (removed legacy v2.6.0 duplicates).
|
|
425
|
+
- Added `.config-advanced` / `.config-advanced-head` / `.config-advanced-body` / `.config-advanced-tabs` / `.config-advanced-panel` for the collapsible advanced section.
|
|
426
|
+
- Chat layout collapses to single column under 1200px.
|
|
427
|
+
- Sidebar collapses to fixed drawer under 900px (mobile).
|
|
428
|
+
- `src/server/api.mjs` and `src/server/diagnostics-store.mjs` — version bumped from `3.0.0` to `3.0.3`.
|
|
429
|
+
- `src/web/views/Settings.tsx` — fallback `about.version` bumped to `3.0.3`.
|
|
430
|
+
|
|
431
|
+
### Verified
|
|
432
|
+
- `npx tsc --noEmit` — no errors.
|
|
433
|
+
- `npm run build` — builds cleanly: 52.7 kB CSS, 437 kB JS.
|
|
434
|
+
- Dashboard smoke test (`node src/cli.mjs start` + curl) — HTML 200, assets serve 200, new classes (`sidebar-tab`, `tabs-row`, `chat-composer-toolbar`, `send-btn`, `config-advanced-head-title`) present in bundles.
|
|
435
|
+
- Existing test suite (`node --test cli/plan.test.mjs`) — 140/140 pass.
|
|
436
|
+
|
|
437
|
+
## v3.0.0 — 2026-06-19
|
|
438
|
+
|
|
439
|
+
Initial release as a separate package.
|
|
440
|
+
|
|
441
|
+
### Highlights
|
|
442
|
+
- Web + TUI dashboard for the Bizar agent platform.
|
|
443
|
+
- 10 tabs: Overview, Chat, Agents, Plans, Tasks, Mods, Schedules,
|
|
444
|
+
Config, Settings.
|
|
445
|
+
- Floating chat with sessions rail + right info sidebar.
|
|
446
|
+
- Mods system: install, enable / disable, view files.
|
|
447
|
+
- Schedules view with cron / interval / once support.
|
|
448
|
+
- Project selector in the topbar; per-project tasks / plans /
|
|
449
|
+
schedules / sessions.
|
|
450
|
+
- Diagnostics card + collapsible Advanced config editor.
|
|
451
|
+
- Theme colors + UI layout customization.
|
|
452
|
+
- Tailscale serve config in Settings.
|
|
453
|
+
- Fuzzy search (⌘/Ctrl+K) across tasks, plans, agents, projects,
|
|
454
|
+
mods, schedules, commands.
|
|
455
|
+
- Editable agents (CRUD on `~/.config/opencode/agents/*.md`).
|
|
456
|
+
- Tasks: subtasks, dependencies, time tracking, recurring, comments,
|
|
457
|
+
activity log.
|
|
458
|
+
- OpenCode providers + MCPs management.
|
|
459
|
+
- 100% backwards compatible with v2.7.0's opencode.json format.
|
|
460
|
+
|
|
461
|
+
### Install
|
|
462
|
+
```bash
|
|
463
|
+
npm install -g @polderlabs/bizar # core runtime (peer)
|
|
464
|
+
npm install -g @polderlabs/bizar-dash # this package
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
### Run
|
|
468
|
+
```bash
|
|
469
|
+
bizar-dash start # foreground
|
|
470
|
+
bizar-dash start --bg # detached
|
|
471
|
+
bizar-dash tui --no-web # terminal dashboard
|
|
472
|
+
bizar-dash stop # kill it
|
|
473
|
+
bizar-dash status # port + URL
|
|
474
|
+
```
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Chat UI — Design Spec
|
|
2
|
+
|
|
3
|
+
> Implementation reference for the chat UI overhaul. The detailed audit is at `/tmp/opencode/chat-ui-deep-audit.md`. This file is the brief — read the audit for line-level detail.
|
|
4
|
+
|
|
5
|
+
## Vision
|
|
6
|
+
|
|
7
|
+
A focused, dark, modern chat surface — Gemini-Advanced-inspired. Sessions and info panels slide out of the way when the conversation matters; the thread dominates with a floating pill composer and a personal greeting on first run. The aesthetic is calm and minimal: pure dark surfaces, gradient text accents on the greeting, suggestion cards as the entry point.
|
|
8
|
+
|
|
9
|
+
Reference: the Gemini Advanced "Hello, [name]. How can I help you today?" screen.
|
|
10
|
+
|
|
11
|
+
## Aesthetic direction
|
|
12
|
+
|
|
13
|
+
**Gemini-inspired dark minimalism** — Pure dark surfaces (#0e0e10 baseline), thin hairlines, large display typography for the greeting with gradient color accents (blue→purple for "Hello,", pink→red for the name), suggestion cards as the entry point, pill-shaped floating composer anchored at the bottom. No gradients on surfaces. No glassmorphism. No decorative motion — only functional state changes.
|
|
14
|
+
|
|
15
|
+
## Tokens (extended from existing main.css:101-188)
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
--surface-0: #0e0e10 (page bg — pure dark, NOT pure black)
|
|
19
|
+
--surface-1: #18181b (cards, raised surfaces)
|
|
20
|
+
--surface-2: #27272a (hover, active)
|
|
21
|
+
--border: rgba(255, 255, 255, 0.08)
|
|
22
|
+
--border-strong: rgba(255, 255, 255, 0.16)
|
|
23
|
+
--text: #ececf1
|
|
24
|
+
--text-muted: #8e8ea0
|
|
25
|
+
--accent: #8b5cf6 (existing purple)
|
|
26
|
+
--gradient-hello: linear-gradient(90deg, #4285f4 0%, #8b5cf6 100%) /* blue → purple */
|
|
27
|
+
--gradient-name: linear-gradient(90deg, #c084fc 0%, #ec4899 50%, #ef4444 100%) /* purple → pink → red */
|
|
28
|
+
--success | --warning | --error | --info (semantic, oklch)
|
|
29
|
+
--radius-sm 6px | --radius-md 10px | --radius-lg 14px | --radius-pill 999px
|
|
30
|
+
--motion-fast 120ms | --motion-base 200ms | --motion-slow 320ms
|
|
31
|
+
--motion-ease cubic-bezier(0.2, 0, 0, 1)
|
|
32
|
+
--space-1..12 (8pt grid)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Layout (responsive grid)
|
|
36
|
+
|
|
37
|
+
| Width | Sessions | Thread | Info |
|
|
38
|
+
|--------------|----------|--------|------|
|
|
39
|
+
| ≥1200px | 240px col| 1fr | 280px col |
|
|
40
|
+
| 768–1199px | 240px col| 1fr | drawer overlay |
|
|
41
|
+
| <768px | sheet overlay | full | sheet overlay |
|
|
42
|
+
|
|
43
|
+
Panels collapse via **transform: translateX + opacity** (NOT `display: none`) for smooth motion.
|
|
44
|
+
|
|
45
|
+
## Composer — distinctive feature
|
|
46
|
+
|
|
47
|
+
**Floating pill composer**, anchored at the bottom of the thread column, max-width 720px centered horizontally. Pill shape (`border-radius: 999px`). Surfaces up over content on scroll. Internal layout: agent select chip + model badge on the left, textarea (auto-grow, max 240px), image-attach + mic + send on the right.
|
|
48
|
+
|
|
49
|
+
When session panel is open, composer offsets to the right by `240px`. When info panel is open, composer offsets to the left by `280px`. When both closed, composer is centered.
|
|
50
|
+
|
|
51
|
+
## First-run greeting (when no messages)
|
|
52
|
+
|
|
53
|
+
A large welcome state in the center of the thread:
|
|
54
|
+
- **Greeting**: "Hello, [user.name]." — first word in `--gradient-hello`, bracketed name in `--gradient-name`. Display size (clamp(2.5rem, 5vw, 4rem)). Inline serif or Inter ExtraBold.
|
|
55
|
+
- **Subtitle**: "How can I help you today?" — large but muted (`--text-muted`), clamp(1.5rem, 3vw, 2.25rem).
|
|
56
|
+
|
|
57
|
+
## Suggestion cards (first-run only)
|
|
58
|
+
|
|
59
|
+
A horizontal row of 4 cards below the greeting. Each card:
|
|
60
|
+
- Dark surface (`--surface-1`) with `--border` hairline
|
|
61
|
+
- Title (semibold, 14px) — example: "Help me debug a TypeScript error"
|
|
62
|
+
- Sample response preview (smaller, `--text-muted`, max 3 lines truncated)
|
|
63
|
+
- Click → fills the composer with that prompt
|
|
64
|
+
- Hover: lift (`transform: translateY(-2px)`) + border-strong
|
|
65
|
+
|
|
66
|
+
If no active project, replace with "Pick a project to scope chat sessions" CTA.
|
|
67
|
+
|
|
68
|
+
## Components (TSX — all already exist from initial refactor)
|
|
69
|
+
|
|
70
|
+
- **ChatBubble** — existing; no change
|
|
71
|
+
- **Composer** — REFACTOR: pill shape, floating at bottom, internal layout updated
|
|
72
|
+
- **SessionList** — existing; no change
|
|
73
|
+
- **InfoPanel** — existing; reduce 4-card repetition
|
|
74
|
+
- **EmptyState** — REPLACE for first-run with new `<FirstRunGreeting>` + `<SuggestionCards>` components
|
|
75
|
+
- **LoadingSkeleton** — existing; no change
|
|
76
|
+
- **StreamingIndicator** — existing; no change
|
|
77
|
+
- **ConfirmModal** — existing; no change
|
|
78
|
+
|
|
79
|
+
## New components to add
|
|
80
|
+
|
|
81
|
+
- **FirstRunGreeting** — shows when sessionId is empty AND messages.length === 0 AND activeProject exists. Renders the gradient greeting + subtitle.
|
|
82
|
+
- **SuggestionCards** — 4 hardcoded prompts. Reads activeProject to customize if applicable. Click → fills composer text via callback.
|
|
83
|
+
- **FloatingComposer** — wrapper around Composer that handles the pill positioning and panel-offset behavior.
|
|
84
|
+
|
|
85
|
+
## Critical bugs (carry-over from initial overhaul)
|
|
86
|
+
|
|
87
|
+
1. Sessions panel toggle uses `display: none` — fix to transform/opacity
|
|
88
|
+
2. `chat-info-hidden` class has no CSS — add proper hide rules
|
|
89
|
+
3. Mobile responsive at <768px should use overlay sheets (still TODO from E2E)
|
|
90
|
+
4. `prefers-reduced-motion` should apply to chat panel transitions
|
|
91
|
+
|
|
92
|
+
## Anti-pattern bans (impeccable enforcement)
|
|
93
|
+
|
|
94
|
+
- NO gradient on surfaces (gradients are text-only)
|
|
95
|
+
- NO glassmorphism / blur on chat panels
|
|
96
|
+
- NO drop shadows on cards (use border + surface elevation)
|
|
97
|
+
- NO generic card grids (InfoPanel reduced to 3 cards, suggestion cards are not "generic grid")
|
|
98
|
+
- NO gratuitous motion (only functional state transitions)
|
|
99
|
+
- NO emoji in UI text
|
|
100
|
+
|
|
101
|
+
## Implementation split
|
|
102
|
+
|
|
103
|
+
### Tyr (CSS — disjoint from Thor)
|
|
104
|
+
|
|
105
|
+
Modify:
|
|
106
|
+
- `bizar-dash/src/web/styles/chat.css` — apply surface tokens, pill composer, suggestion cards CSS, first-run greeting CSS, panel-toggle fix, mobile overlays
|
|
107
|
+
- `bizar-dash/src/web/styles/main.css` lines 100-220 — extend surface tokens with Gemini-inspired values
|
|
108
|
+
- `bizar-dash/src/web/styles/main.css` ~220 — verify `@import` ordering (currently warning)
|
|
109
|
+
- `bizar-dash/src/web/styles/mobile-chat.css` — overlay sheet transitions
|
|
110
|
+
|
|
111
|
+
### Thor (TSX — disjoint from Tyr)
|
|
112
|
+
|
|
113
|
+
- `bizar-dash/src/web/views/Chat.tsx` — orchestrate new components, panel-offset state
|
|
114
|
+
- NEW: `bizar-dash/src/web/components/chat/FirstRunGreeting.tsx`
|
|
115
|
+
- NEW: `bizar-dash/src/web/components/chat/SuggestionCards.tsx`
|
|
116
|
+
- NEW: `bizar-dash/src/web/components/chat/FloatingComposer.tsx`
|
|
117
|
+
- Update: `bizar-dash/src/web/components/chat/index.ts` (export new components)
|
|
118
|
+
- Update: `bizar-dash/src/web/components/chat/Composer.tsx` (refactor for pill layout)
|
|
119
|
+
|
|
120
|
+
## Acceptance criteria
|
|
121
|
+
|
|
122
|
+
1. Composer is a pill shape (`border-radius: 999px`), anchored at bottom, max-width 720px
|
|
123
|
+
2. First-run greeting has gradient text on "Hello," (blue→purple) and "[name]." (purple→pink→red)
|
|
124
|
+
3. 4 suggestion cards appear below the greeting, clickable
|
|
125
|
+
4. Sessions/info panel toggles animate via transform/opacity (NOT display: none)
|
|
126
|
+
5. `chat-info-hidden` has actual CSS rules
|
|
127
|
+
6. Mobile <768px uses overlay sheets (transform-based), not vertical stack
|
|
128
|
+
7. `prefers-reduced-motion` applies to chat panel transitions
|
|
129
|
+
8. `vite build` succeeds, `tsc --noEmit` clean, `bizar test-gate` green
|
|
130
|
+
|
|
131
|
+
## Reference
|
|
132
|
+
|
|
133
|
+
- Deep audit: `/tmp/opencode/chat-ui-deep-audit.md`
|
|
134
|
+
- Research notes: `/tmp/opencode/chat-ui-research.md`
|
|
135
|
+
- Inspiration: Gemini Advanced "Hello, [name]" screen (dark minimal, gradient greeting, suggestion cards, pill composer)
|
|
136
|
+
- E2E screenshots: `/tmp/opencode/chat-ui-e2e/`
|