@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.
Files changed (540) hide show
  1. package/.claude/CLAUDE.md +15 -0
  2. package/.claude/agents/_shared/AGENT_BASELINE.md +168 -0
  3. package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
  4. package/.claude/agents/_shared/SKILLS.md +109 -0
  5. package/.claude/agents/agent-browser.md +80 -0
  6. package/.claude/agents/baldr.md +49 -0
  7. package/.claude/agents/forseti.md +51 -0
  8. package/.claude/agents/frigg.md +42 -0
  9. package/.claude/agents/heimdall.md +33 -0
  10. package/.claude/agents/hermod.md +53 -0
  11. package/.claude/agents/mimir.md +49 -0
  12. package/.claude/agents/odin.md +287 -0
  13. package/.claude/agents/quick.md +34 -0
  14. package/.claude/agents/semble-search.md +50 -0
  15. package/.claude/agents/thor.md +53 -0
  16. package/.claude/agents/tyr.md +56 -0
  17. package/.claude/agents/vidarr.md +54 -0
  18. package/.claude/agents/vor.md +53 -0
  19. package/.claude/commands/audit.md +25 -0
  20. package/.claude/commands/bizar.md +22 -0
  21. package/.claude/commands/explain.md +17 -0
  22. package/.claude/commands/init.md +29 -0
  23. package/.claude/commands/learn.md +44 -0
  24. package/.claude/commands/plan.md +35 -0
  25. package/.claude/commands/plow-through.md +50 -0
  26. package/.claude/commands/pr-review.md +49 -0
  27. package/.claude/commands/setup-provider.md +96 -0
  28. package/.claude/commands/tailscale-serve.md +100 -0
  29. package/.claude/commands/team.md +132 -0
  30. package/.claude/commands/test.md +62 -0
  31. package/.claude/commands/validate.md +68 -0
  32. package/.claude/commands/visual-plan.md +24 -0
  33. package/.claude/hooks/README.md +92 -0
  34. package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
  35. package/.claude/hooks/pretooluse-bash.mjs +81 -0
  36. package/.claude/hooks/pretooluse-editwrite.mjs +139 -0
  37. package/.claude/hooks/sessionend-recall.mjs +74 -0
  38. package/.claude/hooks/sessionstart-prime.mjs +80 -0
  39. package/.claude/hooks/userpromptsubmit-tag.mjs +80 -0
  40. package/.claude/hooks/worker-suggest.mjs +110 -0
  41. package/.claude/settings.json +125 -0
  42. package/.claude/skills/9router/SKILL.md +80 -0
  43. package/.claude/skills/9router-chat/SKILL.md +73 -0
  44. package/.claude/skills/9router-embeddings/SKILL.md +69 -0
  45. package/.claude/skills/9router-image/SKILL.md +86 -0
  46. package/.claude/skills/9router-stt/SKILL.md +79 -0
  47. package/.claude/skills/9router-tts/SKILL.md +80 -0
  48. package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
  49. package/.claude/skills/9router-web-search/SKILL.md +91 -0
  50. package/.claude/skills/bizar/README.md +9 -0
  51. package/.claude/skills/bizar/SKILL.md +450 -0
  52. package/.claude/skills/cpp-coding-standards/README.md +28 -0
  53. package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
  54. package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
  55. package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
  56. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
  57. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
  58. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
  59. package/.claude/skills/cpp-testing/README.md +28 -0
  60. package/.claude/skills/cpp-testing/SKILL.md +304 -0
  61. package/.claude/skills/cpp-testing/references/coverage.md +370 -0
  62. package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
  63. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
  64. package/.claude/skills/cpp-testing/references/mocking.md +364 -0
  65. package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
  66. package/.claude/skills/cubesandbox/SKILL.md +148 -0
  67. package/.claude/skills/embedded-esp-idf/README.md +41 -0
  68. package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
  69. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
  70. package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
  71. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
  72. package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
  73. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
  74. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
  75. package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
  76. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
  77. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
  78. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
  79. package/.claude/skills/glyph/SKILL.md +163 -0
  80. package/.claude/skills/harness-engineering/SKILL.md +143 -0
  81. package/.claude/skills/lightrag/SKILL.md +81 -0
  82. package/.claude/skills/memory-protocol/SKILL.md +105 -0
  83. package/.claude/skills/obsidian/SKILL.md +306 -0
  84. package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
  85. package/.claude/skills/self-improvement/SKILL.md +64 -0
  86. package/README.md +87 -59
  87. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js → EnvVarsSection-CW6fWKds.js} +3 -3
  88. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js.map → EnvVarsSection-CW6fWKds.js.map} +1 -1
  89. package/bizar-dash/dist/assets/MobileChat-D7zRhU9K.js +1 -0
  90. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js.map → MobileChat-D7zRhU9K.js.map} +1 -1
  91. package/bizar-dash/dist/assets/MobileSettings-K-sNsn_r.js +1 -0
  92. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js.map → MobileSettings-K-sNsn_r.js.map} +1 -1
  93. package/bizar-dash/dist/assets/{Toast-Cpl6-E63.js → Toast-WTxc3m2g.js} +1 -1
  94. package/bizar-dash/dist/assets/{Toast-Cpl6-E63.js.map → Toast-WTxc3m2g.js.map} +1 -1
  95. package/bizar-dash/dist/assets/flow-BpU0-gK2.js +1 -0
  96. package/bizar-dash/dist/assets/flow-BpU0-gK2.js.map +1 -0
  97. package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js +1 -0
  98. package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js.map +1 -0
  99. package/bizar-dash/dist/assets/{icons-Do5N2jmX.js → icons-B0AKnYI3.js} +98 -103
  100. package/bizar-dash/dist/assets/icons-B0AKnYI3.js.map +1 -0
  101. package/bizar-dash/dist/assets/main-C-Md3DaY.css +1 -0
  102. package/bizar-dash/dist/assets/main-CO8fIxQK.js +18 -0
  103. package/bizar-dash/dist/assets/main-CO8fIxQK.js.map +1 -0
  104. package/bizar-dash/dist/assets/markdown-w2bDDkAH.js +1 -0
  105. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js.map → markdown-w2bDDkAH.js.map} +1 -1
  106. package/bizar-dash/dist/assets/mobile-DXYCA0hC.js +1 -0
  107. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js.map → mobile-DXYCA0hC.js.map} +1 -1
  108. package/bizar-dash/dist/assets/mobile-layout-DSmtNPja.js +2 -0
  109. package/bizar-dash/dist/assets/mobile-layout-DSmtNPja.js.map +1 -0
  110. package/bizar-dash/dist/assets/react-vendor-BnuhLJ6X.css +1 -0
  111. package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js +46 -0
  112. package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js.map +1 -0
  113. package/bizar-dash/dist/assets/useSlashCommands-3DFLOfpk.js +2 -0
  114. package/bizar-dash/dist/assets/useSlashCommands-3DFLOfpk.js.map +1 -0
  115. package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js +45 -0
  116. package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js.map +1 -0
  117. package/bizar-dash/dist/index.html +12 -10
  118. package/bizar-dash/dist/mobile.html +7 -4
  119. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  120. package/bizar-dash/src/server/api.mjs +15 -4
  121. package/bizar-dash/src/server/background-store.mjs +15 -16
  122. package/bizar-dash/src/server/bg-poller.mjs +25 -35
  123. package/bizar-dash/src/server/bg-retry.mjs +66 -194
  124. package/bizar-dash/src/server/claude-bg-spawner.mjs +390 -0
  125. package/bizar-dash/src/server/claude-info.mjs +412 -0
  126. package/bizar-dash/src/server/{cline-runner.mjs → claude-runner.mjs} +53 -48
  127. package/bizar-dash/src/server/claude-sdk.mjs +191 -0
  128. package/bizar-dash/src/server/memory-consolidator.mjs +218 -0
  129. package/bizar-dash/src/server/memory-distillation.mjs +296 -0
  130. package/bizar-dash/src/server/providers-store.mjs +22 -49
  131. package/bizar-dash/src/server/routes/background.mjs +24 -20
  132. package/bizar-dash/src/server/routes/chat.mjs +223 -326
  133. package/bizar-dash/src/server/routes/claude-session-detail.mjs +329 -0
  134. package/bizar-dash/src/server/routes/claude-sessions.mjs +259 -0
  135. package/bizar-dash/src/server/routes/distill.mjs +129 -0
  136. package/bizar-dash/src/server/routes/goal-planner.mjs +236 -0
  137. package/bizar-dash/src/server/routes/tasks.mjs +20 -28
  138. package/bizar-dash/src/server/task-delegator.mjs +76 -77
  139. package/bizar-dash/src/web/App.tsx +4 -0
  140. package/bizar-dash/src/web/components/Tag.tsx +18 -5
  141. package/bizar-dash/src/web/components/Topbar.tsx +3 -0
  142. package/bizar-dash/src/web/components/agents/CommunicationLog.tsx +126 -0
  143. package/bizar-dash/src/web/components/agents/DependencyGraph.tsx +163 -0
  144. package/bizar-dash/src/web/components/agents/QualityGates.tsx +123 -0
  145. package/bizar-dash/src/web/components/agents/RealTimeEventLog.tsx +127 -0
  146. package/bizar-dash/src/web/components/agents/RoutingDecisions.test.tsx +148 -0
  147. package/bizar-dash/src/web/components/agents/RoutingDecisions.tsx +160 -0
  148. package/bizar-dash/src/web/components/chat/useChat.ts +23 -27
  149. package/bizar-dash/src/web/components/goals/GoalInput.tsx +86 -0
  150. package/bizar-dash/src/web/components/goals/PlanVisualization.tsx +111 -0
  151. package/bizar-dash/src/web/lib/goapPlanner.ts +614 -0
  152. package/bizar-dash/src/web/lib/types.ts +25 -0
  153. package/bizar-dash/src/web/styles/agents-redesign.css +311 -0
  154. package/bizar-dash/src/web/styles/main.css +251 -0
  155. package/bizar-dash/src/web/styles/tasks-redesign.css +231 -0
  156. package/bizar-dash/src/web/ui/controls/Button.tsx +77 -0
  157. package/bizar-dash/src/web/ui/controls/Checkbox.tsx +95 -0
  158. package/bizar-dash/src/web/ui/controls/IconButton.tsx +66 -0
  159. package/bizar-dash/src/web/ui/controls/Kbd.tsx +24 -0
  160. package/bizar-dash/src/web/ui/controls/NumberInput.tsx +77 -0
  161. package/bizar-dash/src/web/ui/controls/RadioGroup.tsx +109 -0
  162. package/bizar-dash/src/web/ui/controls/SearchInput.tsx +91 -0
  163. package/bizar-dash/src/web/ui/controls/Select.tsx +92 -0
  164. package/bizar-dash/src/web/ui/controls/Slider.tsx +70 -0
  165. package/bizar-dash/src/web/ui/controls/TextInput.tsx +67 -0
  166. package/bizar-dash/src/web/ui/controls/Toggle.tsx +79 -0
  167. package/bizar-dash/src/web/ui/controls/controls.css +454 -0
  168. package/bizar-dash/src/web/ui/controls/index.ts +33 -0
  169. package/bizar-dash/src/web/ui/data/BarChart.tsx +60 -0
  170. package/bizar-dash/src/web/ui/data/DataTable.tsx +216 -0
  171. package/bizar-dash/src/web/ui/data/EmptyState.tsx +60 -0
  172. package/bizar-dash/src/web/ui/data/ErrorState.tsx +56 -0
  173. package/bizar-dash/src/web/ui/data/KeyValueList.tsx +106 -0
  174. package/bizar-dash/src/web/ui/data/LoadingState.tsx +65 -0
  175. package/bizar-dash/src/web/ui/data/Sparkline.tsx +87 -0
  176. package/bizar-dash/src/web/ui/data/StatTile.tsx +87 -0
  177. package/bizar-dash/src/web/ui/data/data.css +535 -0
  178. package/bizar-dash/src/web/ui/data/index.ts +31 -0
  179. package/bizar-dash/src/web/ui/feedback/Badge.tsx +49 -0
  180. package/bizar-dash/src/web/ui/feedback/Dialog.tsx +209 -0
  181. package/bizar-dash/src/web/ui/feedback/ProgressBar.tsx +69 -0
  182. package/bizar-dash/src/web/ui/feedback/StatusDot.tsx +50 -0
  183. package/bizar-dash/src/web/ui/feedback/Toast.tsx +200 -0
  184. package/bizar-dash/src/web/ui/feedback/Tooltip.tsx +126 -0
  185. package/bizar-dash/src/web/ui/feedback/feedback.css +314 -0
  186. package/bizar-dash/src/web/ui/feedback/index.ts +43 -0
  187. package/bizar-dash/src/web/ui/index.ts +56 -0
  188. package/bizar-dash/src/web/ui/layout/AppShell.tsx +51 -0
  189. package/bizar-dash/src/web/ui/layout/Breadcrumbs.tsx +97 -0
  190. package/bizar-dash/src/web/ui/layout/Panel.tsx +73 -0
  191. package/bizar-dash/src/web/ui/layout/PanelHeader.tsx +39 -0
  192. package/bizar-dash/src/web/ui/layout/Sidebar.tsx +131 -0
  193. package/bizar-dash/src/web/ui/layout/Tabs.tsx +133 -0
  194. package/bizar-dash/src/web/ui/layout/Topbar.tsx +42 -0
  195. package/bizar-dash/src/web/ui/layout/index.ts +33 -0
  196. package/bizar-dash/src/web/ui/layout/layout.css +413 -0
  197. package/bizar-dash/src/web/ui/navigation/CommandPalette.tsx +199 -0
  198. package/bizar-dash/src/web/ui/navigation/NavGroup.tsx +95 -0
  199. package/bizar-dash/src/web/ui/navigation/NavLink.tsx +93 -0
  200. package/bizar-dash/src/web/ui/navigation/index.ts +17 -0
  201. package/bizar-dash/src/web/ui/navigation/navigation.css +343 -0
  202. package/bizar-dash/src/web/ui/primitives/Box.tsx +91 -0
  203. package/bizar-dash/src/web/ui/primitives/Grid.tsx +49 -0
  204. package/bizar-dash/src/web/ui/primitives/Inline.tsx +55 -0
  205. package/bizar-dash/src/web/ui/primitives/Separator.tsx +46 -0
  206. package/bizar-dash/src/web/ui/primitives/Stack.tsx +54 -0
  207. package/bizar-dash/src/web/ui/primitives/VisuallyHidden.tsx +26 -0
  208. package/bizar-dash/src/web/ui/primitives/index.ts +23 -0
  209. package/bizar-dash/src/web/ui/primitives/primitives.css +183 -0
  210. package/bizar-dash/src/web/ui/styles/globals.css +86 -0
  211. package/bizar-dash/src/web/ui/styles/reset.css +125 -0
  212. package/bizar-dash/src/web/ui/styles/tokens.css +195 -0
  213. package/bizar-dash/src/web/ui/theme/ThemeProvider.tsx +142 -0
  214. package/bizar-dash/src/web/ui/theme/tokens.ts +131 -0
  215. package/bizar-dash/src/web/ui/theme/useTheme.ts +22 -0
  216. package/bizar-dash/src/web/ui/utils/cx.ts +42 -0
  217. package/bizar-dash/src/web/views/Agents.tsx +506 -266
  218. package/bizar-dash/src/web/views/Chat.tsx +8 -8
  219. package/bizar-dash/src/web/views/GoalPlanner.tsx +158 -0
  220. package/bizar-dash/src/web/views/Overview.tsx +996 -448
  221. package/bizar-dash/src/web/views/Tasks.tsx +277 -273
  222. package/bizar-dash/tests/communication-log.test.tsx +67 -0
  223. package/bizar-dash/tests/dep-graph.test.tsx +40 -0
  224. package/bizar-dash/tests/event-log.test.tsx +61 -0
  225. package/bizar-dash/tests/goal-input.test.tsx +72 -0
  226. package/bizar-dash/tests/goap-planner.test.ts +68 -0
  227. package/bizar-dash/tests/quality-gates.test.tsx +59 -0
  228. package/bizar-dash/tests/setup.ts +31 -1
  229. package/bizar-dash/tests/ui/controls/Button.test.tsx +50 -0
  230. package/bizar-dash/tests/ui/controls/Checkbox.test.tsx +44 -0
  231. package/bizar-dash/tests/ui/controls/IconButton.test.tsx +37 -0
  232. package/bizar-dash/tests/ui/controls/Kbd.test.tsx +39 -0
  233. package/bizar-dash/tests/ui/controls/NumberInput.test.tsx +56 -0
  234. package/bizar-dash/tests/ui/controls/RadioGroup.test.tsx +58 -0
  235. package/bizar-dash/tests/ui/controls/SearchInput.test.tsx +52 -0
  236. package/bizar-dash/tests/ui/controls/Select.test.tsx +66 -0
  237. package/bizar-dash/tests/ui/controls/Slider.test.tsx +41 -0
  238. package/bizar-dash/tests/ui/controls/TextInput.test.tsx +44 -0
  239. package/bizar-dash/tests/ui/controls/Toggle.test.tsx +39 -0
  240. package/bizar-dash/tests/ui/data/BarChart.test.tsx +55 -0
  241. package/bizar-dash/tests/ui/data/DataTable.test.tsx +112 -0
  242. package/bizar-dash/tests/ui/data/EmptyState.test.tsx +57 -0
  243. package/bizar-dash/tests/ui/data/ErrorState.test.tsx +47 -0
  244. package/bizar-dash/tests/ui/data/KeyValueList.test.tsx +59 -0
  245. package/bizar-dash/tests/ui/data/LoadingState.test.tsx +37 -0
  246. package/bizar-dash/tests/ui/data/Sparkline.test.tsx +56 -0
  247. package/bizar-dash/tests/ui/data/StatTile.test.tsx +69 -0
  248. package/bizar-dash/tests/ui/feedback/Badge.test.tsx +41 -0
  249. package/bizar-dash/tests/ui/feedback/Dialog.test.tsx +99 -0
  250. package/bizar-dash/tests/ui/feedback/ProgressBar.test.tsx +66 -0
  251. package/bizar-dash/tests/ui/feedback/StatusDot.test.tsx +41 -0
  252. package/bizar-dash/tests/ui/feedback/Toast.test.tsx +124 -0
  253. package/bizar-dash/tests/ui/feedback/Tooltip.test.tsx +102 -0
  254. package/bizar-dash/tests/ui/layout/AppShell.test.tsx +50 -0
  255. package/bizar-dash/tests/ui/layout/Breadcrumbs.test.tsx +85 -0
  256. package/bizar-dash/tests/ui/layout/Panel.test.tsx +52 -0
  257. package/bizar-dash/tests/ui/layout/PanelHeader.test.tsx +32 -0
  258. package/bizar-dash/tests/ui/layout/Sidebar.test.tsx +95 -0
  259. package/bizar-dash/tests/ui/layout/Tabs.test.tsx +87 -0
  260. package/bizar-dash/tests/ui/layout/Topbar.test.tsx +41 -0
  261. package/bizar-dash/tests/ui/navigation/CommandPalette.test.tsx +105 -0
  262. package/bizar-dash/tests/ui/navigation/NavGroup.test.tsx +55 -0
  263. package/bizar-dash/tests/ui/navigation/NavLink.test.tsx +61 -0
  264. package/bizar-dash/tests/ui/primitives/Box.test.tsx +49 -0
  265. package/bizar-dash/tests/ui/primitives/Grid.test.tsx +37 -0
  266. package/bizar-dash/tests/ui/primitives/Inline.test.tsx +33 -0
  267. package/bizar-dash/tests/ui/primitives/Separator.test.tsx +34 -0
  268. package/bizar-dash/tests/ui/primitives/Stack.test.tsx +45 -0
  269. package/bizar-dash/tests/ui/primitives/VisuallyHidden.test.tsx +27 -0
  270. package/bizar-dash/tests/views/Agents.test.tsx +359 -0
  271. package/bizar-dash/tests/views/Overview.test.tsx +413 -0
  272. package/bizar-dash/tests/views/Tasks.test.tsx +250 -0
  273. package/bizar-dash/vitest.config.ts +3 -1
  274. package/cli/__tests__/cost-gate.test.mjs +301 -0
  275. package/cli/__tests__/feature-list-bridge.test.mjs +371 -0
  276. package/cli/bin.mjs +55 -18
  277. package/cli/commands/claim.mjs +282 -0
  278. package/cli/commands/claude-cmd.mjs +348 -0
  279. package/cli/commands/cost.mjs +279 -0
  280. package/cli/commands/install.mjs +12 -11
  281. package/cli/commands/validate.mjs +252 -325
  282. package/cli/cost-gate.mjs +501 -0
  283. package/cli/dev-link.test.mjs +11 -11
  284. package/cli/doctor.mjs +131 -213
  285. package/cli/feature-list-bridge.mjs +400 -0
  286. package/cli/install.mjs +33 -37
  287. package/cli/install.test.mjs +9 -9
  288. package/cli/memory-constants.mjs +17 -0
  289. package/cli/provision-claude.mjs +893 -0
  290. package/cli/provision.mjs +224 -227
  291. package/cli/utils.mjs +72 -58
  292. package/cli/worker-dispatcher.mjs +259 -0
  293. package/cli/worker-dispatcher.test.mjs +204 -0
  294. package/config/AGENTS.md +28 -28
  295. package/config/trigger-patterns.json +186 -0
  296. package/install.sh +66 -44
  297. package/package.json +19 -11
  298. package/packages/sdk/ARCHITECTURE.md +40 -36
  299. package/packages/sdk/package.json +15 -5
  300. package/packages/sdk/src/agent-registry.ts +304 -0
  301. package/packages/sdk/src/consensus/byzantine.ts +587 -0
  302. package/packages/sdk/src/consensus/index.ts +147 -0
  303. package/packages/sdk/src/consensus/queen.ts +173 -0
  304. package/packages/sdk/src/consensus/types.ts +199 -0
  305. package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
  306. package/packages/sdk/src/federation/audit.ts +156 -0
  307. package/packages/sdk/src/federation/budget.ts +269 -0
  308. package/packages/sdk/src/federation/envelope.ts +144 -0
  309. package/packages/sdk/src/federation/hmac.ts +160 -0
  310. package/packages/sdk/src/federation/index.ts +443 -0
  311. package/packages/sdk/src/federation/pii.ts +241 -0
  312. package/packages/sdk/src/federation/policy.ts +112 -0
  313. package/packages/sdk/src/federation/trust.ts +146 -0
  314. package/packages/sdk/src/fingerprint.ts +0 -0
  315. package/packages/sdk/src/index.ts +101 -69
  316. package/packages/sdk/src/mcp/bin.ts +51 -0
  317. package/packages/sdk/src/mcp/server.ts +848 -0
  318. package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
  319. package/packages/sdk/src/router/codemod-intent.ts +125 -0
  320. package/packages/sdk/src/router/index.ts +247 -0
  321. package/packages/sdk/src/router/memory-distillation-shim.mjs +18 -0
  322. package/packages/sdk/src/router/memory-distillation.ts +249 -0
  323. package/packages/sdk/src/router/model-router.ts +235 -0
  324. package/packages/sdk/src/router/q-learning-router.ts +304 -0
  325. package/packages/sdk/src/swarm-topology.ts +279 -0
  326. package/packages/sdk/tests/agent-registry.test.ts +285 -0
  327. package/packages/sdk/tests/consensus.test.ts +376 -0
  328. package/packages/sdk/tests/federation/audit.test.ts +164 -0
  329. package/packages/sdk/tests/federation/budget.test.ts +189 -0
  330. package/packages/sdk/tests/federation/envelope.test.ts +120 -0
  331. package/packages/sdk/tests/federation/hmac.test.ts +194 -0
  332. package/packages/sdk/tests/federation/orchestrator.test.ts +176 -0
  333. package/packages/sdk/tests/federation/pii.test.ts +106 -0
  334. package/packages/sdk/tests/federation/policy.test.ts +140 -0
  335. package/packages/sdk/tests/federation/trust.test.ts +124 -0
  336. package/packages/sdk/tests/mcp-tools.test.ts +204 -0
  337. package/packages/sdk/tests/memory-distillation.test.mjs +186 -0
  338. package/packages/sdk/tests/model-router.test.mjs +108 -0
  339. package/packages/sdk/tests/q-learning-router.test.mjs +100 -0
  340. package/packages/sdk/tests/router-orchestrator.test.mjs +172 -0
  341. package/packages/sdk/tests/router.test.mjs +91 -0
  342. package/packages/sdk/tests/sdk.test.mjs +172 -0
  343. package/packages/sdk/tests/swarm-topology.test.ts +258 -0
  344. package/packages/sdk/vitest.config.ts +1 -1
  345. package/scripts/bh-full-e2e.mjs +167 -368
  346. package/scripts/check-deps.mjs +28 -46
  347. package/scripts/mirror-claude-md.sh +78 -0
  348. package/scripts/test-in-container.sh +31 -9
  349. package/templates/clean-state-checklist.md +3 -3
  350. package/templates/sprint-contract.md +2 -2
  351. package/bizar-dash/.bizar/activity.log +0 -3
  352. package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
  353. package/bizar-dash/.omx/state/session.json +0 -10
  354. package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
  355. package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
  356. package/bizar-dash/bizar-design/canvas.html +0 -281
  357. package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
  358. package/bizar-dash/bizar-design/components.css +0 -1665
  359. package/bizar-dash/bizar-design/components.html +0 -557
  360. package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
  361. package/bizar-dash/bizar-design/desktop/agents.html +0 -74
  362. package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
  363. package/bizar-dash/bizar-design/desktop/memory.html +0 -75
  364. package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
  365. package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
  366. package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
  367. package/bizar-dash/bizar-design/desktop/overview.html +0 -95
  368. package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
  369. package/bizar-dash/bizar-design/desktop/settings.html +0 -70
  370. package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
  371. package/bizar-dash/bizar-design/icons.svg +0 -44
  372. package/bizar-dash/bizar-design/index.html +0 -192
  373. package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
  374. package/bizar-dash/bizar-design/mobile/agents.html +0 -29
  375. package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
  376. package/bizar-dash/bizar-design/mobile/memory.html +0 -28
  377. package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
  378. package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
  379. package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
  380. package/bizar-dash/bizar-design/mobile/overview.html +0 -33
  381. package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
  382. package/bizar-dash/bizar-design/mobile/settings.html +0 -28
  383. package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
  384. package/bizar-dash/bizar-design/prototype.js +0 -114
  385. package/bizar-dash/bizar-design/tokens.css +0 -106
  386. package/bizar-dash/dist/assets/MobileChat-BnKN_Ks_.js +0 -1
  387. package/bizar-dash/dist/assets/MobileSettings-DjCPxC-Q.js +0 -1
  388. package/bizar-dash/dist/assets/icons-Do5N2jmX.js.map +0 -1
  389. package/bizar-dash/dist/assets/main-DYiZqMrn.js +0 -18
  390. package/bizar-dash/dist/assets/main-DYiZqMrn.js.map +0 -1
  391. package/bizar-dash/dist/assets/main-ietCEg_R.css +0 -1
  392. package/bizar-dash/dist/assets/markdown-C6mXtQxD.js +0 -1
  393. package/bizar-dash/dist/assets/mobile-CMHqtLV2.js +0 -1
  394. package/bizar-dash/dist/assets/mobile-layout-3jIhHX_p.js +0 -2
  395. package/bizar-dash/dist/assets/mobile-layout-3jIhHX_p.js.map +0 -1
  396. package/bizar-dash/dist/assets/react-vendor-Dn4wqh4Z.js +0 -40
  397. package/bizar-dash/dist/assets/react-vendor-Dn4wqh4Z.js.map +0 -1
  398. package/bizar-dash/dist/assets/useSlashCommands-DtITw8Xv.js +0 -2
  399. package/bizar-dash/dist/assets/useSlashCommands-DtITw8Xv.js.map +0 -1
  400. package/bizar-dash/dist/assets/vendor-CeHGtduv.js +0 -29
  401. package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
  402. package/bizar-dash/node_modules/.package-lock.json +0 -6
  403. package/bizar-dash/package-lock.json +0 -6
  404. package/bizar-dash/src/server/cline-sdk.mjs +0 -132
  405. package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
  406. package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
  407. package/cli/commands/cline-cmd.mjs +0 -289
  408. package/cli/commands/validate.test.mjs +0 -379
  409. package/cli/doctor.test.mjs +0 -350
  410. package/config/cline.json.template +0 -342
  411. package/packages/sdk/src/client.ts +0 -188
  412. package/packages/sdk/src/cline-events.ts +0 -134
  413. package/packages/sdk/src/cline-types.ts +0 -66
  414. package/packages/sdk/src/cline.ts +0 -339
  415. package/packages/sdk/src/errors.ts +0 -129
  416. package/packages/sdk/src/events.ts +0 -153
  417. package/packages/sdk/src/types.ts +0 -176
  418. package/packages/sdk/tests/client.test.ts +0 -217
  419. package/packages/sdk/tests/errors.test.ts +0 -108
  420. package/packages/sdk/tests/events.test.ts +0 -139
  421. package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
  422. package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
  423. package/plugins/bizar/ARCHITECTURE.md +0 -142
  424. package/plugins/bizar/CONSTRAINTS.md +0 -67
  425. package/plugins/bizar/LICENSE +0 -21
  426. package/plugins/bizar/README.md +0 -448
  427. package/plugins/bizar/index.ts +0 -925
  428. package/plugins/bizar/package.json +0 -39
  429. package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
  430. package/plugins/bizar/src/background-state.ts +0 -641
  431. package/plugins/bizar/src/background.ts +0 -1806
  432. package/plugins/bizar/src/cline-runner.ts +0 -203
  433. package/plugins/bizar/src/clineruntime.ts +0 -227
  434. package/plugins/bizar/src/commands-impl.ts +0 -151
  435. package/plugins/bizar/src/commands.ts +0 -1799
  436. package/plugins/bizar/src/compaction.d.mts +0 -48
  437. package/plugins/bizar/src/compaction.mjs +0 -192
  438. package/plugins/bizar/src/dashboard-client.ts +0 -233
  439. package/plugins/bizar/src/event-stream.ts +0 -606
  440. package/plugins/bizar/src/fingerprint.ts +0 -120
  441. package/plugins/bizar/src/handoff.ts +0 -79
  442. package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
  443. package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
  444. package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
  445. package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
  446. package/plugins/bizar/src/http-client.ts +0 -467
  447. package/plugins/bizar/src/key-rotation.ts +0 -218
  448. package/plugins/bizar/src/logger.ts +0 -144
  449. package/plugins/bizar/src/loop-engineering.ts +0 -241
  450. package/plugins/bizar/src/loop.ts +0 -176
  451. package/plugins/bizar/src/mistake-recovery.ts +0 -98
  452. package/plugins/bizar/src/odin.ts +0 -227
  453. package/plugins/bizar/src/options.ts +0 -470
  454. package/plugins/bizar/src/plan-fs.ts +0 -323
  455. package/plugins/bizar/src/reasoning-clean.ts +0 -454
  456. package/plugins/bizar/src/report.ts +0 -178
  457. package/plugins/bizar/src/research-prompt.ts +0 -35
  458. package/plugins/bizar/src/serve-info.ts +0 -228
  459. package/plugins/bizar/src/serve.ts +0 -496
  460. package/plugins/bizar/src/settings.ts +0 -349
  461. package/plugins/bizar/src/state.ts +0 -298
  462. package/plugins/bizar/src/tool-discipline.ts +0 -105
  463. package/plugins/bizar/src/tools/agent-browser.ts +0 -315
  464. package/plugins/bizar/src/tools/bg-collect.ts +0 -131
  465. package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
  466. package/plugins/bizar/src/tools/bg-kill.ts +0 -116
  467. package/plugins/bizar/src/tools/bg-pause.ts +0 -99
  468. package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
  469. package/plugins/bizar/src/tools/bg-resume.ts +0 -94
  470. package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
  471. package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
  472. package/plugins/bizar/src/tools/bg-status.ts +0 -130
  473. package/plugins/bizar/src/tools/graph-query.ts +0 -278
  474. package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
  475. package/plugins/bizar/src/tools/memory-list.ts +0 -43
  476. package/plugins/bizar/src/tools/memory-read.ts +0 -69
  477. package/plugins/bizar/src/tools/memory-search.ts +0 -47
  478. package/plugins/bizar/src/tools/memory-write.ts +0 -54
  479. package/plugins/bizar/src/tools/open-kb.ts +0 -198
  480. package/plugins/bizar/src/tools/plan-action.ts +0 -785
  481. package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
  482. package/plugins/bizar/src/tools/sandbox.ts +0 -232
  483. package/plugins/bizar/src/tools/team-spawn.ts +0 -73
  484. package/plugins/bizar/src/tools/team-status.ts +0 -76
  485. package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
  486. package/plugins/bizar/src/trajectory.ts +0 -104
  487. package/plugins/bizar/tests/README.md +0 -99
  488. package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
  489. package/plugins/bizar/tests/background-state.test.ts +0 -277
  490. package/plugins/bizar/tests/background.test.ts +0 -402
  491. package/plugins/bizar/tests/block.test.ts +0 -195
  492. package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
  493. package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
  494. package/plugins/bizar/tests/commands-impl.test.ts +0 -316
  495. package/plugins/bizar/tests/commands.test.ts +0 -584
  496. package/plugins/bizar/tests/compaction.test.ts +0 -264
  497. package/plugins/bizar/tests/config.test.ts +0 -128
  498. package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
  499. package/plugins/bizar/tests/dispose.test.ts +0 -336
  500. package/plugins/bizar/tests/event-stream.test.ts +0 -409
  501. package/plugins/bizar/tests/event.test.ts +0 -262
  502. package/plugins/bizar/tests/fingerprint.test.ts +0 -190
  503. package/plugins/bizar/tests/http-client.test.ts +0 -404
  504. package/plugins/bizar/tests/init-helpers.test.ts +0 -203
  505. package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
  506. package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
  507. package/plugins/bizar/tests/key-rotation.test.ts +0 -396
  508. package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
  509. package/plugins/bizar/tests/loop.test.ts +0 -397
  510. package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
  511. package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
  512. package/plugins/bizar/tests/odin.test.ts +0 -125
  513. package/plugins/bizar/tests/options.test.ts +0 -329
  514. package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
  515. package/plugins/bizar/tests/safety.test.ts +0 -281
  516. package/plugins/bizar/tests/serve.test.ts +0 -339
  517. package/plugins/bizar/tests/settings.test.ts +0 -351
  518. package/plugins/bizar/tests/stall-think.test.ts +0 -750
  519. package/plugins/bizar/tests/state.test.ts +0 -276
  520. package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
  521. package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
  522. package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
  523. package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
  524. package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
  525. package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
  526. package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
  527. package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
  528. package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
  529. package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
  530. package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
  531. package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
  532. package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
  533. package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
  534. package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
  535. package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
  536. package/plugins/bizar/tests/tools/sandbox.test.ts +0 -117
  537. package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
  538. package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
  539. package/plugins/bizar/tsconfig.json +0 -29
  540. package/scripts/mirror-agents-md.sh +0 -69
