@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
@@ -1,32 +1,23 @@
1
1
  /**
2
2
  * src/server/bg-retry.mjs
3
3
  *
4
- * v3.11.0 — Periodic recovery for background-agent instances stuck
4
+ * v6.3.0 — Periodic recovery for background-agent instances stuck
5
5
  * in `dispatchPending: true` with `toolCallCount === 0`.
6
6
  *
7
7
  * Why this exists:
8
- * Before v3.11.0, the task delegator's
9
- * `dispatchToBackground(main, subtasks, …)` short-circuited when
10
- * `pingClineServe()` returned false. The bg state file was
11
- * written with `dispatchPending: true` and a tmux session was
12
- * never created. The only recovery path was the user manually
13
- * hitting `POST /api/tasks/:id/start` (or restarting the
14
- * dashboard). The user's "home folder project" got stuck this way
15
- * with 7 instances in `dispatchPending: true` — 6 from a Jun 19
16
- * E2E test fixture and 1 active (`bgr_738FFSKMAT5SP58SVF5HQW`,
17
- * "Install vLLM as a Python package").
8
+ * Before v6.3.0, the task delegator's `dispatchToBackground` would
9
+ * short-circuit when `pingClaudeSdk()` returned false and the
10
+ * `claude` binary wasn't on PATH. The bg state file was written
11
+ * with `dispatchPending: true` and the actual spawn never happened.
12
+ * The only recovery path was the user manually hitting
13
+ * `POST /api/tasks/:id/start` (or restarting the dashboard).
18
14
  *
19
15
  * What this module does:
20
16
  * - On a 30s timer, walk every bg state file under BG_DIRS.
21
17
  * - For any instance whose `dispatchPending === true` AND
22
18
  * `toolCallCount === 0` AND `startedAt` is older than the
23
- * 30-second grace window, attempt to re-dispatch by:
24
- * 1. Reading serve-info (the v3.11.0 fix makes this lenient).
25
- * 2. POSTing `/api/session` to the cline serve child.
26
- * 3. POSTing `/api/session/{id}/prompt` with the recorded
27
- * prompt.
28
- * 4. Wrapping the agent run in a tmux session via
29
- * `backgroundStore.spawnTmuxFor`.
19
+ * 30-second grace window, attempt to re-dispatch by spawning
20
+ * `claude -p "<prompt>"` via `claude-runner.mjs`.
30
21
  * - On success, clear `dispatchPending`, persist the real
31
22
  * `sessionId`, bump `lastActivityAt`, and write the file back
32
23
  * atomically.
@@ -49,9 +40,6 @@
49
40
  * non-existent) tmux session — `spawnTmuxFor` already handles
50
41
  * pre-existing sessions via its `note: 'session already existed'`
51
42
  * return path.
52
- * - The cline plugin's own bg state. The retry only writes the
53
- * dashboard's view of the bg instance. The plugin will pick up
54
- * the new dispatch on its next `GET /api/session` poll.
55
43
  */
56
44
 
