@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,203 +0,0 @@
1
- /**
2
- * plugins/bizar/src/cline-runner.ts
3
- *
4
- * v5.5.1 — DEAD CODE stub.
5
- *
6
- * Background agents no longer run as `cline run` subprocesses. They
7
- * run as long-lived cline serve SDK sessions, managed by the
8
- * Bizar dashboard (`bizar-dash/src/server/bg-spawner.mjs`). The plugin
9
- * delegates to the dashboard via HTTP (`bg-spawn.ts`,
10
- * `bg-send-message.ts`, …) instead of spawning anything directly.
11
- *
12
- * This module is kept as a stub for two reasons:
13
- *
14
- * 1. `buildClineRunArgs` and the `SpawnAgentOptions` type are
15
- * still imported by `plugins/bizar/tests/tools/cline-runner.test.ts`
16
- * and serve as a regression pin for the argv layout that USED to
17
- * be passed to `Bun.spawn`. The test suite stays green because
18
- * the pure helpers are unchanged.
19
- *
20
- * 2. A handful of function names (`isAlive`, `killAgent`, …) are
21
- * imported elsewhere (`background.ts`) as a future-proofing hook.
22
- * We replace the implementations with no-op / error stubs so any
23
- * leftover call gets a clear, deliberate response instead of
24
- * silently succeeding.
25
- *
26
- * If something imports `spawnAgent`, it now gets back `{ ok: false,
27
- * error: "spawnAgent removed in v5.5.1" }`. This forces callers to the
28
- * dashboard path; nothing in the plugin should be calling this anymore.
29
- */
30
- import type { Subprocess } from "bun";
31
-
32
- export type AgentState =
33
- | "starting"
34
- | "running"
35
- | "paused"
36
- | "done"
37
- | "failed"
38
- | "killed";
39
-
40
- export interface AgentStatus {
41
- state: AgentState;
42
- sessionId?: string;
43
- processId: number;
44
- startedAt: number;
45
- endedAt?: number;
46
- exitCode?: number;
47
- error?: string;
48
- }
49
-
50
- export interface SpawnAgentOptions {
51
- /** The prompt to send. */
52
- prompt: string;
53
- /** Agent name (mimir, thor, …) — used as the session title prefix. */
54
- agent: string;
55
- /** Optional model override in "providerID/modelID" format. */
56
- model?: { providerID: string; modelID: string };
57
- /** Working directory for the cline run. */
58
- worktree: string;
59
- /** Absolute path to the log file (the LogWriter's output path). */
60
- logPath: string;
61
- /** Optional session title (defaults to `bgr:<agent>`). */
62
- title?: string;
63
- /** Extra env vars to pass through. */
64
- env?: Record<string, string>;
65
- /** How long to wait for the sessionId to appear in stderr (ms). */
66
- sessionIdTimeoutMs?: number;
67
- }
68
-
69
- export interface SpawnAgentResult {
70
- ok: boolean;
71
- sessionId?: string;
72
- processId?: number;
73
- error?: string;
74
- }
75
-
76
- type ExitCallback = (status: AgentStatus) => void;
77
-
78
- /**
79
- * v5.5.1 — Pure helper, UNCHANGED. Kept around so the regression test
80
- * that pins the argv layout still passes. (The argv used to be passed
81
- * to `Bun.spawn`; v5.5.1 no longer spawns anything, but the wire format
82
- * is a useful reference and may be reused if we ever revive subprocess
83
- * mode.)
84
- *
85
- * @param opts
86
- * @returns argv that USED to be passed to `Bun.spawn(["cline", "run", …])`
87
- */
88
- export function buildClineRunArgs(opts: SpawnAgentOptions): string[] {
89
- if (!opts.agent) {
90
- throw new Error("bizar_spawn_background: agent is required");
91
- }
92
- const args: string[] = [
93
- "cline",
94
- "run",
95
- "--dir", opts.worktree,
96
- "--print-logs",
97
- "--log-level", "INFO",
98
- "--title", opts.title || `bgr:${opts.agent}:${Date.now()}`,
99
- "--agent", opts.agent,
100
- ];
101
- if (opts.model) {
102
- args.push("--model", `${opts.model.providerID}/${opts.model.modelID}`);
103
- }
104
- args.push("--", opts.prompt);
105
- return args;
106
- }
107
-
108
- /**
109
- * v5.5.1 — STUB. Background agents run on the cline serve SDK,
110
- * not as `cline run` subprocesses. Returns an error directing the
111
- * caller to the dashboard HTTP API.
112
- *
113
- * The plugin's `bg-spawn.ts` no longer calls this; it's kept for any
114
- * late caller we missed.
115
- */
116
- export async function spawnAgent(_opts: SpawnAgentOptions): Promise<SpawnAgentResult> {
117
- return {
118
- ok: false,
119
- error:
120
- "spawnAgent removed in v5.5.1 — bg agents now run as cline serve sessions " +
121
- "managed by the Bizar dashboard. POST /api/background instead. " +
122
- "See plugins/bizar/src/tools/bg-spawn.ts.",
123
- };
124
- }
125
-
126
- /**
127
- * v5.5.1 — STUB. Returns null because there is no in-process subprocess
128
- * registry to look up.
129
- */
130
- export function getStatus(_processId: number): AgentStatus | null {
131
- return null;
132
- }
133
-
134
- /**
135
- * v5.5.1 — STUB. The real exit subscription lives on the dashboard side.
136
- * Returns a no-op unsubscribe.
137
- */
138
- export function onExit(_processId: number, _cb: ExitCallback): () => void {
139
- return () => undefined;
140
- }
141
-
142
- /**
143
- * v5.5.1 — STUB. Kill is now a dashboard-side operation
144
- * (`sdk.sessions.abort`). The plugin's `bg-kill.ts` posts to the
145
- * dashboard HTTP API; this function is here only as a fallback that
146
- * always reports "no such process tracked" so the dashboard's view of
147
- * the world is the source of truth.
148
- */
149
- export function killAgent(
150
- _processId: number,
151
- _signal: "SIGTERM" | "SIGKILL" = "SIGTERM",
152
- ): { ok: boolean; error?: string } {
153
- return { ok: true, error: "no_such_process_tracked_v5_5_1_use_dashboard_delete" };
154
- }
155
-
156
- /**
157
- * v5.5.1 — STUB. Pause is an output-pause at the dashboard side now.
158
- * The plugin's `bg-pause.ts` posts to the dashboard; this stub returns
159
- * `unsupported` so a leftover caller gets a clear signal.
160
- */
161
- export function pauseAgent(_processId: number): { ok: boolean; error?: string } {
162
- return { ok: false, error: "pause_via_dashboard_v5_5_1" };
163
- }
164
-
165
- /**
166
- * v5.5.1 — STUB. Same as `pauseAgent` — dashboard-side only.
167
- */
168
- export function resumeAgent(_processId: number): { ok: boolean; error?: string } {
169
- return { ok: false, error: "resume_via_dashboard_v5_5_1" };
170
- }
171
-
172
- /**
173
- * v5.5.1 — STUB. Returns false because there is no in-process PID
174
- * registry. Liveness is owned by the dashboard; the plugin's state
175
- * reconciliation code already uses this as a probe and falls back to
176
- * "fail closed" when the answer is false.
177
- */
178
- export function isAlive(processId: number): boolean {
179
- if (!Number.isFinite(processId) || processId <= 0) return false;
180
- return false;
181
- }
182
-
183
- /**
184
- * v5.5.1 — STUB. Returns an empty list — the runner registry is gone.
185
- */
186
- export function list(): AgentStatus[] {
187
- return [];
188
- }
189
-
190
- /**
191
- * v5.5.1 — STUB. Clears nothing (the registry is empty). Kept for the
192
- * test suite that imports it.
193
- */
194
- export function _resetForTests(): void {
195
- // no-op — the in-memory registry was removed.
196
- }
197
-
198
- /**
199
- * v5.5.1 — STUB. Returns an empty record because no agent is tracked
200
- * here. Provided so the module typechecks in callers that still reach
201
- * for a status record shape.
202
- */
203
- export type { Subprocess };
@@ -1,227 +0,0 @@
1
- /**
2
- * clineruntime.ts
3
- *
4
- * v6.0.0 — In-process ClineCore wrapper. Replaces the old ServeLifecycle
5
- * (subprocess spawn), HttpClient (HTTP), and EventStream (SSE) with a
6
- * single object that talks to ClineCore via direct function calls.
7
- *
8
- * Cline runs in-process now: there is no `cline serve` child, no port,
9
- * no password, no serve-info file. The plugin embeds ClineCore and uses
10
- * it directly.
11
- *
12
- * v6.0.1 — `startSession` accepts `execution` (passed straight into
13
- * Cline's `AgentExecutionConfig`) and an
14
- * `onConsecutiveMistakeLimitReached` recovery callback. The harness
15
- * also defaults `execution.maxConsecutiveMistakes` so the bundled CLI's
16
- * tight 3-strike abort does not kill sessions on the first malformed
17
- * tool call.
18
- *
19
- * Public surface:
20
- * - start() — boot ClineCore (idempotent)
21
- * - startSession(opts) — create a session; returns sessionId
22
- * - send(opts) — mid-flight prompt
23
- * - abort(opts) — abort a session
24
- * - subscribe(opts, cb) — events for a session; returns unsubscribe
25
- * - stop() — teardown
26
- */
27
-
28
- import type { ClineCore, CoreSessionEvent } from "@cline/core";
29
- import type {
30
- ConsecutiveMistakeLimitContext,
31
- ConsecutiveMistakeLimitDecision,
32
- } from "@cline/shared";
33
- import type { Logger } from "./logger.js";
34
-
35
- type ClineCoreLike = Pick<ClineCore, "start" | "send" | "abort" | "stop" | "subscribe" | "dispose">;
36
-
37
- export interface ClineRuntimeOptions {
38
- logger: Logger;
39
- clientName?: string;
40
- backendMode?: "auto" | "local" | "hub" | "remote";
41
- /**
42
- * Default `execution.maxConsecutiveMistakes` applied to every session
43
- * started by this runtime. Picked up from the plugin's normalized
44
- * options (see `options.ts`). Per-session overrides via
45
- * `StartSessionOpts.execution.maxConsecutiveMistakes` win.
46
- */
47
- defaultMaxConsecutiveMistakes?: number;
48
- /**
49
- * Recovery callback used for every session started by this runtime.
50
- * Built once at construction time (it is stateless) and applied
51
- * unless the caller overrides via
52
- * `StartSessionOpts.onConsecutiveMistakeLimitReached`. The harness
53
- * passes `buildMistakeRecovery({ onRecovery })` from
54
- * `mistake-recovery.ts` here so a single malformed tool call does
55
- * not abort the session.
56
- */
57
- defaultOnConsecutiveMistakeLimitReached?: (
58
- ctx: ConsecutiveMistakeLimitContext,
59
- ) => Promise<ConsecutiveMistakeLimitDecision> | ConsecutiveMistakeLimitDecision;
60
- }
61
-
62
- export interface StartSessionOpts {
63
- sessionId?: string;
64
- providerId: string;
65
- modelId: string;
66
- apiKey?: string;
67
- baseUrl?: string;
68
- workspaceRoot: string;
69
- systemPrompt?: string;
70
- prompt: string;
71
- sessionMetadata?: Record<string, unknown>;
72
- source?: string;
73
- /**
74
- * Forwarded to ClineCore as `config.execution`. If supplied, the
75
- * runtime overrides `execution.maxConsecutiveMistakes` with
76
- * `runtime.defaultMaxConsecutiveMistakes` *only* when the caller
77
- * didn't set it explicitly. Other fields (`reminderAfterIterations`,
78
- * `reminderText`, `loopDetection`) pass through as-is.
79
- */
80
- execution?: {
81
- maxConsecutiveMistakes?: number;
82
- reminderAfterIterations?: number;
83
- reminderText?: string;
84
- loopDetection?:
85
- | false
86
- | { softThreshold?: number; hardThreshold?: number };
87
- };
88
- /**
89
- * Forwarded to ClineCore as `config.onConsecutiveMistakeLimitReached`.
90
- * Used by `mistake-recovery.ts` to keep the session alive on
91
- * recoverable mistakes (`invalid_tool_call`, `tool_execution_failed`)
92
- * and stop on infra failures (`api_error`).
93
- */
94
- onConsecutiveMistakeLimitReached?: (
95
- ctx: ConsecutiveMistakeLimitContext,
96
- ) => Promise<ConsecutiveMistakeLimitDecision> | ConsecutiveMistakeLimitDecision;
97
- }
98
-
99
- export interface SendOpts { sessionId: string; prompt: string; }
100
- export interface AbortOpts { sessionId: string; reason?: string; }
101
- export interface SubscribeOpts { sessionId: string; }
102
-
103
- export type SessionEventHandler = (event: CoreSessionEvent) => void;
104
- export type UnsubscribeFn = () => void;
105
-
106
- export class ClineRuntime {
107
- private readonly logger: Logger;
108
- private readonly clientName: string;
109
- private readonly backendMode: "auto" | "local" | "hub" | "remote";
110
- private readonly defaultMaxConsecutiveMistakes?: number;
111
- private readonly defaultOnConsecutiveMistakeLimitReached?: (
112
- ctx: ConsecutiveMistakeLimitContext,
113
- ) => Promise<ConsecutiveMistakeLimitDecision> | ConsecutiveMistakeLimitDecision;
114
- private core: ClineCoreLike | null = null;
115
- private startingPromise: Promise<ClineCoreLike> | null = null;
116
-
117
- constructor(opts: ClineRuntimeOptions) {
118
- this.logger = opts.logger;
119
- this.clientName = opts.clientName ?? "bizar-plugin";
120
- this.backendMode = opts.backendMode ?? "local";
121
- if (typeof opts.defaultMaxConsecutiveMistakes === "number" && Number.isFinite(opts.defaultMaxConsecutiveMistakes)) {
122
- this.defaultMaxConsecutiveMistakes = Math.max(3, Math.floor(opts.defaultMaxConsecutiveMistakes));
123
- }
124
- if (typeof opts.defaultOnConsecutiveMistakeLimitReached === "function") {
125
- this.defaultOnConsecutiveMistakeLimitReached = opts.defaultOnConsecutiveMistakeLimitReached;
126
- }
127
- }
128
-
129
- async start(): Promise<void> {
130
- if (this.core) return;
131
- if (this.startingPromise) { await this.startingPromise; return; }
132
- this.startingPromise = (async () => {
133
- const cline = await import("@cline/core");
134
- const core = await cline.ClineCore.create({ clientName: this.clientName, backendMode: this.backendMode });
135
- this.core = core;
136
- this.logger.info(`bizar: ClineCore ready (clientName=${this.clientName}, backend=${this.backendMode})`);
137
- return core;
138
- })();
139
- try { await this.startingPromise; } finally { this.startingPromise = null; }
140
- }
141
-
142
- private async ensure(): Promise<ClineCoreLike> {
143
- if (this.core) return this.core;
144
- await this.start();
145
- if (!this.core) throw new Error("clineruntime: ClineCore failed to start");
146
- return this.core;
147
- }
148
-
149
- async startSession(opts: StartSessionOpts): Promise<string> {
150
- const core = await this.ensure();
151
- const execution = this.buildExecution(opts.execution);
152
- const recovery = opts.onConsecutiveMistakeLimitReached
153
- ?? this.defaultOnConsecutiveMistakeLimitReached;
154
- const config: Parameters<ClineCore["start"]>[0]["config"] = {
155
- providerId: opts.providerId,
156
- modelId: opts.modelId,
157
- apiKey: opts.apiKey,
158
- baseUrl: opts.baseUrl,
159
- systemPrompt: opts.systemPrompt ?? "",
160
- workspaceRoot: opts.workspaceRoot,
161
- cwd: opts.workspaceRoot,
162
- enableTools: true,
163
- enableSpawnAgent: true,
164
- enableAgentTeams: true,
165
- ...(execution ? { execution } : {}),
166
- ...(recovery ? { onConsecutiveMistakeLimitReached: recovery } : {}),
167
- };
168
- const started = await core.start({
169
- config: config as Parameters<ClineCore["start"]>[0]["config"],
170
- prompt: opts.prompt,
171
- source: opts.source,
172
- sessionMetadata: opts.sessionMetadata,
173
- ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
174
- });
175
- return started.sessionId;
176
- }
177
-
178
- /**
179
- * Merge caller's `execution` block with the runtime default
180
- * (`defaultMaxConsecutiveMistakes`).
181
- *
182
- * v6.2.4 — Plugin's defaultMaxConsecutiveMistakes is now a FLOOR,
183
- * not a default. The Cline CLI's `--retries` flag defaults to 3
184
- * and previously silently overrode our 6 (or higher) — leading
185
- * to premature session aborts after just 3 tool errors. Now we
186
- * use Math.max(plugin_default, caller_value) so the user can
187
- * still raise the limit with `--retries 15`, but the plugin's
188
- * higher default is honored on plain `cline` invocations.
189
- *
190
- * Returns `undefined` when neither is set, so the optional field
191
- * stays out of the config payload.
192
- */
193
- private buildExecution(
194
- callerExecution: StartSessionOpts["execution"],
195
- ): StartSessionOpts["execution"] | undefined {
196
- if (!callerExecution && this.defaultMaxConsecutiveMistakes === undefined) return undefined;
197
- const callerMax = callerExecution?.maxConsecutiveMistakes;
198
- const pluginMax = this.defaultMaxConsecutiveMistakes;
199
- const max =
200
- callerMax !== undefined && pluginMax !== undefined
201
- ? Math.max(callerMax, pluginMax)
202
- : callerMax ?? pluginMax;
203
- return { ...callerExecution, ...(max !== undefined ? { maxConsecutiveMistakes: max } : {}) };
204
- }
205
-
206
- async send(opts: SendOpts): Promise<void> {
207
- const core = await this.ensure();
208
- await (core.send as unknown as (input: { sessionId: string; prompt: string }) => Promise<unknown>)({ sessionId: opts.sessionId, prompt: opts.prompt });
209
- }
210
-
211
- async abort(opts: AbortOpts): Promise<void> {
212
- const core = await this.ensure();
213
- await core.abort(opts.sessionId, opts.reason);
214
- }
215
-
216
- subscribe(opts: SubscribeOpts, handler: SessionEventHandler): UnsubscribeFn {
217
- if (!this.core) throw new Error("clineruntime: subscribe() called before start()");
218
- return (this.core.subscribe as (l: SessionEventHandler, o?: SubscribeOpts) => UnsubscribeFn)(handler, opts);
219
- }
220
-
221
- async stop(): Promise<void> {
222
- if (!this.core) return;
223
- try { await this.core.dispose(); }
224
- catch (err) { this.logger.warn(`bizar: ClineCore.dispose failed: ${err instanceof Error ? err.message : String(err)}`); }
225
- this.core = null;
226
- }
227
- }
@@ -1,151 +0,0 @@
1
- /**
2
- * commands-impl.ts
3
- *
4
- * v0.5.0 — Side-effect executor for slash commands.
5
- *
6
- * Phase 2 (Cline SDK port) — replaces OpenCode's ToolContext and
7
- * ToolDefinition with Cline's AgentToolContext and AgentTool.
8
- *
9
- * The `commands.ts` module is a pure parser: given a user message, it
10
- * returns a `SlashCommandResult` describing what the chat hook should
11
- * do. This module implements the "do" half:
12
- *
13
- * - `executeSideEffect` — dispatches `create_plan`,
14
- * `list_plans`, `open_plan_url`, and `tool_invocation` to the
15
- * right handler.
16
- * - `executeToolInvocation` — builds a synthetic `AgentToolContext`,
17
- * pre-validates args against the tool's Zod schema, and invokes
18
- * the tool's `execute()` directly.
19
- * - `buildSyntheticToolContext` — constructs the `AgentToolContext`
20
- * shape Cline's tool framework requires.
21
- * - `validateToolArgs` — wraps the tool's inputSchema into
22
- * a `z.object(...)` and runs `safeParse`.
23
- */
24
-
25
- import { z } from "zod";
26
- import type { AgentTool, AgentToolContext } from "@cline/sdk";
27
-
28
- import type { Logger } from "./logger.js";
29
- import type { DefaultTemplate } from "./settings.js";
30
- import type { SideEffect } from "./commands.js";
31
- import { createPlan as fsCreatePlan, listPlans as fsListPlans } from "./plan-fs.js";
32
-
33
- export interface ExecutorContext {
34
- worktree: string;
35
- directory: string;
36
- logger: Logger;
37
- }
38
-
39
- export interface ExecuteOptions {
40
- tools: Record<string, AgentTool>;
41
- defaultTemplate: DefaultTemplate;
42
- defaultPort: number;
43
- }
44
-
45
- export interface ExecuteResult {
46
- responseOverride?: string;
47
- responseSuffix?: string;
48
- }
49
-
50
- export async function executeSideEffect(sideEffect: SideEffect, ctx: ExecutorContext, opts: ExecuteOptions): Promise<ExecuteResult> {
51
- try {
52
- switch (sideEffect.kind) {
53
- case "create_plan": return await executeCreatePlan(sideEffect, ctx, opts);
54
- case "list_plans": return await executeListPlans(sideEffect, ctx, opts);
55
- case "open_plan_url": return await executeOpenPlanUrl(sideEffect, ctx, opts);
56
- case "launch_dashboard": return await executeLaunchDashboard(sideEffect, ctx, opts);
57
- case "tool_invocation": return await executeToolInvocation(sideEffect, ctx, opts);
58
- default: {
59
- const _exhaustive: never = sideEffect;
60
- return { responseOverride: `Unknown side-effect: ${String(_exhaustive)}` };
61
- }
62
- }
63
- } catch (err: unknown) {
64
- const msg = err instanceof Error ? err.message : String(err);
65
- ctx.logger.warn(`bizar: executeSideEffect crashed: ${msg}`);
66
- return { responseOverride: `Command failed: ${msg}` };
67
- }
68
- }
69
-
70
- async function executeCreatePlan(sideEffect: Extract<SideEffect, { kind: "create_plan" }>, ctx: ExecutorContext, opts: ExecuteOptions): Promise<ExecuteResult> {
71
- const template = sideEffect.template ?? opts.defaultTemplate;
72
- try {
73
- const result = await fsCreatePlan(ctx.worktree, sideEffect.slug, { template, logger: ctx.logger });
74
- if (!result.ok) return { responseOverride: `Failed to create plan: ${result.error}` };
75
- return { responseOverride: `Created plan "${sideEffect.slug}" using the "${template}" template.` };
76
- } catch (err: unknown) {
77
- const msg = err instanceof Error ? err.message : String(err);
78
- return { responseOverride: `Failed to create plan: ${msg}` };
79
- }
80
- }
81
-
82
- async function executeListPlans(_sideEffect: Extract<SideEffect, { kind: "list_plans" }>, ctx: ExecutorContext, _opts: ExecuteOptions): Promise<ExecuteResult> {
83
- try {
84
- const plans = await fsListPlans(ctx.worktree, ctx.logger);
85
- if (plans.length === 0) return { responseOverride: "No plans found. Use /plan create <slug> to start one." };
86
- const lines = plans.map((p) => `- ${p.slug} [${p.status ?? "draft"}] — ${p.slug}`);
87
- return { responseOverride: `Plans (${plans.length}):\n${lines.join("\n")}` };
88
- } catch (err: unknown) {
89
- const msg = err instanceof Error ? err.message : String(err);
90
- return { responseOverride: `Failed to list plans: ${msg}` };
91
- }
92
- }
93
-
94
- async function executeLaunchDashboard(sideEffect: Extract<SideEffect, { kind: "launch_dashboard" }>, _ctx: ExecutorContext, _opts: ExecuteOptions): Promise<ExecuteResult> {
95
- return { responseOverride: `Launch dashboard at http://127.0.0.1:${sideEffect.defaultPort}/` };
96
- }
97
-
98
- async function executeOpenPlanUrl(sideEffect: Extract<SideEffect, { kind: "open_plan_url" }>, _ctx: ExecutorContext, opts: ExecuteOptions): Promise<ExecuteResult> {
99
- return { responseOverride: `Open plan: http://127.0.0.1:${opts.defaultPort}/plans/${sideEffect.slug}` };
100
- }
101
-
102
- export async function executeToolInvocation(sideEffect: Extract<SideEffect, { kind: "tool_invocation" }>, ctx: ExecutorContext, opts: ExecuteOptions): Promise<ExecuteResult> {
103
- const { toolName, args } = sideEffect;
104
- const tool = opts.tools[toolName];
105
- if (tool === undefined) {
106
- const known = Object.keys(opts.tools).sort().join(", ");
107
- return { responseOverride: `Tool "${toolName}" is not registered in this plugin. Available tools: ${known || "(none)"}.` };
108
- }
109
- const validation = validateToolArgs(tool, args);
110
- if (!validation.ok) return { responseOverride: `Invalid arguments for ${toolName}: ${validation.error}` };
111
- const syntheticCtx = buildSyntheticToolContext(ctx);
112
- try {
113
- const result = await tool.execute(validation.args, syntheticCtx);
114
- return { responseOverride: stringifyToolResult(result) };
115
- } catch (err: unknown) {
116
- const msg = err instanceof Error ? err.message : String(err);
117
- ctx.logger.warn(`bizar: tool ${toolName} crashed: ${msg}`);
118
- return { responseOverride: `Tool ${toolName} failed: ${msg}` };
119
- }
120
- }
121
-
122
- export function buildSyntheticToolContext(ctx: ExecutorContext): AgentToolContext {
123
- return { agentId: "slash-command", sessionId: "slash-command", runId: `slash-command-${Date.now()}`, iteration: 0, signal: new AbortController().signal, metadata: { worktree: ctx.worktree, directory: ctx.directory, parentAgent: "" } } as unknown as AgentToolContext;
124
- }
125
-
126
- export function validateToolArgs(tool: AgentTool, args: unknown): { ok: true; args: Record<string, unknown> } | { ok: false; error: string } {
127
- try {
128
- const rawShape = (tool.inputSchema ?? {}) as z.ZodRawShape;
129
- const schema = z.object(rawShape);
130
- const result = schema.safeParse(args);
131
- if (result.success) return { ok: true, args: result.data as Record<string, unknown> };
132
- const first = result.error.issues[0];
133
- const where = first?.path && first.path.length > 0 ? first.path.join(".") : "(root)";
134
- return { ok: false, error: `${where}: ${first?.message ?? "validation failed"}` };
135
- } catch (err: unknown) {
136
- const msg = err instanceof Error ? err.message : String(err);
137
- return { ok: false, error: `schema error: ${msg}` };
138
- }
139
- }
140
-
141
- function stringifyToolResult(result: unknown): string {
142
- if (typeof result === "string") return result;
143
- if (result === null || result === undefined) return "";
144
- const r = result as { output?: unknown };
145
- if (r && typeof r === "object" && "output" in r) {
146
- if (typeof r.output === "string") return r.output;
147
- try { return JSON.stringify(r.output, null, 2); } catch { return String(r.output); }
148
- }
149
- if (typeof result === "object") { try { return JSON.stringify(result, null, 2); } catch { return String(result); } }
150
- return String(result);
151
- }