@polderlabs/bizar 10.7.2 → 10.10.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 (1202) hide show
  1. package/.claude/agents/_shared/AGENT_BASELINE.md +48 -243
  2. package/.claude/agents/_shared/CLAUDE_TOOLS.md +4 -2
  3. package/.claude/agents/_shared/SKILLS.md +18 -95
  4. package/.claude/agents/brand-designer.md +7 -5
  5. package/.claude/agents/debug-specialist.md +68 -0
  6. package/.claude/agents/exec-assistant.md +2 -1
  7. package/.claude/agents/help-desk.md +3 -3
  8. package/.claude/agents/it-lead.md +5 -5
  9. package/.claude/agents/knowledge-manager.md +2 -2
  10. package/.claude/agents/office-coordinator.md +3 -4
  11. package/.claude/agents/office-greeter.md +5 -5
  12. package/.claude/agents/office-manager.md +127 -42
  13. package/.claude/agents/planner.md +120 -0
  14. package/.claude/agents/principal-engineer.md +6 -5
  15. package/.claude/agents/qa-reviewer.md +4 -4
  16. package/.claude/agents/research-analyst.md +13 -43
  17. package/.claude/agents/senior-engineer.md +5 -4
  18. package/.claude/agents/support-tech.md +21 -73
  19. package/.claude/agents/ui-designer.md +89 -0
  20. package/.claude/commands/bizar.md +9 -16
  21. package/.claude/commands/cron.md +7 -3
  22. package/.claude/commands/learn.md +4 -2
  23. package/.claude/commands/plan.md +14 -28
  24. package/.claude/commands/plow-through.md +19 -38
  25. package/.claude/commands/pr-review.md +2 -3
  26. package/.claude/commands/setup-provider.md +15 -88
  27. package/.claude/commands/sprint.md +3 -3
  28. package/.claude/commands/tailscale-serve.md +9 -95
  29. package/.claude/commands/team.md +26 -122
  30. package/.claude/commands/test.md +3 -3
  31. package/.claude/commands/use-default.md +53 -0
  32. package/.claude/commands/use-premium.md +74 -0
  33. package/.claude/commands/validate.md +13 -61
  34. package/.claude/hooks/README.md +24 -108
  35. package/.claude/hooks/advisor-context.mjs +42 -0
  36. package/.claude/hooks/agent-grounding.mjs +41 -0
  37. package/.claude/hooks/content-style-guard.mjs +73 -0
  38. package/.claude/hooks/control-inbox.mjs +48 -0
  39. package/.claude/hooks/git-workflow-guard.mjs +104 -0
  40. package/.claude/hooks/learning-extract.mjs +0 -0
  41. package/.claude/hooks/path-ownership-guard.mjs +89 -0
  42. package/.claude/hooks/precompact-priorities.sh +11 -0
  43. package/.claude/hooks/pretooluse-bash.mjs +4 -11
  44. package/.claude/hooks/sessionend-recall.mjs +0 -0
  45. package/.claude/hooks/sessionstart-prime.mjs +10 -4
  46. package/.claude/hooks/simplify-guard.mjs +51 -0
  47. package/.claude/hooks/telemetry.mjs +69 -0
  48. package/.claude/hooks/thinking-route.mjs +7 -9
  49. package/.claude/hooks/worker-suggest.mjs +21 -13
  50. package/.claude/hooks/worktree-bootstrap.mjs +64 -0
  51. package/.claude/model-router.json +57 -0
  52. package/.claude/settings.json +92 -140
  53. package/AGENTS.md +95 -0
  54. package/README.md +76 -472
  55. package/cli/agent-browser-update.mjs +87 -274
  56. package/cli/atomic.mjs +1 -1
  57. package/cli/audit.mjs +31 -121
  58. package/cli/banner.mjs +3 -14
  59. package/cli/bin.mjs +83 -331
  60. package/cli/bootstrap.mjs +9 -12
  61. package/cli/commands/claude-cmd.mjs +45 -309
  62. package/cli/commands/control.mjs +102 -0
  63. package/cli/commands/install.mjs +9 -56
  64. package/cli/commands/rca.mjs +63 -165
  65. package/cli/commands/sandbox.mjs +89 -183
  66. package/cli/commands/setup-provider.mjs +65 -423
  67. package/cli/commands/task.mjs +249 -0
  68. package/cli/commands/util.mjs +37 -197
  69. package/cli/commands/validate.mjs +45 -75
  70. package/cli/control-store.mjs +312 -0
  71. package/{bizar-dash/src/server → cli/core}/backup-store.mjs +7 -17
  72. package/cli/doctor.mjs +8 -13
  73. package/cli/export.mjs +3 -7
  74. package/cli/init.mjs +1 -135
  75. package/cli/install/banner.mjs +4 -14
  76. package/cli/install/paths.mjs +3 -8
  77. package/cli/install.mjs +2 -7
  78. package/cli/migrate.mjs +24 -24
  79. package/{bizar-dash/src/server → cli}/progress-parser.mjs +7 -5
  80. package/cli/provision.mjs +140 -165
  81. package/cli/task-ledger.mjs +842 -0
  82. package/cli/update.mjs +2 -2
  83. package/cli/utils.mjs +1 -38
  84. package/config/AGENTS.md +14 -591
  85. package/config/rules/general.md +1 -1
  86. package/config/rules/uncertainty.md +2 -2
  87. package/config/skills/9router/SKILL.md +3 -3
  88. package/config/skills/9router-tts/SKILL.md +1 -1
  89. package/config/skills/agent-browser/SKILL.md +53 -0
  90. package/config/skills/bizar/README.md +3 -3
  91. package/config/skills/bizar/SKILL.md +31 -431
  92. package/config/skills/clean-gone-branches/SKILL.md +8 -0
  93. package/config/skills/commit-staged/SKILL.md +15 -0
  94. package/config/skills/cpp-coding-standards/README.md +3 -3
  95. package/config/skills/cpp-testing/README.md +2 -2
  96. package/config/skills/create-pr/SKILL.md +16 -0
  97. package/config/skills/cubesandbox/SKILL.md +33 -128
  98. package/config/skills/embedded-esp-idf/README.md +3 -3
  99. package/config/skills/harness-engineering/SKILL.md +37 -126
  100. package/config/skills/read-the-damn-docs/SKILL.md +2 -2
  101. package/config/skills/resolve-pr-comments/SKILL.md +14 -0
  102. package/config/skills/review-pr/SKILL.md +10 -0
  103. package/config/skills/self-improvement/SKILL.md +19 -54
  104. package/config/skills/simplify/SKILL.md +15 -0
  105. package/config/skills/update-pr-summary/SKILL.md +8 -0
  106. package/config/trigger-patterns.json +11 -25
  107. package/package.json +28 -102
  108. package/packages/sdk/dist/agent-registry.d.ts +2 -2
  109. package/packages/sdk/dist/agent-registry.js +2 -2
  110. package/packages/sdk/dist/consensus/index.d.ts +4 -4
  111. package/packages/sdk/dist/consensus/index.js +5 -5
  112. package/packages/sdk/dist/federation/envelope.d.ts +1 -1
  113. package/packages/sdk/dist/federation/envelope.js +2 -2
  114. package/packages/sdk/dist/index.d.ts +1 -4
  115. package/packages/sdk/dist/index.js +1 -4
  116. package/packages/sdk/dist/mcp/server.d.ts +8 -13
  117. package/packages/sdk/dist/mcp/server.js +15 -77
  118. package/packages/sdk/dist/router/index.d.ts +2 -2
  119. package/packages/sdk/dist/router/index.js +2 -2
  120. package/packages/sdk/dist/version.d.ts +2 -2
  121. package/packages/sdk/dist/version.js +2 -2
  122. package/packages/sdk/package.json +1 -2
  123. package/scripts/git-hooks/pre-commit +2 -2
  124. package/scripts/git-hooks/pre-push +3 -3
  125. package/scripts/install-hooks.sh +2 -2
  126. package/.claude/agents/vp-engineering.md +0 -54
  127. package/.claude/commands/goal.md +0 -99
  128. package/.claude/commands/visual-plan.md +0 -24
  129. package/.claude/hooks/__tests__/pretooluse-editwrite.test.mjs +0 -146
  130. package/.claude/hooks/__tests__/sessionend-recall.test.mjs +0 -256
  131. package/.claude/hooks/__tests__/sessionstart-prime.test.mjs +0 -325
  132. package/.claude/hooks/__tests__/thinking-route.test.mjs +0 -319
  133. package/.claude/hooks/post-merge-audit.sh +0 -93
  134. package/.claude/skills/9router/SKILL.md +0 -80
  135. package/.claude/skills/9router-chat/SKILL.md +0 -73
  136. package/.claude/skills/9router-embeddings/SKILL.md +0 -69
  137. package/.claude/skills/9router-image/SKILL.md +0 -86
  138. package/.claude/skills/9router-stt/SKILL.md +0 -79
  139. package/.claude/skills/9router-tts/SKILL.md +0 -80
  140. package/.claude/skills/9router-web-fetch/SKILL.md +0 -99
  141. package/.claude/skills/9router-web-search/SKILL.md +0 -91
  142. package/.claude/skills/agent-browser/SKILL.md +0 -64
  143. package/.claude/skills/bizar/README.md +0 -9
  144. package/.claude/skills/bizar/SKILL.md +0 -447
  145. package/.claude/skills/cpp-coding-standards/README.md +0 -28
  146. package/.claude/skills/cpp-coding-standards/SKILL.md +0 -634
  147. package/.claude/skills/cpp-coding-standards/references/concurrency.md +0 -320
  148. package/.claude/skills/cpp-coding-standards/references/error-handling.md +0 -229
  149. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +0 -216
  150. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +0 -282
  151. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +0 -96
  152. package/.claude/skills/cpp-testing/README.md +0 -28
  153. package/.claude/skills/cpp-testing/SKILL.md +0 -304
  154. package/.claude/skills/cpp-testing/references/coverage.md +0 -370
  155. package/.claude/skills/cpp-testing/references/framework-compare.md +0 -175
  156. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +0 -499
  157. package/.claude/skills/cpp-testing/references/mocking.md +0 -364
  158. package/.claude/skills/cpp-testing/references/tdd-workflow.md +0 -308
  159. package/.claude/skills/cubesandbox/SKILL.md +0 -148
  160. package/.claude/skills/de-sloppify/cleanup.mjs +0 -253
  161. package/.claude/skills/de-sloppify/cleanup.test.mjs +0 -189
  162. package/.claude/skills/embedded-esp-idf/README.md +0 -41
  163. package/.claude/skills/embedded-esp-idf/SKILL.md +0 -439
  164. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +0 -214
  165. package/.claude/skills/embedded-esp-idf/references/host-tests.md +0 -164
  166. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +0 -157
  167. package/.claude/skills/embedded-esp-idf/references/kconfig.md +0 -159
  168. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +0 -118
  169. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +0 -137
  170. package/.claude/skills/embedded-esp-idf/references/nvs.md +0 -121
  171. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +0 -192
  172. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +0 -47
  173. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +0 -77
  174. package/.claude/skills/glyph/SKILL.md +0 -163
  175. package/.claude/skills/harness-engineering/SKILL.md +0 -142
  176. package/.claude/skills/lightrag/SKILL.md +0 -81
  177. package/.claude/skills/memory-protocol/SKILL.md +0 -105
  178. package/.claude/skills/obsidian/SKILL.md +0 -306
  179. package/.claude/skills/read-the-damn-docs/SKILL.md +0 -113
  180. package/.claude/skills/self-improvement/SKILL.md +0 -64
  181. package/.claude/skills/skillopt/SKILL.md +0 -129
  182. package/.claude/skills/thinking-archetypes/SKILL.md +0 -90
  183. package/.claude/skills/thinking-bayesian/SKILL.md +0 -267
  184. package/.claude/skills/thinking-bounded-rationality/SKILL.md +0 -406
  185. package/.claude/skills/thinking-circle-of-competence/SKILL.md +0 -216
  186. package/.claude/skills/thinking-cynefin/SKILL.md +0 -70
  187. package/.claude/skills/thinking-debiasing/SKILL.md +0 -192
  188. package/.claude/skills/thinking-dual-process/SKILL.md +0 -282
  189. package/.claude/skills/thinking-effectuation/SKILL.md +0 -366
  190. package/.claude/skills/thinking-feedback-loops/SKILL.md +0 -464
  191. package/.claude/skills/thinking-fermi-estimation/SKILL.md +0 -263
  192. package/.claude/skills/thinking-first-principles/SKILL.md +0 -167
  193. package/.claude/skills/thinking-five-whys-plus/SKILL.md +0 -139
  194. package/.claude/skills/thinking-inversion/SKILL.md +0 -195
  195. package/.claude/skills/thinking-jobs-to-be-done/SKILL.md +0 -363
  196. package/.claude/skills/thinking-kepner-tregoe/SKILL.md +0 -154
  197. package/.claude/skills/thinking-leverage-points/SKILL.md +0 -390
  198. package/.claude/skills/thinking-lindy-effect/SKILL.md +0 -331
  199. package/.claude/skills/thinking-map-territory/SKILL.md +0 -111
  200. package/.claude/skills/thinking-margin-of-safety/SKILL.md +0 -330
  201. package/.claude/skills/thinking-model-combination/SKILL.md +0 -406
  202. package/.claude/skills/thinking-model-router/SKILL.md +0 -360
  203. package/.claude/skills/thinking-model-selection/SKILL.md +0 -341
  204. package/.claude/skills/thinking-occams-razor/SKILL.md +0 -129
  205. package/.claude/skills/thinking-ooda/SKILL.md +0 -127
  206. package/.claude/skills/thinking-opportunity-cost/SKILL.md +0 -360
  207. package/.claude/skills/thinking-pre-mortem/SKILL.md +0 -170
  208. package/.claude/skills/thinking-probabilistic/SKILL.md +0 -324
  209. package/.claude/skills/thinking-red-team/SKILL.md +0 -142
  210. package/.claude/skills/thinking-regret-minimization/SKILL.md +0 -335
  211. package/.claude/skills/thinking-reversibility/SKILL.md +0 -326
  212. package/.claude/skills/thinking-scientific-method/SKILL.md +0 -162
  213. package/.claude/skills/thinking-second-order/SKILL.md +0 -184
  214. package/.claude/skills/thinking-socratic/SKILL.md +0 -198
  215. package/.claude/skills/thinking-steel-manning/SKILL.md +0 -332
  216. package/.claude/skills/thinking-systems/SKILL.md +0 -238
  217. package/.claude/skills/thinking-theory-of-constraints/SKILL.md +0 -338
  218. package/.claude/skills/thinking-thought-experiment/SKILL.md +0 -354
  219. package/.claude/skills/thinking-triz/SKILL.md +0 -171
  220. package/.claude/skills/thinking-via-negativa/SKILL.md +0 -358
  221. package/bizar-dash/.bizar/graph/.graphify_analysis.json +0 -1540
  222. package/bizar-dash/.bizar/graph/.graphify_labels.json +0 -1
  223. package/bizar-dash/.bizar/graph/GRAPH_REPORT.md +0 -404
  224. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/0661b816358db84dfdb7f10443db8a61152fd20b3fee950caf8fbf32920a1790.json +0 -1
  225. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/16da06d774142a6e5d74829ad982531286a6193ef798de8f593db029e123ec32.json +0 -1
  226. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/27e5697c01254c69c64c5a33896669073b40afb5ba88375102ae77fa5404136d.json +0 -1
  227. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/532997898027254aa4c0932243dc71d2f55888181232b65974961934997dc85b.json +0 -1
  228. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/84e3451a64c7f99f0cd6a88b0748d7426780486f53ab4935b7476b28c08f8293.json +0 -1
  229. package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/88e5ea5f3e78fa69353fe9e6a8d1a05391d54605e25600cb125531eb5a6432ff.json +0 -1
  230. package/bizar-dash/.bizar/graph/cache/stat-index.json +0 -1
  231. package/bizar-dash/.bizar/graph/graph.html +0 -307
  232. package/bizar-dash/.bizar/graph/graph.json +0 -40267
  233. package/bizar-dash/.bizar/graph/manifest.json +0 -762
  234. package/bizar-dash/.graphifyignore +0 -40
  235. package/bizar-dash/.obsidian/README.md +0 -14
  236. package/bizar-dash/.obsidian/daily/2026-06-25.md +0 -9
  237. package/bizar-dash/.obsidian/vault.json +0 -7
  238. package/bizar-dash/.od-skills/web-prototype-e1429c1737/SKILL.md +0 -103
  239. package/bizar-dash/.od-skills/web-prototype-e1429c1737/assets/template.html +0 -338
  240. package/bizar-dash/.od-skills/web-prototype-e1429c1737/example.html +0 -81
  241. package/bizar-dash/.od-skills/web-prototype-e1429c1737/open-design.json +0 -172
  242. package/bizar-dash/.od-skills/web-prototype-e1429c1737/references/checklist.md +0 -44
  243. package/bizar-dash/.od-skills/web-prototype-e1429c1737/references/layouts.md +0 -247
  244. package/bizar-dash/ARCHITECTURE.md +0 -197
  245. package/bizar-dash/BROWSER_VERIFICATION.md +0 -190
  246. package/bizar-dash/CHANGELOG.md +0 -807
  247. package/bizar-dash/CONTROL_SURFACES.md +0 -156
  248. package/bizar-dash/DESIGN.md +0 -912
  249. package/bizar-dash/GLYPH.md +0 -418
  250. package/bizar-dash/PLAN.md +0 -1135
  251. package/bizar-dash/SETTINGS_AUDIT.md +0 -225
  252. package/bizar-dash/critique.json +0 -26
  253. package/bizar-dash/dist/assets/ActivityFeed-Bw4Cai7r.js +0 -11
  254. package/bizar-dash/dist/assets/ActivityFeed-Bw4Cai7r.js.map +0 -1
  255. package/bizar-dash/dist/assets/ActivityView-BC0QQ_j9.js +0 -2
  256. package/bizar-dash/dist/assets/ActivityView-BC0QQ_j9.js.map +0 -1
  257. package/bizar-dash/dist/assets/AdminView-CLTNKFL4.js +0 -11
  258. package/bizar-dash/dist/assets/AdminView-CLTNKFL4.js.map +0 -1
  259. package/bizar-dash/dist/assets/AgentActivity-DBWDByjk.js +0 -67
  260. package/bizar-dash/dist/assets/AgentActivity-DBWDByjk.js.map +0 -1
  261. package/bizar-dash/dist/assets/AgentsView-DD6bCIbA.js +0 -15
  262. package/bizar-dash/dist/assets/AgentsView-DD6bCIbA.js.map +0 -1
  263. package/bizar-dash/dist/assets/Alert-pzFISNtS.js +0 -6
  264. package/bizar-dash/dist/assets/Alert-pzFISNtS.js.map +0 -1
  265. package/bizar-dash/dist/assets/ArtifactsView-BVU5lfo7.js +0 -21
  266. package/bizar-dash/dist/assets/ArtifactsView-BVU5lfo7.js.map +0 -1
  267. package/bizar-dash/dist/assets/AuthView-BZ-bPIOM.js +0 -16
  268. package/bizar-dash/dist/assets/AuthView-BZ-bPIOM.js.map +0 -1
  269. package/bizar-dash/dist/assets/Avatar-CRW81ewE.js +0 -6
  270. package/bizar-dash/dist/assets/Avatar-CRW81ewE.js.map +0 -1
  271. package/bizar-dash/dist/assets/BackgroundJobsView-w8OZtXyI.js +0 -1
  272. package/bizar-dash/dist/assets/BackgroundJobsView-w8OZtXyI.js.map +0 -1
  273. package/bizar-dash/dist/assets/BackupView-u_O3j0TG.js +0 -1
  274. package/bizar-dash/dist/assets/BackupView-u_O3j0TG.js.map +0 -1
  275. package/bizar-dash/dist/assets/Banner-Du-3l05O.js +0 -1
  276. package/bizar-dash/dist/assets/Banner-Du-3l05O.js.map +0 -1
  277. package/bizar-dash/dist/assets/Card-Clkvh43Q.js +0 -1
  278. package/bizar-dash/dist/assets/Card-Clkvh43Q.js.map +0 -1
  279. package/bizar-dash/dist/assets/ChatView-BTjb3mIh.js +0 -9
  280. package/bizar-dash/dist/assets/ChatView-BTjb3mIh.js.map +0 -1
  281. package/bizar-dash/dist/assets/Chip-B7ovcm01.js +0 -1
  282. package/bizar-dash/dist/assets/Chip-B7ovcm01.js.map +0 -1
  283. package/bizar-dash/dist/assets/ClaudeSessionsView-BoZS5ldi.js +0 -1
  284. package/bizar-dash/dist/assets/ClaudeSessionsView-BoZS5ldi.js.map +0 -1
  285. package/bizar-dash/dist/assets/ClipboardView-Cb6XgYZI.js +0 -1
  286. package/bizar-dash/dist/assets/ClipboardView-Cb6XgYZI.js.map +0 -1
  287. package/bizar-dash/dist/assets/ConfigView-DfTJk1uL.js +0 -1
  288. package/bizar-dash/dist/assets/ConfigView-DfTJk1uL.js.map +0 -1
  289. package/bizar-dash/dist/assets/DiagnosticsView-D5Wy9xlJ.js +0 -2
  290. package/bizar-dash/dist/assets/DiagnosticsView-D5Wy9xlJ.js.map +0 -1
  291. package/bizar-dash/dist/assets/DialogsView-HVyfrXpq.js +0 -6
  292. package/bizar-dash/dist/assets/DialogsView-HVyfrXpq.js.map +0 -1
  293. package/bizar-dash/dist/assets/DoctorView-Dm94WI2z.js +0 -6
  294. package/bizar-dash/dist/assets/DoctorView-Dm94WI2z.js.map +0 -1
  295. package/bizar-dash/dist/assets/EmptyState-ccT__JZG.js +0 -1
  296. package/bizar-dash/dist/assets/EmptyState-ccT__JZG.js.map +0 -1
  297. package/bizar-dash/dist/assets/EnvVarsView-BhcIuJ6V.js +0 -8
  298. package/bizar-dash/dist/assets/EnvVarsView-BhcIuJ6V.js.map +0 -1
  299. package/bizar-dash/dist/assets/ErrorState-BSqf65ka.js +0 -1
  300. package/bizar-dash/dist/assets/ErrorState-BSqf65ka.js.map +0 -1
  301. package/bizar-dash/dist/assets/EvalView-2cbWVBUA.js +0 -1
  302. package/bizar-dash/dist/assets/EvalView-2cbWVBUA.js.map +0 -1
  303. package/bizar-dash/dist/assets/GoalsView-C3QG5p7T.js +0 -6
  304. package/bizar-dash/dist/assets/GoalsView-C3QG5p7T.js.map +0 -1
  305. package/bizar-dash/dist/assets/Grid-Bojq8Sg7.js +0 -1
  306. package/bizar-dash/dist/assets/Grid-Bojq8Sg7.js.map +0 -1
  307. package/bizar-dash/dist/assets/HistoryView-Bum2TMMw.js +0 -1
  308. package/bizar-dash/dist/assets/HistoryView-Bum2TMMw.js.map +0 -1
  309. package/bizar-dash/dist/assets/Input-DV-vdaV8.js +0 -1
  310. package/bizar-dash/dist/assets/Input-DV-vdaV8.js.map +0 -1
  311. package/bizar-dash/dist/assets/LibrariesView-DH2E2uNb.js +0 -6
  312. package/bizar-dash/dist/assets/LibrariesView-DH2E2uNb.js.map +0 -1
  313. package/bizar-dash/dist/assets/LightRAGView-BFCcj7Tl.js +0 -6
  314. package/bizar-dash/dist/assets/LightRAGView-BFCcj7Tl.js.map +0 -1
  315. package/bizar-dash/dist/assets/ListHeader-CCD_nIHb.js +0 -1
  316. package/bizar-dash/dist/assets/ListHeader-CCD_nIHb.js.map +0 -1
  317. package/bizar-dash/dist/assets/MemoryView-Cr-obIQY.js +0 -8
  318. package/bizar-dash/dist/assets/MemoryView-Cr-obIQY.js.map +0 -1
  319. package/bizar-dash/dist/assets/MessageBubble-CrCJ0SYG.js +0 -29
  320. package/bizar-dash/dist/assets/MessageBubble-CrCJ0SYG.js.map +0 -1
  321. package/bizar-dash/dist/assets/MiscView-CDUQpYuV.js +0 -1
  322. package/bizar-dash/dist/assets/MiscView-CDUQpYuV.js.map +0 -1
  323. package/bizar-dash/dist/assets/ModsView-B6OR-a4B.js +0 -6
  324. package/bizar-dash/dist/assets/ModsView-B6OR-a4B.js.map +0 -1
  325. package/bizar-dash/dist/assets/NotificationsView-CIqtY6D0.js +0 -6
  326. package/bizar-dash/dist/assets/NotificationsView-CIqtY6D0.js.map +0 -1
  327. package/bizar-dash/dist/assets/ObsidianView-Nahah8QC.js +0 -1
  328. package/bizar-dash/dist/assets/ObsidianView-Nahah8QC.js.map +0 -1
  329. package/bizar-dash/dist/assets/OverviewView-B6L_wa4M.js +0 -1
  330. package/bizar-dash/dist/assets/OverviewView-B6L_wa4M.js.map +0 -1
  331. package/bizar-dash/dist/assets/ProgressBar-KC4VXsl_.js +0 -1
  332. package/bizar-dash/dist/assets/ProgressBar-KC4VXsl_.js.map +0 -1
  333. package/bizar-dash/dist/assets/ProjectsView-DgxWiqHb.js +0 -11
  334. package/bizar-dash/dist/assets/ProjectsView-DgxWiqHb.js.map +0 -1
  335. package/bizar-dash/dist/assets/ProvidersView-BOqN9omv.js +0 -11
  336. package/bizar-dash/dist/assets/ProvidersView-BOqN9omv.js.map +0 -1
  337. package/bizar-dash/dist/assets/SchedulesView-yMaG3Dtd.js +0 -1
  338. package/bizar-dash/dist/assets/SchedulesView-yMaG3Dtd.js.map +0 -1
  339. package/bizar-dash/dist/assets/Select-Bf_P0S6H.js +0 -6
  340. package/bizar-dash/dist/assets/Select-Bf_P0S6H.js.map +0 -1
  341. package/bizar-dash/dist/assets/SettingsRow-CJb-F94Y.js +0 -1
  342. package/bizar-dash/dist/assets/SettingsRow-CJb-F94Y.js.map +0 -1
  343. package/bizar-dash/dist/assets/SettingsView-BvOGcgMS.js +0 -18
  344. package/bizar-dash/dist/assets/SettingsView-BvOGcgMS.js.map +0 -1
  345. package/bizar-dash/dist/assets/Sheet-BwMVGN-8.js +0 -1
  346. package/bizar-dash/dist/assets/Sheet-BwMVGN-8.js.map +0 -1
  347. package/bizar-dash/dist/assets/Slider-AjjzqI-5.js +0 -1
  348. package/bizar-dash/dist/assets/Slider-AjjzqI-5.js.map +0 -1
  349. package/bizar-dash/dist/assets/Sparkline-Z4y0YUZS.js +0 -1
  350. package/bizar-dash/dist/assets/Sparkline-Z4y0YUZS.js.map +0 -1
  351. package/bizar-dash/dist/assets/Switch-B79a2t-G.js +0 -10
  352. package/bizar-dash/dist/assets/Switch-B79a2t-G.js.map +0 -1
  353. package/bizar-dash/dist/assets/TasksView-G-s_pwwr.js +0 -6
  354. package/bizar-dash/dist/assets/TasksView-G-s_pwwr.js.map +0 -1
  355. package/bizar-dash/dist/assets/Textarea-BfXGMXQ7.js +0 -1
  356. package/bizar-dash/dist/assets/Textarea-BfXGMXQ7.js.map +0 -1
  357. package/bizar-dash/dist/assets/UpdateView-BKx3u9X8.js +0 -1
  358. package/bizar-dash/dist/assets/UpdateView-BKx3u9X8.js.map +0 -1
  359. package/bizar-dash/dist/assets/UsageView-M01G6bZQ.js +0 -1
  360. package/bizar-dash/dist/assets/UsageView-M01G6bZQ.js.map +0 -1
  361. package/bizar-dash/dist/assets/ViewHeader-BsnaspKw.js +0 -6
  362. package/bizar-dash/dist/assets/ViewHeader-BsnaspKw.js.map +0 -1
  363. package/bizar-dash/dist/assets/VoiceView-rWE8vziD.js +0 -1
  364. package/bizar-dash/dist/assets/VoiceView-rWE8vziD.js.map +0 -1
  365. package/bizar-dash/dist/assets/brain-D7k5s8vH.js +0 -6
  366. package/bizar-dash/dist/assets/brain-D7k5s8vH.js.map +0 -1
  367. package/bizar-dash/dist/assets/calendar-CAZoDd-l.js +0 -6
  368. package/bizar-dash/dist/assets/calendar-CAZoDd-l.js.map +0 -1
  369. package/bizar-dash/dist/assets/circle-D99cZJBr.js +0 -6
  370. package/bizar-dash/dist/assets/circle-D99cZJBr.js.map +0 -1
  371. package/bizar-dash/dist/assets/circle-alert-QQTU4Quz.js +0 -6
  372. package/bizar-dash/dist/assets/circle-alert-QQTU4Quz.js.map +0 -1
  373. package/bizar-dash/dist/assets/circle-check-BMbe7Kkr.js +0 -6
  374. package/bizar-dash/dist/assets/circle-check-BMbe7Kkr.js.map +0 -1
  375. package/bizar-dash/dist/assets/clock-OtT5mvF3.js +0 -6
  376. package/bizar-dash/dist/assets/clock-OtT5mvF3.js.map +0 -1
  377. package/bizar-dash/dist/assets/cmdk-C3F6LD6N.js +0 -80
  378. package/bizar-dash/dist/assets/cmdk-C3F6LD6N.js.map +0 -1
  379. package/bizar-dash/dist/assets/dnd-kit-BAOLODOI.js +0 -5
  380. package/bizar-dash/dist/assets/dnd-kit-BAOLODOI.js.map +0 -1
  381. package/bizar-dash/dist/assets/download-B-mPX5P_.js +0 -6
  382. package/bizar-dash/dist/assets/download-B-mPX5P_.js.map +0 -1
  383. package/bizar-dash/dist/assets/external-link-DPDQM1YO.js +0 -6
  384. package/bizar-dash/dist/assets/external-link-DPDQM1YO.js.map +0 -1
  385. package/bizar-dash/dist/assets/file-text-BsCrv5aP.js +0 -6
  386. package/bizar-dash/dist/assets/file-text-BsCrv5aP.js.map +0 -1
  387. package/bizar-dash/dist/assets/filter-Do63x17E.js +0 -6
  388. package/bizar-dash/dist/assets/filter-Do63x17E.js.map +0 -1
  389. package/bizar-dash/dist/assets/git-pull-request-CpRAmERC.js +0 -11
  390. package/bizar-dash/dist/assets/git-pull-request-CpRAmERC.js.map +0 -1
  391. package/bizar-dash/dist/assets/index-B1OIS316.js +0 -1
  392. package/bizar-dash/dist/assets/index-B1OIS316.js.map +0 -1
  393. package/bizar-dash/dist/assets/index-CR0TeJmc.js +0 -1
  394. package/bizar-dash/dist/assets/index-CR0TeJmc.js.map +0 -1
  395. package/bizar-dash/dist/assets/main-BRmJZcHt.js +0 -277
  396. package/bizar-dash/dist/assets/main-BRmJZcHt.js.map +0 -1
  397. package/bizar-dash/dist/assets/main-D0TY0myE.css +0 -1
  398. package/bizar-dash/dist/assets/network-DJnHwHX3.js +0 -6
  399. package/bizar-dash/dist/assets/network-DJnHwHX3.js.map +0 -1
  400. package/bizar-dash/dist/assets/pause-HitDUnk_.js +0 -6
  401. package/bizar-dash/dist/assets/pause-HitDUnk_.js.map +0 -1
  402. package/bizar-dash/dist/assets/pencil-Dkks7eIC.js +0 -6
  403. package/bizar-dash/dist/assets/pencil-Dkks7eIC.js.map +0 -1
  404. package/bizar-dash/dist/assets/play-blqh0msT.js +0 -6
  405. package/bizar-dash/dist/assets/play-blqh0msT.js.map +0 -1
  406. package/bizar-dash/dist/assets/plug-DVvSSe40.js +0 -6
  407. package/bizar-dash/dist/assets/plug-DVvSSe40.js.map +0 -1
  408. package/bizar-dash/dist/assets/plus-Cps-8lcG.js +0 -6
  409. package/bizar-dash/dist/assets/plus-Cps-8lcG.js.map +0 -1
  410. package/bizar-dash/dist/assets/power-DEX4_Xoa.js +0 -6
  411. package/bizar-dash/dist/assets/power-DEX4_Xoa.js.map +0 -1
  412. package/bizar-dash/dist/assets/power-off-upZ4xjaG.js +0 -6
  413. package/bizar-dash/dist/assets/power-off-upZ4xjaG.js.map +0 -1
  414. package/bizar-dash/dist/assets/refresh-ccw-DN_zCB1h.js +0 -6
  415. package/bizar-dash/dist/assets/refresh-ccw-DN_zCB1h.js.map +0 -1
  416. package/bizar-dash/dist/assets/refresh-cw-KGm5eQgv.js +0 -6
  417. package/bizar-dash/dist/assets/refresh-cw-KGm5eQgv.js.map +0 -1
  418. package/bizar-dash/dist/assets/rotate-ccw-D5fkDRgk.js +0 -6
  419. package/bizar-dash/dist/assets/rotate-ccw-D5fkDRgk.js.map +0 -1
  420. package/bizar-dash/dist/assets/rotate-cw-CClSVUaX.js +0 -6
  421. package/bizar-dash/dist/assets/rotate-cw-CClSVUaX.js.map +0 -1
  422. package/bizar-dash/dist/assets/save-BY4ViPku.js +0 -6
  423. package/bizar-dash/dist/assets/save-BY4ViPku.js.map +0 -1
  424. package/bizar-dash/dist/assets/send-CaOL1yQD.js +0 -6
  425. package/bizar-dash/dist/assets/send-CaOL1yQD.js.map +0 -1
  426. package/bizar-dash/dist/assets/shield-alert-DA9K6uZO.js +0 -6
  427. package/bizar-dash/dist/assets/shield-alert-DA9K6uZO.js.map +0 -1
  428. package/bizar-dash/dist/assets/trash-2-B_Y6HrfN.js +0 -6
  429. package/bizar-dash/dist/assets/trash-2-B_Y6HrfN.js.map +0 -1
  430. package/bizar-dash/dist/assets/trending-up-qKTUQKIT.js +0 -6
  431. package/bizar-dash/dist/assets/trending-up-qKTUQKIT.js.map +0 -1
  432. package/bizar-dash/dist/assets/triangle-alert-BeY8LAv6.js +0 -6
  433. package/bizar-dash/dist/assets/triangle-alert-BeY8LAv6.js.map +0 -1
  434. package/bizar-dash/dist/assets/upload-BZCtmqIh.js +0 -6
  435. package/bizar-dash/dist/assets/upload-BZCtmqIh.js.map +0 -1
  436. package/bizar-dash/dist/assets/zap-Bz1Z8y1Q.js +0 -6
  437. package/bizar-dash/dist/assets/zap-Bz1Z8y1Q.js.map +0 -1
  438. package/bizar-dash/dist/index.html +0 -19
  439. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  440. package/bizar-dash/plans/debug-plan/comments.json +0 -1
  441. package/bizar-dash/plans/debug-plan/meta.json +0 -10
  442. package/bizar-dash/plans/debug-plan/plan.json +0 -174
  443. package/bizar-dash/scripts/smoke-bg-retry.mjs +0 -246
  444. package/bizar-dash/skills/agent-baseline/SKILL.md +0 -80
  445. package/bizar-dash/skills/agent-browser/SKILL.md +0 -181
  446. package/bizar-dash/skills/bizar/SKILL.md +0 -116
  447. package/bizar-dash/skills/chat/SKILL.md +0 -74
  448. package/bizar-dash/skills/eval/SKILL.md +0 -237
  449. package/bizar-dash/skills/lightrag/SKILL.md +0 -86
  450. package/bizar-dash/skills/minimax/SKILL.md +0 -80
  451. package/bizar-dash/skills/obsidian/SKILL.md +0 -68
  452. package/bizar-dash/skills/providers/SKILL.md +0 -75
  453. package/bizar-dash/skills/publishing/SKILL.md +0 -147
  454. package/bizar-dash/skills/sdk/SKILL.md +0 -138
  455. package/bizar-dash/skills/self-improvement/SKILL.md +0 -53
  456. package/bizar-dash/skills/skills-cli/SKILL.md +0 -94
  457. package/bizar-dash/skills/usage/SKILL.md +0 -62
  458. package/bizar-dash/src/cli/dashboard-ports.mjs +0 -488
  459. package/bizar-dash/src/cli.mjs +0 -537
  460. package/bizar-dash/src/server/activity-log.mjs +0 -174
  461. package/bizar-dash/src/server/agent-bus.mjs +0 -485
  462. package/bizar-dash/src/server/agents-store.mjs +0 -466
  463. package/bizar-dash/src/server/api.mjs +0 -246
  464. package/bizar-dash/src/server/artifact-mint.mjs +0 -69
  465. package/bizar-dash/src/server/artifact-template.html +0 -810
  466. package/bizar-dash/src/server/artifacts-store.mjs +0 -839
  467. package/bizar-dash/src/server/auth.mjs +0 -548
  468. package/bizar-dash/src/server/background-store.mjs +0 -446
  469. package/bizar-dash/src/server/bg-poller.mjs +0 -375
  470. package/bizar-dash/src/server/bg-poller.test.mjs +0 -28
  471. package/bizar-dash/src/server/bg-retry.mjs +0 -446
  472. package/bizar-dash/src/server/bg-spawner.mjs +0 -390
  473. package/bizar-dash/src/server/browser.mjs +0 -40
  474. package/bizar-dash/src/server/claude-artifacts.mjs +0 -281
  475. package/bizar-dash/src/server/claude-bg-spawner.mjs +0 -390
  476. package/bizar-dash/src/server/claude-info.mjs +0 -412
  477. package/bizar-dash/src/server/claude-runner.mjs +0 -289
  478. package/bizar-dash/src/server/claude-sdk.mjs +0 -191
  479. package/bizar-dash/src/server/diagnostics-store.mjs +0 -568
  480. package/bizar-dash/src/server/dialog-poller.mjs +0 -105
  481. package/bizar-dash/src/server/dialog-store.mjs +0 -259
  482. package/bizar-dash/src/server/digest-store.mjs +0 -558
  483. package/bizar-dash/src/server/eval-store.mjs +0 -281
  484. package/bizar-dash/src/server/eval.mjs +0 -500
  485. package/bizar-dash/src/server/glyphs/mdx-compiler.mjs +0 -596
  486. package/bizar-dash/src/server/lib/path-safe.mjs +0 -283
  487. package/bizar-dash/src/server/lib/rate-limit.mjs +0 -122
  488. package/bizar-dash/src/server/logger.mjs +0 -71
  489. package/bizar-dash/src/server/loop-runtime.mjs +0 -429
  490. package/bizar-dash/src/server/memory-consolidator.mjs +0 -225
  491. package/bizar-dash/src/server/memory-distillation.mjs +0 -296
  492. package/bizar-dash/src/server/memory-git.mjs +0 -473
  493. package/bizar-dash/src/server/memory-lightrag.mjs +0 -1483
  494. package/bizar-dash/src/server/memory-obsidian.mjs +0 -230
  495. package/bizar-dash/src/server/memory-schema.mjs +0 -145
  496. package/bizar-dash/src/server/memory-secrets.mjs +0 -84
  497. package/bizar-dash/src/server/memory-store.mjs +0 -1093
  498. package/bizar-dash/src/server/metrics.mjs +0 -268
  499. package/bizar-dash/src/server/minimax-usage-store.mjs +0 -372
  500. package/bizar-dash/src/server/minimax.mjs +0 -683
  501. package/bizar-dash/src/server/mod-security.mjs +0 -397
  502. package/bizar-dash/src/server/mods-loader.mjs +0 -1243
  503. package/bizar-dash/src/server/notifications-store.mjs +0 -243
  504. package/bizar-dash/src/server/obsidian-store.mjs +0 -318
  505. package/bizar-dash/src/server/ocr.mjs +0 -55
  506. package/bizar-dash/src/server/otel.mjs +0 -260
  507. package/bizar-dash/src/server/pair-store.mjs +0 -138
  508. package/bizar-dash/src/server/progress-parser.test.mjs +0 -129
  509. package/bizar-dash/src/server/projects-store.mjs +0 -364
  510. package/bizar-dash/src/server/providers-store.mjs +0 -1801
  511. package/bizar-dash/src/server/routes/_shared.mjs +0 -430
  512. package/bizar-dash/src/server/routes/activity.mjs +0 -215
  513. package/bizar-dash/src/server/routes/admin.mjs +0 -163
  514. package/bizar-dash/src/server/routes/agent-bus.mjs +0 -185
  515. package/bizar-dash/src/server/routes/agents-cc.mjs +0 -551
  516. package/bizar-dash/src/server/routes/agents-cc.test.mjs +0 -35
  517. package/bizar-dash/src/server/routes/agents.mjs +0 -149
  518. package/bizar-dash/src/server/routes/artifacts.mjs +0 -315
  519. package/bizar-dash/src/server/routes/audit.mjs +0 -79
  520. package/bizar-dash/src/server/routes/auth.mjs +0 -69
  521. package/bizar-dash/src/server/routes/background.mjs +0 -422
  522. package/bizar-dash/src/server/routes/backup.mjs +0 -112
  523. package/bizar-dash/src/server/routes/chat.mjs +0 -727
  524. package/bizar-dash/src/server/routes/claude-session-detail.mjs +0 -367
  525. package/bizar-dash/src/server/routes/claude-sessions.mjs +0 -259
  526. package/bizar-dash/src/server/routes/clipboard.mjs +0 -173
  527. package/bizar-dash/src/server/routes/config.mjs +0 -180
  528. package/bizar-dash/src/server/routes/decisions.mjs +0 -78
  529. package/bizar-dash/src/server/routes/diagnostics.mjs +0 -50
  530. package/bizar-dash/src/server/routes/dialogs.mjs +0 -134
  531. package/bizar-dash/src/server/routes/digests.mjs +0 -82
  532. package/bizar-dash/src/server/routes/distill.mjs +0 -129
  533. package/bizar-dash/src/server/routes/doctor.mjs +0 -71
  534. package/bizar-dash/src/server/routes/env-vars.mjs +0 -231
  535. package/bizar-dash/src/server/routes/eval.mjs +0 -187
  536. package/bizar-dash/src/server/routes/fs.mjs +0 -429
  537. package/bizar-dash/src/server/routes/goal-planner.mjs +0 -236
  538. package/bizar-dash/src/server/routes/goals.mjs +0 -428
  539. package/bizar-dash/src/server/routes/history.mjs +0 -78
  540. package/bizar-dash/src/server/routes/lightrag.mjs +0 -169
  541. package/bizar-dash/src/server/routes/loops.mjs +0 -138
  542. package/bizar-dash/src/server/routes/memory.mjs +0 -1524
  543. package/bizar-dash/src/server/routes/minimax.mjs +0 -133
  544. package/bizar-dash/src/server/routes/misc.mjs +0 -90
  545. package/bizar-dash/src/server/routes/model-router.mjs +0 -158
  546. package/bizar-dash/src/server/routes/model-router.test.mjs +0 -104
  547. package/bizar-dash/src/server/routes/mods.mjs +0 -359
  548. package/bizar-dash/src/server/routes/notifications.mjs +0 -54
  549. package/bizar-dash/src/server/routes/obsidian.mjs +0 -239
  550. package/bizar-dash/src/server/routes/ocr.mjs +0 -182
  551. package/bizar-dash/src/server/routes/overview.mjs +0 -219
  552. package/bizar-dash/src/server/routes/overview.test.mjs +0 -65
  553. package/bizar-dash/src/server/routes/pair.mjs +0 -67
  554. package/bizar-dash/src/server/routes/projects.mjs +0 -175
  555. package/bizar-dash/src/server/routes/providers.mjs +0 -361
  556. package/bizar-dash/src/server/routes/schedules.mjs +0 -159
  557. package/bizar-dash/src/server/routes/sessions.mjs +0 -80
  558. package/bizar-dash/src/server/routes/settings.mjs +0 -51
  559. package/bizar-dash/src/server/routes/skills.mjs +0 -70
  560. package/bizar-dash/src/server/routes/spawn.mjs +0 -59
  561. package/bizar-dash/src/server/routes/tailscale.mjs +0 -46
  562. package/bizar-dash/src/server/routes/tasks.mjs +0 -579
  563. package/bizar-dash/src/server/routes/themes.mjs +0 -51
  564. package/bizar-dash/src/server/routes/update.mjs +0 -367
  565. package/bizar-dash/src/server/routes/usage.mjs +0 -136
  566. package/bizar-dash/src/server/routes/users.mjs +0 -102
  567. package/bizar-dash/src/server/routes/voice.mjs +0 -167
  568. package/bizar-dash/src/server/routes/workspaces.mjs +0 -299
  569. package/bizar-dash/src/server/routes-v2/auth.mjs +0 -59
  570. package/bizar-dash/src/server/routes-v2/events.mjs +0 -121
  571. package/bizar-dash/src/server/routes-v2/health.mjs +0 -21
  572. package/bizar-dash/src/server/routes-v2/index.mjs +0 -90
  573. package/bizar-dash/src/server/routes-v2/sessions.mjs +0 -111
  574. package/bizar-dash/src/server/schedules-runner.mjs +0 -556
  575. package/bizar-dash/src/server/schedules-store.mjs +0 -268
  576. package/bizar-dash/src/server/search-store.mjs +0 -220
  577. package/bizar-dash/src/server/serve-info.mjs +0 -1110
  578. package/bizar-dash/src/server/server.mjs +0 -951
  579. package/bizar-dash/src/server/settings-store.mjs +0 -45
  580. package/bizar-dash/src/server/skills-store.mjs +0 -192
  581. package/bizar-dash/src/server/sprint.test.mjs +0 -163
  582. package/bizar-dash/src/server/state.mjs +0 -437
  583. package/bizar-dash/src/server/tailscale-store.mjs +0 -113
  584. package/bizar-dash/src/server/task-delegator.mjs +0 -969
  585. package/bizar-dash/src/server/task-splitter.mjs +0 -241
  586. package/bizar-dash/src/server/tasks-store.mjs +0 -556
  587. package/bizar-dash/src/server/tui.mjs +0 -923
  588. package/bizar-dash/src/server/update-store.mjs +0 -168
  589. package/bizar-dash/src/server/v2-auth-file.mjs +0 -99
  590. package/bizar-dash/src/server/v2-event-bus.mjs +0 -128
  591. package/bizar-dash/src/server/voice-store.mjs +0 -229
  592. package/bizar-dash/src/server/voice-transcribe.mjs +0 -72
  593. package/bizar-dash/src/server/watcher.mjs +0 -81
  594. package/bizar-dash/src/server/workers/transcription-worker.mjs +0 -213
  595. package/bizar-dash/src/server/workspaces.mjs +0 -626
  596. package/bizar-dash/src/server/yaml.mjs +0 -238
  597. package/bizar-dash/src/web/index.html +0 -17
  598. package/bizar-dash/src/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  599. package/bizar-dash/src/web/v8/App.tsx +0 -426
  600. package/bizar-dash/src/web/v8/__tests__/App.test.tsx +0 -102
  601. package/bizar-dash/src/web/v8/__tests__/AppShell.test.tsx +0 -79
  602. package/bizar-dash/src/web/v8/__tests__/BackgroundJobsView.test.tsx +0 -172
  603. package/bizar-dash/src/web/v8/__tests__/MemoryView.test.tsx +0 -91
  604. package/bizar-dash/src/web/v8/__tests__/NotificationsPopover.test.tsx +0 -91
  605. package/bizar-dash/src/web/v8/__tests__/PageSkeleton.test.tsx +0 -12
  606. package/bizar-dash/src/web/v8/__tests__/SchedulesView.test.tsx +0 -157
  607. package/bizar-dash/src/web/v8/__tests__/SettingsView.test.tsx +0 -84
  608. package/bizar-dash/src/web/v8/__tests__/Sidebar.test.tsx +0 -95
  609. package/bizar-dash/src/web/v8/__tests__/Topbar.test.tsx +0 -86
  610. package/bizar-dash/src/web/v8/__tests__/activity.test.tsx +0 -63
  611. package/bizar-dash/src/web/v8/__tests__/admin-view.test.tsx +0 -105
  612. package/bizar-dash/src/web/v8/__tests__/agent-card-metrics.test.tsx +0 -54
  613. package/bizar-dash/src/web/v8/__tests__/agent-detail-tasks.test.tsx +0 -68
  614. package/bizar-dash/src/web/v8/__tests__/agent-hierarchy.test.tsx +0 -79
  615. package/bizar-dash/src/web/v8/__tests__/agents-stuck-banner.test.tsx +0 -142
  616. package/bizar-dash/src/web/v8/__tests__/agents.test.tsx +0 -90
  617. package/bizar-dash/src/web/v8/__tests__/artifacts-view.test.tsx +0 -102
  618. package/bizar-dash/src/web/v8/__tests__/audit-fixes.test.tsx +0 -139
  619. package/bizar-dash/src/web/v8/__tests__/auth-view.test.tsx +0 -94
  620. package/bizar-dash/src/web/v8/__tests__/changelog.test.tsx +0 -79
  621. package/bizar-dash/src/web/v8/__tests__/chat-types.test.ts +0 -55
  622. package/bizar-dash/src/web/v8/__tests__/chat-view.test.tsx +0 -142
  623. package/bizar-dash/src/web/v8/__tests__/claude-sessions-view.test.tsx +0 -159
  624. package/bizar-dash/src/web/v8/__tests__/clipboard-view.test.tsx +0 -90
  625. package/bizar-dash/src/web/v8/__tests__/config-view.test.tsx +0 -111
  626. package/bizar-dash/src/web/v8/__tests__/control-plane.test.tsx +0 -104
  627. package/bizar-dash/src/web/v8/__tests__/controls.test.tsx +0 -135
  628. package/bizar-dash/src/web/v8/__tests__/cx.test.ts +0 -25
  629. package/bizar-dash/src/web/v8/__tests__/data.test.tsx +0 -293
  630. package/bizar-dash/src/web/v8/__tests__/dialogs-view.test.tsx +0 -81
  631. package/bizar-dash/src/web/v8/__tests__/env-vars-view.test.tsx +0 -123
  632. package/bizar-dash/src/web/v8/__tests__/feedback.test.tsx +0 -213
  633. package/bizar-dash/src/web/v8/__tests__/goals-cc-roundtrip.test.tsx +0 -94
  634. package/bizar-dash/src/web/v8/__tests__/goals.test.tsx +0 -105
  635. package/bizar-dash/src/web/v8/__tests__/history-view.test.tsx +0 -96
  636. package/bizar-dash/src/web/v8/__tests__/kanban.test.tsx +0 -176
  637. package/bizar-dash/src/web/v8/__tests__/libraries.test.tsx +0 -70
  638. package/bizar-dash/src/web/v8/__tests__/lightrag-view.test.tsx +0 -90
  639. package/bizar-dash/src/web/v8/__tests__/memory.test.tsx +0 -60
  640. package/bizar-dash/src/web/v8/__tests__/misc-view.test.tsx +0 -79
  641. package/bizar-dash/src/web/v8/__tests__/mods-view.test.tsx +0 -123
  642. package/bizar-dash/src/web/v8/__tests__/navigation.test.tsx +0 -137
  643. package/bizar-dash/src/web/v8/__tests__/new-views.test.tsx +0 -160
  644. package/bizar-dash/src/web/v8/__tests__/obsidian-view.test.tsx +0 -82
  645. package/bizar-dash/src/web/v8/__tests__/overview-trends.test.tsx +0 -87
  646. package/bizar-dash/src/web/v8/__tests__/projects-view.test.tsx +0 -134
  647. package/bizar-dash/src/web/v8/__tests__/providers-view.test.tsx +0 -100
  648. package/bizar-dash/src/web/v8/__tests__/settings.test.tsx +0 -104
  649. package/bizar-dash/src/web/v8/__tests__/theme.test.tsx +0 -104
  650. package/bizar-dash/src/web/v8/__tests__/update-view.test.tsx +0 -89
  651. package/bizar-dash/src/web/v8/__tests__/useFetch.test.ts +0 -92
  652. package/bizar-dash/src/web/v8/__tests__/useWebSocket.test.ts +0 -87
  653. package/bizar-dash/src/web/v8/__tests__/views.test.tsx +0 -188
  654. package/bizar-dash/src/web/v8/__tests__/voice-view.test.tsx +0 -80
  655. package/bizar-dash/src/web/v8/data/fetcher.ts +0 -59
  656. package/bizar-dash/src/web/v8/data/types.ts +0 -239
  657. package/bizar-dash/src/web/v8/data/useFetch.ts +0 -62
  658. package/bizar-dash/src/web/v8/data/useViewNavigate.ts +0 -54
  659. package/bizar-dash/src/web/v8/data/useWebSocket.ts +0 -206
  660. package/bizar-dash/src/web/v8/main.tsx +0 -28
  661. package/bizar-dash/src/web/v8/shell/AppShell.tsx +0 -126
  662. package/bizar-dash/src/web/v8/shell/PageSkeleton.tsx +0 -29
  663. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +0 -515
  664. package/bizar-dash/src/web/v8/shell/StatusBar.tsx +0 -63
  665. package/bizar-dash/src/web/v8/shell/Topbar.tsx +0 -330
  666. package/bizar-dash/src/web/v8/shell/index.ts +0 -15
  667. package/bizar-dash/src/web/v8/ui/activity/ActivityFeed.tsx +0 -137
  668. package/bizar-dash/src/web/v8/ui/activity/ActivityLane.tsx +0 -315
  669. package/bizar-dash/src/web/v8/ui/activity/ActivityLanes.tsx +0 -51
  670. package/bizar-dash/src/web/v8/ui/agents/AgentActivity.tsx +0 -101
  671. package/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +0 -239
  672. package/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +0 -439
  673. package/bizar-dash/src/web/v8/ui/agents/AgentLiveOutput.tsx +0 -252
  674. package/bizar-dash/src/web/v8/ui/agents/AgentStreamPanel.tsx +0 -371
  675. package/bizar-dash/src/web/v8/ui/chat/ChatDrawer.tsx +0 -208
  676. package/bizar-dash/src/web/v8/ui/chat/EventStream.tsx +0 -83
  677. package/bizar-dash/src/web/v8/ui/chat/MessageBubble.tsx +0 -174
  678. package/bizar-dash/src/web/v8/ui/controls/Button.tsx +0 -141
  679. package/bizar-dash/src/web/v8/ui/controls/ButtonGroup.tsx +0 -32
  680. package/bizar-dash/src/web/v8/ui/controls/Checkbox.tsx +0 -49
  681. package/bizar-dash/src/web/v8/ui/controls/Field.tsx +0 -78
  682. package/bizar-dash/src/web/v8/ui/controls/Form.tsx +0 -23
  683. package/bizar-dash/src/web/v8/ui/controls/IconButton.tsx +0 -112
  684. package/bizar-dash/src/web/v8/ui/controls/Input.tsx +0 -94
  685. package/bizar-dash/src/web/v8/ui/controls/RadioGroup.tsx +0 -74
  686. package/bizar-dash/src/web/v8/ui/controls/Select.tsx +0 -171
  687. package/bizar-dash/src/web/v8/ui/controls/Slider.tsx +0 -68
  688. package/bizar-dash/src/web/v8/ui/controls/Switch.tsx +0 -56
  689. package/bizar-dash/src/web/v8/ui/controls/Textarea.tsx +0 -64
  690. package/bizar-dash/src/web/v8/ui/controls/Toggle.tsx +0 -36
  691. package/bizar-dash/src/web/v8/ui/controls/ToggleGroup.tsx +0 -85
  692. package/bizar-dash/src/web/v8/ui/data/Accordion.tsx +0 -134
  693. package/bizar-dash/src/web/v8/ui/data/Avatar.tsx +0 -175
  694. package/bizar-dash/src/web/v8/ui/data/Badge.tsx +0 -93
  695. package/bizar-dash/src/web/v8/ui/data/BarList.tsx +0 -101
  696. package/bizar-dash/src/web/v8/ui/data/Card.tsx +0 -140
  697. package/bizar-dash/src/web/v8/ui/data/Chip.tsx +0 -96
  698. package/bizar-dash/src/web/v8/ui/data/Kbd.tsx +0 -42
  699. package/bizar-dash/src/web/v8/ui/data/ListHeader.tsx +0 -94
  700. package/bizar-dash/src/web/v8/ui/data/ProgressBar.tsx +0 -93
  701. package/bizar-dash/src/web/v8/ui/data/Sparkline.tsx +0 -98
  702. package/bizar-dash/src/web/v8/ui/data/StatTile.tsx +0 -150
  703. package/bizar-dash/src/web/v8/ui/data/Table.tsx +0 -170
  704. package/bizar-dash/src/web/v8/ui/data/Timeline.tsx +0 -130
  705. package/bizar-dash/src/web/v8/ui/data/ViewHeader.tsx +0 -122
  706. package/bizar-dash/src/web/v8/ui/feedback/Alert.tsx +0 -95
  707. package/bizar-dash/src/web/v8/ui/feedback/Banner.tsx +0 -39
  708. package/bizar-dash/src/web/v8/ui/feedback/ContextMenu.tsx +0 -143
  709. package/bizar-dash/src/web/v8/ui/feedback/Dialog.tsx +0 -149
  710. package/bizar-dash/src/web/v8/ui/feedback/Drawer.tsx +0 -8
  711. package/bizar-dash/src/web/v8/ui/feedback/DropdownMenu.tsx +0 -231
  712. package/bizar-dash/src/web/v8/ui/feedback/EmptyState.tsx +0 -48
  713. package/bizar-dash/src/web/v8/ui/feedback/ErrorState.tsx +0 -116
  714. package/bizar-dash/src/web/v8/ui/feedback/NotificationsPopover.tsx +0 -242
  715. package/bizar-dash/src/web/v8/ui/feedback/Popover.tsx +0 -56
  716. package/bizar-dash/src/web/v8/ui/feedback/Sheet.tsx +0 -103
  717. package/bizar-dash/src/web/v8/ui/feedback/Skeleton.tsx +0 -67
  718. package/bizar-dash/src/web/v8/ui/feedback/Spinner.tsx +0 -30
  719. package/bizar-dash/src/web/v8/ui/feedback/Toast.tsx +0 -66
  720. package/bizar-dash/src/web/v8/ui/feedback/Tooltip.tsx +0 -89
  721. package/bizar-dash/src/web/v8/ui/feedback/useFocusTrap.ts +0 -58
  722. package/bizar-dash/src/web/v8/ui/goals/GoalCard.tsx +0 -176
  723. package/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +0 -278
  724. package/bizar-dash/src/web/v8/ui/goals/KeyResult.tsx +0 -115
  725. package/bizar-dash/src/web/v8/ui/index.ts +0 -369
  726. package/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +0 -117
  727. package/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +0 -391
  728. package/bizar-dash/src/web/v8/ui/kanban/KanbanCardBadges.tsx +0 -111
  729. package/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +0 -181
  730. package/bizar-dash/src/web/v8/ui/kanban/KanbanContextMenu.tsx +0 -126
  731. package/bizar-dash/src/web/v8/ui/kanban/KanbanDetailDialog.tsx +0 -638
  732. package/bizar-dash/src/web/v8/ui/kanban/KanbanEmptyColumn.tsx +0 -43
  733. package/bizar-dash/src/web/v8/ui/kanban/KanbanProgress.tsx +0 -130
  734. package/bizar-dash/src/web/v8/ui/kanban/KanbanQuickAdd.tsx +0 -141
  735. package/bizar-dash/src/web/v8/ui/kanban/KanbanToolbar.tsx +0 -291
  736. package/bizar-dash/src/web/v8/ui/kanban/useKanbanSelection.ts +0 -90
  737. package/bizar-dash/src/web/v8/ui/libraries/LibraryGrid.tsx +0 -30
  738. package/bizar-dash/src/web/v8/ui/libraries/LibraryItem.tsx +0 -161
  739. package/bizar-dash/src/web/v8/ui/memory/MemoryVault.tsx +0 -144
  740. package/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +0 -225
  741. package/bizar-dash/src/web/v8/ui/navigation/NavLink.tsx +0 -81
  742. package/bizar-dash/src/web/v8/ui/navigation/Pagination.tsx +0 -164
  743. package/bizar-dash/src/web/v8/ui/navigation/Tabs.tsx +0 -128
  744. package/bizar-dash/src/web/v8/ui/navigation/useCommandPaletteHotkey.test.ts +0 -79
  745. package/bizar-dash/src/web/v8/ui/primitives/Box.tsx +0 -144
  746. package/bizar-dash/src/web/v8/ui/primitives/Center.tsx +0 -40
  747. package/bizar-dash/src/web/v8/ui/primitives/Cluster.tsx +0 -67
  748. package/bizar-dash/src/web/v8/ui/primitives/Grid.tsx +0 -104
  749. package/bizar-dash/src/web/v8/ui/primitives/Inline.tsx +0 -77
  750. package/bizar-dash/src/web/v8/ui/primitives/Portal.tsx +0 -33
  751. package/bizar-dash/src/web/v8/ui/primitives/ScrollArea.tsx +0 -62
  752. package/bizar-dash/src/web/v8/ui/primitives/Separator.tsx +0 -42
  753. package/bizar-dash/src/web/v8/ui/primitives/Stack.tsx +0 -73
  754. package/bizar-dash/src/web/v8/ui/primitives/VisuallyHidden.tsx +0 -49
  755. package/bizar-dash/src/web/v8/ui/settings/SettingsNav.tsx +0 -91
  756. package/bizar-dash/src/web/v8/ui/settings/SettingsRow.tsx +0 -88
  757. package/bizar-dash/src/web/v8/ui/settings/SettingsSection.tsx +0 -109
  758. package/bizar-dash/src/web/v8/ui/styles/globals.css +0 -265
  759. package/bizar-dash/src/web/v8/ui/styles/reset.css +0 -57
  760. package/bizar-dash/src/web/v8/ui/styles/tokens.css +0 -238
  761. package/bizar-dash/src/web/v8/ui/tasks/TaskDetail.tsx +0 -313
  762. package/bizar-dash/src/web/v8/ui/theme/DensityProvider.test.tsx +0 -74
  763. package/bizar-dash/src/web/v8/ui/theme/DensityProvider.tsx +0 -66
  764. package/bizar-dash/src/web/v8/ui/theme/ThemeProvider.test.tsx +0 -86
  765. package/bizar-dash/src/web/v8/ui/theme/ThemeProvider.tsx +0 -94
  766. package/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +0 -93
  767. package/bizar-dash/src/web/v8/ui/theme/useDensity.ts +0 -15
  768. package/bizar-dash/src/web/v8/ui/theme/useTheme.ts +0 -16
  769. package/bizar-dash/src/web/v8/ui/utils/cx.ts +0 -19
  770. package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +0 -457
  771. package/bizar-dash/src/web/v8/views/Admin/AdminView.tsx +0 -237
  772. package/bizar-dash/src/web/v8/views/Agents/AgentHierarchy.tsx +0 -212
  773. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +0 -511
  774. package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +0 -452
  775. package/bizar-dash/src/web/v8/views/Artifacts/ClaudeArtifactView.tsx +0 -179
  776. package/bizar-dash/src/web/v8/views/Auth/AuthView.tsx +0 -179
  777. package/bizar-dash/src/web/v8/views/BackgroundJobs/BackgroundJobsView.tsx +0 -467
  778. package/bizar-dash/src/web/v8/views/Backup/BackupView.tsx +0 -204
  779. package/bizar-dash/src/web/v8/views/Chat/ChatView.tsx +0 -368
  780. package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionDetail.tsx +0 -144
  781. package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionsView.tsx +0 -331
  782. package/bizar-dash/src/web/v8/views/ClaudeSessions/NewSessionModal.tsx +0 -136
  783. package/bizar-dash/src/web/v8/views/Clipboard/ClipboardView.tsx +0 -210
  784. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.test.tsx +0 -142
  785. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +0 -272
  786. package/bizar-dash/src/web/v8/views/Config/ConfigView.tsx +0 -364
  787. package/bizar-dash/src/web/v8/views/Diagnostics/DiagnosticsView.tsx +0 -203
  788. package/bizar-dash/src/web/v8/views/Dialogs/DialogsView.tsx +0 -196
  789. package/bizar-dash/src/web/v8/views/Doctor/DoctorView.tsx +0 -181
  790. package/bizar-dash/src/web/v8/views/EnvVars/EnvVarsView.tsx +0 -365
  791. package/bizar-dash/src/web/v8/views/Eval/EvalView.tsx +0 -278
  792. package/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +0 -351
  793. package/bizar-dash/src/web/v8/views/History/HistoryView.tsx +0 -227
  794. package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +0 -123
  795. package/bizar-dash/src/web/v8/views/LightRAG/LightRAGView.tsx +0 -204
  796. package/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +0 -258
  797. package/bizar-dash/src/web/v8/views/Misc/MiscView.tsx +0 -159
  798. package/bizar-dash/src/web/v8/views/Mods/ModsView.tsx +0 -348
  799. package/bizar-dash/src/web/v8/views/Notifications/NotificationsView.tsx +0 -247
  800. package/bizar-dash/src/web/v8/views/Obsidian/ObsidianView.tsx +0 -193
  801. package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +0 -274
  802. package/bizar-dash/src/web/v8/views/Projects/ProjectsView.tsx +0 -273
  803. package/bizar-dash/src/web/v8/views/Providers/ProvidersView.tsx +0 -371
  804. package/bizar-dash/src/web/v8/views/Router.tsx +0 -202
  805. package/bizar-dash/src/web/v8/views/Schedules/SchedulesView.tsx +0 -462
  806. package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +0 -1039
  807. package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +0 -386
  808. package/bizar-dash/src/web/v8/views/Update/UpdateView.tsx +0 -270
  809. package/bizar-dash/src/web/v8/views/Usage/UsageView.tsx +0 -210
  810. package/bizar-dash/src/web/v8/views/Voice/VoiceView.tsx +0 -192
  811. package/bizar-dash/src/web/v8/vite-env.d.ts +0 -15
  812. package/bizar-dash/templates/mod/FORMAT.md +0 -76
  813. package/bizar-dash/templates/mod/hello-mod/README.md +0 -19
  814. package/bizar-dash/templates/mod/hello-mod/agents/greeter.md +0 -8
  815. package/bizar-dash/templates/mod/hello-mod/commands/hello.md +0 -6
  816. package/bizar-dash/templates/mod/hello-mod/mod.json +0 -20
  817. package/bizar-dash/templates/mod/hello-mod/routes/ping.mjs +0 -9
  818. package/bizar-dash/templates/mod/hello-mod/views/HelloView.tsx +0 -10
  819. package/bizar-dash/tests/_update-test-helpers.mjs +0 -13
  820. package/bizar-dash/tests/admin-labels.test.mjs +0 -42
  821. package/bizar-dash/tests/admin-run-grouping.test.mjs +0 -42
  822. package/bizar-dash/tests/agent-bus.test.mjs +0 -289
  823. package/bizar-dash/tests/agents-preview-truncate.test.mjs +0 -35
  824. package/bizar-dash/tests/agents-summary-sanitize.test.ts +0 -51
  825. package/bizar-dash/tests/auth-inputs-labels.test.mjs +0 -45
  826. package/bizar-dash/tests/background-jobs-action-labels.test.mjs +0 -41
  827. package/bizar-dash/tests/background-jobs-states.test.mjs +0 -80
  828. package/bizar-dash/tests/background-pause-resume.test.mjs +0 -46
  829. package/bizar-dash/tests/background-sdk-session.test.mjs +0 -94
  830. package/bizar-dash/tests/background-session-events.test.mjs +0 -74
  831. package/bizar-dash/tests/background-spawn-from-ui.test.mjs +0 -36
  832. package/bizar-dash/tests/background-steer-sdk.test.mjs +0 -71
  833. package/bizar-dash/tests/background-steer.test.mjs +0 -60
  834. package/bizar-dash/tests/backup-restore.test.mjs +0 -217
  835. package/bizar-dash/tests/backup-store.test.mjs +0 -300
  836. package/bizar-dash/tests/banner-tones.test.mjs +0 -50
  837. package/bizar-dash/tests/bundle-analysis.test.mjs +0 -74
  838. package/bizar-dash/tests/callout-tokens.test.mjs +0 -30
  839. package/bizar-dash/tests/chat-new-session.test.mjs +0 -63
  840. package/bizar-dash/tests/claude-session-detail-states.test.mjs +0 -67
  841. package/bizar-dash/tests/cli-bugfixes.test.mjs +0 -151
  842. package/bizar-dash/tests/cli-error-visibility.test.mjs +0 -153
  843. package/bizar-dash/tests/cli-refactor.test.mjs +0 -183
  844. package/bizar-dash/tests/cli-tailscale.test.mjs +0 -113
  845. package/bizar-dash/tests/clipboard.test.mjs +0 -147
  846. package/bizar-dash/tests/components/BackgroundJobsSkeleton.test.tsx +0 -38
  847. package/bizar-dash/tests/components/Button.test.tsx +0 -78
  848. package/bizar-dash/tests/components/Card.test.tsx +0 -59
  849. package/bizar-dash/tests/components/Dialog.test.tsx +0 -80
  850. package/bizar-dash/tests/components/Toast.test.tsx +0 -61
  851. package/bizar-dash/tests/dash-cli-load.test.mjs +0 -44
  852. package/bizar-dash/tests/dashboard-ports.test.mjs +0 -138
  853. package/bizar-dash/tests/density-tokens.test.mjs +0 -46
  854. package/bizar-dash/tests/deploy-templates.test.mjs +0 -100
  855. package/bizar-dash/tests/diagnostics-store.test.mjs +0 -205
  856. package/bizar-dash/tests/digest-generation.test.mjs +0 -191
  857. package/bizar-dash/tests/digest-store.test.mjs +0 -264
  858. package/bizar-dash/tests/docker-build.test.mjs +0 -96
  859. package/bizar-dash/tests/doctor-route-shape.test.mjs +0 -67
  860. package/bizar-dash/tests/empty-state-docs.test.mjs +0 -55
  861. package/bizar-dash/tests/env-vars-extended.test.mjs +0 -190
  862. package/bizar-dash/tests/env-vars-store.test.mjs +0 -216
  863. package/bizar-dash/tests/errorstate-retry.test.mjs +0 -42
  864. package/bizar-dash/tests/eval/fixtures-extra.test.mjs +0 -285
  865. package/bizar-dash/tests/eval/fixtures.test.mjs +0 -141
  866. package/bizar-dash/tests/eval/report.test.mjs +0 -284
  867. package/bizar-dash/tests/eval/runner.test.mjs +0 -471
  868. package/bizar-dash/tests/eval-csv.test.mjs +0 -67
  869. package/bizar-dash/tests/eval-scheduled.test.mjs +0 -84
  870. package/bizar-dash/tests/focus-visible.test.mjs +0 -30
  871. package/bizar-dash/tests/frontend-bugfixes.test.mjs +0 -151
  872. package/bizar-dash/tests/goals-decompose.test.mjs +0 -179
  873. package/bizar-dash/tests/kanban-empty-column.test.mjs +0 -56
  874. package/bizar-dash/tests/layout-spacing.test.mjs +0 -101
  875. package/bizar-dash/tests/library-dedupe.test.mjs +0 -62
  876. package/bizar-dash/tests/lightrag-defaults.node.test.mjs +0 -118
  877. package/bizar-dash/tests/lightrag-skeleton.test.mjs +0 -31
  878. package/bizar-dash/tests/lightrag-startup-hook.test.mjs +0 -238
  879. package/bizar-dash/tests/lightrag-states.test.mjs +0 -60
  880. package/bizar-dash/tests/logger.test.mjs +0 -207
  881. package/bizar-dash/tests/loop-runtime.test.mjs +0 -312
  882. package/bizar-dash/tests/loops-agent-bus-routes.test.mjs +0 -293
  883. package/bizar-dash/tests/memory-auto-reindex.test.mjs +0 -196
  884. package/bizar-dash/tests/memory-cli-readlistdelete.test.mjs +0 -405
  885. package/bizar-dash/tests/memory-cli-setup.test.mjs +0 -382
  886. package/bizar-dash/tests/memory-cli.test.mjs +0 -596
  887. package/bizar-dash/tests/memory-config.test.mjs +0 -422
  888. package/bizar-dash/tests/memory-conflicts.test.mjs +0 -229
  889. package/bizar-dash/tests/memory-default-vault.test.mjs +0 -185
  890. package/bizar-dash/tests/memory-git.test.mjs +0 -264
  891. package/bizar-dash/tests/memory-graph.test.mjs +0 -95
  892. package/bizar-dash/tests/memory-install-bootstrap.test.mjs +0 -129
  893. package/bizar-dash/tests/memory-lightrag-extended.test.mjs +0 -293
  894. package/bizar-dash/tests/memory-lightrag.test.mjs +0 -153
  895. package/bizar-dash/tests/memory-link.test.mjs +0 -134
  896. package/bizar-dash/tests/memory-namespace.test.mjs +0 -404
  897. package/bizar-dash/tests/memory-obsidian.test.mjs +0 -269
  898. package/bizar-dash/tests/memory-path-safety.test.mjs +0 -427
  899. package/bizar-dash/tests/memory-protocol-drift.test.mjs +0 -52
  900. package/bizar-dash/tests/memory-roundtrip.test.mjs +0 -219
  901. package/bizar-dash/tests/memory-schema.test.mjs +0 -198
  902. package/bizar-dash/tests/memory-secrets.test.mjs +0 -121
  903. package/bizar-dash/tests/memory-status-root.test.mjs +0 -144
  904. package/bizar-dash/tests/memory-store.test.mjs +0 -493
  905. package/bizar-dash/tests/memory-sync.test.mjs +0 -141
  906. package/bizar-dash/tests/memory-tab.test.mjs +0 -322
  907. package/bizar-dash/tests/memory-vault-config-endpoint.test.mjs +0 -173
  908. package/bizar-dash/tests/metrics.test.mjs +0 -183
  909. package/bizar-dash/tests/minimax-bar.test.tsx +0 -113
  910. package/bizar-dash/tests/minimax-chat-usage.test.mjs +0 -253
  911. package/bizar-dash/tests/minimax-models.test.mjs +0 -123
  912. package/bizar-dash/tests/minimax-usage-store.node.test.mjs +0 -293
  913. package/bizar-dash/tests/mod-instructions.node.test.mjs +0 -188
  914. package/bizar-dash/tests/mod-security.test.mjs +0 -273
  915. package/bizar-dash/tests/mod-upgrade.node.test.mjs +0 -357
  916. package/bizar-dash/tests/modal-focus-trap.test.mjs +0 -114
  917. package/bizar-dash/tests/no-browser-harness.node.test.mjs +0 -98
  918. package/bizar-dash/tests/notifications-dismiss-restore.test.mjs +0 -85
  919. package/bizar-dash/tests/obsidian-back-compat.test.mjs +0 -199
  920. package/bizar-dash/tests/ocr.test.mjs +0 -87
  921. package/bizar-dash/tests/orphan-tests-audit.test.mjs +0 -80
  922. package/bizar-dash/tests/otel-spans.test.mjs +0 -253
  923. package/bizar-dash/tests/otel.test.mjs +0 -188
  924. package/bizar-dash/tests/palette-keyboard-nav.test.mjs +0 -123
  925. package/bizar-dash/tests/palette-shortcut-hint.test.mjs +0 -58
  926. package/bizar-dash/tests/path-safe.test.mjs +0 -108
  927. package/bizar-dash/tests/projects-filter.test.mjs +0 -48
  928. package/bizar-dash/tests/providers-store-backup-keys.node.test.mjs +0 -809
  929. package/bizar-dash/tests/providers-store-search.node.test.mjs +0 -166
  930. package/bizar-dash/tests/rate-limit.test.mjs +0 -298
  931. package/bizar-dash/tests/routes-doctor.test.mjs +0 -159
  932. package/bizar-dash/tests/schedules-skeleton.test.mjs +0 -25
  933. package/bizar-dash/tests/schedules-states.test.mjs +0 -67
  934. package/bizar-dash/tests/schedules-templates.test.mjs +0 -144
  935. package/bizar-dash/tests/server-bugfixes.test.mjs +0 -318
  936. package/bizar-dash/tests/settings-labels.test.mjs +0 -80
  937. package/bizar-dash/tests/setup.ts +0 -84
  938. package/bizar-dash/tests/sidebar-collapse-animation.test.mjs +0 -37
  939. package/bizar-dash/tests/sidebar-distinct-icons.test.mjs +0 -28
  940. package/bizar-dash/tests/sidebar-responsive.test.tsx +0 -48
  941. package/bizar-dash/tests/sidebar-section-styles.test.mjs +0 -55
  942. package/bizar-dash/tests/sidebar-section-toggle.test.tsx +0 -63
  943. package/bizar-dash/tests/skeleton-height.test.mjs +0 -47
  944. package/bizar-dash/tests/skills-list.test.mjs +0 -232
  945. package/bizar-dash/tests/skills-search.test.mjs +0 -222
  946. package/bizar-dash/tests/smoke-v2.mjs +0 -212
  947. package/bizar-dash/tests/space-tokens.test.mjs +0 -36
  948. package/bizar-dash/tests/stattile-loading.test.mjs +0 -28
  949. package/bizar-dash/tests/strip-thinking.test.mjs +0 -175
  950. package/bizar-dash/tests/submit-feedback.test.mjs +0 -353
  951. package/bizar-dash/tests/task-splitter.test.mjs +0 -268
  952. package/bizar-dash/tests/tasks-create.test.mjs +0 -187
  953. package/bizar-dash/tests/tasks-patch-routes.test.mjs +0 -194
  954. package/bizar-dash/tests/theme-toggle-icon.test.mjs +0 -28
  955. package/bizar-dash/tests/tmux-wrap.test.mjs +0 -145
  956. package/bizar-dash/tests/topbar-design-system.test.mjs +0 -56
  957. package/bizar-dash/tests/topbar-popover-styles.test.mjs +0 -53
  958. package/bizar-dash/tests/ui/primitives/VisuallyHidden.test.tsx +0 -42
  959. package/bizar-dash/tests/update-channels.test.mjs +0 -67
  960. package/bizar-dash/tests/update-check.test.mjs +0 -132
  961. package/bizar-dash/tests/update-packages.test.mjs +0 -154
  962. package/bizar-dash/tests/update-run.test.mjs +0 -203
  963. package/bizar-dash/tests/users.test.mjs +0 -108
  964. package/bizar-dash/tests/v7-archive/BackgroundAgents.test.tsx +0 -160
  965. package/bizar-dash/tests/v7-archive/a11y/forms.test.tsx +0 -191
  966. package/bizar-dash/tests/v7-archive/a11y.test.tsx +0 -206
  967. package/bizar-dash/tests/v7-archive/autosave.test.tsx +0 -276
  968. package/bizar-dash/tests/v7-archive/backup-restore.test.tsx +0 -141
  969. package/bizar-dash/tests/v7-archive/chat-composer.test.tsx +0 -140
  970. package/bizar-dash/tests/v7-archive/communication-log.test.tsx +0 -67
  971. package/bizar-dash/tests/v7-archive/components/Modal.test.tsx +0 -104
  972. package/bizar-dash/tests/v7-archive/components/Spinner.test.tsx +0 -32
  973. package/bizar-dash/tests/v7-archive/components/StatusBadge.test.tsx +0 -35
  974. package/bizar-dash/tests/v7-archive/components/doctor-panel.test.tsx +0 -105
  975. package/bizar-dash/tests/v7-archive/components/screenshot-ocr.test.tsx +0 -75
  976. package/bizar-dash/tests/v7-archive/components/settings-search.test.tsx +0 -180
  977. package/bizar-dash/tests/v7-archive/components/workspace-selector.test.tsx +0 -73
  978. package/bizar-dash/tests/v7-archive/controls/Button.test.tsx +0 -50
  979. package/bizar-dash/tests/v7-archive/controls/Checkbox.test.tsx +0 -44
  980. package/bizar-dash/tests/v7-archive/controls/IconButton.test.tsx +0 -37
  981. package/bizar-dash/tests/v7-archive/controls/Kbd.test.tsx +0 -39
  982. package/bizar-dash/tests/v7-archive/controls/NumberInput.test.tsx +0 -56
  983. package/bizar-dash/tests/v7-archive/controls/RadioGroup.test.tsx +0 -58
  984. package/bizar-dash/tests/v7-archive/controls/SearchInput.test.tsx +0 -52
  985. package/bizar-dash/tests/v7-archive/controls/Select.test.tsx +0 -66
  986. package/bizar-dash/tests/v7-archive/controls/Slider.test.tsx +0 -41
  987. package/bizar-dash/tests/v7-archive/controls/TextInput.test.tsx +0 -44
  988. package/bizar-dash/tests/v7-archive/controls/Textarea.test.tsx +0 -56
  989. package/bizar-dash/tests/v7-archive/controls/Toggle.test.tsx +0 -39
  990. package/bizar-dash/tests/v7-archive/data/BarChart.test.tsx +0 -55
  991. package/bizar-dash/tests/v7-archive/data/DataTable.test.tsx +0 -112
  992. package/bizar-dash/tests/v7-archive/data/EmptyState.test.tsx +0 -57
  993. package/bizar-dash/tests/v7-archive/data/ErrorState.test.tsx +0 -47
  994. package/bizar-dash/tests/v7-archive/data/KeyValueList.test.tsx +0 -59
  995. package/bizar-dash/tests/v7-archive/data/LoadingState.test.tsx +0 -37
  996. package/bizar-dash/tests/v7-archive/data/Sparkline.test.tsx +0 -56
  997. package/bizar-dash/tests/v7-archive/data/StatTile.test.tsx +0 -69
  998. package/bizar-dash/tests/v7-archive/dep-graph.test.tsx +0 -40
  999. package/bizar-dash/tests/v7-archive/eval-web-ui.test.tsx +0 -220
  1000. package/bizar-dash/tests/v7-archive/event-log.test.tsx +0 -61
  1001. package/bizar-dash/tests/v7-archive/feedback/Badge.test.tsx +0 -41
  1002. package/bizar-dash/tests/v7-archive/feedback/Dialog.test.tsx +0 -99
  1003. package/bizar-dash/tests/v7-archive/feedback/ProgressBar.test.tsx +0 -66
  1004. package/bizar-dash/tests/v7-archive/feedback/StatusDot.test.tsx +0 -41
  1005. package/bizar-dash/tests/v7-archive/feedback/Toast.test.tsx +0 -124
  1006. package/bizar-dash/tests/v7-archive/feedback/Tooltip.test.tsx +0 -102
  1007. package/bizar-dash/tests/v7-archive/goal-input.test.tsx +0 -72
  1008. package/bizar-dash/tests/v7-archive/goap-planner.test.ts +0 -68
  1009. package/bizar-dash/tests/v7-archive/hooks/useModal.test.tsx +0 -84
  1010. package/bizar-dash/tests/v7-archive/hooks/useToast.test.tsx +0 -50
  1011. package/bizar-dash/tests/v7-archive/layout/AppShell.test.tsx +0 -50
  1012. package/bizar-dash/tests/v7-archive/layout/Breadcrumbs.test.tsx +0 -85
  1013. package/bizar-dash/tests/v7-archive/layout/Panel.test.tsx +0 -52
  1014. package/bizar-dash/tests/v7-archive/layout/PanelHeader.test.tsx +0 -32
  1015. package/bizar-dash/tests/v7-archive/layout/Sidebar.test.tsx +0 -95
  1016. package/bizar-dash/tests/v7-archive/layout/Tabs.test.tsx +0 -87
  1017. package/bizar-dash/tests/v7-archive/layout/Topbar.test.tsx +0 -41
  1018. package/bizar-dash/tests/v7-archive/layout/ViewHeader.test.tsx +0 -47
  1019. package/bizar-dash/tests/v7-archive/lib/i18n.test.ts +0 -46
  1020. package/bizar-dash/tests/v7-archive/lib/search-fuzzy.test.ts +0 -149
  1021. package/bizar-dash/tests/v7-archive/lib/utils.test.ts +0 -194
  1022. package/bizar-dash/tests/v7-archive/memory-graph-view.test.tsx +0 -69
  1023. package/bizar-dash/tests/v7-archive/mobile-chat.test.tsx +0 -82
  1024. package/bizar-dash/tests/v7-archive/mobile-layout.test.tsx +0 -332
  1025. package/bizar-dash/tests/v7-archive/mobile-tasks.test.tsx +0 -162
  1026. package/bizar-dash/tests/v7-archive/navigation/NavGroup.test.tsx +0 -55
  1027. package/bizar-dash/tests/v7-archive/navigation/NavLink.test.tsx +0 -61
  1028. package/bizar-dash/tests/v7-archive/quality-gates.test.tsx +0 -59
  1029. package/bizar-dash/tests/v7-archive/settings-layout.test.tsx +0 -129
  1030. package/bizar-dash/tests/v7-archive/settings-mode-wiring.test.tsx +0 -151
  1031. package/bizar-dash/tests/v7-archive/ui/primitives/Box.test.tsx +0 -49
  1032. package/bizar-dash/tests/v7-archive/ui/primitives/Grid.test.tsx +0 -37
  1033. package/bizar-dash/tests/v7-archive/ui/primitives/Inline.test.tsx +0 -33
  1034. package/bizar-dash/tests/v7-archive/ui/primitives/Separator.test.tsx +0 -34
  1035. package/bizar-dash/tests/v7-archive/ui/primitives/Stack.test.tsx +0 -45
  1036. package/bizar-dash/tests/v7-archive/views/Agents.test.tsx +0 -359
  1037. package/bizar-dash/tests/v7-archive/views/Memory.test.tsx +0 -274
  1038. package/bizar-dash/tests/v7-archive/views/Tasks.test.tsx +0 -250
  1039. package/bizar-dash/tests/v7-archive/views/sidebar.test.tsx +0 -116
  1040. package/bizar-dash/tests/v7-archive/views/topbar.test.tsx +0 -87
  1041. package/bizar-dash/tests/v7-archive/voice-recorder.test.tsx +0 -95
  1042. package/bizar-dash/tests/voice-store.test.mjs +0 -148
  1043. package/bizar-dash/tests/voice-transcribe-worker.test.mjs +0 -343
  1044. package/bizar-dash/tests/voice-transcribe.test.mjs +0 -87
  1045. package/bizar-dash/tests/workspaces.test.mjs +0 -527
  1046. package/bizar-dash/tests/yaml.test.mjs +0 -128
  1047. package/bizar-dash/tsconfig.json +0 -23
  1048. package/bizar-dash/vite.config.ts +0 -82
  1049. package/bizar-dash/vitest.config.ts +0 -20
  1050. package/cli/__tests__/cost-gate.test.mjs +0 -301
  1051. package/cli/__tests__/esm-no-require.test.mjs +0 -97
  1052. package/cli/__tests__/feature-list-bridge.test.mjs +0 -371
  1053. package/cli/agent-browser-up.sh +0 -152
  1054. package/cli/agent-browser-update.test.mjs +0 -86
  1055. package/cli/artifact-cli.mjs +0 -605
  1056. package/cli/artifact-render.mjs +0 -621
  1057. package/cli/artifact-server.mjs +0 -847
  1058. package/cli/artifact-templates.mjs +0 -523
  1059. package/cli/artifact.mjs +0 -63
  1060. package/cli/artifact.test.mjs +0 -2331
  1061. package/cli/bg.mjs +0 -471
  1062. package/cli/cli-commands-validation.test.mjs +0 -106
  1063. package/cli/commands/artifact.mjs +0 -20
  1064. package/cli/commands/clip.mjs +0 -163
  1065. package/cli/commands/dash.mjs +0 -193
  1066. package/cli/commands/deploy/cloudflare.mjs +0 -250
  1067. package/cli/commands/deploy/docker.mjs +0 -219
  1068. package/cli/commands/deploy/fly.mjs +0 -161
  1069. package/cli/commands/deploy/vercel.mjs +0 -225
  1070. package/cli/commands/deploy.mjs +0 -240
  1071. package/cli/commands/eval.mjs +0 -396
  1072. package/cli/commands/lightrag.mjs +0 -170
  1073. package/cli/commands/marketplace.mjs +0 -64
  1074. package/cli/commands/memory.mjs +0 -25
  1075. package/cli/commands/minimax.mjs +0 -288
  1076. package/cli/commands/mod.mjs +0 -185
  1077. package/cli/commands/ocr.mjs +0 -182
  1078. package/cli/commands/plugin.mjs +0 -358
  1079. package/cli/commands/rca.test.mjs +0 -99
  1080. package/cli/commands/service.mjs +0 -79
  1081. package/cli/commands/setup-provider.test.mjs +0 -311
  1082. package/cli/commands/tailscale.mjs +0 -256
  1083. package/cli/commands/usage.mjs +0 -113
  1084. package/cli/commands/voice.mjs +0 -211
  1085. package/cli/commands/workspace.mjs +0 -247
  1086. package/cli/copy.mjs +0 -540
  1087. package/cli/dev-link.mjs +0 -191
  1088. package/cli/dev-link.test.mjs +0 -310
  1089. package/cli/digest.mjs +0 -149
  1090. package/cli/install/banner.test.mjs +0 -39
  1091. package/cli/install/index.test.mjs +0 -61
  1092. package/cli/install/paths.test.mjs +0 -77
  1093. package/cli/install/plugin.mjs +0 -161
  1094. package/cli/install/postinstall.mjs +0 -137
  1095. package/cli/install/postinstall.test.mjs +0 -98
  1096. package/cli/install.test.mjs +0 -272
  1097. package/cli/memory-constants.mjs +0 -76
  1098. package/cli/memory.mjs +0 -1850
  1099. package/cli/migrate.test.mjs +0 -85
  1100. package/cli/plow-through.test.mjs +0 -56
  1101. package/cli/plugin-runtime-deps.mjs +0 -250
  1102. package/cli/plugin-runtime-deps.test.mjs +0 -378
  1103. package/cli/post-install-smoke.mjs +0 -256
  1104. package/cli/post-install-smoke.test.mjs +0 -72
  1105. package/cli/prompts.mjs +0 -168
  1106. package/cli/providers-detect.mjs +0 -233
  1107. package/cli/provision.test.mjs +0 -324
  1108. package/cli/service-controller.mjs +0 -735
  1109. package/cli/service-controller.test.mjs +0 -191
  1110. package/cli/service-env.mjs +0 -130
  1111. package/cli/service.mjs +0 -492
  1112. package/cli/tests/minimax-cli.test.mjs +0 -79
  1113. package/cli/worker-dispatcher.test.mjs +0 -204
  1114. package/config/skills/glyph/SKILL.md +0 -163
  1115. package/config/skills/lightrag/SKILL.md +0 -81
  1116. package/config/skills/memory-protocol/SKILL.md +0 -105
  1117. package/config/skills/obsidian/SKILL.md +0 -306
  1118. package/packages/sdk/${HOME}/.bizar_home/memory/projects/sdk/sessions/2026-07-16-e16c2f59.md +0 -14
  1119. package/packages/sdk/.bizar/learning/instincts.jsonl +0 -5
  1120. package/packages/sdk/LICENSE +0 -21
  1121. package/packages/sdk/dist/memory/index.d.ts +0 -43
  1122. package/packages/sdk/dist/memory/index.js +0 -159
  1123. package/packages/sdk/dist/router/memory-distillation.d.ts +0 -58
  1124. package/packages/sdk/dist/router/memory-distillation.js +0 -195
  1125. package/packages/sdk/vitest.config.ts +0 -9
  1126. package/plugins/bizar/LICENSE +0 -21
  1127. package/plugins/bizar/dist/index.d.ts +0 -25
  1128. package/plugins/bizar/dist/index.js +0 -32
  1129. package/plugins/bizar/package.json +0 -18
  1130. package/scripts/audit.mjs +0 -388
  1131. package/scripts/audit.test.mjs +0 -149
  1132. package/scripts/bh-full-e2e.mjs +0 -300
  1133. package/scripts/check-agents.mjs +0 -76
  1134. package/scripts/check-arch.sh +0 -80
  1135. package/scripts/check-deps.mjs +0 -468
  1136. package/scripts/clean-state-check.sh +0 -81
  1137. package/scripts/eval-gate.mjs +0 -134
  1138. package/scripts/eval-gate.test.mjs +0 -138
  1139. package/scripts/feature-state-machine.mjs +0 -178
  1140. package/scripts/feature-state-machine.test.mjs +0 -135
  1141. package/scripts/git-hooks/__tests__/commit-msg.test.mjs +0 -61
  1142. package/scripts/install-curl.sh +0 -17
  1143. package/scripts/install-service.mjs +0 -190
  1144. package/scripts/loop-log.txt +0 -29
  1145. package/scripts/loop-tasks.md +0 -79
  1146. package/scripts/mirror-claude-md.sh +0 -78
  1147. package/scripts/overnight-loop.mjs +0 -60
  1148. package/scripts/run-dev.mjs +0 -84
  1149. package/scripts/session-trace.sh +0 -52
  1150. package/scripts/spec-dedup.test.mjs +0 -124
  1151. package/scripts/sprint.mjs +0 -213
  1152. package/scripts/sync-skills-mirror.mjs +0 -113
  1153. package/scripts/test-in-container.sh +0 -157
  1154. package/scripts/verify-feature.sh +0 -102
  1155. package/scripts/verify-thinking-skills.mjs +0 -135
  1156. package/scripts/worktree-setup.sh +0 -79
  1157. package/templates/clean-state-checklist.md +0 -55
  1158. package/templates/deploy/cloudflare/README.md +0 -32
  1159. package/templates/deploy/cloudflare/functions-index.template.js +0 -15
  1160. package/templates/deploy/cloudflare/wrangler.toml.template +0 -9
  1161. package/templates/deploy/docker/.env.template +0 -16
  1162. package/templates/deploy/docker/README.md +0 -58
  1163. package/templates/deploy/docker/docker-compose.template.yml +0 -23
  1164. package/templates/deploy/fly/README.md +0 -35
  1165. package/templates/deploy/fly/fly.toml.template +0 -28
  1166. package/templates/deploy/vercel/README.md +0 -29
  1167. package/templates/deploy/vercel/api-index.template.js +0 -18
  1168. package/templates/deploy/vercel/vercel.json.template +0 -16
  1169. package/templates/eval-fixtures/README.md +0 -58
  1170. package/templates/eval-fixtures/citation.json +0 -16
  1171. package/templates/eval-fixtures/code-review.json +0 -16
  1172. package/templates/eval-fixtures/code-search-basic.json +0 -28
  1173. package/templates/eval-fixtures/concise-output.json +0 -16
  1174. package/templates/eval-fixtures/context-window.json +0 -16
  1175. package/templates/eval-fixtures/error-recovery.json +0 -16
  1176. package/templates/eval-fixtures/json-output.json +0 -20
  1177. package/templates/eval-fixtures/latency-bounds.json +0 -16
  1178. package/templates/eval-fixtures/multi-language.json +0 -16
  1179. package/templates/eval-fixtures/regression-suite.json +0 -79
  1180. package/templates/eval-fixtures/response-format.json +0 -30
  1181. package/templates/eval-fixtures/safe-paths.json +0 -16
  1182. package/templates/eval-fixtures/tool-call-correctness.json +0 -24
  1183. package/templates/eval-fixtures/tool-call-multi-step.json +0 -18
  1184. package/templates/eval-fixtures/unicode-handling.json +0 -16
  1185. package/templates/evaluator-rubric.md +0 -50
  1186. package/templates/plan/htmx.min.js +0 -1
  1187. package/templates/plan/library/bug-investigation.mdx +0 -79
  1188. package/templates/plan/library/decision-record.mdx +0 -71
  1189. package/templates/plan/library/feature-design.mdx +0 -92
  1190. package/templates/plan/meta.json.template +0 -8
  1191. package/templates/plan/plan.mdx.template +0 -46
  1192. package/templates/plugin-template/README.md +0 -121
  1193. package/templates/plugin-template/index.js +0 -66
  1194. package/templates/plugin-template/plugin.json +0 -42
  1195. package/templates/plugin-template/tests/plugin.test.js +0 -83
  1196. package/templates/schedules/daily-backup.json +0 -12
  1197. package/templates/schedules/daily-cleanup.json +0 -12
  1198. package/templates/schedules/hourly-health-check.json +0 -12
  1199. package/templates/schedules/webhook-on-push.json +0 -13
  1200. package/templates/schedules/weekly-digest.json +0 -13
  1201. package/templates/sprint-contract.md +0 -47
  1202. /package/{.claude → config}/skills/de-sloppify/SKILL.md +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"Chip-B7ovcm01.js","sources":["../../src/web/v8/ui/data/Chip.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { X } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Chip — filter pill with an optional remove button.\n *\n * Different from Badge: Badge is a status indicator (read-only).\n * Chip is interactive — clickable for selection, removable for filters.\n */\n\nexport interface ChipProps extends HTMLAttributes<HTMLSpanElement> {\n /** Visual tone. */\n tone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger' | 'accent';\n /** When true, render with selected styling (used for filter chips). */\n selected?: boolean;\n /** When provided, render a close button that invokes this handler. */\n onRemove?: () => void;\n children: ReactNode;\n}\n\nconst TONE_BG: Record<NonNullable<ChipProps['tone']>, string> = {\n neutral: 'var(--surface-1)',\n info: 'color-mix(in oklch, var(--info) 14%, var(--surface-1))',\n success: 'color-mix(in oklch, var(--success) 14%, var(--surface-1))',\n warning: 'color-mix(in oklch, var(--warning) 14%, var(--surface-1))',\n danger: 'color-mix(in oklch, var(--danger) 14%, var(--surface-1))',\n accent: 'color-mix(in oklch, var(--accent) 14%, var(--surface-1))',\n};\n\nconst TONE_BORDER: Record<NonNullable<ChipProps['tone']>, string> = {\n neutral: 'var(--border)',\n info: 'color-mix(in oklch, var(--info) 30%, var(--border))',\n success: 'color-mix(in oklch, var(--success) 30%, var(--border))',\n warning: 'color-mix(in oklch, var(--warning) 30%, var(--border))',\n danger: 'color-mix(in oklch, var(--danger) 30%, var(--border))',\n accent: 'color-mix(in oklch, var(--accent) 30%, var(--border))',\n};\n\nexport const Chip = forwardRef<HTMLSpanElement, ChipProps>(function Chip(props, ref) {\n const { tone = 'neutral', selected, onRemove, children, className, style, ...rest } = props;\n const isInteractive = selected !== undefined || onRemove !== undefined;\n return (\n <span\n ref={ref}\n className={cx('v8-chip', `v8-chip--${tone}`, selected === true && 'is-selected', className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-1)',\n height: 24,\n padding: '0 8px',\n background: selected === true ? `color-mix(in oklch, var(--accent) 18%, var(--surface-1))` : TONE_BG[tone],\n border: '1px solid',\n borderColor: selected === true ? 'var(--accent)' : TONE_BORDER[tone],\n borderRadius: 'var(--radius-pill)',\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n color: selected === true ? 'var(--accent)' : 'var(--fg)',\n cursor: isInteractive === true ? 'pointer' : 'default',\n whiteSpace: 'nowrap',\n ...style,\n }}\n {...rest}\n >\n {children}\n {onRemove !== undefined && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label=\"Remove\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 14,\n height: 14,\n marginLeft: 2,\n marginRight: -4,\n padding: 0,\n background: 'transparent',\n border: 0,\n borderRadius: 'var(--radius-sm)',\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n }}\n >\n <X size={10} aria-hidden=\"true\" />\n </button>\n )}\n </span>\n );\n});"],"names":["TONE_BG","TONE_BORDER","Chip","forwardRef","props","ref","tone","selected","onRemove","children","className","style","rest","isInteractive","jsxs","cx","jsx","e","X"],"mappings":"4FAqBA,MAAMA,EAA0D,CAC9D,QAAS,mBACT,KAAM,yDACN,QAAS,4DACT,QAAS,4DACT,OAAQ,2DACR,OAAQ,0DACV,EAEMC,EAA8D,CAClE,QAAS,gBACT,KAAM,sDACN,QAAS,yDACT,QAAS,yDACT,OAAQ,wDACR,OAAQ,uDACV,EAEaC,EAAOC,EAAAA,WAAuC,SAAcC,EAAOC,EAAK,CACnF,KAAM,CAAE,KAAAC,EAAO,UAAW,SAAAC,EAAU,SAAAC,EAAU,SAAAC,EAAU,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASR,EAChFS,EAAgBN,IAAa,QAAaC,IAAa,OAC7D,OACEM,EAAAA,KAAC,OAAA,CACC,IAAAT,EACA,UAAWU,EAAG,UAAW,YAAYT,CAAI,GAAIC,IAAa,IAAQ,cAAeG,CAAS,EAC1F,MAAO,CACL,QAAS,cACT,WAAY,SACZ,IAAK,iBACL,OAAQ,GACR,QAAS,QACT,WAAYH,IAAa,GAAO,2DAA6DP,EAAQM,CAAI,EACzG,OAAQ,YACR,YAAaC,IAAa,GAAO,gBAAkBN,EAAYK,CAAI,EACnE,aAAc,qBACd,SAAU,eACV,WAAY,IACZ,MAAOC,IAAa,GAAO,gBAAkB,YAC7C,OAAQM,IAAkB,GAAO,UAAY,UAC7C,WAAY,SACZ,GAAGF,CAAA,EAEJ,GAAGC,EAEH,SAAA,CAAAH,EACAD,IAAa,QACZQ,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAAUC,GAAM,CACdA,EAAE,gBAAA,EACFT,EAAA,CACF,EACA,aAAW,SACX,MAAO,CACL,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,WAAY,EACZ,YAAa,GACb,QAAS,EACT,WAAY,cACZ,OAAQ,EACR,aAAc,mBACd,MAAO,kBACP,OAAQ,SAAA,EAGV,SAAAQ,EAAAA,IAACE,EAAA,CAAE,KAAM,GAAI,cAAY,MAAA,CAAO,CAAA,CAAA,CAClC,CAAA,CAAA,CAIR,CAAC"}