@@ -0,0 +1,249 @@
1
+ /**
2
+ * router/memory-distillation.ts — RETRIEVE → JUDGE → DISTILL →
3
+ * CONSOLIDATE (ADR-174) as a pure TypeScript module.
4
+ *
5
+ * v6.4.0 — ported from ruflo `@claude-flow/neural/src/reasoning-bank.ts`
6
+ * (the 4-step pipeline) + ADR-174 (provenance-tiered promote gate).
7
+ *
8
+ * This is the $0 default path — deterministic, no LLM, no I/O.
9
+ * Living inside the SDK (rather than the dashboard .mjs files) so
10
+ * the `memory_distill` MCP tool can call it via a static TypeScript
11
+ * import without crossing the ESM/CJS boundary at runtime.
12
+ *
13
+ * The dashboard's `bizar-dash/src/server/memory-{distillation,
14
+ * consolidator}.mjs` re-export the same semantics and add the
15
+ * vault I/O (read notes, write promoted patterns back). Both paths
16
+ * agree on the `Pattern` shape so the schema is one-of.
17
+ */
18
+
19
+ export const PROVENANCE_TIERS = [
20
+ "oracle:test-exec",
21
+ "proxy:structural",
22
+ "judge:fable",
23
+ ] as const;
24
+
25
+ export type ProvenanceTier = (typeof PROVENANCE_TIERS)[number];
26
+
27
+ export interface MemoryEntryLike {
28
+ memory_id?: string;
29
+ id?: string;
30
+ path?: string;
31
+ relPath?: string;
32
+ frontmatter?: Record<string, unknown>;
33
+ body?: string;
34
+ kind?: string;
35
+ type?: string;
36
+ created?: string;
37
+ createdAt?: string;
38
+ tags?: unknown;
39
+ }
40
+
41
+ export interface Retrieval {
42
+ complexity: "simple" | "moderate" | "complex";
43
+ testExec: boolean;
44
+ hasCodeBlock: boolean;
45
+ length: number;
46
+ }
47
+
48
+ export interface Pattern {
49
+ id: string;
50
+ kind: "pattern";
51
+ summary: string;
52
+ uses: string[];
53
+ evidence: string[];
54
+ provenance_tier: ProvenanceTier;
55
+ promoted: boolean;
56
+ score: number;
57
+ }
58
+
59
+ export interface DistillationResult {
60
+ patterns: Pattern[];
61
+ promoted: Pattern[];
62
+ byTier: Record<ProvenanceTier, number>;
63
+ }
64
+
65
+ const COMPLEXITY_SIMPLE_MAX = 600;
66
+ const COMPLEXITY_MODERATE_MAX = 2400;
67
+
68
+ function firstLine(s: string): string {
69
+ if (!s) return "";
70
+ const i = s.indexOf("\n");
71
+ return (i < 0 ? s : s.slice(0, i)).trim();
72
+ }
73
+
74
+ function snippet(body: string): string {
75
+ const cleaned = body.replace(/\s+/g, " ").trim();
76
+ return cleaned.length <= 200 ? cleaned : cleaned.slice(0, 200) + "…";
77
+ }
78
+
79
+ function shorten(s: string): string {
80
+ let h = 5381 >>> 0;
81
+ for (let i = 0; i < s.length; i++) {
82
+ h = ((h << 5) + h + s.charCodeAt(i)) >>> 0;
83
+ }
84
+ return h.toString(36).slice(0, 10);
85
+ }
86
+
87
+ function wordSet(s: string): Set<string> {
88
+ const out = new Set<string>();
89
+ const norm = (s || "").toLowerCase().replace(/[^a-z0-9\s]+/g, " ");
90
+ for (const w of norm.split(/\s+/)) {
91
+ if (w.length > 2) out.add(w);
92
+ }
93
+ return out;
94
+ }
95
+
96
+ function jaccard(a: Set<string>, b: Set<string>): number {
97
+ if (a.size === 0 && b.size === 0) return 0;
98
+ let inter = 0;
99
+ for (const x of a) if (b.has(x)) inter += 1;
100
+ const union = a.size + b.size - inter;
101
+ return union === 0 ? 0 : inter / union;
102
+ }
103
+
104
+ function dedupe<T>(arr: T[]): T[] {
105
+ const seen = new Set<T>();
106
+ const out: T[] = [];
107
+ for (const x of arr) if (!seen.has(x)) { seen.add(x); out.push(x); }
108
+ return out;
109
+ }
110
+
111
+ export function retrieve(entry: MemoryEntryLike): Retrieval {
112
+ const body = String(entry?.body ?? "");
113
+ const fm = entry?.frontmatter ?? {};
114
+ const hasCodeBlock = /```/.test(body);
115
+ const tagsArr = Array.isArray(fm.tags) ? fm.tags : [];
116
+ const testExec =
117
+ Boolean(fm.test_exec) ||
118
+ Boolean(fm.testExec) ||
119
+ tagsArr.some((t) => String(t).includes("test-exec")) ||
120
+ String(fm.kind ?? "") === "feedback";
121
+ const len = body.length;
122
+ let complexity: Retrieval["complexity"];
123
+ if (hasCodeBlock || len > COMPLEXITY_MODERATE_MAX) complexity = "complex";
124
+ else if (len > COMPLEXITY_SIMPLE_MAX) complexity = "moderate";
125
+ else complexity = "simple";
126
+ return { complexity, testExec, hasCodeBlock, length: len };
127
+ }
128
+
129
+ export function judge(_entry: MemoryEntryLike, retrieval: Retrieval): ProvenanceTier {
130
+ if (retrieval.testExec) return "oracle:test-exec";
131
+ return "proxy:structural";
132
+ }
133
+
134
+ export function distill(entry: MemoryEntryLike): Omit<Pattern, "provenance_tier" | "promoted" | "score"> | null {
135
+ const fm = entry?.frontmatter ?? {};
136
+ const body = String(entry?.body ?? "").trim();
137
+ const id = String(entry?.memory_id ?? entry?.id ?? entry?.path ?? entry?.relPath ?? "");
138
+ const kindRaw = String(fm.kind ?? entry?.kind ?? entry?.type ?? "").toLowerCase();
139
+
140
+ if (kindRaw === "coding_convention" || kindRaw === "bug_pattern") {
141
+ return {
142
+ id: `pat_${shorten(id || body.slice(0, 24))}`,
143
+ kind: "pattern",
144
+ summary: firstLine(body) || "(empty)",
145
+ uses: id ? [id] : [],
146
+ evidence: [snippet(body)],
147
+ };
148
+ }
149
+
150
+ const head = firstLine(body).toLowerCase();
151
+ if (
152
+ kindRaw === "task_summary" ||
153
+ kindRaw === "session_summary" ||
154
+ /\bpattern\s*:/.test(head) ||
155
+ /^\s*(use|avoid|do|don't)\s*:/.test(head)
156
+ ) {
157
+ return {
158
+ id: `pat_${shorten(id || head.replace(/\W+/g, " ").slice(0, 24))}`,
159
+ kind: "pattern",
160
+ summary: firstLine(body) || "(empty)",
161
+ uses: id ? [id] : [],
162
+ evidence: [snippet(body)],
163
+ };
164
+ }
165
+ return null;
166
+ }
167
+
168
+ /**
169
+ * Distillation candidates carry their tier separately; we shift it on
170
+ * to `provenance_tier` here and set the `promoted` flag.
171
+ */
172
+ interface Candidate {
173
+ id: string;
174
+ kind: "pattern";
175
+ summary: string;
176
+ uses: string[];
177
+ evidence: string[];
178
+ _tier: ProvenanceTier;
179
+ }
180
+
181
+ export function runDistillation(entries: MemoryEntryLike[]): DistillationResult {
182
+ const empty = {
183
+ patterns: [] as Pattern[],
184
+ promoted: [] as Pattern[],
185
+ byTier: { "oracle:test-exec": 0, "proxy:structural": 0, "judge:fable": 0 } as Record<ProvenanceTier, number>,
186
+ };
187
+ if (!Array.isArray(entries) || entries.length === 0) return empty;
188
+
189
+ const candidates: Candidate[] = [];
190
+ for (const entry of entries) {
191
+ const retrieval = retrieve(entry);
192
+ const tier = judge(entry, retrieval);
193
+ const pattern = distill(entry);
194
+ if (!pattern) continue;
195
+ candidates.push({ ...pattern, _tier: tier });
196
+ }
197
+
198
+ // Cluster by Jaccard similarity ≥ 0.5 over (summary + evidence).
199
+ const groups: { rep: Candidate; members: Candidate[] }[] = [];
200
+ for (const c of candidates) {
201
+ const ws = wordSet(c.summary + " " + c.evidence.join(" "));
202
+ let placed = false;
203
+ for (const g of groups) {
204
+ const gs = wordSet(g.rep.summary + " " + g.rep.evidence.join(" "));
205
+ if (jaccard(ws, gs) >= 0.5) {
206
+ g.members.push(c);
207
+ placed = true;
208
+ break;
209
+ }
210
+ }
211
+ if (!placed) groups.push({ rep: c, members: [c] });
212
+ }
213
+
214
+ const byTier: Record<ProvenanceTier, number> = {
215
+ "oracle:test-exec": 0,
216
+ "proxy:structural": 0,
217
+ "judge:fable": 0,
218
+ };
219
+ const patterns: Pattern[] = [];
220
+ for (const g of groups) {
221
+ const usesSet = new Set<string>();
222
+ const evidence: string[] = [];
223
+ for (const m of g.members) {
224
+ for (const u of m.uses ?? []) usesSet.add(u);
225
+ for (const e of m.evidence ?? []) evidence.push(e);
226
+ }
227
+ const tiers = g.members.map((m) => m._tier);
228
+ let tier: ProvenanceTier = "proxy:structural";
229
+ if (tiers.includes("oracle:test-exec")) tier = "oracle:test-exec";
230
+ else if (tiers.includes("judge:fable")) tier = "judge:fable";
231
+
232
+ const promoted = usesSet.size >= 1 && (tier === "oracle:test-exec" || tier === "judge:fable");
233
+ const pattern: Pattern = {
234
+ id: g.rep.id,
235
+ kind: "pattern",
236
+ summary: g.rep.summary,
237
+ uses: Array.from(usesSet),
238
+ evidence: dedupe(evidence).slice(0, 5),
239
+ provenance_tier: tier,
240
+ promoted,
241
+ score: 0.5 + usesSet.size * 0.1,
242
+ };
243
+ patterns.push(pattern);
244
+ byTier[tier] += 1;
245
+ }
246
+
247
+ const promoted = patterns.filter((p) => p.promoted);
248
+ return { patterns, promoted, byTier };
249
+ }
@@ -0,0 +1,235 @@
1
+ /**
2
+ * router/model-router.ts — Adaptive model-tier router.
3
+ *
4
+ * v6.4.0 — ported from ruflo `model-router.ts` (Thompson-sampling bandit,
5
+ * ADR-026 + ADR-143). Trims the surface to what Bizar needs:
6
+ *
7
+ * - 3 tiers: `flash` (cheap), `mid` (default), `expensive`
8
+ * - Per-tier Beta(α, β) priors, updated by `recordOutcome()`.
9
+ * - Marsaglia-Tsang Gamma sampler + Box-Muller normal → sample from Beta
10
+ * by drawing two Gamma(shape, 1) variates and dividing.
11
+ * - Tier-1 codemod short-circuit: if `detectCodemodIntent()` says the
12
+ * prompt is codemod-eligible, we return `{tier: 'flash'}` with
13
+ * confidence 1.0 and tag `codemodIntent` on the result. This is the
14
+ * $0 path — no model call required.
15
+ *
16
+ * The tier names match Bizar's actual model lineup
17
+ * (`m2.7-flash`, `m2.7`, `m3`). The ruflo vocabulary uses
18
+ * `haiku / sonnet / opus`; we rename to `flash / mid / expensive`
19
+ * so future call-site code reads naturally.
20
+ */
21
+
22
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
23
+ import { dirname, isAbsolute, resolve } from "node:path";
24
+
25
+ import { detectCodemodIntent } from "./codemod-intent.js";
26
+
27
+ export type ModelTier = "flash" | "mid" | "expensive";
28
+
29
+ export interface RouteDecision {
30
+ tier: ModelTier;
31
+ confidence: number;
32
+ codemodIntent?: "var-to-const" | "remove-console" | "add-logging";
33
+ }
34
+
35
+ export interface BetaPrior {
36
+ alpha: number;
37
+ beta: number;
38
+ }
39
+
40
+ const TIERS: ModelTier[] = ["flash", "mid", "expensive"];
41
+
42
+ /**
43
+ * Default priors — slight optimism for `flash` (so it gets tried for
44
+ * cheap prompts), uniform for `mid`, slight pessimism for `expensive`
45
+ * (it should have to earn its keep). Adjust here, not at the call site.
46
+ */
47
+ const DEFAULT_PRIORS: Record<ModelTier, BetaPrior> = {
48
+ flash: { alpha: 2, beta: 1 }, // mean 2/3 ≈ 0.67
49
+ mid: { alpha: 1, beta: 1 }, // mean 0.5
50
+ expensive: { alpha: 1, beta: 2 }, // mean 1/3 ≈ 0.33
51
+ };
52
+
53
+ export class ModelRouter {
54
+ private priors: Record<ModelTier, BetaPrior>;
55
+ private rngState: number;
56
+
57
+ constructor(opts?: { priors?: Partial<Record<ModelTier, BetaPrior>>; seed?: number }) {
58
+ this.priors = {
59
+ flash: { ...DEFAULT_PRIORS.flash, ...(opts?.priors?.flash ?? {}) },
60
+ mid: { ...DEFAULT_PRIORS.mid, ...(opts?.priors?.mid ?? {}) },
61
+ expensive: { ...DEFAULT_PRIORS.expensive, ...(opts?.priors?.expensive ?? {}) },
62
+ };
63
+ // LCG seed for reproducible sampling in tests. Default uses
64
+ // Math.random() when seed is not provided.
65
+ this.rngState = (opts?.seed ?? 0) | 0;
66
+ }
67
+
68
+ /** Read-only access for telemetry / tests. */
69
+ getPriors(): Record<ModelTier, BetaPrior> {
70
+ return {
71
+ flash: { ...this.priors.flash },
72
+ mid: { ...this.priors.mid },
73
+ expensive: { ...this.priors.expensive },
74
+ };
75
+ }
76
+
77
+ /**
78
+ * Pick a tier for `prompt`. Codemod-eligible prompts short-circuit
79
+ * to `flash` (the Tier-1 $0 path). Otherwise we Thompson-sample each
80
+ * tier and return the highest sample, with confidence = max_sample
81
+ * (the posterior mean is `α/(α+β)`, and the max-sampled value is a
82
+ * lower bound on the probability that this tier beats the others).
83
+ */
84
+ route(prompt: string): RouteDecision {
85
+ // Tier-1 codemod short-circuit ($0).
86
+ const cm = detectCodemodIntent(prompt);
87
+ if (cm !== null) {
88
+ return { tier: "flash", confidence: 1.0, codemodIntent: cm.intent };
89
+ }
90
+
91
+ let best: { tier: ModelTier; sample: number } | null = null;
92
+ for (const tier of TIERS) {
93
+ const prior = this.priors[tier];
94
+ const sample = this.sampleBeta(prior.alpha, prior.beta);
95
+ if (best === null || sample > best.sample) {
96
+ best = { tier, sample };
97
+ }
98
+ }
99
+ const confidence = clamp01(best ? best.sample : 0.5);
100
+ return { tier: best ? best.tier : "mid", confidence };
101
+ }
102
+
103
+ /**
104
+ * Update the per-tier prior after observing the outcome of a call.
105
+ * `success === true` increments α; `success === false` increments β.
106
+ * Cost-adjusted (ruflo ADR-026 §BANDIT_REWARDS):
107
+ * - flash-success: +1.0 → α++ (cheap wins are gold)
108
+ * - mid-success: +0.7 → α += 0.7 (still good)
109
+ * - expensive-success:+0.4 → α += 0.4 (expensive wins are wasteful)
110
+ * - any failure: β ++
111
+ *
112
+ * The fractional updates work fine with the Beta sampler.
113
+ */
114
+ recordOutcome(tier: ModelTier, success: boolean): void {
115
+ const prior = this.priors[tier];
116
+ if (!prior) return;
117
+ if (success) {
118
+ const reward = tier === "flash" ? 1.0 : tier === "mid" ? 0.7 : 0.4;
119
+ prior.alpha += reward;
120
+ } else {
121
+ prior.beta += 1;
122
+ }
123
+ }
124
+
125
+ // -----------------------------------------------------------------
126
+ // Sampling primitives (lifted from ruflo model-router.ts).
127
+ // Marsaglia-Tsang Gamma + Box-Muller normal. Module-local so we
128
+ // don't pull a stats library for one sampler.
129
+ // -----------------------------------------------------------------
130
+
131
+ /** Seeded or Math.random()-backed uniform in [0,1). */
132
+ private random(): number {
133
+ if (this.rngState !== 0) {
134
+ // LCG (Numerical Recipes). Period ~2^32.
135
+ this.rngState = (this.rngState * 1664525 + 1013904223) | 0;
136
+ const u = (this.rngState >>> 0) / 0xffffffff;
137
+ return u || 1e-12;
138
+ }
139
+ return Math.random() || 1e-12;
140
+ }
141
+
142
+ /** Box-Muller standard normal sample. */
143
+ private sampleStandardNormal(): number {
144
+ const u1 = this.random();
145
+ const u2 = this.random();
146
+ return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);
147
+ }
148
+
149
+ /** Marsaglia-Tsang Gamma sample for shape α≥1 (with boost for α<1). */
150
+ private sampleGamma(alpha: number): number {
151
+ if (alpha < 1) {
152
+ const u = this.random();
153
+ return this.sampleGamma(alpha + 1) * Math.pow(u, 1 / alpha);
154
+ }
155
+ const d = alpha - 1 / 3;
156
+ const c = 1 / Math.sqrt(9 * d);
157
+ // eslint-disable-next-line no-constant-condition
158
+ while (true) {
159
+ let x = this.sampleStandardNormal();
160
+ let v = 1 + c * x;
161
+ if (v <= 0) continue;
162
+ v = v * v * v;
163
+ const u = this.random();
164
+ const xx = x * x;
165
+ if (u < 1 - 0.0331 * xx * xx) return d * v;
166
+ if (Math.log(u) < 0.5 * xx + d * (1 - v + Math.log(v))) return d * v;
167
+ }
168
+ }
169
+
170
+ /** Sample from Beta(α, β) via two Gamma draws. */
171
+ private sampleBeta(alpha: number, beta: number): number {
172
+ const x = this.sampleGamma(alpha);
173
+ const y = this.sampleGamma(beta);
174
+ const denom = x + y;
175
+ if (denom <= 0) return alpha / (alpha + beta);
176
+ return x / denom;
177
+ }
178
+
179
+ // -----------------------------------------------------------------
180
+ // Persistence (ADR-174 invariant: router state survives restarts).
181
+ // We avoid native deps — `.harness/router-state.json` is the
182
+ // canonical store; loading is best-effort and falls back to
183
+ // defaults if the file is missing or corrupt.
184
+ // -----------------------------------------------------------------
185
+
186
+ /** JSON snapshot of the current per-tier priors + RNG seed. */
187
+ snapshot(): RouterStateSnapshot {
188
+ return {
189
+ version: 1,
190
+ priors: this.getPriors(),
191
+ rngSeed: this.rngState,
192
+ };
193
+ }
194
+
195
+ /** Restore from a snapshot; defaults applied where fields are missing. */
196
+ static fromSnapshot(snap: Partial<RouterStateSnapshot>): ModelRouter {
197
+ return new ModelRouter({
198
+ priors: snap.priors,
199
+ seed: snap.rngSeed,
200
+ });
201
+ }
202
+
203
+ /** Persist state to `path`. Creates parent dirs as needed. */
204
+ saveTo(path: string): void {
205
+ const fp = isAbsolute(path) ? path : resolve(path);
206
+ mkdirSync(dirname(fp), { recursive: true });
207
+ writeFileSync(fp, JSON.stringify(this.snapshot(), null, 2), "utf-8");
208
+ }
209
+
210
+ /** Load state from `path`. Returns a default router if file is
211
+ * missing or unparseable. Does NOT throw. */
212
+ static loadFrom(path: string): ModelRouter {
213
+ try {
214
+ if (!existsSync(path)) return new ModelRouter();
215
+ const raw = readFileSync(path, "utf-8");
216
+ const snap = JSON.parse(raw) as Partial<RouterStateSnapshot>;
217
+ return ModelRouter.fromSnapshot(snap);
218
+ } catch {
219
+ return new ModelRouter();
220
+ }
221
+ }
222
+ }
223
+
224
+ export interface RouterStateSnapshot {
225
+ version: number;
226
+ priors: Record<ModelTier, BetaPrior>;
227
+ rngSeed: number;
228
+ }
229
+
230
+ function clamp01(n: number): number {
231
+ if (Number.isNaN(n)) return 0;
232
+ if (n < 0) return 0;
233
+ if (n > 1) return 1;
234
+ return n;
235
+ }