@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,7 +1,7 @@
1
1
  /**
2
2
  * src/server/task-delegator.mjs
3
3
  *
4
- * v3.5.2 — Odin task delegation.
4
+ * v6.3.0 — Odin task delegation, REWRITTEN for Claude Code.
5
5
  *
6
6
  * Accepts a single "natural language" task from the user. Splits it into
7
7
  * 1-5 subtasks via heuristic rules (an LLM call would replace this in
@@ -18,23 +18,18 @@
18
18
  * Subtasks are always persisted to the regular tasks store first; the
19
19
  * background dispatch is best-effort.
20
20
  *
21
- * v3.5.4 (bug: dispatch stuck) — Dispatch path replaced. The previous
22
- * implementation shell-executed `node plugins/bizar/dist/cli.js bg enqueue`,
23
- * but the plugin is a Bun-native TS project with no compiled `dist/`,
24
- * so the exec always failed. The silent try/catch around execSync meant
25
- * the failure was invisible to both the user and the dashboard log.
21
+ * v6.3.0 — Dispatch path replaced. The previous Cline path shell-executed
22
+ * `node plugins/bizar/dist/cli.js bg enqueue`, then `cline run` via
23
+ * cline-runner.mjs. Claude Code has no equivalent `serve` child — the
24
+ * new path spawns `claude -p "<prompt>"` per subtask via
25
+ * `claude-runner.mjs` (in-process when the SDK is available,
26
+ * subprocess otherwise). The dispatch is gated on `pingClaudeSdk()`
27
+ * (in-process SDK reachable) OR the `claude` binary on PATH.
26
28
  *
27
- * New path:
28
- * 1. Read the plugin's serve-info file (port + password + worktree).
29
- * 2. POST /api/session on the plugin's cline serve child.
30
- * 3. POST /api/session/{id}/prompt to fire the task prompt.
31
- * 4. Write a state file under ~/.cache/bizar/bg/ so the dashboard's
32
- * background-store can list and kill it.
33
- *
34
- * If serve-info is missing (plugin not running) we log a clear warning
35
- * at startup AND surface the dispatch failure in the `/submit` response,
36
- * so the user can re-dispatch manually with `/api/tasks/:id/start`
37
- * after the plugin is up.
29
+ * If neither is available we log a clear warning at startup AND
30
+ * surface the dispatch failure in the `/submit` response, so the
31
+ * user can re-dispatch manually with `/api/tasks/:id/start`
32
+ * once the runtime is up.
38
33
  */
39
34
 
40
35
  import { tasksStore, ALLOWED_TASK_STATUSES } from './tasks-store.mjs';
@@ -84,6 +79,7 @@ function buildPromptText(sub) {
84
79
  parts.push(`Subtask ID: ${sub.id}`);
85
80
  parts.push(`Assigned agent: ${sub.assignee || 'tyr'}`);
86
81
  parts.push(`Parent task ID: ${sub.parent || '(none)'}`);
82
+ parts.push(`Runtime: Claude Code (claude -p)`);
87
83
  return parts.join('\n');
88
84
  }
89
85
 
@@ -460,23 +456,25 @@ export const taskDelegator = {
460
456
  },
461
457
 
