@polderlabs/bizar 3.23.1 → 4.2.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 (361) hide show
  1. package/README.md +83 -16
  2. package/bizar-dash/.bizar/activity.log +3 -0
  3. package/bizar-dash/.bizar/graph/.graphify_analysis.json +1540 -0
  4. package/bizar-dash/.bizar/graph/.graphify_labels.json +1 -0
  5. package/bizar-dash/.bizar/graph/GRAPH_REPORT.md +404 -0
  6. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/0661b816358db84dfdb7f10443db8a61152fd20b3fee950caf8fbf32920a1790.json +1 -0
  7. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/16da06d774142a6e5d74829ad982531286a6193ef798de8f593db029e123ec32.json +1 -0
  8. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/27e5697c01254c69c64c5a33896669073b40afb5ba88375102ae77fa5404136d.json +1 -0
  9. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/532997898027254aa4c0932243dc71d2f55888181232b65974961934997dc85b.json +1 -0
  10. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/84e3451a64c7f99f0cd6a88b0748d7426780486f53ab4935b7476b28c08f8293.json +1 -0
  11. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/88e5ea5f3e78fa69353fe9e6a8d1a05391d54605e25600cb125531eb5a6432ff.json +1 -0
  12. package/bizar-dash/.bizar/graph/cache/stat-index.json +1 -0
  13. package/bizar-dash/.bizar/graph/graph.html +307 -0
  14. package/bizar-dash/.bizar/graph/graph.json +40267 -0
  15. package/bizar-dash/.bizar/graph/manifest.json +762 -0
  16. package/bizar-dash/.graphifyignore +40 -0
  17. package/bizar-dash/.obsidian/README.md +14 -0
  18. package/bizar-dash/.obsidian/daily/2026-06-25.md +9 -0
  19. package/bizar-dash/.obsidian/vault.json +7 -0
  20. package/bizar-dash/.od-skills/web-prototype-e1429c1737/SKILL.md +103 -0
  21. package/bizar-dash/.od-skills/web-prototype-e1429c1737/assets/template.html +338 -0
  22. package/bizar-dash/.od-skills/web-prototype-e1429c1737/example.html +81 -0
  23. package/bizar-dash/.od-skills/web-prototype-e1429c1737/open-design.json +172 -0
  24. package/bizar-dash/.od-skills/web-prototype-e1429c1737/references/checklist.md +44 -0
  25. package/bizar-dash/.od-skills/web-prototype-e1429c1737/references/layouts.md +247 -0
  26. package/bizar-dash/CHANGELOG.md +474 -0
  27. package/bizar-dash/DESIGN.md +136 -0
  28. package/bizar-dash/dist/assets/main-B3RgW6FS.js +331 -0
  29. package/bizar-dash/dist/assets/main-B3RgW6FS.js.map +1 -0
  30. package/bizar-dash/dist/assets/main-DlJ8wgLR.css +1 -0
  31. package/bizar-dash/dist/assets/mobile-CsZQAswA.css +1 -0
  32. package/bizar-dash/dist/assets/mobile-DbxIw8BG.js +2 -0
  33. package/bizar-dash/dist/assets/mobile-DbxIw8BG.js.map +1 -0
  34. package/bizar-dash/dist/assets/mobile-Dvq2d53Y.js +354 -0
  35. package/bizar-dash/dist/assets/mobile-Dvq2d53Y.js.map +1 -0
  36. package/bizar-dash/dist/index.html +40 -0
  37. package/bizar-dash/dist/mobile.html +22 -0
  38. package/bizar-dash/plans/debug-plan/comments.json +1 -0
  39. package/bizar-dash/plans/debug-plan/meta.json +10 -0
  40. package/bizar-dash/plans/debug-plan/plan.json +174 -0
  41. package/bizar-dash/scripts/smoke-bg-retry.mjs +246 -0
  42. package/bizar-dash/src/cli/dashboard-ports.mjs +488 -0
  43. package/bizar-dash/src/cli.mjs +522 -0
  44. package/bizar-dash/src/server/activity-log.mjs +174 -0
  45. package/bizar-dash/src/server/agents-store.mjs +465 -0
  46. package/bizar-dash/src/server/api.mjs +138 -0
  47. package/bizar-dash/src/server/artifact-template.html +810 -0
  48. package/bizar-dash/src/server/artifacts-store.mjs +733 -0
  49. package/bizar-dash/src/server/auth.mjs +381 -0
  50. package/bizar-dash/src/server/background-store.mjs +447 -0
  51. package/bizar-dash/src/server/bg-poller.mjs +305 -0
  52. package/bizar-dash/src/server/bg-retry.mjs +574 -0
  53. package/bizar-dash/src/server/browser.mjs +40 -0
  54. package/bizar-dash/src/server/diagnostics-store.mjs +148 -0
  55. package/bizar-dash/src/server/dialog-poller.mjs +105 -0
  56. package/bizar-dash/src/server/dialog-store.mjs +177 -0
  57. package/bizar-dash/src/server/glyphs/mdx-compiler.mjs +583 -0
  58. package/bizar-dash/src/server/lib/path-safe.mjs +283 -0
  59. package/bizar-dash/src/server/memory-git.mjs +329 -0
  60. package/bizar-dash/src/server/memory-lightrag.mjs +767 -0
  61. package/bizar-dash/src/server/memory-schema.mjs +145 -0
  62. package/bizar-dash/src/server/memory-secrets.mjs +84 -0
  63. package/bizar-dash/src/server/memory-store.mjs +471 -0
  64. package/bizar-dash/src/server/mod-security.mjs +398 -0
  65. package/bizar-dash/src/server/mods-loader.mjs +1067 -0
  66. package/bizar-dash/src/server/notifications-store.mjs +243 -0
  67. package/bizar-dash/src/server/obsidian-store.mjs +318 -0
  68. package/bizar-dash/src/server/opencode-runner.mjs +279 -0
  69. package/bizar-dash/src/server/pair-store.mjs +138 -0
  70. package/bizar-dash/src/server/projects-store.mjs +364 -0
  71. package/bizar-dash/src/server/providers-store.mjs +789 -0
  72. package/bizar-dash/src/server/routes/_shared.mjs +415 -0
  73. package/bizar-dash/src/server/routes/activity.mjs +110 -0
  74. package/bizar-dash/src/server/routes/agents.mjs +134 -0
  75. package/bizar-dash/src/server/routes/artifacts.mjs +279 -0
  76. package/bizar-dash/src/server/routes/auth.mjs +69 -0
  77. package/bizar-dash/src/server/routes/background.mjs +165 -0
  78. package/bizar-dash/src/server/routes/chat.mjs +485 -0
  79. package/bizar-dash/src/server/routes/config.mjs +129 -0
  80. package/bizar-dash/src/server/routes/diagnostics.mjs +50 -0
  81. package/bizar-dash/src/server/routes/dialogs.mjs +86 -0
  82. package/bizar-dash/src/server/routes/fs.mjs +429 -0
  83. package/bizar-dash/src/server/routes/history.mjs +78 -0
  84. package/bizar-dash/src/server/routes/memory.mjs +658 -0
  85. package/bizar-dash/src/server/routes/misc.mjs +89 -0
  86. package/bizar-dash/src/server/routes/mods.mjs +359 -0
  87. package/bizar-dash/src/server/routes/notifications.mjs +54 -0
  88. package/bizar-dash/src/server/routes/obsidian.mjs +239 -0
  89. package/bizar-dash/src/server/routes/opencode-sessions.mjs +55 -0
  90. package/bizar-dash/src/server/routes/overview.mjs +91 -0
  91. package/bizar-dash/src/server/routes/pair.mjs +67 -0
  92. package/bizar-dash/src/server/routes/projects.mjs +175 -0
  93. package/bizar-dash/src/server/routes/providers.mjs +47 -0
  94. package/bizar-dash/src/server/routes/schedules.mjs +104 -0
  95. package/bizar-dash/src/server/routes/settings.mjs +51 -0
  96. package/bizar-dash/src/server/routes/skills.mjs +76 -0
  97. package/bizar-dash/src/server/routes/tasks.mjs +468 -0
  98. package/bizar-dash/src/server/routes/themes.mjs +51 -0
  99. package/bizar-dash/src/server/routes-v2/auth.mjs +59 -0
  100. package/bizar-dash/src/server/routes-v2/events.mjs +107 -0
  101. package/bizar-dash/src/server/routes-v2/health.mjs +21 -0
  102. package/bizar-dash/src/server/routes-v2/index.mjs +90 -0
  103. package/bizar-dash/src/server/routes-v2/sessions.mjs +111 -0
  104. package/bizar-dash/src/server/schedules-runner.mjs +369 -0
  105. package/bizar-dash/src/server/schedules-store.mjs +268 -0
  106. package/bizar-dash/src/server/search-store.mjs +220 -0
  107. package/bizar-dash/src/server/serve-info.mjs +684 -0
  108. package/bizar-dash/src/server/server.mjs +796 -0
  109. package/bizar-dash/src/server/settings-store.mjs +45 -0
  110. package/bizar-dash/src/server/skills-store.mjs +300 -0
  111. package/bizar-dash/src/server/state.mjs +437 -0
  112. package/bizar-dash/src/server/tailscale-store.mjs +113 -0
  113. package/bizar-dash/src/server/task-delegator.mjs +824 -0
  114. package/bizar-dash/src/server/tasks-store.mjs +508 -0
  115. package/bizar-dash/src/server/tui.mjs +923 -0
  116. package/bizar-dash/src/server/update-store.mjs +168 -0
  117. package/bizar-dash/src/server/v2-auth-file.mjs +99 -0
  118. package/bizar-dash/src/server/v2-event-bus.mjs +128 -0
  119. package/bizar-dash/src/server/watcher.mjs +81 -0
  120. package/bizar-dash/src/server/yaml.mjs +238 -0
  121. package/bizar-dash/src/web/App.tsx +718 -0
  122. package/bizar-dash/src/web/MobileApp.tsx +408 -0
  123. package/bizar-dash/src/web/components/ArtifactCreateDialog.tsx +95 -0
  124. package/bizar-dash/src/web/components/ArtifactListDialog.tsx +55 -0
  125. package/bizar-dash/src/web/components/ArtifactViewer.tsx +143 -0
  126. package/bizar-dash/src/web/components/AuditDialog.tsx +79 -0
  127. package/bizar-dash/src/web/components/BgStatusBadge.tsx +32 -0
  128. package/bizar-dash/src/web/components/Button.tsx +56 -0
  129. package/bizar-dash/src/web/components/CanvasContextMenu.tsx +68 -0
  130. package/bizar-dash/src/web/components/Card.tsx +40 -0
  131. package/bizar-dash/src/web/components/CollapsibleSection.tsx +72 -0
  132. package/bizar-dash/src/web/components/CommandDialog.tsx +66 -0
  133. package/bizar-dash/src/web/components/EmptyState.tsx +30 -0
  134. package/bizar-dash/src/web/components/FileBrowser.tsx +633 -0
  135. package/bizar-dash/src/web/components/HelpDialog.tsx +55 -0
  136. package/bizar-dash/src/web/components/KillConfirmDialog.tsx +88 -0
  137. package/bizar-dash/src/web/components/Modal.tsx +215 -0
  138. package/bizar-dash/src/web/components/Notifications.tsx +241 -0
  139. package/bizar-dash/src/web/components/SearchModal.tsx +224 -0
  140. package/bizar-dash/src/web/components/Sidebar.tsx +66 -0
  141. package/bizar-dash/src/web/components/Spinner.tsx +19 -0
  142. package/bizar-dash/src/web/components/StatusBadge.tsx +25 -0
  143. package/bizar-dash/src/web/components/Tag.tsx +28 -0
  144. package/bizar-dash/src/web/components/Toast.tsx +150 -0
  145. package/bizar-dash/src/web/components/Topbar.tsx +368 -0
  146. package/bizar-dash/src/web/components/VisualPlanDialog.tsx +58 -0
  147. package/bizar-dash/src/web/components/chat/AgentChip.tsx +68 -0
  148. package/bizar-dash/src/web/components/chat/ChatBubble.tsx +60 -0
  149. package/bizar-dash/src/web/components/chat/ChatThread.tsx +88 -0
  150. package/bizar-dash/src/web/components/chat/ChatTopBar.tsx +50 -0
  151. package/bizar-dash/src/web/components/chat/Composer.tsx +164 -0
  152. package/bizar-dash/src/web/components/chat/ConfirmModal.tsx +54 -0
  153. package/bizar-dash/src/web/components/chat/EmptyState.tsx +21 -0
  154. package/bizar-dash/src/web/components/chat/FirstRunGreeting.tsx +18 -0
  155. package/bizar-dash/src/web/components/chat/FloatingComposer.tsx +32 -0
  156. package/bizar-dash/src/web/components/chat/InfoPanel.tsx +119 -0
  157. package/bizar-dash/src/web/components/chat/LoadingSkeleton.tsx +19 -0
  158. package/bizar-dash/src/web/components/chat/MessageBubble.tsx +60 -0
  159. package/bizar-dash/src/web/components/chat/SessionList.tsx +153 -0
  160. package/bizar-dash/src/web/components/chat/StreamingIndicator.tsx +9 -0
  161. package/bizar-dash/src/web/components/chat/SuggestionCards.tsx +55 -0
  162. package/bizar-dash/src/web/components/chat/WelcomeScreen.tsx +36 -0
  163. package/bizar-dash/src/web/components/chat/index.ts +20 -0
  164. package/bizar-dash/src/web/components/chat/useAutoGrowTextarea.ts +18 -0
  165. package/bizar-dash/src/web/components/chat/useChat.ts +219 -0
  166. package/bizar-dash/src/web/components/chat/useSlashCommands.ts +47 -0
  167. package/bizar-dash/src/web/index.html +37 -0
  168. package/bizar-dash/src/web/lib/api.ts +193 -0
  169. package/bizar-dash/src/web/lib/markdown.tsx +59 -0
  170. package/bizar-dash/src/web/lib/types.ts +668 -0
  171. package/bizar-dash/src/web/lib/utils.ts +114 -0
  172. package/bizar-dash/src/web/lib/ws.ts +176 -0
  173. package/bizar-dash/src/web/main.tsx +34 -0
  174. package/bizar-dash/src/web/mobile/MobileApp.tsx +278 -0
  175. package/bizar-dash/src/web/mobile/MobileBottomNav.tsx +38 -0
  176. package/bizar-dash/src/web/mobile/MobileTopbar.tsx +115 -0
  177. package/bizar-dash/src/web/mobile/components/MobileBottomSheet.tsx +182 -0
  178. package/bizar-dash/src/web/mobile/components/MobileListItem.tsx +64 -0
  179. package/bizar-dash/src/web/mobile/components/MobileModal.tsx +123 -0
  180. package/bizar-dash/src/web/mobile/views/MobileActivity.tsx +273 -0
  181. package/bizar-dash/src/web/mobile/views/MobileAgents.tsx +374 -0
  182. package/bizar-dash/src/web/mobile/views/MobileArtifactCanvas.tsx +439 -0
  183. package/bizar-dash/src/web/mobile/views/MobileArtifacts.tsx +143 -0
  184. package/bizar-dash/src/web/mobile/views/MobileChat.tsx +180 -0
  185. package/bizar-dash/src/web/mobile/views/MobileConfig.tsx +175 -0
  186. package/bizar-dash/src/web/mobile/views/MobileHistory.tsx +191 -0
  187. package/bizar-dash/src/web/mobile/views/MobileMods.tsx +149 -0
  188. package/bizar-dash/src/web/mobile/views/MobileMore.tsx +121 -0
  189. package/bizar-dash/src/web/mobile/views/MobileNotifications.tsx +137 -0
  190. package/bizar-dash/src/web/mobile/views/MobilePlans.tsx +26 -0
  191. package/bizar-dash/src/web/mobile/views/MobileSchedules.tsx +685 -0
  192. package/bizar-dash/src/web/mobile/views/MobileSearchModal.tsx +172 -0
  193. package/bizar-dash/src/web/mobile/views/MobileSettings.tsx +388 -0
  194. package/bizar-dash/src/web/mobile/views/MobileSkills.tsx +153 -0
  195. package/bizar-dash/src/web/mobile/views/MobileTasks.tsx +564 -0
  196. package/bizar-dash/src/web/mobile.html +20 -0
  197. package/bizar-dash/src/web/mobile.tsx +13 -0
  198. package/bizar-dash/src/web/styles/chat.css +198 -0
  199. package/bizar-dash/src/web/styles/glyphs.css +960 -0
  200. package/bizar-dash/src/web/styles/main.css +8855 -0
  201. package/bizar-dash/src/web/styles/mobile-chat.css +5 -0
  202. package/bizar-dash/src/web/styles/mobile.css +1960 -0
  203. package/bizar-dash/src/web/views/Activity.tsx +1203 -0
  204. package/bizar-dash/src/web/views/Agents.tsx +701 -0
  205. package/bizar-dash/src/web/views/Artifacts.tsx +1480 -0
  206. package/bizar-dash/src/web/views/BackgroundAgents.tsx +450 -0
  207. package/bizar-dash/src/web/views/Chat.tsx +190 -0
  208. package/bizar-dash/src/web/views/Config.tsx +2063 -0
  209. package/bizar-dash/src/web/views/History.tsx +335 -0
  210. package/bizar-dash/src/web/views/ModView.tsx +207 -0
  211. package/bizar-dash/src/web/views/Mods.tsx +693 -0
  212. package/bizar-dash/src/web/views/Overview.tsx +812 -0
  213. package/bizar-dash/src/web/views/Providers.tsx +302 -0
  214. package/bizar-dash/src/web/views/Schedules.tsx +802 -0
  215. package/bizar-dash/src/web/views/Settings.tsx +1787 -0
  216. package/bizar-dash/src/web/views/Skills.tsx +431 -0
  217. package/bizar-dash/src/web/views/Tasks.tsx +1523 -0
  218. package/bizar-dash/src/web/views/glyphs/GlyphRenderer.tsx +613 -0
  219. package/bizar-dash/src/web/views/glyphs/components.tsx +1098 -0
  220. package/bizar-dash/templates/mod/FORMAT.md +76 -0
  221. package/bizar-dash/templates/mod/hello-mod/README.md +19 -0
  222. package/bizar-dash/templates/mod/hello-mod/agents/greeter.md +8 -0
  223. package/bizar-dash/templates/mod/hello-mod/commands/hello.md +6 -0
  224. package/bizar-dash/templates/mod/hello-mod/mod.json +20 -0
  225. package/bizar-dash/templates/mod/hello-mod/routes/ping.mjs +9 -0
  226. package/bizar-dash/templates/mod/hello-mod/views/HelloView.tsx +10 -0
  227. package/bizar-dash/tests/dashboard-ports.test.mjs +138 -0
  228. package/bizar-dash/tests/graphify-mod-spawn.node.test.mjs +90 -0
  229. package/bizar-dash/tests/memory-cli.test.mjs +542 -0
  230. package/bizar-dash/tests/memory-config.test.mjs +422 -0
  231. package/bizar-dash/tests/memory-git.test.mjs +246 -0
  232. package/bizar-dash/tests/memory-lightrag.test.mjs +153 -0
  233. package/bizar-dash/tests/memory-protocol-drift.test.mjs +45 -0
  234. package/bizar-dash/tests/memory-schema.test.mjs +198 -0
  235. package/bizar-dash/tests/memory-secrets.test.mjs +121 -0
  236. package/bizar-dash/tests/memory-store.test.mjs +390 -0
  237. package/bizar-dash/tests/memory-sync.test.mjs +141 -0
  238. package/bizar-dash/tests/mod-instructions.node.test.mjs +188 -0
  239. package/bizar-dash/tests/mod-security.test.mjs +273 -0
  240. package/bizar-dash/tests/mod-upgrade.node.test.mjs +357 -0
  241. package/bizar-dash/tests/no-agent-browser.node.test.mjs +98 -0
  242. package/bizar-dash/tests/obsidian-back-compat.test.mjs +199 -0
  243. package/bizar-dash/tests/opencode-runner.test.mjs +172 -0
  244. package/bizar-dash/tests/path-safe.test.mjs +108 -0
  245. package/bizar-dash/tests/providers-store-backup-keys.node.test.mjs +333 -0
  246. package/bizar-dash/tests/smoke-v2.mjs +212 -0
  247. package/bizar-dash/tests/strip-thinking.test.mjs +175 -0
  248. package/bizar-dash/tests/submit-feedback.test.mjs +353 -0
  249. package/bizar-dash/tests/tmux-wrap.test.mjs +145 -0
  250. package/bizar-dash/tests/yaml.test.mjs +128 -0
  251. package/bizar-dash/tsconfig.json +23 -0
  252. package/bizar-dash/vite.config.ts +27 -0
  253. package/cli/atomic.mjs +73 -0
  254. package/cli/banner.mjs +1 -1
  255. package/cli/bin.mjs +44 -47
  256. package/cli/bootstrap.mjs +1 -1
  257. package/cli/copy.mjs +25 -16
  258. package/cli/dev-link.mjs +17 -1
  259. package/cli/doctor.mjs +4 -4
  260. package/cli/doctor.test.mjs +2 -2
  261. package/cli/init.mjs +135 -1
  262. package/cli/install.mjs +31 -39
  263. package/cli/memory-constants.mjs +59 -0
  264. package/cli/memory.mjs +1436 -0
  265. package/cli/service.mjs +5 -6
  266. package/cli/utils.mjs +6 -3
  267. package/config/AGENTS.md +7 -7
  268. package/config/agents/_shared/AGENT_BASELINE.md +59 -61
  269. package/config/opencode.json +13 -38
  270. package/config/skills/memory-protocol/SKILL.md +105 -0
  271. package/config/skills/obsidian/SKILL.md +270 -65
  272. package/install.sh +59 -19
  273. package/package.json +49 -14
  274. package/packages/sdk/LICENSE +21 -0
  275. package/packages/sdk/README.md +80 -0
  276. package/packages/sdk/src/client.ts +183 -0
  277. package/packages/sdk/src/errors.ts +120 -0
  278. package/packages/sdk/src/events.ts +153 -0
  279. package/packages/sdk/src/index.ts +63 -0
  280. package/packages/sdk/src/types.ts +176 -0
  281. package/packages/sdk/src/version.ts +4 -0
  282. package/packages/sdk/tests/client.test.ts +217 -0
  283. package/packages/sdk/tests/errors.test.ts +108 -0
  284. package/packages/sdk/tests/events.test.ts +139 -0
  285. package/packages/sdk/tests/fixtures/fetch-mock.ts +152 -0
  286. package/packages/sdk/tests/fixtures/sse-mock.ts +30 -0
  287. package/packages/sdk/tsconfig.json +25 -0
  288. package/packages/sdk/vitest.config.ts +9 -0
  289. package/plugins/bizar/LICENSE +21 -0
  290. package/plugins/bizar/README.md +448 -0
  291. package/plugins/bizar/dist/index.js +29901 -0
  292. package/plugins/bizar/index.ts +1491 -0
  293. package/plugins/bizar/scripts/check-forbidden-imports.sh +33 -0
  294. package/plugins/bizar/src/background-state.ts +551 -0
  295. package/plugins/bizar/src/background.ts +1250 -0
  296. package/plugins/bizar/src/commands-impl.ts +464 -0
  297. package/plugins/bizar/src/commands.ts +1168 -0
  298. package/plugins/bizar/src/dashboard-client.ts +233 -0
  299. package/plugins/bizar/src/event-stream.ts +606 -0
  300. package/plugins/bizar/src/fingerprint.ts +120 -0
  301. package/plugins/bizar/src/handoff.ts +79 -0
  302. package/plugins/bizar/src/http-client.ts +467 -0
  303. package/plugins/bizar/src/key-rotation.ts +218 -0
  304. package/plugins/bizar/src/logger.ts +144 -0
  305. package/plugins/bizar/src/loop.ts +176 -0
  306. package/plugins/bizar/src/opencode-runner.ts +390 -0
  307. package/plugins/bizar/src/options.ts +421 -0
  308. package/plugins/bizar/src/plan-fs.ts +323 -0
  309. package/plugins/bizar/src/reasoning-clean.ts +454 -0
  310. package/plugins/bizar/src/report.ts +178 -0
  311. package/plugins/bizar/src/research-prompt.ts +35 -0
  312. package/plugins/bizar/src/serve-info.ts +228 -0
  313. package/plugins/bizar/src/serve.ts +496 -0
  314. package/plugins/bizar/src/settings.ts +349 -0
  315. package/plugins/bizar/src/state.ts +298 -0
  316. package/plugins/bizar/src/tools/bg-collect.ts +104 -0
  317. package/plugins/bizar/src/tools/bg-get-comments.ts +239 -0
  318. package/plugins/bizar/src/tools/bg-kill.ts +87 -0
  319. package/plugins/bizar/src/tools/bg-spawn.ts +401 -0
  320. package/plugins/bizar/src/tools/bg-status.ts +99 -0
  321. package/plugins/bizar/src/tools/open-kb.ts +191 -0
  322. package/plugins/bizar/src/tools/plan-action.ts +767 -0
  323. package/plugins/bizar/src/tools/read-glyph-feedback.ts +170 -0
  324. package/plugins/bizar/src/tools/wait-for-feedback.ts +402 -0
  325. package/plugins/bizar/tests/attach-handler-bug.test.ts +169 -0
  326. package/plugins/bizar/tests/background-state.test.ts +277 -0
  327. package/plugins/bizar/tests/background.test.ts +402 -0
  328. package/plugins/bizar/tests/block.test.ts +195 -0
  329. package/plugins/bizar/tests/canonical-key-order.test.ts +75 -0
  330. package/plugins/bizar/tests/commands-impl.test.ts +442 -0
  331. package/plugins/bizar/tests/commands.test.ts +584 -0
  332. package/plugins/bizar/tests/config.test.ts +122 -0
  333. package/plugins/bizar/tests/dashboard-client.test.ts +159 -0
  334. package/plugins/bizar/tests/dispose.test.ts +336 -0
  335. package/plugins/bizar/tests/event-stream.test.ts +409 -0
  336. package/plugins/bizar/tests/event.test.ts +262 -0
  337. package/plugins/bizar/tests/fingerprint.test.ts +162 -0
  338. package/plugins/bizar/tests/http-client.test.ts +404 -0
  339. package/plugins/bizar/tests/init-helpers.test.ts +203 -0
  340. package/plugins/bizar/tests/integration/slash-command.test.ts +348 -0
  341. package/plugins/bizar/tests/integration/tool-routing.test.ts +314 -0
  342. package/plugins/bizar/tests/key-rotation.test.ts +396 -0
  343. package/plugins/bizar/tests/loop.test.ts +397 -0
  344. package/plugins/bizar/tests/options.test.ts +276 -0
  345. package/plugins/bizar/tests/reasoning-clean.test.ts +422 -0
  346. package/plugins/bizar/tests/serve.test.ts +339 -0
  347. package/plugins/bizar/tests/settings.test.ts +351 -0
  348. package/plugins/bizar/tests/stall-think.test.ts +750 -0
  349. package/plugins/bizar/tests/state.test.ts +276 -0
  350. package/plugins/bizar/tests/tools/bg-collect.test.ts +337 -0
  351. package/plugins/bizar/tests/tools/bg-get-comments.test.ts +485 -0
  352. package/plugins/bizar/tests/tools/bg-kill.test.ts +235 -0
  353. package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +147 -0
  354. package/plugins/bizar/tests/tools/bg-spawn.test.ts +311 -0
  355. package/plugins/bizar/tests/tools/bg-status.test.ts +217 -0
  356. package/plugins/bizar/tests/tools/opencode-runner.test.ts +115 -0
  357. package/plugins/bizar/tests/tools/plan-action.test.ts +599 -0
  358. package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +253 -0
  359. package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +390 -0
  360. package/plugins/bizar/tests/update-deadlock.test.ts +145 -0
  361. package/plugins/bizar/tsconfig.json +29 -0
