@polderlabs/bizar 6.2.5 → 6.3.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 (329) 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/settings.json +116 -0
  41. package/.claude/skills/9router/SKILL.md +80 -0
  42. package/.claude/skills/9router-chat/SKILL.md +73 -0
  43. package/.claude/skills/9router-embeddings/SKILL.md +69 -0
  44. package/.claude/skills/9router-image/SKILL.md +86 -0
  45. package/.claude/skills/9router-stt/SKILL.md +79 -0
  46. package/.claude/skills/9router-tts/SKILL.md +80 -0
  47. package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
  48. package/.claude/skills/9router-web-search/SKILL.md +91 -0
  49. package/.claude/skills/bizar/README.md +9 -0
  50. package/.claude/skills/bizar/SKILL.md +450 -0
  51. package/.claude/skills/cpp-coding-standards/README.md +28 -0
  52. package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
  53. package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
  54. package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
  55. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
  56. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
  57. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
  58. package/.claude/skills/cpp-testing/README.md +28 -0
  59. package/.claude/skills/cpp-testing/SKILL.md +304 -0
  60. package/.claude/skills/cpp-testing/references/coverage.md +370 -0
  61. package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
  62. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
  63. package/.claude/skills/cpp-testing/references/mocking.md +364 -0
  64. package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
  65. package/.claude/skills/cubesandbox/SKILL.md +148 -0
  66. package/.claude/skills/embedded-esp-idf/README.md +41 -0
  67. package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
  68. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
  69. package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
  70. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
  71. package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
  72. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
  73. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
  74. package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
  75. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
  76. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
  77. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
  78. package/.claude/skills/glyph/SKILL.md +163 -0
  79. package/.claude/skills/harness-engineering/SKILL.md +143 -0
  80. package/.claude/skills/lightrag/SKILL.md +81 -0
  81. package/.claude/skills/memory-protocol/SKILL.md +105 -0
  82. package/.claude/skills/obsidian/SKILL.md +306 -0
  83. package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
  84. package/.claude/skills/self-improvement/SKILL.md +64 -0
  85. package/README.md +87 -59
  86. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js → EnvVarsSection-B58aiJiE.js} +1 -1
  87. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js.map → EnvVarsSection-B58aiJiE.js.map} +1 -1
  88. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js → MobileChat-BJrqwVDd.js} +1 -1
  89. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js.map → MobileChat-BJrqwVDd.js.map} +1 -1
  90. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js → MobileSettings-CEQNJNLJ.js} +1 -1
  91. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js.map → MobileSettings-CEQNJNLJ.js.map} +1 -1
  92. package/bizar-dash/dist/assets/{main-DYiZqMrn.js → main-IvfQAOfy.js} +1 -1
  93. package/bizar-dash/dist/assets/{main-DYiZqMrn.js.map → main-IvfQAOfy.js.map} +1 -1
  94. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js → markdown-tOLaD6nm.js} +1 -1
  95. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js.map → markdown-tOLaD6nm.js.map} +1 -1
  96. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js → mobile-DYCHcUpq.js} +1 -1
  97. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js.map → mobile-DYCHcUpq.js.map} +1 -1
  98. package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js → mobile-layout-CBHjpwsb.js} +2 -2
  99. package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js.map → mobile-layout-CBHjpwsb.js.map} +1 -1
  100. package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js → useSlashCommands-Bd7_FA6U.js} +2 -2
  101. package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js.map → useSlashCommands-Bd7_FA6U.js.map} +1 -1
  102. package/bizar-dash/dist/assets/{vendor-CeHGtduv.js → vendor-C843201K.js} +12 -12
  103. package/bizar-dash/dist/assets/vendor-C843201K.js.map +1 -0
  104. package/bizar-dash/dist/index.html +6 -6
  105. package/bizar-dash/dist/mobile.html +2 -2
  106. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  107. package/bizar-dash/src/server/api.mjs +4 -4
  108. package/bizar-dash/src/server/background-store.mjs +15 -16
  109. package/bizar-dash/src/server/bg-poller.mjs +25 -35
  110. package/bizar-dash/src/server/bg-retry.mjs +66 -194
  111. package/bizar-dash/src/server/claude-bg-spawner.mjs +390 -0
  112. package/bizar-dash/src/server/claude-info.mjs +412 -0
  113. package/bizar-dash/src/server/{cline-runner.mjs → claude-runner.mjs} +53 -48
  114. package/bizar-dash/src/server/claude-sdk.mjs +191 -0
  115. package/bizar-dash/src/server/providers-store.mjs +22 -49
  116. package/bizar-dash/src/server/routes/background.mjs +24 -20
  117. package/bizar-dash/src/server/routes/chat.mjs +223 -326
  118. package/bizar-dash/src/server/routes/claude-session-detail.mjs +329 -0
  119. package/bizar-dash/src/server/routes/claude-sessions.mjs +259 -0
  120. package/bizar-dash/src/server/routes/tasks.mjs +20 -28
  121. package/bizar-dash/src/server/task-delegator.mjs +76 -77
  122. package/bizar-dash/src/web/components/chat/useChat.ts +23 -27
  123. package/bizar-dash/src/web/views/Chat.tsx +8 -8
  124. package/cli/bin.mjs +17 -18
  125. package/cli/commands/claude-cmd.mjs +348 -0
  126. package/cli/commands/install.mjs +12 -11
  127. package/cli/commands/validate.mjs +252 -325
  128. package/cli/dev-link.test.mjs +11 -11
  129. package/cli/doctor.mjs +131 -213
  130. package/cli/install.mjs +33 -37
  131. package/cli/install.test.mjs +9 -9
  132. package/cli/provision-claude.mjs +893 -0
  133. package/cli/provision.mjs +224 -227
  134. package/cli/utils.mjs +72 -58
  135. package/config/AGENTS.md +28 -28
  136. package/install.sh +66 -44
  137. package/package.json +19 -11
  138. package/packages/sdk/ARCHITECTURE.md +40 -36
  139. package/packages/sdk/package-lock.json +32 -0
  140. package/packages/sdk/package.json +15 -5
  141. package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
  142. package/packages/sdk/src/fingerprint.ts +0 -0
  143. package/packages/sdk/src/index.ts +38 -73
  144. package/packages/sdk/src/mcp/bin.ts +51 -0
  145. package/packages/sdk/src/mcp/server.ts +498 -0
  146. package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
  147. package/packages/sdk/tests/sdk.test.mjs +148 -0
  148. package/packages/sdk/vitest.config.ts +1 -1
  149. package/scripts/bh-full-e2e.mjs +166 -363
  150. package/scripts/check-deps.mjs +28 -46
  151. package/scripts/mirror-claude-md.sh +78 -0
  152. package/scripts/test-in-container.sh +31 -9
  153. package/templates/clean-state-checklist.md +3 -3
  154. package/templates/sprint-contract.md +2 -2
  155. package/bizar-dash/.bizar/activity.log +0 -3
  156. package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
  157. package/bizar-dash/.omx/state/session.json +0 -10
  158. package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
  159. package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
  160. package/bizar-dash/bizar-design/canvas.html +0 -281
  161. package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
  162. package/bizar-dash/bizar-design/components.css +0 -1665
  163. package/bizar-dash/bizar-design/components.html +0 -557
  164. package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
  165. package/bizar-dash/bizar-design/desktop/agents.html +0 -74
  166. package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
  167. package/bizar-dash/bizar-design/desktop/memory.html +0 -75
  168. package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
  169. package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
  170. package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
  171. package/bizar-dash/bizar-design/desktop/overview.html +0 -95
  172. package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
  173. package/bizar-dash/bizar-design/desktop/settings.html +0 -70
  174. package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
  175. package/bizar-dash/bizar-design/icons.svg +0 -44
  176. package/bizar-dash/bizar-design/index.html +0 -192
  177. package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
  178. package/bizar-dash/bizar-design/mobile/agents.html +0 -29
  179. package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
  180. package/bizar-dash/bizar-design/mobile/memory.html +0 -28
  181. package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
  182. package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
  183. package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
  184. package/bizar-dash/bizar-design/mobile/overview.html +0 -33
  185. package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
  186. package/bizar-dash/bizar-design/mobile/settings.html +0 -28
  187. package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
  188. package/bizar-dash/bizar-design/prototype.js +0 -114
  189. package/bizar-dash/bizar-design/tokens.css +0 -106
  190. package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
  191. package/bizar-dash/node_modules/.package-lock.json +0 -6
  192. package/bizar-dash/package-lock.json +0 -6
  193. package/bizar-dash/src/server/cline-sdk.mjs +0 -132
  194. package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
  195. package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
  196. package/cli/commands/cline-cmd.mjs +0 -289
  197. package/cli/commands/validate.test.mjs +0 -379
  198. package/cli/doctor.test.mjs +0 -350
  199. package/config/cline.json.template +0 -342
  200. package/packages/sdk/src/client.ts +0 -188
  201. package/packages/sdk/src/cline-events.ts +0 -134
  202. package/packages/sdk/src/cline-types.ts +0 -66
  203. package/packages/sdk/src/cline.ts +0 -339
  204. package/packages/sdk/src/errors.ts +0 -129
  205. package/packages/sdk/src/events.ts +0 -153
  206. package/packages/sdk/src/types.ts +0 -176
  207. package/packages/sdk/tests/client.test.ts +0 -217
  208. package/packages/sdk/tests/errors.test.ts +0 -108
  209. package/packages/sdk/tests/events.test.ts +0 -139
  210. package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
  211. package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
  212. package/plugins/bizar/ARCHITECTURE.md +0 -142
  213. package/plugins/bizar/CONSTRAINTS.md +0 -67
  214. package/plugins/bizar/LICENSE +0 -21
  215. package/plugins/bizar/README.md +0 -448
  216. package/plugins/bizar/index.ts +0 -925
  217. package/plugins/bizar/package.json +0 -39
  218. package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
  219. package/plugins/bizar/src/background-state.ts +0 -641
  220. package/plugins/bizar/src/background.ts +0 -1806
  221. package/plugins/bizar/src/cline-runner.ts +0 -203
  222. package/plugins/bizar/src/clineruntime.ts +0 -227
  223. package/plugins/bizar/src/commands-impl.ts +0 -151
  224. package/plugins/bizar/src/commands.ts +0 -1799
  225. package/plugins/bizar/src/compaction.d.mts +0 -48
  226. package/plugins/bizar/src/compaction.mjs +0 -192
  227. package/plugins/bizar/src/dashboard-client.ts +0 -233
  228. package/plugins/bizar/src/event-stream.ts +0 -606
  229. package/plugins/bizar/src/fingerprint.ts +0 -120
  230. package/plugins/bizar/src/handoff.ts +0 -79
  231. package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
  232. package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
  233. package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
  234. package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
  235. package/plugins/bizar/src/http-client.ts +0 -467
  236. package/plugins/bizar/src/key-rotation.ts +0 -218
  237. package/plugins/bizar/src/logger.ts +0 -144
  238. package/plugins/bizar/src/loop-engineering.ts +0 -241
  239. package/plugins/bizar/src/loop.ts +0 -176
  240. package/plugins/bizar/src/mistake-recovery.ts +0 -98
  241. package/plugins/bizar/src/odin.ts +0 -227
  242. package/plugins/bizar/src/options.ts +0 -470
  243. package/plugins/bizar/src/plan-fs.ts +0 -323
  244. package/plugins/bizar/src/reasoning-clean.ts +0 -454
  245. package/plugins/bizar/src/report.ts +0 -178
  246. package/plugins/bizar/src/research-prompt.ts +0 -35
  247. package/plugins/bizar/src/serve-info.ts +0 -228
  248. package/plugins/bizar/src/serve.ts +0 -496
  249. package/plugins/bizar/src/settings.ts +0 -349
  250. package/plugins/bizar/src/state.ts +0 -298
  251. package/plugins/bizar/src/tool-discipline.ts +0 -105
  252. package/plugins/bizar/src/tools/agent-browser.ts +0 -315
  253. package/plugins/bizar/src/tools/bg-collect.ts +0 -131
  254. package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
  255. package/plugins/bizar/src/tools/bg-kill.ts +0 -116
  256. package/plugins/bizar/src/tools/bg-pause.ts +0 -99
  257. package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
  258. package/plugins/bizar/src/tools/bg-resume.ts +0 -94
  259. package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
  260. package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
  261. package/plugins/bizar/src/tools/bg-status.ts +0 -130
  262. package/plugins/bizar/src/tools/graph-query.ts +0 -278
  263. package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
  264. package/plugins/bizar/src/tools/memory-list.ts +0 -43
  265. package/plugins/bizar/src/tools/memory-read.ts +0 -69
  266. package/plugins/bizar/src/tools/memory-search.ts +0 -47
  267. package/plugins/bizar/src/tools/memory-write.ts +0 -54
  268. package/plugins/bizar/src/tools/open-kb.ts +0 -198
  269. package/plugins/bizar/src/tools/plan-action.ts +0 -785
  270. package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
  271. package/plugins/bizar/src/tools/sandbox.ts +0 -232
  272. package/plugins/bizar/src/tools/team-spawn.ts +0 -73
  273. package/plugins/bizar/src/tools/team-status.ts +0 -76
  274. package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
  275. package/plugins/bizar/src/trajectory.ts +0 -104
  276. package/plugins/bizar/tests/README.md +0 -99
  277. package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
  278. package/plugins/bizar/tests/background-state.test.ts +0 -277
  279. package/plugins/bizar/tests/background.test.ts +0 -402
  280. package/plugins/bizar/tests/block.test.ts +0 -195
  281. package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
  282. package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
  283. package/plugins/bizar/tests/commands-impl.test.ts +0 -316
  284. package/plugins/bizar/tests/commands.test.ts +0 -584
  285. package/plugins/bizar/tests/compaction.test.ts +0 -264
  286. package/plugins/bizar/tests/config.test.ts +0 -128
  287. package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
  288. package/plugins/bizar/tests/dispose.test.ts +0 -336
  289. package/plugins/bizar/tests/event-stream.test.ts +0 -409
  290. package/plugins/bizar/tests/event.test.ts +0 -262
  291. package/plugins/bizar/tests/fingerprint.test.ts +0 -190
  292. package/plugins/bizar/tests/http-client.test.ts +0 -404
  293. package/plugins/bizar/tests/init-helpers.test.ts +0 -203
  294. package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
  295. package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
  296. package/plugins/bizar/tests/key-rotation.test.ts +0 -396
  297. package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
  298. package/plugins/bizar/tests/loop.test.ts +0 -397
  299. package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
  300. package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
  301. package/plugins/bizar/tests/odin.test.ts +0 -125
  302. package/plugins/bizar/tests/options.test.ts +0 -329
  303. package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
  304. package/plugins/bizar/tests/safety.test.ts +0 -281
  305. package/plugins/bizar/tests/serve.test.ts +0 -339
  306. package/plugins/bizar/tests/settings.test.ts +0 -351
  307. package/plugins/bizar/tests/stall-think.test.ts +0 -750
  308. package/plugins/bizar/tests/state.test.ts +0 -276
  309. package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
  310. package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
  311. package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
  312. package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
  313. package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
  314. package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
  315. package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
  316. package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
  317. package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
  318. package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
  319. package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
  320. package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
  321. package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
  322. package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
  323. package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
  324. package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
  325. package/plugins/bizar/tests/tools/sandbox.test.ts +0 -117
  326. package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
  327. package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
  328. package/plugins/bizar/tsconfig.json +0 -29
  329. package/scripts/mirror-agents-md.sh +0 -69