462
458
  /**
463
- * v3.5.4 (bug: dispatch stuck) — Best-effort dispatch to the background
464
- * agent infrastructure. Talks to the plugin's cline serve child via
465
- * HTTP (createSession + sendPrompt) and writes a per-instance state
466
- * file under BG_DIRS so the dashboard's `backgroundStore.list()` and
467
- * `kill()` paths find the instance.
459
+ * v6.3.0 — Best-effort dispatch to the Claude Code runtime.
460
+ * Replaces the v3.5.4 Cline HTTP-serve path. Spawns one
461
+ * `claude -p "<prompt>"` subprocess per subtask via
462
+ * `claude-runner.mjs` (or, when the SDK is available,
463
+ * `claude-bg-spawner.mjs`'s SDK-backed path).
468
464
  *
469
- * Replaces the previous `execSync('node plugins/bizar/dist/cli.js …')`
470
- * path which silently failed because the plugin is a Bun-native TS
471
- * project with no compiled `dist/`.
465
+ * The runner writes its output to the LogWriter's log file under
466
+ * `~/.cache/bizar/logs/<sessionId>.log`. The dashboard's
467
+ * `backgroundStore.list()` and `kill()` paths find the instance
468
+ * via the per-instance state file at
469
+ * `~/.cache/bizar/bg/<instanceId>.json`.
472
470
  *
473
471
  * Returns a structured `{ dispatched: string[], errors: Array<…>, warnings: Array<…> }`
474
- * so the caller (and `/api/tasks/submit`) can surface failures to the
475
- * user instead of swallowing them.
472
+ * so the caller (and `/api/tasks/submit`) can surface failures to
473
+ * the user instead of swallowing them.
476
474
  *
477
- * v3.5.1 — Respects agents.maxParallel: caps concurrent dispatches to
478
- * the configured limit; overflow subtasks are queued until a slot
479
- * frees up.
475
+ * v3.5.1 — Respects agents.maxParallel: caps concurrent dispatches
476
+ * to the configured limit; overflow subtasks are queued until a
477
+ * slot frees up.
480
478
  *
481
479
  * @returns {Promise<{ dispatched: string[], errors: Array<{ subtaskId: string, kind: string, message: string }>, warnings: string[] }>}
482
480
  */
@@ -503,29 +501,32 @@ export const taskDelegator = {
503
501
  const runningCount = await runningBgCount();
504
502
  const slotsAvailable = Math.max(0, maxParallel - runningCount);
505
503
 
506
- // v3.5.4 (bug: dispatch stuck) — Resolve the cline serve child
507
- // the plugin owns. If the plugin is not running we record a warning
508
- // and skip the actual spawn (subtasks still flip to `doing` so the
509
- // user can see them, but `metadata.dispatchPending = true` tells
510
- // them to retry via `/api/tasks/:id/start` once the plugin is up).
511
- let serveInfo = null;
512
- let serveReachable = false;
504
+ // v6.3.0 — Verify the Claude Code runtime is reachable. We
505
+ // accept either the in-process SDK or the `claude` binary on
506
+ // PATH. `pingClaudeSdk()` probes the SDK; `claude -v` on PATH
507
+ // is the subprocess fallback. When neither is available we
508
+ // mark subtasks as `dispatchPending: true` so the UI surfaces
509
+ // "Awaiting dispatch" and `/api/tasks/:id/start` can retry
510
+ // after the user installs Claude Code.
511
+ let claudeAvailable = false;
513
512
  try {
514
- const { readServeInfo, pingClineServe } = await import('./serve-info.mjs');
515
- serveInfo = readServeInfo();
516
- if (!serveInfo) {
517
- result.warnings.push('serve-info not found — the bizar plugin is not running. Tasks will be marked queued; retry via POST /api/tasks/:id/start once the plugin is up.');
518
- console.warn('[task-delegator] serve-info missing — plugin may not be running. Dispatch will be deferred.');
519
- } else {
520
- serveReachable = await pingClineServe(serveInfo);
521
- if (!serveReachable) {
522
- result.warnings.push(`cline serve at ${serveInfo.baseUrl} is not reachable. Tasks will be marked queued; retry via POST /api/tasks/:id/start.`);
523
- console.warn(`[task-delegator] cline serve not reachable at ${serveInfo.baseUrl}`);
524
- }
513
+ const { pingClaudeSdk } = await import('./claude-sdk.mjs');
514
+ claudeAvailable = await pingClaudeSdk();
515
+ } catch {
516
+ claudeAvailable = false;
517
+ }
518
+ if (!claudeAvailable) {
519
+ try {
520
+ const { spawnSync } = await import('node:child_process');
521
+ const probe = spawnSync('claude', ['-v'], { stdio: 'ignore', timeout: 1500 });
522
+ claudeAvailable = probe.status === 0;
523
+ } catch {
524
+ claudeAvailable = false;
525
525
  }
526
- } catch (err) {
527
- result.warnings.push(`could not load serve-info helper: ${err.message}`);
528
- console.warn('[task-delegator] serve-info helper failed:', err.message);
526
+ }
527
+ if (!claudeAvailable) {
528
+ result.warnings.push('claude runtime not reachable — neither the @anthropic-ai/claude-agent-sdk nor the `claude` binary on PATH. Tasks will be marked queued; retry via POST /api/tasks/:id/start once Claude Code is installed.');
529
+ console.warn('[task-delegator] claude runtime unreachable — dispatch will be deferred.');
529
530
  }
530
531
 
531
532
  // Split: first N get dispatched now, rest are queued.
@@ -549,13 +550,13 @@ export const taskDelegator = {
549
550
  });
550
551
  }
