@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
@@ -1,27 +1,26 @@
1
1
  /**
2
- * memory-vault.ts
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
- * v6.0.0 — In-process Bizar Memory vault reader/writer. The plugin can
5
- * read and write memory notes directly from disk, without going through
6
- * the dashboard's HTTP API.
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 { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
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: string = "", limit: number = 100): MemoryNote[] {
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: number = 20): MemoryNote[] {
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";