@polderlabs/bizar 6.2.4 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/.claude/CLAUDE.md +15 -0
  2. package/.claude/agents/_shared/AGENT_BASELINE.md +168 -0
  3. package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
  4. package/.claude/agents/_shared/SKILLS.md +109 -0
  5. package/.claude/agents/agent-browser.md +80 -0
  6. package/.claude/agents/baldr.md +49 -0
  7. package/.claude/agents/forseti.md +51 -0
  8. package/.claude/agents/frigg.md +42 -0
  9. package/.claude/agents/heimdall.md +33 -0
  10. package/.claude/agents/hermod.md +53 -0
  11. package/.claude/agents/mimir.md +49 -0
  12. package/.claude/agents/odin.md +287 -0
  13. package/.claude/agents/quick.md +34 -0
  14. package/.claude/agents/semble-search.md +50 -0
  15. package/.claude/agents/thor.md +53 -0
  16. package/.claude/agents/tyr.md +56 -0
  17. package/.claude/agents/vidarr.md +54 -0
  18. package/.claude/agents/vor.md +53 -0
  19. package/.claude/commands/audit.md +25 -0
  20. package/.claude/commands/bizar.md +22 -0
  21. package/.claude/commands/explain.md +17 -0
  22. package/.claude/commands/init.md +29 -0
  23. package/.claude/commands/learn.md +44 -0
  24. package/.claude/commands/plan.md +35 -0
  25. package/.claude/commands/plow-through.md +50 -0
  26. package/.claude/commands/pr-review.md +49 -0
  27. package/.claude/commands/setup-provider.md +96 -0
  28. package/.claude/commands/tailscale-serve.md +100 -0
  29. package/.claude/commands/team.md +132 -0
  30. package/.claude/commands/test.md +62 -0
  31. package/.claude/commands/validate.md +68 -0
  32. package/.claude/commands/visual-plan.md +24 -0
  33. package/.claude/hooks/README.md +92 -0
  34. package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
  35. package/.claude/hooks/pretooluse-bash.mjs +81 -0
  36. package/.claude/hooks/pretooluse-editwrite.mjs +139 -0
  37. package/.claude/hooks/sessionend-recall.mjs +74 -0
  38. package/.claude/hooks/sessionstart-prime.mjs +80 -0
  39. package/.claude/hooks/userpromptsubmit-tag.mjs +80 -0
  40. package/.claude/settings.json +116 -0
  41. package/.claude/skills/9router/SKILL.md +80 -0
  42. package/.claude/skills/9router-chat/SKILL.md +73 -0
  43. package/.claude/skills/9router-embeddings/SKILL.md +69 -0
  44. package/.claude/skills/9router-image/SKILL.md +86 -0
  45. package/.claude/skills/9router-stt/SKILL.md +79 -0
  46. package/.claude/skills/9router-tts/SKILL.md +80 -0
  47. package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
  48. package/.claude/skills/9router-web-search/SKILL.md +91 -0
  49. package/.claude/skills/bizar/README.md +9 -0
  50. package/.claude/skills/bizar/SKILL.md +450 -0
  51. package/.claude/skills/cpp-coding-standards/README.md +28 -0
  52. package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
  53. package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
  54. package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
  55. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
  56. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
  57. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
  58. package/.claude/skills/cpp-testing/README.md +28 -0
  59. package/.claude/skills/cpp-testing/SKILL.md +304 -0
  60. package/.claude/skills/cpp-testing/references/coverage.md +370 -0
  61. package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
  62. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
  63. package/.claude/skills/cpp-testing/references/mocking.md +364 -0
  64. package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
  65. package/.claude/skills/cubesandbox/SKILL.md +148 -0
  66. package/.claude/skills/embedded-esp-idf/README.md +41 -0
  67. package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
  68. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
  69. package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
  70. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
  71. package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
  72. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
  73. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
  74. package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
  75. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
  76. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
  77. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
  78. package/.claude/skills/glyph/SKILL.md +163 -0
  79. package/.claude/skills/harness-engineering/SKILL.md +143 -0
  80. package/.claude/skills/lightrag/SKILL.md +81 -0
  81. package/.claude/skills/memory-protocol/SKILL.md +105 -0
  82. package/.claude/skills/obsidian/SKILL.md +306 -0
  83. package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
  84. package/.claude/skills/self-improvement/SKILL.md +64 -0
  85. package/README.md +87 -59
  86. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js → EnvVarsSection-B58aiJiE.js} +1 -1
  87. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js.map → EnvVarsSection-B58aiJiE.js.map} +1 -1
  88. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js → MobileChat-BJrqwVDd.js} +1 -1
  89. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js.map → MobileChat-BJrqwVDd.js.map} +1 -1
  90. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js → MobileSettings-CEQNJNLJ.js} +1 -1
  91. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js.map → MobileSettings-CEQNJNLJ.js.map} +1 -1
  92. package/bizar-dash/dist/assets/{main-DYiZqMrn.js → main-IvfQAOfy.js} +1 -1
  93. package/bizar-dash/dist/assets/{main-DYiZqMrn.js.map → main-IvfQAOfy.js.map} +1 -1
  94. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js → markdown-tOLaD6nm.js} +1 -1
  95. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js.map → markdown-tOLaD6nm.js.map} +1 -1
  96. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js → mobile-DYCHcUpq.js} +1 -1
  97. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js.map → mobile-DYCHcUpq.js.map} +1 -1
  98. package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js → mobile-layout-CBHjpwsb.js} +2 -2
  99. package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js.map → mobile-layout-CBHjpwsb.js.map} +1 -1
  100. package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js → useSlashCommands-Bd7_FA6U.js} +2 -2
  101. package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js.map → useSlashCommands-Bd7_FA6U.js.map} +1 -1
  102. package/bizar-dash/dist/assets/{vendor-CeHGtduv.js → vendor-C843201K.js} +12 -12
  103. package/bizar-dash/dist/assets/vendor-C843201K.js.map +1 -0
  104. package/bizar-dash/dist/index.html +6 -6
  105. package/bizar-dash/dist/mobile.html +2 -2
  106. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  107. package/bizar-dash/src/server/api.mjs +4 -4
  108. package/bizar-dash/src/server/background-store.mjs +15 -16
  109. package/bizar-dash/src/server/bg-poller.mjs +25 -35
  110. package/bizar-dash/src/server/bg-retry.mjs +66 -194
  111. package/bizar-dash/src/server/claude-bg-spawner.mjs +390 -0
  112. package/bizar-dash/src/server/claude-info.mjs +412 -0
  113. package/bizar-dash/src/server/{cline-runner.mjs → claude-runner.mjs} +53 -48
  114. package/bizar-dash/src/server/claude-sdk.mjs +191 -0
  115. package/bizar-dash/src/server/providers-store.mjs +22 -49
  116. package/bizar-dash/src/server/routes/background.mjs +24 -20
  117. package/bizar-dash/src/server/routes/chat.mjs +223 -326
  118. package/bizar-dash/src/server/routes/claude-session-detail.mjs +329 -0
  119. package/bizar-dash/src/server/routes/claude-sessions.mjs +259 -0
  120. package/bizar-dash/src/server/routes/tasks.mjs +20 -28
  121. package/bizar-dash/src/server/task-delegator.mjs +76 -77
  122. package/bizar-dash/src/web/components/chat/useChat.ts +23 -27
  123. package/bizar-dash/src/web/views/Chat.tsx +8 -8
  124. package/cli/bin.mjs +31 -18
  125. package/cli/commands/claude-cmd.mjs +348 -0
  126. package/cli/commands/install.mjs +12 -11
  127. package/cli/commands/sandbox.mjs +220 -0
  128. package/cli/commands/validate.mjs +252 -288
  129. package/cli/dev-link.test.mjs +11 -11
  130. package/cli/doctor.mjs +131 -213
  131. package/cli/install.mjs +33 -37
  132. package/cli/install.test.mjs +9 -9
  133. package/cli/provision-claude.mjs +893 -0
  134. package/cli/provision.mjs +330 -226
  135. package/cli/provision.test.mjs +102 -0
  136. package/cli/utils.mjs +72 -58
  137. package/config/AGENTS.md +28 -28
  138. package/config/agents/_shared/AGENT_BASELINE.md +104 -684
  139. package/config/skills/bizar/SKILL.md +197 -0
  140. package/config/skills/cubesandbox/SKILL.md +148 -0
  141. package/config/skills/harness-engineering/SKILL.md +142 -0
  142. package/install.sh +66 -44
  143. package/package.json +19 -11
  144. package/packages/sdk/ARCHITECTURE.md +40 -36
  145. package/packages/sdk/package-lock.json +32 -0
  146. package/packages/sdk/package.json +15 -5
  147. package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
  148. package/packages/sdk/src/fingerprint.ts +0 -0
  149. package/packages/sdk/src/index.ts +38 -73
  150. package/packages/sdk/src/mcp/bin.ts +51 -0
  151. package/packages/sdk/src/mcp/server.ts +498 -0
  152. package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
  153. package/packages/sdk/tests/sdk.test.mjs +148 -0
  154. package/packages/sdk/vitest.config.ts +1 -1
  155. package/scripts/bh-full-e2e.mjs +166 -363
  156. package/scripts/check-deps.mjs +28 -46
  157. package/scripts/mirror-claude-md.sh +78 -0
  158. package/scripts/test-in-container.sh +157 -0
  159. package/templates/clean-state-checklist.md +3 -3
  160. package/templates/sprint-contract.md +2 -2
  161. package/bizar-dash/.bizar/activity.log +0 -3
  162. package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
  163. package/bizar-dash/.omx/state/session.json +0 -10
  164. package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
  165. package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
  166. package/bizar-dash/bizar-design/canvas.html +0 -281
  167. package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
  168. package/bizar-dash/bizar-design/components.css +0 -1665
  169. package/bizar-dash/bizar-design/components.html +0 -557
  170. package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
  171. package/bizar-dash/bizar-design/desktop/agents.html +0 -74
  172. package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
  173. package/bizar-dash/bizar-design/desktop/memory.html +0 -75
  174. package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
  175. package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
  176. package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
  177. package/bizar-dash/bizar-design/desktop/overview.html +0 -95
  178. package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
  179. package/bizar-dash/bizar-design/desktop/settings.html +0 -70
  180. package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
  181. package/bizar-dash/bizar-design/icons.svg +0 -44
  182. package/bizar-dash/bizar-design/index.html +0 -192
  183. package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
  184. package/bizar-dash/bizar-design/mobile/agents.html +0 -29
  185. package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
  186. package/bizar-dash/bizar-design/mobile/memory.html +0 -28
  187. package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
  188. package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
  189. package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
  190. package/bizar-dash/bizar-design/mobile/overview.html +0 -33
  191. package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
  192. package/bizar-dash/bizar-design/mobile/settings.html +0 -28
  193. package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
  194. package/bizar-dash/bizar-design/prototype.js +0 -114
  195. package/bizar-dash/bizar-design/tokens.css +0 -106
  196. package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
  197. package/bizar-dash/node_modules/.package-lock.json +0 -6
  198. package/bizar-dash/package-lock.json +0 -6
  199. package/bizar-dash/src/server/cline-sdk.mjs +0 -132
  200. package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
  201. package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
  202. package/cli/commands/cline-cmd.mjs +0 -289
  203. package/cli/commands/validate.test.mjs +0 -344
  204. package/cli/doctor.test.mjs +0 -350
  205. package/config/cline.json.template +0 -342
  206. package/packages/sdk/src/client.ts +0 -188
  207. package/packages/sdk/src/cline-events.ts +0 -134
  208. package/packages/sdk/src/cline-types.ts +0 -66
  209. package/packages/sdk/src/cline.ts +0 -339
  210. package/packages/sdk/src/errors.ts +0 -129
  211. package/packages/sdk/src/events.ts +0 -153
  212. package/packages/sdk/src/types.ts +0 -176
  213. package/packages/sdk/tests/client.test.ts +0 -217
  214. package/packages/sdk/tests/errors.test.ts +0 -108
  215. package/packages/sdk/tests/events.test.ts +0 -139
  216. package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
  217. package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
  218. package/plugins/bizar/ARCHITECTURE.md +0 -142
  219. package/plugins/bizar/CONSTRAINTS.md +0 -67
  220. package/plugins/bizar/LICENSE +0 -21
  221. package/plugins/bizar/README.md +0 -448
  222. package/plugins/bizar/index.ts +0 -872
  223. package/plugins/bizar/package.json +0 -39
  224. package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
  225. package/plugins/bizar/src/background-state.ts +0 -641
  226. package/plugins/bizar/src/background.ts +0 -1806
  227. package/plugins/bizar/src/cline-runner.ts +0 -203
  228. package/plugins/bizar/src/clineruntime.ts +0 -227
  229. package/plugins/bizar/src/commands-impl.ts +0 -151
  230. package/plugins/bizar/src/commands.ts +0 -1799
  231. package/plugins/bizar/src/compaction.d.mts +0 -48
  232. package/plugins/bizar/src/compaction.mjs +0 -192
  233. package/plugins/bizar/src/dashboard-client.ts +0 -233
  234. package/plugins/bizar/src/event-stream.ts +0 -606
  235. package/plugins/bizar/src/fingerprint.ts +0 -120
  236. package/plugins/bizar/src/handoff.ts +0 -79
  237. package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
  238. package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
  239. package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
  240. package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
  241. package/plugins/bizar/src/http-client.ts +0 -467
  242. package/plugins/bizar/src/key-rotation.ts +0 -218
  243. package/plugins/bizar/src/logger.ts +0 -144
  244. package/plugins/bizar/src/loop-engineering.ts +0 -241
  245. package/plugins/bizar/src/loop.ts +0 -176
  246. package/plugins/bizar/src/mistake-recovery.ts +0 -98
  247. package/plugins/bizar/src/odin.ts +0 -227
  248. package/plugins/bizar/src/options.ts +0 -470
  249. package/plugins/bizar/src/plan-fs.ts +0 -323
  250. package/plugins/bizar/src/reasoning-clean.ts +0 -454
  251. package/plugins/bizar/src/report.ts +0 -178
  252. package/plugins/bizar/src/research-prompt.ts +0 -35
  253. package/plugins/bizar/src/serve-info.ts +0 -228
  254. package/plugins/bizar/src/serve.ts +0 -496
  255. package/plugins/bizar/src/settings.ts +0 -349
  256. package/plugins/bizar/src/state.ts +0 -298
  257. package/plugins/bizar/src/tool-discipline.ts +0 -105
  258. package/plugins/bizar/src/tools/agent-browser.ts +0 -315
  259. package/plugins/bizar/src/tools/bg-collect.ts +0 -131
  260. package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
  261. package/plugins/bizar/src/tools/bg-kill.ts +0 -116
  262. package/plugins/bizar/src/tools/bg-pause.ts +0 -99
  263. package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
  264. package/plugins/bizar/src/tools/bg-resume.ts +0 -94
  265. package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
  266. package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
  267. package/plugins/bizar/src/tools/bg-status.ts +0 -130
  268. package/plugins/bizar/src/tools/graph-query.ts +0 -278
  269. package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
  270. package/plugins/bizar/src/tools/memory-list.ts +0 -43
  271. package/plugins/bizar/src/tools/memory-read.ts +0 -69
  272. package/plugins/bizar/src/tools/memory-search.ts +0 -47
  273. package/plugins/bizar/src/tools/memory-write.ts +0 -54
  274. package/plugins/bizar/src/tools/open-kb.ts +0 -198
  275. package/plugins/bizar/src/tools/plan-action.ts +0 -785
  276. package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
  277. package/plugins/bizar/src/tools/team-spawn.ts +0 -73
  278. package/plugins/bizar/src/tools/team-status.ts +0 -76
  279. package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
  280. package/plugins/bizar/src/trajectory.ts +0 -104
  281. package/plugins/bizar/tests/README.md +0 -99
  282. package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
  283. package/plugins/bizar/tests/background-state.test.ts +0 -277
  284. package/plugins/bizar/tests/background.test.ts +0 -402
  285. package/plugins/bizar/tests/block.test.ts +0 -195
  286. package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
  287. package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
  288. package/plugins/bizar/tests/commands-impl.test.ts +0 -316
  289. package/plugins/bizar/tests/commands.test.ts +0 -584
  290. package/plugins/bizar/tests/compaction.test.ts +0 -264
  291. package/plugins/bizar/tests/config.test.ts +0 -128
  292. package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
  293. package/plugins/bizar/tests/dispose.test.ts +0 -336
  294. package/plugins/bizar/tests/event-stream.test.ts +0 -409
  295. package/plugins/bizar/tests/event.test.ts +0 -262
  296. package/plugins/bizar/tests/fingerprint.test.ts +0 -162
  297. package/plugins/bizar/tests/http-client.test.ts +0 -404
  298. package/plugins/bizar/tests/init-helpers.test.ts +0 -203
  299. package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
  300. package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
  301. package/plugins/bizar/tests/key-rotation.test.ts +0 -396
  302. package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
  303. package/plugins/bizar/tests/loop.test.ts +0 -397
  304. package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
  305. package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
  306. package/plugins/bizar/tests/odin.test.ts +0 -125
  307. package/plugins/bizar/tests/options.test.ts +0 -329
  308. package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
  309. package/plugins/bizar/tests/safety.test.ts +0 -256
  310. package/plugins/bizar/tests/serve.test.ts +0 -339
  311. package/plugins/bizar/tests/settings.test.ts +0 -351
  312. package/plugins/bizar/tests/stall-think.test.ts +0 -750
  313. package/plugins/bizar/tests/state.test.ts +0 -276
  314. package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
  315. package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
  316. package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
  317. package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
  318. package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
  319. package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
  320. package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
  321. package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
  322. package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
  323. package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
  324. package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
  325. package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
  326. package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
  327. package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
  328. package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
  329. package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
  330. package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
  331. package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
  332. package/plugins/bizar/tsconfig.json +0 -29
