@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,454 +0,0 @@
1
- /**
2
- * plugins/bizar/src/reasoning-clean.ts
3
- *
4
- * Wraps a provider's `fetch` to strip inline ``...</think>`` blocks from
5
- * `message.content` / `delta.content` when the response also includes
6
- * structured reasoning (`reasoning`, `reasoning_details`, or
7
- * `reasoning_content`).
8
- *
9
- * Why this exists
10
- * ───────────────
11
- * Some reasoning models (e.g. MiniMax M-series models) emit their chain
12
- * of thought BOTH:
13
- * 1. In the structured `reasoning` / `reasoning_details` field, which
14
- * cline already extracts and renders as a separate "thought"
15
- * chunk, AND
16
- * 2. Inlined in `content` as `` blocks, which cline would also
17
- * render as plain text — producing the duplicate "Thought: … + the
18
- * same text in the assistant message" the user sees.
19
- *
20
- * cline's openai-compatible SDK for MiniMax does not strip the inline think
21
- * blocks from `content`. The cline-level `interleaved` config that
22
- * could solve this only applies to the `@ai-sdk/openai-compatible` SDK.
23
- * Wrapping `provider.options.fetch` in the `config` hook is the only
24
- * hook surface where the response body can be post-processed.
25
- *
26
- * Behaviour
27
- * ─────────
28
- * • Only `POST` requests whose URL ends with `/chat/completions` are
29
- * intercepted. Other requests pass through untouched.
30
- * • Non-streaming responses (`Content-Type: application/json`) are parsed,
31
- * mutated, and re-serialised.
32
- * • Streaming responses (`Content-Type: text/event-stream`) are piped
33
- * through a `TransformStream` that buffers content across chunks and
34
- * drops anything between a complete ` pair, using a tiny state
35
- * machine so chunks that split a marker mid-stream are handled.
36
- * • If parsing or rewriting fails for any reason, the original response
37
- * is forwarded unchanged — this wrapper must never break a chat.
38
- */
39
-
40
- // All known inline think-style tag names. Each name pairs with itself
41
- // for the close tag (e.g. `` matches ``, `<thinking>` matches
42
- // `</thinking>`, etc.). The order does not matter for matching — we
43
- // search for the earliest occurrence of any of them.
44
- //
45
- // The model emits `` (most common) and `<thinking>` (the original
46
- // dashboard fix targeted this one). `<reasoning>` and `<ant_thinking>`
47
- // are included for forward compatibility with other providers that use
48
- // the same anti-slop pattern.
49
- const THINK_TAG_NAMES = ["think", "thinking", "reasoning", "ant_thinking"] as const;
50
- type ThinkTagName = (typeof THINK_TAG_NAMES)[number];
51
-
52
- /** Map from open-tag prefix (without `>`) to its matching close tag. */
53
- const THINK_OPEN_TO_CLOSE: ReadonlyMap<string, string> = new Map(
54
- THINK_TAG_NAMES.map((n) => [`<${n}`, `</${n}>`] as const),
55
- );
56
- /** All open-tag prefixes — used by the streaming state machine. */
57
- const ALL_OPENS: readonly string[] = Array.from(THINK_OPEN_TO_CLOSE.keys());
58
- /** Regex form, used by the non-streaming strip. Backreference matches
59
- * the open-tag name to the close tag. */
60
- const THINK_TAG_RE = new RegExp(
61
- `<(${THINK_TAG_NAMES.join("|")})\\b[^>]*>[\\s\\S]*?</\\1>\\s*`,
62
- "gi",
63
- );
64
-
65
- export type FetchLike = (
66
- input: Parameters<typeof fetch>[0],
67
- init?: RequestInit,
68
- ) => Promise<Response>;
69
-
70
- export interface ReasoningCleanOptions {
71
- /** Extra logger for debug lines; defaults to no-op. */
72
- debug?: (msg: string) => void;
73
- /**
74
- * Provider ids whose responses should be cleaned. Defaults to the set
75
- * known to exhibit the duplicated-think pattern: minimax.
76
- */
77
- providers?: string[];
78
- }
79
-
80
- const DEFAULT_PROVIDERS = new Set(["minimax"]);
81
-
82
- /**
83
- * Strip inline think-style blocks (`<think>…</think>`,
84
- * `<thinking>…</thinking>`, `<reasoning>…</reasoning>`,
85
- * `<ant_thinking>…</ant_thinking>`) from a plain string. Used for
86
- * non-streaming responses (or for accumulated streamed content).
87
- *
88
- * The trailing whitespace after the close tag is also consumed so the
89
- * cleaned content does not start with an extra blank line.
90
- */
91
- export function stripInlineThinkBlocks(content: string): string {
92
- return content.replace(THINK_TAG_RE, "");
93
- }
94
-
95
- /**
96
- * Stream-level state machine: feed it the content deltas in order; it
97
- * yields the content that should be forwarded to the caller.
98
- */
99
- class ThinkStripper {
100
- private state: "NORMAL" | "IN_THINK" = "NORMAL";
101
- // Buffer of characters that may be the start of a marker but are not
102
- // yet complete. Holds at most max(open.length, close.length) chars
103
- // from a chunk boundary.
104
- private pending = "";
105
- // The close tag we are looking for while IN_THINK. Set when we find
106
- // an open, cleared when we find the matching close. Each open tag
107
- // has its own close tag (e.g. `` pairs with ``, not ``).
108
- private activeClose: string | null = null;
109
-
110
- /**
111
- * Find the earliest valid open-tag prefix in `input`. A valid match
112
- * is `<tagname` followed by `>`, whitespace, or end-of-string — so we
113
- * don't accidentally match `` as a substring of `<thinking>`.
114
- */
115
- private findOpen(input: string): { idx: number; open: string } | null {
116
- let best: { idx: number; open: string } | null = null;
117
- for (const open of ALL_OPENS) {
118
- let from = 0;
119
- while (from < input.length) {
120
- const idx = input.indexOf(open, from);
121
- if (idx === -1) break;
122
- const nextPos = idx + open.length;
123
- const nextCh = nextPos < input.length ? input.charAt(nextPos) : "";
124
- const isBoundary =
125
- nextCh === ">" ||
126
- nextCh === " " ||
127
- nextCh === "\t" ||
128
- nextCh === "\n" ||
129
- nextCh === "\r" ||
130
- nextCh === "";
131
- if (isBoundary) {
132
- if (best === null || idx < best.idx) {
133
- best = { idx, open };
134
- }
135
- break;
136
- }
137
- from = idx + 1;
138
- }
139
- }
140
- return best;
141
- }
142
-
143
- push(chunk: string): string {
144
- if (chunk.length === 0) return "";
145
- let input = this.pending + chunk;
146
- this.pending = "";
147
- let out = "";
148
-
149
- while (input.length > 0) {
150
- if (this.state === "NORMAL") {
151
- const found = this.findOpen(input);
152
- if (found === null) {
153
- // No open marker; might have a partial at the tail.
154
- const tail = keepPartialTail(input, ALL_OPENS);
155
- out += input.slice(0, input.length - tail.length);
156
- this.pending = tail;
157
- input = "";
158
- break;
159
- }
160
- out += input.slice(0, found.idx);
161
- input = input.slice(found.idx + found.open.length);
162
- this.activeClose = THINK_OPEN_TO_CLOSE.get(found.open) ?? null;
163
- this.state = "IN_THINK";
164
- } else {
165
- // IN_THINK
166
- const closeTag = this.activeClose;
167
- if (closeTag === null) {
168
- // Defensive: should never happen, but recover gracefully.
169
- this.state = "NORMAL";
170
- break;
171
- }
172
- const idx = input.indexOf(closeTag);
173
- if (idx === -1) {
174
- // Still inside a think block; might have a partial close at tail.
175
- const tail = keepPartialTail(input, [closeTag]);
176
- // Discard everything except the possible partial tail.
177
- this.pending = tail;
178
- input = "";
179
- break;
180
- }
181
- input = input.slice(idx + closeTag.length);
182
- this.state = "NORMAL";
183
- this.activeClose = null;
184
- // Drop any whitespace that immediately follows the close tag so
185
- // the next emitted content does not start with extra blank lines.
186
- const wsMatch = input.match(/^\s*/);
187
- if (wsMatch) input = input.slice(wsMatch[0].length);
188
- }
189
- }
190
-
191
- return out;
192
- }
193
-
194
- flush(): string {
195
- // If the stream ended while still inside a think block (malformed
196
- // response), emit any pending tail rather than swallowing it.
197
- const tail = this.pending;
198
- this.pending = "";
199
- if (this.state === "IN_THINK") {
200
- this.state = "NORMAL";
201
- this.activeClose = null;
202
- return tail;
203
- }
204
- return tail;
205
- }
206
- }
207
-
208
- /**
209
- * Of a string, return the longest suffix that is a prefix of one of the
210
- * given markers. Used to defer deciding whether a chunk ends in a real
211
- * marker until the next chunk arrives.
212
- */
213
- function keepPartialTail(input: string, markers: readonly string[]): string {
214
- const max = Math.max(...markers.map((m) => m.length));
215
- const start = Math.max(0, input.length - max);
216
- const window = input.slice(start);
217
- for (let len = Math.min(max, window.length); len > 0; len--) {
218
- const candidate = window.slice(0, len);
219
- if (markers.some((m) => m.startsWith(candidate))) return candidate;
220
- }
221
- return "";
222
- }
223
-
224
- /**
225
- * Decide whether the URL targets one of the providers we should clean.
226
- * The provider id may appear in the hostname (e.g. `api.minimax.chat`)
227
- * rather than as a path segment, so we match against the full URL.
228
- */
229
- function targetsProvider(url: string, providers: Set<string>): string | null {
230
- const lower = url.toLowerCase();
231
- for (const p of providers) {
232
- const lp = p.toLowerCase();
233
- if (lower.includes(`/${lp}/`) || lower.includes(`/${lp}?`) || lower.includes(`${lp}.`) || lower.includes(`-${lp}.`) || lower.includes(`.${lp}/`)) {
234
- return p;
235
- }
236
- }
237
- return null;
238
- }
239
-
240
- /**
241
- * Return true if a request body looks like an OpenAI-compatible chat
242
- * completions request (so we know whether to inspect the response).
243
- */
244
- function isChatCompletionsRequest(url: string, init?: RequestInit): boolean {
245
- if (!/\/chat\/completions(?:\?|$)/.test(url)) return false;
246
- const method = (init?.method ?? "POST").toUpperCase();
247
- return method === "POST";
248
- }
249
-
250
- /**
251
- * Process one non-streaming JSON response: strip inline think blocks
252
- * from `choices[*].message.content`. Returns the original text on any
253
- * parse error.
254
- */
255
- function cleanNonStreamingJson(text: string): string {
256
- const data = JSON.parse(text);
257
- const choices = Array.isArray(data?.choices) ? data.choices : [];
258
- let touched = false;
259
- for (const choice of choices) {
260
- const msg = choice?.message;
261
- if (msg && typeof msg.content === "string" && contentHasAnyThinkOpen(msg.content)) {
262
- const cleaned = stripInlineThinkBlocks(msg.content);
263
- if (cleaned !== msg.content) {
264
- msg.content = cleaned;
265
- touched = true;
266
- }
267
- }
268
- }
269
- return touched ? JSON.stringify(data) : text;
270
- }
271
-
272
- /** Cheap fast-path check: does `content` contain any of the known
273
- * think-tag open prefixes? Avoids invoking the (more expensive) full
274
- * regex on responses that obviously don't need cleaning. */
275
- function contentHasAnyThinkOpen(content: string): boolean {
276
- for (const open of ALL_OPENS) {
277
- if (content.includes(open)) return true;
278
- }
279
- return false;
280
- }
281
-
282
- /**
283
- * Process one SSE event line of the form `data: <payload>`. Mutates the
284
- * decoded payload in place to strip inline think blocks from
285
- * `choices[*].delta.content`, using a per-message `ThinkStripper` so
286
- * content split across chunks is still handled correctly.
287
- *
288
- * `strippers` is an array keyed by choice index — each choice maintains
289
- * its own stripper across multiple events.
290
- */
291
- function cleanSseLine(
292
- line: string,
293
- strippers: ThinkStripper[],
294
- debug?: (msg: string) => void,
295
- ): string {
296
- if (!line.startsWith("data:")) return line;
297
- const payload = line.slice(5).trimStart();
298
- if (payload === "[DONE]") {
299
- // Flush any in-flight strippers so we don't lose content that was
300
- // waiting on a chunk boundary.
301
- return line;
302
- }
303
- let obj: any;
304
- try {
305
- obj = JSON.parse(payload);
306
- } catch {
307
- return line;
308
- }
309
- const choices = Array.isArray(obj?.choices) ? obj.choices : [];
310
- for (let i = 0; i < choices.length; i++) {
311
- const delta = choices[i]?.delta;
312
- if (!delta || typeof delta.content !== "string" || delta.content.length === 0) continue;
313
- let stripper = strippers[i];
314
- if (!stripper) {
315
- stripper = new ThinkStripper();
316
- strippers[i] = stripper;
317
- }
318
- const cleaned = stripper.push(delta.content);
319
- if (cleaned.length > 0) {
320
- delta.content = cleaned;
321
- } else {
322
- // Avoid sending an empty content delta — some relays reject them.
323
- delete delta.content;
324
- }
325
- if (choices[i]?.finish_reason) {
326
- // End of this choice: flush the stripper so any pending partial
327
- // marker becomes part of the final delta.
328
- const flushed = stripper.flush();
329
- if (flushed.length > 0) {
330
- delta.content = (delta.content ?? "") + flushed;
331
- } else if (delta.content === undefined) {
332
- // Keep the choice delta well-formed even if nothing is left.
333
- delta.content = "";
334
- }
335
- }
336
- }
337
- debug?.(`reasoning-clean: rewrote SSE line ${payload.length}B`);
338
- return "data: " + JSON.stringify(obj);
339
- }
340
-
341
- /**
342
- * Transform an SSE response stream: parse each `data:` line, strip inline
343
- * think blocks, and re-emit the bytes.
344
- */
345
- function streamTransformer(debug?: (msg: string) => void): TransformStream<Uint8Array, Uint8Array> {
346
- const decoder = new TextDecoder("utf-8");
347
- const encoder = new TextEncoder();
348
- const strippers: ThinkStripper[] = [];
349
- let buffer = "";
350
- return new TransformStream<Uint8Array, Uint8Array>({
351
- transform(chunk, controller) {
352
- buffer += decoder.decode(chunk, { stream: true });
353
- // SSE events are separated by a blank line ("\n\n").
354
- let boundary = buffer.indexOf("\n\n");
355
- while (boundary !== -1) {
356
- const event = buffer.slice(0, boundary);
357
- buffer = buffer.slice(boundary + 2);
358
- const rewritten = event
359
- .split("\n")
360
- .map((line) => cleanSseLine(line, strippers, debug))
361
- .join("\n");
362
- controller.enqueue(encoder.encode(rewritten + "\n\n"));
363
- boundary = buffer.indexOf("\n\n");
364
- }
365
- },
366
- flush(controller) {
367
- // Flush any leftover SSE event at end of stream.
368
- const tail = buffer + decoder.decode();
369
- if (tail.length > 0) {
370
- const rewritten = tail
371
- .split("\n")
372
- .map((line) => cleanSseLine(line, strippers, debug))
373
- .join("\n");
374
- controller.enqueue(encoder.encode(rewritten));
375
- }
376
- },
377
- });
378
- }
379
-
380
- /**
381
- * Wrap a fetch implementation so that responses from the listed
382
- * providers have inline ``...</think>`` blocks stripped from the
383
- * content while preserving the structured reasoning fields. Returns a
384
- * function with the same signature as the original fetch.
385
- */
386
- export function wrapFetchForReasoningCleanup(
387
- originalFetch: FetchLike,
388
- options: ReasoningCleanOptions = {},
389
- ): FetchLike {
390
- const providers = options.providers
391
- ? new Set(options.providers)
392
- : DEFAULT_PROVIDERS;
393
- const debug = options.debug;
394
-
395
- return async (input, init) => {
396
- const url =
397
- typeof input === "string"
398
- ? input
399
- : input instanceof URL
400
- ? input.toString()
401
- : (input as Request).url;
402
- // Resolve which provider this call is going to. If we can't tell, pass through.
403
- const providerHit = targetsProvider(url, providers);
404
- if (!isChatCompletionsRequest(url, init)) {
405
- return originalFetch(input, init);
406
- }
407
- if (!providerHit) {
408
- return originalFetch(input, init);
409
- }
410
- let response: Response;
411
- try {
412
- response = await originalFetch(input, init);
413
- } catch (err) {
414
- debug?.(`reasoning-clean: fetch threw, passing through: ${(err as Error).message}`);
415
- throw err;
416
- }
417
- const ct = response.headers.get("content-type") ?? "";
418
- if (ct.includes("text/event-stream")) {
419
- const body = response.body;
420
- if (!body) return response;
421
- const transformed = body.pipeThrough(streamTransformer(debug));
422
- return new Response(transformed, {
423
- status: response.status,
424
- statusText: response.statusText,
425
- headers: response.headers,
426
- });
427
- }
428
- // Non-streaming JSON.
429
- let text: string;
430
- try {
431
- text = await response.text();
432
- } catch (err) {
433
- debug?.(`reasoning-clean: read body failed, passing through: ${(err as Error).message}`);
434
- return response;
435
- }
436
- let cleaned: string;
437
- try {
438
- cleaned = cleanNonStreamingJson(text);
439
- } catch (err) {
440
- debug?.(`reasoning-clean: parse failed, passing through original body: ${(err as Error).message}`);
441
- // Re-wrap the original text in a fresh Response so the caller
442
- // can read the body (we already consumed the original via
443
- // .text()). The status/headers are preserved.
444
- cleaned = text;
445
- }
446
- // Always return a fresh Response so the caller can read the body
447
- // (the original `response` was consumed by `.text()`).
448
- return new Response(cleaned, {
449
- status: response.status,
450
- statusText: response.statusText,
451
- headers: response.headers,
452
- });
453
- };
454
- }
@@ -1,178 +0,0 @@
1
- /**
2
- * report.ts
3
- *
4
- * Per-session log writer. Appends metadata-only lines (no args) to
5
- * ~/.cache/bizar/logs/<sessionId>.log with 10 MB rotation.
6
- * Per §7.1, §7.6, §8.3, §10.1.
7
- */
8
-
9
- import { appendFileSync, renameSync, unlinkSync, existsSync, statSync, mkdirSync } from "node:fs";
10
- import path from "node:path";
11
- import os from "node:os";
12
-
13
- /** Minimal Logger interface — same shape as state.ts */
14
- export interface Logger {
15
- log(opts: { level: "debug" | "info" | "warn" | "error"; message: string }): void;
16
- }
17
-
18
- function expandHome(p: string): string {
19
- if (p.startsWith("~/") || p === "~") {
20
- return path.join(os.homedir(), p.slice(1));
21
- }
22
- return p;
23
- }
24
-
25
- /**
26
- * Log line format (per §7.1):
27
- * 2026-06-17T14:30:01.123Z agent=thor tool=read fingerprint=ab12cd outcome=ok duration=45ms
28
- */
29
- function formatLine(
30
- sessionId: string,
31
- agent: string | null,
32
- tool: string,
33
- fingerprint: string,
34
- outcome: "ok" | "error",
35
- durationMs: number
36
- ): string {
37
- const ts = new Date().toISOString();
38
- const agentPart = agent ? ` agent=${agent}` : "";
39
- return `${ts}${agentPart} tool=${tool} fingerprint=${fingerprint} outcome=${outcome} duration=${durationMs}ms\n`;
40
- }
41
-
42
- /**
43
- * Recursive mkdirSync with EACCES handling per §8.2.
44
- */
45
- function ensureDir(dir: string, logger: Logger): boolean {
46
- try {
47
- mkdirSync(dir, { recursive: true });
48
- return true;
49
- } catch (err: unknown) {
50
- const code = (err as NodeJS.ErrnoException).code;
51
- if (code === "EACCES" || code === "EROFS") {
52
- logger.log({
53
- level: "error",
54
- message: `bizar: cannot create log directory ${dir}: ${String(err)}`,
55
- });
56
- return false;
57
- }
58
- throw err;
59
- }
60
- }
61
-
62
- /**
63
- * Rotate log files when current file exceeds maxBytes:
64
- * 1. Delete .3.log (if exists)
65
- * 2. Rename .2.log → .3.log
66
- * 3. Rename .1.log → .2.log
67
- * 4. Rename <sessionId>.log → .1.log
68
- *
69
- * Each step in its own try/catch. Best-effort — never blocks the write.
70
- * Per §8.3.
71
- */
72
- function rotateLog(logPath: string, logger: Logger): void {
73
- const dir = path.dirname(logPath);
74
-
75
- // Step 1: delete .3.log
76
- const p3 = path.join(dir, ".3.log");
77
- if (existsSync(p3)) {
78
- try { unlinkSync(p3); } catch { /* non-fatal */ }
79
- }
80
-
81
- // Step 2: rename .2.log → .3.log
82
- const p2 = path.join(dir, ".2.log");
83
- if (existsSync(p2)) {
84
- try { renameSync(p2, p3); } catch {
85
- logger.log({ level: "warn", message: `bizar: log rotation .2→.3 failed` });
86
- }
87
- }
88
-
89
- // Step 3: rename .1.log → .2.log
90
- const p1 = path.join(dir, ".1.log");
91
- if (existsSync(p1)) {
92
- try { renameSync(p1, p2); } catch {
93
- logger.log({ level: "warn", message: `bizar: log rotation .1→.2 failed` });
94
- }
95
- }
96
-
97
- // Step 4: rename current → .1.log
98
- if (existsSync(logPath)) {
99
- try { renameSync(logPath, p1); } catch {
100
- logger.log({ level: "warn", message: `bizar: log rotation current→.1 failed` });
101
- }
102
- }
103
- }
104
-
105
- export class LogWriter {
106
- private logDir: string;
107
- private maxBytes: number;
108
- private logger: Logger;
109
- private initialized = false;
110
-
111
- constructor(logDir: string, maxBytes: number, logger: Logger) {
112
- this.logDir = expandHome(logDir);
113
- this.maxBytes = Math.max(1024, Math.floor(maxBytes));
114
- this.logger = logger;
115
- }
116
-
117
- /**
118
- * Lazily ensure the log directory exists.
119
- */
120
- private ensureLogDir(): boolean {
121
- if (this.initialized) return true;
122
- this.initialized = true;
123
- return ensureDir(this.logDir, this.logger);
124
- }
125
-
126
- /**
127
- * Append a metadata-only log line for a tool call.
128
- *
129
- * Per §7.1 / §7.6: NO args are written. Only:
130
- * - ISO timestamp
131
- * - session ID
132
- * - tool name
133
- * - fingerprint hash
134
- * - outcome (ok | error)
135
- * - duration in milliseconds
136
- */
137
- async write(event: {
138
- sessionId: string;
139
- agent: string | null;
140
- tool: string;
141
- fingerprint: string;
142
- outcome: "ok" | "error";
143
- durationMs: number;
144
- }): Promise<void> {
145
- if (!this.ensureLogDir()) return;
146
-
147
- const logPath = path.join(this.logDir, `${event.sessionId}.log`);
148
- const line = formatLine(
149
- event.sessionId,
150
- event.agent,
151
- event.tool,
152
- event.fingerprint,
153
- event.outcome,
154
- event.durationMs
155
- );
156
-
157
- // Check rotation threshold
158
- try {
159
- if (existsSync(logPath)) {
160
- const stat = statSync(logPath);
161
- if (stat.size + Buffer.byteLength(line, "utf8") > this.maxBytes) {
162
- rotateLog(logPath, this.logger);
163
- }
164
- }
165
- } catch {
166
- // best-effort rotation check
167
- }
168
-
169
- try {
170
- appendFileSync(logPath, line, "utf8");
171
- } catch (err: unknown) {
172
- this.logger.log({
173
- level: "warn",
174
- message: `bizar: failed to write to log ${logPath}: ${String(err)}`,
175
- });
176
- }
177
- }
178
- }
@@ -1,35 +0,0 @@
1
- /**
2
- * research-prompt.ts
3
- *
4
- * The intervention message injected into a background session that has been
5
- * stuck in a thinking loop. The LLM sees this as a new user message and
6
- * should respond by spawning Mimir or taking other concrete action.
7
- *
8
- * Security note: the message is static — it does not interpolate any
9
- * user-supplied content, prompt, or agent output. The only variable is
10
- * the duration. This matches the prompt-injection invariant from
11
- * handoff.ts: the only dynamic content is a short number from our own
12
- * state, never from agent or user sources.
13
- *
14
- * The duration is formatted as `Xm Ys` (or just `Ys` if under a minute)
15
- * so the agent has concrete context for how long it has been looping.
16
- * We do not include the instanceId, sessionId, prompt preview, or any
17
- * other potentially-sensitive content — those would only widen the
18
- * attack surface without helping the LLM make progress.
19
- */
20
- export function researchInterventionPrompt(durationMs: number): string {
21
- const safeMs = Math.max(0, Math.floor(durationMs));
22
- const minutes = Math.floor(safeMs / 60_000);
23
- const seconds = Math.floor((safeMs % 60_000) / 1000);
24
- const durationStr = minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
25
- return `[SYSTEM REMINDER — Thinking Loop Detected]
26
-
27
- You have been thinking for over ${durationStr} without calling any tools or producing any text output. This is a sign you are stuck in a thinking loop.
28
-
29
- To make progress, take ONE of these actions NOW:
30
- 1. Use the task tool to spawn a Mimir agent for focused research on the original topic.
31
- 2. Use read/grep/glob to gather concrete information from the codebase.
32
- 3. Use bash to execute commands that produce observable results.
33
-
34
- Do NOT continue thinking without taking action. Make a tool call in your next turn.`;
35
- }