@@ -1 +0,0 @@
1
- import{r,j as e}from"./cmdk-C3F6LD6N.js";import{u as D,S as j,I as h,B as c,h as $,M as P,i as S,F as C,P as O}from"./main-BRmJZcHt.js";import{V as B}from"./ViewHeader-BsnaspKw.js";import{C as E,b as R}from"./Card-Clkvh43Q.js";import{I as b}from"./Input-DV-vdaV8.js";import{S as z,a as k,b as A}from"./Sheet-BwMVGN-8.js";import{E as T}from"./EmptyState-ccT__JZG.js";import{E as M}from"./ErrorState-BSqf65ka.js";import{M as N}from"./MessageBubble-CrCJ0SYG.js";import{R as F}from"./refresh-ccw-DN_zCB1h.js";import{S as V}from"./send-CaOL1yQD.js";import{P as q}from"./plus-Cps-8lcG.js";import{P as H}from"./pencil-Dkks7eIC.js";import{T as W}from"./trash-2-B_Y6HrfN.js";import"./Alert-pzFISNtS.js";import"./circle-alert-QQTU4Quz.js";import"./triangle-alert-BeY8LAv6.js";import"./circle-check-BMbe7Kkr.js";function J({sessionId:a}){var t;const p=`/api/claude-sessions/${a}/messages`,i=D(p),[u,l]=r.useState(""),[o,d]=r.useState("general"),[m,n]=r.useState(!1),[v,f]=r.useState(null),g=r.useCallback(()=>{i.refetch()},[i]),x=((t=i.data)==null?void 0:t.messages)??[],y=async()=>{const s=u.trim();if(!(!s||!o.trim()||m)){n(!0),f(null);try{await S(`/api/claude-sessions/${a}/send`,{method:"POST",body:{message:s,agent:o.trim()}}),l(""),window.setTimeout(()=>{g()},750)}catch(w){f((w instanceof C,w.message))}finally{n(!1)}}};return e.jsxs(j,{gap:3,style:{padding:"var(--space-4)"},"data-testid":`claude-session-detail-${a}`,children:[e.jsxs(h,{align:"center",justify:"between",gap:2,children:[e.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:a}),e.jsxs(c,{variant:"ghost",onClick:()=>void g(),"data-testid":`claude-session-detail-refresh-${a}`,children:[e.jsx(F,{size:14,"aria-hidden":!0})," Refresh"]})]}),e.jsx(E,{variant:"default",children:e.jsx(R,{children:i.error!=null?e.jsx(M,{error:i.error,onRetry:g,description:"Failed to load session messages."}):i.loading&&x.length===0?e.jsx($,{style:{height:120}}):x.length===0?e.jsx(T,{icon:e.jsx(P,{size:28,"aria-hidden":!0}),title:"No messages yet",description:"Send a follow-up below to start the conversation.","data-testid":`claude-session-detail-empty-${a}`}):e.jsx(j,{gap:1,children:x.map(s=>e.jsx(N,{message:s},s.id||`${s.ts}-${s.role}`))})})}),v!==null&&e.jsx("span",{role:"alert","data-testid":`claude-session-detail-error-${a}`,style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:v}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Agent"}),e.jsx(b,{value:o,"data-testid":`claude-session-detail-agent-${a}`,onChange:s=>d(s.target.value)})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Follow-up"}),e.jsx("textarea",{value:u,rows:4,"data-testid":`claude-session-detail-draft-${a}`,onChange:s=>l(s.target.value),style:{background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",color:"var(--fg)",fontFamily:"var(--font-sans)",fontSize:"var(--fs-13)",resize:"vertical"}})]}),e.jsx(h,{justify:"end",gap:2,children:e.jsxs(c,{variant:"primary",onClick:()=>void y(),disabled:m||u.trim()===""||o.trim()==="","data-testid":`claude-session-detail-send-${a}`,children:[e.jsx(V,{size:14,"aria-hidden":!0})," ",m?"Sending…":"Send"]})})]})}function ce(){var m;const a=D("/api/claude-sessions"),[p,i]=r.useState(!1),[u,l]=r.useState(null),o=((m=a.data)==null?void 0:m.sessions)??[],d=r.useCallback(()=>{a.refetch()},[a]);return e.jsxs(j,{gap:4,"data-testid":"claude-sessions-view",children:[e.jsx(B,{title:"Claude sessions",description:"Claude Code session explorer. Each row is a session directory under ~/.claude/sessions/.",actions:e.jsxs(h,{align:"center",gap:2,children:[e.jsxs(c,{variant:"ghost",onClick:()=>void d(),"data-testid":"claude-sessions-refresh",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(c,{variant:"primary",onClick:()=>i(!0),"data-testid":"claude-sessions-new",children:[e.jsx(q,{size:14,"aria-hidden":!0})," New session"]})]})}),e.jsx(E,{variant:"default",children:e.jsx(R,{children:a.loading&&o.length===0?e.jsxs(j,{gap:2,children:[e.jsx($,{style:{height:36}}),e.jsx($,{style:{height:36}})]}):o.length===0?e.jsx(T,{icon:e.jsx(O,{size:28,"aria-hidden":!0}),title:"No Claude sessions",description:"Create one to start a multi-turn conversation with Claude Code."}):e.jsx(j,{gap:2,children:o.map(n=>e.jsx(L,{session:n,onRefresh:d,onOpen:l},n.id))})})}),e.jsx(z,{open:p,onOpenChange:i,children:e.jsx(k,{side:"right",title:"New Claude session",description:"Spawn a Claude Code session via the runner.",children:e.jsx(G,{onCreated:n=>{i(!1),d(),l(n)},onCancel:()=>i(!1)})})}),e.jsx(z,{open:u!==null,onOpenChange:n=>{n||l(null)},children:e.jsx(k,{side:"right",title:"Session detail",description:u??"",children:u!==null&&e.jsx(J,{sessionId:u})})})]})}function L({session:a,onRefresh:p,onOpen:i}){const[u,l]=r.useState(!1),[o,d]=r.useState(a.title??""),[m,n]=r.useState(!1),[v,f]=r.useState(null),g=async()=>{if(o.trim()){f(null);try{await S(`/api/claude-sessions/${a.id}`,{method:"PATCH",body:{title:o.trim()}}),l(!1),p()}catch(t){f((t instanceof C,t.message))}}},x=async t=>{f(null);try{await S(`/api/claude-sessions/${t}/resume`,{method:"POST",body:{}})}catch(s){f((s instanceof C,s.message))}},y=async()=>{f(null);try{await S(`/api/claude-sessions/${a.id}`,{method:"DELETE"}),n(!1),p()}catch(t){f((t instanceof C,t.message))}};return e.jsxs("div",{"data-testid":`claude-session-row-${a.id}`,style:{padding:"var(--space-3)",borderRadius:"var(--radius-md)",border:"1px solid var(--border)",background:"var(--surface-0)"},children:[e.jsxs(h,{align:"center",justify:"between",gap:3,children:[e.jsxs(j,{gap:1,style:{minWidth:0,flex:1},children:[u?e.jsxs(h,{gap:1,children:[e.jsx(b,{value:o,"data-testid":`claude-session-rename-input-${a.id}`,onChange:t=>d(t.target.value)}),e.jsx(c,{variant:"primary",onClick:()=>void g(),"data-testid":`claude-session-rename-submit-${a.id}`,children:"Save"}),e.jsx(c,{variant:"ghost",onClick:()=>{l(!1),d(a.title??"")},children:"Cancel"})]}):e.jsxs(h,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:a.title||a.id}),a.agent&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontFamily:"var(--font-mono)"},children:["@",a.agent]})]}),e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.id}),v!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:v})]}),e.jsxs(h,{gap:1,children:[e.jsx(c,{variant:"primary",onClick:()=>void x(a.id),"data-testid":`claude-session-resume-${a.id}`,"aria-label":`Resume ${a.id}`,children:"Resume"}),e.jsx(c,{variant:"ghost",onClick:()=>i(a.id),"data-testid":`claude-session-open-${a.id}`,children:"Open"}),e.jsx(c,{variant:"ghost",onClick:()=>{l(!0),d(a.title??"")},"data-testid":`claude-session-rename-${a.id}`,"aria-label":`Rename session ${a.id}`,children:e.jsx(H,{size:14,"aria-hidden":!0})}),e.jsx(c,{variant:"ghost",onClick:()=>n(t=>!t),"data-testid":`claude-session-delete-${a.id}`,"aria-label":`Delete session ${a.id}`,children:e.jsx(W,{size:14,"aria-hidden":!0})})]})]}),m&&e.jsxs(h,{gap:1,style:{marginTop:"var(--space-2)"},children:[e.jsx(c,{variant:"danger",onClick:()=>void y(),"data-testid":`claude-session-confirm-delete-${a.id}`,children:"Confirm delete"}),e.jsx(c,{variant:"ghost",onClick:()=>n(!1),"data-testid":`claude-session-cancel-delete-${a.id}`,children:"Cancel"})]})]})}function G({onCreated:a,onCancel:p}){const[i,u]=r.useState(""),[l,o]=r.useState("general"),[d,m]=r.useState(""),[n,v]=r.useState(""),[f,g]=r.useState(!1),[x,y]=r.useState(null),t=async()=>{if(!(!l.trim()||!d.trim()||f)){g(!0),y(null);try{const s=await S("/api/claude-sessions/new",{method:"POST",body:{title:i.trim()||null,agent:l.trim(),prompt:d.trim(),directory:n.trim()||void 0}});a(s.id)}catch(s){y((s instanceof C,s.message))}finally{g(!1)}}};return e.jsxs(j,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title (optional)"}),e.jsx(b,{value:i,"data-testid":"claude-sessions-new-title",onChange:s=>u(s.target.value)})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Agent"}),e.jsx(b,{value:l,"data-testid":"claude-sessions-new-agent",onChange:s=>o(s.target.value)})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Seed prompt"}),e.jsx("textarea",{value:d,rows:4,"data-testid":"claude-sessions-new-prompt",onChange:s=>m(s.target.value),style:{background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",color:"var(--fg)",fontFamily:"var(--font-sans)",fontSize:"var(--fs-13)",resize:"vertical"}})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Working directory (optional)"}),e.jsx(b,{value:n,"data-testid":"claude-sessions-new-directory",onChange:s=>v(s.target.value)})]}),x!==null&&e.jsx("span",{role:"alert","data-testid":"claude-sessions-new-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x}),e.jsxs(h,{justify:"end",gap:2,children:[e.jsx(A,{asChild:!0,children:e.jsx(c,{variant:"ghost",onClick:p,"data-testid":"claude-sessions-new-cancel",children:"Cancel"})}),e.jsx(c,{variant:"primary",onClick:()=>void t(),disabled:f||!l.trim()||!d.trim(),"data-testid":"claude-sessions-new-submit",children:"Create"})]})]})}export{ce as ClaudeSessionsView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"ClaudeSessionsView-BoZS5ldi.js","sources":["../../src/web/v8/views/ClaudeSessions/ClaudeSessionDetail.tsx","../../src/web/v8/views/ClaudeSessions/ClaudeSessionsView.tsx"],"sourcesContent":["/**\n * v8/views/ClaudeSessions/ClaudeSessionDetail.tsx — Sprint S39, v9.3.0.\n *\n * Right-pane content for the ClaudeSessionSheet. Pulls messages\n * from /api/claude-sessions/:id/messages, lets the user send a\n * follow-up via /api/claude-sessions/:id/send. No streaming in\n * this initial cut — the server's SSE endpoint\n * (/api/claude-sessions/:id/stream) is read by the SDK in\n * production, but for the dashboard we treat send as fire-and-\n * refresh so the user sees the new turn after the resume exits.\n */\n\nimport { useCallback, useState } from 'react';\nimport { Send, RefreshCcw, MessageSquare } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { ChatMessage } from '../../data/types.js';\nimport { MessageBubble } from '../../ui/chat/MessageBubble.js';\n\ninterface MessagesPayload {\n messages: ChatMessage[];\n}\n\nexport function ClaudeSessionDetail({ sessionId }: { sessionId: string }): JSX.Element {\n const url = `/api/claude-sessions/${sessionId}/messages`;\n const payload = useFetch<MessagesPayload>(url);\n const [draft, setDraft] = useState<string>('');\n const [agent, setAgent] = useState<string>('general');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n const messages = payload.data?.messages ?? [];\n\n const send = async (): Promise<void> => {\n const text = draft.trim();\n if (!text || !agent.trim() || busy) return;\n setBusy(true);\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${sessionId}/send`, {\n method: 'POST',\n body: { message: text, agent: agent.trim() },\n });\n setDraft('');\n // The resume spawn is asynchronous; give it a moment then refresh.\n window.setTimeout(() => { refresh(); }, 750);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }} data-testid={`claude-session-detail-${sessionId}`}>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{sessionId}</strong>\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid={`claude-session-detail-refresh-${sessionId}`}>\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n\n <Card variant=\"default\">\n <CardBody>\n {payload.error != null ? (\n <ErrorState\n error={payload.error}\n onRetry={refresh}\n description=\"Failed to load session messages.\"\n />\n ) : payload.loading && messages.length === 0 ? (\n <Skeleton style={{ height: 120 }} />\n ) : messages.length === 0 ? (\n <EmptyState\n icon={<MessageSquare size={28} aria-hidden />}\n title=\"No messages yet\"\n description=\"Send a follow-up below to start the conversation.\"\n data-testid={`claude-session-detail-empty-${sessionId}`}\n />\n ) : (\n <Stack gap={1}>\n {messages.map((m) => (\n <MessageBubble key={m.id || `${m.ts}-${m.role}`} message={m} />\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n {error !== null && (\n <span role=\"alert\" data-testid={`claude-session-detail-error-${sessionId}`} style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Agent</span>\n <Input\n value={agent}\n data-testid={`claude-session-detail-agent-${sessionId}`}\n onChange={(e) => setAgent((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Follow-up</span>\n <textarea\n value={draft}\n rows={4}\n data-testid={`claude-session-detail-draft-${sessionId}`}\n onChange={(e) => setDraft((e.target as HTMLTextAreaElement).value)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-13)',\n resize: 'vertical',\n }}\n />\n </label>\n <Inline justify=\"end\" gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => void send()}\n disabled={busy || draft.trim() === '' || agent.trim() === ''}\n data-testid={`claude-session-detail-send-${sessionId}`}\n >\n <Send size={14} aria-hidden /> {busy ? 'Sending…' : 'Send'}\n </Button>\n </Inline>\n </Stack>\n );\n}","/**\n * v8/views/ClaudeSessions/ClaudeSessionsView.tsx — Sprint S39, v9.3.0.\n *\n * Claude Code session explorer. Lists sessions on disk (via\n * /api/claude-sessions), lets the user create a new one via Sheet\n * (POST /api/claude-sessions/new), inline-rename (PATCH\n * /api/claude-sessions/:id), inline-confirm delete (DELETE\n * /api/claude-sessions/:id), and opens a right Drawer with the\n * session detail (ClaudeSessionDetail).\n */\n\nimport { useCallback, useState } from 'react';\nimport { Plus, Trash2, Pencil, RefreshCcw, MessageSquareText } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Sheet, SheetClose, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { ClaudeSession } from '../../data/types.js';\nimport { ClaudeSessionDetail } from './ClaudeSessionDetail.js';\n\ninterface SessionsPayload {\n sessions: ClaudeSession[];\n}\n\nexport function ClaudeSessionsView(): JSX.Element {\n const payload = useFetch<SessionsPayload>('/api/claude-sessions');\n const [creating, setCreating] = useState<boolean>(false);\n const [detailId, setDetailId] = useState<string | null>(null);\n\n const sessions = payload.data?.sessions ?? [];\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n return (\n <Stack gap={4} data-testid=\"claude-sessions-view\">\n <ViewHeader\n title=\"Claude sessions\"\n description=\"Claude Code session explorer. Each row is a session directory under ~/.claude/sessions/.\"\n actions={\n <Inline align=\"center\" gap={2}>\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"claude-sessions-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setCreating(true)} data-testid=\"claude-sessions-new\">\n <Plus size={14} aria-hidden /> New session\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && sessions.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 36 }} />\n <Skeleton style={{ height: 36 }} />\n </Stack>\n ) : sessions.length === 0 ? (\n <EmptyState\n icon={<MessageSquareText size={28} aria-hidden />}\n title=\"No Claude sessions\"\n description=\"Create one to start a multi-turn conversation with Claude Code.\"\n />\n ) : (\n <Stack gap={2}>\n {sessions.map((s) => (\n <SessionRow key={s.id} session={s} onRefresh={refresh} onOpen={setDetailId} />\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={creating} onOpenChange={setCreating}>\n <SheetContent side=\"right\" title=\"New Claude session\" description=\"Spawn a Claude Code session via the runner.\">\n <NewSessionForm\n onCreated={(id) => {\n setCreating(false);\n refresh();\n setDetailId(id);\n }}\n onCancel={() => setCreating(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={detailId !== null} onOpenChange={(open) => { if (!open) setDetailId(null); }}>\n <SheetContent side=\"right\" title=\"Session detail\" description={detailId ?? ''}>\n {detailId !== null && <ClaudeSessionDetail sessionId={detailId} />}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction SessionRow({\n session,\n onRefresh,\n onOpen,\n}: {\n session: ClaudeSession;\n onRefresh: () => void;\n onOpen: (id: string) => void;\n}): JSX.Element {\n const [renaming, setRenaming] = useState<boolean>(false);\n const [title, setTitle] = useState<string>(session.title ?? '');\n const [confirmDelete, setConfirmDelete] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const rename = async (): Promise<void> => {\n if (!title.trim()) return;\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${session.id}`, {\n method: 'PATCH',\n body: { title: title.trim() },\n });\n setRenaming(false);\n onRefresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const resume = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${id}/resume`, { method: 'POST', body: {} });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const remove = async (): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${session.id}`, { method: 'DELETE' });\n setConfirmDelete(false);\n onRefresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <div\n data-testid={`claude-session-row-${session.id}`}\n style={{\n padding: 'var(--space-3)',\n borderRadius: 'var(--radius-md)',\n border: '1px solid var(--border)',\n background: 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ minWidth: 0, flex: 1 }}>\n {renaming ? (\n <Inline gap={1}>\n <Input\n value={title}\n data-testid={`claude-session-rename-input-${session.id}`}\n onChange={(e) => setTitle((e.target as HTMLInputElement).value)}\n />\n <Button variant=\"primary\" onClick={() => void rename()} data-testid={`claude-session-rename-submit-${session.id}`}>Save</Button>\n <Button variant=\"ghost\" onClick={() => { setRenaming(false); setTitle(session.title ?? ''); }}>Cancel</Button>\n </Inline>\n ) : (\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>{session.title || session.id}</strong>\n {session.agent && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontFamily: 'var(--font-mono)' }}>\n @{session.agent}\n </span>\n )}\n </Inline>\n )}\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {session.id}\n </span>\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n </Stack>\n <Inline gap={1}>\n <Button variant=\"primary\" onClick={() => void resume(session.id)} data-testid={`claude-session-resume-${session.id}`} aria-label={`Resume ${session.id}`}>\n Resume\n </Button>\n <Button variant=\"ghost\" onClick={() => onOpen(session.id)} data-testid={`claude-session-open-${session.id}`}>\n Open\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => { setRenaming(true); setTitle(session.title ?? ''); }}\n data-testid={`claude-session-rename-${session.id}`}\n aria-label={`Rename session ${session.id}`}\n >\n <Pencil size={14} aria-hidden />\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmDelete((cur) => !cur)}\n data-testid={`claude-session-delete-${session.id}`}\n aria-label={`Delete session ${session.id}`}\n >\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {confirmDelete && (\n <Inline gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Button variant=\"danger\" onClick={() => void remove()} data-testid={`claude-session-confirm-delete-${session.id}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(false)} data-testid={`claude-session-cancel-delete-${session.id}`}>\n Cancel\n </Button>\n </Inline>\n )}\n </div>\n );\n}\n\nfunction NewSessionForm({\n onCreated,\n onCancel,\n}: {\n onCreated: (id: string) => void;\n onCancel: () => void;\n}): JSX.Element {\n const [title, setTitle] = useState<string>('');\n const [agent, setAgent] = useState<string>('general');\n const [prompt, setPrompt] = useState<string>('');\n const [directory, setDirectory] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = async (): Promise<void> => {\n if (!agent.trim() || !prompt.trim() || busy) return;\n setBusy(true);\n setError(null);\n try {\n const res = await fetchJson<{ id: string }>('/api/claude-sessions/new', {\n method: 'POST',\n body: {\n title: title.trim() || null,\n agent: agent.trim(),\n prompt: prompt.trim(),\n directory: directory.trim() || undefined,\n },\n });\n onCreated(res.id);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title (optional)</span>\n <Input\n value={title}\n data-testid=\"claude-sessions-new-title\"\n onChange={(e) => setTitle((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Agent</span>\n <Input\n value={agent}\n data-testid=\"claude-sessions-new-agent\"\n onChange={(e) => setAgent((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Seed prompt</span>\n <textarea\n value={prompt}\n rows={4}\n data-testid=\"claude-sessions-new-prompt\"\n onChange={(e) => setPrompt((e.target as HTMLTextAreaElement).value)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-13)',\n resize: 'vertical',\n }}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Working directory (optional)</span>\n <Input\n value={directory}\n data-testid=\"claude-sessions-new-directory\"\n onChange={(e) => setDirectory((e.target as HTMLInputElement).value)}\n />\n </label>\n {error !== null && (\n <span role=\"alert\" data-testid=\"claude-sessions-new-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Inline justify=\"end\" gap={2}>\n <SheetClose asChild>\n <Button variant=\"ghost\" onClick={onCancel} data-testid=\"claude-sessions-new-cancel\">Cancel</Button>\n </SheetClose>\n <Button\n variant=\"primary\"\n onClick={() => void submit()}\n disabled={busy || !agent.trim() || !prompt.trim()}\n data-testid=\"claude-sessions-new-submit\"\n >\n Create\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["ClaudeSessionDetail","sessionId","url","payload","useFetch","draft","setDraft","useState","agent","setAgent","busy","setBusy","error","setError","refresh","useCallback","messages","_a","send","text","fetchJson","err","FetchError","jsxs","Stack","Inline","jsx","Button","RefreshCcw","Card","CardBody","ErrorState","Skeleton","EmptyState","MessageSquare","m","MessageBubble","Input","e","Send","ClaudeSessionsView","creating","setCreating","detailId","setDetailId","sessions","ViewHeader","Plus","MessageSquareText","s","SessionRow","Sheet","SheetContent","NewSessionForm","id","open","session","onRefresh","onOpen","renaming","setRenaming","title","setTitle","confirmDelete","setConfirmDelete","rename","resume","remove","Pencil","cur","Trash2","onCreated","onCancel","prompt","setPrompt","directory","setDirectory","submit","res","SheetClose"],"mappings":"iyBA+BO,SAASA,EAAoB,CAAE,UAAAC,GAAiD,OACrF,MAAMC,EAAM,wBAAwBD,CAAS,YACvCE,EAAUC,EAA0BF,CAAG,EACvC,CAACG,EAAOC,CAAQ,EAAIC,EAAAA,SAAiB,EAAE,EACvC,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAiB,SAAS,EAC9C,CAACG,EAAMC,CAAO,EAAIJ,EAAAA,SAAkB,EAAK,EACzC,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAwB,IAAI,EAEhDO,EAAUC,EAAAA,YAAY,IAAM,CAAOZ,EAAQ,QAAA,CAAW,EAAG,CAACA,CAAO,CAAC,EAClEa,IAAWC,EAAAd,EAAQ,OAAR,YAAAc,EAAc,WAAY,CAAA,EAErCC,EAAO,SAA2B,CACtC,MAAMC,EAAOd,EAAM,KAAA,EACnB,GAAI,GAACc,GAAQ,CAACX,EAAM,KAAA,GAAUE,GAC9B,CAAAC,EAAQ,EAAI,EACZE,EAAS,IAAI,EACb,GAAI,CACF,MAAMO,EAAU,wBAAwBnB,CAAS,QAAS,CACxD,OAAQ,OACR,KAAM,CAAE,QAASkB,EAAM,MAAOX,EAAM,MAAK,CAAE,CAC5C,EACDF,EAAS,EAAE,EAEX,OAAO,WAAW,IAAM,CAAEQ,EAAA,CAAW,EAAG,GAAG,CAC7C,OAASO,EAAK,CACZR,GAASQ,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,QAAA,CACEV,EAAQ,EAAK,CACf,EACF,EAEA,OACEY,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,MAAO,CAAE,QAAS,gBAAA,EAAoB,cAAa,yBAAyBvB,CAAS,GAClG,SAAA,CAAAsB,OAACE,GAAO,MAAM,SAAS,QAAQ,UAAU,IAAK,EAC5C,SAAA,CAAAC,EAAAA,IAAC,SAAA,CAAO,MAAO,CAAE,WAAY,mBAAoB,SAAU,cAAA,EAAmB,SAAAzB,CAAA,CAAU,EACxFsB,EAAAA,KAACI,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAM,KAAKb,EAAA,EAAW,cAAa,iCAAiCb,CAAS,GAC5G,SAAA,CAAAyB,EAAAA,IAACE,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,UAAA,CAAA,CACtC,CAAA,EACF,EAEAF,EAAAA,IAACG,GAAK,QAAQ,UACZ,eAACC,EAAA,CACE,SAAA3B,EAAQ,OAAS,KAChBuB,EAAAA,IAACK,EAAA,CACC,MAAO5B,EAAQ,MACf,QAASW,EACT,YAAY,kCAAA,CAAA,EAEZX,EAAQ,SAAWa,EAAS,SAAW,EACzCU,EAAAA,IAACM,EAAA,CAAS,MAAO,CAAE,OAAQ,IAAI,CAAG,EAChChB,EAAS,SAAW,EACtBU,EAAAA,IAACO,EAAA,CACC,KAAMP,EAAAA,IAACQ,EAAA,CAAc,KAAM,GAAI,cAAW,GAAC,EAC3C,MAAM,kBACN,YAAY,oDACZ,cAAa,+BAA+BjC,CAAS,EAAA,CAAA,EAGvDyB,EAAAA,IAACF,EAAA,CAAM,IAAK,EACT,WAAS,IAAKW,GACbT,MAACU,EAAA,CAAgD,QAASD,GAAtCA,EAAE,IAAM,GAAGA,EAAE,EAAE,IAAIA,EAAE,IAAI,EAAgB,CAC9D,CAAA,CACH,CAAA,CAEJ,CAAA,CACF,EAECvB,IAAU,MACTc,EAAAA,IAAC,OAAA,CAAK,KAAK,QAAQ,cAAa,+BAA+BzB,CAAS,GAAI,MAAO,CAAE,MAAO,gBAAiB,SAAU,cAAA,EACpH,SAAAW,EACH,EAGFW,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,OAAA,CAAK,EAC1EA,EAAAA,IAACW,EAAA,CACC,MAAO7B,EACP,cAAa,+BAA+BP,CAAS,GACrD,SAAWqC,GAAM7B,EAAU6B,EAAE,OAA4B,KAAK,CAAA,CAAA,CAChE,EACF,EACAf,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,WAAA,CAAS,EAC9EA,EAAAA,IAAC,WAAA,CACC,MAAOrB,EACP,KAAM,EACN,cAAa,+BAA+BJ,CAAS,GACrD,SAAWqC,GAAMhC,EAAUgC,EAAE,OAA+B,KAAK,EACjE,MAAO,CACL,WAAY,mBACZ,OAAQ,0BACR,aAAc,mBACd,QAAS,iBACT,MAAO,YACP,WAAY,mBACZ,SAAU,eACV,OAAQ,UAAA,CACV,CAAA,CACF,EACF,EACAZ,EAAAA,IAACD,EAAA,CAAO,QAAQ,MAAM,IAAK,EACzB,SAAAF,EAAAA,KAACI,EAAA,CACC,QAAQ,UACR,QAAS,IAAM,KAAKT,EAAA,EACpB,SAAUR,GAAQL,EAAM,KAAA,IAAW,IAAMG,EAAM,SAAW,GAC1D,cAAa,8BAA8BP,CAAS,GAEpD,SAAA,CAAAyB,EAAAA,IAACa,EAAA,CAAK,KAAM,GAAI,cAAW,GAAC,EAAE,IAAE7B,EAAO,WAAa,MAAA,CAAA,CAAA,CACtD,CACF,CAAA,EACF,CAEJ,CChHO,SAAS8B,IAAkC,OAChD,MAAMrC,EAAUC,EAA0B,sBAAsB,EAC1D,CAACqC,EAAUC,CAAW,EAAInC,EAAAA,SAAkB,EAAK,EACjD,CAACoC,EAAUC,CAAW,EAAIrC,EAAAA,SAAwB,IAAI,EAEtDsC,IAAW5B,EAAAd,EAAQ,OAAR,YAAAc,EAAc,WAAY,CAAA,EAErCH,EAAUC,EAAAA,YAAY,IAAM,CAAOZ,EAAQ,QAAA,CAAW,EAAG,CAACA,CAAO,CAAC,EAExE,OACEoB,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,cAAY,uBACzB,SAAA,CAAAE,EAAAA,IAACoB,EAAA,CACC,MAAM,kBACN,YAAY,2FACZ,QACEvB,EAAAA,KAACE,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAF,EAAAA,KAACI,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAM,KAAKb,EAAA,EAAW,cAAY,0BACjE,SAAA,CAAAY,EAAAA,IAACE,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,UAAA,EACtC,EACAL,EAAAA,KAACI,EAAA,CAAO,QAAQ,UAAU,QAAS,IAAMe,EAAY,EAAI,EAAG,cAAY,sBACtE,SAAA,CAAAhB,EAAAA,IAACqB,EAAA,CAAK,KAAM,GAAI,cAAW,GAAC,EAAE,cAAA,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CAAA,EAIJrB,MAACG,EAAA,CAAK,QAAQ,UACZ,eAACC,EAAA,CACE,SAAA3B,EAAQ,SAAW0C,EAAS,SAAW,EACtCtB,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAE,EAAAA,IAACM,EAAA,CAAS,MAAO,CAAE,OAAQ,IAAM,QAChCA,EAAA,CAAS,MAAO,CAAE,OAAQ,GAAG,CAAG,CAAA,CAAA,CACnC,EACEa,EAAS,SAAW,EACtBnB,EAAAA,IAACO,EAAA,CACC,KAAMP,EAAAA,IAACsB,EAAA,CAAkB,KAAM,GAAI,cAAW,GAAC,EAC/C,MAAM,qBACN,YAAY,iEAAA,CAAA,QAGbxB,EAAA,CAAM,IAAK,EACT,SAAAqB,EAAS,IAAKI,GACbvB,EAAAA,IAACwB,EAAA,CAAsB,QAASD,EAAG,UAAWnC,EAAS,OAAQ8B,CAAA,EAA9CK,EAAE,EAAyD,CAC7E,EACH,CAAA,CAEJ,CAAA,CACF,EAEAvB,EAAAA,IAACyB,EAAA,CAAM,KAAMV,EAAU,aAAcC,EACnC,SAAAhB,EAAAA,IAAC0B,EAAA,CAAa,KAAK,QAAQ,MAAM,qBAAqB,YAAY,8CAChE,SAAA1B,EAAAA,IAAC2B,EAAA,CACC,UAAYC,GAAO,CACjBZ,EAAY,EAAK,EACjB5B,EAAA,EACA8B,EAAYU,CAAE,CAChB,EACA,SAAU,IAAMZ,EAAY,EAAK,CAAA,CAAA,EAErC,CAAA,CACF,QAECS,EAAA,CAAM,KAAMR,IAAa,KAAM,aAAeY,GAAS,CAAOA,GAAMX,EAAY,IAAI,CAAG,EACtF,SAAAlB,EAAAA,IAAC0B,EAAA,CAAa,KAAK,QAAQ,MAAM,iBAAiB,YAAaT,GAAY,GACxE,aAAa,MAAQjB,EAAAA,IAAC1B,GAAoB,UAAW2C,EAAU,EAClE,CAAA,CACF,CAAA,EACF,CAEJ,CAEA,SAASO,EAAW,CAClB,QAAAM,EACA,UAAAC,EACA,OAAAC,CACF,EAIgB,CACd,KAAM,CAACC,EAAUC,CAAW,EAAIrD,EAAAA,SAAkB,EAAK,EACjD,CAACsD,EAAOC,CAAQ,EAAIvD,EAAAA,SAAiBiD,EAAQ,OAAS,EAAE,EACxD,CAACO,EAAeC,CAAgB,EAAIzD,EAAAA,SAAkB,EAAK,EAC3D,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAwB,IAAI,EAEhD0D,EAAS,SAA2B,CACxC,GAAKJ,EAAM,OACX,CAAAhD,EAAS,IAAI,EACb,GAAI,CACF,MAAMO,EAAU,wBAAwBoC,EAAQ,EAAE,GAAI,CACpD,OAAQ,QACR,KAAM,CAAE,MAAOK,EAAM,MAAK,CAAE,CAC7B,EACDD,EAAY,EAAK,EACjBH,EAAA,CACF,OAASpC,EAAK,CACZR,GAASQ,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,EACF,EAEM6C,EAAS,MAAOZ,GAA8B,CAClDzC,EAAS,IAAI,EACb,GAAI,CACF,MAAMO,EAAU,wBAAwBkC,CAAE,UAAW,CAAE,OAAQ,OAAQ,KAAM,CAAA,EAAI,CACnF,OAASjC,EAAK,CACZR,GAASQ,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,CACF,EAEM8C,EAAS,SAA2B,CACxCtD,EAAS,IAAI,EACb,GAAI,CACF,MAAMO,EAAU,wBAAwBoC,EAAQ,EAAE,GAAI,CAAE,OAAQ,SAAU,EAC1EQ,EAAiB,EAAK,EACtBP,EAAA,CACF,OAASpC,EAAK,CACZR,GAASQ,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,CACF,EAEA,OACEE,EAAAA,KAAC,MAAA,CACC,cAAa,sBAAsBiC,EAAQ,EAAE,GAC7C,MAAO,CACL,QAAS,iBACT,aAAc,mBACd,OAAQ,0BACR,WAAY,kBAAA,EAGd,SAAA,CAAAjC,OAACE,GAAO,MAAM,SAAS,QAAQ,UAAU,IAAK,EAC5C,SAAA,CAAAF,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,MAAO,CAAE,SAAU,EAAG,KAAM,CAAA,EACxC,SAAA,CAAAmC,EACCpC,EAAAA,KAACE,EAAA,CAAO,IAAK,EACX,SAAA,CAAAC,EAAAA,IAACW,EAAA,CACC,MAAOwB,EACP,cAAa,+BAA+BL,EAAQ,EAAE,GACtD,SAAWlB,GAAMwB,EAAUxB,EAAE,OAA4B,KAAK,CAAA,CAAA,EAEhEZ,EAAAA,IAACC,EAAA,CAAO,QAAQ,UAAU,QAAS,IAAM,KAAKsC,EAAA,EAAU,cAAa,gCAAgCT,EAAQ,EAAE,GAAI,SAAA,OAAI,EACvH9B,EAAAA,IAACC,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAM,CAAEiC,EAAY,EAAK,EAAGE,EAASN,EAAQ,OAAS,EAAE,CAAG,EAAG,SAAA,QAAA,CAAM,CAAA,EACvG,EAEAjC,EAAAA,KAACE,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAC,EAAAA,IAAC,SAAA,CAAO,MAAO,CAAE,SAAU,gBAAmB,SAAA8B,EAAQ,OAASA,EAAQ,EAAA,CAAG,EACzEA,EAAQ,OACPjC,EAAAA,KAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAmB,WAAY,kBAAA,EAAsB,SAAA,CAAA,IACjGiC,EAAQ,KAAA,CAAA,CACZ,CAAA,EAEJ,EAEF9B,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,WAAY,mBAAoB,SAAU,eAAgB,MAAO,iBAAA,EAC7E,SAAA8B,EAAQ,EAAA,CACX,EACC5C,IAAU,MACTc,EAAAA,IAAC,OAAA,CAAK,KAAK,QAAQ,MAAO,CAAE,MAAO,gBAAiB,SAAU,cAAA,EAAmB,SAAAd,CAAA,CAAM,CAAA,EAE3F,EACAW,EAAAA,KAACE,EAAA,CAAO,IAAK,EACX,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAO,QAAQ,UAAU,QAAS,IAAM,KAAKuC,EAAOV,EAAQ,EAAE,EAAG,cAAa,yBAAyBA,EAAQ,EAAE,GAAI,aAAY,UAAUA,EAAQ,EAAE,GAAI,SAAA,QAAA,CAE1J,EACA9B,EAAAA,IAACC,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAM+B,EAAOF,EAAQ,EAAE,EAAG,cAAa,uBAAuBA,EAAQ,EAAE,GAAI,SAAA,OAE7G,EACA9B,EAAAA,IAACC,EAAA,CACC,QAAQ,QACR,QAAS,IAAM,CAAEiC,EAAY,EAAI,EAAGE,EAASN,EAAQ,OAAS,EAAE,CAAG,EACnE,cAAa,yBAAyBA,EAAQ,EAAE,GAChD,aAAY,kBAAkBA,EAAQ,EAAE,GAExC,SAAA9B,EAAAA,IAAC0C,EAAA,CAAO,KAAM,GAAI,cAAW,EAAA,CAAC,CAAA,CAAA,EAEhC1C,EAAAA,IAACC,EAAA,CACC,QAAQ,QACR,QAAS,IAAMqC,EAAkBK,GAAQ,CAACA,CAAG,EAC7C,cAAa,yBAAyBb,EAAQ,EAAE,GAChD,aAAY,kBAAkBA,EAAQ,EAAE,GAExC,SAAA9B,EAAAA,IAAC4C,EAAA,CAAO,KAAM,GAAI,cAAW,EAAA,CAAC,CAAA,CAAA,CAChC,CAAA,CACF,CAAA,EACF,EACCP,UACEtC,EAAA,CAAO,IAAK,EAAG,MAAO,CAAE,UAAW,gBAAA,EAClC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAO,QAAQ,SAAS,QAAS,IAAM,KAAKwC,EAAA,EAAU,cAAa,iCAAiCX,EAAQ,EAAE,GAAI,SAAA,iBAEnH,EACA9B,EAAAA,IAACC,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAMqC,EAAiB,EAAK,EAAG,cAAa,gCAAgCR,EAAQ,EAAE,GAAI,SAAA,QAAA,CAE3H,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAIR,CAEA,SAASH,EAAe,CACtB,UAAAkB,EACA,SAAAC,CACF,EAGgB,CACd,KAAM,CAACX,EAAOC,CAAQ,EAAIvD,EAAAA,SAAiB,EAAE,EACvC,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAiB,SAAS,EAC9C,CAACkE,EAAQC,CAAS,EAAInE,EAAAA,SAAiB,EAAE,EACzC,CAACoE,EAAWC,CAAY,EAAIrE,EAAAA,SAAiB,EAAE,EAC/C,CAACG,EAAMC,CAAO,EAAIJ,EAAAA,SAAkB,EAAK,EACzC,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAwB,IAAI,EAEhDsE,EAAS,SAA2B,CACxC,GAAI,GAACrE,EAAM,KAAA,GAAU,CAACiE,EAAO,KAAA,GAAU/D,GACvC,CAAAC,EAAQ,EAAI,EACZE,EAAS,IAAI,EACb,GAAI,CACF,MAAMiE,EAAM,MAAM1D,EAA0B,2BAA4B,CACtE,OAAQ,OACR,KAAM,CACJ,MAAOyC,EAAM,KAAA,GAAU,KACvB,MAAOrD,EAAM,KAAA,EACb,OAAQiE,EAAO,KAAA,EACf,UAAWE,EAAU,KAAA,GAAU,MAAA,CACjC,CACD,EACDJ,EAAUO,EAAI,EAAE,CAClB,OAASzD,EAAK,CACZR,GAASQ,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,QAAA,CACEV,EAAQ,EAAK,CACf,EACF,EAEA,OACEY,EAAAA,KAACC,GAAM,IAAK,EAAG,MAAO,CAAE,QAAS,kBAC/B,SAAA,CAAAD,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,kBAAA,CAAgB,EACrFA,EAAAA,IAACW,EAAA,CACC,MAAOwB,EACP,cAAY,4BACZ,SAAWvB,GAAMwB,EAAUxB,EAAE,OAA4B,KAAK,CAAA,CAAA,CAChE,EACF,EACAf,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,OAAA,CAAK,EAC1EA,EAAAA,IAACW,EAAA,CACC,MAAO7B,EACP,cAAY,4BACZ,SAAW8B,GAAM7B,EAAU6B,EAAE,OAA4B,KAAK,CAAA,CAAA,CAChE,EACF,EACAf,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,aAAA,CAAW,EAChFA,EAAAA,IAAC,WAAA,CACC,MAAO+C,EACP,KAAM,EACN,cAAY,6BACZ,SAAWnC,GAAMoC,EAAWpC,EAAE,OAA+B,KAAK,EAClE,MAAO,CACL,WAAY,mBACZ,OAAQ,0BACR,aAAc,mBACd,QAAS,iBACT,MAAO,YACP,WAAY,mBACZ,SAAU,eACV,OAAQ,UAAA,CACV,CAAA,CACF,EACF,EACAf,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,8BAAA,CAA4B,EACjGA,EAAAA,IAACW,EAAA,CACC,MAAOsC,EACP,cAAY,gCACZ,SAAWrC,GAAMsC,EAActC,EAAE,OAA4B,KAAK,CAAA,CAAA,CACpE,EACF,EACC1B,IAAU,MACTc,MAAC,OAAA,CAAK,KAAK,QAAQ,cAAY,4BAA4B,MAAO,CAAE,MAAO,gBAAiB,SAAU,gBACnG,SAAAd,EACH,EAEFW,EAAAA,KAACE,EAAA,CAAO,QAAQ,MAAM,IAAK,EACzB,SAAA,CAAAC,EAAAA,IAACqD,EAAA,CAAW,QAAO,GACjB,SAAArD,EAAAA,IAACC,EAAA,CAAO,QAAQ,QAAQ,QAAS6C,EAAU,cAAY,6BAA6B,SAAA,QAAA,CAAM,EAC5F,EACA9C,EAAAA,IAACC,EAAA,CACC,QAAQ,UACR,QAAS,IAAM,KAAKkD,EAAA,EACpB,SAAUnE,GAAQ,CAACF,EAAM,QAAU,CAACiE,EAAO,KAAA,EAC3C,cAAY,6BACb,SAAA,QAAA,CAAA,CAED,CAAA,CACF,CAAA,EACF,CAEJ"}
@@ -1 +0,0 @@
1
- import{r,j as e}from"./cmdk-C3F6LD6N.js";import{u as z,S as h,I as f,B as n,h as y,a1 as w,i as b,F as k}from"./main-BRmJZcHt.js";import{V as E}from"./ViewHeader-BsnaspKw.js";import{C as T,b as D}from"./Card-Clkvh43Q.js";import{I as S}from"./Input-DV-vdaV8.js";import{T as C}from"./Textarea-BfXGMXQ7.js";import{S as R,a as $}from"./Sheet-BwMVGN-8.js";import{E as L}from"./EmptyState-ccT__JZG.js";import{R as B}from"./refresh-ccw-DN_zCB1h.js";import{P as F}from"./plus-Cps-8lcG.js";import{E as I}from"./external-link-DPDQM1YO.js";import{T as P}from"./trash-2-B_Y6HrfN.js";function Q(){const l=z("/api/clipboard/list"),[v,s]=r.useState(!1),[x,o]=r.useState(null),[u,d]=r.useState(null),p=r.useMemo(()=>{var t;return((t=l.data)==null?void 0:t.clips)??[]},[l.data]),c=r.useCallback(()=>{l.refetch()},[l]),g=async t=>{d(null);try{await b(`/api/clipboard/${t}`,{method:"DELETE"}),o(null),c()}catch(i){d((i instanceof k,i.message))}};return e.jsxs(h,{gap:4,"data-testid":"clipboard-view",children:[e.jsx(E,{title:"Clipboard",description:"Saved clips. Each becomes a markdown note under clips/.",actions:e.jsxs(f,{align:"center",gap:2,children:[u!==null&&e.jsx("span",{role:"alert","data-testid":"clipboard-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:u}),e.jsxs(n,{variant:"ghost",onClick:()=>void c(),"data-testid":"clipboard-refresh",children:[e.jsx(B,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(n,{variant:"primary",onClick:()=>s(!0),"data-testid":"clipboard-add",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Save clip"]})]})}),e.jsx(T,{variant:"default",children:e.jsx(D,{children:l.loading&&p.length===0?e.jsxs(h,{gap:1,children:[e.jsx(y,{style:{height:60}}),e.jsx(y,{style:{height:60}})]}):p.length===0?e.jsx(L,{icon:e.jsx(w,{size:28,"aria-hidden":!0}),title:"No saved clips",description:"Clips are saved URL + text pairs captured from the clipboard during agent work. Each becomes a markdown note under clips/. Save one to get started."}):e.jsx(h,{gap:1,children:p.map(t=>{const i=x===t.id;return e.jsxs("div",{"data-testid":`clipboard-row-${t.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(f,{align:"center",justify:"between",gap:2,children:[e.jsxs(h,{gap:0,style:{minWidth:0,flex:1},children:[e.jsxs(f,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:t.title||t.id}),t.url&&e.jsxs("a",{href:t.url,target:"_blank",rel:"noreferrer",style:{fontSize:"var(--fs-11)",color:"var(--accent)"},children:[e.jsx(I,{size:10,"aria-hidden":!0,style:{verticalAlign:"middle"}})," ",t.url]}),t.savedAt&&e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:t.savedAt})]}),(t.selection||t.content)&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:(t.selection||t.content||"").length>200?`${(t.selection||t.content||"").slice(0,200)}…`:t.selection||t.content})]}),e.jsx(n,{variant:"ghost",onClick:()=>o(m=>m===t.id?null:t.id),"data-testid":`clipboard-delete-${t.id}`,"aria-label":`Delete ${t.id}`,children:e.jsx(P,{size:14,"aria-hidden":!0})})]}),i&&e.jsxs(f,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(n,{variant:"danger",onClick:()=>void g(t.id),"data-testid":`clipboard-confirm-delete-${t.id}`,children:"Confirm delete"}),e.jsx(n,{variant:"ghost",onClick:()=>o(null),children:"Cancel"})]})]},t.id)})})})}),e.jsx(R,{open:v,onOpenChange:s,children:e.jsx($,{side:"right",title:"Save clip",description:"URL or content required.",children:e.jsx(U,{onSubmit:async t=>{await b("/api/clipboard/save",{method:"POST",body:t}),s(!1),c()},onCancel:()=>s(!1)})})})]})}function U({onSubmit:l,onCancel:v}){const[s,x]=r.useState(""),[o,u]=r.useState(""),[d,p]=r.useState(""),[c,g]=r.useState(""),[t,i]=r.useState(!1),[m,j]=r.useState(null);return e.jsxs(h,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"URL (optional)"}),e.jsx(S,{value:s,onChange:a=>x(a.target.value),"data-testid":"clipboard-form-url"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title (optional)"}),e.jsx(S,{value:o,onChange:a=>u(a.target.value),"data-testid":"clipboard-form-title"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Content"}),e.jsx(C,{value:d,rows:6,onChange:a=>p(a.target.value),"data-testid":"clipboard-form-content"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Selection (optional)"}),e.jsx(C,{value:c,rows:3,onChange:a=>g(a.target.value),"data-testid":"clipboard-form-selection"})]}),m!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:m}),e.jsxs(f,{justify:"end",gap:2,children:[e.jsx(n,{variant:"ghost",onClick:v,children:"Cancel"}),e.jsx(n,{variant:"primary",disabled:t||!s.trim()&&!d.trim(),"data-testid":"clipboard-form-submit",onClick:async()=>{i(!0),j(null);try{await l({url:s.trim()||void 0,title:o.trim()||void 0,content:d.trim()||void 0,selection:c.trim()||void 0})}catch(a){j((a instanceof k,a.message)),i(!1)}},children:t?"Saving…":"Save"})]})]})}export{Q as ClipboardView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"ClipboardView-Cb6XgYZI.js","sources":["../../src/web/v8/views/Clipboard/ClipboardView.tsx"],"sourcesContent":["/**\n * v8/views/Clipboard/ClipboardView.tsx — Sprint S43, v9.3.0.\n *\n * Saved clip list (GET /api/clipboard/list), Save Sheet\n * (POST /api/clipboard/save with {url, title, content, selection}),\n * inline-confirm Delete (DELETE /api/clipboard/:id). Each row links\n * to the source URL when present.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { ClipboardPaste, Plus, Trash2, ExternalLink, RefreshCcw } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface Clip {\n id: string;\n url?: string;\n title?: string;\n content?: string;\n selection?: string;\n savedAt?: string;\n}\n\nexport function ClipboardView(): JSX.Element {\n const payload = useFetch<{ clips: Clip[] }>('/api/clipboard/list');\n const [saving, setSaving] = useState<boolean>(false);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const clips = useMemo<Clip[]>(() => payload.data?.clips ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const drop = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/clipboard/${id}`, { method: 'DELETE' });\n setConfirmDelete(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"clipboard-view\">\n <ViewHeader\n title=\"Clipboard\"\n description=\"Saved clips. Each becomes a markdown note under clips/.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"clipboard-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"clipboard-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setSaving(true)} data-testid=\"clipboard-add\">\n <Plus size={14} aria-hidden /> Save clip\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && clips.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 60 }} />\n <Skeleton style={{ height: 60 }} />\n </Stack>\n ) : clips.length === 0 ? (\n <EmptyState icon={<ClipboardPaste size={28} aria-hidden />} title=\"No saved clips\" description=\"Clips are saved URL + text pairs captured from the clipboard during agent work. Each becomes a markdown note under clips/. Save one to get started.\" />\n ) : (\n <Stack gap={1}>\n {clips.map((c) => {\n const isConfirming = confirmDelete === c.id;\n return (\n <div\n key={c.id}\n data-testid={`clipboard-row-${c.id}`}\n style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0, flex: 1 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>{c.title || c.id}</strong>\n {c.url && (\n <a href={c.url} target=\"_blank\" rel=\"noreferrer\" style={{ fontSize: 'var(--fs-11)', color: 'var(--accent)' }}>\n <ExternalLink size={10} aria-hidden style={{ verticalAlign: 'middle' }} /> {c.url}\n </a>\n )}\n {c.savedAt && <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{c.savedAt}</span>}\n </Inline>\n {(c.selection || c.content) && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {(c.selection || c.content || '').length > 200\n ? `${(c.selection || c.content || '').slice(0, 200)}…`\n : (c.selection || c.content)}\n </span>\n )}\n </Stack>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === c.id ? null : c.id))} data-testid={`clipboard-delete-${c.id}`} aria-label={`Delete ${c.id}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(c.id)} data-testid={`clipboard-confirm-delete-${c.id}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={saving} onOpenChange={setSaving}>\n <SheetContent side=\"right\" title=\"Save clip\" description=\"URL or content required.\">\n <SaveForm\n onSubmit={async (body) => {\n await fetchJson('/api/clipboard/save', { method: 'POST', body });\n setSaving(false);\n refresh();\n }}\n onCancel={() => setSaving(false)}\n />\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction SaveForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (body: { url?: string; title?: string; content?: string; selection?: string }) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [url, setUrl] = useState<string>('');\n const [title, setTitle] = useState<string>('');\n const [content, setContent] = useState<string>('');\n const [selection, setSelection] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>URL (optional)</span>\n <Input value={url} onChange={(e) => setUrl((e.target as HTMLInputElement).value)} data-testid=\"clipboard-form-url\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title (optional)</span>\n <Input value={title} onChange={(e) => setTitle((e.target as HTMLInputElement).value)} data-testid=\"clipboard-form-title\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Content</span>\n <Textarea value={content} rows={6} onChange={(e) => setContent((e.target as HTMLTextAreaElement).value)} data-testid=\"clipboard-form-content\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Selection (optional)</span>\n <Textarea value={selection} rows={3} onChange={(e) => setSelection((e.target as HTMLTextAreaElement).value)} data-testid=\"clipboard-form-selection\" />\n </label>\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={busy || (!url.trim() && !content.trim())}\n data-testid=\"clipboard-form-submit\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try {\n await onSubmit({\n url: url.trim() || undefined,\n title: title.trim() || undefined,\n content: content.trim() || undefined,\n selection: selection.trim() || undefined,\n });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n setBusy(false);\n }\n }}\n >\n {busy ? 'Saving…' : 'Save'}\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["ClipboardView","payload","useFetch","saving","setSaving","useState","confirmDelete","setConfirmDelete","error","setError","clips","useMemo","_a","refresh","useCallback","drop","id","fetchJson","err","FetchError","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Plus","Card","CardBody","Skeleton","EmptyState","ClipboardPaste","c","isConfirming","ExternalLink","cur","Trash2","Sheet","SheetContent","SaveForm","body","onSubmit","onCancel","url","setUrl","title","setTitle","content","setContent","selection","setSelection","busy","setBusy","Input","e","Textarea"],"mappings":"2jBAiCO,SAASA,GAA6B,CAC3C,MAAMC,EAAUC,EAA4B,qBAAqB,EAC3D,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAkB,EAAK,EAC7C,CAACC,EAAeC,CAAgB,EAAIF,EAAAA,SAAwB,IAAI,EAChE,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAwB,IAAI,EAEhDK,EAAQC,UAAgB,IAAA,OAAM,QAAAC,EAAAX,EAAQ,OAAR,YAAAW,EAAc,QAAS,IAAI,CAACX,EAAQ,IAAI,CAAC,EACvEY,EAAUC,EAAAA,YAAY,IAAM,CAAOb,EAAQ,QAAA,CAAW,EAAG,CAACA,CAAO,CAAC,EAElEc,EAAO,MAAOC,GAA8B,CAChDP,EAAS,IAAI,EACb,GAAI,CACF,MAAMQ,EAAU,kBAAkBD,CAAE,GAAI,CAAE,OAAQ,SAAU,EAC5DT,EAAiB,IAAI,EACrBM,EAAA,CACF,OAASK,EAAK,CACZT,GAASS,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,CACF,EAEA,OACEE,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,cAAY,iBACzB,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACC,MAAM,YACN,YAAY,0DACZ,QACEH,EAAAA,KAACI,EAAA,CAAO,MAAM,SAAS,IAAK,EACzB,SAAA,CAAAhB,IAAU,MACTc,MAAC,OAAA,CAAK,KAAK,QAAQ,cAAY,kBAAkB,MAAO,CAAE,MAAO,gBAAiB,SAAU,gBACzF,SAAAd,EACH,EAEFY,EAAAA,KAACK,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAM,KAAKZ,EAAA,EAAW,cAAY,oBACjE,SAAA,CAAAS,EAAAA,IAACI,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,UAAA,EACtC,EACAN,EAAAA,KAACK,EAAA,CAAO,QAAQ,UAAU,QAAS,IAAMrB,EAAU,EAAI,EAAG,cAAY,gBACpE,SAAA,CAAAkB,EAAAA,IAACK,EAAA,CAAK,KAAM,GAAI,cAAW,GAAC,EAAE,YAAA,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CAAA,EAIJL,MAACM,EAAA,CAAK,QAAQ,UACZ,eAACC,EAAA,CACE,SAAA5B,EAAQ,SAAWS,EAAM,SAAW,EACnCU,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAC,EAAAA,IAACQ,EAAA,CAAS,MAAO,CAAE,OAAQ,IAAM,QAChCA,EAAA,CAAS,MAAO,CAAE,OAAQ,GAAG,CAAG,CAAA,CAAA,CACnC,EACEpB,EAAM,SAAW,EACnBY,EAAAA,IAACS,EAAA,CAAW,KAAMT,EAAAA,IAACU,EAAA,CAAe,KAAM,GAAI,cAAW,EAAA,CAAC,EAAI,MAAM,iBAAiB,YAAY,qJAAA,CAAsJ,EAErPV,EAAAA,IAACD,EAAA,CAAM,IAAK,EACT,SAAAX,EAAM,IAAKuB,GAAM,CAChB,MAAMC,EAAe5B,IAAkB2B,EAAE,GACzC,OACEb,EAAAA,KAAC,MAAA,CAEC,cAAa,iBAAiBa,EAAE,EAAE,GAClC,MAAO,CAAE,QAAS,iBAAkB,OAAQ,0BAA2B,aAAc,kBAAA,EAErF,SAAA,CAAAb,OAACI,GAAO,MAAM,SAAS,QAAQ,UAAU,IAAK,EAC5C,SAAA,CAAAJ,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,MAAO,CAAE,SAAU,EAAG,KAAM,CAAA,EACzC,SAAA,CAAAD,EAAAA,KAACI,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAF,EAAAA,IAAC,SAAA,CAAO,MAAO,CAAE,SAAU,gBAAmB,SAAAW,EAAE,OAASA,EAAE,EAAA,CAAG,EAC7DA,EAAE,KACDb,EAAAA,KAAC,IAAA,CAAE,KAAMa,EAAE,IAAK,OAAO,SAAS,IAAI,aAAa,MAAO,CAAE,SAAU,eAAgB,MAAO,iBACzF,SAAA,CAAAX,EAAAA,IAACa,EAAA,CAAa,KAAM,GAAI,cAAW,GAAC,MAAO,CAAE,cAAe,QAAA,CAAS,CAAG,EAAE,IAAEF,EAAE,GAAA,EAChF,EAEDA,EAAE,SAAWX,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAA,EAAuB,SAAAW,EAAE,OAAA,CAAQ,CAAA,EACjG,GACEA,EAAE,WAAaA,EAAE,gBAChB,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAC5C,UAAAA,EAAE,WAAaA,EAAE,SAAW,IAAI,OAAS,IACvC,IAAIA,EAAE,WAAaA,EAAE,SAAW,IAAI,MAAM,EAAG,GAAG,CAAC,IAChDA,EAAE,WAAaA,EAAE,OAAA,CACxB,CAAA,EAEJ,EACAX,EAAAA,IAACG,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAMlB,EAAkB6B,GAASA,IAAQH,EAAE,GAAK,KAAOA,EAAE,EAAG,EAAG,cAAa,oBAAoBA,EAAE,EAAE,GAAI,aAAY,UAAUA,EAAE,EAAE,GACjK,SAAAX,EAAAA,IAACe,EAAA,CAAO,KAAM,GAAI,cAAW,GAAC,CAAA,CAChC,CAAA,EACF,EACCH,UACEV,EAAA,CAAO,IAAK,EAAG,MAAO,CAAE,UAAW,gBAAA,EAClC,SAAA,CAAAF,EAAAA,IAACG,EAAA,CAAO,QAAQ,SAAS,QAAS,IAAM,KAAKV,EAAKkB,EAAE,EAAE,EAAG,cAAa,4BAA4BA,EAAE,EAAE,GAAI,SAAA,iBAE1G,EACAX,EAAAA,IAACG,GAAO,QAAQ,QAAQ,QAAS,IAAMlB,EAAiB,IAAI,EAAG,SAAA,QAAA,CAAM,CAAA,CAAA,CACvE,CAAA,CAAA,EAjCG0B,EAAE,EAAA,CAqCb,CAAC,CAAA,CACH,CAAA,CAEJ,EACF,EAEAX,EAAAA,IAACgB,EAAA,CAAM,KAAMnC,EAAQ,aAAcC,EACjC,SAAAkB,EAAAA,IAACiB,EAAA,CAAa,KAAK,QAAQ,MAAM,YAAY,YAAY,2BACvD,SAAAjB,EAAAA,IAACkB,EAAA,CACC,SAAU,MAAOC,GAAS,CACxB,MAAMxB,EAAU,sBAAuB,CAAE,OAAQ,OAAQ,KAAAwB,EAAM,EAC/DrC,EAAU,EAAK,EACfS,EAAA,CACF,EACA,SAAU,IAAMT,EAAU,EAAK,CAAA,CAAA,EAEnC,CAAA,CACF,CAAA,EACF,CAEJ,CAEA,SAASoC,EAAS,CAChB,SAAAE,EACA,SAAAC,CACF,EAGgB,CACd,KAAM,CAACC,EAAKC,CAAM,EAAIxC,EAAAA,SAAiB,EAAE,EACnC,CAACyC,EAAOC,CAAQ,EAAI1C,EAAAA,SAAiB,EAAE,EACvC,CAAC2C,EAASC,CAAU,EAAI5C,EAAAA,SAAiB,EAAE,EAC3C,CAAC6C,EAAWC,CAAY,EAAI9C,EAAAA,SAAiB,EAAE,EAC/C,CAAC+C,EAAMC,CAAO,EAAIhD,EAAAA,SAAkB,EAAK,EACzC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAwB,IAAI,EAEtD,OACEe,EAAAA,KAACC,GAAM,IAAK,EAAG,MAAO,CAAE,QAAS,kBAC/B,SAAA,CAAAD,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,gBAAA,CAAc,EACnFA,EAAAA,IAACgC,EAAA,CAAM,MAAOV,EAAK,SAAWW,GAAMV,EAAQU,EAAE,OAA4B,KAAK,EAAG,cAAY,oBAAA,CAAqB,CAAA,EACrH,EACAnC,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,kBAAA,CAAgB,EACrFA,EAAAA,IAACgC,EAAA,CAAM,MAAOR,EAAO,SAAWS,GAAMR,EAAUQ,EAAE,OAA4B,KAAK,EAAG,cAAY,sBAAA,CAAuB,CAAA,EAC3H,EACAnC,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,SAAA,CAAO,EAC5EA,EAAAA,IAACkC,EAAA,CAAS,MAAOR,EAAS,KAAM,EAAG,SAAWO,GAAMN,EAAYM,EAAE,OAA+B,KAAK,EAAG,cAAY,wBAAA,CAAyB,CAAA,EAChJ,EACAnC,EAAAA,KAAC,QAAA,CAAM,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,gBAAA,EAC7D,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,sBAAA,CAAoB,EACzFA,EAAAA,IAACkC,EAAA,CAAS,MAAON,EAAW,KAAM,EAAG,SAAWK,GAAMJ,EAAcI,EAAE,OAA+B,KAAK,EAAG,cAAY,0BAAA,CAA2B,CAAA,EACtJ,EACC/C,IAAU,MAAQc,EAAAA,IAAC,OAAA,CAAK,KAAK,QAAQ,MAAO,CAAE,MAAO,gBAAiB,SAAU,cAAA,EAAmB,SAAAd,EAAM,EAC1GY,EAAAA,KAACI,EAAA,CAAO,QAAQ,MAAM,IAAK,EACzB,SAAA,CAAAF,MAACG,EAAA,CAAO,QAAQ,QAAQ,QAASkB,EAAU,SAAA,SAAM,EACjDrB,EAAAA,IAACG,EAAA,CACC,QAAQ,UACR,SAAU2B,GAAS,CAACR,EAAI,QAAU,CAACI,EAAQ,KAAA,EAC3C,cAAY,wBACZ,QAAS,SAAY,CACnBK,EAAQ,EAAI,EACZ5C,EAAS,IAAI,EACb,GAAI,CACF,MAAMiC,EAAS,CACb,IAAKE,EAAI,KAAA,GAAU,OACnB,MAAOE,EAAM,KAAA,GAAU,OACvB,QAASE,EAAQ,KAAA,GAAU,OAC3B,UAAWE,EAAU,KAAA,GAAU,MAAA,CAChC,CACH,OAAShC,EAAK,CACZT,GAASS,aAAeC,EAAaD,EAAI,QAAgC,EACzEmC,EAAQ,EAAK,CACf,CACF,EAEC,WAAO,UAAY,MAAA,CAAA,CACtB,CAAA,CACF,CAAA,EACF,CAEJ"}
@@ -1 +0,0 @@
1
- import{r as t,j as e}from"./cmdk-C3F6LD6N.js";import{S as v,I as o,k as I,j as w,U as L,u as y,B as c,h as S,i as z,F as k}from"./main-BRmJZcHt.js";import{V as D}from"./ViewHeader-BsnaspKw.js";import{C as b,b as C}from"./Card-Clkvh43Q.js";import{I as P}from"./Input-DV-vdaV8.js";import{E}from"./EmptyState-ccT__JZG.js";import{P as R}from"./plug-DVvSSe40.js";import{R as M}from"./refresh-ccw-DN_zCB1h.js";import{S as $}from"./save-BY4ViPku.js";import{P as T}from"./plus-Cps-8lcG.js";import{P as A}from"./pencil-Dkks7eIC.js";import{T as B}from"./trash-2-B_Y6HrfN.js";const F=[{id:"runtime",label:"Runtime config",icon:I},{id:"providers",label:"Providers",icon:w},{id:"mcps",label:"MCPs",icon:R},{id:"system-llm",label:"System LLM",icon:L}];function se(){const[s,n]=t.useState("runtime");return e.jsxs(v,{gap:4,"data-testid":"config-view",children:[e.jsx(D,{title:"Config",description:"Runtime config + providers + MCPs + system LLM."}),e.jsx(o,{gap:1,role:"tablist",children:F.map(r=>e.jsxs("button",{type:"button",role:"tab","aria-selected":s===r.id,onClick:()=>n(r.id),"data-testid":`config-tab-${r.id}`,style:{padding:"var(--space-2) var(--space-3)",borderRadius:"var(--radius-md)",border:"1px solid var(--border)",background:s===r.id?"color-mix(in oklch, var(--accent) 14%, transparent)":"var(--surface-0)",color:s===r.id?"var(--accent)":"var(--fg-muted)",fontSize:"var(--fs-12)",cursor:"pointer"},children:[e.jsx(r.icon,{size:14,"aria-hidden":!0,style:{verticalAlign:"middle",marginRight:6}}),r.label]},r.id))}),s==="runtime"&&e.jsx(N,{}),s==="providers"&&e.jsx(U,{}),s==="mcps"&&e.jsx(V,{}),s==="system-llm"&&e.jsx(H,{})]})}function N(){var h;const s=y("/api/config"),[n,r]=t.useState(""),[i,m]=t.useState(!1),[x,l]=t.useState(!1),[f,u]=t.useState(null);t.useEffect(()=>{var a;((a=s.data)==null?void 0:a.raw)!==void 0&&r(s.data.raw)},[(h=s.data)==null?void 0:h.raw]);const j=t.useCallback(()=>{s.refetch()},[s]),g=async()=>{m(!0),u(null),l(!1);try{await z("/api/config",{method:"PUT",body:n}),l(!0),j()}catch(a){u((a instanceof k,a.message))}finally{m(!1)}};return e.jsx(b,{variant:"default",children:e.jsx(C,{children:e.jsxs(v,{gap:2,children:[e.jsxs(o,{align:"center",justify:"between",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Runtime config"}),e.jsxs(o,{gap:1,children:[e.jsxs(c,{variant:"ghost",onClick:j,"data-testid":"config-runtime-reload",children:[e.jsx(M,{size:14,"aria-hidden":!0})," Reload"]}),e.jsxs(c,{variant:"primary",onClick:()=>void g(),disabled:i,"data-testid":"config-runtime-save",children:[e.jsx($,{size:14,"aria-hidden":!0})," ",i?"Saving…":"Save"]})]})]}),s.loading&&s.data===null?e.jsx(S,{style:{height:240}}):e.jsx("textarea",{value:n,rows:16,"data-testid":"config-runtime-raw",onChange:a=>r(a.target.value),style:{background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",color:"var(--fg)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",resize:"vertical"}}),x&&e.jsx("span",{"data-testid":"config-runtime-saved",style:{color:"var(--success)",fontSize:"var(--fs-12)"},children:"Saved"}),f!==null&&e.jsx("span",{role:"alert","data-testid":"config-runtime-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:f})]})})})}function U(){const s=y("/api/config/providers"),[n,r]=t.useState(!1),[i,m]=t.useState(null),[x,l]=t.useState(null),[f,u]=t.useState(null),j=t.useCallback(()=>{s.refetch()},[s]),g=t.useMemo(()=>{var a;return((a=s.data)==null?void 0:a.providers)??[]},[s.data]),h=async a=>{u(null);try{await z(`/api/config/providers/${a}`,{method:"DELETE"}),l(null),j()}catch(p){u((p instanceof k,p.message))}};return e.jsx(b,{variant:"default",children:e.jsx(C,{children:e.jsxs(v,{gap:2,children:[e.jsxs(o,{align:"center",justify:"between",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Providers"}),e.jsxs(o,{gap:1,children:[f!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:f}),e.jsxs(c,{variant:"primary",onClick:()=>r(!0),"data-testid":"config-providers-add",children:[e.jsx(T,{size:14,"aria-hidden":!0})," Add"]})]})]}),s.loading&&g.length===0?e.jsx(S,{style:{height:100}}):g.length===0?e.jsx(E,{icon:e.jsx(w,{size:28,"aria-hidden":!0}),title:"No providers",description:"Add one or use Auto-add with key."}):e.jsx(v,{gap:1,children:g.map(a=>{const p=x===a.id;return e.jsxs("div",{"data-testid":`config-provider-row-${a.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(o,{align:"center",justify:"between",gap:2,children:[e.jsxs(o,{align:"center",gap:2,children:[e.jsx("strong",{children:a.name||a.id}),a.groupId&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["group=",a.groupId]})]}),e.jsxs(o,{gap:1,children:[e.jsx(c,{variant:"ghost",onClick:()=>m(a.id),"data-testid":`config-provider-edit-${a.id}`,"aria-label":`Edit ${a.id}`,children:e.jsx(A,{size:14,"aria-hidden":!0})}),e.jsx(c,{variant:"ghost",onClick:()=>l(d=>d===a.id?null:a.id),"data-testid":`config-provider-delete-${a.id}`,"aria-label":`Delete ${a.id}`,children:e.jsx(B,{size:14,"aria-hidden":!0})})]})]}),p&&e.jsxs(o,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(c,{variant:"danger",onClick:()=>void h(a.id),"data-testid":`config-provider-confirm-delete-${a.id}`,children:"Confirm delete"}),e.jsx(c,{variant:"ghost",onClick:()=>l(null),children:"Cancel"})]})]},a.id)})})]})})})}function V(){const s=y("/api/config/mcps"),n=t.useMemo(()=>{var i;return((i=s.data)==null?void 0:i.mcps)??[]},[s.data]),r=t.useCallback(()=>{s.refetch()},[s]);return e.jsx(b,{variant:"default",children:e.jsx(C,{children:e.jsxs(v,{gap:2,children:[e.jsx(o,{align:"center",justify:"between",gap:2,children:e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"MCP servers"})}),s.loading&&n.length===0?e.jsx(S,{style:{height:60}}):n.length===0?e.jsx(E,{icon:e.jsx(R,{size:28,"aria-hidden":!0}),title:"No MCPs",description:"Add one via /api/config/mcps."}):e.jsx(v,{gap:1,children:n.map(i=>e.jsxs("div",{"data-testid":`config-mcp-row-${i.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",display:"flex",justifyContent:"space-between"},children:[e.jsx("strong",{children:i.name||i.id}),i.command&&e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:i.command})]},i.id))}),e.jsxs(c,{variant:"ghost",onClick:r,"data-testid":"config-mcps-refresh",children:[e.jsx(M,{size:14,"aria-hidden":!0})," Refresh"]})]})})})}function H(){const s=y("/api/llm/system-llm"),[n,r]=t.useState(!1),[i,m]=t.useState(""),[x,l]=t.useState(""),[f,u]=t.useState(!1),[j,g]=t.useState(!1),[h,a]=t.useState(null);t.useEffect(()=>{s.data&&(r(s.data.enabled),m(s.data.provider??""),l(s.data.model??""))},[s.data]);const p=async()=>{u(!0),a(null),g(!1);try{await z("/api/llm/system-llm",{method:"PUT",body:{enabled:n,provider:i,model:x}}),g(!0),s.refetch()}catch(d){a((d instanceof k,d.message))}finally{u(!1)}};return e.jsx(b,{variant:"default",children:e.jsx(C,{children:e.jsxs(v,{gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"System LLM"}),s.loading&&s.data===null?e.jsx(S,{style:{height:100}}):e.jsxs(v,{gap:2,children:[e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx("input",{type:"checkbox",checked:n,"data-testid":"config-system-llm-enabled",onChange:d=>r(d.target.checked)}),e.jsx("span",{style:{fontSize:"var(--fs-13)"},children:"Enabled"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Provider"}),e.jsx(P,{value:i,"data-testid":"config-system-llm-provider",onChange:d=>m(d.target.value)})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Model"}),e.jsx(P,{value:x,"data-testid":"config-system-llm-model",onChange:d=>l(d.target.value)})]}),e.jsx(o,{justify:"end",gap:2,children:e.jsxs(c,{variant:"primary",onClick:()=>void p(),disabled:f,"data-testid":"config-system-llm-save",children:[e.jsx($,{size:14,"aria-hidden":!0})," ",f?"Saving…":"Save"]})}),j&&e.jsx("span",{"data-testid":"config-system-llm-saved",style:{color:"var(--success)",fontSize:"var(--fs-12)"},children:"Saved"}),h!==null&&e.jsx("span",{role:"alert","data-testid":"config-system-llm-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:h})]})]})})})}export{se as ConfigView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConfigView-DfTJk1uL.js","sources":["../../src/web/v8/views/Config/ConfigView.tsx"],"sourcesContent":["/**\n * v8/views/Config/ConfigView.tsx — Sprint S41, v9.3.0.\n *\n * Three sub-sections:\n * - Runtime config: read-only viewer + Reload + Save (PUT\n * /api/config with the edited raw JSON).\n * - Providers: full CRUD via /api/config/providers + the\n * \"add with key\" auto endpoint.\n * - MCPs: full CRUD via /api/config/mcps.\n * - System LLM: read/write the cline.json#systemLlm block via\n * /api/llm/system-llm.\n *\n * Inline confirm for delete. Sheet form for Add / Edit.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Plus, Pencil, Trash2, RefreshCcw, Save, ServerCog, Cpu, Plug, Settings as SettingsIcon } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Sheet, SheetClose, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface Provider {\n id: string;\n name?: string;\n groupId?: string;\n}\n\ninterface Mcp {\n id: string;\n name?: string;\n command?: string;\n}\n\ninterface SystemLlm {\n enabled: boolean;\n provider: string | null;\n model: string | null;\n}\n\ninterface RuntimeConfig {\n path: string;\n data: unknown;\n raw: string;\n exists: boolean;\n}\n\ntype SectionId = 'runtime' | 'providers' | 'mcps' | 'system-llm';\n\nconst SECTIONS: Array<{ id: SectionId; label: string; icon: LucideIcon }> = [\n { id: 'runtime', label: 'Runtime config', icon: SettingsIcon },\n { id: 'providers', label: 'Providers', icon: Cpu },\n { id: 'mcps', label: 'MCPs', icon: Plug },\n { id: 'system-llm', label: 'System LLM', icon: ServerCog },\n];\n\nexport function ConfigView(): JSX.Element {\n const [section, setSection] = useState<SectionId>('runtime');\n return (\n <Stack gap={4} data-testid=\"config-view\">\n <ViewHeader\n title=\"Config\"\n description=\"Runtime config + providers + MCPs + system LLM.\"\n />\n <Inline gap={1} role=\"tablist\">\n {SECTIONS.map((s) => (\n <button\n key={s.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={section === s.id}\n onClick={() => setSection(s.id)}\n data-testid={`config-tab-${s.id}`}\n style={{\n padding: 'var(--space-2) var(--space-3)',\n borderRadius: 'var(--radius-md)',\n border: '1px solid var(--border)',\n background: section === s.id ? 'color-mix(in oklch, var(--accent) 14%, transparent)' : 'var(--surface-0)',\n color: section === s.id ? 'var(--accent)' : 'var(--fg-muted)',\n fontSize: 'var(--fs-12)',\n cursor: 'pointer',\n }}\n >\n <s.icon size={14} aria-hidden style={{ verticalAlign: 'middle', marginRight: 6 }} />\n {s.label}\n </button>\n ))}\n </Inline>\n {section === 'runtime' && <RuntimeConfigPanel />}\n {section === 'providers' && <ProvidersPanel />}\n {section === 'mcps' && <McpsPanel />}\n {section === 'system-llm' && <SystemLlmPanel />}\n </Stack>\n );\n}\n\nfunction RuntimeConfigPanel(): JSX.Element {\n const payload = useFetch<RuntimeConfig>('/api/config');\n const [draft, setDraft] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [saved, setSaved] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (payload.data?.raw !== undefined) setDraft(payload.data.raw);\n }, [payload.data?.raw]);\n\n const reload = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const save = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n setSaved(false);\n try {\n await fetchJson('/api/config', { method: 'PUT', body: draft });\n setSaved(true);\n reload();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Runtime config</strong>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={reload} data-testid=\"config-runtime-reload\">\n <RefreshCcw size={14} aria-hidden /> Reload\n </Button>\n <Button variant=\"primary\" onClick={() => void save()} disabled={busy} data-testid=\"config-runtime-save\">\n <Save size={14} aria-hidden /> {busy ? 'Saving…' : 'Save'}\n </Button>\n </Inline>\n </Inline>\n {payload.loading && payload.data === null ? (\n <Skeleton style={{ height: 240 }} />\n ) : (\n <textarea\n value={draft}\n rows={16}\n data-testid=\"config-runtime-raw\"\n onChange={(e) => setDraft((e.target as HTMLTextAreaElement).value)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n resize: 'vertical',\n }}\n />\n )}\n {saved && <span data-testid=\"config-runtime-saved\" style={{ color: 'var(--success)', fontSize: 'var(--fs-12)' }}>Saved</span>}\n {error !== null && (\n <span role=\"alert\" data-testid=\"config-runtime-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n </Stack>\n </CardBody>\n </Card>\n );\n}\n\nfunction ProvidersPanel(): JSX.Element {\n const payload = useFetch<{ providers: Provider[] }>('/api/config/providers');\n const [adding, setAdding] = useState<boolean>(false);\n const [editing, setEditing] = useState<string | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n const providers = useMemo(() => payload.data?.providers ?? [], [payload.data]);\n\n const drop = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/config/providers/${id}`, { method: 'DELETE' });\n setConfirmDelete(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Providers</strong>\n <Inline gap={1}>\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"config-providers-add\">\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n </Inline>\n {payload.loading && providers.length === 0 ? (\n <Skeleton style={{ height: 100 }} />\n ) : providers.length === 0 ? (\n <EmptyState icon={<Cpu size={28} aria-hidden />} title=\"No providers\" description=\"Add one or use Auto-add with key.\" />\n ) : (\n <Stack gap={1}>\n {providers.map((p) => {\n const isConfirming = confirmDelete === p.id;\n return (\n <div key={p.id} data-testid={`config-provider-row-${p.id}`} style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)' }}>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Inline align=\"center\" gap={2}>\n <strong>{p.name || p.id}</strong>\n {p.groupId && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>group={p.groupId}</span>}\n </Inline>\n <Inline gap={1}>\n <Button variant=\"ghost\" onClick={() => setEditing(p.id)} data-testid={`config-provider-edit-${p.id}`} aria-label={`Edit ${p.id}`}>\n <Pencil size={14} aria-hidden />\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === p.id ? null : p.id))} data-testid={`config-provider-delete-${p.id}`} aria-label={`Delete ${p.id}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(p.id)} data-testid={`config-provider-confirm-delete-${p.id}`}>Confirm delete</Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </Stack>\n </CardBody>\n </Card>\n );\n}\n\nfunction McpsPanel(): JSX.Element {\n const payload = useFetch<{ mcps: Mcp[] }>('/api/config/mcps');\n const mcps = useMemo(() => payload.data?.mcps ?? [], [payload.data]);\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n return (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>MCP servers</strong>\n </Inline>\n {payload.loading && mcps.length === 0 ? (\n <Skeleton style={{ height: 60 }} />\n ) : mcps.length === 0 ? (\n <EmptyState icon={<Plug size={28} aria-hidden />} title=\"No MCPs\" description=\"Add one via /api/config/mcps.\" />\n ) : (\n <Stack gap={1}>\n {mcps.map((m) => (\n <div key={m.id} data-testid={`config-mcp-row-${m.id}`} style={{ padding: 'var(--space-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)', display: 'flex', justifyContent: 'space-between' }}>\n <strong>{m.name || m.id}</strong>\n {m.command && <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{m.command}</code>}\n </div>\n ))}\n </Stack>\n )}\n <Button variant=\"ghost\" onClick={refresh} data-testid=\"config-mcps-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n </Stack>\n </CardBody>\n </Card>\n );\n}\n\nfunction SystemLlmPanel(): JSX.Element {\n const payload = useFetch<SystemLlm>('/api/llm/system-llm');\n const [enabled, setEnabled] = useState<boolean>(false);\n const [provider, setProvider] = useState<string>('');\n const [model, setModel] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [saved, setSaved] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (payload.data) {\n setEnabled(payload.data.enabled);\n setProvider(payload.data.provider ?? '');\n setModel(payload.data.model ?? '');\n }\n }, [payload.data]);\n\n const save = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n setSaved(false);\n try {\n await fetchJson('/api/llm/system-llm', {\n method: 'PUT',\n body: { enabled, provider, model },\n });\n setSaved(true);\n void payload.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>System LLM</strong>\n {payload.loading && payload.data === null ? (\n <Skeleton style={{ height: 100 }} />\n ) : (\n <Stack gap={2}>\n <label style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n <input\n type=\"checkbox\"\n checked={enabled}\n data-testid=\"config-system-llm-enabled\"\n onChange={(e) => setEnabled((e.target as HTMLInputElement).checked)}\n />\n <span style={{ fontSize: 'var(--fs-13)' }}>Enabled</span>\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Provider</span>\n <Input value={provider} data-testid=\"config-system-llm-provider\" onChange={(e) => setProvider((e.target as HTMLInputElement).value)} />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Model</span>\n <Input value={model} data-testid=\"config-system-llm-model\" onChange={(e) => setModel((e.target as HTMLInputElement).value)} />\n </label>\n <Inline justify=\"end\" gap={2}>\n <Button variant=\"primary\" onClick={() => void save()} disabled={busy} data-testid=\"config-system-llm-save\">\n <Save size={14} aria-hidden /> {busy ? 'Saving…' : 'Save'}\n </Button>\n </Inline>\n {saved && <span data-testid=\"config-system-llm-saved\" style={{ color: 'var(--success)', fontSize: 'var(--fs-12)' }}>Saved</span>}\n {error !== null && (\n <span role=\"alert\" data-testid=\"config-system-llm-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n </Stack>\n )}\n </Stack>\n </CardBody>\n </Card>\n );\n}"],"names":["SECTIONS","SettingsIcon","Cpu","Plug","ServerCog","ConfigView","section","setSection","useState","jsxs","Stack","jsx","ViewHeader","Inline","s","RuntimeConfigPanel","ProvidersPanel","McpsPanel","SystemLlmPanel","payload","useFetch","draft","setDraft","busy","setBusy","saved","setSaved","error","setError","useEffect","_a","reload","useCallback","save","fetchJson","err","FetchError","Card","CardBody","Button","RefreshCcw","Save","Skeleton","e","adding","setAdding","editing","setEditing","confirmDelete","setConfirmDelete","refresh","providers","useMemo","drop","id","Plus","EmptyState","p","isConfirming","Pencil","cur","Trash2","mcps","m","enabled","setEnabled","provider","setProvider","model","setModel","Input"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{r as $,j as e}from"./cmdk-C3F6LD6N.js";import{u as k,S as a,B as F,I as d,A as b,b as I,h as V}from"./main-BRmJZcHt.js";import{G as C}from"./Grid-Bojq8Sg7.js";import{V as A}from"./ViewHeader-BsnaspKw.js";import{C as n,b as i}from"./Card-Clkvh43Q.js";import{R}from"./refresh-cw-KGm5eQgv.js";import{F as D}from"./file-text-BsCrv5aP.js";function E(r){if(!r||r<=0)return"—";const s=Math.floor(r/86400),l=Math.floor(r%86400/3600),o=Math.floor(r%3600/60);return s>0?`${s}d ${l}h`:l>0?`${l}h ${o}m`:`${o}m`}function N(){var g,x,j,m,u,p,v,y,S,z,w;const r=k("/api/diagnostics"),s=k("/api/diagnostics/logs?tail=200");$.useEffect(()=>{const t=setInterval(()=>{s.refetch()},1e4);return()=>clearInterval(t)},[s]);const l=(g=r.data)==null?void 0:g.uptime,o=((x=r.data)==null?void 0:x.checks)??[],h=((j=r.data)==null?void 0:j.counts)??{},c=((m=s.data)==null?void 0:m.lines)??[],f=((u=s.data)==null?void 0:u.file)??null;return e.jsxs(a,{gap:5,"data-testid":"diagnostics-view",children:[e.jsx(A,{title:"Diagnostics",description:"Live system snapshot + active log tail. Auto-refresh every 10s.",actions:e.jsxs(F,{variant:"ghost",onClick:()=>{r.refetch(),s.refetch()},"data-testid":"diagnostics-refresh",children:[e.jsx(R,{size:14,"aria-hidden":!0})," Refresh"]})}),e.jsxs(C,{cols:3,children:[e.jsx(n,{variant:"default",children:e.jsx(i,{children:e.jsxs(a,{gap:1,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Status"}),e.jsxs(d,{align:"center",gap:2,children:[e.jsx(b,{size:14,"aria-hidden":!0}),e.jsx("strong",{style:{fontFamily:"var(--font-mono)"},children:r.loading?"…":r.error?"error":(v=(p=r.data)==null?void 0:p.service)!=null&&v.running?(((S=(y=r.data)==null?void 0:y.errors)==null?void 0:S.length)??0)>0?"warn":"ok":"stopped"})]})]})})}),e.jsx(n,{variant:"default",children:e.jsx(i,{children:e.jsxs(a,{gap:1,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Uptime"}),e.jsx("strong",{style:{fontFamily:"var(--font-mono)"},children:r.loading?"…":E(l)})]})})}),e.jsx(n,{variant:"default",children:e.jsx(i,{children:e.jsxs(a,{gap:1,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Version"}),e.jsx("strong",{style:{fontFamily:"var(--font-mono)"},children:r.loading?"…":((z=r.data)==null?void 0:z.version)??"—"})]})})})]}),r.error&&e.jsx(n,{variant:"default",style:{borderColor:"var(--danger)"},children:e.jsx(i,{children:e.jsxs(a,{gap:2,children:[e.jsxs(d,{align:"center",gap:2,children:[e.jsx(b,{size:14,"aria-hidden":!0,style:{color:"var(--danger)"}}),e.jsx("strong",{style:{color:"var(--danger)"},children:"Diagnostics fetch failed"})]}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:r.error.message??String(r.error)}),e.jsxs(F,{variant:"secondary",size:"sm",onClick:()=>{r.refetch()},children:[e.jsx(R,{size:12,"aria-hidden":!0})," Retry"]})]})})}),Object.keys(h).length>0&&e.jsx(n,{variant:"default",children:e.jsx(i,{children:e.jsxs(a,{gap:2,children:[e.jsx("strong",{children:"Counts"}),e.jsx(C,{cols:4,children:Object.entries(h).map(([t,B])=>e.jsxs(a,{gap:0,children:[e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:t}),e.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-13)"},children:String(B??"—")})]},t))})]})})}),o.length>0&&e.jsx(n,{variant:"default",children:e.jsx(i,{children:e.jsxs(a,{gap:2,children:[e.jsxs("strong",{children:["Checks (",o.length,")"]}),e.jsx(d,{gap:1,wrap:!0,children:o.map(t=>e.jsx(I,{tone:t.status==="ok"?"success":t.status==="warn"?"warning":"danger",children:t.name},t.name))})]})})}),e.jsx(n,{variant:"default",children:e.jsx(i,{children:e.jsxs(a,{gap:2,children:[e.jsxs(d,{align:"center",justify:"between",children:[e.jsxs(d,{align:"center",gap:2,children:[e.jsx(D,{size:14,"aria-hidden":!0}),e.jsx("strong",{children:"Log tail"}),f&&e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontFamily:"var(--font-mono)"},children:f})]}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[c.length," / ",((w=s.data)==null?void 0:w.total)??0," lines"]})]}),s.loading&&c.length===0?e.jsx(V,{style:{height:240}}):c.length===0?e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:"No log lines yet."}):e.jsx("pre",{"data-testid":"diagnostics-log-tail",style:{maxHeight:320,overflowY:"auto",padding:"var(--space-3)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-12)",fontFamily:"var(--font-mono)",margin:0,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:c.join(`
2
- `)})]})})})]})}export{N as DiagnosticsView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"DiagnosticsView-D5Wy9xlJ.js","sources":["../../src/web/v8/views/Diagnostics/DiagnosticsView.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Activity, RefreshCw, FileText } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\n\n/**\n * DiagnosticsView — Sprint S35. System snapshot + active log tail.\n */\n\ninterface DiagnosticsHealth {\n status: string;\n checks?: Array<{ name: string; status: string; message?: string }>;\n}\n\ninterface DiagnosticsSnapshot {\n version?: string;\n uptime?: number;\n memory?: { rss?: number; heapUsed?: number; heapTotal?: number };\n checks?: Array<{ name: string; status: string; message?: string }>;\n counts?: Record<string, number | string | null>;\n errors?: Array<{ line: string; ts: string | null }>;\n service?: { running?: boolean; pid?: number };\n}\n\ninterface LogsResponse {\n lines: string[];\n file: string | null;\n total: number;\n}\n\nfunction fmtUptime(secs: number | undefined): string {\n if (!secs || secs <= 0) return '—';\n const days = Math.floor(secs / 86400);\n const hours = Math.floor((secs % 86400) / 3600);\n const mins = Math.floor((secs % 3600) / 60);\n if (days > 0) return `${days}d ${hours}h`;\n if (hours > 0) return `${hours}h ${mins}m`;\n return `${mins}m`;\n}\n\nexport function DiagnosticsView(): JSX.Element {\n const snap = useFetch<DiagnosticsSnapshot>('/api/diagnostics');\n const logs = useFetch<LogsResponse>('/api/diagnostics/logs?tail=200');\n\n // Auto-refresh logs every 10s while page is open.\n useEffect(() => {\n const id = setInterval(() => { void logs.refetch(); }, 10_000);\n return () => clearInterval(id);\n }, [logs]);\n\n const uptime = snap.data?.uptime;\n const checks = snap.data?.checks ?? [];\n const counts = snap.data?.counts ?? {};\n const lines = logs.data?.lines ?? [];\n const logFile = logs.data?.file ?? null;\n\n return (\n <Stack gap={5} data-testid=\"diagnostics-view\">\n <ViewHeader\n title=\"Diagnostics\"\n description=\"Live system snapshot + active log tail. Auto-refresh every 10s.\"\n actions={\n <Button variant=\"ghost\" onClick={() => { void snap.refetch(); void logs.refetch(); }} data-testid=\"diagnostics-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n }\n />\n\n <Grid cols={3}>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Status</span>\n <Inline align=\"center\" gap={2}>\n <Activity size={14} aria-hidden />\n <strong style={{ fontFamily: 'var(--font-mono)' }}>\n {snap.loading ? '…' : (\n snap.error ? 'error' :\n !snap.data?.service?.running ? 'stopped' :\n (snap.data?.errors?.length ?? 0) > 0 ? 'warn' : 'ok'\n )}\n </strong>\n </Inline>\n </Stack>\n </CardBody>\n </Card>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Uptime</span>\n <strong style={{ fontFamily: 'var(--font-mono)' }}>{snap.loading ? '…' : fmtUptime(uptime)}</strong>\n </Stack>\n </CardBody>\n </Card>\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Version</span>\n <strong style={{ fontFamily: 'var(--font-mono)' }}>{snap.loading ? '…' : (snap.data?.version ?? '—')}</strong>\n </Stack>\n </CardBody>\n </Card>\n </Grid>\n\n {snap.error && (\n <Card variant=\"default\" style={{ borderColor: 'var(--danger)' }}>\n <CardBody>\n <Stack gap={2}>\n <Inline align=\"center\" gap={2}>\n <Activity size={14} aria-hidden style={{ color: 'var(--danger)' }} />\n <strong style={{ color: 'var(--danger)' }}>Diagnostics fetch failed</strong>\n </Inline>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{snap.error.message ?? String(snap.error)}</span>\n <Button variant=\"secondary\" size=\"sm\" onClick={() => { void snap.refetch(); }}>\n <RefreshCw size={12} aria-hidden /> Retry\n </Button>\n </Stack>\n </CardBody>\n </Card>\n )}\n\n {Object.keys(counts).length > 0 && (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <strong>Counts</strong>\n <Grid cols={4}>\n {Object.entries(counts).map(([k, v]) => (\n <Stack key={k} gap={0}>\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)', textTransform: 'uppercase', letterSpacing: '0.04em' }}>{k}</span>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-13)' }}>{String(v ?? '—')}</strong>\n </Stack>\n ))}\n </Grid>\n </Stack>\n </CardBody>\n </Card>\n )}\n\n {checks.length > 0 && (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <strong>Checks ({checks.length})</strong>\n <Inline gap={1} wrap={true}>\n {checks.map((c) => (\n <Badge key={c.name} tone={c.status === 'ok' ? 'success' : c.status === 'warn' ? 'warning' : 'danger'}>\n {c.name}\n </Badge>\n ))}\n </Inline>\n </Stack>\n </CardBody>\n </Card>\n )}\n\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <Inline align=\"center\" justify=\"between\">\n <Inline align=\"center\" gap={2}>\n <FileText size={14} aria-hidden />\n <strong>Log tail</strong>\n {logFile && <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontFamily: 'var(--font-mono)' }}>{logFile}</code>}\n </Inline>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{lines.length} / {logs.data?.total ?? 0} lines</span>\n </Inline>\n {logs.loading && lines.length === 0 ? (\n <Skeleton style={{ height: 240 }} />\n ) : lines.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>No log lines yet.</span>\n ) : (\n <pre\n data-testid=\"diagnostics-log-tail\"\n style={{\n maxHeight: 320,\n overflowY: 'auto',\n padding: 'var(--space-3)',\n background: 'var(--surface-1)',\n borderRadius: 'var(--radius-sm)',\n fontSize: 'var(--fs-12)',\n fontFamily: 'var(--font-mono)',\n margin: 0,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {lines.join('\\n')}\n </pre>\n )}\n </Stack>\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["fmtUptime","secs","days","hours","mins","DiagnosticsView","snap","useFetch","logs","useEffect","id","uptime","_a","checks","_b","counts","_c","lines","_d","logFile","_e","jsxs","Stack","jsx","ViewHeader","Button","RefreshCw","Grid","Card","CardBody","Inline","Activity","_g","_f","_i","_h","_j","k","v","c","Badge","FileText","_k","Skeleton"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import{r as c,j as e}from"./cmdk-C3F6LD6N.js";import{d as k,u as b,a as C,S as h,I as d,B as r,h as m,M as S,l as $,X as w,i as f,F as x}from"./main-BRmJZcHt.js";import{V as z}from"./ViewHeader-BsnaspKw.js";import{L as E}from"./ListHeader-CCD_nIHb.js";import{C as D,b as R}from"./Card-Clkvh43Q.js";import{E as T}from"./EmptyState-ccT__JZG.js";import{E as F}from"./ErrorState-BSqf65ka.js";import{R as q}from"./refresh-ccw-DN_zCB1h.js";import{T as j}from"./trash-2-B_Y6HrfN.js";import"./Alert-pzFISNtS.js";import"./circle-alert-QQTU4Quz.js";import"./triangle-alert-BeY8LAv6.js";import"./circle-check-BMbe7Kkr.js";/**
2
- * @license lucide-react v0.460.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const L=k("SkipForward",[["polygon",{points:"5 4 15 12 5 20 5 4",key:"16p6eg"}],["line",{x1:"19",x2:"19",y1:"5",y2:"19",key:"futhcm"}]]);function G(){const s=b("/api/dialogs"),[v,g]=c.useState(null),[u,l]=c.useState(null),t=c.useCallback(()=>{s.refetch()},[s]);C("dialog:show",()=>{t()});const y=async i=>{l(null);try{await f(`/api/dialogs/${i}`,{method:"DELETE"}),g(null),t()}catch(a){l((a instanceof x,a.message))}},p=async(i,a)=>{l(null);try{await f(`/api/dialogs/${i}/${a}`,{method:"POST",body:{}}),t()}catch(n){l((n instanceof x,n.message))}},o=c.useMemo(()=>{var i;return((i=s.data)==null?void 0:i.dialogs)??[]},[s.data]);return e.jsxs(h,{gap:4,"data-testid":"dialogs-view",children:[e.jsx(z,{title:"Dialogs",description:"Active dialog queue (debug + manual dismiss).",actions:e.jsxs(d,{gap:1,children:[u!==null&&e.jsx("span",{role:"alert","data-testid":"dialogs-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:u}),e.jsxs(r,{variant:"ghost",onClick:()=>void t(),"data-testid":"dialogs-refresh",children:[e.jsx(q,{size:14,"aria-hidden":!0})," Refresh"]})]})}),e.jsx(E,{title:"Queue",count:o.length,testid:"dialogs-list-header"}),e.jsx(D,{variant:"default",children:e.jsx(R,{children:s.loading&&o.length===0?e.jsxs(h,{gap:1,children:[e.jsx(m,{style:{height:32}}),e.jsx(m,{style:{height:32}})]}):s.error&&o.length===0?e.jsx(F,{block:!0,title:"Couldn't load dialogs",description:"The dialog queue failed to fetch. Retry to refetch.",error:s.error,onRetry:t,testid:"dialogs-error-state"}):o.length===0?e.jsx(T,{icon:e.jsx(S,{size:28,"aria-hidden":!0}),title:"No active dialogs",description:"Dialogs are confirmations and prompts the agent raises when it needs user input before proceeding. They appear here when the slash-command plugin queues one."}):e.jsx(h,{gap:1,children:o.map(i=>{const a=v===i.id;return e.jsxs("div",{"data-testid":`dialog-row-${i.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)"},children:[e.jsxs(d,{align:"center",justify:"between",gap:2,children:[e.jsxs(h,{gap:0,style:{minWidth:0},children:[e.jsxs(d,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:i.title||i.id}),i.kind&&e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)",fontFamily:"var(--font-mono)"},children:i.kind}),i.source&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:["· ",i.source]})]}),i.body&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:i.body.length>160?`${i.body.slice(0,160)}…`:i.body})]}),e.jsxs(d,{gap:1,children:[e.jsxs(r,{variant:"primary",onClick:()=>void p(i.id,"approve"),"data-testid":`dialog-approve-${i.id}`,"aria-label":`Approve ${i.id}`,children:[e.jsx($,{size:14,"aria-hidden":!0})," Approve"]}),e.jsxs(r,{variant:"ghost",onClick:()=>void p(i.id,"skip"),"data-testid":`dialog-skip-${i.id}`,"aria-label":`Skip ${i.id}`,children:[e.jsx(L,{size:14,"aria-hidden":!0})," Skip"]}),e.jsxs(r,{variant:"ghost",onClick:()=>void p(i.id,"deny"),"data-testid":`dialog-deny-${i.id}`,"aria-label":`Deny ${i.id}`,children:[e.jsx(w,{size:14,"aria-hidden":!0})," Deny"]}),e.jsx(r,{variant:"ghost",onClick:()=>g(n=>n===i.id?null:i.id),"data-testid":`dialog-dismiss-${i.id}`,"aria-label":`Dismiss ${i.id}`,children:e.jsx(j,{size:14,"aria-hidden":!0})})]})]}),a&&e.jsxs(d,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsxs(r,{variant:"danger",onClick:()=>void y(i.id),"data-testid":`dialog-confirm-dismiss-${i.id}`,children:[e.jsx(j,{size:14,"aria-hidden":!0})," Confirm"]}),e.jsx(r,{variant:"ghost",onClick:()=>g(null),children:"Cancel"})]})]},i.id)})})})})]})}export{G as DialogsView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"DialogsView-HVyfrXpq.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/skip-forward.js","../../src/web/v8/views/Dialogs/DialogsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SkipForward = createLucideIcon(\"SkipForward\", [\n [\"polygon\", { points: \"5 4 15 12 5 20 5 4\", key: \"16p6eg\" }],\n [\"line\", { x1: \"19\", x2: \"19\", y1: \"5\", y2: \"19\", key: \"futhcm\" }]\n]);\n\nexport { SkipForward as default };\n//# sourceMappingURL=skip-forward.js.map\n","/**\n * v8/views/Dialogs/DialogsView.tsx — Sprint S42, v9.3.0.\n *\n * Active dialog queue pulled from /api/dialogs. Per-row: view kind,\n * title, body preview, source, age, inline-confirm Dismiss (DELETE\n * /api/dialogs/:id). Empty state + manual Refresh button. No\n * window.confirm.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { Check, MessageSquare, RefreshCcw, SkipForward, Trash2, X } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface DialogItem {\n id: string;\n kind?: string;\n title?: string;\n body?: string;\n source?: string;\n createdAt?: number | string;\n}\n\nexport function DialogsView(): JSX.Element {\n const payload = useFetch<{ dialogs: DialogItem[] }>('/api/dialogs');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n // Live: server broadcasts `dialog:show` on enqueue. Refresh on it.\n useWsMessage('dialog:show', () => { refresh(); });\n\n const drop = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/dialogs/${id}`, { method: 'DELETE' });\n setConfirmDelete(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const decide = async (id: string, verdict: 'approve' | 'deny' | 'skip'): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/dialogs/${id}/${verdict}`, { method: 'POST', body: {} });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const dialogs = useMemo<DialogItem[]>(() => payload.data?.dialogs ?? [], [payload.data]);\n\n return (\n <Stack gap={4} data-testid=\"dialogs-view\">\n <ViewHeader\n title=\"Dialogs\"\n description=\"Active dialog queue (debug + manual dismiss).\"\n actions={\n <Inline gap={1}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"dialogs-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"dialogs-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n }\n />\n <ListHeader title=\"Queue\" count={dialogs.length} testid=\"dialogs-list-header\" />\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && dialogs.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 32 }} />\n <Skeleton style={{ height: 32 }} />\n </Stack>\n ) : payload.error && dialogs.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't load dialogs\"\n description=\"The dialog queue failed to fetch. Retry to refetch.\"\n error={payload.error}\n onRetry={refresh}\n testid=\"dialogs-error-state\"\n />\n ) : dialogs.length === 0 ? (\n <EmptyState\n icon={<MessageSquare size={28} aria-hidden />}\n title=\"No active dialogs\"\n description=\"Dialogs are confirmations and prompts the agent raises when it needs user input before proceeding. They appear here when the slash-command plugin queues one.\"\n />\n ) : (\n <Stack gap={1}>\n {dialogs.map((d) => {\n const isConfirming = confirmDelete === d.id;\n return (\n <div\n key={d.id}\n data-testid={`dialog-row-${d.id}`}\n style={{\n padding: 'var(--space-2)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>{d.title || d.id}</strong>\n {d.kind && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)', fontFamily: 'var(--font-mono)' }}>\n {d.kind}\n </span>\n )}\n {d.source && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>\n · {d.source}\n </span>\n )}\n </Inline>\n {d.body && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {d.body.length > 160 ? `${d.body.slice(0, 160)}…` : d.body}\n </span>\n )}\n </Stack>\n <Inline gap={1}>\n <Button\n variant=\"primary\"\n onClick={() => void decide(d.id, 'approve')}\n data-testid={`dialog-approve-${d.id}`}\n aria-label={`Approve ${d.id}`}\n >\n <Check size={14} aria-hidden /> Approve\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => void decide(d.id, 'skip')}\n data-testid={`dialog-skip-${d.id}`}\n aria-label={`Skip ${d.id}`}\n >\n <SkipForward size={14} aria-hidden /> Skip\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => void decide(d.id, 'deny')}\n data-testid={`dialog-deny-${d.id}`}\n aria-label={`Deny ${d.id}`}\n >\n <X size={14} aria-hidden /> Deny\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmDelete((cur) => (cur === d.id ? null : d.id))}\n data-testid={`dialog-dismiss-${d.id}`}\n aria-label={`Dismiss ${d.id}`}\n >\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(d.id)} data-testid={`dialog-confirm-dismiss-${d.id}`}>\n <Trash2 size={14} aria-hidden /> Confirm\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["SkipForward","createLucideIcon","DialogsView","payload","useFetch","confirmDelete","setConfirmDelete","useState","error","setError","refresh","useCallback","useWsMessage","drop","id","fetchJson","err","FetchError","decide","verdict","dialogs","useMemo","_a","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","ListHeader","Card","CardBody","Skeleton","ErrorState","EmptyState","MessageSquare","d","isConfirming","Check","X","cur","Trash2"],"mappings":"mmBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAcC,EAAiB,cAAe,CAClD,CAAC,UAAW,CAAE,OAAQ,qBAAsB,IAAK,QAAQ,CAAE,EAC3D,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,IAAK,GAAI,KAAM,IAAK,QAAQ,CAAE,CACnE,CAAC,ECqBM,SAASC,GAA2B,CACzC,MAAMC,EAAUC,EAAoC,cAAc,EAC5D,CAACC,EAAeC,CAAgB,EAAIC,EAAAA,SAAwB,IAAI,EAChE,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAwB,IAAI,EAEhDG,EAAUC,EAAAA,YAAY,IAAM,CAAOR,EAAQ,QAAA,CAAW,EAAG,CAACA,CAAO,CAAC,EAGxES,EAAa,cAAe,IAAM,CAAEF,EAAA,CAAW,CAAC,EAEhD,MAAMG,EAAO,MAAOC,GAA8B,CAChDL,EAAS,IAAI,EACb,GAAI,CACF,MAAMM,EAAU,gBAAgBD,CAAE,GAAI,CAAE,OAAQ,SAAU,EAC1DR,EAAiB,IAAI,EACrBI,EAAA,CACF,OAASM,EAAK,CACZP,GAASO,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,CACF,EAEME,EAAS,MAAOJ,EAAYK,IAAwD,CACxFV,EAAS,IAAI,EACb,GAAI,CACF,MAAMM,EAAU,gBAAgBD,CAAE,IAAIK,CAAO,GAAI,CAAE,OAAQ,OAAQ,KAAM,CAAA,CAAC,CAAG,EAC7ET,EAAA,CACF,OAASM,EAAK,CACZP,GAASO,aAAeC,EAAaD,EAAI,QAAgC,CAC3E,CACF,EAEMI,EAAUC,UAAsB,IAAA,OAAM,QAAAC,EAAAnB,EAAQ,OAAR,YAAAmB,EAAc,UAAW,IAAI,CAACnB,EAAQ,IAAI,CAAC,EAEvF,OACEoB,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,cAAY,eACzB,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACC,MAAM,UACN,YAAY,gDACZ,QACEH,EAAAA,KAACI,EAAA,CAAO,IAAK,EACV,SAAA,CAAAnB,IAAU,MACTiB,MAAC,OAAA,CAAK,KAAK,QAAQ,cAAY,gBAAgB,MAAO,CAAE,MAAO,gBAAiB,SAAU,gBACvF,SAAAjB,EACH,EAEFe,EAAAA,KAACK,EAAA,CAAO,QAAQ,QAAQ,QAAS,IAAM,KAAKlB,EAAA,EAAW,cAAY,kBACjE,SAAA,CAAAe,EAAAA,IAACI,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,UAAA,CAAA,CACtC,CAAA,CAAA,CACF,CAAA,CAAA,EAGJJ,MAACK,GAAW,MAAM,QAAQ,MAAOV,EAAQ,OAAQ,OAAO,sBAAsB,EAC9EK,MAACM,EAAA,CAAK,QAAQ,UACZ,eAACC,EAAA,CACE,SAAA7B,EAAQ,SAAWiB,EAAQ,SAAW,EACrCG,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAC,EAAAA,IAACQ,EAAA,CAAS,MAAO,CAAE,OAAQ,IAAM,QAChCA,EAAA,CAAS,MAAO,CAAE,OAAQ,GAAG,CAAG,CAAA,CAAA,CACnC,EACE9B,EAAQ,OAASiB,EAAQ,SAAW,EACtCK,EAAAA,IAACS,EAAA,CACC,MAAK,GACL,MAAM,wBACN,YAAY,sDACZ,MAAO/B,EAAQ,MACf,QAASO,EACT,OAAO,qBAAA,CAAA,EAEPU,EAAQ,SAAW,EACrBK,EAAAA,IAACU,EAAA,CACC,KAAMV,EAAAA,IAACW,EAAA,CAAc,KAAM,GAAI,cAAW,GAAC,EAC3C,MAAM,oBACN,YAAY,+JAAA,CAAA,QAGbZ,EAAA,CAAM,IAAK,EACT,SAAAJ,EAAQ,IAAKiB,GAAM,CAClB,MAAMC,EAAejC,IAAkBgC,EAAE,GACzC,OACEd,EAAAA,KAAC,MAAA,CAEC,cAAa,cAAcc,EAAE,EAAE,GAC/B,MAAO,CACL,QAAS,iBACT,OAAQ,0BACR,aAAc,mBACd,WAAY,kBAAA,EAGd,SAAA,CAAAd,OAACI,GAAO,MAAM,SAAS,QAAQ,UAAU,IAAK,EAC5C,SAAA,CAAAJ,OAACC,GAAM,IAAK,EAAG,MAAO,CAAE,SAAU,GAChC,SAAA,CAAAD,EAAAA,KAACI,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAF,EAAAA,IAAC,SAAA,CAAO,MAAO,CAAE,SAAU,gBAAmB,SAAAY,EAAE,OAASA,EAAE,EAAA,CAAG,EAC7DA,EAAE,MACDZ,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,mBAAoB,WAAY,kBAAA,EAC7E,WAAE,KACL,EAEDY,EAAE,QACDd,OAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAqB,SAAA,CAAA,KAChEc,EAAE,MAAA,CAAA,CACP,CAAA,EAEJ,EACCA,EAAE,MACDZ,MAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAC7C,SAAAY,EAAE,KAAK,OAAS,IAAM,GAAGA,EAAE,KAAK,MAAM,EAAG,GAAG,CAAC,IAAMA,EAAE,IAAA,CACxD,CAAA,EAEJ,EACAd,EAAAA,KAACI,EAAA,CAAO,IAAK,EACX,SAAA,CAAAJ,EAAAA,KAACK,EAAA,CACC,QAAQ,UACR,QAAS,IAAM,KAAKV,EAAOmB,EAAE,GAAI,SAAS,EAC1C,cAAa,kBAAkBA,EAAE,EAAE,GACnC,aAAY,WAAWA,EAAE,EAAE,GAE3B,SAAA,CAAAZ,EAAAA,IAACc,EAAA,CAAM,KAAM,GAAI,cAAW,GAAC,EAAE,UAAA,CAAA,CAAA,EAEjChB,EAAAA,KAACK,EAAA,CACC,QAAQ,QACR,QAAS,IAAM,KAAKV,EAAOmB,EAAE,GAAI,MAAM,EACvC,cAAa,eAAeA,EAAE,EAAE,GAChC,aAAY,QAAQA,EAAE,EAAE,GAExB,SAAA,CAAAZ,EAAAA,IAACzB,EAAA,CAAY,KAAM,GAAI,cAAW,GAAC,EAAE,OAAA,CAAA,CAAA,EAEvCuB,EAAAA,KAACK,EAAA,CACC,QAAQ,QACR,QAAS,IAAM,KAAKV,EAAOmB,EAAE,GAAI,MAAM,EACvC,cAAa,eAAeA,EAAE,EAAE,GAChC,aAAY,QAAQA,EAAE,EAAE,GAExB,SAAA,CAAAZ,EAAAA,IAACe,EAAA,CAAE,KAAM,GAAI,cAAW,GAAC,EAAE,OAAA,CAAA,CAAA,EAE7Bf,EAAAA,IAACG,EAAA,CACC,QAAQ,QACR,QAAS,IAAMtB,EAAkBmC,GAASA,IAAQJ,EAAE,GAAK,KAAOA,EAAE,EAAG,EACrE,cAAa,kBAAkBA,EAAE,EAAE,GACnC,aAAY,WAAWA,EAAE,EAAE,GAE3B,SAAAZ,EAAAA,IAACiB,EAAA,CAAO,KAAM,GAAI,cAAW,EAAA,CAAC,CAAA,CAAA,CAChC,CAAA,CACF,CAAA,EACF,EACCJ,UACEX,EAAA,CAAO,IAAK,EAAG,MAAO,CAAE,UAAW,gBAAA,EAClC,SAAA,CAAAJ,EAAAA,KAACK,EAAA,CAAO,QAAQ,SAAS,QAAS,IAAM,KAAKf,EAAKwB,EAAE,EAAE,EAAG,cAAa,0BAA0BA,EAAE,EAAE,GAClG,SAAA,CAAAZ,EAAAA,IAACiB,EAAA,CAAO,KAAM,GAAI,cAAW,GAAC,EAAE,UAAA,EAClC,EACAjB,EAAAA,IAACG,GAAO,QAAQ,QAAQ,QAAS,IAAMtB,EAAiB,IAAI,EAAG,SAAA,QAAA,CAAM,CAAA,CAAA,CACvE,CAAA,CAAA,EAvEG+B,EAAE,EAAA,CA2Eb,CAAC,CAAA,CACH,CAAA,CAEJ,CAAA,CACF,CAAA,EACF,CAEJ","x_google_ignoreList":[0]}
@@ -1,6 +0,0 @@
1
- import{r as d,j as e}from"./cmdk-C3F6LD6N.js";import{d as C,u as m,S as i,I as c,B as x,h,J as z,b as E,K as T,G as w,i as R,F as b}from"./main-BRmJZcHt.js";import{V as I}from"./ViewHeader-BsnaspKw.js";import{C as j,b as y}from"./Card-Clkvh43Q.js";import{E as N}from"./EmptyState-ccT__JZG.js";import{E as B}from"./ErrorState-BSqf65ka.js";import{R as F}from"./refresh-cw-KGm5eQgv.js";import{T as A}from"./triangle-alert-BeY8LAv6.js";import{C as D}from"./circle-check-BMbe7Kkr.js";import"./Alert-pzFISNtS.js";import"./circle-alert-QQTU4Quz.js";import"./refresh-ccw-DN_zCB1h.js";/**
2
- * @license lucide-react v0.460.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const H=C("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]),v={ok:D,warn:A,fail:H},O={ok:"success",warn:"warning",fail:"danger"};function M(){var p;const s=m("/api/doctor"),l=m("/api/doctor/health"),[k,u]=d.useState(null),[f,g]=d.useState(null);d.useEffect(()=>{const t=setInterval(()=>{l.refetch()},3e4);return()=>clearInterval(t)},[l]);const S=async t=>{u(t),g(null);try{await R("/api/doctor/check",{method:"POST",body:{checkName:t}}),s.refetch()}catch(r){g((r instanceof b,r.message))}finally{u(null)}},n=l.data??((p=s.data)==null?void 0:p.health),o=(()=>{var r;const t=(r=s.data)==null?void 0:r.checks;return t?[...t.system??[],...t.config??[],...t.services??[]].filter(a=>typeof a.name=="string"&&typeof a.status=="string"&&typeof a.message=="string"):[]})();return e.jsxs(i,{gap:5,"data-testid":"doctor-view",children:[e.jsx(I,{title:"Doctor",description:"System diagnostics. Health poll every 30s; click any check to re-run.",actions:e.jsxs(c,{gap:2,align:"center",children:[f!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:f}),e.jsxs(x,{variant:"ghost",onClick:()=>void s.refetch(),"data-testid":"doctor-refresh",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Refresh"]})]})}),n?e.jsx(j,{variant:"elevated",children:e.jsx(y,{children:e.jsxs(c,{align:"center",gap:3,children:[(()=>{const t=v[n.status];return e.jsx(t,{size:20,"aria-hidden":!0})})(),e.jsxs(i,{gap:0,children:[e.jsxs("strong",{style:{fontSize:"var(--fs-14)"},children:["Health: ",n.status.toUpperCase()]}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:n.issues.length===0?"No issues detected.":`${n.issues.length} issue${n.issues.length===1?"":"s"}`})]})]})})}):e.jsx(h,{style:{height:64}}),s.loading&&o.length===0?e.jsxs(i,{gap:2,children:[e.jsx(h,{style:{height:64}}),e.jsx(h,{style:{height:64}})]}):s.error&&o.length===0?e.jsx(B,{block:!0,title:"Couldn't run doctor",description:"The diagnostic snapshot failed. Retry to refetch.",error:s.error,onRetry:()=>void s.refetch(),testid:"doctor-error"}):o.length===0?e.jsx(N,{icon:e.jsx(z,{size:32,"aria-hidden":!0}),title:"No checks yet",description:"The Doctor snapshot returned no checks."}):e.jsx(i,{gap:2,children:o.map(t=>{const r=v[t.status],a=k===t.name;return e.jsx(j,{variant:"default",children:e.jsx(y,{children:e.jsxs(c,{align:"center",justify:"between",gap:3,children:[e.jsxs(i,{gap:1,style:{flex:1,minWidth:0},children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(r,{size:14,"aria-hidden":!0}),e.jsx("strong",{children:t.name}),e.jsx(E,{tone:O[t.status],children:t.status})]}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:t.message}),t.error&&e.jsx("span",{style:{color:"var(--danger)",fontSize:"var(--fs-12)",fontFamily:"var(--font-mono)"},children:t.error})]}),e.jsxs(x,{variant:"ghost",onClick:()=>void S(t.name),disabled:a,"data-testid":`doctor-run-${t.name}`,children:[a?e.jsx(T,{size:12,className:"animate-spin","aria-hidden":!0}):e.jsx(w,{size:12,"aria-hidden":!0}),a?"Running…":"Re-run"]})]})})},t.name)})})]})}export{M as DoctorView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"DoctorView-Dm94WI2z.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/circle-x.js","../../src/web/v8/views/Doctor/DoctorView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleX = createLucideIcon(\"CircleX\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n]);\n\nexport { CircleX as default };\n//# sourceMappingURL=circle-x.js.map\n","import { useCallback, useEffect, useState } from 'react';\nimport { Stethoscope, RefreshCw, ShieldCheck, AlertTriangle, XCircle, CheckCircle2, Loader2 } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { LucideIcon } from 'lucide-react';\n\n/**\n * DoctorView — Sprint S35. Health rollup + per-check triggers.\n */\n\ntype Status = 'ok' | 'warn' | 'fail';\n\ninterface CheckResult {\n name: string;\n status: Status;\n message: string;\n error?: string;\n}\n\ninterface CheckGroup {\n name?: string;\n status?: Status;\n message?: string;\n error?: string;\n}\n\ninterface HealthRollup {\n status: Status;\n issues: Array<{ name: string; status: Status; message: string }>;\n}\n\ninterface DoctorSnapshot {\n health: HealthRollup;\n checks: { system?: CheckGroup[]; config?: CheckGroup[]; services?: CheckGroup[] };\n recentErrors?: unknown[];\n}\n\nconst STATUS_ICON: Record<Status, LucideIcon> = {\n ok: CheckCircle2,\n warn: AlertTriangle,\n fail: XCircle,\n};\n\nconst STATUS_TONE = {\n ok: 'success',\n warn: 'warning',\n fail: 'danger',\n} as const;\n\nexport function DoctorView(): JSX.Element {\n const snap = useFetch<DoctorSnapshot>('/api/doctor');\n const health = useFetch<HealthRollup>('/api/doctor/health');\n const [running, setRunning] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // Re-poll health every 30s for a live rollup.\n useEffect(() => {\n const id = setInterval(() => { void health.refetch(); }, 30_000);\n return () => clearInterval(id);\n }, [health]);\n\n const runCheck = async (name: string): Promise<void> => {\n setRunning(name);\n setError(null);\n try {\n await fetchJson('/api/doctor/check', { method: 'POST', body: { checkName: name } });\n void snap.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setRunning(null);\n }\n };\n\n const rollup = health.data ?? snap.data?.health;\n const checks: CheckResult[] = (() => {\n const g = snap.data?.checks;\n if (!g) return [];\n return [...(g.system ?? []), ...(g.config ?? []), ...(g.services ?? [])]\n .filter((c): c is CheckResult =>\n typeof c.name === 'string' && typeof c.status === 'string' && typeof c.message === 'string'\n );\n })();\n\n return (\n <Stack gap={5} data-testid=\"doctor-view\">\n <ViewHeader\n title=\"Doctor\"\n description=\"System diagnostics. Health poll every 30s; click any check to re-run.\"\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <Button variant=\"ghost\" onClick={() => void snap.refetch()} data-testid=\"doctor-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n }\n />\n\n {rollup ? (\n <Card variant=\"elevated\">\n <CardBody>\n <Inline align=\"center\" gap={3}>\n {(() => {\n const Icon = STATUS_ICON[rollup.status];\n return <Icon size={20} aria-hidden />;\n })()}\n <Stack gap={0}>\n <strong style={{ fontSize: 'var(--fs-14)' }}>Health: {rollup.status.toUpperCase()}</strong>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>\n {rollup.issues.length === 0 ? 'No issues detected.' : `${rollup.issues.length} issue${rollup.issues.length === 1 ? '' : 's'}`}\n </span>\n </Stack>\n </Inline>\n </CardBody>\n </Card>\n ) : (\n <Skeleton style={{ height: 64 }} />\n )}\n\n {snap.loading && checks.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 64 }} />\n <Skeleton style={{ height: 64 }} />\n </Stack>\n ) : snap.error && checks.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't run doctor\"\n description=\"The diagnostic snapshot failed. Retry to refetch.\"\n error={snap.error}\n onRetry={() => void snap.refetch()}\n testid=\"doctor-error\"\n />\n ) : checks.length === 0 ? (\n <EmptyState\n icon={<Stethoscope size={32} aria-hidden />}\n title=\"No checks yet\"\n description=\"The Doctor snapshot returned no checks.\"\n />\n ) : (\n <Stack gap={2}>\n {checks.map((c) => {\n const Icon = STATUS_ICON[c.status];\n const busy = running === c.name;\n return (\n <Card key={c.name} variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ flex: 1, minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <Icon size={14} aria-hidden />\n <strong>{c.name}</strong>\n <Badge tone={STATUS_TONE[c.status]}>{c.status}</Badge>\n </Inline>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>{c.message}</span>\n {c.error && <span style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)', fontFamily: 'var(--font-mono)' }}>{c.error}</span>}\n </Stack>\n <Button variant=\"ghost\" onClick={() => void runCheck(c.name)} disabled={busy} data-testid={`doctor-run-${c.name}`}>\n {busy ? <Loader2 size={12} className=\"animate-spin\" aria-hidden /> : <ShieldCheck size={12} aria-hidden />}\n {busy ? 'Running…' : 'Re-run'}\n </Button>\n </Inline>\n </CardBody>\n </Card>\n );\n })}\n </Stack>\n )}\n </Stack>\n );\n}"],"names":["CircleX","createLucideIcon","STATUS_ICON","CheckCircle2","AlertTriangle","XCircle","STATUS_TONE","DoctorView","snap","useFetch","health","running","setRunning","useState","error","setError","useEffect","id","runCheck","name","fetchJson","err","FetchError","rollup","_a","checks","g","c","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCw","Card","CardBody","Icon","Skeleton","ErrorState","EmptyState","Stethoscope","busy","Badge","Loader2","ShieldCheck"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- import{r as l,j as e}from"./cmdk-C3F6LD6N.js";import{g as d}from"./main-BRmJZcHt.js";const m=l.forwardRef(function(r,a){const{icon:t,title:n,description:s,action:i,className:o,...c}=r;return e.jsxs("div",{ref:a,className:d("v8-empty-state",o),style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:"var(--space-3)",padding:"var(--space-12) var(--space-6)",textAlign:"center",color:"var(--fg-muted)"},...c,children:[t!==void 0&&e.jsx("div",{style:{color:"var(--fg-subtle)",display:"inline-flex"},children:t}),e.jsx("div",{style:{fontSize:"var(--fs-16)",fontWeight:600,color:"var(--fg)"},children:n}),s!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",maxWidth:480},children:s}),i!==void 0&&e.jsx("div",{style:{marginTop:"var(--space-2)"},children:i})]})});export{m as E};
@@ -1 +0,0 @@
1
- {"version":3,"file":"EmptyState-ccT__JZG.js","sources":["../../src/web/v8/ui/feedback/EmptyState.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * EmptyState — placeholder for empty lists / zero-data views.\n *\n * Use when a view has no rows. Never use a spinner; the data is\n * genuinely empty.\n */\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n props,\n ref,\n) {\n const { icon, title, description, action, className, ...rest } = props;\n return (\n <div\n ref={ref}\n className={cx('v8-empty-state', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-12) var(--space-6)',\n textAlign: 'center',\n color: 'var(--fg-muted)',\n }}\n {...rest}\n >\n {icon !== undefined && (\n <div style={{ color: 'var(--fg-subtle)', display: 'inline-flex' }}>{icon}</div>\n )}\n <div style={{ fontSize: 'var(--fs-16)', fontWeight: 600, color: 'var(--fg)' }}>{title}</div>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', maxWidth: 480 }}>{description}</div>\n )}\n {action !== undefined && <div style={{ marginTop: 'var(--space-2)' }}>{action}</div>}\n </div>\n );\n});"],"names":["EmptyState","forwardRef","props","ref","icon","title","description","action","className","rest","jsxs","cx","jsx"],"mappings":"qFAgBO,MAAMA,EAAaC,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CAAE,KAAAC,EAAM,MAAAC,EAAO,YAAAC,EAAa,OAAAC,EAAQ,UAAAC,EAAW,GAAGC,GAASP,EACjE,OACEQ,EAAAA,KAAC,MAAA,CACC,IAAAP,EACA,UAAWQ,EAAG,iBAAkBH,CAAS,EACzC,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,IAAK,iBACL,QAAS,iCACT,UAAW,SACX,MAAO,iBAAA,EAER,GAAGC,EAEH,SAAA,CAAAL,IAAS,QACRQ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,MAAO,mBAAoB,QAAS,aAAA,EAAkB,SAAAR,CAAA,CAAK,EAE3EQ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,WAAA,EAAgB,SAAAP,CAAA,CAAM,EACrFC,IAAgB,QACfM,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,SAAU,GAAA,EAAQ,SAAAN,CAAA,CAAY,EAEvEC,IAAW,QAAaK,MAAC,MAAA,CAAI,MAAO,CAAE,UAAW,gBAAA,EAAqB,SAAAL,CAAA,CAAO,CAAA,CAAA,CAAA,CAGpF,CAAC"}
@@ -1,8 +0,0 @@
1
- import{r as s,j as e}from"./cmdk-C3F6LD6N.js";import{d as O,u as V,S as p,I as f,B as n,h as I,V as P,O as D,i as y,F as k}from"./main-BRmJZcHt.js";import{V as Z}from"./ViewHeader-BsnaspKw.js";import{L as M}from"./ListHeader-CCD_nIHb.js";import{C as _,b as L}from"./Card-Clkvh43Q.js";import{I as A}from"./Input-DV-vdaV8.js";import{S as w,a as E,b as R}from"./Sheet-BwMVGN-8.js";import{E as N}from"./EmptyState-ccT__JZG.js";import{D as U}from"./download-B-mPX5P_.js";import{R as q}from"./refresh-ccw-DN_zCB1h.js";import{P as H}from"./plus-Cps-8lcG.js";import{P as K}from"./pencil-Dkks7eIC.js";import{T as J}from"./trash-2-B_Y6HrfN.js";/**
2
- * @license lucide-react v0.460.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const W=O("FileUp",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"m15 15-3-3-3 3",key:"15xj92"}]]);function ce(){const d=V("/api/env-vars"),[g,c]=s.useState(!1),[v,r]=s.useState(null),[m,i]=s.useState(!1),[u,l]=s.useState(null),[x,h]=s.useState(null),[b,C]=s.useState(null),[o,$]=s.useState(null),S=s.useMemo(()=>d.data??[],[d.data]),j=s.useCallback(()=>{d.refetch()},[d]),T=async a=>{C(a),h(null);try{const t=await y(`/api/env-vars/${encodeURIComponent(a)}/test`,{method:"POST"});$({name:a,ok:t.ok!==!1,message:t.message??(t.ok!==!1?"OK":"Failed")})}catch(t){const z=(t instanceof k,t.message);$({name:a,ok:!1,message:z})}finally{C(null)}},F=async a=>{h(null);try{await y(`/api/env-vars/${a}`,{method:"DELETE"}),l(null),j()}catch(t){h((t instanceof k,t.message))}};return e.jsxs(p,{gap:4,"data-testid":"env-vars-view",children:[e.jsx(Z,{title:"Env vars",description:"Runtime environment variables for the dashboard. Stored in ~/.config/bizar/env.json (mode 0600).",actions:e.jsxs(f,{align:"center",gap:2,children:[x!==null&&e.jsx("span",{role:"alert","data-testid":"env-vars-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:x}),e.jsxs(n,{variant:"ghost",onClick:()=>{window.open("/api/env-vars/export","_blank")},"data-testid":"env-vars-export",children:[e.jsx(U,{size:14,"aria-hidden":!0})," Export"]}),e.jsxs(n,{variant:"ghost",onClick:()=>i(!0),"data-testid":"env-vars-bulk-import",children:[e.jsx(W,{size:14,"aria-hidden":!0})," Bulk import"]}),e.jsxs(n,{variant:"ghost",onClick:()=>void j(),"data-testid":"env-vars-refresh",children:[e.jsx(q,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(n,{variant:"primary",onClick:()=>c(!0),"data-testid":"env-vars-add",children:[e.jsx(H,{size:14,"aria-hidden":!0})," Add"]})]})}),e.jsx(M,{title:"Variables",count:S.length,testid:"env-vars-list-header"}),e.jsx(_,{variant:"default",children:e.jsx(L,{children:d.loading&&S.length===0?e.jsxs(p,{gap:2,children:[e.jsx(I,{style:{height:36}}),e.jsx(I,{style:{height:36}})]}):S.length===0?e.jsx(N,{icon:e.jsx(P,{size:28,"aria-hidden":!0}),title:"No env vars",description:"Add one or bulk-import a .env file."}):e.jsx(p,{gap:1,children:S.map(a=>{const t=u===a.name;return e.jsxs("div",{"data-testid":`env-var-row-${a.name}`,style:{padding:"var(--space-2)",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--surface-0)"},children:[e.jsxs(f,{align:"center",justify:"between",gap:2,children:[e.jsxs(p,{gap:0,style:{minWidth:0},children:[e.jsx("code",{style:{fontSize:"var(--fs-12)"},children:a.name}),e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.value}),a.source&&e.jsxs("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:["source: ",a.source," ",a.createdAt?`· ${a.createdAt}`:""]})]}),e.jsxs(f,{gap:1,children:[e.jsx(n,{variant:"ghost",onClick:()=>void T(a.name),disabled:b===a.name,"data-testid":`env-var-test-${a.name}`,"aria-label":`Test ${a.name}`,children:e.jsx(D,{size:14,"aria-hidden":!0})}),e.jsx(n,{variant:"ghost",onClick:()=>r(a.name),"data-testid":`env-var-edit-${a.name}`,"aria-label":`Edit ${a.name}`,children:e.jsx(K,{size:14,"aria-hidden":!0})}),e.jsx(n,{variant:"ghost",onClick:()=>l(z=>z===a.name?null:a.name),"data-testid":`env-var-delete-${a.name}`,"aria-label":`Delete ${a.name}`,children:e.jsx(J,{size:14,"aria-hidden":!0})})]})]}),t&&e.jsxs(f,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(n,{variant:"danger",onClick:()=>void F(a.name),"data-testid":`env-var-confirm-delete-${a.name}`,children:"Confirm delete"}),e.jsx(n,{variant:"ghost",onClick:()=>l(null),"data-testid":`env-var-cancel-delete-${a.name}`,children:"Cancel"})]}),o!==null&&o.name===a.name&&e.jsxs("div",{"data-testid":`env-var-test-result-${a.name}`,style:{marginTop:"var(--space-1)",fontSize:"var(--fs-11)",color:o.ok?"var(--success)":"var(--danger)",fontFamily:"var(--font-mono)"},children:["test: ",o.message]})]},a.name)})})})}),e.jsx(w,{open:g,onOpenChange:c,children:e.jsx(E,{side:"right",title:"Add env var",description:"Must match /^BIZAR_[A-Z0-9_]+$/.",children:e.jsx(B,{mode:"add",onSubmit:async(a,t)=>{await y("/api/env-vars",{method:"POST",body:{name:a,value:t}}),c(!1),j()},onCancel:()=>c(!1)})})}),e.jsx(w,{open:v!==null,onOpenChange:a=>{a||r(null)},children:e.jsx(E,{side:"right",title:"Edit env var",description:v??"",children:v!==null&&e.jsx(B,{mode:"edit",initialName:v,onSubmit:async(a,t)=>{await y(`/api/env-vars/${a}`,{method:"PUT",body:{value:t}}),r(null),j()},onCancel:()=>r(null)})})}),e.jsx(w,{open:m,onOpenChange:i,children:e.jsx(E,{side:"right",title:"Bulk import",description:"Paste KEY=value lines (one per line, # comments ignored).",children:e.jsx(Y,{onSubmit:async a=>{await y("/api/env-vars/bulk-import",{method:"POST",body:{envContent:a}}),i(!1),j()},onCancel:()=>i(!1)})})})]})}function B({mode:d,initialName:g,onSubmit:c,onCancel:v}){const[r,m]=s.useState(g??""),[i,u]=s.useState(""),[l,x]=s.useState(!1),[h,b]=s.useState(null),C=async()=>{if(!(!r.trim()||!i||l)){x(!0),b(null);try{await c(r.trim(),i)}catch(o){b((o instanceof k,o.message))}finally{x(!1)}}};return e.jsxs(p,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Name"}),e.jsx(A,{value:r,readOnly:d==="edit","data-testid":"env-var-form-name",onChange:o=>m(o.target.value)})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Value"}),e.jsx(A,{type:"password",value:i,"data-testid":"env-var-form-value",onChange:o=>u(o.target.value)})]}),h!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:h}),e.jsxs(f,{justify:"end",gap:2,children:[e.jsx(R,{asChild:!0,children:e.jsx(n,{variant:"ghost",onClick:v,"data-testid":"env-var-form-cancel",children:"Cancel"})}),e.jsx(n,{variant:"primary",onClick:()=>void C(),disabled:l||!r.trim()||!i,"data-testid":"env-var-form-submit",children:d==="add"?"Add":"Save"})]})]})}function Y({onSubmit:d,onCancel:g}){const[c,v]=s.useState(""),[r,m]=s.useState(!1),[i,u]=s.useState(null);return e.jsxs(p,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsx("textarea",{value:c,placeholder:`BIZAR_FOO=bar
7
- BIZAR_BAZ=qux
8
- # comment`,rows:12,"data-testid":"env-vars-bulk-input",onChange:l=>v(l.target.value),style:{background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",color:"var(--fg)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",resize:"vertical"}}),i!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:i}),e.jsxs(f,{justify:"end",gap:2,children:[e.jsx(R,{asChild:!0,children:e.jsx(n,{variant:"ghost",onClick:g,children:"Cancel"})}),e.jsx(n,{variant:"primary",onClick:async()=>{m(!0),u(null);try{await d(c)}catch(l){u((l instanceof k,l.message))}finally{m(!1)}},disabled:r||c.trim()==="","data-testid":"env-vars-bulk-submit",children:r?"Importing…":"Import"})]})]})}export{ce as EnvVarsView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"EnvVarsView-BhcIuJ6V.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/file-up.js","../../src/web/v8/views/EnvVars/EnvVarsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileUp = createLucideIcon(\"FileUp\", [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M12 12v6\", key: \"3ahymv\" }],\n [\"path\", { d: \"m15 15-3-3-3 3\", key: \"15xj92\" }]\n]);\n\nexport { FileUp as default };\n//# sourceMappingURL=file-up.js.map\n","/**\n * v8/views/EnvVars/EnvVarsView.tsx — Sprint S41, v9.3.0.\n *\n * List of env vars (masked values) with: per-row edit (Sheet),\n * per-row delete (inline confirm), Add Sheet, Bulk Import Sheet,\n * and Export trigger. Backed by /api/env-vars + /api/env-vars/grouped\n * + /api/env-vars/export + /api/env-vars/bulk-import.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { Download, FileUp, FlaskConical, Pencil, Plus, RefreshCcw, Trash2, Variable } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Sheet, SheetClose, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface EnvRow {\n name: string;\n value: string;\n createdAt?: string;\n source?: string;\n}\n\nexport function EnvVarsView(): JSX.Element {\n const payload = useFetch<EnvRow[]>('/api/env-vars');\n const [adding, setAdding] = useState<boolean>(false);\n const [editing, setEditing] = useState<string | null>(null);\n const [bulkImporting, setBulkImporting] = useState<boolean>(false);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [testing, setTesting] = useState<string | null>(null);\n const [testResult, setTestResult] = useState<{ name: string; ok: boolean; message: string } | null>(null);\n\n const rows = useMemo<EnvRow[]>(() => payload.data ?? [], [payload.data]);\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n const runTest = async (name: string): Promise<void> => {\n setTesting(name);\n setError(null);\n try {\n const res = await fetchJson<{ ok?: boolean; status?: string; message?: string }>(`/api/env-vars/${encodeURIComponent(name)}/test`, { method: 'POST' });\n setTestResult({ name, ok: res.ok !== false, message: res.message ?? (res.ok !== false ? 'OK' : 'Failed') });\n } catch (err) {\n const msg = err instanceof FetchError ? err.message : (err as Error).message;\n setTestResult({ name, ok: false, message: msg });\n } finally {\n setTesting(null);\n }\n };\n\n const drop = async (name: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/env-vars/${name}`, { method: 'DELETE' });\n setConfirmDelete(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <Stack gap={4} data-testid=\"env-vars-view\">\n <ViewHeader\n title=\"Env vars\"\n description=\"Runtime environment variables for the dashboard. Stored in ~/.config/bizar/env.json (mode 0600).\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"env-vars-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => { window.open('/api/env-vars/export', '_blank'); }} data-testid=\"env-vars-export\">\n <Download size={14} aria-hidden /> Export\n </Button>\n <Button variant=\"ghost\" onClick={() => setBulkImporting(true)} data-testid=\"env-vars-bulk-import\">\n <FileUp size={14} aria-hidden /> Bulk import\n </Button>\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"env-vars-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setAdding(true)} data-testid=\"env-vars-add\">\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n }\n />\n <ListHeader title=\"Variables\" count={rows.length} testid=\"env-vars-list-header\" />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && rows.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 36 }} />\n <Skeleton style={{ height: 36 }} />\n </Stack>\n ) : rows.length === 0 ? (\n <EmptyState\n icon={<Variable size={28} aria-hidden />}\n title=\"No env vars\"\n description=\"Add one or bulk-import a .env file.\"\n />\n ) : (\n <Stack gap={1}>\n {rows.map((r) => {\n const isConfirming = confirmDelete === r.name;\n return (\n <div\n key={r.name}\n data-testid={`env-var-row-${r.name}`}\n style={{\n padding: 'var(--space-2)',\n borderRadius: 'var(--radius-sm)',\n border: '1px solid var(--border)',\n background: 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Stack gap={0} style={{ minWidth: 0 }}>\n <code style={{ fontSize: 'var(--fs-12)' }}>{r.name}</code>\n <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{r.value}</code>\n {r.source && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>\n source: {r.source} {r.createdAt ? `· ${r.createdAt}` : ''}\n </span>\n )}\n </Stack>\n <Inline gap={1}>\n <Button\n variant=\"ghost\"\n onClick={() => void runTest(r.name)}\n disabled={testing === r.name}\n data-testid={`env-var-test-${r.name}`}\n aria-label={`Test ${r.name}`}\n >\n <FlaskConical size={14} aria-hidden />\n </Button>\n <Button variant=\"ghost\" onClick={() => setEditing(r.name)} data-testid={`env-var-edit-${r.name}`} aria-label={`Edit ${r.name}`}>\n <Pencil size={14} aria-hidden />\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmDelete((cur) => (cur === r.name ? null : r.name))}\n data-testid={`env-var-delete-${r.name}`}\n aria-label={`Delete ${r.name}`}\n >\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"danger\" onClick={() => void drop(r.name)} data-testid={`env-var-confirm-delete-${r.name}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(null)} data-testid={`env-var-cancel-delete-${r.name}`}>\n Cancel\n </Button>\n </Inline>\n )}\n {testResult !== null && testResult.name === r.name && (\n <div\n data-testid={`env-var-test-result-${r.name}`}\n style={{\n marginTop: 'var(--space-1)',\n fontSize: 'var(--fs-11)',\n color: testResult.ok ? 'var(--success)' : 'var(--danger)',\n fontFamily: 'var(--font-mono)',\n }}\n >\n test: {testResult.message}\n </div>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={adding} onOpenChange={setAdding}>\n <SheetContent side=\"right\" title=\"Add env var\" description=\"Must match /^BIZAR_[A-Z0-9_]+$/.\">\n <AddEditForm\n mode=\"add\"\n onSubmit={async (name, value) => {\n await fetchJson('/api/env-vars', { method: 'POST', body: { name, value } });\n setAdding(false);\n refresh();\n }}\n onCancel={() => setAdding(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={editing !== null} onOpenChange={(open) => { if (!open) setEditing(null); }}>\n <SheetContent side=\"right\" title=\"Edit env var\" description={editing ?? ''}>\n {editing !== null && (\n <AddEditForm\n mode=\"edit\"\n initialName={editing}\n onSubmit={async (name, value) => {\n await fetchJson(`/api/env-vars/${name}`, { method: 'PUT', body: { value } });\n setEditing(null);\n refresh();\n }}\n onCancel={() => setEditing(null)}\n />\n )}\n </SheetContent>\n </Sheet>\n\n <Sheet open={bulkImporting} onOpenChange={setBulkImporting}>\n <SheetContent side=\"right\" title=\"Bulk import\" description=\"Paste KEY=value lines (one per line, # comments ignored).\">\n <BulkImportForm\n onSubmit={async (envContent) => {\n await fetchJson('/api/env-vars/bulk-import', {\n method: 'POST',\n body: { envContent },\n });\n setBulkImporting(false);\n refresh();\n }}\n onCancel={() => setBulkImporting(false)}\n />\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction AddEditForm({\n mode,\n initialName,\n onSubmit,\n onCancel,\n}: {\n mode: 'add' | 'edit';\n initialName?: string;\n onSubmit: (name: string, value: string) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [name, setName] = useState<string>(initialName ?? '');\n const [value, setValue] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = async (): Promise<void> => {\n if (!name.trim() || !value || busy) return;\n setBusy(true);\n setError(null);\n try {\n await onSubmit(name.trim(), value);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Name</span>\n <Input\n value={name}\n readOnly={mode === 'edit'}\n data-testid=\"env-var-form-name\"\n onChange={(e) => setName((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Value</span>\n <Input\n type=\"password\"\n value={value}\n data-testid=\"env-var-form-value\"\n onChange={(e) => setValue((e.target as HTMLInputElement).value)}\n />\n </label>\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Inline justify=\"end\" gap={2}>\n <SheetClose asChild>\n <Button variant=\"ghost\" onClick={onCancel} data-testid=\"env-var-form-cancel\">Cancel</Button>\n </SheetClose>\n <Button\n variant=\"primary\"\n onClick={() => void submit()}\n disabled={busy || !name.trim() || !value}\n data-testid=\"env-var-form-submit\"\n >\n {mode === 'add' ? 'Add' : 'Save'}\n </Button>\n </Inline>\n </Stack>\n );\n}\n\nfunction BulkImportForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (envContent: string) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [content, setContent] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <textarea\n value={content}\n placeholder={'BIZAR_FOO=bar\\nBIZAR_BAZ=qux\\n# comment'}\n rows={12}\n data-testid=\"env-vars-bulk-input\"\n onChange={(e) => setContent((e.target as HTMLTextAreaElement).value)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n resize: 'vertical',\n }}\n />\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Inline justify=\"end\" gap={2}>\n <SheetClose asChild>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n </SheetClose>\n <Button\n variant=\"primary\"\n onClick={async () => {\n setBusy(true);\n setError(null);\n try { await onSubmit(content); }\n catch (err) { setError(err instanceof FetchError ? err.message : (err as Error).message); }\n finally { setBusy(false); }\n }}\n disabled={busy || content.trim() === ''}\n data-testid=\"env-vars-bulk-submit\"\n >\n {busy ? 'Importing…' : 'Import'}\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["FileUp","createLucideIcon","EnvVarsView","payload","useFetch","adding","setAdding","useState","editing","setEditing","bulkImporting","setBulkImporting","confirmDelete","setConfirmDelete","error","setError","testing","setTesting","testResult","setTestResult","rows","useMemo","refresh","useCallback","runTest","name","res","fetchJson","err","msg","FetchError","drop","jsxs","Stack","jsx","ViewHeader","Inline","Button","Download","RefreshCcw","Plus","ListHeader","Card","CardBody","Skeleton","EmptyState","Variable","r","isConfirming","FlaskConical","Pencil","cur","Trash2","Sheet","SheetContent","AddEditForm","value","open","BulkImportForm","envContent","mode","initialName","onSubmit","onCancel","setName","setValue","busy","setBusy","submit","Input","e","SheetClose","content","setContent"],"mappings":"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","x_google_ignoreList":[0]}