@@ -1 +1 @@
1
- import{j as n,r as o}from"./react-vendor-Dn4wqh4Z.js";import{C as O,u as T,a as k,b as R,c as E}from"./useSlashCommands-DtITw8Xv.js";import{u as F}from"./Toast-Cpl6-E63.js";import"./icons-Do5N2jmX.js";import"./mobile-layout-3jIhHX_p.js";import"./markdown-C6mXtQxD.js";import"./vendor-CeHGtduv.js";function $(t){const{activeSource:i}=t;return n.jsx("div",{className:`chat-composer-wrap chat-composer-source-${i??"none"} legacy`,children:n.jsx("div",{className:"chat-composer-pill",children:n.jsx(O,{...t})})})}function G({snapshot:t,settings:i,setActiveTab:g,initialTaskId:j,onClearTaskId:z}){const c=F(),s=T(t,i,j??"");o.useEffect(()=>{s.setToast({error:e=>c.error(e),success:e=>c.success(e),info:e=>c.info(e),warning:e=>c.warning(e)})},[s,c]);const[r,l]=o.useState(""),[f,x]=o.useState(i.defaultAgent||"odin"),[p,C]=o.useState(i.defaultModel||""),[h,v]=o.useState([]),u=o.useRef(null),{suggestions:y,setQuery:m}=k(t);o.useEffect(()=>{m(r)},[r,m]);const P=()=>{var e;return(e=u.current)==null?void 0:e.click()},w=e=>{const d=e.target.files;if(!d)return;const S=[];for(let a=0;a<d.length;a++)S.push(d[a].name);v(a=>{const M=S.filter(N=>!a.includes(N));return[...a,...M]}),u.current&&(u.current.value="")},I=async()=>{const e=r.trim();if(!e)return;l(""),m(""),(await s.onSend(e,f,p,h)).ok&&s.jumpToLatest()};return n.jsxs("div",{className:"chat-shell",children:[n.jsx(R,{activeProject:t.activeProject,sessionCount:s.sessions.length,sessionsOpen:!1,infoOpen:!1,onToggleSessions:()=>{},onToggleInfo:()=>{},onOpenOverview:()=>g==null?void 0:g("overview")}),n.jsx("div",{className:"chat-body",children:n.jsxs("main",{className:"chat-main",children:[n.jsx(E,{messages:s.activeSource==="cline"?s.clineMessages:s.bizarMessages,loading:s.loading,activeProject:t.activeProject,sessionId:s.activeSource==="cline"?s.activeClineSessionId??s.sessionId:s.sessionId,pinned:s.pinned,activeSource:s.activeSource,onPickSuggestion:e=>l(e),onCopy:e=>s.copyMessage(e),onDelete:()=>{},onTogglePin:s.togglePin,onRegenerate:s.onRegenerate}),n.jsx($,{agent:f,setAgent:x,model:p,setModel:C,text:r,setText:l,sending:s.sending,activeSource:s.activeSource,onSend:I,attachments:h,setAttachments:v,suggestions:y,onPickSuggestion:e=>l(`${e.split(" ")[0]} `),agents:t.agents||[],onAttach:P,sessionsOpen:!1,infoOpen:!1}),n.jsx("input",{ref:u,type:"file",multiple:!0,style:{display:"none"},onChange:w})]})})]})}export{G as MobileChat};
1
+ import{j as n,r as o}from"./react-vendor-Dn4wqh4Z.js";import{C as O,u as T,a as k,b as R,c as E}from"./useSlashCommands-Bd7_FA6U.js";import{u as F}from"./Toast-Cpl6-E63.js";import"./icons-Do5N2jmX.js";import"./mobile-layout-CBHjpwsb.js";import"./markdown-tOLaD6nm.js";import"./vendor-C843201K.js";function $(t){const{activeSource:i}=t;return n.jsx("div",{className:`chat-composer-wrap chat-composer-source-${i??"none"} legacy`,children:n.jsx("div",{className:"chat-composer-pill",children:n.jsx(O,{...t})})})}function G({snapshot:t,settings:i,setActiveTab:g,initialTaskId:j,onClearTaskId:z}){const c=F(),s=T(t,i,j??"");o.useEffect(()=>{s.setToast({error:e=>c.error(e),success:e=>c.success(e),info:e=>c.info(e),warning:e=>c.warning(e)})},[s,c]);const[r,l]=o.useState(""),[f,x]=o.useState(i.defaultAgent||"odin"),[p,C]=o.useState(i.defaultModel||""),[h,v]=o.useState([]),u=o.useRef(null),{suggestions:y,setQuery:m}=k(t);o.useEffect(()=>{m(r)},[r,m]);const P=()=>{var e;return(e=u.current)==null?void 0:e.click()},w=e=>{const d=e.target.files;if(!d)return;const S=[];for(let a=0;a<d.length;a++)S.push(d[a].name);v(a=>{const M=S.filter(N=>!a.includes(N));return[...a,...M]}),u.current&&(u.current.value="")},I=async()=>{const e=r.trim();if(!e)return;l(""),m(""),(await s.onSend(e,f,p,h)).ok&&s.jumpToLatest()};return n.jsxs("div",{className:"chat-shell",children:[n.jsx(R,{activeProject:t.activeProject,sessionCount:s.sessions.length,sessionsOpen:!1,infoOpen:!1,onToggleSessions:()=>{},onToggleInfo:()=>{},onOpenOverview:()=>g==null?void 0:g("overview")}),n.jsx("div",{className:"chat-body",children:n.jsxs("main",{className:"chat-main",children:[n.jsx(E,{messages:s.activeSource==="cline"?s.clineMessages:s.bizarMessages,loading:s.loading,activeProject:t.activeProject,sessionId:s.activeSource==="cline"?s.activeClineSessionId??s.sessionId:s.sessionId,pinned:s.pinned,activeSource:s.activeSource,onPickSuggestion:e=>l(e),onCopy:e=>s.copyMessage(e),onDelete:()=>{},onTogglePin:s.togglePin,onRegenerate:s.onRegenerate}),n.jsx($,{agent:f,setAgent:x,model:p,setModel:C,text:r,setText:l,sending:s.sending,activeSource:s.activeSource,onSend:I,attachments:h,setAttachments:v,suggestions:y,onPickSuggestion:e=>l(`${e.split(" ")[0]} `),agents:t.agents||[],onAttach:P,sessionsOpen:!1,infoOpen:!1}),n.jsx("input",{ref:u,type:"file",multiple:!0,style:{display:"none"},onChange:w})]})})]})}export{G as MobileChat};
@@ -1 +1 @@
1
- {"version":3,"file":"MobileChat-BnKN_Ks_.js","sources":["../../src/web/components/chat/FloatingComposer.tsx","../../src/web/mobile/MobileChat.tsx"],"sourcesContent":["// src/components/chat/FloatingComposer.tsx — sticky bottom wrapper for the composer pill.\n\nimport { Composer } from './Composer';\n\ninterface Props {\n agent: string;\n setAgent: (a: string) => void;\n model: string;\n setModel: (m: string) => void;\n text: string;\n setText: (t: string) => void;\n sending: boolean;\n onSend: () => void;\n attachments: string[];\n setAttachments: (a: string[] | ((prev: string[]) => string[])) => void;\n suggestions: Array<{ cmd: string; desc: string }>;\n onPickSuggestion: (cmd: string) => void;\n agents: Array<{ name: string }>;\n onAttach: () => void;\n sessionsOpen: boolean;\n infoOpen: boolean;\n /** Which stream will receive the next message — propagates the\n * pill border color and a small \"→ cline\" hint. */\n activeSource?: 'bizar' | 'cline' | null;\n}\n\nexport function FloatingComposer(props: Props) {\n const { activeSource } = props;\n return (\n <div\n className={`chat-composer-wrap chat-composer-source-${activeSource ?? 'none'} legacy`}\n >\n <div className=\"chat-composer-pill\">\n <Composer {...props} />\n </div>\n </div>\n );\n}","// src/web/mobile/MobileChat.tsx — mobile chat UI without info/sessions sidebars.\n// No OCR capture, no clipper, no sessions panel — pure chat thread.\nimport { useEffect, useRef, useState } from 'react';\nimport { ChatTopBar } from '../components/chat/ChatTopBar';\nimport { ChatThread } from '../components/chat/ChatThread';\nimport { FloatingComposer } from '../components/chat/FloatingComposer';\nimport { useChat } from '../components/chat/useChat';\nimport { useSlashCommands } from '../components/chat/useSlashCommands';\nimport { useToast } from '../components/Toast';\nimport type { Snapshot, Settings } from '../lib/types';\n\ninterface Props {\n snapshot: Snapshot;\n settings: Settings;\n setActiveTab?: (id: string) => void;\n initialTaskId?: string | null;\n onClearTaskId?: () => void;\n}\n\nexport function MobileChat({\n snapshot,\n settings,\n setActiveTab,\n initialTaskId,\n onClearTaskId,\n}: Props) {\n const toast = useToast();\n const chat = useChat(snapshot, settings, initialTaskId ?? '');\n useEffect(() => {\n chat.setToast({\n error: (msg: string) => toast.error(msg),\n success: (msg: string) => toast.success(msg),\n info: (msg: string) => toast.info(msg),\n warning: (msg: string) => toast.warning(msg),\n });\n }, [chat, toast]);\n\n const [text, setText] = useState('');\n const [agent, setAgent] = useState(settings.defaultAgent || 'odin');\n const [model, setModel] = useState(settings.defaultModel || '');\n const [attachments, setAttachments] = useState<string[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const { suggestions, setQuery } = useSlashCommands(snapshot);\n useEffect(() => {\n setQuery(text);\n }, [text, setQuery]);\n\n const onAttach = () => fileInputRef.current?.click();\n const onFiles = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n const next: string[] = [];\n for (let i = 0; i < files.length; i++) next.push(files[i].name);\n setAttachments((cur) => {\n const newNames = next.filter((n) => !cur.includes(n));\n return [...cur, ...newNames];\n });\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const handleSend = async () => {\n const msg = text.trim();\n if (!msg) return;\n setText('');\n setQuery('');\n const result = await chat.onSend(msg, agent, model, attachments);\n if (result.ok) chat.jumpToLatest();\n };\n\n return (\n <div className=\"chat-shell\">\n <ChatTopBar\n activeProject={snapshot.activeProject}\n sessionCount={chat.sessions.length}\n sessionsOpen={false}\n infoOpen={false}\n onToggleSessions={() => undefined}\n onToggleInfo={() => undefined}\n onOpenOverview={() => setActiveTab?.('overview')}\n />\n <div className=\"chat-body\">\n <main className=\"chat-main\">\n <ChatThread\n messages={\n chat.activeSource === 'cline'\n ? chat.clineMessages\n : chat.bizarMessages\n }\n loading={chat.loading}\n activeProject={snapshot.activeProject}\n sessionId={\n chat.activeSource === 'cline'\n ? chat.activeClineSessionId ?? chat.sessionId\n : chat.sessionId\n }\n pinned={chat.pinned}\n activeSource={chat.activeSource}\n onPickSuggestion={(t) => setText(t)}\n onCopy={(m) =>\n chat.copyMessage(m as Parameters<typeof chat.copyMessage>[0])\n }\n onDelete={() => undefined}\n onTogglePin={chat.togglePin}\n onRegenerate={chat.onRegenerate}\n />\n <FloatingComposer\n agent={agent}\n setAgent={setAgent}\n model={model}\n setModel={setModel}\n text={text}\n setText={setText}\n sending={chat.sending}\n activeSource={chat.activeSource}\n onSend={handleSend}\n attachments={attachments}\n setAttachments={setAttachments}\n suggestions={suggestions}\n onPickSuggestion={(cmd) => setText(`${cmd.split(' ')[0]} `)}\n agents={snapshot.agents || []}\n onAttach={onAttach}\n sessionsOpen={false}\n infoOpen={false}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n style={{ display: 'none' }}\n onChange={onFiles}\n />\n </main>\n </div>\n </div>\n );\n}\n"],"names":["FloatingComposer","props","activeSource","jsx","Composer","MobileChat","snapshot","settings","setActiveTab","initialTaskId","onClearTaskId","toast","useToast","chat","useChat","useEffect","msg","text","setText","useState","agent","setAgent","model","setModel","attachments","setAttachments","fileInputRef","useRef","suggestions","setQuery","useSlashCommands","onAttach","_a","onFiles","files","next","i","cur","newNames","n","handleSend","jsxs","ChatTopBar","ChatThread","t","m","cmd"],"mappings":"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"}
1
+ {"version":3,"file":"MobileChat-BJrqwVDd.js","sources":["../../src/web/components/chat/FloatingComposer.tsx","../../src/web/mobile/MobileChat.tsx"],"sourcesContent":["// src/components/chat/FloatingComposer.tsx — sticky bottom wrapper for the composer pill.\n\nimport { Composer } from './Composer';\n\ninterface Props {\n agent: string;\n setAgent: (a: string) => void;\n model: string;\n setModel: (m: string) => void;\n text: string;\n setText: (t: string) => void;\n sending: boolean;\n onSend: () => void;\n attachments: string[];\n setAttachments: (a: string[] | ((prev: string[]) => string[])) => void;\n suggestions: Array<{ cmd: string; desc: string }>;\n onPickSuggestion: (cmd: string) => void;\n agents: Array<{ name: string }>;\n onAttach: () => void;\n sessionsOpen: boolean;\n infoOpen: boolean;\n /** Which stream will receive the next message — propagates the\n * pill border color and a small \"→ cline\" hint. */\n activeSource?: 'bizar' | 'cline' | null;\n}\n\nexport function FloatingComposer(props: Props) {\n const { activeSource } = props;\n return (\n <div\n className={`chat-composer-wrap chat-composer-source-${activeSource ?? 'none'} legacy`}\n >\n <div className=\"chat-composer-pill\">\n <Composer {...props} />\n </div>\n </div>\n );\n}","// src/web/mobile/MobileChat.tsx — mobile chat UI without info/sessions sidebars.\n// No OCR capture, no clipper, no sessions panel — pure chat thread.\nimport { useEffect, useRef, useState } from 'react';\nimport { ChatTopBar } from '../components/chat/ChatTopBar';\nimport { ChatThread } from '../components/chat/ChatThread';\nimport { FloatingComposer } from '../components/chat/FloatingComposer';\nimport { useChat } from '../components/chat/useChat';\nimport { useSlashCommands } from '../components/chat/useSlashCommands';\nimport { useToast } from '../components/Toast';\nimport type { Snapshot, Settings } from '../lib/types';\n\ninterface Props {\n snapshot: Snapshot;\n settings: Settings;\n setActiveTab?: (id: string) => void;\n initialTaskId?: string | null;\n onClearTaskId?: () => void;\n}\n\nexport function MobileChat({\n snapshot,\n settings,\n setActiveTab,\n initialTaskId,\n onClearTaskId,\n}: Props) {\n const toast = useToast();\n const chat = useChat(snapshot, settings, initialTaskId ?? '');\n useEffect(() => {\n chat.setToast({\n error: (msg: string) => toast.error(msg),\n success: (msg: string) => toast.success(msg),\n info: (msg: string) => toast.info(msg),\n warning: (msg: string) => toast.warning(msg),\n });\n }, [chat, toast]);\n\n const [text, setText] = useState('');\n const [agent, setAgent] = useState(settings.defaultAgent || 'odin');\n const [model, setModel] = useState(settings.defaultModel || '');\n const [attachments, setAttachments] = useState<string[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const { suggestions, setQuery } = useSlashCommands(snapshot);\n useEffect(() => {\n setQuery(text);\n }, [text, setQuery]);\n\n const onAttach = () => fileInputRef.current?.click();\n const onFiles = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n const next: string[] = [];\n for (let i = 0; i < files.length; i++) next.push(files[i].name);\n setAttachments((cur) => {\n const newNames = next.filter((n) => !cur.includes(n));\n return [...cur, ...newNames];\n });\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const handleSend = async () => {\n const msg = text.trim();\n if (!msg) return;\n setText('');\n setQuery('');\n const result = await chat.onSend(msg, agent, model, attachments);\n if (result.ok) chat.jumpToLatest();\n };\n\n return (\n <div className=\"chat-shell\">\n <ChatTopBar\n activeProject={snapshot.activeProject}\n sessionCount={chat.sessions.length}\n sessionsOpen={false}\n infoOpen={false}\n onToggleSessions={() => undefined}\n onToggleInfo={() => undefined}\n onOpenOverview={() => setActiveTab?.('overview')}\n />\n <div className=\"chat-body\">\n <main className=\"chat-main\">\n <ChatThread\n messages={\n chat.activeSource === 'cline'\n ? chat.clineMessages\n : chat.bizarMessages\n }\n loading={chat.loading}\n activeProject={snapshot.activeProject}\n sessionId={\n chat.activeSource === 'cline'\n ? chat.activeClineSessionId ?? chat.sessionId\n : chat.sessionId\n }\n pinned={chat.pinned}\n activeSource={chat.activeSource}\n onPickSuggestion={(t) => setText(t)}\n onCopy={(m) =>\n chat.copyMessage(m as Parameters<typeof chat.copyMessage>[0])\n }\n onDelete={() => undefined}\n onTogglePin={chat.togglePin}\n onRegenerate={chat.onRegenerate}\n />\n <FloatingComposer\n agent={agent}\n setAgent={setAgent}\n model={model}\n setModel={setModel}\n text={text}\n setText={setText}\n sending={chat.sending}\n activeSource={chat.activeSource}\n onSend={handleSend}\n attachments={attachments}\n setAttachments={setAttachments}\n suggestions={suggestions}\n onPickSuggestion={(cmd) => setText(`${cmd.split(' ')[0]} `)}\n agents={snapshot.agents || []}\n onAttach={onAttach}\n sessionsOpen={false}\n infoOpen={false}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n style={{ display: 'none' }}\n onChange={onFiles}\n />\n </main>\n </div>\n </div>\n );\n}\n"],"names":["FloatingComposer","props","activeSource","jsx","Composer","MobileChat","snapshot","settings","setActiveTab","initialTaskId","onClearTaskId","toast","useToast","chat","useChat","useEffect","msg","text","setText","useState","agent","setAgent","model","setModel","attachments","setAttachments","fileInputRef","useRef","suggestions","setQuery","useSlashCommands","onAttach","_a","onFiles","files","next","i","cur","newNames","n","handleSend","jsxs","ChatTopBar","ChatThread","t","m","cmd"],"mappings":"ySA0BO,SAASA,EAAiBC,EAAc,CAC7C,KAAM,CAAE,aAAAC,GAAiBD,EACzB,OACEE,EAAAA,IAAC,MAAA,CACC,UAAW,2CAA2CD,GAAgB,MAAM,UAE5E,SAAAC,EAAAA,IAAC,OAAI,UAAU,qBACb,eAACC,EAAA,CAAU,GAAGH,EAAO,CAAA,CACvB,CAAA,CAAA,CAGN,CClBO,SAASI,EAAW,CACzB,SAAAC,EACA,SAAAC,EACA,aAAAC,EACA,cAAAC,EACA,cAAAC,CACF,EAAU,CACR,MAAMC,EAAQC,EAAA,EACRC,EAAOC,EAAQR,EAAUC,EAAUE,GAAiB,EAAE,EAC5DM,EAAAA,UAAU,IAAM,CACdF,EAAK,SAAS,CACZ,MAAQG,GAAgBL,EAAM,MAAMK,CAAG,EACvC,QAAUA,GAAgBL,EAAM,QAAQK,CAAG,EAC3C,KAAOA,GAAgBL,EAAM,KAAKK,CAAG,EACrC,QAAUA,GAAgBL,EAAM,QAAQK,CAAG,CAAA,CAC5C,CACH,EAAG,CAACH,EAAMF,CAAK,CAAC,EAEhB,KAAM,CAACM,EAAMC,CAAO,EAAIC,EAAAA,SAAS,EAAE,EAC7B,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAASZ,EAAS,cAAgB,MAAM,EAC5D,CAACe,EAAOC,CAAQ,EAAIJ,EAAAA,SAASZ,EAAS,cAAgB,EAAE,EACxD,CAACiB,EAAaC,CAAc,EAAIN,EAAAA,SAAmB,CAAA,CAAE,EAErDO,EAAeC,EAAAA,OAAyB,IAAI,EAE5C,CAAE,YAAAC,EAAa,SAAAC,GAAaC,EAAiBxB,CAAQ,EAC3DS,EAAAA,UAAU,IAAM,CACdc,EAASZ,CAAI,CACf,EAAG,CAACA,EAAMY,CAAQ,CAAC,EAEnB,MAAME,EAAW,IAAA,OAAM,OAAAC,EAAAN,EAAa,UAAb,YAAAM,EAAsB,SACvCC,EAAW,GAA2C,CAC1D,MAAMC,EAAQ,EAAE,OAAO,MACvB,GAAI,CAACA,EAAO,OACZ,MAAMC,EAAiB,CAAA,EACvB,QAASC,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAKD,EAAK,KAAKD,EAAME,CAAC,EAAE,IAAI,EAC9DX,EAAgBY,GAAQ,CACtB,MAAMC,EAAWH,EAAK,OAAQI,GAAM,CAACF,EAAI,SAASE,CAAC,CAAC,EACpD,MAAO,CAAC,GAAGF,EAAK,GAAGC,CAAQ,CAC7B,CAAC,EACGZ,EAAa,UAASA,EAAa,QAAQ,MAAQ,GACzD,EAEMc,EAAa,SAAY,CAC7B,MAAMxB,EAAMC,EAAK,KAAA,EACjB,GAAI,CAACD,EAAK,OACVE,EAAQ,EAAE,EACVW,EAAS,EAAE,GACI,MAAMhB,EAAK,OAAOG,EAAKI,EAAOE,EAAOE,CAAW,GACpD,IAAIX,EAAK,aAAA,CACtB,EAEA,OACE4B,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAtC,EAAAA,IAACuC,EAAA,CACC,cAAepC,EAAS,cACxB,aAAcO,EAAK,SAAS,OAC5B,aAAc,GACd,SAAU,GACV,iBAAkB,IAAA,GAClB,aAAc,IAAA,GACd,eAAgB,IAAML,GAAA,YAAAA,EAAe,WAAU,CAAA,QAEhD,MAAA,CAAI,UAAU,YACb,SAAAiC,EAAAA,KAAC,OAAA,CAAK,UAAU,YACd,SAAA,CAAAtC,EAAAA,IAACwC,EAAA,CACC,SACE9B,EAAK,eAAiB,QAClBA,EAAK,cACLA,EAAK,cAEX,QAASA,EAAK,QACd,cAAeP,EAAS,cACxB,UACEO,EAAK,eAAiB,QAClBA,EAAK,sBAAwBA,EAAK,UAClCA,EAAK,UAEX,OAAQA,EAAK,OACb,aAAcA,EAAK,aACnB,iBAAmB+B,GAAM1B,EAAQ0B,CAAC,EAClC,OAASC,GACPhC,EAAK,YAAYgC,CAA2C,EAE9D,SAAU,IAAA,GACV,YAAahC,EAAK,UAClB,aAAcA,EAAK,YAAA,CAAA,EAErBV,EAAAA,IAACH,EAAA,CACC,MAAAoB,EACA,SAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAN,EACA,QAAAC,EACA,QAASL,EAAK,QACd,aAAcA,EAAK,aACnB,OAAQ2B,EACR,YAAAhB,EACA,eAAAC,EACA,YAAAG,EACA,iBAAmBkB,GAAQ5B,EAAQ,GAAG4B,EAAI,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,EAC1D,OAAQxC,EAAS,QAAU,CAAA,EAC3B,SAAAyB,EACA,aAAc,GACd,SAAU,EAAA,CAAA,EAEZ5B,EAAAA,IAAC,QAAA,CACC,IAAKuB,EACL,KAAK,OACL,SAAQ,GACR,MAAO,CAAE,QAAS,MAAA,EAClB,SAAUO,CAAA,CAAA,CACZ,CAAA,CACF,CAAA,CACF,CAAA,EACF,CAEJ"}
@@ -1 +1 @@
1
- import{r,j as e}from"./react-vendor-Dn4wqh4Z.js";import{a as y,S as E,c as R}from"./mobile-layout-3jIhHX_p.js";import{C as M,a as U,b as B,B as I,G,E as V,S as P,U as A,H as C,T as $,c as H}from"./EnvVarsSection-DXM8gRm_.js";import{u as D}from"./Toast-Cpl6-E63.js";import{j as N,aY as k,aR as T,N as F,aa as K,s as O,aC as W,x as w,R as Y,aF as q,I as J,e as Q}from"./icons-Do5N2jmX.js";function X(){const s=D(),[i,t]=r.useState(!0),[c,a]=r.useState(!1),[o,d]=r.useState(!1),[u,g]=r.useState(""),[p,x]=r.useState(""),[f,h]=r.useState(!1),[j,n]=r.useState(0);r.useEffect(()=>{let l=!1;return(async()=>{var S,L;try{const[z,v]=await Promise.all([y.get("/memory/config/global").catch(()=>null),y.get("/memory/status").catch(()=>null)]);if(l)return;z&&g(((L=(S=z.config)==null?void 0:S.git)==null?void 0:L.remoteUrl)||""),v&&(x(v.vaultRoot||""),h(!!v.initialized))}finally{l||t(!1)}})(),()=>{l=!0}},[j]);const b=async()=>{a(!0);try{await y.put("/memory/config/global",{git:{remoteUrl:u}}),s.success("Memory config saved."),n(l=>l+1)}catch(l){s.error(`Save failed: ${l.message}`)}finally{a(!1)}},m=async()=>{d(!0);try{await y.post("/memory/init",{}),s.success("Vault initialised."),n(l=>l+1)}catch(l){s.error(`Initialise failed: ${l.message}`)}finally{d(!1)}};return e.jsxs(M,{id:"settings-memory","data-section":"memory",children:[e.jsxs(U,{children:[e.jsx(N,{size:14})," Memory vault"]}),e.jsx(B,{children:"The vault lives at a default location on disk. Only the git remote URL needs to be configured to enable sync across machines."}),i?e.jsx("div",{className:"flex-center",style:{padding:24},children:e.jsx(E,{size:"sm"})}):e.jsxs("div",{className:"settings-fields",children:[e.jsxs("div",{className:"field",children:[e.jsxs("label",{className:"field-label",children:[e.jsx(k,{size:12,style:{display:"inline",marginRight:4}}),"Vault path"]}),e.jsxs("div",{className:"field-readonly mono","data-testid":"settings-memory-vault-path",style:{fontSize:12,padding:"6px 0"},children:[p||e.jsx("span",{className:"muted",children:"not initialised"}),f?null:e.jsxs(I,{variant:"ghost",size:"sm",onClick:m,disabled:o,style:{marginLeft:12},children:[o?e.jsx(T,{size:12,className:"memory-spin"}):e.jsx(k,{size:12}),"Initialise"]})]})]}),e.jsxs("div",{className:"field",children:[e.jsxs("label",{className:"field-label",htmlFor:"set-memory-git-remote",children:[e.jsx(F,{size:12,style:{display:"inline",marginRight:4}}),"Git remote URL"]}),e.jsx("input",{id:"set-memory-git-remote",className:"input mono",type:"text",value:u,onChange:l=>g(l.target.value),placeholder:"git@github.com:org/repo.git"}),e.jsx("span",{className:"field-hint",children:"Leave empty to use local-only mode (no git sync)."})]}),e.jsx("div",{style:{marginTop:12},children:e.jsxs(I,{variant:"primary",size:"sm",onClick:b,disabled:c,children:[c?e.jsx(T,{size:12,className:"memory-spin"}):e.jsx(K,{size:12}),"Save memory config"]})})]})]})}function Z({settings:s,onSettingsChange:i,autoSave:t}){const c=(o,d)=>{i==null||i(o,d),t==null||t(o,d)},a=o=>{i==null||i("ui",{...s.ui,...o}),t==null||t("ui",{...s.ui,...o})};return e.jsx(G,{settings:s,patchUi:a,patchTop:c,autoSave:t})}function _({settings:s,onSettingsChange:i,autoSave:t}){return e.jsxs("div",{style:{fontSize:13,color:"var(--text-dim)",padding:"8px 0"},children:[e.jsx("p",{style:{marginBottom:8},children:"Provider management is available on desktop."}),e.jsx("a",{href:"/?desktop=1#settings-providers",className:"mobile-btn mobile-btn-secondary",style:{display:"inline-block",fontSize:12,padding:"6px 12px"},children:"Open desktop to manage providers"})]})}function ee(){return e.jsx(V,{})}function se(){return e.jsx(X,{})}function ie({settings:s,onSettingsChange:i,autoSave:t}){const c=(a,o)=>{i==null||i(a,o),t==null||t(a,o)};return e.jsx(P,{settings:s,patchTop:c})}function te(){return e.jsx(A,{})}function ne({settings:s}){const[i,t]=r.useState(s),[c,a]=r.useState(!1);return e.jsx(C,{settings:i,setSettings:t,setDirty:a})}function ae(){return e.jsx($,{})}function oe({settings:s}){const i=s.about||{version:"—",homepage:"https://github.com/DrB0rk/BizarHarness",license:"MIT"};return e.jsx(H,{about:i})}function pe({settings:s,onSettingsChange:i,autoSave:t,snapshot:c}){var x,f,h,j;const[a,o]=r.useState(""),[d,u]=r.useState(null),p=[{id:"general",title:"General",icon:O,description:"Theme, accent, layout",component:e.jsx(Z,{settings:s,onSettingsChange:i,autoSave:t})},{id:"providers",title:"AI Providers",icon:N,description:`${((x=c==null?void 0:c.providers)==null?void 0:x.length)??0} configured`,component:e.jsx(_,{settings:s,onSettingsChange:i,autoSave:t})},{id:"env-vars",title:"Environment Variables",icon:W,description:"API keys, secrets",component:e.jsx(ee,{})},{id:"memory",title:"Memory Vault",icon:N,description:"Git remote, LightRAG config",component:e.jsx(se,{})},{id:"system-llm",title:"System LLM",icon:w,description:((f=s.systemLlm)==null?void 0:f.model)||"not set",component:e.jsx(ie,{settings:s,onSettingsChange:i,autoSave:t})},{id:"updates",title:"Updates",icon:Y,description:"Check for updates",component:e.jsx(te,{})},{id:"headroom",title:"Headroom",icon:w,description:(h=s.headroom)!=null&&h.enabled?"Enabled":"Disabled",component:e.jsx(ne,{settings:s})},{id:"tailscale",title:"Tailscale",icon:q,description:"Tailscale serve & auth",component:e.jsx(ae,{})},{id:"about",title:"About",icon:J,description:`Bizar v${((j=s.about)==null?void 0:j.version)||"—"}`,component:e.jsx(oe,{settings:s})}].filter(n=>!a||n.title.toLowerCase().includes(a.toLowerCase())||n.description.toLowerCase().includes(a.toLowerCase()));return e.jsxs("div",{className:"mobile-settings",children:[e.jsxs("div",{className:"mobile-settings-search",children:[e.jsx(le,{}),e.jsx("input",{value:a,onChange:n=>o(n.target.value),placeholder:"Search settings...","aria-label":"Search settings"})]}),e.jsxs("div",{className:"mobile-settings-list",children:[p.map(n=>{const b=n.icon,m=d===n.id;return e.jsxs("div",{className:R("mobile-settings-item",m&&"is-expanded"),children:[e.jsxs("button",{className:"mobile-settings-item-head",onClick:()=>u(m?null:n.id),"aria-expanded":m,"aria-controls":`mobile-settings-body-${n.id}`,children:[e.jsx("div",{className:"mobile-settings-item-icon",children:e.jsx(b,{size:18})}),e.jsxs("div",{className:"mobile-settings-item-text",children:[e.jsx("div",{className:"mobile-settings-item-title",children:n.title}),e.jsx("div",{className:"mobile-settings-item-desc",children:n.description})]}),e.jsx(Q,{size:16,className:R("mobile-settings-item-chevron",m&&"is-rotated")})]}),m&&e.jsx("div",{id:`mobile-settings-body-${n.id}`,className:"mobile-settings-item-body",children:n.component})]},n.id)}),p.length===0&&e.jsxs("div",{className:"mobile-settings-empty",children:['No settings match "',a,'"']})]})]})}function le(){return e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("path",{d:"m21 21-4.35-4.35"})]})}export{pe as MobileSettings};
1
+ import{r,j as e}from"./react-vendor-Dn4wqh4Z.js";import{a as y,S as E,c as R}from"./mobile-layout-CBHjpwsb.js";import{C as M,a as U,b as B,B as I,G,E as V,S as P,U as A,H as C,T as $,c as H}from"./EnvVarsSection-B58aiJiE.js";import{u as D}from"./Toast-Cpl6-E63.js";import{j as N,aY as k,aR as T,N as F,aa as K,s as O,aC as W,x as w,R as Y,aF as q,I as J,e as Q}from"./icons-Do5N2jmX.js";function X(){const s=D(),[i,t]=r.useState(!0),[c,a]=r.useState(!1),[o,d]=r.useState(!1),[u,g]=r.useState(""),[p,x]=r.useState(""),[f,h]=r.useState(!1),[j,n]=r.useState(0);r.useEffect(()=>{let l=!1;return(async()=>{var S,L;try{const[z,v]=await Promise.all([y.get("/memory/config/global").catch(()=>null),y.get("/memory/status").catch(()=>null)]);if(l)return;z&&g(((L=(S=z.config)==null?void 0:S.git)==null?void 0:L.remoteUrl)||""),v&&(x(v.vaultRoot||""),h(!!v.initialized))}finally{l||t(!1)}})(),()=>{l=!0}},[j]);const b=async()=>{a(!0);try{await y.put("/memory/config/global",{git:{remoteUrl:u}}),s.success("Memory config saved."),n(l=>l+1)}catch(l){s.error(`Save failed: ${l.message}`)}finally{a(!1)}},m=async()=>{d(!0);try{await y.post("/memory/init",{}),s.success("Vault initialised."),n(l=>l+1)}catch(l){s.error(`Initialise failed: ${l.message}`)}finally{d(!1)}};return e.jsxs(M,{id:"settings-memory","data-section":"memory",children:[e.jsxs(U,{children:[e.jsx(N,{size:14})," Memory vault"]}),e.jsx(B,{children:"The vault lives at a default location on disk. Only the git remote URL needs to be configured to enable sync across machines."}),i?e.jsx("div",{className:"flex-center",style:{padding:24},children:e.jsx(E,{size:"sm"})}):e.jsxs("div",{className:"settings-fields",children:[e.jsxs("div",{className:"field",children:[e.jsxs("label",{className:"field-label",children:[e.jsx(k,{size:12,style:{display:"inline",marginRight:4}}),"Vault path"]}),e.jsxs("div",{className:"field-readonly mono","data-testid":"settings-memory-vault-path",style:{fontSize:12,padding:"6px 0"},children:[p||e.jsx("span",{className:"muted",children:"not initialised"}),f?null:e.jsxs(I,{variant:"ghost",size:"sm",onClick:m,disabled:o,style:{marginLeft:12},children:[o?e.jsx(T,{size:12,className:"memory-spin"}):e.jsx(k,{size:12}),"Initialise"]})]})]}),e.jsxs("div",{className:"field",children:[e.jsxs("label",{className:"field-label",htmlFor:"set-memory-git-remote",children:[e.jsx(F,{size:12,style:{display:"inline",marginRight:4}}),"Git remote URL"]}),e.jsx("input",{id:"set-memory-git-remote",className:"input mono",type:"text",value:u,onChange:l=>g(l.target.value),placeholder:"git@github.com:org/repo.git"}),e.jsx("span",{className:"field-hint",children:"Leave empty to use local-only mode (no git sync)."})]}),e.jsx("div",{style:{marginTop:12},children:e.jsxs(I,{variant:"primary",size:"sm",onClick:b,disabled:c,children:[c?e.jsx(T,{size:12,className:"memory-spin"}):e.jsx(K,{size:12}),"Save memory config"]})})]})]})}function Z({settings:s,onSettingsChange:i,autoSave:t}){const c=(o,d)=>{i==null||i(o,d),t==null||t(o,d)},a=o=>{i==null||i("ui",{...s.ui,...o}),t==null||t("ui",{...s.ui,...o})};return e.jsx(G,{settings:s,patchUi:a,patchTop:c,autoSave:t})}function _({settings:s,onSettingsChange:i,autoSave:t}){return e.jsxs("div",{style:{fontSize:13,color:"var(--text-dim)",padding:"8px 0"},children:[e.jsx("p",{style:{marginBottom:8},children:"Provider management is available on desktop."}),e.jsx("a",{href:"/?desktop=1#settings-providers",className:"mobile-btn mobile-btn-secondary",style:{display:"inline-block",fontSize:12,padding:"6px 12px"},children:"Open desktop to manage providers"})]})}function ee(){return e.jsx(V,{})}function se(){return e.jsx(X,{})}function ie({settings:s,onSettingsChange:i,autoSave:t}){const c=(a,o)=>{i==null||i(a,o),t==null||t(a,o)};return e.jsx(P,{settings:s,patchTop:c})}function te(){return e.jsx(A,{})}function ne({settings:s}){const[i,t]=r.useState(s),[c,a]=r.useState(!1);return e.jsx(C,{settings:i,setSettings:t,setDirty:a})}function ae(){return e.jsx($,{})}function oe({settings:s}){const i=s.about||{version:"—",homepage:"https://github.com/DrB0rk/BizarHarness",license:"MIT"};return e.jsx(H,{about:i})}function pe({settings:s,onSettingsChange:i,autoSave:t,snapshot:c}){var x,f,h,j;const[a,o]=r.useState(""),[d,u]=r.useState(null),p=[{id:"general",title:"General",icon:O,description:"Theme, accent, layout",component:e.jsx(Z,{settings:s,onSettingsChange:i,autoSave:t})},{id:"providers",title:"AI Providers",icon:N,description:`${((x=c==null?void 0:c.providers)==null?void 0:x.length)??0} configured`,component:e.jsx(_,{settings:s,onSettingsChange:i,autoSave:t})},{id:"env-vars",title:"Environment Variables",icon:W,description:"API keys, secrets",component:e.jsx(ee,{})},{id:"memory",title:"Memory Vault",icon:N,description:"Git remote, LightRAG config",component:e.jsx(se,{})},{id:"system-llm",title:"System LLM",icon:w,description:((f=s.systemLlm)==null?void 0:f.model)||"not set",component:e.jsx(ie,{settings:s,onSettingsChange:i,autoSave:t})},{id:"updates",title:"Updates",icon:Y,description:"Check for updates",component:e.jsx(te,{})},{id:"headroom",title:"Headroom",icon:w,description:(h=s.headroom)!=null&&h.enabled?"Enabled":"Disabled",component:e.jsx(ne,{settings:s})},{id:"tailscale",title:"Tailscale",icon:q,description:"Tailscale serve & auth",component:e.jsx(ae,{})},{id:"about",title:"About",icon:J,description:`Bizar v${((j=s.about)==null?void 0:j.version)||"—"}`,component:e.jsx(oe,{settings:s})}].filter(n=>!a||n.title.toLowerCase().includes(a.toLowerCase())||n.description.toLowerCase().includes(a.toLowerCase()));return e.jsxs("div",{className:"mobile-settings",children:[e.jsxs("div",{className:"mobile-settings-search",children:[e.jsx(le,{}),e.jsx("input",{value:a,onChange:n=>o(n.target.value),placeholder:"Search settings...","aria-label":"Search settings"})]}),e.jsxs("div",{className:"mobile-settings-list",children:[p.map(n=>{const b=n.icon,m=d===n.id;return e.jsxs("div",{className:R("mobile-settings-item",m&&"is-expanded"),children:[e.jsxs("button",{className:"mobile-settings-item-head",onClick:()=>u(m?null:n.id),"aria-expanded":m,"aria-controls":`mobile-settings-body-${n.id}`,children:[e.jsx("div",{className:"mobile-settings-item-icon",children:e.jsx(b,{size:18})}),e.jsxs("div",{className:"mobile-settings-item-text",children:[e.jsx("div",{className:"mobile-settings-item-title",children:n.title}),e.jsx("div",{className:"mobile-settings-item-desc",children:n.description})]}),e.jsx(Q,{size:16,className:R("mobile-settings-item-chevron",m&&"is-rotated")})]}),m&&e.jsx("div",{id:`mobile-settings-body-${n.id}`,className:"mobile-settings-item-body",children:n.component})]},n.id)}),p.length===0&&e.jsxs("div",{className:"mobile-settings-empty",children:['No settings match "',a,'"']})]})]})}function le(){return e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("path",{d:"m21 21-4.35-4.35"})]})}export{pe as MobileSettings};
@@ -1 +1 @@
1
- {"version":3,"file":"MobileSettings-DjCPxC-Q.js","sources":["../../src/web/views/settings/MemorySection.tsx","../../src/web/mobile/MobileSettings.tsx"],"sourcesContent":["// src/web/views/settings/MemorySection.tsx — memory vault + git config for Settings.\n// v6.x — Vault path now loads from /api/memory/status (was hardcoded to '').\n// We also surface a small \"Initialise\" button when the vault does not exist.\nimport React, { useEffect, useState } from 'react';\nimport { Brain, GitBranch, Loader2, Save, FolderInput } from 'lucide-react';\nimport { Button } from '../../components/Button';\nimport { Card, CardTitle, CardMeta } from '../../components/Card';\nimport { Spinner } from '../../components/Spinner';\nimport { useToast } from '../../components/Toast';\nimport { api } from '../../lib/api';\n\ntype GitConfig = {\n remoteUrl?: string;\n};\n\ntype GlobalConfig = {\n git?: GitConfig;\n};\n\ntype MemoryStatus = {\n initialized: boolean;\n vaultRoot?: string | null;\n mode?: string | null;\n};\n\nexport function MemorySection() {\n const toast = useToast();\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [initialising, setInitialising] = useState(false);\n const [remoteUrl, setRemoteUrl] = useState('');\n const [vaultPath, setVaultPath] = useState<string>('');\n const [vaultInitialised, setVaultInitialised] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const [cfgRes, statusRes] = await Promise.all([\n api.get<{ config: GlobalConfig; path?: string }>('/memory/config/global').catch(() => null),\n api.get<MemoryStatus>('/memory/status').catch(() => null),\n ]);\n if (cancelled) return;\n if (cfgRes) setRemoteUrl(cfgRes.config?.git?.remoteUrl || '');\n if (statusRes) {\n setVaultPath(statusRes.vaultRoot || '');\n setVaultInitialised(!!statusRes.initialized);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => { cancelled = true; };\n }, [refreshKey]);\n\n const onSave = async () => {\n setSaving(true);\n try {\n await api.put('/memory/config/global', { git: { remoteUrl } });\n toast.success('Memory config saved.');\n setRefreshKey((k) => k + 1);\n } catch (err) {\n toast.error(`Save failed: ${(err as Error).message}`);\n } finally {\n setSaving(false);\n }\n };\n\n const onInitialise = async () => {\n setInitialising(true);\n try {\n await api.post('/memory/init', {});\n toast.success('Vault initialised.');\n setRefreshKey((k) => k + 1);\n } catch (err) {\n toast.error(`Initialise failed: ${(err as Error).message}`);\n } finally {\n setInitialising(false);\n }\n };\n\n return (\n <Card id=\"settings-memory\" data-section=\"memory\">\n <CardTitle><Brain size={14} /> Memory vault</CardTitle>\n <CardMeta>\n The vault lives at a default location on disk. Only the git remote URL\n needs to be configured to enable sync across machines.\n </CardMeta>\n\n {loading ? (\n <div className=\"flex-center\" style={{ padding: 24 }}>\n <Spinner size=\"sm\" />\n </div>\n ) : (\n <div className=\"settings-fields\">\n <div className=\"field\">\n <label className=\"field-label\">\n <FolderInput size={12} style={{ display: 'inline', marginRight: 4 }} />\n Vault path\n </label>\n <div\n className=\"field-readonly mono\"\n data-testid=\"settings-memory-vault-path\"\n style={{ fontSize: 12, padding: '6px 0' }}\n >\n {vaultPath || <span className=\"muted\">not initialised</span>}\n {vaultInitialised ? null : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onInitialise}\n disabled={initialising}\n style={{ marginLeft: 12 }}\n >\n {initialising ? <Loader2 size={12} className=\"memory-spin\" /> : <FolderInput size={12} />}\n Initialise\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"field\">\n <label className=\"field-label\" htmlFor=\"set-memory-git-remote\">\n <GitBranch size={12} style={{ display: 'inline', marginRight: 4 }} />\n Git remote URL\n </label>\n <input\n id=\"set-memory-git-remote\"\n className=\"input mono\"\n type=\"text\"\n value={remoteUrl}\n onChange={(e) => setRemoteUrl(e.target.value)}\n placeholder=\"git@github.com:org/repo.git\"\n />\n <span className=\"field-hint\">Leave empty to use local-only mode (no git sync).</span>\n </div>\n\n <div style={{ marginTop: 12 }}>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={onSave}\n disabled={saving}\n >\n {saving ? <Loader2 size={12} className=\"memory-spin\" /> : <Save size={12} />}\n Save memory config\n </Button>\n </div>\n </div>\n )}\n </Card>\n );\n}\n","// src/web/mobile/MobileSettings.tsx — v5.4 mobile settings with full desktop parity.\n// All 9 sections in an accordion layout with search.\nimport { useState } from 'react';\nimport {\n Settings2, Brain, KeyRound, Cpu, RefreshCw, Globe, Info, ChevronRight,\n} from 'lucide-react';\nimport { cn } from '../lib/utils';\nimport type { Settings, Snapshot } from '../lib/types';\n\n// Sub-section components — each renders its section content inline.\nimport { GeneralSection } from '../views/settings/GeneralSection';\nimport { EnvVarsSection } from '../views/settings/EnvVarsSection';\nimport { MemorySection } from '../views/settings/MemorySection';\nimport { SystemLlmSection } from '../views/settings/SystemLlmSection';\nimport { UpdatesSection } from '../views/settings/UpdatesSection';\nimport { HeadroomSection } from '../views/settings/HeadroomSection';\nimport { TailscaleSettings } from '../components/TailscaleSettings';\nimport { ActivitySection } from '../views/settings/ActivitySection';\n\n// Lazy-load heavy sections that pull in large dependencies.\nimport React from 'react';\n\ntype Props = {\n settings: Settings;\n /** Called when the user changes any top-level setting */\n onSettingsChange?: <K extends keyof Settings>(key: K, value: Settings[K]) => void;\n /** Debounced auto-save to API (key, value) */\n autoSave?: (key: keyof Settings, value: Settings[keyof Settings]) => void;\n /** Optional snapshot for counts / agent list */\n snapshot?: Snapshot | null;\n /** v5.3 compatibility — called after settings are saved (MobileApp.tsx passes refreshSnapshot) */\n onRefresh?: () => Promise<void>;\n};\n\n// ─── Section definitions ─────────────────────────────────────────────────────\n\nfunction GeneralSettings({ settings, onSettingsChange, autoSave }: Props) {\n const patchTop = <K extends keyof Settings>(key: K, value: Settings[K]) => {\n onSettingsChange?.(key, value);\n autoSave?.(key, value);\n };\n const patchUi = (patch: Partial<Settings['ui']>) => {\n onSettingsChange?.('ui', { ...settings.ui, ...patch });\n autoSave?.('ui', { ...settings.ui, ...patch });\n };\n return (\n <GeneralSection\n settings={settings}\n patchUi={patchUi}\n patchTop={patchTop}\n autoSave={autoSave}\n />\n );\n}\n\nfunction ProvidersSettings({ settings, onSettingsChange, autoSave }: Props) {\n // Providers are managed server-side; show a link to the desktop providers view.\n // Mobile can't add/edit providers without more complex auth flow.\n void settings; void onSettingsChange; void autoSave;\n return (\n <div style={{ fontSize: 13, color: 'var(--text-dim)', padding: '8px 0' }}>\n <p style={{ marginBottom: 8 }}>\n Provider management is available on desktop.\n </p>\n <a href=\"/?desktop=1#settings-providers\" className=\"mobile-btn mobile-btn-secondary\" style={{ display: 'inline-block', fontSize: 12, padding: '6px 12px' }}>\n Open desktop to manage providers\n </a>\n </div>\n );\n}\n\nfunction EnvVarsSettings() {\n return <EnvVarsSection />;\n}\n\nfunction MemorySettings() {\n return <MemorySection />;\n}\n\nfunction SystemLlmSettings({ settings, onSettingsChange, autoSave }: Props) {\n const patchTop = <K extends keyof Settings>(key: K, value: Settings[K]) => {\n onSettingsChange?.(key, value);\n autoSave?.(key, value);\n };\n return <SystemLlmSection settings={settings} patchTop={patchTop} />;\n}\n\nfunction UpdatesSettings() {\n return <UpdatesSection />;\n}\n\nfunction HeadroomSettingsSection({ settings }: { settings: Settings }) {\n const [localSettings, setLocalSettings] = useState(settings);\n const [dirty, setDirty] = useState(false);\n return (\n <HeadroomSection\n settings={localSettings}\n setSettings={setLocalSettings as React.Dispatch<React.SetStateAction<Settings>>}\n setDirty={setDirty}\n />\n );\n}\n\nfunction TailscaleSettingsMobile() {\n return <TailscaleSettings />;\n}\n\nfunction AboutSection({ settings }: { settings: Settings }) {\n const about = settings.about || { version: '—', homepage: 'https://github.com/DrB0rk/BizarHarness', license: 'MIT' };\n return <ActivitySection about={about} />;\n}\n\n// ─── Main component ──────────────────────────────────────────────────────────\n\nexport function MobileSettings({ settings, onSettingsChange, autoSave, snapshot }: Props) {\n const [search, setSearch] = useState('');\n const [expandedSection, setExpandedSection] = useState<string | null>(null);\n\n const sections = [\n {\n id: 'general',\n title: 'General',\n icon: Settings2,\n description: 'Theme, accent, layout',\n component: <GeneralSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'providers',\n title: 'AI Providers',\n icon: Brain,\n description: `${snapshot?.providers?.length ?? 0} configured`,\n component: <ProvidersSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'env-vars',\n title: 'Environment Variables',\n icon: KeyRound,\n description: 'API keys, secrets',\n component: <EnvVarsSettings />,\n },\n {\n id: 'memory',\n title: 'Memory Vault',\n icon: Brain,\n description: 'Git remote, LightRAG config',\n component: <MemorySettings />,\n },\n {\n id: 'system-llm',\n title: 'System LLM',\n icon: Cpu,\n description: settings.systemLlm?.model || 'not set',\n component: <SystemLlmSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'updates',\n title: 'Updates',\n icon: RefreshCw,\n description: 'Check for updates',\n component: <UpdatesSettings />,\n },\n {\n id: 'headroom',\n title: 'Headroom',\n icon: Cpu,\n description: settings.headroom?.enabled ? 'Enabled' : 'Disabled',\n component: <HeadroomSettingsSection settings={settings} />,\n },\n {\n id: 'tailscale',\n title: 'Tailscale',\n icon: Globe,\n description: 'Tailscale serve & auth',\n component: <TailscaleSettingsMobile />,\n },\n {\n id: 'about',\n title: 'About',\n icon: Info,\n description: `Bizar v${settings.about?.version || '—'}`,\n component: <AboutSection settings={settings} />,\n },\n ];\n\n const filtered = sections.filter(\n (s) =>\n !search ||\n s.title.toLowerCase().includes(search.toLowerCase()) ||\n s.description.toLowerCase().includes(search.toLowerCase()),\n );\n\n return (\n <div className=\"mobile-settings\">\n <div className=\"mobile-settings-search\">\n <SearchIcon />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search settings...\"\n aria-label=\"Search settings\"\n />\n </div>\n\n <div className=\"mobile-settings-list\">\n {filtered.map((s) => {\n const Icon = s.icon;\n const isExpanded = expandedSection === s.id;\n return (\n <div key={s.id} className={cn('mobile-settings-item', isExpanded && 'is-expanded')}>\n <button\n className=\"mobile-settings-item-head\"\n onClick={() => setExpandedSection(isExpanded ? null : s.id)}\n aria-expanded={isExpanded}\n aria-controls={`mobile-settings-body-${s.id}`}\n >\n <div className=\"mobile-settings-item-icon\">\n <Icon size={18} />\n </div>\n <div className=\"mobile-settings-item-text\">\n <div className=\"mobile-settings-item-title\">{s.title}</div>\n <div className=\"mobile-settings-item-desc\">{s.description}</div>\n </div>\n <ChevronRight\n size={16}\n className={cn('mobile-settings-item-chevron', isExpanded && 'is-rotated')}\n />\n </button>\n {isExpanded && (\n <div id={`mobile-settings-body-${s.id}`} className=\"mobile-settings-item-body\">\n {s.component}\n </div>\n )}\n </div>\n );\n })}\n {filtered.length === 0 && (\n <div className=\"mobile-settings-empty\">No settings match \"{search}\"</div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.35-4.35\" />\n </svg>\n );\n}\n"],"names":["MemorySection","toast","useToast","loading","setLoading","useState","saving","setSaving","initialising","setInitialising","remoteUrl","setRemoteUrl","vaultPath","setVaultPath","vaultInitialised","setVaultInitialised","refreshKey","setRefreshKey","useEffect","cancelled","cfgRes","statusRes","api","_b","_a","onSave","k","err","onInitialise","jsxs","Card","CardTitle","jsx","Brain","CardMeta","Spinner","FolderInput","Button","Loader2","GitBranch","e","Save","GeneralSettings","settings","onSettingsChange","autoSave","patchTop","key","value","patchUi","patch","GeneralSection","ProvidersSettings","EnvVarsSettings","EnvVarsSection","MemorySettings","SystemLlmSettings","SystemLlmSection","UpdatesSettings","UpdatesSection","HeadroomSettingsSection","localSettings","setLocalSettings","dirty","setDirty","HeadroomSection","TailscaleSettingsMobile","TailscaleSettings","AboutSection","about","ActivitySection","MobileSettings","snapshot","search","setSearch","expandedSection","setExpandedSection","filtered","Settings2","KeyRound","Cpu","RefreshCw","_c","Globe","Info","_d","s","SearchIcon","Icon","isExpanded","cn","ChevronRight"],"mappings":"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"}
1
+ {"version":3,"file":"MobileSettings-CEQNJNLJ.js","sources":["../../src/web/views/settings/MemorySection.tsx","../../src/web/mobile/MobileSettings.tsx"],"sourcesContent":["// src/web/views/settings/MemorySection.tsx — memory vault + git config for Settings.\n// v6.x — Vault path now loads from /api/memory/status (was hardcoded to '').\n// We also surface a small \"Initialise\" button when the vault does not exist.\nimport React, { useEffect, useState } from 'react';\nimport { Brain, GitBranch, Loader2, Save, FolderInput } from 'lucide-react';\nimport { Button } from '../../components/Button';\nimport { Card, CardTitle, CardMeta } from '../../components/Card';\nimport { Spinner } from '../../components/Spinner';\nimport { useToast } from '../../components/Toast';\nimport { api } from '../../lib/api';\n\ntype GitConfig = {\n remoteUrl?: string;\n};\n\ntype GlobalConfig = {\n git?: GitConfig;\n};\n\ntype MemoryStatus = {\n initialized: boolean;\n vaultRoot?: string | null;\n mode?: string | null;\n};\n\nexport function MemorySection() {\n const toast = useToast();\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [initialising, setInitialising] = useState(false);\n const [remoteUrl, setRemoteUrl] = useState('');\n const [vaultPath, setVaultPath] = useState<string>('');\n const [vaultInitialised, setVaultInitialised] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const [cfgRes, statusRes] = await Promise.all([\n api.get<{ config: GlobalConfig; path?: string }>('/memory/config/global').catch(() => null),\n api.get<MemoryStatus>('/memory/status').catch(() => null),\n ]);\n if (cancelled) return;\n if (cfgRes) setRemoteUrl(cfgRes.config?.git?.remoteUrl || '');\n if (statusRes) {\n setVaultPath(statusRes.vaultRoot || '');\n setVaultInitialised(!!statusRes.initialized);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => { cancelled = true; };\n }, [refreshKey]);\n\n const onSave = async () => {\n setSaving(true);\n try {\n await api.put('/memory/config/global', { git: { remoteUrl } });\n toast.success('Memory config saved.');\n setRefreshKey((k) => k + 1);\n } catch (err) {\n toast.error(`Save failed: ${(err as Error).message}`);\n } finally {\n setSaving(false);\n }\n };\n\n const onInitialise = async () => {\n setInitialising(true);\n try {\n await api.post('/memory/init', {});\n toast.success('Vault initialised.');\n setRefreshKey((k) => k + 1);\n } catch (err) {\n toast.error(`Initialise failed: ${(err as Error).message}`);\n } finally {\n setInitialising(false);\n }\n };\n\n return (\n <Card id=\"settings-memory\" data-section=\"memory\">\n <CardTitle><Brain size={14} /> Memory vault</CardTitle>\n <CardMeta>\n The vault lives at a default location on disk. Only the git remote URL\n needs to be configured to enable sync across machines.\n </CardMeta>\n\n {loading ? (\n <div className=\"flex-center\" style={{ padding: 24 }}>\n <Spinner size=\"sm\" />\n </div>\n ) : (\n <div className=\"settings-fields\">\n <div className=\"field\">\n <label className=\"field-label\">\n <FolderInput size={12} style={{ display: 'inline', marginRight: 4 }} />\n Vault path\n </label>\n <div\n className=\"field-readonly mono\"\n data-testid=\"settings-memory-vault-path\"\n style={{ fontSize: 12, padding: '6px 0' }}\n >\n {vaultPath || <span className=\"muted\">not initialised</span>}\n {vaultInitialised ? null : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onInitialise}\n disabled={initialising}\n style={{ marginLeft: 12 }}\n >\n {initialising ? <Loader2 size={12} className=\"memory-spin\" /> : <FolderInput size={12} />}\n Initialise\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"field\">\n <label className=\"field-label\" htmlFor=\"set-memory-git-remote\">\n <GitBranch size={12} style={{ display: 'inline', marginRight: 4 }} />\n Git remote URL\n </label>\n <input\n id=\"set-memory-git-remote\"\n className=\"input mono\"\n type=\"text\"\n value={remoteUrl}\n onChange={(e) => setRemoteUrl(e.target.value)}\n placeholder=\"git@github.com:org/repo.git\"\n />\n <span className=\"field-hint\">Leave empty to use local-only mode (no git sync).</span>\n </div>\n\n <div style={{ marginTop: 12 }}>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={onSave}\n disabled={saving}\n >\n {saving ? <Loader2 size={12} className=\"memory-spin\" /> : <Save size={12} />}\n Save memory config\n </Button>\n </div>\n </div>\n )}\n </Card>\n );\n}\n","// src/web/mobile/MobileSettings.tsx — v5.4 mobile settings with full desktop parity.\n// All 9 sections in an accordion layout with search.\nimport { useState } from 'react';\nimport {\n Settings2, Brain, KeyRound, Cpu, RefreshCw, Globe, Info, ChevronRight,\n} from 'lucide-react';\nimport { cn } from '../lib/utils';\nimport type { Settings, Snapshot } from '../lib/types';\n\n// Sub-section components — each renders its section content inline.\nimport { GeneralSection } from '../views/settings/GeneralSection';\nimport { EnvVarsSection } from '../views/settings/EnvVarsSection';\nimport { MemorySection } from '../views/settings/MemorySection';\nimport { SystemLlmSection } from '../views/settings/SystemLlmSection';\nimport { UpdatesSection } from '../views/settings/UpdatesSection';\nimport { HeadroomSection } from '../views/settings/HeadroomSection';\nimport { TailscaleSettings } from '../components/TailscaleSettings';\nimport { ActivitySection } from '../views/settings/ActivitySection';\n\n// Lazy-load heavy sections that pull in large dependencies.\nimport React from 'react';\n\ntype Props = {\n settings: Settings;\n /** Called when the user changes any top-level setting */\n onSettingsChange?: <K extends keyof Settings>(key: K, value: Settings[K]) => void;\n /** Debounced auto-save to API (key, value) */\n autoSave?: (key: keyof Settings, value: Settings[keyof Settings]) => void;\n /** Optional snapshot for counts / agent list */\n snapshot?: Snapshot | null;\n /** v5.3 compatibility — called after settings are saved (MobileApp.tsx passes refreshSnapshot) */\n onRefresh?: () => Promise<void>;\n};\n\n// ─── Section definitions ─────────────────────────────────────────────────────\n\nfunction GeneralSettings({ settings, onSettingsChange, autoSave }: Props) {\n const patchTop = <K extends keyof Settings>(key: K, value: Settings[K]) => {\n onSettingsChange?.(key, value);\n autoSave?.(key, value);\n };\n const patchUi = (patch: Partial<Settings['ui']>) => {\n onSettingsChange?.('ui', { ...settings.ui, ...patch });\n autoSave?.('ui', { ...settings.ui, ...patch });\n };\n return (\n <GeneralSection\n settings={settings}\n patchUi={patchUi}\n patchTop={patchTop}\n autoSave={autoSave}\n />\n );\n}\n\nfunction ProvidersSettings({ settings, onSettingsChange, autoSave }: Props) {\n // Providers are managed server-side; show a link to the desktop providers view.\n // Mobile can't add/edit providers without more complex auth flow.\n void settings; void onSettingsChange; void autoSave;\n return (\n <div style={{ fontSize: 13, color: 'var(--text-dim)', padding: '8px 0' }}>\n <p style={{ marginBottom: 8 }}>\n Provider management is available on desktop.\n </p>\n <a href=\"/?desktop=1#settings-providers\" className=\"mobile-btn mobile-btn-secondary\" style={{ display: 'inline-block', fontSize: 12, padding: '6px 12px' }}>\n Open desktop to manage providers\n </a>\n </div>\n );\n}\n\nfunction EnvVarsSettings() {\n return <EnvVarsSection />;\n}\n\nfunction MemorySettings() {\n return <MemorySection />;\n}\n\nfunction SystemLlmSettings({ settings, onSettingsChange, autoSave }: Props) {\n const patchTop = <K extends keyof Settings>(key: K, value: Settings[K]) => {\n onSettingsChange?.(key, value);\n autoSave?.(key, value);\n };\n return <SystemLlmSection settings={settings} patchTop={patchTop} />;\n}\n\nfunction UpdatesSettings() {\n return <UpdatesSection />;\n}\n\nfunction HeadroomSettingsSection({ settings }: { settings: Settings }) {\n const [localSettings, setLocalSettings] = useState(settings);\n const [dirty, setDirty] = useState(false);\n return (\n <HeadroomSection\n settings={localSettings}\n setSettings={setLocalSettings as React.Dispatch<React.SetStateAction<Settings>>}\n setDirty={setDirty}\n />\n );\n}\n\nfunction TailscaleSettingsMobile() {\n return <TailscaleSettings />;\n}\n\nfunction AboutSection({ settings }: { settings: Settings }) {\n const about = settings.about || { version: '—', homepage: 'https://github.com/DrB0rk/BizarHarness', license: 'MIT' };\n return <ActivitySection about={about} />;\n}\n\n// ─── Main component ──────────────────────────────────────────────────────────\n\nexport function MobileSettings({ settings, onSettingsChange, autoSave, snapshot }: Props) {\n const [search, setSearch] = useState('');\n const [expandedSection, setExpandedSection] = useState<string | null>(null);\n\n const sections = [\n {\n id: 'general',\n title: 'General',\n icon: Settings2,\n description: 'Theme, accent, layout',\n component: <GeneralSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'providers',\n title: 'AI Providers',\n icon: Brain,\n description: `${snapshot?.providers?.length ?? 0} configured`,\n component: <ProvidersSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'env-vars',\n title: 'Environment Variables',\n icon: KeyRound,\n description: 'API keys, secrets',\n component: <EnvVarsSettings />,\n },\n {\n id: 'memory',\n title: 'Memory Vault',\n icon: Brain,\n description: 'Git remote, LightRAG config',\n component: <MemorySettings />,\n },\n {\n id: 'system-llm',\n title: 'System LLM',\n icon: Cpu,\n description: settings.systemLlm?.model || 'not set',\n component: <SystemLlmSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'updates',\n title: 'Updates',\n icon: RefreshCw,\n description: 'Check for updates',\n component: <UpdatesSettings />,\n },\n {\n id: 'headroom',\n title: 'Headroom',\n icon: Cpu,\n description: settings.headroom?.enabled ? 'Enabled' : 'Disabled',\n component: <HeadroomSettingsSection settings={settings} />,\n },\n {\n id: 'tailscale',\n title: 'Tailscale',\n icon: Globe,\n description: 'Tailscale serve & auth',\n component: <TailscaleSettingsMobile />,\n },\n {\n id: 'about',\n title: 'About',\n icon: Info,\n description: `Bizar v${settings.about?.version || '—'}`,\n component: <AboutSection settings={settings} />,\n },\n ];\n\n const filtered = sections.filter(\n (s) =>\n !search ||\n s.title.toLowerCase().includes(search.toLowerCase()) ||\n s.description.toLowerCase().includes(search.toLowerCase()),\n );\n\n return (\n <div className=\"mobile-settings\">\n <div className=\"mobile-settings-search\">\n <SearchIcon />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search settings...\"\n aria-label=\"Search settings\"\n />\n </div>\n\n <div className=\"mobile-settings-list\">\n {filtered.map((s) => {\n const Icon = s.icon;\n const isExpanded = expandedSection === s.id;\n return (\n <div key={s.id} className={cn('mobile-settings-item', isExpanded && 'is-expanded')}>\n <button\n className=\"mobile-settings-item-head\"\n onClick={() => setExpandedSection(isExpanded ? null : s.id)}\n aria-expanded={isExpanded}\n aria-controls={`mobile-settings-body-${s.id}`}\n >\n <div className=\"mobile-settings-item-icon\">\n <Icon size={18} />\n </div>\n <div className=\"mobile-settings-item-text\">\n <div className=\"mobile-settings-item-title\">{s.title}</div>\n <div className=\"mobile-settings-item-desc\">{s.description}</div>\n </div>\n <ChevronRight\n size={16}\n className={cn('mobile-settings-item-chevron', isExpanded && 'is-rotated')}\n />\n </button>\n {isExpanded && (\n <div id={`mobile-settings-body-${s.id}`} className=\"mobile-settings-item-body\">\n {s.component}\n </div>\n )}\n </div>\n );\n })}\n {filtered.length === 0 && (\n <div className=\"mobile-settings-empty\">No settings match \"{search}\"</div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.35-4.35\" />\n </svg>\n );\n}\n"],"names":["MemorySection","toast","useToast","loading","setLoading","useState","saving","setSaving","initialising","setInitialising","remoteUrl","setRemoteUrl","vaultPath","setVaultPath","vaultInitialised","setVaultInitialised","refreshKey","setRefreshKey","useEffect","cancelled","cfgRes","statusRes","api","_b","_a","onSave","k","err","onInitialise","jsxs","Card","CardTitle","jsx","Brain","CardMeta","Spinner","FolderInput","Button","Loader2","GitBranch","e","Save","GeneralSettings","settings","onSettingsChange","autoSave","patchTop","key","value","patchUi","patch","GeneralSection","ProvidersSettings","EnvVarsSettings","EnvVarsSection","MemorySettings","SystemLlmSettings","SystemLlmSection","UpdatesSettings","UpdatesSection","HeadroomSettingsSection","localSettings","setLocalSettings","dirty","setDirty","HeadroomSection","TailscaleSettingsMobile","TailscaleSettings","AboutSection","about","ActivitySection","MobileSettings","snapshot","search","setSearch","expandedSection","setExpandedSection","filtered","Settings2","KeyRound","Cpu","RefreshCw","_c","Globe","Info","_d","s","SearchIcon","Icon","isExpanded","cn","ChevronRight"],"mappings":"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"}