@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,27 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Bizar Memory Vault — Claude Code-native re-export of the
|
|
3
|
+
* Obsidian-compatible memory vault. This is the same implementation that
|
|
4
|
+
* previously lived at plugins/bizar/src/memory-vault.ts; it's framework-
|
|
5
|
+
* agnostic so we lifted it into the SDK so that:
|
|
3
6
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
+
* - The Claude Code MCP server (packages/sdk/src/mcp/server.ts) reads
|
|
8
|
+
* and writes memory in-process.
|
|
9
|
+
* - The bizar-dash dashboard imports the same code so the on-disk vault
|
|
10
|
+
* stays the single source of truth.
|
|
7
11
|
*
|
|
8
12
|
* Vault location: $BIZAR_MEMORY_VAULT or ~/.bizar_memory/ (default).
|
|
9
13
|
* Legacy: ~/.local/share/bizar/memory/ (still readable if it exists).
|
|
10
|
-
*
|
|
11
|
-
* Note format: Obsidian-compatible markdown with YAML frontmatter.
|
|
12
|
-
*
|
|
13
|
-
* ---
|
|
14
|
-
* key: value
|
|
15
|
-
* ---
|
|
16
|
-
* # Body
|
|
17
|
-
*
|
|
18
|
-
* This is a focused subset of the dashboard's full MarkdownMemoryStore
|
|
19
|
-
* (which includes git, schema validation, secrets scanning, semantic
|
|
20
|
-
* search via lightrag). The plugin needs read/write/list/search; for
|
|
21
|
-
* the heavier features, the dashboard is the source of truth.
|
|
22
14
|
*/
|
|
23
15
|
|
|
24
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
existsSync,
|
|
18
|
+
mkdirSync,
|
|
19
|
+
readdirSync,
|
|
20
|
+
readFileSync,
|
|
21
|
+
statSync,
|
|
22
|
+
writeFileSync,
|
|
23
|
+
} from "node:fs";
|
|
25
24
|
import { join, relative, sep } from "node:path";
|
|
26
25
|
import { homedir } from "node:os";
|
|
27
26
|
|
|
@@ -60,7 +59,6 @@ export function parseFrontmatter(raw: string): { frontmatter: Record<string, unk
|
|
|
60
59
|
let value: string | string[] = m[2] as string;
|
|
61
60
|
value = value.trim();
|
|
62
61
|
if (value.startsWith("[") && value.endsWith("]")) {
|
|
63
|
-
// YAML flow sequence: [a, b, c]
|
|
64
62
|
value = value.slice(1, -1).split(",").map((s) => s.trim()).filter(Boolean);
|
|
65
63
|
} else if (value === "true") value = "true";
|
|
66
64
|
else if (value === "false") value = "false";
|
|
@@ -82,7 +80,6 @@ export function serializeFrontmatter(frontmatter: Record<string, unknown>, body:
|
|
|
82
80
|
|
|
83
81
|
/** Read a single note. Returns null if not found. */
|
|
84
82
|
export function readNote(vaultRoot: string, relPath: string): MemoryNote | null {
|
|
85
|
-
// Path safety: reject .. and absolute
|
|
86
83
|
const safe = relPath.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
87
84
|
if (safe.includes("..") || safe.startsWith(".")) return null;
|
|
88
85
|
const fp = join(vaultRoot, safe);
|
|
@@ -113,7 +110,7 @@ export function writeNote(
|
|
|
113
110
|
}
|
|
114
111
|
|
|
115
112
|
/** List notes matching a prefix. */
|
|
116
|
-
export function listNotes(vaultRoot: string, prefix
|
|
113
|
+
export function listNotes(vaultRoot: string, prefix = "", limit = 100): MemoryNote[] {
|
|
117
114
|
if (!existsSync(vaultRoot)) return [];
|
|
118
115
|
const out: MemoryNote[] = [];
|
|
119
116
|
walk(vaultRoot, vaultRoot, out, limit, prefix);
|
|
@@ -141,7 +138,7 @@ function walk(root: string, dir: string, out: MemoryNote[], limit: number, prefi
|
|
|
141
138
|
}
|
|
142
139
|
|
|
143
140
|
/** Full-text search over note bodies + frontmatter. */
|
|
144
|
-
export function searchNotes(vaultRoot: string, query: string, limit
|
|
141
|
+
export function searchNotes(vaultRoot: string, query: string, limit = 20): MemoryNote[] {
|
|
145
142
|
const q = query.toLowerCase();
|
|
146
143
|
const notes = listNotes(vaultRoot, "", 1000);
|
|
147
144
|
const out: { note: MemoryNote; score: number }[] = [];
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* router/codemod-intent.ts — Tier-1 codemod intent detection.
|
|
3
|
+
*
|
|
4
|
+
* v6.4.0 — ported from ruflo `enhanced-model-router.ts` (ADR-026, ADR-143).
|
|
5
|
+
*
|
|
6
|
+
* Three deterministic intents are eligible for $0 Tier-1 codemod
|
|
7
|
+
* execution — they can be applied structurally, no LLM in the loop:
|
|
8
|
+
*
|
|
9
|
+
* - `var-to-const` — convert `var` declarations to `const` / `let`.
|
|
10
|
+
* - `remove-console` — strip `console.*` calls.
|
|
11
|
+
* - `add-logging` — add `console.*` / logger statements.
|
|
12
|
+
*
|
|
13
|
+
* Other intents (`add-types`, `add-error-handling`, `async-await`, …)
|
|
14
|
+
* REQUIRE judgement and route to a model tier (Tier-2/3); they are
|
|
15
|
+
* explicitly OUT OF SCOPE for this detector. See ADR-143.
|
|
16
|
+
*
|
|
17
|
+
* Pure function — no I/O. Confidence is the match strength
|
|
18
|
+
* (number of distinct regex patterns that hit, normalised by pattern
|
|
19
|
+
* count; capped at 1.0). Returning `null` means the prompt is NOT
|
|
20
|
+
* codemod-eligible and the caller should consult the bandit / neural
|
|
21
|
+
* router.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
export type CodemodIntent = "var-to-const" | "remove-console" | "add-logging";
|
|
25
|
+
|
|
26
|
+
export interface CodemodIntentHit {
|
|
27
|
+
intent: CodemodIntent;
|
|
28
|
+
confidence: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const PATTERNS: Record<CodemodIntent, RegExp[]> = {
|
|
32
|
+
"var-to-const": [
|
|
33
|
+
/convert\s+var\s+to\s+const/i,
|
|
34
|
+
/convert\s+var\s+declarations?\s+to\s+const/i,
|
|
35
|
+
/change\s+var\s+to\s+const/i,
|
|
36
|
+
/change\s+var\s+declarations?\s+to\s+const/i,
|
|
37
|
+
/replace\s+var\s+with\s+const/i,
|
|
38
|
+
/var\s*(?:→|->|to)\s*const/i,
|
|
39
|
+
/use\s+const\s+instead\s+of\s+var/i,
|
|
40
|
+
/\bvar\s+to\s+const\b/i,
|
|
41
|
+
],
|
|
42
|
+
"remove-console": [
|
|
43
|
+
/remove\s+(?:all\s+)?console\.log/i,
|
|
44
|
+
/remove\s+(?:all\s+)?console\s+statements?/i,
|
|
45
|
+
/delete\s+(?:all\s+)?console\s+statements?/i,
|
|
46
|
+
/strip\s+console/i,
|
|
47
|
+
/clean\s+up\s+console/i,
|
|
48
|
+
/clean\s+up\s+debug\s+logs?/i,
|
|
49
|
+
/remove\s+(?:all\s+)?debug\s+logs?/i,
|
|
50
|
+
/delete\s+(?:all\s+)?console\.log/i,
|
|
51
|
+
/strip\s+(?:all\s+)?console/i,
|
|
52
|
+
],
|
|
53
|
+
"add-logging": [
|
|
54
|
+
/\badd\s+logging\b/i,
|
|
55
|
+
/\badd\s+console\.log\b/i,
|
|
56
|
+
/\badd\s+debug\s+logs?\b/i,
|
|
57
|
+
/\blog\s+this\s+function\b/i,
|
|
58
|
+
/\badd\s+trace\s+logging\b/i,
|
|
59
|
+
/\binstrument\s+with\s+logs?\b/i,
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Default confidence threshold for `detectCodemodIntent`. The function
|
|
65
|
+
* returns `null` for pattern-set hits with confidence below this.
|
|
66
|
+
*
|
|
67
|
+
* Kept intentionally low (0.1) so a single canonical phrase on a
|
|
68
|
+
* 7-pattern intent — natural prompts like "convert var to const" —
|
|
69
|
+
* still short-circuits the bandit. Callers that want stricter
|
|
70
|
+
* filtering (the F-033 orchestrator `decideAgentWith`, see ADR-174)
|
|
71
|
+
* can pass `threshold` explicitly.
|
|
72
|
+
*
|
|
73
|
+
* Strong threshold the spec mentions ("Return null if confidence < 0.6")
|
|
74
|
+
* is exported as `STRICT_CODEMOD_CONFIDENCE_THRESHOLD` below.
|
|
75
|
+
*/
|
|
76
|
+
export const DEFAULT_CODEMOD_CONFIDENCE_THRESHOLD = 0.1;
|
|
77
|
+
export const STRICT_CODEMOD_CONFIDENCE_THRESHOLD = 0.6;
|
|
78
|
+
/** Alias used in the spec — kept for backwards compat. */
|
|
79
|
+
export const CODEMOD_CONFIDENCE_THRESHOLD = DEFAULT_CODEMOD_CONFIDENCE_THRESHOLD;
|
|
80
|
+
|
|
81
|
+
export interface CodemodDetectionOptions {
|
|
82
|
+
/** Override the threshold. Default:
|
|
83
|
+
* `DEFAULT_CODEMOD_CONFIDENCE_THRESHOLD` (=0.1). */
|
|
84
|
+
threshold?: number;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Probe whether a prompt matches one of the deterministic codemod
|
|
89
|
+
* intents. Order matters only for tie-breaking: we return the FIRST
|
|
90
|
+
* intent whose overall score is highest in case of a multi-intent
|
|
91
|
+
* tie.
|
|
92
|
+
*
|
|
93
|
+
* Confidence is `hits / patterns.length`. A single regex hit on a
|
|
94
|
+
* intent with 7 patterns yields confidence 1/7 ≈ 0.14 — enough to
|
|
95
|
+
* flag the intent but well below 1.0 so the caller can decide
|
|
96
|
+
* whether to escalate. Two hits on a smaller intent (say 4
|
|
97
|
+
* patterns) yields 0.5 — past the 0.4 bandit-confirmation
|
|
98
|
+
* threshold.
|
|
99
|
+
*
|
|
100
|
+
* Result filtered by `opts.threshold` (default 0.1). When the
|
|
101
|
+
* strongest pattern-set hit is below the threshold the function
|
|
102
|
+
* returns `null` so the caller falls through to Q-learning / bandit.
|
|
103
|
+
*/
|
|
104
|
+
export function detectCodemodIntent(
|
|
105
|
+
prompt: string,
|
|
106
|
+
opts: CodemodDetectionOptions = {},
|
|
107
|
+
): CodemodIntentHit | null {
|
|
108
|
+
if (!prompt || typeof prompt !== "string") return null;
|
|
109
|
+
|
|
110
|
+
let best: { intent: CodemodIntent; confidence: number } | null = null;
|
|
111
|
+
for (const intent of Object.keys(PATTERNS) as CodemodIntent[]) {
|
|
112
|
+
const patterns = PATTERNS[intent];
|
|
113
|
+
let hits = 0;
|
|
114
|
+
for (const p of patterns) if (p.test(prompt)) hits += 1;
|
|
115
|
+
if (hits === 0) continue;
|
|
116
|
+
const confidence = hits / patterns.length;
|
|
117
|
+
if (best === null || confidence > best.confidence) {
|
|
118
|
+
best = { intent, confidence };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (best === null) return null;
|
|
122
|
+
const threshold = opts.threshold ?? DEFAULT_CODEMOD_CONFIDENCE_THRESHOLD;
|
|
123
|
+
if (best.confidence < threshold) return null;
|
|
124
|
+
return best;
|
|
125
|
+
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* router/index.ts — orchestrator for Bizar's self-learning router.
|
|
3
|
+
*
|
|
4
|
+
* v6.4.0 — F-033. Composes the three sub-routers
|
|
5
|
+
* (`codemod-intent`, `model-router`, `q-learning-router`) into a
|
|
6
|
+
* single precedence chain:
|
|
7
|
+
*
|
|
8
|
+
* explicit-route (caller-provided) >
|
|
9
|
+
* codemod-intent ($0 Tier-1 short-circuit) >
|
|
10
|
+
* q-learning-router (8-action agent pick) >
|
|
11
|
+
* model-router (Thompson bandit for tier) >
|
|
12
|
+
* default ("odin", "mid", confidence 0.5)
|
|
13
|
+
*
|
|
14
|
+
* The orchestrator is what the `hooks_route` MCP tool (and any
|
|
15
|
+
* in-process caller such as the Odin agent) calls to make a routing
|
|
16
|
+
* decision. It surfaces two human-readable tags on `stdout`-equivalent
|
|
17
|
+
* surfaces:
|
|
18
|
+
*
|
|
19
|
+
* - `[CODEMOD_AVAILABLE] <intent>` — printed BEFORE the model call
|
|
20
|
+
* would happen, telling the model that a deterministic $0 codemod
|
|
21
|
+
* could short-circuit the work. Honoured by the Odin prompt.
|
|
22
|
+
* - `[TASK_MODEL_RECOMMENDATION] <tier> (conf=<n>)` — appended to
|
|
23
|
+
* prompt-side telemetry so downstream model selection knows the
|
|
24
|
+
* bandit-learner thinks this task should be routed to `flash` /
|
|
25
|
+
* `mid` / `expensive`.
|
|
26
|
+
*
|
|
27
|
+
* Persistence: when constructed via `getRouter({ persist: true })`,
|
|
28
|
+
* the orchestrator holds a single shared `ModelRouter` +
|
|
29
|
+
* `QLearningRouter` whose state lives at `.harness/router-state.json`
|
|
30
|
+
* and `.harness/q-router-state.json` respectively. Callers can also
|
|
31
|
+
* pass `modelRouter` / `qRouter` for in-memory-only operation
|
|
32
|
+
* (preferred in tests).
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
36
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
37
|
+
|
|
38
|
+
import {
|
|
39
|
+
detectCodemodIntent,
|
|
40
|
+
type CodemodIntent,
|
|
41
|
+
CODEMOD_CONFIDENCE_THRESHOLD,
|
|
42
|
+
} from "./codemod-intent.js";
|
|
43
|
+
import {
|
|
44
|
+
ModelRouter,
|
|
45
|
+
type ModelTier,
|
|
46
|
+
type RouteDecision,
|
|
47
|
+
} from "./model-router.js";
|
|
48
|
+
import {
|
|
49
|
+
QLearningRouter,
|
|
50
|
+
AGENT_ACTIONS,
|
|
51
|
+
type AgentRouteDecision,
|
|
52
|
+
} from "./q-learning-router.js";
|
|
53
|
+
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Public types
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
export interface RouteInput {
|
|
59
|
+
task: string;
|
|
60
|
+
/** Caller-provided explicit override for the agent (highest precedence). */
|
|
61
|
+
explicitAgent?: string;
|
|
62
|
+
/** Optional embedding — currently ignored (reserved for future ANN
|
|
63
|
+
* lookup that could refine the state bucket). */
|
|
64
|
+
embedding?: number[];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface RouteDecisionOutput {
|
|
68
|
+
agent: string;
|
|
69
|
+
modelTier: ModelTier;
|
|
70
|
+
agentConfidence: number;
|
|
71
|
+
modelConfidence: number;
|
|
72
|
+
/** Null unless the prompt matched a Tier-1 codemod intent. */
|
|
73
|
+
codemodIntent: CodemodIntent | null;
|
|
74
|
+
/** `[CODEMOD_AVAILABLE] var-to-const` style surface for prompt pre-injection. */
|
|
75
|
+
surfacedTags: string[];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface RouterBundle {
|
|
79
|
+
modelRouter: ModelRouter;
|
|
80
|
+
qRouter: QLearningRouter;
|
|
81
|
+
decideAgent(input: RouteInput): RouteDecisionOutput;
|
|
82
|
+
/** Persist both routers to `path`'s sibling state files. */
|
|
83
|
+
saveTo(path: string): void;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Factory
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
|
|
90
|
+
export interface GetRouterOpts {
|
|
91
|
+
/** When provided, the orchestrator attempts to load priors + Q-table
|
|
92
|
+
* from `<basePath>.{model,q}` if those files exist; missing files
|
|
93
|
+
* fall back to defaults. */
|
|
94
|
+
basePath?: string;
|
|
95
|
+
/** In-memory overrides — useful for tests. */
|
|
96
|
+
modelRouter?: ModelRouter;
|
|
97
|
+
qRouter?: QLearningRouter;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Default state-file paths (kept beside the orchestrator's caller). */
|
|
101
|
+
export const DEFAULT_MODEL_STATE_PATH = ".harness/router-state.json";
|
|
102
|
+
export const DEFAULT_Q_STATE_PATH = ".harness/q-router-state.json";
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Build (or rehydrate) a router bundle.
|
|
106
|
+
*
|
|
107
|
+
* Default state files are stored under `.harness/` in the current
|
|
108
|
+
* working directory. Tests typically pass `modelRouter` / `qRouter`
|
|
109
|
+
* to keep things in-process.
|
|
110
|
+
*/
|
|
111
|
+
export function getRouter(opts: GetRouterOpts = {}): RouterBundle {
|
|
112
|
+
const basePath = opts.basePath ?? join(process.cwd(), ".harness", "router-state");
|
|
113
|
+
const modelPath = `${basePath}.model`;
|
|
114
|
+
const qPath = `${basePath}.q`;
|
|
115
|
+
|
|
116
|
+
const modelRouter =
|
|
117
|
+
opts.modelRouter ??
|
|
118
|
+
(existsSync(modelPath) ? ModelRouter.loadFrom(modelPath) : new ModelRouter());
|
|
119
|
+
const qRouter =
|
|
120
|
+
opts.qRouter ??
|
|
121
|
+
(existsSync(qPath) ? QLearningRouter.loadFrom(qPath) : new QLearningRouter());
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
modelRouter,
|
|
125
|
+
qRouter,
|
|
126
|
+
decideAgent(input: RouteInput): RouteDecisionOutput {
|
|
127
|
+
return decideAgentWith(modelRouter, qRouter, input);
|
|
128
|
+
},
|
|
129
|
+
saveTo(path: string): void {
|
|
130
|
+
const fp = isAbsolute(path) ? path : resolve(path);
|
|
131
|
+
mkdirSync(dirname(fp), { recursive: true });
|
|
132
|
+
modelRouter.saveTo(modelPath);
|
|
133
|
+
qRouter.saveTo(qPath);
|
|
134
|
+
// And a tiny pointer file for callers that only know the bundle name.
|
|
135
|
+
writeFileSync(
|
|
136
|
+
fp,
|
|
137
|
+
JSON.stringify({ modelPath, qPath, version: 1 }, null, 2),
|
|
138
|
+
"utf-8",
|
|
139
|
+
);
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Pure, testable entry point — the actual precedence chain.
|
|
146
|
+
*
|
|
147
|
+
* Order:
|
|
148
|
+
* 1. caller-supplied `explicitAgent` wins outright.
|
|
149
|
+
* 2. Tier-1 codemod intent → agent="heimdall" (routine implementation),
|
|
150
|
+
* tier="flash" ($0), confidence 1.0, surface `[CODEMOD_AVAILABLE]`.
|
|
151
|
+
* 3. Q-learning agent pick (clamped to known agent names).
|
|
152
|
+
* 4. Thompson-bandit model-tier pick.
|
|
153
|
+
* 5. Defaults: agent="odin", tier="mid".
|
|
154
|
+
*/
|
|
155
|
+
export function decideAgentWith(
|
|
156
|
+
modelRouter: ModelRouter,
|
|
157
|
+
qRouter: QLearningRouter,
|
|
158
|
+
input: RouteInput,
|
|
159
|
+
): RouteDecisionOutput {
|
|
160
|
+
const task = String(input?.task ?? "");
|
|
161
|
+
const surfacedTags: string[] = [];
|
|
162
|
+
|
|
163
|
+
// 1. Explicit override — highest precedence.
|
|
164
|
+
if (input.explicitAgent && AGENT_ACTIONS.includes(input.explicitAgent)) {
|
|
165
|
+
// Still pick a model tier (bandit) so we can surface
|
|
166
|
+
// [TASK_MODEL_RECOMMENDATION] downstream.
|
|
167
|
+
const tier: RouteDecision = modelRouter.route(task);
|
|
168
|
+
surfacedTags.push(tierTag(tier));
|
|
169
|
+
return {
|
|
170
|
+
agent: input.explicitAgent,
|
|
171
|
+
modelTier: tier.tier,
|
|
172
|
+
agentConfidence: 1.0,
|
|
173
|
+
modelConfidence: tier.confidence,
|
|
174
|
+
codemodIntent: null,
|
|
175
|
+
surfacedTags,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// 2. Codemod short-circuit (only when there's a task string).
|
|
180
|
+
const cm = task ? detectCodemodIntent(task) : null;
|
|
181
|
+
if (cm !== null) {
|
|
182
|
+
surfacedTags.push(codemodTag(cm.intent, cm.confidence));
|
|
183
|
+
// Tier-1 codemod: $0, model tier = "flash" but the call is
|
|
184
|
+
// supposed to be skipped (deterministic). We still set
|
|
185
|
+
// modelTier/Confidence so downstream telemetry has consistent
|
|
186
|
+
// shape.
|
|
187
|
+
surfacedTags.push(tierTag({ tier: "flash", confidence: 1.0 }));
|
|
188
|
+
return {
|
|
189
|
+
agent: "heimdall",
|
|
190
|
+
modelTier: "flash",
|
|
191
|
+
agentConfidence: 1.0,
|
|
192
|
+
modelConfidence: 1.0,
|
|
193
|
+
codemodIntent: cm.intent,
|
|
194
|
+
surfacedTags,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// 3. Q-learning agent pick.
|
|
199
|
+
const agentDecision: AgentRouteDecision = qRouter.selectAgent(task);
|
|
200
|
+
// 4. Thompson bandit for model tier.
|
|
201
|
+
const tierDecision: RouteDecision = modelRouter.route(task);
|
|
202
|
+
surfacedTags.push(tierTag(tierDecision));
|
|
203
|
+
|
|
204
|
+
return {
|
|
205
|
+
agent: agentDecision.agent,
|
|
206
|
+
modelTier: tierDecision.tier,
|
|
207
|
+
agentConfidence: agentDecision.confidence,
|
|
208
|
+
modelConfidence: tierDecision.confidence,
|
|
209
|
+
codemodIntent: null,
|
|
210
|
+
surfacedTags,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
// Tag formatters — the strings the spec asks us to surface to the prompt.
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
|
|
218
|
+
export function codemodTag(intent: CodemodIntent, confidence: number): string {
|
|
219
|
+
return `[CODEMOD_AVAILABLE] ${intent} (conf=${confidence.toFixed(2)} >= ${CODEMOD_CONFIDENCE_THRESHOLD.toFixed(2)})`;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export function tierTag(decision: RouteDecision): string {
|
|
223
|
+
return `[TASK_MODEL_RECOMMENDATION] ${decision.tier} (conf=${decision.confidence.toFixed(2)})`;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
// Convenience re-exports so callers can `import { ... } from "..."/router"
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
|
|
230
|
+
export {
|
|
231
|
+
detectCodemodIntent,
|
|
232
|
+
CODEMOD_CONFIDENCE_THRESHOLD,
|
|
233
|
+
} from "./codemod-intent.js";
|
|
234
|
+
export type { CodemodIntent, CodemodIntentHit } from "./codemod-intent.js";
|
|
235
|
+
|
|
236
|
+
export {
|
|
237
|
+
ModelRouter,
|
|
238
|
+
type ModelTier,
|
|
239
|
+
type RouteDecision,
|
|
240
|
+
} from "./model-router.js";
|
|
241
|
+
|
|
242
|
+
export {
|
|
243
|
+
QLearningRouter,
|
|
244
|
+
AGENT_ACTIONS,
|
|
245
|
+
type AgentName,
|
|
246
|
+
type AgentRouteDecision,
|
|
247
|
+
} from "./q-learning-router.js";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* router/memory-distillation-shim.mjs — runtime-only ESM re-export of
|
|
3
|
+
* `memory-distillation.ts` so the `memory_distill` MCP tool can
|
|
4
|
+
* dynamically `import()` the pipeline without taking a static
|
|
5
|
+
* dependency on the heavier consolidation logic.
|
|
6
|
+
*
|
|
7
|
+
* v6.4.0 — F-033 (Self-Learning, ADR-174). Lives next to its sibling
|
|
8
|
+
* `memory-distillation.ts`; the parent keeps the strict TS surface,
|
|
9
|
+
* this shim keeps the runtime import ESM-clean for the MCP tool.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
runDistillation,
|
|
14
|
+
retrieve,
|
|
15
|
+
judge,
|
|
16
|
+
distill,
|
|
17
|
+
PROVENANCE_TIERS,
|
|
18
|
+
} from "./memory-distillation.js";
|