551
552
 
552
- // v3.5.4 (bug: dispatch stuck) — Per-subtask dispatch path. We
553
- // collect errors instead of swallowing them. Two failure modes:
554
- // - serveInfo/serveReachable missing: mark dispatchPending so
555
- // the UI shows "Awaiting dispatch" and `/api/tasks/:id/start`
556
- // can retry.
557
- // - HTTP error: record error message so the API response carries
558
- // it.
553
+ // v6.3.0 — Per-subtask dispatch path. We collect errors instead
554
+ // of swallowing them. Two failure modes:
555
+ // - claudeAvailable=false: mark dispatchPending so the UI
556
+ // shows "Awaiting dispatch" and `/api/tasks/:id/start` can
557
+ // retry.
558
+ // - spawn failure: record error message so the API response
559
+ // carries it.
559
560
  for (const sub of toDispatch) {
560
561
  const startedAt = new Date().toISOString();
561
562
  let bgInstanceId = null;
@@ -563,21 +564,19 @@ export const taskDelegator = {
563
564
  let dispatchError = null;
564
565
  let dispatchPending = false;
565
566
 
566
- // v3.11.1 — Active dispatch path. We no longer depend on the
567
- // cline serve child's HTTP API to drive the agent loop
568
- // (per the cline docs, that API is passive — it needs a
569
- // TUI/web client connected to actually process prompts).
570
- // Instead we spawn one `cline run` subprocess per subtask
571
- // and capture its output to the LogWriter's log file. The
572
- // plugin's cline-runner.ts and this dashboard's
573
- // cline-runner.mjs share the same wire format.
574
- if (serveInfo && serveReachable) {
567
+ // v6.3.0 — Active dispatch path. Spawn one `claude -p` (or
568
+ // `claude --bg` for long-running sessions) subprocess per
569
+ // subtask via claude-runner.mjs. Capture the sessionId from
570
+ // the runner's JSON-line stream.
571
+ if (claudeAvailable) {
575
572
  try {
576
- const { spawnAgent } = await import('./cline-runner.mjs');
577
- // v3.11.0 — Fall back to projectRoot when serve-info is
578
- // missing `worktree` (older plugin builds only wrote
579
- // `{password, pid, port}`).
580
- const dispatchWorktree = serveInfo.worktree || projectRoot || '';
573
+ const { spawnAgent } = await import('./claude-runner.mjs');
574
+ // v6.3.0 — Prefer the bg-spawner's SDK-backed path when
575
+ // the SDK is reachable; fall back to the print-mode
576
+ // subprocess otherwise. We always pass `background: false`
577
+ // here so the runner returns a sessionId synchronously;
578
+ // the bg-spawner is used separately by the Active tab.
579
+ const dispatchWorktree = projectRoot || '';
581
580
  const promptText = buildPromptText(sub);
582
581
 
583
582
  // Predict the bg instance id (deterministic, derived from
@@ -597,14 +596,14 @@ export const taskDelegator = {
597
596
  });
598
597
 
599
598
  if (!spawnRes.ok || !spawnRes.sessionId) {
600
- dispatchError = spawnRes.error || 'cline run failed before reporting session id';
599
+ dispatchError = spawnRes.error || 'claude -p failed before reporting session id';
601
600
  } else {
602
601
  sessionId = spawnRes.sessionId;
603
602
  bgInstanceId = predictedInstanceId;
604
603
 
605
604
  // v3.5.5 — Wrap the agent run in a tmux session so
606
605
  // operators can `tmux attach -t bizar-bg-<id>` and watch
607
- // the cline process in real time.
606
+ // the claude process in real time.
608
607
  try {
609
608
  const tmuxRes = backgroundStore.spawnTmuxFor(
610
609
  `bg_${sessionId.slice(0, 16)}`,
@@ -623,9 +622,9 @@ export const taskDelegator = {
623
622
  dispatchError = err instanceof Error ? err.message : String(err);
624
623
  }
625
624
  } else {
626
- // Plugin not running — leave the subtask marked queued with a
627
- // dispatchPending flag. The UI surfaces this and the user can
628
- // retry via POST /api/tasks/:id/start.
625
+ // Claude Code not available — leave the subtask marked
626
+ // queued with a dispatchPending flag. The UI surfaces this
627
+ // and the user can retry via POST /api/tasks/:id/start.
629
628
  dispatchPending = true;
630
629
  }
631
630
 
@@ -42,6 +42,8 @@ import { Doctor } from './views/Doctor';
42
42
  import { Harness } from './views/Harness';
43
43
  import { Eval } from './views/Eval';
44
44
  import { EvalReport } from './views/EvalReport';
45
+ // v6.4.0 — F-036 Goal Planner UI.
46
+ import { GoalPlanner } from './views/GoalPlanner';
45
47
  import { SettingsNav } from './components/SettingsNav';
46
48
  import { Spinner } from './components/Spinner';
47
49
  import { Button } from './components/Button';
@@ -108,6 +110,8 @@ const VIEW_MAP: Record<string, (p: ViewProps) => React.ReactNode> = {
108
110
  // Eval view's "Open Eval Report" button (full report + diff).
109
111
  eval: Eval,
110
112
  evalReport: EvalReport,
113
+ // v6.4.0 — F-036 Goal Planner UI. Plain-English goal → A* plan.
114
+ 'goal-planner': GoalPlanner,
111
115
  };
112
116
 
113
117
  const VERSION = 'v6.0.0';
@@ -1,17 +1,30 @@
1
1
  // src/components/Tag.tsx — pill for tags.
2
2
 
3
- import type { ReactNode } from 'react';
3
+ import type { HTMLAttributes, ReactNode } from 'react';
4
4
  import { cn } from '../lib/utils';
5
5
 
6
- export type TagProps = {
6
+ export type TagVariant =
7
+ | "neutral"
8
+ | "info"
9
+ | "accent"
10
+ | "primary"
11
+ | "success"
12
+ | "warning"
13
+ | "error";
14
+
15
+ export type TagProps = HTMLAttributes<HTMLSpanElement> & {
7
16
  children: ReactNode;
8
17
  className?: string;
18
+ variant?: TagVariant;
9
19
  onRemove?: () => void;
10
20
  };
11
21
 
12
- export function Tag({ children, className, onRemove }: TagProps) {
22
+ export function Tag({ children, className, variant, onRemove, ...rest }: TagProps) {
13
23
  return (
14
- <span className={cn('tag', className)}>
24
+ <span
25
+ className={cn('tag', variant ? `tag-${variant}` : undefined, className)}
26
+ {...rest}
27
+ >
15
28
  {children}
16
29
  {onRemove && (
17
30
  <button
@@ -25,4 +38,4 @@ export function Tag({ children, className, onRemove }: TagProps) {
25
38
  )}
26
39
  </span>
27
40
  );
28
- }
41
+ }
@@ -26,6 +26,7 @@ import {
26
26
  Brain,
27
27
  Stethoscope,
28
28
  ClipboardCheck,
29
+ Target,
29
30
  type LucideIcon,
30
31
  } from 'lucide-react';
31
32
  import { cn } from '../lib/utils';
@@ -66,6 +67,8 @@ export const TABS: TabDef[] = [
66
67
  { id: 'doctor', label: 'Doctor', icon: Stethoscope },
67
68
  // v6.0.0 — Harness engineering dashboard.
68
69
  { id: 'harness', label: 'Harness', icon: Shield },
70
+ // v6.4.0 — F-036 Goal Planner UI. Plain-English → A* plan.
71
+ { id: 'goal-planner', label: 'Goals', icon: Target },
69
72
  { id: 'settings', label: 'Settings', icon: Sliders },
70
73
  ];
71
74
 
@@ -0,0 +1,126 @@
1
+ // src/web/components/agents/CommunicationLog.tsx — inter-agent message bus trace.
2
+ //
3
+ // v6.4.0 — F-036 (Goal Planner UI). Subscribes to ws.ts for any
4
+ // event whose type starts with `agent:` and renders the last 200
5
+ // messages with color coding by type. Bounded virtual-list window
6
+ // so a runaway stream can't blow up the page.
7
+ import { useEffect, useState } from 'react';
8
+ import { MessageSquare, ArrowRight } from 'lucide-react';
9
+ import { Ws } from '../../lib/ws';
10
+ import { Card, CardTitle, CardMeta } from '../Card';
11
+ import { Tag } from '../Tag';
12
+
13
+ const MAX_ROWS = 200;
14
+
15
+ type Entry = {
16
+ id: string;
17
+ ts: number;
18
+ from: string;
19
+ to: string;
20
+ message: string;
21
+ kind: 'info' | 'request' | 'success' | 'warning' | 'error' | 'status' | 'restarted' | 'stuck' | 'message';
22
+ raw: unknown;
23
+ };
24
+
25
+ function classify(t: string): Entry['kind'] {
26
+ if (t === 'agent:status') return 'status';
27
+ if (t === 'agent:restarted') return 'restarted';
28
+ if (t === 'agent:stuck') return 'stuck';
29
+ if (t === 'agent:message') return 'message';
30
+ return 'info';
31
+ }
32
+
33
+ function deriveEntry(t: string, payload: Record<string, unknown> | undefined, ts: number): Entry {
34
+ const kind = classify(t);
35
+ const id = `${ts}-${Math.random().toString(36).slice(2, 7)}`;
36
+ if (t === 'agent:message') {
37
+ const m = (payload?.message || payload) as Record<string, unknown>;
38
+ return {
39
+ id,
40
+ ts,
41
+ from: String(m?.from || 'unknown'),
42
+ to: String(m?.to || 'unknown'),
43
+ message: String(m?.text || m?.message || JSON.stringify(m).slice(0, 160)),
44
+ kind,
45
+ raw: payload,
46
+ };
47
+ }
48
+ const agent = (payload?.agent || payload) as Record<string, unknown>;
49
+ const name = String(agent?.name || 'agent');
50
+ return {
51
+ id,
52
+ ts,
53
+ from: name,
54
+ to: kind === 'stuck' ? 'orchestrator' : 'broadcast',
55
+ message: `${t} ${agent?.status ? `→ ${agent.status}` : ''}`.trim(),
56
+ kind,
57
+ raw: payload,
58
+ };
59
+ }
60
+
61
+ interface Props {
62
+ /** Override the max row count (default 200). */
63
+ maxRows?: number;
64
+ }
65
+
66
+ export function CommunicationLog({ maxRows = MAX_ROWS }: Props) {
67
+ const [rows, setRows] = useState<Entry[]>([]);
68
+
69
+ useEffect(() => {
70
+ const ws = new Ws();
71
+ const off = ws.on((msg) => {
72
+ const t = (msg as { type?: string }).type;
73
+ if (!t || !t.startsWith('agent:')) return;
74
+ const m = msg as { type: string; ts?: number } & Record<string, unknown>;
75
+ const ts = Number(m.ts) || Date.now();
76
+ setRows((prev) => {
77
+ const next = [...prev, deriveEntry(t, m as Record<string, unknown>, ts)];
78
+ return next.length > maxRows ? next.slice(next.length - maxRows) : next;
79
+ });
80
+ });
81
+ return () => {
82
+ off();
83
+ ws.close();
84
+ };
85
+ }, [maxRows]);
86
+
87
+ return (
88
+ <Card className="comm-log" data-testid="communication-log">
89
+ <div className="comm-log-header">
90
+ <CardTitle>
91
+ <MessageSquare size={14} aria-hidden /> Communication log
92
+ </CardTitle>
93
+ <Tag variant="neutral" data-testid="communication-log-count">{rows.length}</Tag>
94
+ </div>
95
+ <CardMeta>Inter-agent message bus trace · bounded to {maxRows} rows</CardMeta>
96
+ <ul className="comm-log-list" data-testid="communication-log-list">
97
+ {rows.length === 0 && (
98
+ <li className="comm-log-empty" data-testid="communication-log-empty">
99
+ No agent messages yet. Stream will appear here live.
100
+ </li>
101
+ )}
102
+ {rows.slice().reverse().map((row) => (
103
+ <li
104
+ key={row.id}
105
+ className={`comm-log-row is-${row.kind}`}
106
+ data-testid="communication-log-row"
107
+ data-kind={row.kind}
108
+ >
109
+ <div className="comm-log-row-meta">
110
+ <span className="comm-log-from">{row.from}</span>
111
+ <ArrowRight size={12} aria-hidden />
112
+ <span className="comm-log-to">{row.to}</span>
113
+ <Tag variant="neutral" className={`comm-log-kind is-${row.kind}`}>{row.kind}</Tag>
114
+ <time className="comm-log-time" dateTime={new Date(row.ts).toISOString()}>
115
+ {new Date(row.ts).toLocaleTimeString()}
116
+ </time>
117
+ </div>
118
+ <div className="comm-log-message">{row.message}</div>
119
+ </li>
120
+ ))}
121
+ </ul>
122
+ </Card>
123
+ );
124
+ }
125
+
126
+ export default CommunicationLog;
@@ -0,0 +1,163 @@
1
+ // src/web/components/agents/DependencyGraph.tsx — DAG of plan step dependencies.
2
+ //
3
+ // v6.4.0 — F-036 (Goal Planner UI). Uses @xyflow/react (already in
4
+ // Bizar deps) to render the plan's step graph. Falls back to a
5
+ // hand-rolled table when no plan is supplied.
6
+ import { useMemo } from 'react';
7
+ import {
8
+ ReactFlow,
9
+ Background,
10
+ Controls,
11
+ MiniMap,
12
+ type Node,
13
+ type Edge,
14
+ type NodeProps,
15
+ Handle,
16
+ Position,
17
+ } from '@xyflow/react';
18
+ import '@xyflow/react/dist/style.css';
19
+ import { GitBranch } from 'lucide-react';
20
+ import { Card, CardTitle, CardMeta } from '../Card';
21
+ import { Tag } from '../Tag';
22
+ import type { Plan } from '../../lib/goapPlanner';
23
+
24
+ interface Props {
25
+ plan: Plan | null;
26
+ }
27
+
28
+ function StepNode({ data }: NodeProps<Node<{ label: string; action: string; agent: string }>>) {
29
+ return (
30
+ <div className={`dep-node is-${(data as { action?: string }).action || 'research'}`}>
31
+ <Handle type="target" position={Position.Left} className="dep-handle" />
32
+ <div className="dep-node-action">{(data as { action?: string }).action}</div>
33
+ <div className="dep-node-label">{(data as { label?: string }).label}</div>
34
+ <div className="dep-node-agent">@{(data as { agent?: string }).agent}</div>
35
+ <Handle type="source" position={Position.Right} className="dep-handle" />
36
+ </div>
37
+ );
38
+ }
39
+
40
+ const nodeTypes = { step: StepNode };
41
+
42
+ export function DependencyGraph({ plan }: Props) {
43
+ const nodes: Node[] = useMemo(() => {
44
+ if (!plan) return [];
45
+ const n = plan.steps.length;
46
+ // Lay out nodes in a horizontal flow based on dep depth.
47
+ const depths = new Map<string, number>();
48
+ const computeDepth = (id: string, stack = new Set<string>()): number => {
49
+ const cached = depths.get(id);
50
+ if (cached !== undefined) return cached;
51
+ if (stack.has(id)) return 0;
52
+ stack.add(id);
53
+ const step = plan.steps.find((s) => s.id === id);
54
+ if (!step || step.deps.length === 0) {
55
+ depths.set(id, 0);
56
+ stack.delete(id);
57
+ return 0;
58
+ }
59
+ let max = 0;
60
+ for (const dep of step.deps) {
61
+ const d = computeDepth(dep, stack);
62
+ if (d > max) max = d;
63
+ }
64
+ depths.set(id, max + 1);
65
+ stack.delete(id);
66
+ return max + 1;
67
+ };
68
+ for (const s of plan.steps) computeDepth(s.id);
69
+
70
+ const byDepth = new Map<number, string[]>();
71
+ for (const s of plan.steps) {
72
+ const d = depths.get(s.id) ?? 0;
73
+ const arr = byDepth.get(d) || [];
74
+ arr.push(s.id);
75
+ byDepth.set(d, arr);
76
+ }
77
+ const nodesOut: Node[] = [];
78
+ for (const [depth, ids] of byDepth) {
79
+ const total = ids.length;
80
+ ids.forEach((id, i) => {
81
+ const step = plan.steps.find((s) => s.id === id);
82
+ if (!step) return;
83
+ const xOffset = 60 + depth * 220;
84
+ const yOffset = 40 + (i - (total - 1) / 2) * 90;
85
+ nodesOut.push({
86
+ id: step.id,
87
+ type: 'step',
88
+ position: { x: xOffset, y: yOffset },
89
+ data: {
90
+ label: step.title,
91
+ action: step.action,
92
+ agent: step.agent,
93
+ },
94
+ });
95
+ });
96
+ }
97
+ void n;
98
+ return nodesOut;
99
+ }, [plan]);
100
+
101
+ const edges: Edge[] = useMemo(() => {
102
+ if (!plan) return [];
103
+ return plan.steps.flatMap((step) =>
104
+ step.deps.map((dep) => ({
105
+ id: `${dep}->${step.id}`,
106
+ source: dep,
107
+ target: step.id,
108
+ animated: true,
109
+ })),
110
+ );
111
+ }, [plan]);
112
+
113
+ if (!plan) {
114
+ return (
115
+ <Card className="dep-graph" data-testid="dep-graph">
116
+ <CardTitle>
117
+ <GitBranch size={14} aria-hidden /> Dependency graph
118
+ </CardTitle>
119
+ <CardMeta>Submit a goal to render the dependency DAG.</CardMeta>
120
+ </Card>
121
+ );
122
+ }
123
+
124
+ if (plan.steps.length === 0) {
125
+ return (
126
+ <Card className="dep-graph" data-testid="dep-graph">
127
+ <CardTitle>
128
+ <GitBranch size={14} aria-hidden /> Dependency graph
129
+ </CardTitle>
130
+ <CardMeta>Empty plan — nothing to render.</CardMeta>
131
+ </Card>
132
+ );
133
+ }
134
+
135
+ return (
136
+ <Card className="dep-graph" data-testid="dep-graph">
137
+ <div className="dep-graph-header">
138
+ <CardTitle>
139
+ <GitBranch size={14} aria-hidden /> Dependency graph
140
+ </CardTitle>
141
+ <Tag variant="info">{plan.steps.length} nodes</Tag>
142
+ <Tag variant="accent">{edges.length} edges</Tag>
143
+ </div>
144
+ <CardMeta>Plan step DAG · {plan.goal.slice(0, 80)}</CardMeta>
145
+ <div className="dep-graph-canvas" data-testid="dep-graph-canvas">
146
+ <ReactFlow
147
+ nodes={nodes}
148
+ edges={edges}
149
+ nodeTypes={nodeTypes}
150
+ fitView
151
+ fitViewOptions={{ padding: 0.15 }}
152
+ proOptions={{ hideAttribution: true }}
153
+ >
154
+ <Background gap={16} size={1} />
155
+ <Controls showInteractive={false} />
156
+ <MiniMap pannable zoomable />
157
+ </ReactFlow>
158
+ </div>
159
+ </Card>
160
+ );
161
+ }
162
+
163
+ export default DependencyGraph;