@polderlabs/bizar 6.2.5 → 7.0.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/.claude/CLAUDE.md +15 -0
- package/.claude/agents/_shared/AGENT_BASELINE.md +168 -0
- package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
- package/.claude/agents/_shared/SKILLS.md +109 -0
- package/.claude/agents/agent-browser.md +80 -0
- package/.claude/agents/baldr.md +49 -0
- package/.claude/agents/forseti.md +51 -0
- package/.claude/agents/frigg.md +42 -0
- package/.claude/agents/heimdall.md +33 -0
- package/.claude/agents/hermod.md +53 -0
- package/.claude/agents/mimir.md +49 -0
- package/.claude/agents/odin.md +287 -0
- package/.claude/agents/quick.md +34 -0
- package/.claude/agents/semble-search.md +50 -0
- package/.claude/agents/thor.md +53 -0
- package/.claude/agents/tyr.md +56 -0
- package/.claude/agents/vidarr.md +54 -0
- package/.claude/agents/vor.md +53 -0
- package/.claude/commands/audit.md +25 -0
- package/.claude/commands/bizar.md +22 -0
- package/.claude/commands/explain.md +17 -0
- package/.claude/commands/init.md +29 -0
- package/.claude/commands/learn.md +44 -0
- package/.claude/commands/plan.md +35 -0
- package/.claude/commands/plow-through.md +50 -0
- package/.claude/commands/pr-review.md +49 -0
- package/.claude/commands/setup-provider.md +96 -0
- package/.claude/commands/tailscale-serve.md +100 -0
- package/.claude/commands/team.md +132 -0
- package/.claude/commands/test.md +62 -0
- package/.claude/commands/validate.md +68 -0
- package/.claude/commands/visual-plan.md +24 -0
- package/.claude/hooks/README.md +92 -0
- package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
- package/.claude/hooks/pretooluse-bash.mjs +81 -0
- package/.claude/hooks/pretooluse-editwrite.mjs +139 -0
- package/.claude/hooks/sessionend-recall.mjs +74 -0
- package/.claude/hooks/sessionstart-prime.mjs +80 -0
- package/.claude/hooks/userpromptsubmit-tag.mjs +80 -0
- package/.claude/hooks/worker-suggest.mjs +110 -0
- package/.claude/settings.json +125 -0
- package/.claude/skills/9router/SKILL.md +80 -0
- package/.claude/skills/9router-chat/SKILL.md +73 -0
- package/.claude/skills/9router-embeddings/SKILL.md +69 -0
- package/.claude/skills/9router-image/SKILL.md +86 -0
- package/.claude/skills/9router-stt/SKILL.md +79 -0
- package/.claude/skills/9router-tts/SKILL.md +80 -0
- package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
- package/.claude/skills/9router-web-search/SKILL.md +91 -0
- package/.claude/skills/bizar/README.md +9 -0
- package/.claude/skills/bizar/SKILL.md +450 -0
- package/.claude/skills/cpp-coding-standards/README.md +28 -0
- package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
- package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
- package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
- package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
- package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
- package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
- package/.claude/skills/cpp-testing/README.md +28 -0
- package/.claude/skills/cpp-testing/SKILL.md +304 -0
- package/.claude/skills/cpp-testing/references/coverage.md +370 -0
- package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
- package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
- package/.claude/skills/cpp-testing/references/mocking.md +364 -0
- package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
- package/.claude/skills/cubesandbox/SKILL.md +148 -0
- package/.claude/skills/embedded-esp-idf/README.md +41 -0
- package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
- package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
- package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
- package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
- package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
- package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
- package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
- package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
- package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
- package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
- package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
- package/.claude/skills/glyph/SKILL.md +163 -0
- package/.claude/skills/harness-engineering/SKILL.md +143 -0
- package/.claude/skills/lightrag/SKILL.md +81 -0
- package/.claude/skills/memory-protocol/SKILL.md +105 -0
- package/.claude/skills/obsidian/SKILL.md +306 -0
- package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
- package/.claude/skills/self-improvement/SKILL.md +64 -0
- package/README.md +87 -59
- package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js → EnvVarsSection-CW6fWKds.js} +3 -3
- package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js.map → EnvVarsSection-CW6fWKds.js.map} +1 -1
- package/bizar-dash/dist/assets/MobileChat-D7zRhU9K.js +1 -0
- package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js.map → MobileChat-D7zRhU9K.js.map} +1 -1
- package/bizar-dash/dist/assets/MobileSettings-K-sNsn_r.js +1 -0
- package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js.map → MobileSettings-K-sNsn_r.js.map} +1 -1
- package/bizar-dash/dist/assets/{Toast-Cpl6-E63.js → Toast-WTxc3m2g.js} +1 -1
- package/bizar-dash/dist/assets/{Toast-Cpl6-E63.js.map → Toast-WTxc3m2g.js.map} +1 -1
- package/bizar-dash/dist/assets/flow-BpU0-gK2.js +1 -0
- package/bizar-dash/dist/assets/flow-BpU0-gK2.js.map +1 -0
- package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js +1 -0
- package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js.map +1 -0
- package/bizar-dash/dist/assets/{icons-Do5N2jmX.js → icons-B0AKnYI3.js} +98 -103
- package/bizar-dash/dist/assets/icons-B0AKnYI3.js.map +1 -0
- package/bizar-dash/dist/assets/main-C-Md3DaY.css +1 -0
- package/bizar-dash/dist/assets/main-CO8fIxQK.js +18 -0
- package/bizar-dash/dist/assets/main-CO8fIxQK.js.map +1 -0
- package/bizar-dash/dist/assets/markdown-w2bDDkAH.js +1 -0
- package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js.map → markdown-w2bDDkAH.js.map} +1 -1
- package/bizar-dash/dist/assets/mobile-DXYCA0hC.js +1 -0
- package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js.map → mobile-DXYCA0hC.js.map} +1 -1
- package/bizar-dash/dist/assets/mobile-layout-DSmtNPja.js +2 -0
- package/bizar-dash/dist/assets/mobile-layout-DSmtNPja.js.map +1 -0
- package/bizar-dash/dist/assets/react-vendor-BnuhLJ6X.css +1 -0
- package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js +46 -0
- package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js.map +1 -0
- package/bizar-dash/dist/assets/useSlashCommands-3DFLOfpk.js +2 -0
- package/bizar-dash/dist/assets/useSlashCommands-3DFLOfpk.js.map +1 -0
- package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js +45 -0
- package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js.map +1 -0
- package/bizar-dash/dist/index.html +12 -10
- package/bizar-dash/dist/mobile.html +7 -4
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/server/api.mjs +15 -4
- package/bizar-dash/src/server/background-store.mjs +15 -16
- package/bizar-dash/src/server/bg-poller.mjs +25 -35
- package/bizar-dash/src/server/bg-retry.mjs +66 -194
- package/bizar-dash/src/server/claude-bg-spawner.mjs +390 -0
- package/bizar-dash/src/server/claude-info.mjs +412 -0
- package/bizar-dash/src/server/{cline-runner.mjs → claude-runner.mjs} +53 -48
- package/bizar-dash/src/server/claude-sdk.mjs +191 -0
- package/bizar-dash/src/server/memory-consolidator.mjs +218 -0
- package/bizar-dash/src/server/memory-distillation.mjs +296 -0
- package/bizar-dash/src/server/providers-store.mjs +22 -49
- package/bizar-dash/src/server/routes/background.mjs +24 -20
- package/bizar-dash/src/server/routes/chat.mjs +223 -326
- package/bizar-dash/src/server/routes/claude-session-detail.mjs +329 -0
- package/bizar-dash/src/server/routes/claude-sessions.mjs +259 -0
- package/bizar-dash/src/server/routes/distill.mjs +129 -0
- package/bizar-dash/src/server/routes/goal-planner.mjs +236 -0
- package/bizar-dash/src/server/routes/tasks.mjs +20 -28
- package/bizar-dash/src/server/task-delegator.mjs +76 -77
- package/bizar-dash/src/web/App.tsx +4 -0
- package/bizar-dash/src/web/components/Tag.tsx +18 -5
- package/bizar-dash/src/web/components/Topbar.tsx +3 -0
- package/bizar-dash/src/web/components/agents/CommunicationLog.tsx +126 -0
- package/bizar-dash/src/web/components/agents/DependencyGraph.tsx +163 -0
- package/bizar-dash/src/web/components/agents/QualityGates.tsx +123 -0
- package/bizar-dash/src/web/components/agents/RealTimeEventLog.tsx +127 -0
- package/bizar-dash/src/web/components/agents/RoutingDecisions.test.tsx +148 -0
- package/bizar-dash/src/web/components/agents/RoutingDecisions.tsx +160 -0
- package/bizar-dash/src/web/components/chat/useChat.ts +23 -27
- package/bizar-dash/src/web/components/goals/GoalInput.tsx +86 -0
- package/bizar-dash/src/web/components/goals/PlanVisualization.tsx +111 -0
- package/bizar-dash/src/web/lib/goapPlanner.ts +614 -0
- package/bizar-dash/src/web/lib/types.ts +25 -0
- package/bizar-dash/src/web/styles/agents-redesign.css +311 -0
- package/bizar-dash/src/web/styles/main.css +251 -0
- package/bizar-dash/src/web/styles/tasks-redesign.css +231 -0
- package/bizar-dash/src/web/ui/controls/Button.tsx +77 -0
- package/bizar-dash/src/web/ui/controls/Checkbox.tsx +95 -0
- package/bizar-dash/src/web/ui/controls/IconButton.tsx +66 -0
- package/bizar-dash/src/web/ui/controls/Kbd.tsx +24 -0
- package/bizar-dash/src/web/ui/controls/NumberInput.tsx +77 -0
- package/bizar-dash/src/web/ui/controls/RadioGroup.tsx +109 -0
- package/bizar-dash/src/web/ui/controls/SearchInput.tsx +91 -0
- package/bizar-dash/src/web/ui/controls/Select.tsx +92 -0
- package/bizar-dash/src/web/ui/controls/Slider.tsx +70 -0
- package/bizar-dash/src/web/ui/controls/TextInput.tsx +67 -0
- package/bizar-dash/src/web/ui/controls/Toggle.tsx +79 -0
- package/bizar-dash/src/web/ui/controls/controls.css +454 -0
- package/bizar-dash/src/web/ui/controls/index.ts +33 -0
- package/bizar-dash/src/web/ui/data/BarChart.tsx +60 -0
- package/bizar-dash/src/web/ui/data/DataTable.tsx +216 -0
- package/bizar-dash/src/web/ui/data/EmptyState.tsx +60 -0
- package/bizar-dash/src/web/ui/data/ErrorState.tsx +56 -0
- package/bizar-dash/src/web/ui/data/KeyValueList.tsx +106 -0
- package/bizar-dash/src/web/ui/data/LoadingState.tsx +65 -0
- package/bizar-dash/src/web/ui/data/Sparkline.tsx +87 -0
- package/bizar-dash/src/web/ui/data/StatTile.tsx +87 -0
- package/bizar-dash/src/web/ui/data/data.css +535 -0
- package/bizar-dash/src/web/ui/data/index.ts +31 -0
- package/bizar-dash/src/web/ui/feedback/Badge.tsx +49 -0
- package/bizar-dash/src/web/ui/feedback/Dialog.tsx +209 -0
- package/bizar-dash/src/web/ui/feedback/ProgressBar.tsx +69 -0
- package/bizar-dash/src/web/ui/feedback/StatusDot.tsx +50 -0
- package/bizar-dash/src/web/ui/feedback/Toast.tsx +200 -0
- package/bizar-dash/src/web/ui/feedback/Tooltip.tsx +126 -0
- package/bizar-dash/src/web/ui/feedback/feedback.css +314 -0
- package/bizar-dash/src/web/ui/feedback/index.ts +43 -0
- package/bizar-dash/src/web/ui/index.ts +56 -0
- package/bizar-dash/src/web/ui/layout/AppShell.tsx +51 -0
- package/bizar-dash/src/web/ui/layout/Breadcrumbs.tsx +97 -0
- package/bizar-dash/src/web/ui/layout/Panel.tsx +73 -0
- package/bizar-dash/src/web/ui/layout/PanelHeader.tsx +39 -0
- package/bizar-dash/src/web/ui/layout/Sidebar.tsx +131 -0
- package/bizar-dash/src/web/ui/layout/Tabs.tsx +133 -0
- package/bizar-dash/src/web/ui/layout/Topbar.tsx +42 -0
- package/bizar-dash/src/web/ui/layout/index.ts +33 -0
- package/bizar-dash/src/web/ui/layout/layout.css +413 -0
- package/bizar-dash/src/web/ui/navigation/CommandPalette.tsx +199 -0
- package/bizar-dash/src/web/ui/navigation/NavGroup.tsx +95 -0
- package/bizar-dash/src/web/ui/navigation/NavLink.tsx +93 -0
- package/bizar-dash/src/web/ui/navigation/index.ts +17 -0
- package/bizar-dash/src/web/ui/navigation/navigation.css +343 -0
- package/bizar-dash/src/web/ui/primitives/Box.tsx +91 -0
- package/bizar-dash/src/web/ui/primitives/Grid.tsx +49 -0
- package/bizar-dash/src/web/ui/primitives/Inline.tsx +55 -0
- package/bizar-dash/src/web/ui/primitives/Separator.tsx +46 -0
- package/bizar-dash/src/web/ui/primitives/Stack.tsx +54 -0
- package/bizar-dash/src/web/ui/primitives/VisuallyHidden.tsx +26 -0
- package/bizar-dash/src/web/ui/primitives/index.ts +23 -0
- package/bizar-dash/src/web/ui/primitives/primitives.css +183 -0
- package/bizar-dash/src/web/ui/styles/globals.css +86 -0
- package/bizar-dash/src/web/ui/styles/reset.css +125 -0
- package/bizar-dash/src/web/ui/styles/tokens.css +195 -0
- package/bizar-dash/src/web/ui/theme/ThemeProvider.tsx +142 -0
- package/bizar-dash/src/web/ui/theme/tokens.ts +131 -0
- package/bizar-dash/src/web/ui/theme/useTheme.ts +22 -0
- package/bizar-dash/src/web/ui/utils/cx.ts +42 -0
- package/bizar-dash/src/web/views/Agents.tsx +506 -266
- package/bizar-dash/src/web/views/Chat.tsx +8 -8
- package/bizar-dash/src/web/views/GoalPlanner.tsx +158 -0
- package/bizar-dash/src/web/views/Overview.tsx +996 -448
- package/bizar-dash/src/web/views/Tasks.tsx +277 -273
- package/bizar-dash/tests/communication-log.test.tsx +67 -0
- package/bizar-dash/tests/dep-graph.test.tsx +40 -0
- package/bizar-dash/tests/event-log.test.tsx +61 -0
- package/bizar-dash/tests/goal-input.test.tsx +72 -0
- package/bizar-dash/tests/goap-planner.test.ts +68 -0
- package/bizar-dash/tests/quality-gates.test.tsx +59 -0
- package/bizar-dash/tests/setup.ts +31 -1
- package/bizar-dash/tests/ui/controls/Button.test.tsx +50 -0
- package/bizar-dash/tests/ui/controls/Checkbox.test.tsx +44 -0
- package/bizar-dash/tests/ui/controls/IconButton.test.tsx +37 -0
- package/bizar-dash/tests/ui/controls/Kbd.test.tsx +39 -0
- package/bizar-dash/tests/ui/controls/NumberInput.test.tsx +56 -0
- package/bizar-dash/tests/ui/controls/RadioGroup.test.tsx +58 -0
- package/bizar-dash/tests/ui/controls/SearchInput.test.tsx +52 -0
- package/bizar-dash/tests/ui/controls/Select.test.tsx +66 -0
- package/bizar-dash/tests/ui/controls/Slider.test.tsx +41 -0
- package/bizar-dash/tests/ui/controls/TextInput.test.tsx +44 -0
- package/bizar-dash/tests/ui/controls/Toggle.test.tsx +39 -0
- package/bizar-dash/tests/ui/data/BarChart.test.tsx +55 -0
- package/bizar-dash/tests/ui/data/DataTable.test.tsx +112 -0
- package/bizar-dash/tests/ui/data/EmptyState.test.tsx +57 -0
- package/bizar-dash/tests/ui/data/ErrorState.test.tsx +47 -0
- package/bizar-dash/tests/ui/data/KeyValueList.test.tsx +59 -0
- package/bizar-dash/tests/ui/data/LoadingState.test.tsx +37 -0
- package/bizar-dash/tests/ui/data/Sparkline.test.tsx +56 -0
- package/bizar-dash/tests/ui/data/StatTile.test.tsx +69 -0
- package/bizar-dash/tests/ui/feedback/Badge.test.tsx +41 -0
- package/bizar-dash/tests/ui/feedback/Dialog.test.tsx +99 -0
- package/bizar-dash/tests/ui/feedback/ProgressBar.test.tsx +66 -0
- package/bizar-dash/tests/ui/feedback/StatusDot.test.tsx +41 -0
- package/bizar-dash/tests/ui/feedback/Toast.test.tsx +124 -0
- package/bizar-dash/tests/ui/feedback/Tooltip.test.tsx +102 -0
- package/bizar-dash/tests/ui/layout/AppShell.test.tsx +50 -0
- package/bizar-dash/tests/ui/layout/Breadcrumbs.test.tsx +85 -0
- package/bizar-dash/tests/ui/layout/Panel.test.tsx +52 -0
- package/bizar-dash/tests/ui/layout/PanelHeader.test.tsx +32 -0
- package/bizar-dash/tests/ui/layout/Sidebar.test.tsx +95 -0
- package/bizar-dash/tests/ui/layout/Tabs.test.tsx +87 -0
- package/bizar-dash/tests/ui/layout/Topbar.test.tsx +41 -0
- package/bizar-dash/tests/ui/navigation/CommandPalette.test.tsx +105 -0
- package/bizar-dash/tests/ui/navigation/NavGroup.test.tsx +55 -0
- package/bizar-dash/tests/ui/navigation/NavLink.test.tsx +61 -0
- package/bizar-dash/tests/ui/primitives/Box.test.tsx +49 -0
- package/bizar-dash/tests/ui/primitives/Grid.test.tsx +37 -0
- package/bizar-dash/tests/ui/primitives/Inline.test.tsx +33 -0
- package/bizar-dash/tests/ui/primitives/Separator.test.tsx +34 -0
- package/bizar-dash/tests/ui/primitives/Stack.test.tsx +45 -0
- package/bizar-dash/tests/ui/primitives/VisuallyHidden.test.tsx +27 -0
- package/bizar-dash/tests/views/Agents.test.tsx +359 -0
- package/bizar-dash/tests/views/Overview.test.tsx +413 -0
- package/bizar-dash/tests/views/Tasks.test.tsx +250 -0
- package/bizar-dash/vitest.config.ts +3 -1
- package/cli/__tests__/cost-gate.test.mjs +301 -0
- package/cli/__tests__/feature-list-bridge.test.mjs +371 -0
- package/cli/bin.mjs +55 -18
- package/cli/commands/claim.mjs +282 -0
- package/cli/commands/claude-cmd.mjs +348 -0
- package/cli/commands/cost.mjs +279 -0
- package/cli/commands/install.mjs +12 -11
- package/cli/commands/validate.mjs +252 -325
- package/cli/cost-gate.mjs +501 -0
- package/cli/dev-link.test.mjs +11 -11
- package/cli/doctor.mjs +131 -213
- package/cli/feature-list-bridge.mjs +400 -0
- package/cli/install.mjs +33 -37
- package/cli/install.test.mjs +9 -9
- package/cli/memory-constants.mjs +17 -0
- package/cli/provision-claude.mjs +893 -0
- package/cli/provision.mjs +224 -227
- package/cli/utils.mjs +72 -58
- package/cli/worker-dispatcher.mjs +259 -0
- package/cli/worker-dispatcher.test.mjs +204 -0
- package/config/AGENTS.md +28 -28
- package/config/trigger-patterns.json +186 -0
- package/install.sh +66 -44
- package/package.json +19 -11
- package/packages/sdk/ARCHITECTURE.md +40 -36
- package/packages/sdk/package.json +15 -5
- package/packages/sdk/src/agent-registry.ts +304 -0
- package/packages/sdk/src/consensus/byzantine.ts +587 -0
- package/packages/sdk/src/consensus/index.ts +147 -0
- package/packages/sdk/src/consensus/queen.ts +173 -0
- package/packages/sdk/src/consensus/types.ts +199 -0
- package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
- package/packages/sdk/src/federation/audit.ts +156 -0
- package/packages/sdk/src/federation/budget.ts +269 -0
- package/packages/sdk/src/federation/envelope.ts +144 -0
- package/packages/sdk/src/federation/hmac.ts +160 -0
- package/packages/sdk/src/federation/index.ts +443 -0
- package/packages/sdk/src/federation/pii.ts +241 -0
- package/packages/sdk/src/federation/policy.ts +112 -0
- package/packages/sdk/src/federation/trust.ts +146 -0
- package/packages/sdk/src/fingerprint.ts +0 -0
- package/packages/sdk/src/index.ts +101 -69
- package/packages/sdk/src/mcp/bin.ts +51 -0
- package/packages/sdk/src/mcp/server.ts +848 -0
- package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
- package/packages/sdk/src/router/codemod-intent.ts +125 -0
- package/packages/sdk/src/router/index.ts +247 -0
- package/packages/sdk/src/router/memory-distillation-shim.mjs +18 -0
- package/packages/sdk/src/router/memory-distillation.ts +249 -0
- package/packages/sdk/src/router/model-router.ts +235 -0
- package/packages/sdk/src/router/q-learning-router.ts +304 -0
- package/packages/sdk/src/swarm-topology.ts +279 -0
- package/packages/sdk/tests/agent-registry.test.ts +285 -0
- package/packages/sdk/tests/consensus.test.ts +376 -0
- package/packages/sdk/tests/federation/audit.test.ts +164 -0
- package/packages/sdk/tests/federation/budget.test.ts +189 -0
- package/packages/sdk/tests/federation/envelope.test.ts +120 -0
- package/packages/sdk/tests/federation/hmac.test.ts +194 -0
- package/packages/sdk/tests/federation/orchestrator.test.ts +176 -0
- package/packages/sdk/tests/federation/pii.test.ts +106 -0
- package/packages/sdk/tests/federation/policy.test.ts +140 -0
- package/packages/sdk/tests/federation/trust.test.ts +124 -0
- package/packages/sdk/tests/mcp-tools.test.ts +204 -0
- package/packages/sdk/tests/memory-distillation.test.mjs +186 -0
- package/packages/sdk/tests/model-router.test.mjs +108 -0
- package/packages/sdk/tests/q-learning-router.test.mjs +100 -0
- package/packages/sdk/tests/router-orchestrator.test.mjs +172 -0
- package/packages/sdk/tests/router.test.mjs +91 -0
- package/packages/sdk/tests/sdk.test.mjs +172 -0
- package/packages/sdk/tests/swarm-topology.test.ts +258 -0
- package/packages/sdk/vitest.config.ts +1 -1
- package/scripts/bh-full-e2e.mjs +167 -368
- package/scripts/check-deps.mjs +28 -46
- package/scripts/mirror-claude-md.sh +78 -0
- package/scripts/test-in-container.sh +31 -9
- package/templates/clean-state-checklist.md +3 -3
- package/templates/sprint-contract.md +2 -2
- package/bizar-dash/.bizar/activity.log +0 -3
- package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
- package/bizar-dash/.omx/state/session.json +0 -10
- package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
- package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
- package/bizar-dash/bizar-design/canvas.html +0 -281
- package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/components.css +0 -1665
- package/bizar-dash/bizar-design/components.html +0 -557
- package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/agents.html +0 -74
- package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/memory.html +0 -75
- package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
- package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/overview.html +0 -95
- package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/settings.html +0 -70
- package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/icons.svg +0 -44
- package/bizar-dash/bizar-design/index.html +0 -192
- package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/agents.html +0 -29
- package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/memory.html +0 -28
- package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
- package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/overview.html +0 -33
- package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/settings.html +0 -28
- package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/prototype.js +0 -114
- package/bizar-dash/bizar-design/tokens.css +0 -106
- package/bizar-dash/dist/assets/MobileChat-BnKN_Ks_.js +0 -1
- package/bizar-dash/dist/assets/MobileSettings-DjCPxC-Q.js +0 -1
- package/bizar-dash/dist/assets/icons-Do5N2jmX.js.map +0 -1
- package/bizar-dash/dist/assets/main-DYiZqMrn.js +0 -18
- package/bizar-dash/dist/assets/main-DYiZqMrn.js.map +0 -1
- package/bizar-dash/dist/assets/main-ietCEg_R.css +0 -1
- package/bizar-dash/dist/assets/markdown-C6mXtQxD.js +0 -1
- package/bizar-dash/dist/assets/mobile-CMHqtLV2.js +0 -1
- package/bizar-dash/dist/assets/mobile-layout-3jIhHX_p.js +0 -2
- package/bizar-dash/dist/assets/mobile-layout-3jIhHX_p.js.map +0 -1
- package/bizar-dash/dist/assets/react-vendor-Dn4wqh4Z.js +0 -40
- package/bizar-dash/dist/assets/react-vendor-Dn4wqh4Z.js.map +0 -1
- package/bizar-dash/dist/assets/useSlashCommands-DtITw8Xv.js +0 -2
- package/bizar-dash/dist/assets/useSlashCommands-DtITw8Xv.js.map +0 -1
- package/bizar-dash/dist/assets/vendor-CeHGtduv.js +0 -29
- package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
- package/bizar-dash/node_modules/.package-lock.json +0 -6
- package/bizar-dash/package-lock.json +0 -6
- package/bizar-dash/src/server/cline-sdk.mjs +0 -132
- package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
- package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
- package/cli/commands/cline-cmd.mjs +0 -289
- package/cli/commands/validate.test.mjs +0 -379
- package/cli/doctor.test.mjs +0 -350
- package/config/cline.json.template +0 -342
- package/packages/sdk/src/client.ts +0 -188
- package/packages/sdk/src/cline-events.ts +0 -134
- package/packages/sdk/src/cline-types.ts +0 -66
- package/packages/sdk/src/cline.ts +0 -339
- package/packages/sdk/src/errors.ts +0 -129
- package/packages/sdk/src/events.ts +0 -153
- package/packages/sdk/src/types.ts +0 -176
- package/packages/sdk/tests/client.test.ts +0 -217
- package/packages/sdk/tests/errors.test.ts +0 -108
- package/packages/sdk/tests/events.test.ts +0 -139
- package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
- package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
- package/plugins/bizar/ARCHITECTURE.md +0 -142
- package/plugins/bizar/CONSTRAINTS.md +0 -67
- package/plugins/bizar/LICENSE +0 -21
- package/plugins/bizar/README.md +0 -448
- package/plugins/bizar/index.ts +0 -925
- package/plugins/bizar/package.json +0 -39
- package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
- package/plugins/bizar/src/background-state.ts +0 -641
- package/plugins/bizar/src/background.ts +0 -1806
- package/plugins/bizar/src/cline-runner.ts +0 -203
- package/plugins/bizar/src/clineruntime.ts +0 -227
- package/plugins/bizar/src/commands-impl.ts +0 -151
- package/plugins/bizar/src/commands.ts +0 -1799
- package/plugins/bizar/src/compaction.d.mts +0 -48
- package/plugins/bizar/src/compaction.mjs +0 -192
- package/plugins/bizar/src/dashboard-client.ts +0 -233
- package/plugins/bizar/src/event-stream.ts +0 -606
- package/plugins/bizar/src/fingerprint.ts +0 -120
- package/plugins/bizar/src/handoff.ts +0 -79
- package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
- package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
- package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
- package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
- package/plugins/bizar/src/http-client.ts +0 -467
- package/plugins/bizar/src/key-rotation.ts +0 -218
- package/plugins/bizar/src/logger.ts +0 -144
- package/plugins/bizar/src/loop-engineering.ts +0 -241
- package/plugins/bizar/src/loop.ts +0 -176
- package/plugins/bizar/src/mistake-recovery.ts +0 -98
- package/plugins/bizar/src/odin.ts +0 -227
- package/plugins/bizar/src/options.ts +0 -470
- package/plugins/bizar/src/plan-fs.ts +0 -323
- package/plugins/bizar/src/reasoning-clean.ts +0 -454
- package/plugins/bizar/src/report.ts +0 -178
- package/plugins/bizar/src/research-prompt.ts +0 -35
- package/plugins/bizar/src/serve-info.ts +0 -228
- package/plugins/bizar/src/serve.ts +0 -496
- package/plugins/bizar/src/settings.ts +0 -349
- package/plugins/bizar/src/state.ts +0 -298
- package/plugins/bizar/src/tool-discipline.ts +0 -105
- package/plugins/bizar/src/tools/agent-browser.ts +0 -315
- package/plugins/bizar/src/tools/bg-collect.ts +0 -131
- package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
- package/plugins/bizar/src/tools/bg-kill.ts +0 -116
- package/plugins/bizar/src/tools/bg-pause.ts +0 -99
- package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
- package/plugins/bizar/src/tools/bg-resume.ts +0 -94
- package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
- package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
- package/plugins/bizar/src/tools/bg-status.ts +0 -130
- package/plugins/bizar/src/tools/graph-query.ts +0 -278
- package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
- package/plugins/bizar/src/tools/memory-list.ts +0 -43
- package/plugins/bizar/src/tools/memory-read.ts +0 -69
- package/plugins/bizar/src/tools/memory-search.ts +0 -47
- package/plugins/bizar/src/tools/memory-write.ts +0 -54
- package/plugins/bizar/src/tools/open-kb.ts +0 -198
- package/plugins/bizar/src/tools/plan-action.ts +0 -785
- package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
- package/plugins/bizar/src/tools/sandbox.ts +0 -232
- package/plugins/bizar/src/tools/team-spawn.ts +0 -73
- package/plugins/bizar/src/tools/team-status.ts +0 -76
- package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
- package/plugins/bizar/src/trajectory.ts +0 -104
- package/plugins/bizar/tests/README.md +0 -99
- package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
- package/plugins/bizar/tests/background-state.test.ts +0 -277
- package/plugins/bizar/tests/background.test.ts +0 -402
- package/plugins/bizar/tests/block.test.ts +0 -195
- package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
- package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
- package/plugins/bizar/tests/commands-impl.test.ts +0 -316
- package/plugins/bizar/tests/commands.test.ts +0 -584
- package/plugins/bizar/tests/compaction.test.ts +0 -264
- package/plugins/bizar/tests/config.test.ts +0 -128
- package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
- package/plugins/bizar/tests/dispose.test.ts +0 -336
- package/plugins/bizar/tests/event-stream.test.ts +0 -409
- package/plugins/bizar/tests/event.test.ts +0 -262
- package/plugins/bizar/tests/fingerprint.test.ts +0 -190
- package/plugins/bizar/tests/http-client.test.ts +0 -404
- package/plugins/bizar/tests/init-helpers.test.ts +0 -203
- package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
- package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
- package/plugins/bizar/tests/key-rotation.test.ts +0 -396
- package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
- package/plugins/bizar/tests/loop.test.ts +0 -397
- package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
- package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
- package/plugins/bizar/tests/odin.test.ts +0 -125
- package/plugins/bizar/tests/options.test.ts +0 -329
- package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
- package/plugins/bizar/tests/safety.test.ts +0 -281
- package/plugins/bizar/tests/serve.test.ts +0 -339
- package/plugins/bizar/tests/settings.test.ts +0 -351
- package/plugins/bizar/tests/stall-think.test.ts +0 -750
- package/plugins/bizar/tests/state.test.ts +0 -276
- package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
- package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
- package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
- package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
- package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
- package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
- package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
- package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
- package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
- package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
- package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
- package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
- package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
- package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
- package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
- package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
- package/plugins/bizar/tests/tools/sandbox.test.ts +0 -117
- package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
- package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
- package/plugins/bizar/tsconfig.json +0 -29
- package/scripts/mirror-agents-md.sh +0 -69
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* src/server/task-delegator.mjs
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* v6.3.0 — Odin task delegation, REWRITTEN for Claude Code.
|
|
5
5
|
*
|
|
6
6
|
* Accepts a single "natural language" task from the user. Splits it into
|
|
7
7
|
* 1-5 subtasks via heuristic rules (an LLM call would replace this in
|
|
@@ -18,23 +18,18 @@
|
|
|
18
18
|
* Subtasks are always persisted to the regular tasks store first; the
|
|
19
19
|
* background dispatch is best-effort.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
21
|
+
* v6.3.0 — Dispatch path replaced. The previous Cline path shell-executed
|
|
22
|
+
* `node plugins/bizar/dist/cli.js bg enqueue`, then `cline run` via
|
|
23
|
+
* cline-runner.mjs. Claude Code has no equivalent `serve` child — the
|
|
24
|
+
* new path spawns `claude -p "<prompt>"` per subtask via
|
|
25
|
+
* `claude-runner.mjs` (in-process when the SDK is available,
|
|
26
|
+
* subprocess otherwise). The dispatch is gated on `pingClaudeSdk()`
|
|
27
|
+
* (in-process SDK reachable) OR the `claude` binary on PATH.
|
|
26
28
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* 4. Write a state file under ~/.cache/bizar/bg/ so the dashboard's
|
|
32
|
-
* background-store can list and kill it.
|
|
33
|
-
*
|
|
34
|
-
* If serve-info is missing (plugin not running) we log a clear warning
|
|
35
|
-
* at startup AND surface the dispatch failure in the `/submit` response,
|
|
36
|
-
* so the user can re-dispatch manually with `/api/tasks/:id/start`
|
|
37
|
-
* after the plugin is up.
|
|
29
|
+
* If neither is available we log a clear warning at startup AND
|
|
30
|
+
* surface the dispatch failure in the `/submit` response, so the
|
|
31
|
+
* user can re-dispatch manually with `/api/tasks/:id/start`
|
|
32
|
+
* once the runtime is up.
|
|
38
33
|
*/
|
|
39
34
|
|
|
40
35
|
import { tasksStore, ALLOWED_TASK_STATUSES } from './tasks-store.mjs';
|
|
@@ -84,6 +79,7 @@ function buildPromptText(sub) {
|
|
|
84
79
|
parts.push(`Subtask ID: ${sub.id}`);
|
|
85
80
|
parts.push(`Assigned agent: ${sub.assignee || 'tyr'}`);
|
|
86
81
|
parts.push(`Parent task ID: ${sub.parent || '(none)'}`);
|
|
82
|
+
parts.push(`Runtime: Claude Code (claude -p)`);
|
|
87
83
|
return parts.join('\n');
|
|
88
84
|
}
|
|
89
85
|
|
|
@@ -460,23 +456,25 @@ export const taskDelegator = {
|
|
|
460
456
|
},
|
|
461
457
|
|
|
462
458
|
/**
|
|
463
|
-
*
|
|
464
|
-
*
|
|
465
|
-
*
|
|
466
|
-
*
|
|
467
|
-
* `
|
|
459
|
+
* v6.3.0 — Best-effort dispatch to the Claude Code runtime.
|
|
460
|
+
* Replaces the v3.5.4 Cline HTTP-serve path. Spawns one
|
|
461
|
+
* `claude -p "<prompt>"` subprocess per subtask via
|
|
462
|
+
* `claude-runner.mjs` (or, when the SDK is available,
|
|
463
|
+
* `claude-bg-spawner.mjs`'s SDK-backed path).
|
|
468
464
|
*
|
|
469
|
-
*
|
|
470
|
-
*
|
|
471
|
-
*
|
|
465
|
+
* The runner writes its output to the LogWriter's log file under
|
|
466
|
+
* `~/.cache/bizar/logs/<sessionId>.log`. The dashboard's
|
|
467
|
+
* `backgroundStore.list()` and `kill()` paths find the instance
|
|
468
|
+
* via the per-instance state file at
|
|
469
|
+
* `~/.cache/bizar/bg/<instanceId>.json`.
|
|
472
470
|
*
|
|
473
471
|
* Returns a structured `{ dispatched: string[], errors: Array<…>, warnings: Array<…> }`
|
|
474
|
-
* so the caller (and `/api/tasks/submit`) can surface failures to
|
|
475
|
-
* user instead of swallowing them.
|
|
472
|
+
* so the caller (and `/api/tasks/submit`) can surface failures to
|
|
473
|
+
* the user instead of swallowing them.
|
|
476
474
|
*
|
|
477
|
-
* v3.5.1 — Respects agents.maxParallel: caps concurrent dispatches
|
|
478
|
-
* the configured limit; overflow subtasks are queued until a
|
|
479
|
-
* frees up.
|
|
475
|
+
* v3.5.1 — Respects agents.maxParallel: caps concurrent dispatches
|
|
476
|
+
* to the configured limit; overflow subtasks are queued until a
|
|
477
|
+
* slot frees up.
|
|
480
478
|
*
|
|
481
479
|
* @returns {Promise<{ dispatched: string[], errors: Array<{ subtaskId: string, kind: string, message: string }>, warnings: string[] }>}
|
|
482
480
|
*/
|
|
@@ -503,29 +501,32 @@ export const taskDelegator = {
|
|
|
503
501
|
const runningCount = await runningBgCount();
|
|
504
502
|
const slotsAvailable = Math.max(0, maxParallel - runningCount);
|
|
505
503
|
|
|
506
|
-
//
|
|
507
|
-
//
|
|
508
|
-
//
|
|
509
|
-
//
|
|
510
|
-
//
|
|
511
|
-
|
|
512
|
-
|
|
504
|
+
// v6.3.0 — Verify the Claude Code runtime is reachable. We
|
|
505
|
+
// accept either the in-process SDK or the `claude` binary on
|
|
506
|
+
// PATH. `pingClaudeSdk()` probes the SDK; `claude -v` on PATH
|
|
507
|
+
// is the subprocess fallback. When neither is available we
|
|
508
|
+
// mark subtasks as `dispatchPending: true` so the UI surfaces
|
|
509
|
+
// "Awaiting dispatch" and `/api/tasks/:id/start` can retry
|
|
510
|
+
// after the user installs Claude Code.
|
|
511
|
+
let claudeAvailable = false;
|
|
513
512
|
try {
|
|
514
|
-
const {
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
513
|
+
const { pingClaudeSdk } = await import('./claude-sdk.mjs');
|
|
514
|
+
claudeAvailable = await pingClaudeSdk();
|
|
515
|
+
} catch {
|
|
516
|
+
claudeAvailable = false;
|
|
517
|
+
}
|
|
518
|
+
if (!claudeAvailable) {
|
|
519
|
+
try {
|
|
520
|
+
const { spawnSync } = await import('node:child_process');
|
|
521
|
+
const probe = spawnSync('claude', ['-v'], { stdio: 'ignore', timeout: 1500 });
|
|
522
|
+
claudeAvailable = probe.status === 0;
|
|
523
|
+
} catch {
|
|
524
|
+
claudeAvailable = false;
|
|
525
525
|
}
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
|
|
526
|
+
}
|
|
527
|
+
if (!claudeAvailable) {
|
|
528
|
+
result.warnings.push('claude runtime not reachable — neither the @anthropic-ai/claude-agent-sdk nor the `claude` binary on PATH. Tasks will be marked queued; retry via POST /api/tasks/:id/start once Claude Code is installed.');
|
|
529
|
+
console.warn('[task-delegator] claude runtime unreachable — dispatch will be deferred.');
|
|
529
530
|
}
|
|
530
531
|
|
|
531
532
|
// Split: first N get dispatched now, rest are queued.
|
|
@@ -549,13 +550,13 @@ export const taskDelegator = {
|
|
|
549
550
|
});
|
|
550
551
|
}
|
|
551
552
|
|
|
552
|
-
//
|
|
553
|
-
//
|
|
554
|
-
// -
|
|
555
|
-
//
|
|
556
|
-
//
|
|
557
|
-
// -
|
|
558
|
-
// it.
|
|
553
|
+
// v6.3.0 — Per-subtask dispatch path. We collect errors instead
|
|
554
|
+
// of swallowing them. Two failure modes:
|
|
555
|
+
// - claudeAvailable=false: mark dispatchPending so the UI
|
|
556
|
+
// shows "Awaiting dispatch" and `/api/tasks/:id/start` can
|
|
557
|
+
// retry.
|
|
558
|
+
// - spawn failure: record error message so the API response
|
|
559
|
+
// carries it.
|
|
559
560
|
for (const sub of toDispatch) {
|
|
560
561
|
const startedAt = new Date().toISOString();
|
|
561
562
|
let bgInstanceId = null;
|
|
@@ -563,21 +564,19 @@ export const taskDelegator = {
|
|
|
563
564
|
let dispatchError = null;
|
|
564
565
|
let dispatchPending = false;
|
|
565
566
|
|
|
566
|
-
//
|
|
567
|
-
//
|
|
568
|
-
//
|
|
569
|
-
//
|
|
570
|
-
|
|
571
|
-
// and capture its output to the LogWriter's log file. The
|
|
572
|
-
// plugin's cline-runner.ts and this dashboard's
|
|
573
|
-
// cline-runner.mjs share the same wire format.
|
|
574
|
-
if (serveInfo && serveReachable) {
|
|
567
|
+
// v6.3.0 — Active dispatch path. Spawn one `claude -p` (or
|
|
568
|
+
// `claude --bg` for long-running sessions) subprocess per
|
|
569
|
+
// subtask via claude-runner.mjs. Capture the sessionId from
|
|
570
|
+
// the runner's JSON-line stream.
|
|
571
|
+
if (claudeAvailable) {
|
|
575
572
|
try {
|
|
576
|
-
const { spawnAgent } = await import('./
|
|
577
|
-
//
|
|
578
|
-
//
|
|
579
|
-
//
|
|
580
|
-
|
|
573
|
+
const { spawnAgent } = await import('./claude-runner.mjs');
|
|
574
|
+
// v6.3.0 — Prefer the bg-spawner's SDK-backed path when
|
|
575
|
+
// the SDK is reachable; fall back to the print-mode
|
|
576
|
+
// subprocess otherwise. We always pass `background: false`
|
|
577
|
+
// here so the runner returns a sessionId synchronously;
|
|
578
|
+
// the bg-spawner is used separately by the Active tab.
|
|
579
|
+
const dispatchWorktree = projectRoot || '';
|
|
581
580
|
const promptText = buildPromptText(sub);
|
|
582
581
|
|
|
583
582
|
// Predict the bg instance id (deterministic, derived from
|
|
@@ -597,14 +596,14 @@ export const taskDelegator = {
|
|
|
597
596
|
});
|
|
598
597
|
|
|
599
598
|
if (!spawnRes.ok || !spawnRes.sessionId) {
|
|
600
|
-
dispatchError = spawnRes.error || '
|
|
599
|
+
dispatchError = spawnRes.error || 'claude -p failed before reporting session id';
|
|
601
600
|
} else {
|
|
602
601
|
sessionId = spawnRes.sessionId;
|
|
603
602
|
bgInstanceId = predictedInstanceId;
|
|
604
603
|
|
|
605
604
|
// v3.5.5 — Wrap the agent run in a tmux session so
|
|
606
605
|
// operators can `tmux attach -t bizar-bg-<id>` and watch
|
|
607
|
-
// the
|
|
606
|
+
// the claude process in real time.
|
|
608
607
|
try {
|
|
609
608
|
const tmuxRes = backgroundStore.spawnTmuxFor(
|
|
610
609
|
`bg_${sessionId.slice(0, 16)}`,
|
|
@@ -623,9 +622,9 @@ export const taskDelegator = {
|
|
|
623
622
|
dispatchError = err instanceof Error ? err.message : String(err);
|
|
624
623
|
}
|
|
625
624
|
} else {
|
|
626
|
-
//
|
|
627
|
-
// dispatchPending flag. The UI surfaces this
|
|
628
|
-
// retry via POST /api/tasks/:id/start.
|
|
625
|
+
// Claude Code not available — leave the subtask marked
|
|
626
|
+
// queued with a dispatchPending flag. The UI surfaces this
|
|
627
|
+
// and the user can retry via POST /api/tasks/:id/start.
|
|
629
628
|
dispatchPending = true;
|
|
630
629
|
}
|
|
631
630
|
|
|
@@ -42,6 +42,8 @@ import { Doctor } from './views/Doctor';
|
|
|
42
42
|
import { Harness } from './views/Harness';
|
|
43
43
|
import { Eval } from './views/Eval';
|
|
44
44
|
import { EvalReport } from './views/EvalReport';
|
|
45
|
+
// v6.4.0 — F-036 Goal Planner UI.
|
|
46
|
+
import { GoalPlanner } from './views/GoalPlanner';
|
|
45
47
|
import { SettingsNav } from './components/SettingsNav';
|
|
46
48
|
import { Spinner } from './components/Spinner';
|
|
47
49
|
import { Button } from './components/Button';
|
|
@@ -108,6 +110,8 @@ const VIEW_MAP: Record<string, (p: ViewProps) => React.ReactNode> = {
|
|
|
108
110
|
// Eval view's "Open Eval Report" button (full report + diff).
|
|
109
111
|
eval: Eval,
|
|
110
112
|
evalReport: EvalReport,
|
|
113
|
+
// v6.4.0 — F-036 Goal Planner UI. Plain-English goal → A* plan.
|
|
114
|
+
'goal-planner': GoalPlanner,
|
|
111
115
|
};
|
|
112
116
|
|
|
113
117
|
const VERSION = 'v6.0.0';
|
|
@@ -1,17 +1,30 @@
|
|
|
1
1
|
// src/components/Tag.tsx — pill for tags.
|
|
2
2
|
|
|
3
|
-
import type { ReactNode } from 'react';
|
|
3
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
4
4
|
import { cn } from '../lib/utils';
|
|
5
5
|
|
|
6
|
-
export type
|
|
6
|
+
export type TagVariant =
|
|
7
|
+
| "neutral"
|
|
8
|
+
| "info"
|
|
9
|
+
| "accent"
|
|
10
|
+
| "primary"
|
|
11
|
+
| "success"
|
|
12
|
+
| "warning"
|
|
13
|
+
| "error";
|
|
14
|
+
|
|
15
|
+
export type TagProps = HTMLAttributes<HTMLSpanElement> & {
|
|
7
16
|
children: ReactNode;
|
|
8
17
|
className?: string;
|
|
18
|
+
variant?: TagVariant;
|
|
9
19
|
onRemove?: () => void;
|
|
10
20
|
};
|
|
11
21
|
|
|
12
|
-
export function Tag({ children, className, onRemove }: TagProps) {
|
|
22
|
+
export function Tag({ children, className, variant, onRemove, ...rest }: TagProps) {
|
|
13
23
|
return (
|
|
14
|
-
<span
|
|
24
|
+
<span
|
|
25
|
+
className={cn('tag', variant ? `tag-${variant}` : undefined, className)}
|
|
26
|
+
{...rest}
|
|
27
|
+
>
|
|
15
28
|
{children}
|
|
16
29
|
{onRemove && (
|
|
17
30
|
<button
|
|
@@ -25,4 +38,4 @@ export function Tag({ children, className, onRemove }: TagProps) {
|
|
|
25
38
|
)}
|
|
26
39
|
</span>
|
|
27
40
|
);
|
|
28
|
-
}
|
|
41
|
+
}
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
Brain,
|
|
27
27
|
Stethoscope,
|
|
28
28
|
ClipboardCheck,
|
|
29
|
+
Target,
|
|
29
30
|
type LucideIcon,
|
|
30
31
|
} from 'lucide-react';
|
|
31
32
|
import { cn } from '../lib/utils';
|
|
@@ -66,6 +67,8 @@ export const TABS: TabDef[] = [
|
|
|
66
67
|
{ id: 'doctor', label: 'Doctor', icon: Stethoscope },
|
|
67
68
|
// v6.0.0 — Harness engineering dashboard.
|
|
68
69
|
{ id: 'harness', label: 'Harness', icon: Shield },
|
|
70
|
+
// v6.4.0 — F-036 Goal Planner UI. Plain-English → A* plan.
|
|
71
|
+
{ id: 'goal-planner', label: 'Goals', icon: Target },
|
|
69
72
|
{ id: 'settings', label: 'Settings', icon: Sliders },
|
|
70
73
|
];
|
|
71
74
|
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// src/web/components/agents/CommunicationLog.tsx — inter-agent message bus trace.
|
|
2
|
+
//
|
|
3
|
+
// v6.4.0 — F-036 (Goal Planner UI). Subscribes to ws.ts for any
|
|
4
|
+
// event whose type starts with `agent:` and renders the last 200
|
|
5
|
+
// messages with color coding by type. Bounded virtual-list window
|
|
6
|
+
// so a runaway stream can't blow up the page.
|
|
7
|
+
import { useEffect, useState } from 'react';
|
|
8
|
+
import { MessageSquare, ArrowRight } from 'lucide-react';
|
|
9
|
+
import { Ws } from '../../lib/ws';
|
|
10
|
+
import { Card, CardTitle, CardMeta } from '../Card';
|
|
11
|
+
import { Tag } from '../Tag';
|
|
12
|
+
|
|
13
|
+
const MAX_ROWS = 200;
|
|
14
|
+
|
|
15
|
+
type Entry = {
|
|
16
|
+
id: string;
|
|
17
|
+
ts: number;
|
|
18
|
+
from: string;
|
|
19
|
+
to: string;
|
|
20
|
+
message: string;
|
|
21
|
+
kind: 'info' | 'request' | 'success' | 'warning' | 'error' | 'status' | 'restarted' | 'stuck' | 'message';
|
|
22
|
+
raw: unknown;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
function classify(t: string): Entry['kind'] {
|
|
26
|
+
if (t === 'agent:status') return 'status';
|
|
27
|
+
if (t === 'agent:restarted') return 'restarted';
|
|
28
|
+
if (t === 'agent:stuck') return 'stuck';
|
|
29
|
+
if (t === 'agent:message') return 'message';
|
|
30
|
+
return 'info';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function deriveEntry(t: string, payload: Record<string, unknown> | undefined, ts: number): Entry {
|
|
34
|
+
const kind = classify(t);
|
|
35
|
+
const id = `${ts}-${Math.random().toString(36).slice(2, 7)}`;
|
|
36
|
+
if (t === 'agent:message') {
|
|
37
|
+
const m = (payload?.message || payload) as Record<string, unknown>;
|
|
38
|
+
return {
|
|
39
|
+
id,
|
|
40
|
+
ts,
|
|
41
|
+
from: String(m?.from || 'unknown'),
|
|
42
|
+
to: String(m?.to || 'unknown'),
|
|
43
|
+
message: String(m?.text || m?.message || JSON.stringify(m).slice(0, 160)),
|
|
44
|
+
kind,
|
|
45
|
+
raw: payload,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const agent = (payload?.agent || payload) as Record<string, unknown>;
|
|
49
|
+
const name = String(agent?.name || 'agent');
|
|
50
|
+
return {
|
|
51
|
+
id,
|
|
52
|
+
ts,
|
|
53
|
+
from: name,
|
|
54
|
+
to: kind === 'stuck' ? 'orchestrator' : 'broadcast',
|
|
55
|
+
message: `${t} ${agent?.status ? `→ ${agent.status}` : ''}`.trim(),
|
|
56
|
+
kind,
|
|
57
|
+
raw: payload,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
interface Props {
|
|
62
|
+
/** Override the max row count (default 200). */
|
|
63
|
+
maxRows?: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function CommunicationLog({ maxRows = MAX_ROWS }: Props) {
|
|
67
|
+
const [rows, setRows] = useState<Entry[]>([]);
|
|
68
|
+
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
const ws = new Ws();
|
|
71
|
+
const off = ws.on((msg) => {
|
|
72
|
+
const t = (msg as { type?: string }).type;
|
|
73
|
+
if (!t || !t.startsWith('agent:')) return;
|
|
74
|
+
const m = msg as { type: string; ts?: number } & Record<string, unknown>;
|
|
75
|
+
const ts = Number(m.ts) || Date.now();
|
|
76
|
+
setRows((prev) => {
|
|
77
|
+
const next = [...prev, deriveEntry(t, m as Record<string, unknown>, ts)];
|
|
78
|
+
return next.length > maxRows ? next.slice(next.length - maxRows) : next;
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
return () => {
|
|
82
|
+
off();
|
|
83
|
+
ws.close();
|
|
84
|
+
};
|
|
85
|
+
}, [maxRows]);
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<Card className="comm-log" data-testid="communication-log">
|
|
89
|
+
<div className="comm-log-header">
|
|
90
|
+
<CardTitle>
|
|
91
|
+
<MessageSquare size={14} aria-hidden /> Communication log
|
|
92
|
+
</CardTitle>
|
|
93
|
+
<Tag variant="neutral" data-testid="communication-log-count">{rows.length}</Tag>
|
|
94
|
+
</div>
|
|
95
|
+
<CardMeta>Inter-agent message bus trace · bounded to {maxRows} rows</CardMeta>
|
|
96
|
+
<ul className="comm-log-list" data-testid="communication-log-list">
|
|
97
|
+
{rows.length === 0 && (
|
|
98
|
+
<li className="comm-log-empty" data-testid="communication-log-empty">
|
|
99
|
+
No agent messages yet. Stream will appear here live.
|
|
100
|
+
</li>
|
|
101
|
+
)}
|
|
102
|
+
{rows.slice().reverse().map((row) => (
|
|
103
|
+
<li
|
|
104
|
+
key={row.id}
|
|
105
|
+
className={`comm-log-row is-${row.kind}`}
|
|
106
|
+
data-testid="communication-log-row"
|
|
107
|
+
data-kind={row.kind}
|
|
108
|
+
>
|
|
109
|
+
<div className="comm-log-row-meta">
|
|
110
|
+
<span className="comm-log-from">{row.from}</span>
|
|
111
|
+
<ArrowRight size={12} aria-hidden />
|
|
112
|
+
<span className="comm-log-to">{row.to}</span>
|
|
113
|
+
<Tag variant="neutral" className={`comm-log-kind is-${row.kind}`}>{row.kind}</Tag>
|
|
114
|
+
<time className="comm-log-time" dateTime={new Date(row.ts).toISOString()}>
|
|
115
|
+
{new Date(row.ts).toLocaleTimeString()}
|
|
116
|
+
</time>
|
|
117
|
+
</div>
|
|
118
|
+
<div className="comm-log-message">{row.message}</div>
|
|
119
|
+
</li>
|
|
120
|
+
))}
|
|
121
|
+
</ul>
|
|
122
|
+
</Card>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export default CommunicationLog;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// src/web/components/agents/DependencyGraph.tsx — DAG of plan step dependencies.
|
|
2
|
+
//
|
|
3
|
+
// v6.4.0 — F-036 (Goal Planner UI). Uses @xyflow/react (already in
|
|
4
|
+
// Bizar deps) to render the plan's step graph. Falls back to a
|
|
5
|
+
// hand-rolled table when no plan is supplied.
|
|
6
|
+
import { useMemo } from 'react';
|
|
7
|
+
import {
|
|
8
|
+
ReactFlow,
|
|
9
|
+
Background,
|
|
10
|
+
Controls,
|
|
11
|
+
MiniMap,
|
|
12
|
+
type Node,
|
|
13
|
+
type Edge,
|
|
14
|
+
type NodeProps,
|
|
15
|
+
Handle,
|
|
16
|
+
Position,
|
|
17
|
+
} from '@xyflow/react';
|
|
18
|
+
import '@xyflow/react/dist/style.css';
|
|
19
|
+
import { GitBranch } from 'lucide-react';
|
|
20
|
+
import { Card, CardTitle, CardMeta } from '../Card';
|
|
21
|
+
import { Tag } from '../Tag';
|
|
22
|
+
import type { Plan } from '../../lib/goapPlanner';
|
|
23
|
+
|
|
24
|
+
interface Props {
|
|
25
|
+
plan: Plan | null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function StepNode({ data }: NodeProps<Node<{ label: string; action: string; agent: string }>>) {
|
|
29
|
+
return (
|
|
30
|
+
<div className={`dep-node is-${(data as { action?: string }).action || 'research'}`}>
|
|
31
|
+
<Handle type="target" position={Position.Left} className="dep-handle" />
|
|
32
|
+
<div className="dep-node-action">{(data as { action?: string }).action}</div>
|
|
33
|
+
<div className="dep-node-label">{(data as { label?: string }).label}</div>
|
|
34
|
+
<div className="dep-node-agent">@{(data as { agent?: string }).agent}</div>
|
|
35
|
+
<Handle type="source" position={Position.Right} className="dep-handle" />
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const nodeTypes = { step: StepNode };
|
|
41
|
+
|
|
42
|
+
export function DependencyGraph({ plan }: Props) {
|
|
43
|
+
const nodes: Node[] = useMemo(() => {
|
|
44
|
+
if (!plan) return [];
|
|
45
|
+
const n = plan.steps.length;
|
|
46
|
+
// Lay out nodes in a horizontal flow based on dep depth.
|
|
47
|
+
const depths = new Map<string, number>();
|
|
48
|
+
const computeDepth = (id: string, stack = new Set<string>()): number => {
|
|
49
|
+
const cached = depths.get(id);
|
|
50
|
+
if (cached !== undefined) return cached;
|
|
51
|
+
if (stack.has(id)) return 0;
|
|
52
|
+
stack.add(id);
|
|
53
|
+
const step = plan.steps.find((s) => s.id === id);
|
|
54
|
+
if (!step || step.deps.length === 0) {
|
|
55
|
+
depths.set(id, 0);
|
|
56
|
+
stack.delete(id);
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
let max = 0;
|
|
60
|
+
for (const dep of step.deps) {
|
|
61
|
+
const d = computeDepth(dep, stack);
|
|
62
|
+
if (d > max) max = d;
|
|
63
|
+
}
|
|
64
|
+
depths.set(id, max + 1);
|
|
65
|
+
stack.delete(id);
|
|
66
|
+
return max + 1;
|
|
67
|
+
};
|
|
68
|
+
for (const s of plan.steps) computeDepth(s.id);
|
|
69
|
+
|
|
70
|
+
const byDepth = new Map<number, string[]>();
|
|
71
|
+
for (const s of plan.steps) {
|
|
72
|
+
const d = depths.get(s.id) ?? 0;
|
|
73
|
+
const arr = byDepth.get(d) || [];
|
|
74
|
+
arr.push(s.id);
|
|
75
|
+
byDepth.set(d, arr);
|
|
76
|
+
}
|
|
77
|
+
const nodesOut: Node[] = [];
|
|
78
|
+
for (const [depth, ids] of byDepth) {
|
|
79
|
+
const total = ids.length;
|
|
80
|
+
ids.forEach((id, i) => {
|
|
81
|
+
const step = plan.steps.find((s) => s.id === id);
|
|
82
|
+
if (!step) return;
|
|
83
|
+
const xOffset = 60 + depth * 220;
|
|
84
|
+
const yOffset = 40 + (i - (total - 1) / 2) * 90;
|
|
85
|
+
nodesOut.push({
|
|
86
|
+
id: step.id,
|
|
87
|
+
type: 'step',
|
|
88
|
+
position: { x: xOffset, y: yOffset },
|
|
89
|
+
data: {
|
|
90
|
+
label: step.title,
|
|
91
|
+
action: step.action,
|
|
92
|
+
agent: step.agent,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
void n;
|
|
98
|
+
return nodesOut;
|
|
99
|
+
}, [plan]);
|
|
100
|
+
|
|
101
|
+
const edges: Edge[] = useMemo(() => {
|
|
102
|
+
if (!plan) return [];
|
|
103
|
+
return plan.steps.flatMap((step) =>
|
|
104
|
+
step.deps.map((dep) => ({
|
|
105
|
+
id: `${dep}->${step.id}`,
|
|
106
|
+
source: dep,
|
|
107
|
+
target: step.id,
|
|
108
|
+
animated: true,
|
|
109
|
+
})),
|
|
110
|
+
);
|
|
111
|
+
}, [plan]);
|
|
112
|
+
|
|
113
|
+
if (!plan) {
|
|
114
|
+
return (
|
|
115
|
+
<Card className="dep-graph" data-testid="dep-graph">
|
|
116
|
+
<CardTitle>
|
|
117
|
+
<GitBranch size={14} aria-hidden /> Dependency graph
|
|
118
|
+
</CardTitle>
|
|
119
|
+
<CardMeta>Submit a goal to render the dependency DAG.</CardMeta>
|
|
120
|
+
</Card>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (plan.steps.length === 0) {
|
|
125
|
+
return (
|
|
126
|
+
<Card className="dep-graph" data-testid="dep-graph">
|
|
127
|
+
<CardTitle>
|
|
128
|
+
<GitBranch size={14} aria-hidden /> Dependency graph
|
|
129
|
+
</CardTitle>
|
|
130
|
+
<CardMeta>Empty plan — nothing to render.</CardMeta>
|
|
131
|
+
</Card>
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return (
|
|
136
|
+
<Card className="dep-graph" data-testid="dep-graph">
|
|
137
|
+
<div className="dep-graph-header">
|
|
138
|
+
<CardTitle>
|
|
139
|
+
<GitBranch size={14} aria-hidden /> Dependency graph
|
|
140
|
+
</CardTitle>
|
|
141
|
+
<Tag variant="info">{plan.steps.length} nodes</Tag>
|
|
142
|
+
<Tag variant="accent">{edges.length} edges</Tag>
|
|
143
|
+
</div>
|
|
144
|
+
<CardMeta>Plan step DAG · {plan.goal.slice(0, 80)}</CardMeta>
|
|
145
|
+
<div className="dep-graph-canvas" data-testid="dep-graph-canvas">
|
|
146
|
+
<ReactFlow
|
|
147
|
+
nodes={nodes}
|
|
148
|
+
edges={edges}
|
|
149
|
+
nodeTypes={nodeTypes}
|
|
150
|
+
fitView
|
|
151
|
+
fitViewOptions={{ padding: 0.15 }}
|
|
152
|
+
proOptions={{ hideAttribution: true }}
|
|
153
|
+
>
|
|
154
|
+
<Background gap={16} size={1} />
|
|
155
|
+
<Controls showInteractive={false} />
|
|
156
|
+
<MiniMap pannable zoomable />
|
|
157
|
+
</ReactFlow>
|
|
158
|
+
</div>
|
|
159
|
+
</Card>
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export default DependencyGraph;
|