@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,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
- }