@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
@@ -0,0 +1,241 @@
1
+ /**
2
+ * federation/pii.ts — PII redaction pipeline with 4 compliance modes.
3
+ *
4
+ * F-038 — ported from ruflo
5
+ * `v3/@claude-flow/plugin-agent-federation/src/domain/services/pii-pipeline-service.ts`
6
+ * but simplified per spec ("For v1, focus on redact (regex-based:
7
+ * emails, SSNs, credit cards, IPs)") while keeping the same
8
+ * 4-mode surface (`soc2 | gdpr | hipaa | permissive`).
9
+ *
10
+ * Compliance modes map to the detection + action matrix:
11
+ *
12
+ * soc2 — strict; redact emails, IPs, SSNs, credit cards.
13
+ * gdpr — strict; redact emails, IPs, names, addresses.
14
+ * hipaa — strictest; redact everything we recognise (incl. SSN).
15
+ * permissive — only block the most damaging (credit cards, JWTs,
16
+ * AWS keys, private keys, GitHub tokens); pass through
17
+ * emails / IPs / phone numbers.
18
+ *
19
+ * The transforms are PURE: no I/O, no clocks (other than explicit
20
+ * `now` injection). `apply()` returns a transformed string + the
21
+ * list of detections + a `blocked` flag (true if a hard-blocked
22
+ * PII was found — the caller decides whether to drop the message).
23
+ *
24
+ * No native deps.
25
+ */
26
+
27
+ /** 4 supported compliance modes for the skeleton. */
28
+ export type PiiMode = "soc2" | "gdpr" | "hipaa" | "permissive";
29
+
30
+ export const PII_MODES: readonly PiiMode[] = ["soc2", "gdpr", "hipaa", "permissive"] as const;
31
+
32
+ export function isPiiMode(m: unknown): m is PiiMode {
33
+ return typeof m === "string" && (PII_MODES as readonly string[]).includes(m);
34
+ }
35
+
36
+ export type PiiAction = "redact" | "hash" | "pass" | "block";
37
+
38
+ /** Internal PII categories — finer-grained than the modes. */
39
+ export type PiiCategory =
40
+ | "email"
41
+ | "ssn"
42
+ | "credit_card"
43
+ | "ip_address"
44
+ | "phone"
45
+ | "name"
46
+ | "address"
47
+ | "jwt"
48
+ | "aws_key"
49
+ | "private_key"
50
+ | "github_token";
51
+
52
+ export interface PiiDetection {
53
+ readonly category: PiiCategory;
54
+ readonly value: string;
55
+ readonly offset: number;
56
+ readonly confidence: number;
57
+ }
58
+
59
+ export interface PiiResult {
60
+ readonly transformed: string;
61
+ readonly detections: readonly PiiDetection[];
62
+ readonly actionsApplied: readonly { category: PiiCategory; action: PiiAction }[];
63
+ readonly blocked: boolean;
64
+ readonly mode: PiiMode;
65
+ }
66
+
67
+ interface RegexEntry {
68
+ readonly category: PiiCategory;
69
+ readonly pattern: RegExp;
70
+ readonly confidence: number;
71
+ }
72
+
73
+ /** Detection table — order matters: more-specific patterns come first
74
+ * so we don't double-match. */
75
+ const PATTERNS: readonly RegexEntry[] = [
76
+ // secrets/keys — block in every mode except permissive (which still blocks them)
77
+ { category: "aws_key", pattern: /\bAKIA[0-9A-Z]{16}\b/g, confidence: 0.99 },
78
+ { category: "private_key", pattern: /-----BEGIN\s+(?:RSA\s+|EC\s+|DSA\s+)?PRIVATE\s+KEY-----/g, confidence: 0.99 },
79
+ { category: "github_token", pattern: /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{36,}\b/g, confidence: 0.97 },
80
+ { category: "jwt", pattern: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g, confidence: 0.95 },
81
+ { category: "credit_card", pattern: /\b(?:\d{4}[-\s]?){3}\d{4}\b/g, confidence: 0.94 },
82
+ { category: "ssn", pattern: /\b\d{3}-\d{2}-\d{4}\b/g, confidence: 0.93 },
83
+ { category: "email", pattern: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g, confidence: 0.9 },
84
+ { category: "ip_address", pattern: /\b(?:\d{1,3}\.){3}\d{1,3}\b/g, confidence: 0.85 },
85
+ { category: "phone", pattern: /(?:\+?1[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b/g, confidence: 0.8 },
86
+ { category: "name", pattern: /\b(?:Mr\.|Mrs\.|Ms\.|Dr\.)\s+[A-Z][a-z]+(?:\s+[A-Z][a-z]+)+\b/g, confidence: 0.7 },
87
+ { category: "address", pattern: /\b\d{1,5}\s+(?:[A-Z][a-z]+\s+){1,3}(?:St|Ave|Blvd|Dr|Ln|Rd|Way|Ct)\b/g, confidence: 0.7 },
88
+ ];
89
+
90
+ /** Per-mode action policy. `block` means the envelope is rejected
91
+ * outright (caller drops it); `redact` replaces with
92
+ * `[REDACTED:<category>]`; `hash` replaces with
93
+ * `[HASH:<8-char-prefix>]`; `pass` lets it through unchanged. */
94
+ const MODE_POLICY: Record<PiiMode, Record<PiiCategory, PiiAction>> = {
95
+ soc2: {
96
+ email: "redact", ssn: "redact", credit_card: "block", ip_address: "redact",
97
+ phone: "redact", name: "pass", address: "pass",
98
+ jwt: "block", aws_key: "block", private_key: "block", github_token: "block",
99
+ },
100
+ gdpr: {
101
+ email: "redact", ssn: "redact", credit_card: "block", ip_address: "redact",
102
+ phone: "redact", name: "redact", address: "redact",
103
+ jwt: "block", aws_key: "block", private_key: "block", github_token: "block",
104
+ },
105
+ hipaa: {
106
+ email: "redact", ssn: "redact", credit_card: "block", ip_address: "redact",
107
+ phone: "redact", name: "redact", address: "redact",
108
+ jwt: "block", aws_key: "block", private_key: "block", github_token: "block",
109
+ },
110
+ permissive: {
111
+ email: "pass", ssn: "redact", credit_card: "block", ip_address: "pass",
112
+ phone: "pass", name: "pass", address: "pass",
113
+ jwt: "block", aws_key: "block", private_key: "block", github_token: "block",
114
+ },
115
+ };
116
+
117
+ const REDACT_TOKEN = (cat: PiiCategory) => `[REDACTED:${cat}]`;
118
+ const HASH_PREFIX = 8;
119
+
120
+ function deterministicHash(value: string, salt: string): string {
121
+ // Lightweight, no-native-dep hash: FNV-1a 32-bit, hex-encoded, then
122
+ // salted + first-N chars. The skeleton doesn't need crypto-grade
123
+ // hashing here — the HMAC envelope signature already provides
124
+ // integrity. This is purely for irreversible string replacement.
125
+ let h = 0x811c9dc5;
126
+ for (let i = 0; i < value.length; i++) {
127
+ h ^= value.charCodeAt(i);
128
+ h = Math.imul(h, 0x01000193) >>> 0;
129
+ }
130
+ const salted = `${salt}:${h.toString(16).padStart(8, "0")}`;
131
+ let h2 = 0x811c9dc5;
132
+ for (let i = 0; i < salted.length; i++) {
133
+ h2 ^= salted.charCodeAt(i);
134
+ h2 = Math.imul(h2, 0x01000193) >>> 0;
135
+ }
136
+ return h2.toString(16).padStart(8, "0");
137
+ }
138
+
139
+ export interface ApplyOptions {
140
+ /** Salt for hash() actions. Defaults to "bizar". */
141
+ readonly salt?: string;
142
+ }
143
+
144
+ /** Pure-function PII pipeline. Walks the regex table, decides an
145
+ * action per category under the chosen mode, applies the
146
+ * replacement. Returns enough metadata for the audit service to
147
+ * log what was stripped. */
148
+ export function apply(
149
+ text: string,
150
+ mode: PiiMode,
151
+ opts: ApplyOptions = {},
152
+ ): PiiResult {
153
+ if (!isPiiMode(mode)) {
154
+ throw new Error(`apply: unknown mode '${String(mode)}'`);
155
+ }
156
+ const salt = opts.salt ?? "bizar";
157
+ const policy = MODE_POLICY[mode];
158
+ const detections: PiiDetection[] = [];
159
+ const actionsApplied: { category: PiiCategory; action: PiiAction }[] = [];
160
+ let blocked = false;
161
+ let transformed = text;
162
+
163
+ // Two-phase: (1) collect ALL detections across ALL categories first,
164
+ // (2) apply per-category actions in reverse-offset order so a
165
+ // `block` on one category doesn't hide detections in later ones.
166
+ for (const entry of PATTERNS) {
167
+ const regex = new RegExp(entry.pattern.source, entry.pattern.flags);
168
+ let m: RegExpExecArray | null;
169
+ while ((m = regex.exec(transformed)) !== null) {
170
+ detections.push({
171
+ category: entry.category,
172
+ value: m[0],
173
+ offset: m.index,
174
+ confidence: entry.confidence,
175
+ });
176
+ }
177
+ }
178
+
179
+ // Now compute actions per category. `block` short-circuits the
180
+ // whole transform but we still report every detection.
181
+ for (const entry of PATTERNS) {
182
+ const inCategory = detections.filter((d) => d.category === entry.category);
183
+ if (inCategory.length === 0) continue;
184
+
185
+ const action = policy[entry.category];
186
+ actionsApplied.push({ category: entry.category, action });
187
+ if (action === "block") {
188
+ blocked = true;
189
+ continue;
190
+ }
191
+ if (action === "pass") continue;
192
+
193
+ // Apply right-to-left so earlier offsets remain valid.
194
+ for (const hit of inCategory.reverse()) {
195
+ const replacement =
196
+ action === "redact"
197
+ ? REDACT_TOKEN(entry.category)
198
+ : `[HASH:${deterministicHash(hit.value, salt).slice(0, HASH_PREFIX)}]`;
199
+ transformed =
200
+ transformed.slice(0, hit.offset) +
201
+ replacement +
202
+ transformed.slice(hit.offset + hit.value.length);
203
+ }
204
+ }
205
+
206
+ if (blocked) transformed = "";
207
+
208
+ return {
209
+ transformed,
210
+ detections,
211
+ actionsApplied,
212
+ blocked,
213
+ mode,
214
+ };
215
+ }
216
+
217
+ /** PiiPipeline — class wrapper for parity with ruflo's
218
+ * PIIPipelineService shape. Holds a default mode + salt, exposes
219
+ * `process(text)` and `setMode(mode)`. */
220
+ export class PiiPipeline {
221
+ private mode: PiiMode;
222
+ private readonly salt: string;
223
+
224
+ constructor(opts: { mode?: PiiMode; salt?: string } = {}) {
225
+ this.mode = opts.mode ?? "soc2";
226
+ this.salt = opts.salt ?? "bizar";
227
+ }
228
+
229
+ setMode(mode: PiiMode): void {
230
+ if (!isPiiMode(mode)) throw new Error(`PiiPipeline: unknown mode '${mode}'`);
231
+ this.mode = mode;
232
+ }
233
+
234
+ getMode(): PiiMode {
235
+ return this.mode;
236
+ }
237
+
238
+ process(text: string): PiiResult {
239
+ return apply(text, this.mode, { salt: this.salt });
240
+ }
241
+ }
@@ -0,0 +1,112 @@
1
+ /**
2
+ * federation/policy.ts — PolicyEngine: enforces per-call envelope
3
+ * constraints (maxHops, action allowlist, peer blocklist).
4
+ *
5
+ * F-038 — ported from ruflo
6
+ * `v3/@claude-flow/plugin-agent-federation/src/application/policy-engine.ts`
7
+ * but stripped to the three checks the skeleton needs:
8
+ *
9
+ * 1. maxHops — envelope.hopCount must be < budget.maxHops
10
+ * (default ceiling = 3 hops).
11
+ * 2. message — envelope.messageType must be in the action
12
+ * allowlist.
13
+ * 3. peer — source node must NOT be in the blocklist.
14
+ *
15
+ * `enforce(envelope, budget)` returns a discriminated result so
16
+ * callers can map directly to an MCP error string.
17
+ */
18
+
19
+ import {
20
+ FEDERATION_MESSAGE_TYPES,
21
+ isFederationMessageType,
22
+ type EnvelopeBudget,
23
+ type FederationEnvelope,
24
+ type FederationMessageType,
25
+ } from "./envelope.js";
26
+
27
+ /** Hard ceiling on hops — matches the spec's "≤ 3" rule. */
28
+ export const DEFAULT_MAX_HOPS = 3;
29
+
30
+ export type PolicyDecision =
31
+ | { allowed: true }
32
+ | {
33
+ allowed: false;
34
+ denialReason:
35
+ | "max_hops_exceeded"
36
+ | "message_type_not_allowed"
37
+ | "peer_blocked"
38
+ | "budget_missing"
39
+ | "budget_invalid";
40
+ };
41
+
42
+ export interface PolicyConfig {
43
+ /** Set of message kinds accepted by this node. Defaults to all
44
+ * 16 ruflo kinds — narrow via `allowedMessageTypes`. */
45
+ readonly allowedMessageTypes?: readonly FederationMessageType[];
46
+ /** Set of sourceNodeIds that are NEVER accepted (blocklist). */
47
+ readonly peerBlocklist?: readonly string[];
48
+ /** Override the default maxHops ceiling. */
49
+ readonly maxHops?: number;
50
+ }
51
+
52
+ export class PolicyEngine {
53
+ private readonly allowed: Set<FederationMessageType>;
54
+ private readonly blocked: Set<string>;
55
+ private readonly maxHops: number;
56
+
57
+ constructor(cfg: PolicyConfig = {}) {
58
+ this.allowed = new Set(cfg.allowedMessageTypes ?? FEDERATION_MESSAGE_TYPES);
59
+ this.blocked = new Set((cfg.peerBlocklist ?? []).map((s) => String(s)));
60
+ this.maxHops = cfg.maxHops ?? DEFAULT_MAX_HOPS;
61
+ }
62
+
63
+ /** Runtime mutator — narrow the allowlist after construction. */
64
+ allowMessageType(t: FederationMessageType): void {
65
+ this.allowed.add(t);
66
+ }
67
+
68
+ /** Runtime mutator — narrow the allowlist after construction. */
69
+ denyMessageType(t: FederationMessageType): void {
70
+ this.allowed.delete(t);
71
+ }
72
+
73
+ /** Runtime mutator — block / unblock a peer at runtime. */
74
+ setBlocked(nodeId: string, blocked: boolean): void {
75
+ if (blocked) this.blocked.add(nodeId);
76
+ else this.blocked.delete(nodeId);
77
+ }
78
+
79
+ /** Admit or reject an envelope given its budget context. */
80
+ enforce(envelope: FederationEnvelope, budget: EnvelopeBudget | undefined): PolicyDecision {
81
+ // 0. The budget object must exist — without it we can't enforce
82
+ // the maxHops ceiling.
83
+ if (!budget) return { allowed: false, denialReason: "budget_missing" };
84
+ if (typeof budget.maxHops !== "number" || !Number.isFinite(budget.maxHops)) {
85
+ return { allowed: false, denialReason: "budget_invalid" };
86
+ }
87
+
88
+ // 1. Peer blocklist
89
+ if (this.blocked.has(envelope.sourceNodeId)) {
90
+ return { allowed: false, denialReason: "peer_blocked" };
91
+ }
92
+
93
+ // 2. Message type allowlist
94
+ if (!isFederationMessageType(envelope.messageType)) {
95
+ return { allowed: false, denialReason: "message_type_not_allowed" };
96
+ }
97
+ if (!this.allowed.has(envelope.messageType)) {
98
+ return { allowed: false, denialReason: "message_type_not_allowed" };
99
+ }
100
+
101
+ // 3. maxHops — current hopCount must be strictly LESS than the
102
+ // ceiling. A freshly-origin envelope has hopCount=0 so a
103
+ // maxHops=3 budget admits it.
104
+ const hopCount = envelope.hopCount ?? 0;
105
+ const effectiveCeiling = Math.min(budget.maxHops, this.maxHops);
106
+ if (hopCount >= effectiveCeiling) {
107
+ return { allowed: false, denialReason: "max_hops_exceeded" };
108
+ }
109
+
110
+ return { allowed: true };
111
+ }
112
+ }
@@ -0,0 +1,146 @@
1
+ /**
2
+ * federation/trust.ts — TrustEvaluator: peer allowlist + recent fail
3
+ * rate + envelope age → trust score.
4
+ *
5
+ * F-038 — ported from ruflo
6
+ * `v3/@claude-flow/plugin-agent-federation/src/application/trust-evaluator.ts`
7
+ * (computeScore shape), stripped down for the skeleton:
8
+ *
9
+ * evaluate(envelope, peer) → { allowed, reason, score }
10
+ *
11
+ * Inputs:
12
+ * - peer (PeerState): { nodeId, allowlisted, recentFailRate, lastSeenMs }
13
+ * - envelope: FederationEnvelope
14
+ *
15
+ * Scoring (pure function):
16
+ * baseScore = peer.allowlisted ? 0.6 : 0.0
17
+ * freshness = clamp(1 - ageMs / MAX_AGE_MS, 0, 1) * 0.2
18
+ * reliability = clamp(1 - peer.recentFailRate, 0, 1) * 0.2
19
+ * score = baseScore + freshness + reliability
20
+ *
21
+ * Decision:
22
+ * allowed = peer.allowlisted AND ageMs <= MAX_AGE_MS AND score >= MIN_SCORE
23
+ *
24
+ * State — per-node recent fail rate + last-seen are tracked
25
+ * in a Map so repeated calls from the same peer update the
26
+ * picture. Failures can be recorded via `recordFailure(nodeId)`.
27
+ */
28
+
29
+ import { envelopeAgeMs, type FederationEnvelope } from "./envelope.js";
30
+
31
+ /** Maximum envelope age we'll trust (5 minutes — matches the
32
+ * HMAC freshness window). Older envelopes fail freshness
33
+ * independently of HMAC verification. */
34
+ export const MAX_TRUST_AGE_MS = 5 * 60 * 1000;
35
+
36
+ /** Minimum composite trust score required to admit an envelope. */
37
+ export const MIN_TRUST_SCORE = 0.7;
38
+
39
+ /** Number of recent failures tracked per peer for fail-rate calc. */
40
+ const FAILURE_WINDOW = 20;
41
+
42
+ export interface PeerState {
43
+ readonly nodeId: string;
44
+ readonly allowlisted: boolean;
45
+ /** Failure rate over the last `FAILURE_WINDOW` calls (0..1). */
46
+ readonly recentFailRate: number;
47
+ /** Last activity timestamp (ms epoch). Used as a tiebreaker. */
48
+ readonly lastSeenMs?: number;
49
+ }
50
+
51
+ export type TrustDecision =
52
+ | { allowed: true; score: number; reason: string }
53
+ | { allowed: false; score: number; reason: string };
54
+
55
+ export class TrustEvaluator {
56
+ private readonly allowlist: Set<string>;
57
+ private readonly failHistory = new Map<string, { failures: boolean[]; lastSeenMs: number }>();
58
+
59
+ constructor(opts: { allowlist?: readonly string[] } = {}) {
60
+ this.allowlist = new Set((opts.allowlist ?? []).map((s) => String(s)));
61
+ }
62
+
63
+ /** Add or remove a node from the trust allowlist at runtime. */
64
+ setAllowlisted(nodeId: string, allowlisted: boolean): void {
65
+ if (allowlisted) this.allowlist.add(nodeId);
66
+ else this.allowlist.delete(nodeId);
67
+ }
68
+
69
+ isAllowlisted(nodeId: string): boolean {
70
+ return this.allowlist.has(nodeId);
71
+ }
72
+
73
+ /** Snapshot the per-peer state seen by `evaluate()`. */
74
+ getPeerState(nodeId: string, _now: number = Date.now()): PeerState {
75
+ const rec = this.failHistory.get(nodeId);
76
+ const total = rec?.failures.length ?? 0;
77
+ const failures = rec?.failures.filter((b) => b).length ?? 0;
78
+ return {
79
+ nodeId,
80
+ allowlisted: this.allowlist.has(nodeId),
81
+ recentFailRate: total === 0 ? 0 : failures / total,
82
+ lastSeenMs: rec?.lastSeenMs,
83
+ };
84
+ }
85
+
86
+ /** Record that an exchange with `nodeId` succeeded/failed. Sliding
87
+ * window of `FAILURE_WINDOW` most-recent events. */
88
+ recordOutcome(nodeId: string, ok: boolean, now: number = Date.now()): void {
89
+ const rec = this.failHistory.get(nodeId) ?? { failures: [], lastSeenMs: now };
90
+ rec.failures.push(!ok);
91
+ if (rec.failures.length > FAILURE_WINDOW) rec.failures.shift();
92
+ rec.lastSeenMs = now;
93
+ this.failHistory.set(nodeId, rec);
94
+ }
95
+
96
+ /** Compute the trust score (0..1). Pure function — useful for tests
97
+ * and for the orchestrator's `status` tool.
98
+ *
99
+ * baseScore = 0.3 if allowlisted else 0.0 (allowlist is necessary, not sufficient)
100
+ * freshness = (1 - ageMs / MAX_TRUST_AGE_MS) * 0.3 (envelope must be fresh)
101
+ * reliability = (1 - peer.recentFailRate) * 0.4 (peer must be reliable)
102
+ *
103
+ * MIN_TRUST_SCORE = 0.5 — a peer needs AT LEAST 2 of the 3 axes
104
+ * in good standing to pass.
105
+ */
106
+ computeScore(envelope: FederationEnvelope, peer: PeerState, now: number = Date.now()): number {
107
+ if (!peer.allowlisted) return 0;
108
+ const baseScore = 0.3;
109
+ const ageMs = envelopeAgeMs(envelope, now);
110
+ const freshness = Math.max(0, Math.min(1, 1 - ageMs / MAX_TRUST_AGE_MS)) * 0.3;
111
+ const reliability = Math.max(0, Math.min(1, 1 - peer.recentFailRate)) * 0.4;
112
+ return Math.max(0, Math.min(1, baseScore + freshness + reliability));
113
+ }
114
+
115
+ /** Admit or reject an envelope based on the per-peer trust state. */
116
+ evaluate(envelope: FederationEnvelope, peer: PeerState, now: number = Date.now()): TrustDecision {
117
+ if (!peer.allowlisted) {
118
+ return {
119
+ allowed: false,
120
+ score: 0,
121
+ reason: `peer_not_allowlisted: ${peer.nodeId}`,
122
+ };
123
+ }
124
+ const ageMs = envelopeAgeMs(envelope, now);
125
+ if (ageMs > MAX_TRUST_AGE_MS) {
126
+ return {
127
+ allowed: false,
128
+ score: 0,
129
+ reason: `envelope_too_old: ${ageMs}ms`,
130
+ };
131
+ }
132
+ const score = this.computeScore(envelope, peer, now);
133
+ if (score < MIN_TRUST_SCORE) {
134
+ return {
135
+ allowed: false,
136
+ score,
137
+ reason: `score_below_floor: ${score.toFixed(3)} < ${MIN_TRUST_SCORE}`,
138
+ };
139
+ }
140
+ return {
141
+ allowed: true,
142
+ score,
143
+ reason: `score=${score.toFixed(3)} (peer_allowlisted=true, age=${ageMs}ms, fail_rate=${peer.recentFailRate.toFixed(3)})`,
144
+ };
145
+ }
146
+ }
Binary file
@@ -1,82 +1,114 @@
1
1
  /**
2
2
  * Public API for @polderlabs/bizar-sdk.
3
+ *
4
+ * v0.4.0 — Claude Code-native rewrite. The legacy Cline wrappers
5
+ * (`createClineSdk`, `subscribeClineEvents`, `Cline*` types) have been
6
+ * removed because Bizar no longer integrates with the Cline runtime.
7
+ * The Claude Code integration is via the MCP server exported from
8
+ * `./mcp/server.ts` (`createBizarMcpServer`) and the in-process memory
9
+ * vault exported from `./memory/index.ts`.
3
10
  */
4
11
 
5
- export { createBizarClient } from "./client.js";
6
- export type {
7
- BizarClient,
8
- BizarClientConfig,
9
- SessionsResource,
10
- ProjectsResource,
11
- PlansResource,
12
- EventsResource,
13
- HealthResource,
14
- } from "./client.js";
15
-
16
- export type { EventSubscription, EventSubscriptionOptions } from "./events.js";
12
+ // In-process memory vault (Obsidian-compatible markdown notes).
13
+ export {
14
+ readNote,
15
+ writeNote,
16
+ listNotes,
17
+ searchNotes,
18
+ parseFrontmatter,
19
+ serializeFrontmatter,
20
+ resolveVaultRoot,
21
+ DEFAULT_MEMORY_VAULT,
22
+ LEGACY_MEMORY_VAULT,
23
+ } from "./memory/index.js";
24
+ export type { MemoryNote } from "./memory/index.js";
17
25
 
26
+ // Dangerous-pattern scanner.
18
27
  export {
19
- isBizarError,
20
- connectionErrorFrom,
21
- dashboardErrorFrom,
22
- apiErrorFrom,
23
- } from "./errors.js";
24
- export type {
25
- BizarError,
26
- PluginError,
27
- DashboardError,
28
- ConnectionError,
29
- APIError,
30
- ClineConnectionError,
31
- } from "./errors.js";
28
+ checkDangerous,
29
+ listDangerousPatterns,
30
+ getDangerousPatternStats,
31
+ } from "./dangerous-patterns.js";
32
+ export type { ApprovalDecision, ApprovalCheck } from "./dangerous-patterns.js";
32
33
 
33
- export type {
34
- // Session
35
- Session,
36
- SessionStatus,
37
- SessionCreate,
38
- SessionListQuery,
39
- // Project
40
- Project,
41
- // Plan
42
- Plan,
43
- PlanStatus,
44
- // Part
45
- Part,
46
- TextPart,
47
- ToolCallPart,
48
- ToolResultPart,
49
- ReasoningPart,
50
- // Event
51
- DashboardEvent,
52
- DashboardConnectedEvent,
53
- SessionCreatedEvent,
54
- SessionUpdatedEvent,
55
- SessionIdleEvent,
56
- SessionErrorEvent,
57
- MessagePartUpdatedEvent,
58
- ToolExecutedEvent,
59
- PlanUpdatedEvent,
60
- // Health
61
- Health,
62
- } from "./types.js";
34
+ // Tool-call fingerprint (stable hash for loop-guard).
35
+ export { fingerprint } from "./fingerprint.js";
63
36
 
64
- export { SDK_VERSION } from "./version.js";
37
+ // Claude Code MCP server.
38
+ export {
39
+ createBizarMcpServer,
40
+ createBizarMcpServerConfig,
41
+ BIZAR_TOOLS,
42
+ getBizarMcpToolSummary,
43
+ defineTool,
44
+ } from "./mcp/server.js";
45
+ export type { SdkMcpToolDef, SdkMcpServerConfig } from "./mcp/server.js";
65
46
 
66
- // Cline SDK — wraps the cline serve child with a typed interface.
67
- // Tries `@cline/sdk` first; falls back to a thin fetch wrapper.
68
- export { createClineSdk } from "./cline.js";
69
- export type { ClineSdk, ClineSdkConfig } from "./cline.js";
47
+ // F-032 — Swarm coordination primitives.
48
+ export {
49
+ BizarAgentRegistry,
50
+ bizarAgentRegistry,
51
+ } from "./agent-registry.js";
52
+ export type {
53
+ AgentRecord,
54
+ AgentStatus,
55
+ RegisterAgentInput,
56
+ RegisterAgentResult,
57
+ ListAgentsInput,
58
+ ListAgentsResult,
59
+ TerminateAgentInput,
60
+ TerminateAgentResult,
61
+ } from "./agent-registry.js";
70
62
 
71
- export { subscribeClineEvents } from "./cline-events.js";
63
+ export {
64
+ SwarmTopologyRegistry,
65
+ swarmTopologyRegistry,
66
+ initSwarm,
67
+ getSwarm,
68
+ listSwarms,
69
+ recordAgentInSwarm,
70
+ decommissionSwarm,
71
+ SWARM_TOPOLOGIES,
72
+ DEFAULT_TOPOLOGY,
73
+ DEFAULT_MAX_AGENTS,
74
+ DEFAULT_SWARM_ID,
75
+ } from "./swarm-topology.js";
72
76
  export type {
73
- ClineEventEnvelope,
74
- ClineEventSubscribeOptions,
75
- } from "./cline-events.js";
77
+ SwarmRecord,
78
+ SwarmTopology,
79
+ InitSwarmInput,
80
+ InitSwarmResult,
81
+ } from "./swarm-topology.js";
76
82
 
