@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,76 @@
|
|
|
1
|
+
# Bizar Mods — Format Reference (v3.0.0)
|
|
2
|
+
|
|
3
|
+
A mod is a folder with a `mod.json` manifest that extends the Bizar
|
|
4
|
+
platform. Mods live at `~/.config/bizar/mods/<mod-id>/`.
|
|
5
|
+
|
|
6
|
+
## Folder layout
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
<mod-id>/
|
|
10
|
+
├── mod.json # manifest (required)
|
|
11
|
+
├── README.md # description (optional)
|
|
12
|
+
├── agents/ # custom agents (optional)
|
|
13
|
+
│ └── <agent>.md
|
|
14
|
+
├── commands/ # custom commands (optional)
|
|
15
|
+
│ └── <command>.md
|
|
16
|
+
├── routes/ # custom API routes (optional)
|
|
17
|
+
│ └── <route>.mjs
|
|
18
|
+
├── views/ # custom React views (optional)
|
|
19
|
+
│ └── <view>.tsx
|
|
20
|
+
├── web/ # custom web assets (optional)
|
|
21
|
+
│ └── index.html
|
|
22
|
+
├── tui/ # custom TUI components (optional)
|
|
23
|
+
│ └── <comp>.mjs
|
|
24
|
+
└── hooks/ # custom event hooks (optional)
|
|
25
|
+
└── <hook>.mjs
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## mod.json schema
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"id": "my-mod",
|
|
33
|
+
"name": "My Mod",
|
|
34
|
+
"version": "1.0.0",
|
|
35
|
+
"author": "name",
|
|
36
|
+
"description": "...",
|
|
37
|
+
"bizar": ">=3.0.0",
|
|
38
|
+
"type": "agent" | "command" | "view" | "route" | "tui" | "full",
|
|
39
|
+
"enabled": true,
|
|
40
|
+
"permissions": ["read:agents", "write:tasks"],
|
|
41
|
+
"entry": {
|
|
42
|
+
"agent": "agents/my-agent.md",
|
|
43
|
+
"command": "commands/my-command.md",
|
|
44
|
+
"route": "routes/my-route.mjs",
|
|
45
|
+
"view": "views/my-view.tsx",
|
|
46
|
+
"tui": "tui/my-comp.mjs"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Permissions (v3.0.0)
|
|
52
|
+
|
|
53
|
+
`permissions` is a hint to the user. v3 doesn't enforce it yet — the
|
|
54
|
+
runtime is permissive. Future versions will gate operations by
|
|
55
|
+
permission.
|
|
56
|
+
|
|
57
|
+
Common permission strings:
|
|
58
|
+
- `read:agents`
|
|
59
|
+
- `write:agents`
|
|
60
|
+
- `read:tasks`
|
|
61
|
+
- `write:tasks`
|
|
62
|
+
- `read:projects`
|
|
63
|
+
- `write:projects`
|
|
64
|
+
- `read:schedules`
|
|
65
|
+
- `write:schedules`
|
|
66
|
+
- `read:config`
|
|
67
|
+
- `write:config`
|
|
68
|
+
|
|
69
|
+
## Lifecycle
|
|
70
|
+
|
|
71
|
+
- The dashboard scans `~/.config/bizar/mods/` on startup.
|
|
72
|
+
- For each mod with `enabled: true`, the loader exposes its agents,
|
|
73
|
+
commands, and views in the dashboard.
|
|
74
|
+
- v3 doesn't dynamically mount mod routes or render mod views — those
|
|
75
|
+
are planned for v3.1+. Mods that ship today can still install custom
|
|
76
|
+
agents and commands.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Hello Mod
|
|
2
|
+
|
|
3
|
+
A sample mod that ships with the Bizar platform. It demonstrates:
|
|
4
|
+
|
|
5
|
+
- A `mod.json` manifest with permissions and an `entry` block
|
|
6
|
+
- A sample agent (`agents/greeter.md`)
|
|
7
|
+
- A slash command (`commands/hello.md`)
|
|
8
|
+
- A route module (`routes/ping.mjs`) — the v3.1+ runtime will mount it
|
|
9
|
+
- A view metadata file (`views/HelloView.tsx`) — the v3.1+ dashboard
|
|
10
|
+
will render it as a tab
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# from the bizarre-dash package root
|
|
16
|
+
bizar mod install ./templates/mod/hello-mod
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or copy the folder into `~/.config/bizar/mods/hello-mod/` by hand.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "hello-mod",
|
|
3
|
+
"name": "Hello Mod",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"author": "Bizar",
|
|
6
|
+
"description": "A sample mod that adds a /hello slash command, a Hello view tab, and a sample agent.",
|
|
7
|
+
"bizar": ">=3.0.0",
|
|
8
|
+
"type": "full",
|
|
9
|
+
"enabled": true,
|
|
10
|
+
"permissions": [
|
|
11
|
+
"read:agents",
|
|
12
|
+
"read:commands"
|
|
13
|
+
],
|
|
14
|
+
"entry": {
|
|
15
|
+
"agent": "agents/greeter.md",
|
|
16
|
+
"command": "commands/hello.md",
|
|
17
|
+
"view": "views/HelloView.tsx"
|
|
18
|
+
},
|
|
19
|
+
"installedAt": null
|
|
20
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Sample route registration for the Hello Mod.
|
|
2
|
+
// v3 doesn't dynamically mount mod routes yet, but this file documents
|
|
3
|
+
// the intended shape for v3.1+.
|
|
4
|
+
|
|
5
|
+
export default function register({ app, state }) {
|
|
6
|
+
app.get('/api/mods/hello-mod/ping', (req, res) => {
|
|
7
|
+
res.json({ ok: true, from: 'hello-mod', ts: Date.now() });
|
|
8
|
+
});
|
|
9
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bizar-dash/tests/dashboard-ports.test.mjs
|
|
3
|
+
*
|
|
4
|
+
* Regression tests for the "stale PID file → false positive
|
|
5
|
+
* `Another Bizar dashboard is already running`" trap.
|
|
6
|
+
*
|
|
7
|
+
* History (v3.20.14):
|
|
8
|
+
* - The dashboard lifecycle used to:
|
|
9
|
+
* 1. Scan `ps` for any process whose argv contained "bizar dash"
|
|
10
|
+
* or "@polderlabs/bizar-dash/src/cli.mjs".
|
|
11
|
+
* 2. Trust that ps-scan result + `process.kill(pid, 0)` returned
|
|
12
|
+
* true to mean "this is a dashboard".
|
|
13
|
+
* 3. Refuse to start, refuse to cleanup, refuse to stop.
|
|
14
|
+
* - On a busy machine, Linux recycles PIDs in milliseconds. A
|
|
15
|
+
* chrome-headless-shell renderer that happened to land on the
|
|
16
|
+
* recycled PID number would match the regex AND pass kill(0),
|
|
17
|
+
* and the dashboard would refuse to start forever.
|
|
18
|
+
* - The cmdline was stale, but `ps` re-reads /proc each call so
|
|
19
|
+
* we never noticed.
|
|
20
|
+
*
|
|
21
|
+
* Fix: `cmdlineLooksLikeDashboard(cmdline)` rejects anything that
|
|
22
|
+
* doesn't structurally look like a Bizar dashboard launch. Re-applied
|
|
23
|
+
* at probe time via `verifyCmdlineAtProbeTime(pid)` to catch the
|
|
24
|
+
* recycled-PID race.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { test } from 'node:test';
|
|
28
|
+
import assert from 'node:assert/strict';
|
|
29
|
+
import {
|
|
30
|
+
cmdlineLooksLikeDashboard,
|
|
31
|
+
verifyCmdlineAtProbeTime,
|
|
32
|
+
} from '../src/cli/dashboard-ports.mjs';
|
|
33
|
+
|
|
34
|
+
// ── cmdlineLooksLikeDashboard ─────────────────────────────────────────
|
|
35
|
+
|
|
36
|
+
test('cmdlineLooksLikeDashboard: accepts node + cli.mjs direct invocation', () => {
|
|
37
|
+
assert.equal(
|
|
38
|
+
cmdlineLooksLikeDashboard('node /usr/local/lib/node_modules/@polderlabs/bizar-dash/src/cli.mjs start'),
|
|
39
|
+
true,
|
|
40
|
+
);
|
|
41
|
+
assert.equal(
|
|
42
|
+
cmdlineLooksLikeDashboard('node /home/me/.local/share/npm/_npx/hash/node_modules/@polderlabs/bizar-dash/src/cli.mjs start --bg --port=4321'),
|
|
43
|
+
true,
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('cmdlineLooksLikeDashboard: accepts bizar-bin invocation', () => {
|
|
48
|
+
assert.equal(
|
|
49
|
+
cmdlineLooksLikeDashboard('/usr/local/bin/bizar dash start'),
|
|
50
|
+
true,
|
|
51
|
+
);
|
|
52
|
+
assert.equal(
|
|
53
|
+
cmdlineLooksLikeDashboard('/home/me/.local/npm/bin/bizar dash start --bg --port=4322'),
|
|
54
|
+
true,
|
|
55
|
+
);
|
|
56
|
+
assert.equal(
|
|
57
|
+
cmdlineLooksLikeDashboard('node /usr/local/bin/bizar dash tui'),
|
|
58
|
+
true,
|
|
59
|
+
);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('cmdlineLooksLikeDashboard: rejects chrome-headless-shell renderer (recycled PID)', () => {
|
|
63
|
+
// This is what a recycled PID looks like: chrome-headless-shell
|
|
64
|
+
// happened to land on PID 938619, and its cmdline contains the
|
|
65
|
+
// substring "bizar" nowhere — so it should NOT be flagged as a
|
|
66
|
+
// dashboard.
|
|
67
|
+
assert.equal(
|
|
68
|
+
cmdlineLooksLikeDashboard('/home/me/.cache/puppeteer/chrome-headless-shell-linux64/chrome-headless-shell --type=renderer --headless=old --no-sandbox'),
|
|
69
|
+
false,
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test('cmdlineLooksLikeDashboard: rejects stale shell command containing the words "bizar dash"', () => {
|
|
74
|
+
// A bash command whose body mentions `bizar dash` in a comment
|
|
75
|
+
// would match the old loose regex. The structural check rejects it
|
|
76
|
+
// because there's no `bizar` bin followed by `dash <subcommand>`.
|
|
77
|
+
assert.equal(
|
|
78
|
+
cmdlineLooksLikeDashboard('bash -c "echo I want to run bizar dash start"'),
|
|
79
|
+
false,
|
|
80
|
+
);
|
|
81
|
+
assert.equal(
|
|
82
|
+
cmdlineLooksLikeDashboard('man bizar-dash-config'),
|
|
83
|
+
false,
|
|
84
|
+
);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test('cmdlineLooksLikeDashboard: rejects ssh / tailscale sessions with "bizar" in env', () => {
|
|
88
|
+
// An ssh session whose env has "bizar" in some variable but whose
|
|
89
|
+
// argv doesn't actually invoke the dashboard CLI.
|
|
90
|
+
assert.equal(
|
|
91
|
+
cmdlineLooksLikeDashboard('/usr/sbin/tailscaled be-child ssh --login-shell=/usr/bin/fish'),
|
|
92
|
+
false,
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('cmdlineLooksLikeDashboard: rejects empty / null input', () => {
|
|
97
|
+
assert.equal(cmdlineLooksLikeDashboard(''), false);
|
|
98
|
+
assert.equal(cmdlineLooksLikeDashboard(null), false);
|
|
99
|
+
assert.equal(cmdlineLooksLikeDashboard(undefined), false);
|
|
100
|
+
assert.equal(cmdlineLooksLikeDashboard(42), false);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// ── verifyCmdlineAtProbeTime ───────────────────────────────────────────
|
|
104
|
+
|
|
105
|
+
test('verifyCmdlineAtProbeTime: dead PID returns null', () => {
|
|
106
|
+
// Use a PID that's almost certainly dead.
|
|
107
|
+
const result = verifyCmdlineAtProbeTime(999999999);
|
|
108
|
+
assert.equal(result, null);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('verifyCmdlineAtProbeTime: current PID with non-dashboard cmdline returns null', () => {
|
|
112
|
+
// The test runner itself is a node process but its cmdline won't
|
|
113
|
+
// look like a Bizar dashboard launch.
|
|
114
|
+
const result = verifyCmdlineAtProbeTime(process.pid);
|
|
115
|
+
assert.equal(result, null);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('verifyCmdlineAtProbeTime: missing PID returns null', () => {
|
|
119
|
+
assert.equal(verifyCmdlineAtProbeTime(null), null);
|
|
120
|
+
assert.equal(verifyCmdlineAtProbeTime(0), null);
|
|
121
|
+
assert.equal(verifyCmdlineAtProbeTime(undefined), null);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// ── Real-world cmdline strings that have caused false positives ───────
|
|
125
|
+
|
|
126
|
+
test('cmdlineLooksLikeDashboard: rejects the v3.20.13 false-positive case', () => {
|
|
127
|
+
// The exact scenario from the v3.20.13 bug report: ps-scan found
|
|
128
|
+
// PID 938619 with cmdline "node /home/drb0rk/.local/npm/bin/bizar
|
|
129
|
+
// dash start --bg --port=4322" — except PID 938619 was recycled
|
|
130
|
+
// to a chrome renderer between ps-scan and pidAlive. The structural
|
|
131
|
+
// check on the current /proc/<pid>/cmdline returns null, so the
|
|
132
|
+
// dashboard is correctly classified as dead.
|
|
133
|
+
//
|
|
134
|
+
// We simulate this by checking that chrome's cmdline (what the
|
|
135
|
+
// recycled PID actually contains now) doesn't match.
|
|
136
|
+
const chromeCmdline = '/home/drb0rk/.cache/puppeteer/chrome-headless-shell-linux64/chrome-headless-shell --type=renderer --headless=old --no-sandbox --remote-debugging-port=9222';
|
|
137
|
+
assert.equal(cmdlineLooksLikeDashboard(chromeCmdline), false);
|
|
138
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* graphify-mod-spawn.node.test.mjs — regression test for the SIGPIPE crash.
|
|
3
|
+
*
|
|
4
|
+
* The graphify mod's route.mjs used to spawn the `graphify` CLI with
|
|
5
|
+
* `spawnSync` + `stdio: 'inherit'`. That worked in a terminal, but the
|
|
6
|
+
* dashboard is a background daemon with stdin=/dev/null and
|
|
7
|
+
* stdout/stderr redirected to a log file. With `stdio: 'inherit'`, the
|
|
8
|
+
* child inherits those descriptors; if anything closes or rotates them
|
|
9
|
+
* mid-build, the kernel delivers SIGPIPE to the dashboard — silently
|
|
10
|
+
* killing it. The user reported "building the graph crashed the dash".
|
|
11
|
+
*
|
|
12
|
+
* This test verifies the source file no longer contains the dangerous
|
|
13
|
+
* pattern. We parse the file as text (the route.mjs is loaded by the
|
|
14
|
+
* dashboard's vm sandbox, not directly importable here).
|
|
15
|
+
*
|
|
16
|
+
* Run with: node --test tests/graphify-mod-spawn.node.test.mjs
|
|
17
|
+
*/
|
|
18
|
+
import { describe, it } from 'node:test';
|
|
19
|
+
import assert from 'node:assert/strict';
|
|
20
|
+
import { readFileSync } from 'node:fs';
|
|
21
|
+
import { join, resolve } from 'node:path';
|
|
22
|
+
|
|
23
|
+
// Test lives at bizar-dash/tests/, source is at the repo root.
|
|
24
|
+
const REPO = resolve(import.meta.dirname, '..', '..');
|
|
25
|
+
const SOURCE = join(REPO, 'mods-examples/graphify/route.mjs');
|
|
26
|
+
|
|
27
|
+
describe('graphify mod — SIGPIPE-safe spawn', () => {
|
|
28
|
+
it('source file exists at the expected path', () => {
|
|
29
|
+
const text = readFileSync(SOURCE, 'utf8');
|
|
30
|
+
assert.ok(text.length > 100, 'source file should be substantial');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('does NOT import spawnSync (causes blocking + stdio inheritance)', () => {
|
|
34
|
+
const text = readFileSync(SOURCE, 'utf8');
|
|
35
|
+
assert.ok(
|
|
36
|
+
!/\bspawnSync\b/.test(text),
|
|
37
|
+
'route.mjs must not import or call spawnSync — use async spawn instead',
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('does NOT use stdio: \'inherit\' (the SIGPIPE crash vector)', () => {
|
|
42
|
+
const text = readFileSync(SOURCE, 'utf8');
|
|
43
|
+
// Strip block comments and line comments before checking — we don't
|
|
44
|
+
// want the bug description itself to trip the test.
|
|
45
|
+
const stripped = text
|
|
46
|
+
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
47
|
+
.replace(/^\s*\/\/.*$/gm, '')
|
|
48
|
+
.replace(/`stdio:\s*'inherit'`/g, '');
|
|
49
|
+
// Look for the literal string in any quoting style.
|
|
50
|
+
const patterns = [
|
|
51
|
+
/stdio:\s*['"]inherit['"]/,
|
|
52
|
+
/stdio:\s*\[\s*['"]inherit['"]/,
|
|
53
|
+
];
|
|
54
|
+
for (const pat of patterns) {
|
|
55
|
+
assert.ok(
|
|
56
|
+
!pat.test(stripped),
|
|
57
|
+
`route.mjs must not use stdio: 'inherit' — it propagates SIGPIPE to the dashboard`,
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('isolates the spawned child stdio with [\'ignore\', \'pipe\', \'pipe\']', () => {
|
|
63
|
+
const text = readFileSync(SOURCE, 'utf8');
|
|
64
|
+
assert.ok(
|
|
65
|
+
/stdio:\s*\[\s*['"]ignore['"]\s*,\s*['"]pipe['"]\s*,\s*['"]pipe['"]\s*\]/.test(text),
|
|
66
|
+
'spawn options should set stdio to [ignore, pipe, pipe] for SIGPIPE isolation',
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('runs graphify as an async spawn (not blocking)', () => {
|
|
71
|
+
const text = readFileSync(SOURCE, 'utf8');
|
|
72
|
+
// runGraphify should be declared `async function` and return a Promise.
|
|
73
|
+
assert.ok(
|
|
74
|
+
/async\s+function\s+runGraphify\s*\(/.test(text),
|
|
75
|
+
'runGraphify should be declared async so the dashboard event loop is not blocked',
|
|
76
|
+
);
|
|
77
|
+
assert.ok(
|
|
78
|
+
/return\s+new\s+Promise\s*\(/.test(text),
|
|
79
|
+
'runGraphify should return a Promise (async spawn lifecycle)',
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('forwards child stdout/stderr to the broadcast callback (no streaming lost)', () => {
|
|
84
|
+
const text = readFileSync(SOURCE, 'utf8');
|
|
85
|
+
assert.ok(
|
|
86
|
+
/broadcast\(\s*\{\s*type:\s*['"]graphify:build:log['"]/.test(text),
|
|
87
|
+
'runGraphify should call broadcast with graphify:build:log events so the dashboard UI keeps streaming',
|
|
88
|
+
);
|
|
89
|
+
});
|
|
90
|
+
});
|