@@ -0,0 +1,76 @@
1
+ # Bizar Mods — Format Reference (v3.0.0)
2
+
3
+ A mod is a folder with a `mod.json` manifest that extends the Bizar
4
+ platform. Mods live at `~/.config/bizar/mods/<mod-id>/`.
5
+
6
+ ## Folder layout
7
+
8
+ ```
9
+ <mod-id>/
10
+ ├── mod.json # manifest (required)
11
+ ├── README.md # description (optional)
12
+ ├── agents/ # custom agents (optional)
13
+ │ └── <agent>.md
14
+ ├── commands/ # custom commands (optional)
15
+ │ └── <command>.md
16
+ ├── routes/ # custom API routes (optional)
17
+ │ └── <route>.mjs
18
+ ├── views/ # custom React views (optional)
19
+ │ └── <view>.tsx
20
+ ├── web/ # custom web assets (optional)
21
+ │ └── index.html
22
+ ├── tui/ # custom TUI components (optional)
23
+ │ └── <comp>.mjs
24
+ └── hooks/ # custom event hooks (optional)
25
+ └── <hook>.mjs
26
+ ```
27
+
28
+ ## mod.json schema
29
+
30
+ ```json
31
+ {
32
+ "id": "my-mod",
33
+ "name": "My Mod",
34
+ "version": "1.0.0",
35
+ "author": "name",
36
+ "description": "...",
37
+ "bizar": ">=3.0.0",
38
+ "type": "agent" | "command" | "view" | "route" | "tui" | "full",
39
+ "enabled": true,
40
+ "permissions": ["read:agents", "write:tasks"],
41
+ "entry": {
42
+ "agent": "agents/my-agent.md",
43
+ "command": "commands/my-command.md",
44
+ "route": "routes/my-route.mjs",
45
+ "view": "views/my-view.tsx",
46
+ "tui": "tui/my-comp.mjs"
47
+ }
48
+ }
49
+ ```
50
+
51
+ ## Permissions (v3.0.0)
52
+
53
+ `permissions` is a hint to the user. v3 doesn't enforce it yet — the
54
+ runtime is permissive. Future versions will gate operations by
55
+ permission.
56
+
57
+ Common permission strings:
58
+ - `read:agents`
59
+ - `write:agents`
60
+ - `read:tasks`
61
+ - `write:tasks`
62
+ - `read:projects`
63
+ - `write:projects`
64
+ - `read:schedules`
65
+ - `write:schedules`
66
+ - `read:config`
67
+ - `write:config`
68
+
69
+ ## Lifecycle
70
+
71
+ - The dashboard scans `~/.config/bizar/mods/` on startup.
72
+ - For each mod with `enabled: true`, the loader exposes its agents,
73
+ commands, and views in the dashboard.
74
+ - v3 doesn't dynamically mount mod routes or render mod views — those
75
+ are planned for v3.1+. Mods that ship today can still install custom
76
+ agents and commands.
@@ -0,0 +1,19 @@
1
+ # Hello Mod
2
+
3
+ A sample mod that ships with the Bizar platform. It demonstrates:
4
+
5
+ - A `mod.json` manifest with permissions and an `entry` block
6
+ - A sample agent (`agents/greeter.md`)
7
+ - A slash command (`commands/hello.md`)
8
+ - A route module (`routes/ping.mjs`) — the v3.1+ runtime will mount it
9
+ - A view metadata file (`views/HelloView.tsx`) — the v3.1+ dashboard
10
+ will render it as a tab
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ # from the bizarre-dash package root
16
+ bizar mod install ./templates/mod/hello-mod
17
+ ```
18
+
19
+ Or copy the folder into `~/.config/bizar/mods/hello-mod/` by hand.
@@ -0,0 +1,8 @@
1
+ ---
2
+ description: Greets the user with a friendly hello.
3
+ mode: subagent
4
+ model: anthropic/claude-3-5-sonnet
5
+ ---
6
+
7
+ You are a friendly greeter. When invoked, respond with a warm hello and
8
+ ask the user how you can help. Keep it short and friendly.
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Say hello from the Hello Mod
3
+ ---
4
+
5
+ Greet the user. Print a friendly hello and remind them that the
6
+ Hello Mod is loaded.
@@ -0,0 +1,20 @@
1
+ {
2
+ "id": "hello-mod",
3
+ "name": "Hello Mod",
4
+ "version": "1.0.0",
5
+ "author": "Bizar",
6
+ "description": "A sample mod that adds a /hello slash command, a Hello view tab, and a sample agent.",
7
+ "bizar": ">=3.0.0",
8
+ "type": "full",
9
+ "enabled": true,
10
+ "permissions": [
11
+ "read:agents",
12
+ "read:commands"
13
+ ],
14
+ "entry": {
15
+ "agent": "agents/greeter.md",
16
+ "command": "commands/hello.md",
17
+ "view": "views/HelloView.tsx"
18
+ },
19
+ "installedAt": null
20
+ }
@@ -0,0 +1,9 @@
1
+ // Sample route registration for the Hello Mod.
2
+ // v3 doesn't dynamically mount mod routes yet, but this file documents
3
+ // the intended shape for v3.1+.
4
+
5
+ export default function register({ app, state }) {
6
+ app.get('/api/mods/hello-mod/ping', (req, res) => {
7
+ res.json({ ok: true, from: 'hello-mod', ts: Date.now() });
8
+ });
9
+ }
@@ -0,0 +1,10 @@
1
+ // Sample view metadata for the Hello Mod.
2
+ // v3 doesn't dynamically mount mod views yet, but this file documents
3
+ // the intended shape for v3.1+.
4
+
5
+ export default {
6
+ id: 'hello',
7
+ label: 'Hello',
8
+ icon: 'Sparkles',
9
+ component: 'HelloView',
10
+ };
@@ -0,0 +1,138 @@
1
+ /**
2
+ * bizar-dash/tests/dashboard-ports.test.mjs
3
+ *
4
+ * Regression tests for the "stale PID file → false positive
5
+ * `Another Bizar dashboard is already running`" trap.
6
+ *
7
+ * History (v3.20.14):
8
+ * - The dashboard lifecycle used to:
9
+ * 1. Scan `ps` for any process whose argv contained "bizar dash"
10
+ * or "@polderlabs/bizar-dash/src/cli.mjs".
11
+ * 2. Trust that ps-scan result + `process.kill(pid, 0)` returned
12
+ * true to mean "this is a dashboard".
13
+ * 3. Refuse to start, refuse to cleanup, refuse to stop.
14
+ * - On a busy machine, Linux recycles PIDs in milliseconds. A
15
+ * chrome-headless-shell renderer that happened to land on the
16
+ * recycled PID number would match the regex AND pass kill(0),
17
+ * and the dashboard would refuse to start forever.
18
+ * - The cmdline was stale, but `ps` re-reads /proc each call so
19
+ * we never noticed.
20
+ *
21
+ * Fix: `cmdlineLooksLikeDashboard(cmdline)` rejects anything that
22
+ * doesn't structurally look like a Bizar dashboard launch. Re-applied
23
+ * at probe time via `verifyCmdlineAtProbeTime(pid)` to catch the
24
+ * recycled-PID race.
25
+ */
26
+
27
+ import { test } from 'node:test';
28
+ import assert from 'node:assert/strict';
29
+ import {
30
+ cmdlineLooksLikeDashboard,
31
+ verifyCmdlineAtProbeTime,
32
+ } from '../src/cli/dashboard-ports.mjs';
33
+
34
+ // ── cmdlineLooksLikeDashboard ─────────────────────────────────────────
35
+
36
+ test('cmdlineLooksLikeDashboard: accepts node + cli.mjs direct invocation', () => {
37
+ assert.equal(
38
+ cmdlineLooksLikeDashboard('node /usr/local/lib/node_modules/@polderlabs/bizar-dash/src/cli.mjs start'),
39
+ true,
40
+ );
41
+ assert.equal(
42
+ cmdlineLooksLikeDashboard('node /home/me/.local/share/npm/_npx/hash/node_modules/@polderlabs/bizar-dash/src/cli.mjs start --bg --port=4321'),
43
+ true,
44
+ );
45
+ });
46
+
47
+ test('cmdlineLooksLikeDashboard: accepts bizar-bin invocation', () => {
48
+ assert.equal(
49
+ cmdlineLooksLikeDashboard('/usr/local/bin/bizar dash start'),
50
+ true,
51
+ );
52
+ assert.equal(
53
+ cmdlineLooksLikeDashboard('/home/me/.local/npm/bin/bizar dash start --bg --port=4322'),
54
+ true,
55
+ );
56
+ assert.equal(
57
+ cmdlineLooksLikeDashboard('node /usr/local/bin/bizar dash tui'),
58
+ true,
59
+ );
60
+ });
61
+
62
+ test('cmdlineLooksLikeDashboard: rejects chrome-headless-shell renderer (recycled PID)', () => {
63
+ // This is what a recycled PID looks like: chrome-headless-shell
64
+ // happened to land on PID 938619, and its cmdline contains the
65
+ // substring "bizar" nowhere — so it should NOT be flagged as a
66
+ // dashboard.
67
+ assert.equal(
68
+ cmdlineLooksLikeDashboard('/home/me/.cache/puppeteer/chrome-headless-shell-linux64/chrome-headless-shell --type=renderer --headless=old --no-sandbox'),
69
+ false,
70
+ );
71
+ });
72
+
73
+ test('cmdlineLooksLikeDashboard: rejects stale shell command containing the words "bizar dash"', () => {
74
+ // A bash command whose body mentions `bizar dash` in a comment
75
+ // would match the old loose regex. The structural check rejects it
76
+ // because there's no `bizar` bin followed by `dash <subcommand>`.
77
+ assert.equal(
78
+ cmdlineLooksLikeDashboard('bash -c "echo I want to run bizar dash start"'),
79
+ false,
80
+ );
81
+ assert.equal(
82
+ cmdlineLooksLikeDashboard('man bizar-dash-config'),
83
+ false,
84
+ );
85
+ });
86
+
87
+ test('cmdlineLooksLikeDashboard: rejects ssh / tailscale sessions with "bizar" in env', () => {
88
+ // An ssh session whose env has "bizar" in some variable but whose
89
+ // argv doesn't actually invoke the dashboard CLI.
90
+ assert.equal(
91
+ cmdlineLooksLikeDashboard('/usr/sbin/tailscaled be-child ssh --login-shell=/usr/bin/fish'),
92
+ false,
93
+ );
94
+ });
95
+
96
+ test('cmdlineLooksLikeDashboard: rejects empty / null input', () => {
97
+ assert.equal(cmdlineLooksLikeDashboard(''), false);
98
+ assert.equal(cmdlineLooksLikeDashboard(null), false);
99
+ assert.equal(cmdlineLooksLikeDashboard(undefined), false);
100
+ assert.equal(cmdlineLooksLikeDashboard(42), false);
101
+ });
102
+
103
+ // ── verifyCmdlineAtProbeTime ───────────────────────────────────────────
104
+
105
+ test('verifyCmdlineAtProbeTime: dead PID returns null', () => {
106
+ // Use a PID that's almost certainly dead.
107
+ const result = verifyCmdlineAtProbeTime(999999999);
108
+ assert.equal(result, null);
109
+ });
110
+
111
+ test('verifyCmdlineAtProbeTime: current PID with non-dashboard cmdline returns null', () => {
112
+ // The test runner itself is a node process but its cmdline won't
113
+ // look like a Bizar dashboard launch.
114
+ const result = verifyCmdlineAtProbeTime(process.pid);
115
+ assert.equal(result, null);
116
+ });
117
+
118
+ test('verifyCmdlineAtProbeTime: missing PID returns null', () => {
119
+ assert.equal(verifyCmdlineAtProbeTime(null), null);
120
+ assert.equal(verifyCmdlineAtProbeTime(0), null);
121
+ assert.equal(verifyCmdlineAtProbeTime(undefined), null);
122
+ });
123
+
124
+ // ── Real-world cmdline strings that have caused false positives ───────
125
+
126
+ test('cmdlineLooksLikeDashboard: rejects the v3.20.13 false-positive case', () => {
127
+ // The exact scenario from the v3.20.13 bug report: ps-scan found
128
+ // PID 938619 with cmdline "node /home/drb0rk/.local/npm/bin/bizar
129
+ // dash start --bg --port=4322" — except PID 938619 was recycled
130
+ // to a chrome renderer between ps-scan and pidAlive. The structural
131
+ // check on the current /proc/<pid>/cmdline returns null, so the
132
+ // dashboard is correctly classified as dead.
133
+ //
134
+ // We simulate this by checking that chrome's cmdline (what the
135
+ // recycled PID actually contains now) doesn't match.
136
+ const chromeCmdline = '/home/drb0rk/.cache/puppeteer/chrome-headless-shell-linux64/chrome-headless-shell --type=renderer --headless=old --no-sandbox --remote-debugging-port=9222';
137
+ assert.equal(cmdlineLooksLikeDashboard(chromeCmdline), false);
138
+ });
@@ -0,0 +1,90 @@
1
+ /**
2
+ * graphify-mod-spawn.node.test.mjs — regression test for the SIGPIPE crash.
3
+ *
4
+ * The graphify mod's route.mjs used to spawn the `graphify` CLI with
5
+ * `spawnSync` + `stdio: 'inherit'`. That worked in a terminal, but the
6
+ * dashboard is a background daemon with stdin=/dev/null and
7
+ * stdout/stderr redirected to a log file. With `stdio: 'inherit'`, the
8
+ * child inherits those descriptors; if anything closes or rotates them
9
+ * mid-build, the kernel delivers SIGPIPE to the dashboard — silently
10
+ * killing it. The user reported "building the graph crashed the dash".
11
+ *
12
+ * This test verifies the source file no longer contains the dangerous
13
+ * pattern. We parse the file as text (the route.mjs is loaded by the
14
+ * dashboard's vm sandbox, not directly importable here).
15
+ *
16
+ * Run with: node --test tests/graphify-mod-spawn.node.test.mjs
17
+ */
18
+ import { describe, it } from 'node:test';
19
+ import assert from 'node:assert/strict';
20
+ import { readFileSync } from 'node:fs';
21
+ import { join, resolve } from 'node:path';
22
+
23
+ // Test lives at bizar-dash/tests/, source is at the repo root.
24
+ const REPO = resolve(import.meta.dirname, '..', '..');
25
+ const SOURCE = join(REPO, 'mods-examples/graphify/route.mjs');
26
+
27
+ describe('graphify mod — SIGPIPE-safe spawn', () => {
28
+ it('source file exists at the expected path', () => {
29
+ const text = readFileSync(SOURCE, 'utf8');
30
+ assert.ok(text.length > 100, 'source file should be substantial');
31
+ });
32
+
33
+ it('does NOT import spawnSync (causes blocking + stdio inheritance)', () => {
34
+ const text = readFileSync(SOURCE, 'utf8');
35
+ assert.ok(
36
+ !/\bspawnSync\b/.test(text),
37
+ 'route.mjs must not import or call spawnSync — use async spawn instead',
38
+ );
39
+ });
40
+
41
+ it('does NOT use stdio: \'inherit\' (the SIGPIPE crash vector)', () => {
42
+ const text = readFileSync(SOURCE, 'utf8');
43
+ // Strip block comments and line comments before checking — we don't
44
+ // want the bug description itself to trip the test.
45
+ const stripped = text
46
+ .replace(/\/\*[\s\S]*?\*\//g, '')
47
+ .replace(/^\s*\/\/.*$/gm, '')
48
+ .replace(/`stdio:\s*'inherit'`/g, '');
49
+ // Look for the literal string in any quoting style.
50
+ const patterns = [
51
+ /stdio:\s*['"]inherit['"]/,
52
+ /stdio:\s*\[\s*['"]inherit['"]/,
53
+ ];
54
+ for (const pat of patterns) {
55
+ assert.ok(
56
+ !pat.test(stripped),
57
+ `route.mjs must not use stdio: 'inherit' — it propagates SIGPIPE to the dashboard`,
58
+ );
59
+ }
60
+ });
61
+
62
+ it('isolates the spawned child stdio with [\'ignore\', \'pipe\', \'pipe\']', () => {
63
+ const text = readFileSync(SOURCE, 'utf8');
64
+ assert.ok(
65
+ /stdio:\s*\[\s*['"]ignore['"]\s*,\s*['"]pipe['"]\s*,\s*['"]pipe['"]\s*\]/.test(text),
66
+ 'spawn options should set stdio to [ignore, pipe, pipe] for SIGPIPE isolation',
67
+ );
68
+ });
69
+
70
+ it('runs graphify as an async spawn (not blocking)', () => {
71
+ const text = readFileSync(SOURCE, 'utf8');
72
+ // runGraphify should be declared `async function` and return a Promise.
73
+ assert.ok(
74
+ /async\s+function\s+runGraphify\s*\(/.test(text),
75
+ 'runGraphify should be declared async so the dashboard event loop is not blocked',
76
+ );
77
+ assert.ok(
78
+ /return\s+new\s+Promise\s*\(/.test(text),
79
+ 'runGraphify should return a Promise (async spawn lifecycle)',
80
+ );
81
+ });
82
+
83
+ it('forwards child stdout/stderr to the broadcast callback (no streaming lost)', () => {
84
+ const text = readFileSync(SOURCE, 'utf8');
85
+ assert.ok(
86
+ /broadcast\(\s*\{\s*type:\s*['"]graphify:build:log['"]/.test(text),
87
+ 'runGraphify should call broadcast with graphify:build:log events so the dashboard UI keeps streaming',
88
+ );
89
+ });
90
+ });