@polderlabs/bizar 6.2.5 → 7.0.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 (540) 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/hooks/worker-suggest.mjs +110 -0
  41. package/.claude/settings.json +125 -0
  42. package/.claude/skills/9router/SKILL.md +80 -0
  43. package/.claude/skills/9router-chat/SKILL.md +73 -0
  44. package/.claude/skills/9router-embeddings/SKILL.md +69 -0
  45. package/.claude/skills/9router-image/SKILL.md +86 -0
  46. package/.claude/skills/9router-stt/SKILL.md +79 -0
  47. package/.claude/skills/9router-tts/SKILL.md +80 -0
  48. package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
  49. package/.claude/skills/9router-web-search/SKILL.md +91 -0
  50. package/.claude/skills/bizar/README.md +9 -0
  51. package/.claude/skills/bizar/SKILL.md +450 -0
  52. package/.claude/skills/cpp-coding-standards/README.md +28 -0
  53. package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
  54. package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
  55. package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
  56. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
  57. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
  58. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
  59. package/.claude/skills/cpp-testing/README.md +28 -0
  60. package/.claude/skills/cpp-testing/SKILL.md +304 -0
  61. package/.claude/skills/cpp-testing/references/coverage.md +370 -0
  62. package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
  63. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
  64. package/.claude/skills/cpp-testing/references/mocking.md +364 -0
  65. package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
  66. package/.claude/skills/cubesandbox/SKILL.md +148 -0
  67. package/.claude/skills/embedded-esp-idf/README.md +41 -0
  68. package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
  69. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
  70. package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
  71. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
  72. package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
  73. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
  74. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
  75. package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
  76. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
  77. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
  78. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
  79. package/.claude/skills/glyph/SKILL.md +163 -0
  80. package/.claude/skills/harness-engineering/SKILL.md +143 -0
  81. package/.claude/skills/lightrag/SKILL.md +81 -0
  82. package/.claude/skills/memory-protocol/SKILL.md +105 -0
  83. package/.claude/skills/obsidian/SKILL.md +306 -0
  84. package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
  85. package/.claude/skills/self-improvement/SKILL.md +64 -0
  86. package/README.md +87 -59
  87. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js → EnvVarsSection-CW6fWKds.js} +3 -3
  88. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js.map → EnvVarsSection-CW6fWKds.js.map} +1 -1
  89. package/bizar-dash/dist/assets/MobileChat-D7zRhU9K.js +1 -0
  90. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js.map → MobileChat-D7zRhU9K.js.map} +1 -1
  91. package/bizar-dash/dist/assets/MobileSettings-K-sNsn_r.js +1 -0
  92. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js.map → MobileSettings-K-sNsn_r.js.map} +1 -1
  93. package/bizar-dash/dist/assets/{Toast-Cpl6-E63.js → Toast-WTxc3m2g.js} +1 -1
  94. package/bizar-dash/dist/assets/{Toast-Cpl6-E63.js.map → Toast-WTxc3m2g.js.map} +1 -1
  95. package/bizar-dash/dist/assets/flow-BpU0-gK2.js +1 -0
  96. package/bizar-dash/dist/assets/flow-BpU0-gK2.js.map +1 -0
  97. package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js +1 -0
  98. package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js.map +1 -0
  99. package/bizar-dash/dist/assets/{icons-Do5N2jmX.js → icons-B0AKnYI3.js} +98 -103
  100. package/bizar-dash/dist/assets/icons-B0AKnYI3.js.map +1 -0
  101. package/bizar-dash/dist/assets/main-C-Md3DaY.css +1 -0
  102. package/bizar-dash/dist/assets/main-CO8fIxQK.js +18 -0
  103. package/bizar-dash/dist/assets/main-CO8fIxQK.js.map +1 -0
  104. package/bizar-dash/dist/assets/markdown-w2bDDkAH.js +1 -0
  105. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js.map → markdown-w2bDDkAH.js.map} +1 -1
  106. package/bizar-dash/dist/assets/mobile-DXYCA0hC.js +1 -0
  107. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js.map → mobile-DXYCA0hC.js.map} +1 -1
  108. package/bizar-dash/dist/assets/mobile-layout-DSmtNPja.js +2 -0
  109. package/bizar-dash/dist/assets/mobile-layout-DSmtNPja.js.map +1 -0
  110. package/bizar-dash/dist/assets/react-vendor-BnuhLJ6X.css +1 -0
  111. package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js +46 -0
  112. package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js.map +1 -0
  113. package/bizar-dash/dist/assets/useSlashCommands-3DFLOfpk.js +2 -0
  114. package/bizar-dash/dist/assets/useSlashCommands-3DFLOfpk.js.map +1 -0
  115. package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js +45 -0
  116. package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js.map +1 -0
  117. package/bizar-dash/dist/index.html +12 -10
  118. package/bizar-dash/dist/mobile.html +7 -4
  119. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  120. package/bizar-dash/src/server/api.mjs +15 -4
  121. package/bizar-dash/src/server/background-store.mjs +15 -16
  122. package/bizar-dash/src/server/bg-poller.mjs +25 -35
  123. package/bizar-dash/src/server/bg-retry.mjs +66 -194
  124. package/bizar-dash/src/server/claude-bg-spawner.mjs +390 -0
  125. package/bizar-dash/src/server/claude-info.mjs +412 -0
  126. package/bizar-dash/src/server/{cline-runner.mjs → claude-runner.mjs} +53 -48
  127. package/bizar-dash/src/server/claude-sdk.mjs +191 -0
  128. package/bizar-dash/src/server/memory-consolidator.mjs +218 -0
  129. package/bizar-dash/src/server/memory-distillation.mjs +296 -0
  130. package/bizar-dash/src/server/providers-store.mjs +22 -49
  131. package/bizar-dash/src/server/routes/background.mjs +24 -20
  132. package/bizar-dash/src/server/routes/chat.mjs +223 -326
  133. package/bizar-dash/src/server/routes/claude-session-detail.mjs +329 -0
  134. package/bizar-dash/src/server/routes/claude-sessions.mjs +259 -0
  135. package/bizar-dash/src/server/routes/distill.mjs +129 -0
  136. package/bizar-dash/src/server/routes/goal-planner.mjs +236 -0
  137. package/bizar-dash/src/server/routes/tasks.mjs +20 -28
  138. package/bizar-dash/src/server/task-delegator.mjs +76 -77
  139. package/bizar-dash/src/web/App.tsx +4 -0
  140. package/bizar-dash/src/web/components/Tag.tsx +18 -5
  141. package/bizar-dash/src/web/components/Topbar.tsx +3 -0
  142. package/bizar-dash/src/web/components/agents/CommunicationLog.tsx +126 -0
  143. package/bizar-dash/src/web/components/agents/DependencyGraph.tsx +163 -0
  144. package/bizar-dash/src/web/components/agents/QualityGates.tsx +123 -0
  145. package/bizar-dash/src/web/components/agents/RealTimeEventLog.tsx +127 -0
  146. package/bizar-dash/src/web/components/agents/RoutingDecisions.test.tsx +148 -0
  147. package/bizar-dash/src/web/components/agents/RoutingDecisions.tsx +160 -0
  148. package/bizar-dash/src/web/components/chat/useChat.ts +23 -27
  149. package/bizar-dash/src/web/components/goals/GoalInput.tsx +86 -0
  150. package/bizar-dash/src/web/components/goals/PlanVisualization.tsx +111 -0
  151. package/bizar-dash/src/web/lib/goapPlanner.ts +614 -0
  152. package/bizar-dash/src/web/lib/types.ts +25 -0
  153. package/bizar-dash/src/web/styles/agents-redesign.css +311 -0
  154. package/bizar-dash/src/web/styles/main.css +251 -0
  155. package/bizar-dash/src/web/styles/tasks-redesign.css +231 -0
  156. package/bizar-dash/src/web/ui/controls/Button.tsx +77 -0
  157. package/bizar-dash/src/web/ui/controls/Checkbox.tsx +95 -0
  158. package/bizar-dash/src/web/ui/controls/IconButton.tsx +66 -0
  159. package/bizar-dash/src/web/ui/controls/Kbd.tsx +24 -0
  160. package/bizar-dash/src/web/ui/controls/NumberInput.tsx +77 -0
  161. package/bizar-dash/src/web/ui/controls/RadioGroup.tsx +109 -0
  162. package/bizar-dash/src/web/ui/controls/SearchInput.tsx +91 -0
  163. package/bizar-dash/src/web/ui/controls/Select.tsx +92 -0
  164. package/bizar-dash/src/web/ui/controls/Slider.tsx +70 -0
  165. package/bizar-dash/src/web/ui/controls/TextInput.tsx +67 -0
  166. package/bizar-dash/src/web/ui/controls/Toggle.tsx +79 -0
  167. package/bizar-dash/src/web/ui/controls/controls.css +454 -0
  168. package/bizar-dash/src/web/ui/controls/index.ts +33 -0
  169. package/bizar-dash/src/web/ui/data/BarChart.tsx +60 -0
  170. package/bizar-dash/src/web/ui/data/DataTable.tsx +216 -0
  171. package/bizar-dash/src/web/ui/data/EmptyState.tsx +60 -0
  172. package/bizar-dash/src/web/ui/data/ErrorState.tsx +56 -0
  173. package/bizar-dash/src/web/ui/data/KeyValueList.tsx +106 -0
  174. package/bizar-dash/src/web/ui/data/LoadingState.tsx +65 -0
  175. package/bizar-dash/src/web/ui/data/Sparkline.tsx +87 -0
  176. package/bizar-dash/src/web/ui/data/StatTile.tsx +87 -0
  177. package/bizar-dash/src/web/ui/data/data.css +535 -0
  178. package/bizar-dash/src/web/ui/data/index.ts +31 -0
  179. package/bizar-dash/src/web/ui/feedback/Badge.tsx +49 -0
  180. package/bizar-dash/src/web/ui/feedback/Dialog.tsx +209 -0
  181. package/bizar-dash/src/web/ui/feedback/ProgressBar.tsx +69 -0
  182. package/bizar-dash/src/web/ui/feedback/StatusDot.tsx +50 -0
  183. package/bizar-dash/src/web/ui/feedback/Toast.tsx +200 -0
  184. package/bizar-dash/src/web/ui/feedback/Tooltip.tsx +126 -0
  185. package/bizar-dash/src/web/ui/feedback/feedback.css +314 -0
  186. package/bizar-dash/src/web/ui/feedback/index.ts +43 -0
  187. package/bizar-dash/src/web/ui/index.ts +56 -0
  188. package/bizar-dash/src/web/ui/layout/AppShell.tsx +51 -0
  189. package/bizar-dash/src/web/ui/layout/Breadcrumbs.tsx +97 -0
  190. package/bizar-dash/src/web/ui/layout/Panel.tsx +73 -0
  191. package/bizar-dash/src/web/ui/layout/PanelHeader.tsx +39 -0
  192. package/bizar-dash/src/web/ui/layout/Sidebar.tsx +131 -0
  193. package/bizar-dash/src/web/ui/layout/Tabs.tsx +133 -0
  194. package/bizar-dash/src/web/ui/layout/Topbar.tsx +42 -0
  195. package/bizar-dash/src/web/ui/layout/index.ts +33 -0
  196. package/bizar-dash/src/web/ui/layout/layout.css +413 -0
  197. package/bizar-dash/src/web/ui/navigation/CommandPalette.tsx +199 -0
  198. package/bizar-dash/src/web/ui/navigation/NavGroup.tsx +95 -0
  199. package/bizar-dash/src/web/ui/navigation/NavLink.tsx +93 -0
  200. package/bizar-dash/src/web/ui/navigation/index.ts +17 -0
  201. package/bizar-dash/src/web/ui/navigation/navigation.css +343 -0
  202. package/bizar-dash/src/web/ui/primitives/Box.tsx +91 -0
  203. package/bizar-dash/src/web/ui/primitives/Grid.tsx +49 -0
  204. package/bizar-dash/src/web/ui/primitives/Inline.tsx +55 -0
  205. package/bizar-dash/src/web/ui/primitives/Separator.tsx +46 -0
  206. package/bizar-dash/src/web/ui/primitives/Stack.tsx +54 -0
  207. package/bizar-dash/src/web/ui/primitives/VisuallyHidden.tsx +26 -0
  208. package/bizar-dash/src/web/ui/primitives/index.ts +23 -0
  209. package/bizar-dash/src/web/ui/primitives/primitives.css +183 -0
  210. package/bizar-dash/src/web/ui/styles/globals.css +86 -0
  211. package/bizar-dash/src/web/ui/styles/reset.css +125 -0
  212. package/bizar-dash/src/web/ui/styles/tokens.css +195 -0
  213. package/bizar-dash/src/web/ui/theme/ThemeProvider.tsx +142 -0
  214. package/bizar-dash/src/web/ui/theme/tokens.ts +131 -0
  215. package/bizar-dash/src/web/ui/theme/useTheme.ts +22 -0
  216. package/bizar-dash/src/web/ui/utils/cx.ts +42 -0
  217. package/bizar-dash/src/web/views/Agents.tsx +506 -266
  218. package/bizar-dash/src/web/views/Chat.tsx +8 -8
  219. package/bizar-dash/src/web/views/GoalPlanner.tsx +158 -0
  220. package/bizar-dash/src/web/views/Overview.tsx +996 -448
  221. package/bizar-dash/src/web/views/Tasks.tsx +277 -273
  222. package/bizar-dash/tests/communication-log.test.tsx +67 -0
  223. package/bizar-dash/tests/dep-graph.test.tsx +40 -0
  224. package/bizar-dash/tests/event-log.test.tsx +61 -0
  225. package/bizar-dash/tests/goal-input.test.tsx +72 -0
  226. package/bizar-dash/tests/goap-planner.test.ts +68 -0
  227. package/bizar-dash/tests/quality-gates.test.tsx +59 -0
  228. package/bizar-dash/tests/setup.ts +31 -1
  229. package/bizar-dash/tests/ui/controls/Button.test.tsx +50 -0
  230. package/bizar-dash/tests/ui/controls/Checkbox.test.tsx +44 -0
  231. package/bizar-dash/tests/ui/controls/IconButton.test.tsx +37 -0
  232. package/bizar-dash/tests/ui/controls/Kbd.test.tsx +39 -0
  233. package/bizar-dash/tests/ui/controls/NumberInput.test.tsx +56 -0
  234. package/bizar-dash/tests/ui/controls/RadioGroup.test.tsx +58 -0
  235. package/bizar-dash/tests/ui/controls/SearchInput.test.tsx +52 -0
  236. package/bizar-dash/tests/ui/controls/Select.test.tsx +66 -0
  237. package/bizar-dash/tests/ui/controls/Slider.test.tsx +41 -0
  238. package/bizar-dash/tests/ui/controls/TextInput.test.tsx +44 -0
  239. package/bizar-dash/tests/ui/controls/Toggle.test.tsx +39 -0
  240. package/bizar-dash/tests/ui/data/BarChart.test.tsx +55 -0
  241. package/bizar-dash/tests/ui/data/DataTable.test.tsx +112 -0
  242. package/bizar-dash/tests/ui/data/EmptyState.test.tsx +57 -0
  243. package/bizar-dash/tests/ui/data/ErrorState.test.tsx +47 -0
  244. package/bizar-dash/tests/ui/data/KeyValueList.test.tsx +59 -0
  245. package/bizar-dash/tests/ui/data/LoadingState.test.tsx +37 -0
  246. package/bizar-dash/tests/ui/data/Sparkline.test.tsx +56 -0
  247. package/bizar-dash/tests/ui/data/StatTile.test.tsx +69 -0
  248. package/bizar-dash/tests/ui/feedback/Badge.test.tsx +41 -0
  249. package/bizar-dash/tests/ui/feedback/Dialog.test.tsx +99 -0
  250. package/bizar-dash/tests/ui/feedback/ProgressBar.test.tsx +66 -0
  251. package/bizar-dash/tests/ui/feedback/StatusDot.test.tsx +41 -0
  252. package/bizar-dash/tests/ui/feedback/Toast.test.tsx +124 -0
  253. package/bizar-dash/tests/ui/feedback/Tooltip.test.tsx +102 -0
  254. package/bizar-dash/tests/ui/layout/AppShell.test.tsx +50 -0
  255. package/bizar-dash/tests/ui/layout/Breadcrumbs.test.tsx +85 -0
  256. package/bizar-dash/tests/ui/layout/Panel.test.tsx +52 -0
  257. package/bizar-dash/tests/ui/layout/PanelHeader.test.tsx +32 -0
  258. package/bizar-dash/tests/ui/layout/Sidebar.test.tsx +95 -0
  259. package/bizar-dash/tests/ui/layout/Tabs.test.tsx +87 -0
  260. package/bizar-dash/tests/ui/layout/Topbar.test.tsx +41 -0
  261. package/bizar-dash/tests/ui/navigation/CommandPalette.test.tsx +105 -0
  262. package/bizar-dash/tests/ui/navigation/NavGroup.test.tsx +55 -0
  263. package/bizar-dash/tests/ui/navigation/NavLink.test.tsx +61 -0
  264. package/bizar-dash/tests/ui/primitives/Box.test.tsx +49 -0
  265. package/bizar-dash/tests/ui/primitives/Grid.test.tsx +37 -0
  266. package/bizar-dash/tests/ui/primitives/Inline.test.tsx +33 -0
  267. package/bizar-dash/tests/ui/primitives/Separator.test.tsx +34 -0
  268. package/bizar-dash/tests/ui/primitives/Stack.test.tsx +45 -0
  269. package/bizar-dash/tests/ui/primitives/VisuallyHidden.test.tsx +27 -0
  270. package/bizar-dash/tests/views/Agents.test.tsx +359 -0
  271. package/bizar-dash/tests/views/Overview.test.tsx +413 -0
  272. package/bizar-dash/tests/views/Tasks.test.tsx +250 -0
  273. package/bizar-dash/vitest.config.ts +3 -1
  274. package/cli/__tests__/cost-gate.test.mjs +301 -0
  275. package/cli/__tests__/feature-list-bridge.test.mjs +371 -0
  276. package/cli/bin.mjs +55 -18
  277. package/cli/commands/claim.mjs +282 -0
  278. package/cli/commands/claude-cmd.mjs +348 -0
  279. package/cli/commands/cost.mjs +279 -0
  280. package/cli/commands/install.mjs +12 -11
  281. package/cli/commands/validate.mjs +252 -325
  282. package/cli/cost-gate.mjs +501 -0
  283. package/cli/dev-link.test.mjs +11 -11
  284. package/cli/doctor.mjs +131 -213
  285. package/cli/feature-list-bridge.mjs +400 -0
  286. package/cli/install.mjs +33 -37
  287. package/cli/install.test.mjs +9 -9
  288. package/cli/memory-constants.mjs +17 -0
  289. package/cli/provision-claude.mjs +893 -0
  290. package/cli/provision.mjs +224 -227
  291. package/cli/utils.mjs +72 -58
  292. package/cli/worker-dispatcher.mjs +259 -0
  293. package/cli/worker-dispatcher.test.mjs +204 -0
  294. package/config/AGENTS.md +28 -28
  295. package/config/trigger-patterns.json +186 -0
  296. package/install.sh +66 -44
  297. package/package.json +19 -11
  298. package/packages/sdk/ARCHITECTURE.md +40 -36
  299. package/packages/sdk/package.json +15 -5
  300. package/packages/sdk/src/agent-registry.ts +304 -0
  301. package/packages/sdk/src/consensus/byzantine.ts +587 -0
  302. package/packages/sdk/src/consensus/index.ts +147 -0
  303. package/packages/sdk/src/consensus/queen.ts +173 -0
  304. package/packages/sdk/src/consensus/types.ts +199 -0
  305. package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
  306. package/packages/sdk/src/federation/audit.ts +156 -0
  307. package/packages/sdk/src/federation/budget.ts +269 -0
  308. package/packages/sdk/src/federation/envelope.ts +144 -0
  309. package/packages/sdk/src/federation/hmac.ts +160 -0
  310. package/packages/sdk/src/federation/index.ts +443 -0
  311. package/packages/sdk/src/federation/pii.ts +241 -0
  312. package/packages/sdk/src/federation/policy.ts +112 -0
  313. package/packages/sdk/src/federation/trust.ts +146 -0
  314. package/packages/sdk/src/fingerprint.ts +0 -0
  315. package/packages/sdk/src/index.ts +101 -69
  316. package/packages/sdk/src/mcp/bin.ts +51 -0
  317. package/packages/sdk/src/mcp/server.ts +848 -0
  318. package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
  319. package/packages/sdk/src/router/codemod-intent.ts +125 -0
  320. package/packages/sdk/src/router/index.ts +247 -0
  321. package/packages/sdk/src/router/memory-distillation-shim.mjs +18 -0
  322. package/packages/sdk/src/router/memory-distillation.ts +249 -0
  323. package/packages/sdk/src/router/model-router.ts +235 -0
  324. package/packages/sdk/src/router/q-learning-router.ts +304 -0
  325. package/packages/sdk/src/swarm-topology.ts +279 -0
  326. package/packages/sdk/tests/agent-registry.test.ts +285 -0
  327. package/packages/sdk/tests/consensus.test.ts +376 -0
  328. package/packages/sdk/tests/federation/audit.test.ts +164 -0
  329. package/packages/sdk/tests/federation/budget.test.ts +189 -0
  330. package/packages/sdk/tests/federation/envelope.test.ts +120 -0
  331. package/packages/sdk/tests/federation/hmac.test.ts +194 -0
  332. package/packages/sdk/tests/federation/orchestrator.test.ts +176 -0
  333. package/packages/sdk/tests/federation/pii.test.ts +106 -0
  334. package/packages/sdk/tests/federation/policy.test.ts +140 -0
  335. package/packages/sdk/tests/federation/trust.test.ts +124 -0
  336. package/packages/sdk/tests/mcp-tools.test.ts +204 -0
  337. package/packages/sdk/tests/memory-distillation.test.mjs +186 -0
  338. package/packages/sdk/tests/model-router.test.mjs +108 -0
  339. package/packages/sdk/tests/q-learning-router.test.mjs +100 -0
  340. package/packages/sdk/tests/router-orchestrator.test.mjs +172 -0
  341. package/packages/sdk/tests/router.test.mjs +91 -0
  342. package/packages/sdk/tests/sdk.test.mjs +172 -0
  343. package/packages/sdk/tests/swarm-topology.test.ts +258 -0
  344. package/packages/sdk/vitest.config.ts +1 -1
  345. package/scripts/bh-full-e2e.mjs +167 -368
  346. package/scripts/check-deps.mjs +28 -46
  347. package/scripts/mirror-claude-md.sh +78 -0
  348. package/scripts/test-in-container.sh +31 -9
  349. package/templates/clean-state-checklist.md +3 -3
  350. package/templates/sprint-contract.md +2 -2
  351. package/bizar-dash/.bizar/activity.log +0 -3
  352. package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
  353. package/bizar-dash/.omx/state/session.json +0 -10
  354. package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
  355. package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
  356. package/bizar-dash/bizar-design/canvas.html +0 -281
  357. package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
  358. package/bizar-dash/bizar-design/components.css +0 -1665
  359. package/bizar-dash/bizar-design/components.html +0 -557
  360. package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
  361. package/bizar-dash/bizar-design/desktop/agents.html +0 -74
  362. package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
  363. package/bizar-dash/bizar-design/desktop/memory.html +0 -75
  364. package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
  365. package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
  366. package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
  367. package/bizar-dash/bizar-design/desktop/overview.html +0 -95
  368. package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
  369. package/bizar-dash/bizar-design/desktop/settings.html +0 -70
  370. package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
  371. package/bizar-dash/bizar-design/icons.svg +0 -44
  372. package/bizar-dash/bizar-design/index.html +0 -192
  373. package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
  374. package/bizar-dash/bizar-design/mobile/agents.html +0 -29
  375. package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
  376. package/bizar-dash/bizar-design/mobile/memory.html +0 -28
  377. package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
  378. package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
  379. package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
  380. package/bizar-dash/bizar-design/mobile/overview.html +0 -33
  381. package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
  382. package/bizar-dash/bizar-design/mobile/settings.html +0 -28
  383. package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
  384. package/bizar-dash/bizar-design/prototype.js +0 -114
  385. package/bizar-dash/bizar-design/tokens.css +0 -106
  386. package/bizar-dash/dist/assets/MobileChat-BnKN_Ks_.js +0 -1
  387. package/bizar-dash/dist/assets/MobileSettings-DjCPxC-Q.js +0 -1
  388. package/bizar-dash/dist/assets/icons-Do5N2jmX.js.map +0 -1
  389. package/bizar-dash/dist/assets/main-DYiZqMrn.js +0 -18
  390. package/bizar-dash/dist/assets/main-DYiZqMrn.js.map +0 -1
  391. package/bizar-dash/dist/assets/main-ietCEg_R.css +0 -1
  392. package/bizar-dash/dist/assets/markdown-C6mXtQxD.js +0 -1
  393. package/bizar-dash/dist/assets/mobile-CMHqtLV2.js +0 -1
  394. package/bizar-dash/dist/assets/mobile-layout-3jIhHX_p.js +0 -2
  395. package/bizar-dash/dist/assets/mobile-layout-3jIhHX_p.js.map +0 -1
  396. package/bizar-dash/dist/assets/react-vendor-Dn4wqh4Z.js +0 -40
  397. package/bizar-dash/dist/assets/react-vendor-Dn4wqh4Z.js.map +0 -1
  398. package/bizar-dash/dist/assets/useSlashCommands-DtITw8Xv.js +0 -2
  399. package/bizar-dash/dist/assets/useSlashCommands-DtITw8Xv.js.map +0 -1
  400. package/bizar-dash/dist/assets/vendor-CeHGtduv.js +0 -29
  401. package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
  402. package/bizar-dash/node_modules/.package-lock.json +0 -6
  403. package/bizar-dash/package-lock.json +0 -6
  404. package/bizar-dash/src/server/cline-sdk.mjs +0 -132
  405. package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
  406. package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
  407. package/cli/commands/cline-cmd.mjs +0 -289
  408. package/cli/commands/validate.test.mjs +0 -379
  409. package/cli/doctor.test.mjs +0 -350
  410. package/config/cline.json.template +0 -342
  411. package/packages/sdk/src/client.ts +0 -188
  412. package/packages/sdk/src/cline-events.ts +0 -134
  413. package/packages/sdk/src/cline-types.ts +0 -66
  414. package/packages/sdk/src/cline.ts +0 -339
  415. package/packages/sdk/src/errors.ts +0 -129
  416. package/packages/sdk/src/events.ts +0 -153
  417. package/packages/sdk/src/types.ts +0 -176
  418. package/packages/sdk/tests/client.test.ts +0 -217
  419. package/packages/sdk/tests/errors.test.ts +0 -108
  420. package/packages/sdk/tests/events.test.ts +0 -139
  421. package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
  422. package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
  423. package/plugins/bizar/ARCHITECTURE.md +0 -142
  424. package/plugins/bizar/CONSTRAINTS.md +0 -67
  425. package/plugins/bizar/LICENSE +0 -21
  426. package/plugins/bizar/README.md +0 -448
  427. package/plugins/bizar/index.ts +0 -925
  428. package/plugins/bizar/package.json +0 -39
  429. package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
  430. package/plugins/bizar/src/background-state.ts +0 -641
  431. package/plugins/bizar/src/background.ts +0 -1806
  432. package/plugins/bizar/src/cline-runner.ts +0 -203
  433. package/plugins/bizar/src/clineruntime.ts +0 -227
  434. package/plugins/bizar/src/commands-impl.ts +0 -151
  435. package/plugins/bizar/src/commands.ts +0 -1799
  436. package/plugins/bizar/src/compaction.d.mts +0 -48
  437. package/plugins/bizar/src/compaction.mjs +0 -192
  438. package/plugins/bizar/src/dashboard-client.ts +0 -233
  439. package/plugins/bizar/src/event-stream.ts +0 -606
  440. package/plugins/bizar/src/fingerprint.ts +0 -120
  441. package/plugins/bizar/src/handoff.ts +0 -79
  442. package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
  443. package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
  444. package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
  445. package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
  446. package/plugins/bizar/src/http-client.ts +0 -467
  447. package/plugins/bizar/src/key-rotation.ts +0 -218
  448. package/plugins/bizar/src/logger.ts +0 -144
  449. package/plugins/bizar/src/loop-engineering.ts +0 -241
  450. package/plugins/bizar/src/loop.ts +0 -176
  451. package/plugins/bizar/src/mistake-recovery.ts +0 -98
  452. package/plugins/bizar/src/odin.ts +0 -227
  453. package/plugins/bizar/src/options.ts +0 -470
  454. package/plugins/bizar/src/plan-fs.ts +0 -323
  455. package/plugins/bizar/src/reasoning-clean.ts +0 -454
  456. package/plugins/bizar/src/report.ts +0 -178
  457. package/plugins/bizar/src/research-prompt.ts +0 -35
  458. package/plugins/bizar/src/serve-info.ts +0 -228
  459. package/plugins/bizar/src/serve.ts +0 -496
  460. package/plugins/bizar/src/settings.ts +0 -349
  461. package/plugins/bizar/src/state.ts +0 -298
  462. package/plugins/bizar/src/tool-discipline.ts +0 -105
  463. package/plugins/bizar/src/tools/agent-browser.ts +0 -315
  464. package/plugins/bizar/src/tools/bg-collect.ts +0 -131
  465. package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
  466. package/plugins/bizar/src/tools/bg-kill.ts +0 -116
  467. package/plugins/bizar/src/tools/bg-pause.ts +0 -99
  468. package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
  469. package/plugins/bizar/src/tools/bg-resume.ts +0 -94
  470. package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
  471. package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
  472. package/plugins/bizar/src/tools/bg-status.ts +0 -130
  473. package/plugins/bizar/src/tools/graph-query.ts +0 -278
  474. package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
  475. package/plugins/bizar/src/tools/memory-list.ts +0 -43
  476. package/plugins/bizar/src/tools/memory-read.ts +0 -69
  477. package/plugins/bizar/src/tools/memory-search.ts +0 -47
  478. package/plugins/bizar/src/tools/memory-write.ts +0 -54
  479. package/plugins/bizar/src/tools/open-kb.ts +0 -198
  480. package/plugins/bizar/src/tools/plan-action.ts +0 -785
  481. package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
  482. package/plugins/bizar/src/tools/sandbox.ts +0 -232
  483. package/plugins/bizar/src/tools/team-spawn.ts +0 -73
  484. package/plugins/bizar/src/tools/team-status.ts +0 -76
  485. package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
  486. package/plugins/bizar/src/trajectory.ts +0 -104
  487. package/plugins/bizar/tests/README.md +0 -99
  488. package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
  489. package/plugins/bizar/tests/background-state.test.ts +0 -277
  490. package/plugins/bizar/tests/background.test.ts +0 -402
  491. package/plugins/bizar/tests/block.test.ts +0 -195
  492. package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
  493. package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
  494. package/plugins/bizar/tests/commands-impl.test.ts +0 -316
  495. package/plugins/bizar/tests/commands.test.ts +0 -584
  496. package/plugins/bizar/tests/compaction.test.ts +0 -264
  497. package/plugins/bizar/tests/config.test.ts +0 -128
  498. package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
  499. package/plugins/bizar/tests/dispose.test.ts +0 -336
  500. package/plugins/bizar/tests/event-stream.test.ts +0 -409
  501. package/plugins/bizar/tests/event.test.ts +0 -262
  502. package/plugins/bizar/tests/fingerprint.test.ts +0 -190
  503. package/plugins/bizar/tests/http-client.test.ts +0 -404
  504. package/plugins/bizar/tests/init-helpers.test.ts +0 -203
  505. package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
  506. package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
  507. package/plugins/bizar/tests/key-rotation.test.ts +0 -396
  508. package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
  509. package/plugins/bizar/tests/loop.test.ts +0 -397
  510. package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
  511. package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
  512. package/plugins/bizar/tests/odin.test.ts +0 -125
  513. package/plugins/bizar/tests/options.test.ts +0 -329
  514. package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
  515. package/plugins/bizar/tests/safety.test.ts +0 -281
  516. package/plugins/bizar/tests/serve.test.ts +0 -339
  517. package/plugins/bizar/tests/settings.test.ts +0 -351
  518. package/plugins/bizar/tests/stall-think.test.ts +0 -750
  519. package/plugins/bizar/tests/state.test.ts +0 -276
  520. package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
  521. package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
  522. package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
  523. package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
  524. package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
  525. package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
  526. package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
  527. package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
  528. package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
  529. package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
  530. package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
  531. package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
  532. package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
  533. package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
  534. package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
  535. package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
  536. package/plugins/bizar/tests/tools/sandbox.test.ts +0 -117
  537. package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
  538. package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
  539. package/plugins/bizar/tsconfig.json +0 -29
  540. package/scripts/mirror-agents-md.sh +0 -69