57
45
  import {
@@ -66,18 +54,13 @@ import { join } from 'node:path';
66
54
  import { homedir } from 'node:os';
67
55
 
68
56
  import { backgroundStore } from './background-store.mjs';
69
- import {
70
- readServeInfo,
71
- pingClineServe,
72
- createClineSession,
73
- sendClinePrompt,
74
- } from './serve-info.mjs';
75
57
  import { tasksStore } from './tasks-store.mjs';
76
58
  import {
77
59
  deriveAbsoluteBgLogPath,
78
60
  isBrokenBgLogPath,
79
61
  getActualBgLogPath,
80
62
  } from './lib/path-safe.mjs';
63
+ import { spawnAgent } from './claude-runner.mjs';
81
64
 
82
65
  const HOME = homedir();
83
66
 
@@ -144,15 +127,7 @@ function findBgFile(instanceId) {
144
127
  * - `retryCount < MAX_DISPATCH_RETRIES` (we don't retry past cap)
145
128
  * - The instance is "stuck": either `dispatchPending === true`,
146
129
  * OR `sessionId` is missing/empty (a sentinel for "spawn never
147
- * returned an cline session"). The user's actual stuck
148
- * `bgr_738FFSKMAT5SP58SVF5HQW.json` does NOT have a
149
- * `dispatchPending` field — it was written by the cline
150
- * plugin itself, not by the dashboard's task-delegator, so
151
- * its stuckness is encoded as `sessionId: ""` instead.
152
- *
153
- * @param {object} inst
154
- * @param {number} now
155
- * @returns {boolean}
130
+ * returned a Claude Code session").
156
131
  */
157
132
  export function shouldRetryDispatch(inst, now = Date.now()) {
158
133
  if (!inst || typeof inst !== 'object') return false;
@@ -165,9 +140,6 @@ export function shouldRetryDispatch(inst, now = Date.now()) {
165
140
  const startedAt = typeof inst.startedAt === 'number' ? inst.startedAt : 0;
166
141
  if (startedAt <= 0) return false;
167
142
  if (now - startedAt < DISPATCH_GRACE_MS) return false;
168
- // Stuckness detector — either the dashboard marked this as
169
- // dispatchPending, OR the plugin wrote an empty sessionId
170
- // (meaning the cline session was never created).
171
143
  const sessionId = inst.sessionId;
172
144
  const emptySession = sessionId === null || sessionId === undefined || sessionId === '';
173
145
  if (inst.dispatchPending !== true && !emptySession) return false;
@@ -175,16 +147,7 @@ export function shouldRetryDispatch(inst, now = Date.now()) {
175
147
  }
176
148
 
177
149
  /**
178
- * Repair a bg instance's `logPath` if it is missing or broken
179
- * (empty / not absolute / contains `//`). The plugin writes the
180
- * logPath as `${worktree}/.cline/log/<id>.log` — when worktree
181
- * was missing, the resulting path becomes `//.cline/log/<id>.log`
182
- * and is unusable. We rebuild from a sane source: serve.json's
183
- * `worktree` first, then the instance's existing worktree field,
184
- * then `~/.cache/bizar/logs` as the last-resort fallback.
185
- *
186
- * @param {object} inst
187
- * @returns {{ repaired: boolean, logPath: string }}
150
+ * Repair a bg instance's `logPath` if it is missing or broken.
188
151
  */
189
152
  function repairLogPath(inst) {
190
153
  const current = inst.logPath;
@@ -192,17 +155,8 @@ function repairLogPath(inst) {
192
155
  return { repaired: false, logPath: typeof current === 'string' ? current : '' };
193
156
  }
194
157
  let worktree = '';
195
- try {
196
- const serve = readServeInfo();
197
- if (serve && typeof serve.worktree === 'string' && serve.worktree.length > 0) {
198
- worktree = serve.worktree;
199
- }
200
- } catch {
201
- /* ignore */
202
- }
203
- if (!worktree && typeof inst.worktree === 'string') {
204
- worktree = inst.worktree;
205
- }
158
+ if (typeof inst.worktree === 'string') worktree = inst.worktree;
159
+ if (!worktree) worktree = process.cwd();
206
160
  const fixed = deriveAbsoluteBgLogPath(worktree, inst.instanceId || '');
207
161
  return { repaired: true, logPath: fixed };
208
162
  }
@@ -216,13 +170,6 @@ function repairLogPath(inst) {
216
170
  * manual-retry endpoint) can render a useful message.
217
171
  *
218
172
  * @param {string} instanceId
219
- * @returns {Promise<{
220
- * ok: boolean,
221
- * reason?: string,
222
- * retryCount?: number,
223
- * sessionId?: string,
224
- * logPath?: string,
225
- * }>}
226
173
  */
227
174
  export async function retryDispatchOnce(instanceId) {
228
175
  const found = findBgFile(instanceId);
@@ -248,133 +195,78 @@ export async function retryDispatchOnce(instanceId) {
248
195
  return { ok: false, reason: 'max_retries_exceeded', retryCount };
249
196
  }
250
197
 
251
- // v3.11.0 — Repair a broken logPath so the new run can write logs.
252
198
  const { repaired, logPath } = repairLogPath(inst);
253
199
 
254
- // v3.11.0 — Resolve serve-info. The relaxed schema means a partial
255
- // `{password, pid, port}` file is now usable: we derive baseUrl
256
- // from the port and treat missing worktree as empty.
257
- const serveInfo = readServeInfo();
258
- if (!serveInfo) {
259
- // Serve not running yet — bump retryCount but leave dispatchPending.
260
- const updated = {
261
- ...inst,
262
- retryCount,
263
- lastRetryAt: Date.now(),
264
- lastActivityAt: Date.now(),
265
- ...(repaired ? { logPath } : {}),
266
- retryError: 'serve-info unavailable',
267
- };
268
- atomicWriteJson(found.file, updated);
269
- return { ok: false, reason: 'serve_unavailable', retryCount };
270
- }
271
-
272
- const reachable = await pingClineServe(serveInfo);
273
- if (!reachable) {
274
- const updated = {
275
- ...inst,
276
- retryCount,
277
- lastRetryAt: Date.now(),
278
- lastActivityAt: Date.now(),
279
- ...(repaired ? { logPath } : {}),
280
- retryError: 'serve_unreachable',
281
- };
282
- atomicWriteJson(found.file, updated);
283
- return { ok: false, reason: 'serve_unreachable', retryCount };
284
- }
285
-
286
- // Attempt the actual session creation + prompt.
287
- let createRes;
288
- let sendRes;
200
+ // Verify the Claude Code runtime is reachable.
201
+ let claudeAvailable = false;
289
202
  try {
290
- createRes = await createClineSession(
291
- serveInfo,
292
- {
293
- title: inst.promptPreview || `bg: ${instanceId}`,
294
- agent: inst.agent || 'tyr',
295
- parentID: undefined,
296
- },
297
- serveInfo.worktree || inst.worktree || '',
298
- );
299
- } catch (err) {
300
- const message = err instanceof Error ? err.message : String(err);
301
- const updated = {
302
- ...inst,
303
- retryCount,
304
- lastRetryAt: Date.now(),
305
- lastActivityAt: Date.now(),
306
- ...(repaired ? { logPath } : {}),
307
- retryError: `createSession threw: ${message}`,
308
- };
309
- atomicWriteJson(found.file, updated);
310
- return { ok: false, reason: 'create_threw', retryCount };
203
+ const { pingClaudeSdk } = await import('./claude-sdk.mjs');
204
+ claudeAvailable = await pingClaudeSdk();
205
+ } catch {
206
+ claudeAvailable = false;
311
207
  }
312
-
313
- if (!createRes.ok) {
208
+ if (!claudeAvailable) {
209
+ try {
210
+ const { spawnSync } = await import('node:child_process');
211
+ const probe = spawnSync('claude', ['-v'], { stdio: 'ignore', timeout: 1500 });
212
+ claudeAvailable = probe.status === 0;
213
+ } catch {
214
+ claudeAvailable = false;
215
+ }
216
+ }
217
+ if (!claudeAvailable) {
314
218
  const updated = {
315
219
  ...inst,
316
220
  retryCount,
317
221
  lastRetryAt: Date.now(),
318
222
  lastActivityAt: Date.now(),
319
223
  ...(repaired ? { logPath } : {}),
320
- retryError: createRes.error || 'createSession failed',
224
+ retryError: 'claude runtime unavailable',
321
225
  };
322
226
  atomicWriteJson(found.file, updated);
323
- return { ok: false, reason: 'create_failed', retryCount };
227
+ return { ok: false, reason: 'claude_unavailable', retryCount };
324
228
  }
325
229
 
326
- const sessionId = createRes.sessionId;
230
+ // Spawn the Claude Code process for this bg instance.
231
+ let sessionId = null;
327
232
  try {
328
233
  const promptText = buildReplayPromptText(inst);
329
- sendRes = await sendClinePrompt(
330
- serveInfo,
331
- {
332
- sessionId,
333
- agent: inst.agent || 'tyr',
334
- text: promptText,
335
- },
336
- serveInfo.worktree || inst.worktree || '',
337
- );
234
+ const dispatchWorktree = inst.worktree || process.cwd();
235
+ const spawnRes = await spawnAgent({
236
+ prompt: promptText,
237
+ agent: inst.agent || 'tyr',
238
+ worktree: dispatchWorktree,
239
+ logPath: repaired ? logPath : (inst.logPath || getActualBgLogPath({ sessionId: instanceId })),
240
+ title: `retry:${instanceId}`,
241
+ });
242
+ if (!spawnRes.ok || !spawnRes.sessionId) {
243
+ const updated = {
244
+ ...inst,
245
+ retryCount,
246
+ lastRetryAt: Date.now(),
247
+ lastActivityAt: Date.now(),
248
+ ...(repaired ? { logPath } : {}),
249
+ retryError: spawnRes.error || 'spawn failed',
250
+ };
251
+ atomicWriteJson(found.file, updated);
252
+ return { ok: false, reason: 'spawn_failed', retryCount };
253
+ }
254
+ sessionId = spawnRes.sessionId;
338
255
  } catch (err) {
339
256
  const message = err instanceof Error ? err.message : String(err);
340
- // Session was created but prompt failed. Mark the instance as
341
- // running-with-sessionId so the operator can interact with it via
342
- // cline directly; the next retry tick will re-issue the prompt
343
- // only if toolCallCount stays at 0.
344
257
  const updated = {
345
258
  ...inst,
346
- sessionId,
347
259
  retryCount,
348
260
  lastRetryAt: Date.now(),
349
261
  lastActivityAt: Date.now(),
350
- status: 'running',
351
- dispatchPending: false,
352
262
  ...(repaired ? { logPath } : {}),
353
- retryError: `sendPrompt threw: ${message}`,
263
+ retryError: `spawn threw: ${message}`,
354
264
  };
355
265
  atomicWriteJson(found.file, updated);
356
- return { ok: false, reason: 'send_threw', retryCount, sessionId };
266
+ return { ok: false, reason: 'spawn_threw', retryCount };
357
267
  }
358
268
 
359
- if (!sendRes.ok) {
360
- const updated = {
361
- ...inst,
362
- sessionId,
363
- retryCount,
364
- lastRetryAt: Date.now(),
365
- lastActivityAt: Date.now(),
366
- status: 'running',
367
- dispatchPending: false,
368
- ...(repaired ? { logPath } : {}),
369
- retryError: sendRes.error || 'sendPrompt failed',
370
- };
371
- atomicWriteJson(found.file, updated);
372
- return { ok: false, reason: 'send_failed', retryCount, sessionId };
373
- }
374
-
375
- // Success path. Re-write the instance as `running`, clear
376
- // dispatchPending, refresh activity timestamps, and wrap the agent
377
- // run in a tmux session (best-effort, matches `task-delegator`).
269
+ // Success path.
378
270
  const updated = {
379
271
  ...inst,
380
272
  sessionId,
@@ -390,15 +282,11 @@ export async function retryDispatchOnce(instanceId) {
390
282
 
391
283
  try {
392
284
  const tmuxName = `bg_${(sessionId || instanceId).slice(0, 16)}`;
393
- // v3.11.1 — Bug fix: the previous code tailed `${worktree}/.cline/log/<id>.log`,
394
- // a path nothing writes to. The plugin's `LogWriter` writes to
395
- // `${logDir}/${sessionId}.log` (default `~/.cache/bizar/logs`).
396
- // Use the real path so the operator sees activity.
397
285
  const logFile = getActualBgLogPath({ sessionId: sessionId || instanceId });
398
286
  backgroundStore.spawnTmuxFor(
399
287
  tmuxName,
400
288
  { command: 'tail', args: ['-n', '200', '-F', logFile] },
401
- serveInfo.worktree || inst.worktree || undefined,
289
+ inst.worktree || undefined,
402
290
  );
403
291
  } catch {
404
292
  /* best-effort */
@@ -410,7 +298,6 @@ export async function retryDispatchOnce(instanceId) {
410
298
  await tasksStore.update(null, inst.taskId, {
411
299
  status: 'doing',
412
300
  metadata: {
413
- ...(typeof inst.mainTaskId === 'string' ? {} : {}),
414
301
  progress: 5,
415
302
  currentStep: `Re-dispatched (${sessionId})`,
416
303
  dispatchedAt: Date.now(),
@@ -426,14 +313,7 @@ export async function retryDispatchOnce(instanceId) {
426
313
 
427
314
  /**
428
315
  * Reconstruct the prompt text for the retry from what the bg file
429
- * stored. The original `task-delegator.dispatchToBackground` builds
430
- * a multi-line prompt (`# Title`, body, `---`, IDs); we approximate
431
- * that here using the promptPreview + instanceId context. If the
432
- * upstream caller stored the full prompt in `metadata.promptText`,
433
- * use that; otherwise fall back to the preview.
434
- *
435
- * @param {object} inst
436
- * @returns {string}
316
+ * stored.
437
317
  */
438
318
  function buildReplayPromptText(inst) {
439
319
  const full = inst?.metadata?.promptText;
@@ -444,24 +324,23 @@ function buildReplayPromptText(inst) {
444
324
  parts.push('');
445
325
  parts.push('(Re-dispatched by the bg-retry loop — full prompt was not');
446
326
  parts.push('persisted. The dashboard recovered this instance after the');
447
- parts.push('plugin was reachable. The original prompt preview is above;');
448
- parts.push('if more context is required, inspect the linked task.)');
327
+ parts.push('Claude Code runtime was reachable. The original prompt');
328
+ parts.push('preview is above; if more context is required, inspect the');
329
+ parts.push('linked task.)');
449
330
  parts.push('');
450
331
  parts.push('---');
451
332
  parts.push(`Subtask ID: ${inst.taskId || '(unknown)'}`);
452
333
  parts.push(`Assigned agent: ${inst.agent || 'tyr'}`);
453
334
  parts.push(`Parent task ID: ${inst.mainTaskId || '(none)'}`);
454
335
  parts.push(`Instance ID: ${inst.instanceId}`);
336
+ parts.push(`Runtime: Claude Code (claude -p)`);
455
337
  return parts.join('\n');
456
338
  }
457
339
 
458
340
  /**
459
341
  * One pass of the retry loop. Walks every bg state file, identifies
460
342
  * candidates via `shouldRetryDispatch`, and calls `retryDispatchOnce`
461
- * for each. Failures are caught so a single broken file cannot
462
- * poison the rest of the pass.
463
- *
464
- * @returns {Promise<{ scanned: number, retried: number, succeeded: number, failed: number, skipped: number }>}
343
+ * for each.
465
344
  */
466
345
  export async function tickRetryLoop() {
467
346
  if (inFlightTick) {
@@ -528,9 +407,6 @@ export async function tickRetryLoop() {
528
407
 
529
408
  /**
530
409
  * Start the periodic retry loop. Idempotent.
531
- *
532
- * @param {object} [opts]
533
- * @param {number} [opts.intervalMs] override the default 30s tick
534
410
  */
535
411
  export function startBgRetryLoop({ intervalMs } = {}) {
536
412
  if (intervalHandle) return { ok: true, alreadyRunning: true };
@@ -542,9 +418,6 @@ export function startBgRetryLoop({ intervalMs } = {}) {
542
418
  });
543
419
  }, ms);
544
420
  if (typeof intervalHandle.unref === 'function') intervalHandle.unref();
545
- // Kick off a first tick on the next event-loop turn so the
546
- // dashboard recovers any pre-existing stuck instances immediately
547
- // after a restart, without waiting 30s.
548
421
  setImmediate(() => {
549
422
  tickRetryLoop().catch(() => { /* logged inside */ });
550
423
  });
@@ -570,5 +443,4 @@ export const _BG_RETRY_INTERNAL = {
570
443
  MAX_DISPATCH_RETRIES,
571
444
  };
572
445
 
573
- // Silence unused-import warnings for helpers used transitively.
574
- void mkdirSync;
446
+ void mkdirSync;