@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
@@ -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;