@polderlabs/bizar 6.2.4 → 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 (332) 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 +31 -18
  125. package/cli/commands/claude-cmd.mjs +348 -0
  126. package/cli/commands/install.mjs +12 -11
  127. package/cli/commands/sandbox.mjs +220 -0
  128. package/cli/commands/validate.mjs +252 -288
  129. package/cli/dev-link.test.mjs +11 -11
  130. package/cli/doctor.mjs +131 -213
  131. package/cli/install.mjs +33 -37
  132. package/cli/install.test.mjs +9 -9
  133. package/cli/provision-claude.mjs +893 -0
  134. package/cli/provision.mjs +330 -226
  135. package/cli/provision.test.mjs +102 -0
  136. package/cli/utils.mjs +72 -58
  137. package/config/AGENTS.md +28 -28
  138. package/config/agents/_shared/AGENT_BASELINE.md +104 -684
  139. package/config/skills/bizar/SKILL.md +197 -0
  140. package/config/skills/cubesandbox/SKILL.md +148 -0
  141. package/config/skills/harness-engineering/SKILL.md +142 -0
  142. package/install.sh +66 -44
  143. package/package.json +19 -11
  144. package/packages/sdk/ARCHITECTURE.md +40 -36
  145. package/packages/sdk/package-lock.json +32 -0
  146. package/packages/sdk/package.json +15 -5
  147. package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
  148. package/packages/sdk/src/fingerprint.ts +0 -0
  149. package/packages/sdk/src/index.ts +38 -73
  150. package/packages/sdk/src/mcp/bin.ts +51 -0
  151. package/packages/sdk/src/mcp/server.ts +498 -0
  152. package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
  153. package/packages/sdk/tests/sdk.test.mjs +148 -0
  154. package/packages/sdk/vitest.config.ts +1 -1
  155. package/scripts/bh-full-e2e.mjs +166 -363
  156. package/scripts/check-deps.mjs +28 -46
  157. package/scripts/mirror-claude-md.sh +78 -0
  158. package/scripts/test-in-container.sh +157 -0
  159. package/templates/clean-state-checklist.md +3 -3
  160. package/templates/sprint-contract.md +2 -2
  161. package/bizar-dash/.bizar/activity.log +0 -3
  162. package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
  163. package/bizar-dash/.omx/state/session.json +0 -10
  164. package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
  165. package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
  166. package/bizar-dash/bizar-design/canvas.html +0 -281
  167. package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
  168. package/bizar-dash/bizar-design/components.css +0 -1665
  169. package/bizar-dash/bizar-design/components.html +0 -557
  170. package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
  171. package/bizar-dash/bizar-design/desktop/agents.html +0 -74
  172. package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
  173. package/bizar-dash/bizar-design/desktop/memory.html +0 -75
  174. package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
  175. package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
  176. package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
  177. package/bizar-dash/bizar-design/desktop/overview.html +0 -95
  178. package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
  179. package/bizar-dash/bizar-design/desktop/settings.html +0 -70
  180. package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
  181. package/bizar-dash/bizar-design/icons.svg +0 -44
  182. package/bizar-dash/bizar-design/index.html +0 -192
  183. package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
  184. package/bizar-dash/bizar-design/mobile/agents.html +0 -29
  185. package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
  186. package/bizar-dash/bizar-design/mobile/memory.html +0 -28
  187. package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
  188. package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
  189. package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
  190. package/bizar-dash/bizar-design/mobile/overview.html +0 -33
  191. package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
  192. package/bizar-dash/bizar-design/mobile/settings.html +0 -28
  193. package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
  194. package/bizar-dash/bizar-design/prototype.js +0 -114
  195. package/bizar-dash/bizar-design/tokens.css +0 -106
  196. package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
  197. package/bizar-dash/node_modules/.package-lock.json +0 -6
  198. package/bizar-dash/package-lock.json +0 -6
  199. package/bizar-dash/src/server/cline-sdk.mjs +0 -132
  200. package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
  201. package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
  202. package/cli/commands/cline-cmd.mjs +0 -289
  203. package/cli/commands/validate.test.mjs +0 -344
  204. package/cli/doctor.test.mjs +0 -350
  205. package/config/cline.json.template +0 -342
  206. package/packages/sdk/src/client.ts +0 -188
  207. package/packages/sdk/src/cline-events.ts +0 -134
  208. package/packages/sdk/src/cline-types.ts +0 -66
  209. package/packages/sdk/src/cline.ts +0 -339
  210. package/packages/sdk/src/errors.ts +0 -129
  211. package/packages/sdk/src/events.ts +0 -153
  212. package/packages/sdk/src/types.ts +0 -176
  213. package/packages/sdk/tests/client.test.ts +0 -217
  214. package/packages/sdk/tests/errors.test.ts +0 -108
  215. package/packages/sdk/tests/events.test.ts +0 -139
  216. package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
  217. package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
  218. package/plugins/bizar/ARCHITECTURE.md +0 -142
  219. package/plugins/bizar/CONSTRAINTS.md +0 -67
  220. package/plugins/bizar/LICENSE +0 -21
  221. package/plugins/bizar/README.md +0 -448
  222. package/plugins/bizar/index.ts +0 -872
  223. package/plugins/bizar/package.json +0 -39
  224. package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
  225. package/plugins/bizar/src/background-state.ts +0 -641
  226. package/plugins/bizar/src/background.ts +0 -1806
  227. package/plugins/bizar/src/cline-runner.ts +0 -203
  228. package/plugins/bizar/src/clineruntime.ts +0 -227
  229. package/plugins/bizar/src/commands-impl.ts +0 -151
  230. package/plugins/bizar/src/commands.ts +0 -1799
  231. package/plugins/bizar/src/compaction.d.mts +0 -48
  232. package/plugins/bizar/src/compaction.mjs +0 -192
  233. package/plugins/bizar/src/dashboard-client.ts +0 -233
  234. package/plugins/bizar/src/event-stream.ts +0 -606
  235. package/plugins/bizar/src/fingerprint.ts +0 -120
  236. package/plugins/bizar/src/handoff.ts +0 -79
  237. package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
  238. package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
  239. package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
  240. package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
  241. package/plugins/bizar/src/http-client.ts +0 -467
  242. package/plugins/bizar/src/key-rotation.ts +0 -218
  243. package/plugins/bizar/src/logger.ts +0 -144
  244. package/plugins/bizar/src/loop-engineering.ts +0 -241
  245. package/plugins/bizar/src/loop.ts +0 -176
  246. package/plugins/bizar/src/mistake-recovery.ts +0 -98
  247. package/plugins/bizar/src/odin.ts +0 -227
  248. package/plugins/bizar/src/options.ts +0 -470
  249. package/plugins/bizar/src/plan-fs.ts +0 -323
  250. package/plugins/bizar/src/reasoning-clean.ts +0 -454
  251. package/plugins/bizar/src/report.ts +0 -178
  252. package/plugins/bizar/src/research-prompt.ts +0 -35
  253. package/plugins/bizar/src/serve-info.ts +0 -228
  254. package/plugins/bizar/src/serve.ts +0 -496
  255. package/plugins/bizar/src/settings.ts +0 -349
  256. package/plugins/bizar/src/state.ts +0 -298
  257. package/plugins/bizar/src/tool-discipline.ts +0 -105
  258. package/plugins/bizar/src/tools/agent-browser.ts +0 -315
  259. package/plugins/bizar/src/tools/bg-collect.ts +0 -131
  260. package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
  261. package/plugins/bizar/src/tools/bg-kill.ts +0 -116
  262. package/plugins/bizar/src/tools/bg-pause.ts +0 -99
  263. package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
  264. package/plugins/bizar/src/tools/bg-resume.ts +0 -94
  265. package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
  266. package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
  267. package/plugins/bizar/src/tools/bg-status.ts +0 -130
  268. package/plugins/bizar/src/tools/graph-query.ts +0 -278
  269. package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
  270. package/plugins/bizar/src/tools/memory-list.ts +0 -43
  271. package/plugins/bizar/src/tools/memory-read.ts +0 -69
  272. package/plugins/bizar/src/tools/memory-search.ts +0 -47
  273. package/plugins/bizar/src/tools/memory-write.ts +0 -54
  274. package/plugins/bizar/src/tools/open-kb.ts +0 -198
  275. package/plugins/bizar/src/tools/plan-action.ts +0 -785
  276. package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
  277. package/plugins/bizar/src/tools/team-spawn.ts +0 -73
  278. package/plugins/bizar/src/tools/team-status.ts +0 -76
  279. package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
  280. package/plugins/bizar/src/trajectory.ts +0 -104
  281. package/plugins/bizar/tests/README.md +0 -99
  282. package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
  283. package/plugins/bizar/tests/background-state.test.ts +0 -277
  284. package/plugins/bizar/tests/background.test.ts +0 -402
  285. package/plugins/bizar/tests/block.test.ts +0 -195
  286. package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
  287. package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
  288. package/plugins/bizar/tests/commands-impl.test.ts +0 -316
  289. package/plugins/bizar/tests/commands.test.ts +0 -584
  290. package/plugins/bizar/tests/compaction.test.ts +0 -264
  291. package/plugins/bizar/tests/config.test.ts +0 -128
  292. package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
  293. package/plugins/bizar/tests/dispose.test.ts +0 -336
  294. package/plugins/bizar/tests/event-stream.test.ts +0 -409
  295. package/plugins/bizar/tests/event.test.ts +0 -262
  296. package/plugins/bizar/tests/fingerprint.test.ts +0 -162
  297. package/plugins/bizar/tests/http-client.test.ts +0 -404
  298. package/plugins/bizar/tests/init-helpers.test.ts +0 -203
  299. package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
  300. package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
  301. package/plugins/bizar/tests/key-rotation.test.ts +0 -396
  302. package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
  303. package/plugins/bizar/tests/loop.test.ts +0 -397
  304. package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
  305. package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
  306. package/plugins/bizar/tests/odin.test.ts +0 -125
  307. package/plugins/bizar/tests/options.test.ts +0 -329
  308. package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
  309. package/plugins/bizar/tests/safety.test.ts +0 -256
  310. package/plugins/bizar/tests/serve.test.ts +0 -339
  311. package/plugins/bizar/tests/settings.test.ts +0 -351
  312. package/plugins/bizar/tests/stall-think.test.ts +0 -750
  313. package/plugins/bizar/tests/state.test.ts +0 -276
  314. package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
  315. package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
  316. package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
  317. package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
  318. package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
  319. package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
  320. package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
  321. package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
  322. package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
  323. package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
  324. package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
  325. package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
  326. package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
  327. package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
  328. package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
  329. package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
  330. package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
  331. package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
  332. package/plugins/bizar/tsconfig.json +0 -29
@@ -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