@@ -0,0 +1,191 @@
1
+ /**
2
+ * src/server/claude-sdk.mjs
3
+ *
4
+ * v6.3.0 — Dashboard-side wrapper around the Claude Code Agent SDK
5
+ * (`@anthropic-ai/claude-agent-sdk`).
6
+ *
7
+ * Replaces cline-sdk.mjs (the legacy wrapper around
8
+ * `@polderlabs/bizar-sdk/cline`). Claude Code's SDK is an in-process
9
+ * library: it exposes `query()` for one-shot prompts and
10
+ * `ClaudeSDKClient` for streaming sessions. There is no equivalent
11
+ * of cline's `serve` subprocess — Claude Code runs in-process by
12
+ * default.
13
+ *
14
+ * Public surface:
15
+ * - `getClaudeSdk()` — returns the SDK module or `null`
16
+ * if not installed (so callers can
17
+ * degrade gracefully).
18
+ * - `getClaudeSdkOrThrow()` — same, but throws when missing.
19
+ * - `subscribeToSession(id)` — wraps `ClaudeSDKClient.subscribe()`
20
+ * for streaming a session's events.
21
+ * - `pingClaudeSdk()` — quick health probe; uses a short
22
+ * `query()` against `--model haiku`
23
+ * to verify the SDK is reachable.
24
+ *
25
+ * Storage location for Claude Code sessions:
26
+ * - Sessions live at `~/.claude/sessions/<sessionId>/` with the
27
+ * conversation as `messages.jsonl`. This module does not own
28
+ * that directory — Claude Code writes it directly. We read it
29
+ * when callers ask for `listClaudeSessions` / `listClaudeMessages`.
30
+ *
31
+ * Environment:
32
+ * - Claude Code reads API keys from the environment
33
+ * (`ANTHROPIC_API_KEY` or the OAuth flow). We do NOT need to
34
+ * build an `Authorization: Basic base64("cline:<password>")`
35
+ * header — Claude Code handles authentication itself.
36
+ */
37
+
38
+ import { homedir } from 'node:os';
39
+ import { join } from 'node:path';
40
+ import { existsSync } from 'node:fs';
41
+
42
+ let _sdk = null;
43
+ /** @type {Promise<any> | null} */
44
+ let _sdkPromise = null;
45
+
46
+ const HOME = homedir();
47
+ const CLAUDE_SESSIONS_DIR = join(HOME, '.claude', 'sessions');
48
+
49
+ /**
50
+ * Lazily import the Claude Code Agent SDK. Returns the module on
51
+ * success and `null` if the package is not installed (so callers can
52
+ * fall back to subprocess execution via claude-runner.mjs).
53
+ *
54
+ * The result is cached so subsequent calls are synchronous.
55
+ *
56
+ * @returns {Promise<any | null>}
57
+ */
58
+ export async function getClaudeSdk() {
59
+ if (_sdk) return _sdk;
60
+ if (_sdkPromise) return _sdkPromise;
61
+ _sdkPromise = (async () => {
62
+ try {
63
+ const mod = await import('@anthropic-ai/claude-agent-sdk');
64
+ _sdk = mod;
65
+ return mod;
66
+ } catch {
67
+ // SDK package not installed — caller should use the
68
+ // subprocess fallback in claude-runner.mjs.
69
+ _sdk = null;
70
+ return null;
71
+ } finally {
72
+ _sdkPromise = null;
73
+ }
74
+ })();
75
+ return _sdkPromise;
76
+ }
77
+
78
+ /**
79
+ * Same as {@link getClaudeSdk} but throws when the SDK isn't
80
+ * available. Use this from code paths that REQUIRE the in-process
81
+ * SDK (e.g. callers that want typed event streams rather than the
82
+ * JSONL subprocess path).
83
+ *
84
+ * @returns {Promise<any>}
85
+ */
86
+ export async function getClaudeSdkOrThrow() {
87
+ const sdk = await getClaudeSdk();
88
+ if (!sdk) {
89
+ throw new Error(
90
+ 'claude_sdk_unavailable: @anthropic-ai/claude-agent-sdk is not installed. ' +
91
+ 'Run `npm install @anthropic-ai/claude-agent-sdk` at the repo root, ' +
92
+ 'or use the subprocess path (claude-runner.mjs).',
93
+ );
94
+ }
95
+ return sdk;
96
+ }
97
+
98
+ /**
99
+ * Subscribe to a Claude Code session's event stream. Thin wrapper
100
+ * around `ClaudeSDKClient.subscribe({ sessionId })`.
101
+ *
102
+ * Returns `{ stream, close }` — `stream` is an `AsyncIterable` of
103
+ * typed event envelopes; `close()` aborts the underlying subscription.
104
+ *
105
+ * Returns `null` when the SDK is unavailable or the session id is
106
+ * missing — callers should fall back to the JSONL tailing path in
107
+ * `claude-sessions.mjs`.
108
+ *
109
+ * @param {string} sessionId
110
+ * @returns {Promise<AsyncIterable<unknown> & { close: () => void } | null>}
111
+ */
112
+ export async function subscribeToSession(sessionId) {
113
+ if (!sessionId) return null;
114
+ const sdk = await getClaudeSdk();
115
+ if (!sdk || typeof sdk.subscribe !== 'function') return null;
116
+ try {
117
+ const sub = await sdk.subscribe({ sessionId });
118
+ return sub;
119
+ } catch {
120
+ return null;
121
+ }
122
+ }
123
+
124
+ /**
125
+ * Quick liveness probe for the Claude Code SDK. Performs a tiny
126
+ * `query()` call against `haiku` and waits up to 1.5s for the
127
+ * response. Returns `true` on any successful response, `false`
128
+ * otherwise.
129
+ *
130
+ * Used by the dashboard's /api/health endpoint and by callers that
131
+ * want to decide between the in-process SDK and the subprocess
132
+ * fallback.
133
+ *
134
+ * @returns {Promise<boolean>}
135
+ */
136
+ export async function pingClaudeSdk() {
137
+ const sdk = await getClaudeSdk();
138
+ if (!sdk || typeof sdk.query !== 'function') return false;
139
+ try {
140
+ const ac = new AbortController();
141
+ const timer = setTimeout(() => ac.abort(), 1500);
142
+ try {
143
+ const stream = sdk.query({
144
+ prompt: 'ping',
145
+ options: { model: 'haiku', maxTurns: 1, permissionMode: 'plan' },
146
+ });
147
+ // Drain the first event or the abort signal — either proves
148
+ // the SDK is reachable.
149
+ const result = await Promise.race([
150
+ stream[Symbol.asyncIterator]().next().then(() => true),
151
+ new Promise((resolve) => {
152
+ ac.signal.addEventListener('abort', () => resolve(false));
153
+ }),
154
+ ]);
155
+ // Best-effort close of the stream.
156
+ try { await stream.close?.(); } catch { /* ignore */ }
157
+ return Boolean(result);
158
+ } finally {
159
+ clearTimeout(timer);
160
+ ac.abort();
161
+ }
162
+ } catch {
163
+ return false;
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Return the canonical on-disk directory for Claude Code sessions.
169
+ * Useful for callers that need to enumerate `messages.jsonl` files
170
+ * directly (e.g. listing historical messages for a session).
171
+ *
172
+ * @returns {string}
173
+ */
174
+ export function claudeSessionsDir() {
175
+ return CLAUDE_SESSIONS_DIR;
176
+ }
177
+
178
+ /**
179
+ * Best-effort check that the Claude Code session directory exists
180
+ * (or its parent does). Lets callers fall back to "no sessions yet"
181
+ * rather than throwing when the user has never run `claude`.
182
+ *
183
+ * @returns {boolean}
184
+ */
185
+ export function claudeSessionsDirExists() {
186
+ try {
187
+ return existsSync(CLAUDE_SESSIONS_DIR) || existsSync(join(HOME, '.claude'));
188
+ } catch {
189
+ return false;
190
+ }
191
+ }
@@ -1074,58 +1074,31 @@ export const providersStore = {
1074
1074
  /* best-effort */
1075
1075
  }
1076
1076
 
1077
- // Source 3: cline serve HTTP API
1077
+ // Source 3: claude CLI probe. v6.3.0 — Claude Code has no
1078
+ // equivalent of the old cline serve HTTP API. Instead we
1079
+ // ping `claude -v` to confirm the runtime is reachable and,
1080
+ // if so, surface it as a "claude-cli" provider entry with the
1081
+ // models Claude Code natively supports.
1078
1082
  try {
1079
- const { readServeInfo } = await import('./serve-info.mjs');
1080
- const info = readServeInfo();
1081
- if (info && info.baseUrl) {
1082
- const auth = 'Basic ' + Buffer.from(`cline:${info.password || ''}`).toString('base64');
1083
- const ctrl = new AbortController();
1084
- const timer = setTimeout(() => ctrl.abort(), 1500);
1085
- try {
1086
- const resp = await fetch(`${info.baseUrl}/api/providers`, {
1087
- headers: { Authorization: auth },
1088
- signal: ctrl.signal,
1089
- });
1090
- if (resp.ok) {
1091
- const body = await resp.json().catch(() => null);
1092
- const list = Array.isArray(body?.providers)
1093
- ? body.providers
1094
- : Array.isArray(body?.data)
1095
- ? body.data
1096
- : Array.isArray(body)
1097
- ? body
1098
- : [];
1099
- for (const p of list) {
1100
- if (!p || typeof p !== 'object') continue;
1101
- const id = p.id || p.name;
1102
- if (!id) continue;
1103
- const models = (Array.isArray(p.models) ? p.models : []).map((m) => {
1104
- if (typeof m === 'string') return { id: m, name: m };
1105
- return {
1106
- id: m.id || m.name || String(m),
1107
- name: m.name || m.id || String(m),
1108
- };
1109
- });
1110
- upsert(
1111
- id,
1112
- {
1113
- name: p.name || id,
1114
- baseURL: p.baseURL || '',
1115
- models,
1116
- },
1117
- 'serve',
1118
- );
1119
- }
1120
- }
1121
- } catch {
1122
- /* serve unreachable — fall through */
1123
- } finally {
1124
- clearTimeout(timer);
1125
- }
1083
+ const { spawnSync } = await import('node:child_process');
1084
+ const probe = spawnSync('claude', ['-v'], { stdio: 'ignore', timeout: 1500 });
1085
+ if (probe.status === 0) {
1086
+ upsert(
1087
+ 'claude-cli',
1088
+ {
1089
+ name: 'Claude Code CLI',
1090
+ baseURL: '',
1091
+ models: [
1092
+ { id: 'claude-opus-4', name: 'Claude Opus 4' },
1093
+ { id: 'claude-sonnet-4', name: 'Claude Sonnet 4' },
1094
+ { id: 'claude-haiku-4', name: 'Claude Haiku 4' },
1095
+ ],
1096
+ },
1097
+ 'cli',
1098
+ );
1126
1099
  }
1127
1100
  } catch {
1128
- /* best-effort */
1101
+ /* claude CLI unreachable — fall through */
1129
1102
  }
1130
1103
 
1131
1104
  return Array.from(byId.values()).sort((a, b) => a.id.localeCompare(b.id));
@@ -14,10 +14,12 @@
14
14
  * /api/background/:id/retry (POST) — manual unstick (v3.11.0)
15
15
  * /api/background/:id (DELETE) — kill
16
16
  *
17
- * Backed by the cline-plugin's bg instance store. Imports the
18
- * store lazily so this module loads even when the plugin is offline.
17
+ * Backed by the bg instance store at `~/.cache/bizar/bg/<id>.json`.
18
+ * Imports the store lazily so this module loads even when the Claude
19
+ * Code CLI is offline.
19
20
  *
20
- * v5.5.1: the spawner is now SDK-based (see ../bg-spawner.mjs).
21
+ * v6.3.0: the spawner is now Claude-Code-based (see
22
+ * ../claude-bg-spawner.mjs).
21
23
  * `POST /api/background/:id/steer` performs a true mid-flight prompt
22
24
  * (no kill+respawn); the response shape stays backwards compatible with
23
25
  * the v5.5.0 contract except `newInstanceId` is `null` (same instance
@@ -34,9 +36,10 @@ import { wrap } from './_shared.mjs';
34
36
  export function createBackgroundRouter({ broadcast }) {
35
37
  const router = Router();
36
38
 
37
- // Wire bg-spawner's broadcast so spawned agents broadcast on the
38
- // existing WS bus (mirroring the way `bg-poller.mjs` does it).
39
- import('../bg-spawner.mjs').then((m) => {
39
+ // Wire claude-bg-spawner's broadcast so spawned agents broadcast
40
+ // on the existing WS bus (mirroring the way `bg-poller.mjs` does
41
+ // it).
42
+ import('../claude-bg-spawner.mjs').then((m) => {
40
43
  if (m && typeof m.configureSpawner === 'function') {
41
44
  m.configureSpawner({ broadcast });
42
45
  }
@@ -71,7 +74,7 @@ export function createBackgroundRouter({ broadcast }) {
71
74
  const tags = Array.isArray(body.tags)
72
75
  ? body.tags.filter((t) => typeof t === 'string').slice(0, 10)
73
76
  : undefined;
74
- const { spawnBgAgent } = await import('../bg-spawner.mjs');
77
+ const { spawnBgAgent } = await import('../claude-bg-spawner.mjs');
75
78
  const result = await spawnBgAgent({
76
79
  agent,
77
80
  prompt,
@@ -114,9 +117,9 @@ export function createBackgroundRouter({ broadcast }) {
114
117
  }));
115
118
 
116
119
  // v5.x — Tool-call history. The state file carries a `toolCalls`
117
- // array populated by the plugin's InstanceManager as it observes
118
- // cline events. This endpoint is read-only; the plugin owns the
119
- // shape.
120
+ // array populated by claude-bg-spawner.mjs as it observes
121
+ // Claude Code events. This endpoint is read-only; the spawner
122
+ // owns the shape.
120
123
  router.get('/background/:id/tool-calls', wrap(async (req, res) => {
121
124
  const { backgroundStore } = await import('../background-store.mjs');
122
125
  const inst = backgroundStore.get(req.params.id);
@@ -130,7 +133,7 @@ export function createBackgroundRouter({ broadcast }) {
130
133
 
131
134
  // v5.x — Pause. SIGSTOP the subprocess.
132
135
  router.post('/background/:id/pause', wrap(async (req, res) => {
133
- const { pauseBgAgent } = await import('../bg-spawner.mjs');
136
+ const { pauseBgAgent } = await import('../claude-bg-spawner.mjs');
134
137
  const result = pauseBgAgent(req.params.id);
135
138
  if (!result.ok) {
136
139
  res.status(result.error === 'unsupported_on_win32' ? 501 : 400).json({ ok: false, error: result.error });
@@ -142,7 +145,7 @@ export function createBackgroundRouter({ broadcast }) {
142
145
 
143
146
  // v5.x — Resume. SIGCONT the subprocess.
144
147
  router.post('/background/:id/resume', wrap(async (req, res) => {
145
- const { resumeBgAgent } = await import('../bg-spawner.mjs');
148
+ const { resumeBgAgent } = await import('../claude-bg-spawner.mjs');
146
149
  const result = resumeBgAgent(req.params.id);
147
150
  if (!result.ok) {
148
151
  res.status(result.error === 'unsupported_on_win32' ? 501 : 400).json({ ok: false, error: result.error });
@@ -152,8 +155,9 @@ export function createBackgroundRouter({ broadcast }) {
152
155
  res.json({ ok: true, status: 'running' });
153
156
  }));
154
157
 
155
- // v5.5.1 — Steer is now TRUE mid-flight: the dashboard calls
156
- // sdk.sessions.prompt() on the live cline session. No kill+respawn.
158
+ // v6.3.0 — Steer is TRUE mid-flight: the dashboard calls
159
+ // claude-bg-spawner.mjs's `steerBgAgent()` on the live Claude Code
160
+ // session. No kill+respawn.
157
161
  // The response shape is the same `{ ok, newInstanceId?, processId? }` —
158
162
  // `newInstanceId` is omitted (the same instance is reused); the
159
163
  // `mode` field tells the dashboard this was a true mid-flight steer.
@@ -168,7 +172,7 @@ export function createBackgroundRouter({ broadcast }) {
168
172
  res.status(400).json({ ok: false, error: 'message_empty' });
169
173
  return;
170
174
  }
171
- const { steerBgAgent } = await import('../bg-spawner.mjs');
175
+ const { steerBgAgent } = await import('../claude-bg-spawner.mjs');
172
176
  const result = await steerBgAgent(req.params.id, message);
173
177
  if (!result.ok) {
174
178
  res.status(400).json({ ok: false, error: result.error });
@@ -276,7 +280,7 @@ export function createBackgroundRouter({ broadcast }) {
276
280
  // that we own (spawned via POST /background). Falls back to the
277
281
  // plugin's tmux/abort path for instances spawned by the plugin.
278
282
  try {
279
- const { isAlive: spawnerAlive, killBgAgent } = await import('../bg-spawner.mjs');
283
+ const { isAlive: spawnerAlive, killBgAgent } = await import('../claude-bg-spawner.mjs');
280
284
  if (spawnerAlive(req.params.id)) {
281
285
  const r = await killBgAgent(req.params.id, { signal: 'SIGTERM' });
282
286
  if (r.ok) {
@@ -288,10 +292,10 @@ export function createBackgroundRouter({ broadcast }) {
288
292
  } catch { /* ignore — fall through to legacy */ }
289
293
 
290
294
  const { backgroundStore } = await import('../background-store.mjs');
291
- // v3.5.4 (bug #3) — `kill()` is now async (it awaits the abortSession
292
- // HTTP call to cline serve, then deletes the state file, then
293
- // best-effort tmux). The result includes a `steps[]` array so the UI
294
- // can report exactly what happened.
295
+ // v6.3.0 — `kill()` is async (it awaits the kill on the
296
+ // claude-bg-spawner, then deletes the state file, then
297
+ // best-effort tmux). The result includes a `steps[]` array so
298
+ // the UI can report exactly what happened.
295
299
  //
296
300
  // We always return 200 — the result body's `ok` distinguishes
297
301
  // success from partial failure (e.g. abort succeeded but tmux kill