@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,264 +0,0 @@
1
- /**
2
- * compaction.test.ts
3
- *
4
- * Spec contract for the compaction gate (see src/compaction.mjs):
5
- * - `shouldCompact` returns false below 50%, true at and above 50%.
6
- * - `shouldCompact` is defensive: null usage, undefined usage.total, and
7
- * non-positive maxContext all return false (no false positives).
8
- * - `maybeCompactSession` returns `{ compacted: false, reason: "below_threshold" }`
9
- * when below the gate.
10
- * - `maybeCompactSession` returns `{ compacted: true, sessionId, threshold, … }`
11
- * when at/over the gate.
12
- * - The default threshold is 0.5.
13
- * - `setCompactionThreshold` rejects out-of-range values with a throw;
14
- * accepts in-range values silently.
15
- * - State leaks between tests are not allowed — every test that mutates
16
- * the threshold calls `resetCompactionDefaults()` in its teardown
17
- * (bun:test does not have a global afterEach, so we use try/finally).
18
- *
19
- * Tests use `bun:test` to match the rest of the plugin suite (see
20
- * `tests/loop.test.ts`, `tests/options.test.ts`, etc.).
21
- */
22
-
23
- import {
24
- describe,
25
- test,
26
- expect,
27
- beforeEach,
28
- afterEach,
29
- } from "bun:test";
30
-
31
- import {
32
- shouldCompact,
33
- maybeCompactSession,
34
- getCompactionThreshold,
35
- setCompactionThreshold,
36
- resetCompactionDefaults,
37
- } from "../src/compaction.mjs";
38
-
39
- /**
40
- * Bun:test does not expose a global `afterEach`/`beforeEach` reset hook
41
- * that runs across describe blocks, so we wire per-block setup/teardown
42
- * via the standard `beforeEach`/`afterEach` imports. We also reset on
43
- * entry to each test as a belt-and-braces guarantee that no leak from a
44
- * prior test (run in the same process by `bun test`) can poison state.
45
- */
46
- beforeEach(() => {
47
- resetCompactionDefaults();
48
- });
49
-
50
- afterEach(() => {
51
- resetCompactionDefaults();
52
- });
53
-
54
- describe("shouldCompact", () => {
55
- test("does not compact below 50%", () => {
56
- expect(shouldCompact({ total: 40000 }, 100000)).toBe(false);
57
- });
58
-
59
- test("does not compact at 49.99%", () => {
60
- expect(shouldCompact({ total: 49999 }, 100000)).toBe(false);
61
- });
62
-
63
- test("compacts at exactly 50%", () => {
64
- expect(shouldCompact({ total: 50000 }, 100000)).toBe(true);
65
- });
66
-
67
- test("compacts above 50%", () => {
68
- expect(shouldCompact({ total: 80000 }, 100000)).toBe(true);
69
- });
70
-
71
- test("compacts at 100% (full context)", () => {
72
- expect(shouldCompact({ total: 100000 }, 100000)).toBe(true);
73
- });
74
-
75
- test("does not compact with null usage", () => {
76
- expect(shouldCompact(null, 100000)).toBe(false);
77
- });
78
-
79
- test("does not compact with undefined usage", () => {
80
- expect(shouldCompact(undefined, 100000)).toBe(false);
81
- });
82
-
83
- test("does not compact when usage.total is missing", () => {
84
- expect(shouldCompact({}, 100000)).toBe(false);
85
- });
86
-
87
- test("does not compact with non-positive maxContext", () => {
88
- expect(shouldCompact({ total: 50000 }, 0)).toBe(false);
89
- expect(shouldCompact({ total: 50000 }, -1)).toBe(false);
90
- });
91
-
92
- test("respects a non-default threshold (0.7)", () => {
93
- setCompactionThreshold(0.7);
94
- expect(shouldCompact({ total: 60000 }, 100000)).toBe(false);
95
- expect(shouldCompact({ total: 70000 }, 100000)).toBe(true);
96
- expect(shouldCompact({ total: 80000 }, 100000)).toBe(true);
97
- });
98
- });
99
-
100
- describe("getCompactionThreshold / setCompactionThreshold", () => {
101
- test("default threshold is 0.5", () => {
102
- expect(getCompactionThreshold()).toBe(0.5);
103
- });
104
-
105
- test("setCompactionThreshold rejects 0 (below minimum)", () => {
106
- expect(() => setCompactionThreshold(0)).toThrow(/Invalid compaction threshold/);
107
- });
108
-
109
- test("setCompactionThreshold rejects 0.05 (below minimum 0.1)", () => {
110
- expect(() => setCompactionThreshold(0.05)).toThrow(/Invalid compaction threshold/);
111
- });
112
-
113
- test("setCompactionThreshold rejects 1.5 (above maximum)", () => {
114
- expect(() => setCompactionThreshold(1.5)).toThrow(/Invalid compaction threshold/);
115
- });
116
-
117
- test("setCompactionThreshold rejects NaN", () => {
118
- expect(() => setCompactionThreshold(Number.NaN)).toThrow(/Invalid compaction threshold/);
119
- });
120
-
121
- test("setCompactionThreshold rejects Infinity", () => {
122
- expect(() => setCompactionThreshold(Number.POSITIVE_INFINITY)).toThrow(
123
- /Invalid compaction threshold/,
124
- );
125
- });
126
-
127
- test("setCompactionThreshold rejects non-number values", () => {
128
- expect(() => setCompactionThreshold("0.5" as unknown as number)).toThrow(
129
- /Invalid compaction threshold/,
130
- );
131
- expect(() => setCompactionThreshold(null as unknown as number)).toThrow(
132
- /Invalid compaction threshold/,
133
- );
134
- });
135
-
136
- test("setCompactionThreshold accepts 0.1 (lower bound)", () => {
137
- expect(() => setCompactionThreshold(0.1)).not.toThrow();
138
- expect(getCompactionThreshold()).toBe(0.1);
139
- });
140
-
141
- test("setCompactionThreshold accepts 1.0 (upper bound)", () => {
142
- expect(() => setCompactionThreshold(1.0)).not.toThrow();
143
- expect(getCompactionThreshold()).toBe(1.0);
144
- });
145
-
146
- test("setCompactionThreshold accepts 0.7 (in-range)", () => {
147
- expect(() => setCompactionThreshold(0.7)).not.toThrow();
148
- expect(getCompactionThreshold()).toBe(0.7);
149
- });
150
- });
151
-
152
- describe("maybeCompactSession", () => {
153
- test("returns below_threshold when under limit", async () => {
154
- const r = await maybeCompactSession({
155
- sessionId: "s1",
156
- messageCount: 5,
157
- currentUsage: { total: 30000 },
158
- maxContext: 100000,
159
- summarizer: async (texts) => texts.join(" "),
160
- });
161
- expect(r.compacted).toBe(false);
162
- expect(r.reason).toBe("below_threshold");
163
- expect(r.ratio).toBeCloseTo(0.3);
164
- });
165
-
166
- test("triggers when over limit", async () => {
167
- const r = await maybeCompactSession({
168
- sessionId: "s1",
169
- messageCount: 100,
170
- currentUsage: { total: 60000 },
171
- maxContext: 100000,
172
- summarizer: async () => "summary",
173
- });
174
- expect(r.compacted).toBe(true);
175
- expect(r.sessionId).toBe("s1");
176
- expect(r.atMessages).toBe(100);
177
- expect(r.threshold).toBe(0.5);
178
- expect(r.preservedRecent).toBe(10);
179
- expect(r.ratio).toBeCloseTo(0.6);
180
- });
181
-
182
- test("triggers at exactly the threshold (50000/100000 = 0.5)", async () => {
183
- const r = await maybeCompactSession({
184
- sessionId: "edge",
185
- messageCount: 42,
186
- currentUsage: { total: 50000 },
187
- maxContext: 100000,
188
- summarizer: async () => "",
189
- });
190
- expect(r.compacted).toBe(true);
191
- expect(r.atMessages).toBe(42);
192
- });
193
-
194
- test("respects a custom preserveRecent override", async () => {
195
- const r = await maybeCompactSession({
196
- sessionId: "s2",
197
- messageCount: 200,
198
- currentUsage: { total: 90000 },
199
- maxContext: 100000,
200
- summarizer: async () => "",
201
- preserveRecent: 25,
202
- });
203
- expect(r.compacted).toBe(true);
204
- expect(r.preservedRecent).toBe(25);
205
- });
206
-
207
- test("respects a non-default threshold", async () => {
208
- setCompactionThreshold(0.8);
209
- const r1 = await maybeCompactSession({
210
- sessionId: "s3",
211
- messageCount: 50,
212
- currentUsage: { total: 70000 },
213
- maxContext: 100000,
214
- summarizer: async () => "",
215
- });
216
- expect(r1.compacted).toBe(false);
217
-
218
- const r2 = await maybeCompactSession({
219
- sessionId: "s3",
220
- messageCount: 50,
221
- currentUsage: { total: 85000 },
222
- maxContext: 100000,
223
- summarizer: async () => "",
224
- });
225
- expect(r2.compacted).toBe(true);
226
- expect(r2.threshold).toBe(0.8);
227
- });
228
-
229
- test("does not invoke the summarizer when below threshold", async () => {
230
- let called = false;
231
- await maybeCompactSession({
232
- sessionId: "s4",
233
- messageCount: 10,
234
- currentUsage: { total: 1000 },
235
- maxContext: 100000,
236
- summarizer: async () => {
237
- called = true;
238
- return "should-not-run";
239
- },
240
- });
241
- expect(called).toBe(false);
242
- });
243
-
244
- test("throws when sessionId is missing", async () => {
245
- await expect(
246
- maybeCompactSession({
247
- sessionId: "",
248
- messageCount: 1,
249
- currentUsage: { total: 999999 },
250
- maxContext: 100000,
251
- summarizer: async () => "",
252
- }),
253
- ).rejects.toThrow(/sessionId is required/);
254
- });
255
- });
256
-
257
- describe("resetCompactionDefaults", () => {
258
- test("restores the threshold to 0.5 after a custom set", () => {
259
- setCompactionThreshold(0.9);
260
- expect(getCompactionThreshold()).toBe(0.9);
261
- resetCompactionDefaults();
262
- expect(getCompactionThreshold()).toBe(0.5);
263
- });
264
- });
@@ -1,128 +0,0 @@
1
- /**
2
- * config.test.ts — Config drift detection tests (R4 audit).
3
- *
4
- * Verifies:
5
- * 1. Every `bizar_*` tool registered in `plugins/bizar/index.ts`
6
- * is also present in `config/cline.json` `tools: { ... }`.
7
- * 2. No `bizarre_*` (double-r) typos remain in `plugins/bizar/src/`.
8
- * 3. `plugins/bizar/package.json` version matches the current beta.
9
- */
10
-
11
- import { describe, test, expect } from "bun:test";
12
- import { readFileSync, readdirSync, statSync, existsSync } from "node:fs";
13
- import { join } from "node:path";
14
-
15
- const BIZAR_PLUGIN_ROOT = join(__dirname, "..");
16
- const PLUGIN_INDEX = join(BIZAR_PLUGIN_ROOT, "index.ts");
17
- const CONFIG_CLINE = join(__dirname, "..", "..", "..", "config", "cline.json");
18
- const PKG_JSON = join(BIZAR_PLUGIN_ROOT, "package.json");
19
- const SRC_DIR = join(BIZAR_PLUGIN_ROOT, "src");
20
-
21
- // ---------------------------------------------------------------------------
22
- // Helpers
23
- // ---------------------------------------------------------------------------
24
-
25
- /**
26
- * Extract `bizar_*` tool registration keys from index.ts.
27
- * Matches: `bizar_spawn_background: createBgSpawnTool(...)` etc.
28
- */
29
- function extractPluginToolKeys(indexContent: string): string[] {
30
- const keys: string[] = [];
31
- // Matches `bizar_xxx: createXxxTool(` or `bizar_xxx: createBgXxxTool(`
32
- const toolKeyRegex = /\bbizar_([a-z_]+)\s*:\s*(?:create(?:Bg)?[A-Z]\w*Tool|createWaitForFeedbackTool)\s*\(/g;
33
- let m: RegExpExecArray | null;
34
- while ((m = toolKeyRegex.exec(indexContent)) !== null) {
35
- keys.push(`bizar_${m[1]}`);
36
- }
37
- return [...new Set(keys)].sort();
38
- }
39
-
40
- /**
41
- * Extract `tools: { ... }` keys from config/cline.json.
42
- */
43
- function extractConfigToolKeys(configContent: string): string[] {
44
- const parsed = JSON.parse(configContent) as { tools?: Record<string, unknown> };
45
- if (!parsed.tools) return [];
46
- return Object.keys(parsed.tools).sort();
47
- }
48
-
49
- // ---------------------------------------------------------------------------
50
- // Test cases
51
- // ---------------------------------------------------------------------------
52
-
53
- describe("config drift detection", () => {
54
- test("plugin_tool_keys ⊆ config_tools_keys (R4 audit)", () => {
55
- if (!existsSync(CONFIG_CLINE)) {
56
- // Skip when config/cline.json has not been generated yet.
57
- // `bizar install` produces it from `config/cline.json.template`.
58
- return;
59
- }
60
- const indexContent = readFileSync(PLUGIN_INDEX, "utf-8");
61
- const configContent = readFileSync(CONFIG_CLINE, "utf-8");
62
-
63
- const pluginKeys = extractPluginToolKeys(indexContent);
64
- const configKeys = extractConfigToolKeys(configContent);
65
-
66
- const missingInConfig = pluginKeys.filter((k) => !configKeys.includes(k));
67
- expect(missingInConfig, `Plugin tools missing in config: ${JSON.stringify(missingInConfig)}`).toEqual([]);
68
- });
69
-
70
- test("no 'bizarre_*' (double-r) typos remain in plugins/bizar/src/", () => {
71
- // Walk src/ directory recursively and grep for 'bizarre_'
72
- const allSrcFiles = getAllTsFiles(SRC_DIR);
73
- const violations: Array<{ file: string; match: string }> = [];
74
-
75
- const doubleRRegex = /\bbizarre_[a-z_]+\b/g;
76
-
77
- for (const file of allSrcFiles) {
78
- const content = readFileSync(file, "utf-8");
79
- let m: RegExpExecArray | null;
80
- while ((m = doubleRRegex.exec(content)) !== null) {
81
- violations.push({ file: relativeToSrc(file), match: m[0] });
82
- }
83
- }
84
-
85
- expect(
86
- violations,
87
- `Found 'bizarre_*' typos: ${JSON.stringify(violations)}`,
88
- ).toEqual([]);
89
- });
90
-
91
- test("plugins/bizar/package.json version is current beta", () => {
92
- const pkg = JSON.parse(readFileSync(PKG_JSON, "utf-8")) as { version?: string };
93
- // v6.0.0 sprint bumped to 5.6.0-beta series; assert the prefix.
94
- expect(pkg.version).toMatch(/^\d+\.\d+\.\d+(-beta\.\d+)?$/);
95
- });
96
- });
97
-
98
- // ---------------------------------------------------------------------------
99
- // Helper: recursively collect all .ts files under a directory
100
- // ---------------------------------------------------------------------------
101
-
102
- function getAllTsFiles(dir: string): string[] {
103
- const results: string[] = [];
104
- let entries: string[];
105
- try {
106
- entries = readdirSync(dir);
107
- } catch {
108
- return results;
109
- }
110
- for (const name of entries) {
111
- const full = join(dir, name);
112
- try {
113
- const stat = statSync(full);
114
- if (stat.isDirectory()) {
115
- results.push(...getAllTsFiles(full));
116
- } else if (name.endsWith(".ts") || name.endsWith(".tsx")) {
117
- results.push(full);
118
- }
119
- } catch {
120
- // skip inaccessible entries
121
- }
122
- }
123
- return results;
124
- }
125
-
126
- function relativeToSrc(file: string): string {
127
- return file.replace(SRC_DIR + "/", "");
128
- }
@@ -1,159 +0,0 @@
1
- /**
2
- * dashboard-client.test.ts
3
- *
4
- * v0.7.0-alpha.1 — Tests for the SDK-backed dashboard publisher.
5
- *
6
- * Verifies:
7
- * - publish() succeeds when the dashboard is reachable (uses a stub
8
- * fetch via `createBizarClient`'s `fetch` injection — but our
9
- * publisher doesn't currently expose fetch injection, so we test
10
- * via the real `publishV2Event` round-trip from the smoke test
11
- * pattern instead).
12
- * - publish() drops events when the publisher is not started.
13
- * - Graceful degradation: env var override is respected.
14
- *
15
- * Network tests (publish to a real dashboard) live in
16
- * `tests/integration/dashboard-bridge.test.ts` and require a running
17
- * dashboard server.
18
- */
19
-
20
- import { describe, it, expect } from "bun:test";
21
- import { createDashboardPublisher, type Logger } from "../src/dashboard-client.js";
22
-
23
- // ---------------------------------------------------------------------------
24
- // Test logger
25
- // ---------------------------------------------------------------------------
26
-
27
- const makeLogger = (): Logger & { lines: string[] } => {
28
- const lines: string[] = [];
29
- return {
30
- lines,
31
- debug(m) { lines.push(`debug: ${m}`); },
32
- info(m) { lines.push(`info: ${m}`); },
33
- warn(m) { lines.push(`warn: ${m}`); },
34
- error(m) { lines.push(`error: ${m}`); },
35
- };
36
- };
37
-
38
- // ---------------------------------------------------------------------------
39
- // Tests
40
- // ---------------------------------------------------------------------------
41
-
42
- describe("createDashboardPublisher", () => {
43
- it("publish() drops events when not started", async () => {
44
- const logger = makeLogger();
45
- const pub = createDashboardPublisher({ logger });
46
- // Do NOT call start()
47
- expect(pub.isReady()).toBe(false);
48
-
49
- await pub.publish({
50
- type: "session.created",
51
- properties: { sessionId: "ses_1", agent: "mimir" },
52
- });
53
-
54
- // Logger should have recorded a debug drop message.
55
- expect(logger.lines.some((l) => l.includes("not ready"))).toBe(true);
56
- });
57
-
58
- it("start() is a no-op when disabled by config", async () => {
59
- const logger = makeLogger();
60
- const pub = createDashboardPublisher({ logger, disabled: true });
61
- await pub.start();
62
- expect(pub.isReady()).toBe(false);
63
- expect(logger.lines.some((l) => l.includes("disabled"))).toBe(true);
64
- });
65
-
66
- it("start() is a no-op when no password is available", async () => {
67
- const logger = makeLogger();
68
- // Make sure no env vars or auth files are present in this test.
69
- const prevUrl = process.env.BIZAR_DASHBOARD_URL;
70
- const prevPort = process.env.BIZAR_DASHBOARD_PORT;
71
- const prevPw = process.env.BIZAR_DASHBOARD_PASSWORD;
72
- const prevAuthFile = process.env.BIZAR_DASHBOARD_AUTH_FILE;
73
- const prevAuthFiles = process.env.BIZAR_DASHBOARD_AUTH_FILES;
74
- delete process.env.BIZAR_DASHBOARD_URL;
75
- delete process.env.BIZAR_DASHBOARD_PORT;
76
- delete process.env.BIZAR_DASHBOARD_PASSWORD;
77
- // Point auth-file discovery at a non-existent path.
78
- process.env.BIZAR_DASHBOARD_AUTH_FILE = "/tmp/__no_such_auth_file__.json";
79
-
80
- try {
81
- const pub = createDashboardPublisher({ logger });
82
- await pub.start();
83
- expect(pub.isReady()).toBe(false);
84
- expect(logger.lines.some((l) => l.includes("not started"))).toBe(true);
85
- } finally {
86
- if (prevUrl !== undefined) process.env.BIZAR_DASHBOARD_URL = prevUrl;
87
- if (prevPort !== undefined) process.env.BIZAR_DASHBOARD_PORT = prevPort;
88
- if (prevPw !== undefined) process.env.BIZAR_DASHBOARD_PASSWORD = prevPw;
89
- if (prevAuthFile !== undefined) {
90
- process.env.BIZAR_DASHBOARD_AUTH_FILE = prevAuthFile;
91
- } else {
92
- delete process.env.BIZAR_DASHBOARD_AUTH_FILE;
93
- }
94
- if (prevAuthFiles !== undefined) {
95
- process.env.BIZAR_DASHBOARD_AUTH_FILES = prevAuthFiles;
96
- } else {
97
- delete process.env.BIZAR_DASHBOARD_AUTH_FILES;
98
- }
99
- }
100
- });
101
-
102
- it("start() succeeds when password is provided via env", async () => {
103
- const logger = makeLogger();
104
- process.env.BIZAR_DASHBOARD_PASSWORD = "test-password-1234567890abcdef";
105
-
106
- try {
107
- const pub = createDashboardPublisher({
108
- logger,
109
- baseUrl: "http://127.0.0.1:1", // port 1 = unreachable, but SDK client constructs fine
110
- });
111
- await pub.start();
112
- expect(pub.isReady()).toBe(true);
113
- expect(logger.lines.some((l) => l.includes("publisher started"))).toBe(true);
114
- pub.stop();
115
- } finally {
116
- delete process.env.BIZAR_DASHBOARD_PASSWORD;
117
- }
118
- });
119
-
120
- it("start() respects BIZAR_DASHBOARD_URL env var", async () => {
121
- const logger = makeLogger();
122
- process.env.BIZAR_DASHBOARD_URL = "http://127.0.0.1:4099";
123
- process.env.BIZAR_DASHBOARD_PASSWORD = "test-password-1234567890abcdef";
124
-
125
- try {
126
- const pub = createDashboardPublisher({ logger });
127
- await pub.start();
128
- expect(pub.isReady()).toBe(true);
129
- expect(
130
- logger.lines.some((l) => l.includes("url=http://127.0.0.1:4099")),
131
- ).toBe(true);
132
- pub.stop();
133
- } finally {
134
- delete process.env.BIZAR_DASHBOARD_URL;
135
- delete process.env.BIZAR_DASHBOARD_PASSWORD;
136
- }
137
- });
138
-
139
- it("stop() clears ready state and drops queue", async () => {
140
- const logger = makeLogger();
141
- process.env.BIZAR_DASHBOARD_PASSWORD = "test-password-1234567890abcdef";
142
-
143
- try {
144
- const pub = createDashboardPublisher({ logger });
145
- await pub.start();
146
- expect(pub.isReady()).toBe(true);
147
- pub.stop();
148
- expect(pub.isReady()).toBe(false);
149
- // Subsequent publish should be a no-op (drops because not ready).
150
- await pub.publish({
151
- type: "session.created",
152
- properties: { sessionId: "ses_x", agent: "thor" },
153
- });
154
- // Just verifies it doesn't throw.
155
- } finally {
156
- delete process.env.BIZAR_DASHBOARD_PASSWORD;
157
- }
158
- });
159
- });