@@ -1,144 +0,0 @@
1
- /**
2
- * Logger — thin wrapper over `client.app.log`.
3
- *
4
- * Spec requirements satisfied here:
5
- * - §6.5 — honors `BIZAR_LOG_LEVEL` env var (`debug` | `info` | `warn` | `error`,
6
- * default `info`, invalid values fall back to `info` with a warning).
7
- * - §7.6 — never accepts or emits raw tool args / session content. Every call
8
- * to `client.app.log` is `{ level, message }` (or the SDK's wrapped
9
- * `{ body: { service, level, message } }` shape) where `message` is a
10
- * static string the caller constructed. There is no second argument,
11
- * no metadata object, no structured logging payload.
12
- *
13
- * The logger swallows all errors from the underlying `client.app.log` call.
14
- * A failed log MUST NOT crash the plugin or block the tool hook.
15
- *
16
- * The interface is intentionally compatible with the `Logger` shape that
17
- * Thor's `StateStore` and `LogWriter` accept: a single `log(opts)` method
18
- * returning `void` (synchronous). We also expose level-specific convenience
19
- * methods (`debug` / `info` / `warn` / `error`) that all delegate to `log`.
20
- */
21
-
22
- export type LogLevel = "debug" | "info" | "warn" | "error";
23
-
24
- const LEVEL_ORDER: Record<LogLevel, number> = {
25
- debug: 0,
26
- info: 1,
27
- warn: 2,
28
- error: 3,
29
- };
30
-
31
- /**
32
- * Minimal client surface the logger depends on. The real cline client's
33
- * `app.log` is a generated SDK method with a complex Options<T> type; we
34
- * accept any object with a compatible `app.log` method and treat the body
35
- * as an opaque `unknown` at the boundary. The logger internally shapes the
36
- * call to the SDK's expected `{ body: { service, level, message } }` form.
37
- */
38
- export interface LoggerClient {
39
- app: {
40
- log: (input: unknown) => unknown;
41
- };
42
- }
43
-
44
- /**
45
- * The Logger interface matches the one defined in `state.ts` and `report.ts`
46
- * (Thor's modules). A single `log(opts)` method, synchronous, returns `void`.
47
- * The convenience methods are additive.
48
- */
49
- export interface Logger {
50
- log(opts: { level: LogLevel; message: string }): void;
51
- debug(message: string): void;
52
- info(message: string): void;
53
- warn(message: string): void;
54
- error(message: string): void;
55
- }
56
-
57
- interface ParsedLogLevel {
58
- level: LogLevel;
59
- wasInvalid: boolean;
60
- original: string | undefined;
61
- }
62
-
63
- function parseLogLevel(raw: string | undefined): ParsedLogLevel {
64
- if (raw === undefined || raw === "") {
65
- return { level: "info", wasInvalid: false, original: raw };
66
- }
67
- const lower = raw.toLowerCase();
68
- if (lower === "debug" || lower === "info" || lower === "warn" || lower === "error") {
69
- return { level: lower, wasInvalid: false, original: raw };
70
- }
71
- return { level: "info", wasInvalid: true, original: raw };
72
- }
73
-
74
- function readEnvLevel(): string | undefined {
75
- try {
76
- return typeof process !== "undefined" && process.env
77
- ? process.env.BIZAR_LOG_LEVEL
78
- : undefined;
79
- } catch {
80
- return undefined;
81
- }
82
- }
83
-
84
- /**
85
- * Service name stamped onto every log entry. Lets users filter app logs
86
- * by service (e.g. `bizar`) in their diagnostic tooling.
87
- */
88
- const SERVICE_NAME = "bizar";
89
-
90
- /**
91
- * Construct a Logger bound to the cline client.
92
- *
93
- * @param client The cline client (we use only `client.app.log`).
94
- * @param envLevel Optional override for `BIZAR_LOG_LEVEL`. If omitted, the
95
- * env var is read once. Env vars are read at plugin init;
96
- * mid-session changes are ignored (spec §6.5).
97
- */
98
- export function createLogger(client: LoggerClient, envLevel?: string): Logger {
99
- const raw = envLevel ?? readEnvLevel();
100
- const parsed = parseLogLevel(raw);
101
- const threshold = parsed.level;
102
-
103
- if (parsed.wasInvalid) {
104
- // Best-effort: warn about the invalid value, then proceed with "info".
105
- // We call `client.app.log` directly because the logger is not yet wired
106
- // to the threshold.
107
- try {
108
- client.app.log({
109
- body: { service: SERVICE_NAME, level: "warn", message: `bizar: invalid BIZAR_LOG_LEVEL "${parsed.original ?? ""}", falling back to "info"` },
110
- });
111
- } catch {
112
- // ignore — never let a warning crash init
113
- }
114
- }
115
-
116
- function emit(msgLevel: LogLevel, message: string): void {
117
- if (LEVEL_ORDER[msgLevel] < LEVEL_ORDER[threshold]) return;
118
- try {
119
- client.app.log({
120
- body: { service: SERVICE_NAME, level: msgLevel, message },
121
- });
122
- } catch {
123
- // Swallow — a failed log MUST NOT crash the plugin.
124
- }
125
- }
126
-
127
- return {
128
- log(opts) {
129
- emit(opts.level, opts.message);
130
- },
131
- debug(message) {
132
- emit("debug", message);
133
- },
134
- info(message) {
135
- emit("info", message);
136
- },
137
- warn(message) {
138
- emit("warn", message);
139
- },
140
- error(message) {
141
- emit("error", message);
142
- },
143
- };
144
- }
@@ -1,241 +0,0 @@
1
- /**
2
- * loop-engineering.ts
3
- *
4
- * v6.0.0 — Structured loop patterns for continuous agent execution.
5
- *
6
- * Inspired by:
7
- * - https://github.com/cobusgreyling/loop-engineering
8
- * - https://github.com/rudy2steiner/awesome-agent-loops
9
- *
10
- * Patterns supported (v1):
11
- *
12
- * 1. **ralph** — repeat until output contains `[STOP]` marker, or until
13
- * `maxIterations` is reached, or until a manual stop signal.
14
- * 2. **repl** — interactive, awaits user input between iterations
15
- * (not yet implemented in v1).
16
- * 3. **cron** — interval-based; reruns every N seconds.
17
- * 4. **plan-execute** — decompose once, iterate over subtasks.
18
- *
19
- * Loops are stored on disk as JSON files at:
20
- * ~/.bizar/loops/<loopId>.json
21
- *
22
- * Each loop has:
23
- * - id, pattern, task, status (running | stopped | done)
24
- * - iterations[] — log of { index, startedAt, durationMs, output, stopReason }
25
- * - context — pattern-specific config (interval, maxIterations, etc.)
26
- */
27
-
28
- import { mkdirSync, writeFileSync, readFileSync, existsSync, readdirSync, unlinkSync } from "node:fs";
29
- import { join } from "node:path";
30
- import { homedir } from "node:os";
31
-
32
- export type LoopPattern = "ralph" | "repl" | "cron" | "plan-execute";
33
- export type LoopStatus = "running" | "stopped" | "done";
34
-
35
- export interface LoopIteration {
36
- index: number;
37
- startedAt: string;
38
- durationMs: number;
39
- output: string;
40
- stopReason?: string;
41
- }
42
-
43
- export interface LoopContext {
44
- maxIterations: number;
45
- stopMarker?: string;
46
- intervalSeconds?: number;
47
- subtasks?: string[];
48
- }
49
-
50
- export interface Loop {
51
- id: string;
52
- pattern: LoopPattern;
53
- task: string;
54
- status: LoopStatus;
55
- createdAt: string;
56
- updatedAt: string;
57
- context: LoopContext;
58
- iterations: LoopIteration[];
59
- }
60
-
61
- const LOOPS_DIR = join(homedir(), ".bizar", "loops");
62
-
63
- function ensureLoopsDir(): void {
64
- if (!existsSync(LOOPS_DIR)) {
65
- mkdirSync(LOOPS_DIR, { recursive: true });
66
- }
67
- }
68
-
69
- function generateLoopId(): string {
70
- return `loop_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
71
- }
72
-
73
- export interface StartLoopInput {
74
- pattern: LoopPattern;
75
- task: string;
76
- context?: Partial<LoopContext>;
77
- }
78
-
79
- export interface StartLoopOutput {
80
- ok: true;
81
- loop: Loop;
82
- }
83
-
84
- export function startLoop(input: StartLoopInput): StartLoopOutput {
85
- ensureLoopsDir();
86
- const id = generateLoopId();
87
- const now = new Date().toISOString();
88
- const loop: Loop = {
89
- id,
90
- pattern: input.pattern,
91
- task: input.task,
92
- status: "running",
93
- createdAt: now,
94
- updatedAt: now,
95
- context: {
96
- maxIterations: input.context?.maxIterations ?? 10,
97
- stopMarker: input.context?.stopMarker,
98
- intervalSeconds: input.context?.intervalSeconds,
99
- subtasks: input.context?.subtasks,
100
- },
101
- iterations: [],
102
- };
103
- writeFileSync(join(LOOPS_DIR, `${id}.json`), JSON.stringify(loop, null, 2));
104
- return { ok: true, loop };
105
- }
106
-
107
- export function loadLoop(id: string): Loop | null {
108
- const path = join(LOOPS_DIR, `${id}.json`);
109
- if (!existsSync(path)) return null;
110
- return JSON.parse(readFileSync(path, "utf8")) as Loop;
111
- }
112
-
113
- export function saveLoop(loop: Loop): void {
114
- loop.updatedAt = new Date().toISOString();
115
- writeFileSync(join(LOOPS_DIR, `${loop.id}.json`), JSON.stringify(loop, null, 2));
116
- }
117
-
118
- /**
119
- * Append an iteration result to a loop and update its status if a stop
120
- * condition was met.
121
- */
122
- export function appendIteration(
123
- id: string,
124
- result: Omit<LoopIteration, "startedAt"> & { startedAt?: string },
125
- ): Loop | null {
126
- const loop = loadLoop(id);
127
- if (!loop) return null;
128
- const iter: LoopIteration = {
129
- index: loop.iterations.length,
130
- startedAt: result.startedAt ?? new Date().toISOString(),
131
- durationMs: result.durationMs,
132
- output: result.output,
133
- stopReason: result.stopReason,
134
- };
135
- loop.iterations.push(iter);
136
- if (loop.context.maxIterations > 0 && loop.iterations.length >= loop.context.maxIterations) {
137
- loop.status = "done";
138
- } else if (
139
- loop.pattern === "ralph" &&
140
- loop.context.stopMarker &&
141
- result.output.includes(loop.context.stopMarker)
142
- ) {
143
- loop.status = "done";
144
- iter.stopReason = `stop marker "${loop.context.stopMarker}" found`;
145
- }
146
- saveLoop(loop);
147
- return loop;
148
- }
149
-
150
- /**
151
- * Mark a loop as stopped (manual stop signal).
152
- *
153
- * If `reason` is given AND the loop has at least one iteration, attach
154
- * the reason to the most recent iteration. Otherwise, append a synthetic
155
- * "stopped" iteration so the reason is preserved in the audit log.
156
- */
157
- export function stopLoop(id: string, reason?: string): Loop | null {
158
- const loop = loadLoop(id);
159
- if (!loop) return null;
160
- loop.status = "stopped";
161
- if (reason) {
162
- if (loop.iterations.length > 0) {
163
- const last = loop.iterations[loop.iterations.length - 1];
164
- if (last) last.stopReason = reason;
165
- } else {
166
- // Append a synthetic iteration so the reason isn't lost.
167
- loop.iterations.push({
168
- index: 0,
169
- startedAt: new Date().toISOString(),
170
- durationMs: 0,
171
- output: "(loop stopped before any iterations ran)",
172
- stopReason: reason,
173
- });
174
- }
175
- }
176
- saveLoop(loop);
177
- return loop;
178
- }
179
-
180
- /**
181
- * Delete a loop from disk.
182
- */
183
- export function deleteLoop(id: string): boolean {
184
- const path = join(LOOPS_DIR, `${id}.json`);
185
- if (!existsSync(path)) return false;
186
- unlinkSync(path);
187
- return true;
188
- }
189
-
190
- /**
191
- * List all loops on disk, optionally filtered by status / pattern.
192
- */
193
- export function listLoops(filter?: { status?: LoopStatus; pattern?: LoopPattern }): Loop[] {
194
- ensureLoopsDir();
195
- const files = readdirSync(LOOPS_DIR).filter((f) => f.endsWith(".json"));
196
- const out: Loop[] = [];
197
- for (const f of files) {
198
- try {
199
- const l = JSON.parse(readFileSync(join(LOOPS_DIR, f), "utf8")) as Loop;
200
- if (filter?.status && l.status !== filter.status) continue;
201
- if (filter?.pattern && l.pattern !== filter.pattern) continue;
202
- out.push(l);
203
- } catch {
204
- // skip malformed
205
- }
206
- }
207
- return out.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
208
- }
209
-
210
- /**
211
- * Pattern execution: given a loop, return the prompt for the next
212
- * iteration and the stop marker to look for (if any).
213
- */
214
- export function buildNextIteration(loop: Loop): { prompt: string; stopMarker: string | null } {
215
- switch (loop.pattern) {
216
- case "ralph": {
217
- const stopMarker = loop.context.stopMarker ?? "[STOP]";
218
- const iterIndex = loop.iterations.length + 1;
219
- const prompt = [
220
- `Loop iteration ${iterIndex} of ${loop.context.maxIterations}.`,
221
- `Task: ${loop.task}`,
222
- ``,
223
- `Output the literal marker "${stopMarker}" on its own line when done.`,
224
- ].join("\n");
225
- return { prompt, stopMarker };
226
- }
227
- case "cron":
228
- return { prompt: loop.task, stopMarker: null };
229
- case "plan-execute": {
230
- const subs = loop.context.subtasks ?? [];
231
- const nextIdx = loop.iterations.length;
232
- const subtask = subs[nextIdx] ?? "(no more subtasks)";
233
- return {
234
- prompt: `Subtask ${nextIdx + 1} of ${subs.length}: ${subtask}`,
235
- stopMarker: null,
236
- };
237
- }
238
- case "repl":
239
- return { prompt: loop.task, stopMarker: null };
240
- }
241
- }
@@ -1,176 +0,0 @@
1
- /**
2
- * Loop — the threshold decision tree.
3
- *
4
- * Spec requirements satisfied here:
5
- * - §5.1 — algorithm. Count how many of the last `loopWindowSize` tool
6
- * calls share the given fingerprint. Re-scan the window each call.
7
- * - §5.4 — threshold table. The action returned by `decide()` corresponds
8
- * to the highest threshold that the count meets or exceeds.
9
- * - §5.5 — window vs counter semantics. The count is a re-scan of the
10
- * window, not a running counter. The intermediate non-matching calls
11
- * in the window do NOT "reset" anything; they just sit in the window
12
- * and shift older matching entries out as the window rolls forward.
13
- * - §7.2 — the `reason` field returned by `decide()` for warn/escalate/
14
- * block actions is a static message from `handoff.ts` with only the
15
- * tool name interpolated. No tool args, no LLM output, no agent-
16
- * controlled content is ever included.
17
- *
18
- * The `now` parameter is part of the public signature for API consistency
19
- * with the spec (§5.1 timing context) but is not consumed by the decision
20
- * logic — callers use it to timestamp the current tool call when adding it
21
- * to the state.
22
- */
23
-
24
- import type { SessionState } from "./state.js";
25
- import type { NormalizedOptions } from "./options.js";
26
- import {
27
- warnMessage,
28
- escalateMessage,
29
- blockMessage,
30
- } from "./handoff.js";
31
-
32
- /**
33
- * The decision returned by `decide()`. The `allow` variant carries no
34
- * payload; the three action variants carry the canonical handoff message
35
- * (via `reason`), the fingerprint that triggered the decision, and the
36
- * repetition count in the window.
37
- */
38
- export type Decision =
39
- | { action: "allow" }
40
- | {
41
- action: "warn" | "escalate" | "block";
42
- reason: string;
43
- fingerprint: string;
44
- count: number;
45
- };
46
-
47
- /**
48
- * Implicit "log a warning" threshold from spec §5.4 row 1. This is always
49
- * two below `loopThresholdWarn` so the gap between log-only and inject-warn
50
- * stays constant when the user reconfigures. We `max(1, …)` so a user who
51
- * sets `loopThresholdWarn = 1` does not push the log-only threshold below 1.
52
- */
53
- function logOnlyThreshold(options: NormalizedOptions): number {
54
- return Math.max(1, options.loopThresholdWarn - 2);
55
- }
56
-
57
- /**
58
- * Look at the last `loopWindowSize` tool calls and return those that share
59
- * the given fingerprint. The window is a slice of the most recent entries;
60
- * older entries are ignored (spec §5.1 step 3).
61
- */
62
- function windowMatches(
63
- state: SessionState,
64
- fingerprint: string,
65
- windowSize: number,
66
- ): { calls: SessionState["toolCalls"]; count: number } {
67
- if (state.toolCalls.length === 0 || windowSize <= 0) {
68
- return { calls: [], count: 0 };
69
- }
70
- const start = Math.max(0, state.toolCalls.length - windowSize);
71
- const window = state.toolCalls.slice(start);
72
- const matches = window.filter((c) => c.fingerprint === fingerprint);
73
- return { calls: matches, count: matches.length };
74
- }
75
-
76
- /**
77
- * Recover the tool name from any call in `matches` that shares the
78
- * fingerprint. The fingerprint is computed from `(tool, normalized args)`,
79
- * so every call with this fingerprint has the same tool name. If the
80
- * matches list is empty (should not happen when this is called — the
81
- * caller only invokes us when `count >= 1`), fall back to `"unknown"`.
82
- */
83
- function toolNameOf(matches: SessionState["toolCalls"]): string {
84
- const first = matches[0];
85
- return first ? first.tool : "unknown";
86
- }
87
-
88
- /**
89
- * Build a Decision payload for a non-allow action. Pulls the canonical
90
- * handoff message for the given action and the tool name recovered from
91
- * the matching window entries.
92
- */
93
- function payload(
94
- action: "warn" | "escalate" | "block",
95
- fingerprint: string,
96
- count: number,
97
- matches: SessionState["toolCalls"],
98
- ): Decision {
99
- const tool = toolNameOf(matches);
100
- const reason =
101
- action === "block"
102
- ? blockMessage(tool)
103
- : action === "escalate"
104
- ? escalateMessage(tool)
105
- : warnMessage(tool);
106
- return { action, reason, fingerprint, count };
107
- }
108
-
109
- /**
110
- * Decide what action to take for the current tool call.
111
- *
112
- * The function is pure: it does not mutate `state` and does not perform any
113
- * I/O. The caller (the `tool.execute.before` hook in `index.ts`) is
114
- * responsible for adding the current call to the state before invoking
115
- * `decide()`, and for acting on the returned decision (log / inject / throw).
116
- *
117
- * @param state The current session state. Must already include the
118
- * current tool call in `state.toolCalls` (the caller
119
- * appends it before calling `decide()`).
120
- * @param fingerprint The fingerprint of the current tool call.
121
- * @param now Current epoch milliseconds. Part of the public signature
122
- * for API consistency; not consumed by the decision logic.
123
- * @param options Normalized plugin options.
124
- */
125
- export function decide(
126
- state: SessionState,
127
- fingerprint: string,
128
- now: number,
129
- options: NormalizedOptions,
130
- ): Decision {
131
- // Step 1: scan the window.
132
- const { calls: matches, count } = windowMatches(
133
- state,
134
- fingerprint,
135
- options.loopWindowSize,
136
- );
137
-
138
- // Step 2: apply thresholds from highest to lowest.
139
- if (count >= options.loopThresholdBlock) {
140
- return payload("block", fingerprint, count, matches);
141
- }
142
- if (count >= options.loopThresholdEscalate) {
143
- return payload("escalate", fingerprint, count, matches);
144
- }
145
- if (count >= options.loopThresholdWarn) {
146
- return payload("warn", fingerprint, count, matches);
147
- }
148
-
149
- // Step 3: log-only band (spec §5.4 row 1). Sits between `allow` and the
150
- // inject-warn threshold. The caller distinguishes this case from
151
- // inject-warn by inspecting `count` against `options.loopThresholdWarn`.
152
- const logOnly = logOnlyThreshold(options);
153
- if (count >= logOnly) {
154
- return payload("warn", fingerprint, count, matches);
155
- }
156
-
157
- // `now` is accepted for API consistency; reference it so strict no-unused
158
- // linters do not flag the parameter.
159
- void now;
160
-
161
- return { action: "allow" };
162
- }
163
-
164
- /**
165
- * Convenience helper for the caller: given a `warn` decision, was this the
166
- * log-only band (no injection) or the inject-warn band? The caller uses
167
- * this to decide whether to write a `client.app.log` line or to set a
168
- * pending system-transform injection.
169
- */
170
- export function isLogOnlyWarn(
171
- decision: Decision,
172
- options: NormalizedOptions,
173
- ): boolean {
174
- if (decision.action !== "warn") return false;
175
- return decision.count < options.loopThresholdWarn;
176
- }
@@ -1,98 +0,0 @@
1
- /**
2
- * mistake-recovery.ts
3
- *
4
- * v6.0.1 — Built-in `onConsecutiveMistakeLimitReached` callback for the
5
- * Cline runtime.
6
- *
7
- * Why this exists:
8
- *
9
- * The Cline runtime aborts a session after `execution.maxConsecutiveMistakes`
10
- * identical-failure turns. The bundled CLI defaults this to 3 (via the
11
- * `--retries` flag); the SDK default is 6. When the model emits malformed
12
- * tool calls — e.g. `editor({ new_text: undefined })`, `ask_question({ options: null })`,
13
- * `run_commands({ ... })` rejected by Zod — the counter increments on every
14
- * iteration and the session is dead after a couple of bad turns.
15
- *
16
- * Rather than raising the threshold (which masks the model misbehaviour),
17
- * we install a `onConsecutiveMistakeLimitReached` callback that:
18
- *
19
- * • For recoverable mistakes (invalid_tool_call, tool_execution_failed),
20
- * injects a recovery notice into the conversation and resets the
21
- * counter. Cline's `MistakeTracker.record()` returns
22
- * `{ action: "continue", guidance: "..." }` and appends the guidance
23
- * as a user message, then continues the run.
24
- *
25
- * • For infra errors (api_error), stops immediately. Retrying a
26
- * network/provider failure is wasted work.
27
- *
28
- * This keeps the threshold tight (model discipline matters) while
29
- * preventing a single bad turn from killing a long-running task.
30
- */
31
-
32
- import type {
33
- ConsecutiveMistakeLimitContext,
34
- ConsecutiveMistakeLimitDecision,
35
- } from "@cline/shared";
36
-
37
- const RECOVERABLE_REASONS = new Set<ConsecutiveMistakeLimitContext["reason"]>([
38
- "invalid_tool_call",
39
- "tool_execution_failed",
40
- ]);
41
-
42
- export interface MistakeRecoveryOptions {
43
- /**
44
- * Called after the recovery notice is appended but before the run
45
- * continues. Receives the full context for observability.
46
- */
47
- onRecovery?: (ctx: ConsecutiveMistakeLimitContext, guidance: string) => void;
48
- /**
49
- * Override the recovery guidance text. Defaults to `BUILTIN_RECOVERY_GUIDANCE`.
50
- */
51
- guidance?: string;
52
- }
53
-
54
- /**
55
- * The default guidance appended to the conversation when consecutive
56
- * recoverable mistakes trip the limit. Kept terse on purpose — longer
57
- * text dilutes model attention.
58
- */
59
- export const BUILTIN_RECOVERY_GUIDANCE = [
60
- "You reached the consecutive-mistake limit. Before retrying:",
61
- "",
62
- "1. Re-read the failing tool's input schema. Every required field MUST be",
63
- " populated with a non-null value of the right type.",
64
- "2. For `editor`: `new_text` must be a non-empty string. If you intended",
65
- " to delete content, set `new_text` to \"\" (empty string) and use",
66
- " `applyPatch` or `delete_file` instead.",
67
- "3. For `ask_question`: `options` must be an array of ≥2 non-empty",
68
- " strings. Do not pass null, undefined, or arrays of length < 2.",
69
- "4. For `run_commands`: `commands` must be a non-empty array of strings.",
70
- "5. If you have made two mistakes on the SAME tool, switch tools or stop",
71
- " and explain in plain text what went wrong instead of retrying.",
72
- "",
73
- "Acknowledge this notice and continue.",
74
- ].join("\n");
75
-
76
- /**
77
- * Default stop reason when an unrecoverable mistake hits the limit.
78
- */
79
- export const BUILTIN_STOP_REASON = "consecutive api_errors — stopping without retry";
80
-
81
- /**
82
- * Build an `onConsecutiveMistakeLimitReached` callback.
83
- *
84
- * Pass the result directly to `cline.start({ config: { onConsecutiveMistakeLimitReached } })`.
85
- */
86
- export function buildMistakeRecovery(
87
- opts: MistakeRecoveryOptions = {},
88
- ): (ctx: ConsecutiveMistakeLimitContext) => Promise<ConsecutiveMistakeLimitDecision> | ConsecutiveMistakeLimitDecision {
89
- const guidance = opts.guidance ?? BUILTIN_RECOVERY_GUIDANCE;
90
- const onRecovery = opts.onRecovery;
91
- return (ctx) => {
92
- if (RECOVERABLE_REASONS.has(ctx.reason)) {
93
- onRecovery?.(ctx, guidance);
94
- return { action: "continue", guidance };
95
- }
96
- return { action: "stop", reason: BUILTIN_STOP_REASON };
97
- };
98
- }