83
+ // F-039 — Byzantine fault-tolerant consensus (thin PBFT port).
84
+ export {
85
+ ByzantineConsensus,
86
+ type ByzantineConsensusOpts,
87
+ QueenCoordinator,
88
+ type QueenCoordinatorOpts,
89
+ createConsensus,
90
+ getSharedConsensus,
91
+ resetSharedConsensus,
92
+ type ConsensusHandle,
93
+ type CreateConsensusOpts,
94
+ PHASE_ORDER,
95
+ DEFAULT_QUORUM,
96
+ DEFAULT_PEER_COUNT,
97
+ DEFAULT_MAX_FAULTS,
98
+ } from "./consensus/index.js";
77
99
  export type {
78
- ClineSession,
79
- ClineMessage,
80
- ClinePart,
81
- ClineEvent,
82
- } from "./cline-types.js";
100
+ CommitResult,
101
+ ConsensusOpts,
102
+ ConsensusStatus,
103
+ Decision,
104
+ Phase,
105
+ ProposeResult,
106
+ Proposal,
107
+ ProposalSnapshot,
108
+ ProposalStatus,
109
+ Vote,
110
+ VoteResult,
111
+ ViewChangeResult,
112
+ } from "./consensus/types.js";
113
+
114
+ export { SDK_VERSION } from "./version.js";