@polderlabs/bizar 10.7.2 → 10.11.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 +95 -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 +51 -15
  50. package/.claude/hooks/worktree-bootstrap.mjs +64 -0
  51. package/.claude/model-router.json +57 -0
  52. package/.claude/settings.json +90 -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":"Switch-B79a2t-G.js","sources":["../../../node_modules/@radix-ui/react-switch/dist/index.mjs","../../src/web/v8/ui/controls/Switch.tsx"],"sourcesContent":["\"use client\";\n\n// src/switch.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { usePrevious } from \"@radix-ui/react-use-previous\";\nimport { useSize } from \"@radix-ui/react-use-size\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar SWITCH_NAME = \"Switch\";\nvar [createSwitchContext, createSwitchScope] = createContextScope(SWITCH_NAME);\nvar [SwitchProviderImpl, useSwitchContext] = createSwitchContext(SWITCH_NAME);\nfunction SwitchProvider(props) {\n const {\n __scopeSwitch,\n checked: checkedProp,\n children,\n defaultChecked,\n disabled,\n form,\n name,\n onCheckedChange,\n required,\n value = \"on\",\n // @ts-expect-error\n internal_do_not_use_render\n } = props;\n const [checked, setChecked] = useControllableState({\n prop: checkedProp,\n defaultProp: defaultChecked ?? false,\n onChange: onCheckedChange,\n caller: SWITCH_NAME\n });\n const [control, setControl] = React.useState(null);\n const [bubbleInput, setBubbleInput] = React.useState(null);\n const hasConsumerStoppedPropagationRef = React.useRef(false);\n const isFormControl = control ? !!form || !!control.closest(\"form\") : (\n // We set this to true by default so that events bubble to forms without JS (SSR)\n true\n );\n const context = {\n checked,\n setChecked,\n disabled,\n control,\n setControl,\n name,\n form,\n value,\n hasConsumerStoppedPropagationRef,\n required,\n defaultChecked,\n isFormControl,\n bubbleInput,\n setBubbleInput\n };\n return /* @__PURE__ */ jsx(SwitchProviderImpl, { scope: __scopeSwitch, ...context, children: isFunction(internal_do_not_use_render) ? internal_do_not_use_render(context) : children });\n}\nvar TRIGGER_NAME = \"SwitchTrigger\";\nvar SwitchTrigger = React.forwardRef(\n ({ __scopeSwitch, onClick, ...switchProps }, forwardedRef) => {\n const {\n control,\n form,\n value,\n disabled,\n checked,\n required,\n setControl,\n setChecked,\n hasConsumerStoppedPropagationRef,\n isFormControl,\n bubbleInput\n } = useSwitchContext(TRIGGER_NAME, __scopeSwitch);\n const composedRefs = useComposedRefs(forwardedRef, setControl);\n const initialCheckedStateRef = React.useRef(checked);\n React.useEffect(() => {\n const associatedForm = form ? control?.ownerDocument.getElementById(form) : control?.form;\n if (associatedForm instanceof HTMLFormElement) {\n const reset = () => setChecked(initialCheckedStateRef.current);\n associatedForm.addEventListener(\"reset\", reset);\n return () => associatedForm.removeEventListener(\"reset\", reset);\n }\n }, [control, form, setChecked]);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"switch\",\n \"aria-checked\": checked,\n \"aria-required\": required,\n \"data-state\": getState(checked),\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n value,\n ...switchProps,\n ref: composedRefs,\n onClick: composeEventHandlers(onClick, (event) => {\n setChecked((prevChecked) => !prevChecked);\n if (bubbleInput && isFormControl) {\n hasConsumerStoppedPropagationRef.current = event.isPropagationStopped();\n if (!hasConsumerStoppedPropagationRef.current) event.stopPropagation();\n }\n })\n }\n );\n }\n);\nSwitchTrigger.displayName = TRIGGER_NAME;\nvar Switch = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeSwitch,\n name,\n checked,\n defaultChecked,\n required,\n disabled,\n value,\n onCheckedChange,\n form,\n ...switchProps\n } = props;\n return /* @__PURE__ */ jsx(\n SwitchProvider,\n {\n __scopeSwitch,\n checked,\n defaultChecked,\n disabled,\n required,\n onCheckedChange,\n name,\n form,\n value,\n internal_do_not_use_render: ({ isFormControl }) => /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n SwitchTrigger,\n {\n ...switchProps,\n ref: forwardedRef,\n __scopeSwitch\n }\n ),\n isFormControl && /* @__PURE__ */ jsx(\n SwitchBubbleInput,\n {\n __scopeSwitch\n }\n )\n ] })\n }\n );\n }\n);\nSwitch.displayName = SWITCH_NAME;\nvar THUMB_NAME = \"SwitchThumb\";\nvar SwitchThumb = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSwitch, ...thumbProps } = props;\n const context = useSwitchContext(THUMB_NAME, __scopeSwitch);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n \"data-state\": getState(context.checked),\n \"data-disabled\": context.disabled ? \"\" : void 0,\n ...thumbProps,\n ref: forwardedRef\n }\n );\n }\n);\nSwitchThumb.displayName = THUMB_NAME;\nvar BUBBLE_INPUT_NAME = \"SwitchBubbleInput\";\nvar SwitchBubbleInput = React.forwardRef(\n ({ __scopeSwitch, ...props }, forwardedRef) => {\n const {\n control,\n hasConsumerStoppedPropagationRef,\n checked,\n defaultChecked,\n required,\n disabled,\n name,\n value,\n form,\n bubbleInput,\n setBubbleInput\n } = useSwitchContext(BUBBLE_INPUT_NAME, __scopeSwitch);\n const composedRefs = useComposedRefs(forwardedRef, setBubbleInput);\n const prevChecked = usePrevious(checked);\n const controlSize = useSize(control);\n React.useEffect(() => {\n const input = bubbleInput;\n if (!input) return;\n const inputProto = window.HTMLInputElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(\n inputProto,\n \"checked\"\n );\n const setChecked = descriptor.set;\n const bubbles = !hasConsumerStoppedPropagationRef.current;\n if (prevChecked !== checked && setChecked) {\n const event = new Event(\"click\", { bubbles });\n setChecked.call(input, checked);\n input.dispatchEvent(event);\n }\n }, [bubbleInput, prevChecked, checked, hasConsumerStoppedPropagationRef]);\n const defaultCheckedRef = React.useRef(checked);\n return /* @__PURE__ */ jsx(\n Primitive.input,\n {\n type: \"checkbox\",\n \"aria-hidden\": true,\n defaultChecked: defaultChecked ?? defaultCheckedRef.current,\n required,\n disabled,\n name,\n value,\n form,\n ...props,\n tabIndex: -1,\n ref: composedRefs,\n style: {\n ...props.style,\n ...controlSize,\n position: \"absolute\",\n pointerEvents: \"none\",\n opacity: 0,\n margin: 0,\n // We transform because the input is absolutely positioned but we have\n // rendered it **after** the button. This pulls it back to sit on top\n // of the button.\n transform: \"translateX(-100%)\"\n }\n }\n );\n }\n);\nSwitchBubbleInput.displayName = BUBBLE_INPUT_NAME;\nfunction isFunction(value) {\n return typeof value === \"function\";\n}\nfunction getState(checked) {\n return checked ? \"checked\" : \"unchecked\";\n}\nexport {\n Switch as Root,\n Switch,\n SwitchThumb,\n SwitchThumb as Thumb,\n createSwitchScope,\n SwitchBubbleInput as unstable_BubbleInput,\n SwitchProvider as unstable_Provider,\n SwitchBubbleInput as unstable_SwitchBubbleInput,\n SwitchProvider as unstable_SwitchProvider,\n SwitchTrigger as unstable_SwitchTrigger,\n SwitchTrigger as unstable_Trigger\n};\n//# sourceMappingURL=index.mjs.map\n","import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport * as RxSwitch from '@radix-ui/react-switch';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Switch — boolean toggle (vs Checkbox which selects).\n *\n * Use for: enable/disable settings, on/off toggles.\n * Built on Radix Switch for a11y.\n */\n\nexport type SwitchProps = ComponentPropsWithoutRef<typeof RxSwitch.Root>;\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(props, ref) {\n const { className, ...rest } = props;\n return (\n <RxSwitch.Root\n ref={ref}\n className={cx('v8-switch', className)}\n style={{\n width: 32,\n height: 18,\n background: 'var(--surface-2)',\n borderRadius: 'var(--radius-pill)',\n position: 'relative',\n border: '1px solid var(--border)',\n cursor: 'pointer',\n transition: 'background var(--motion-fast) var(--ease-out)',\n }}\n {...rest}\n >\n <RxSwitch.Thumb\n style={{\n display: 'block',\n width: 12,\n height: 12,\n background: 'var(--fg)',\n borderRadius: 'var(--radius-pill)',\n transform: 'translateX(2px)',\n transition: 'transform var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)',\n willChange: 'transform',\n }}\n />\n <style>{`\n .v8-switch[data-state='checked'] {\n background: var(--accent);\n border-color: var(--accent);\n }\n .v8-switch[data-state='checked'] > span {\n transform: translateX(16px);\n background: var(--fg-on-accent);\n }\n `}</style>\n </RxSwitch.Root>\n );\n});"],"names":["SWITCH_NAME","createSwitchContext","createContextScope","SwitchProviderImpl","useSwitchContext","SwitchProvider","props","__scopeSwitch","checkedProp","children","defaultChecked","disabled","form","name","onCheckedChange","required","value","internal_do_not_use_render","checked","setChecked","useControllableState","control","setControl","React.useState","bubbleInput","setBubbleInput","hasConsumerStoppedPropagationRef","React.useRef","isFormControl","context","jsx","isFunction","TRIGGER_NAME","SwitchTrigger","React.forwardRef","onClick","switchProps","forwardedRef","composedRefs","useComposedRefs","initialCheckedStateRef","React.useEffect","associatedForm","reset","Primitive","getState","composeEventHandlers","event","prevChecked","Switch","jsxs","Fragment","SwitchBubbleInput","THUMB_NAME","SwitchThumb","thumbProps","BUBBLE_INPUT_NAME","usePrevious","controlSize","useSize","input","inputProto","bubbles","defaultCheckedRef","forwardRef","ref","className","rest","RxSwitch.Root","cx","RxSwitch.Thumb"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,6 +0,0 @@
1
- import{r,j as e}from"./cmdk-C3F6LD6N.js";import{d as me,B as A,e as ge,X as re,f as pe,g as fe,S as f,I as U,b as J,h as ee,i as N,u as ve,a as G,F as ke}from"./main-BRmJZcHt.js";import{V as xe}from"./ViewHeader-BsnaspKw.js";import{I as ye,K as be,a as je,u as Se,b as Ce}from"./AgentActivity-DBWDByjk.js";import"./Grid-Bojq8Sg7.js";import{I as K}from"./Input-DV-vdaV8.js";import{T as te}from"./Textarea-BfXGMXQ7.js";import"./Switch-B79a2t-G.js";import{S as ie,a as ne,b as oe,c as le}from"./Select-Bf_P0S6H.js";import"./Slider-AjjzqI-5.js";import"./Alert-pzFISNtS.js";import"./Banner-Du-3l05O.js";import"./EmptyState-ccT__JZG.js";import{S as ce,a as ue}from"./Sheet-BwMVGN-8.js";import"./Card-Clkvh43Q.js";import"./Chip-B7ovcm01.js";import"./Avatar-CRW81ewE.js";import"./ActivityFeed-Bw4Cai7r.js";import"./Sparkline-Z4y0YUZS.js";import{T as he}from"./trash-2-B_Y6HrfN.js";import{F as we}from"./filter-Do63x17E.js";import{P as ae}from"./plus-Cps-8lcG.js";import"./ProgressBar-KC4VXsl_.js";import"./SettingsRow-CJb-F94Y.js";import"./MessageBubble-CrCJ0SYG.js";import"./dnd-kit-BAOLODOI.js";import"./calendar-CAZoDd-l.js";import"./index-B1OIS316.js";import"./index-CR0TeJmc.js";import"./circle-alert-QQTU4Quz.js";import"./triangle-alert-BeY8LAv6.js";import"./circle-check-BMbe7Kkr.js";import"./trending-up-qKTUQKIT.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 Ie=me("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);function Te(o){const{totalCount:t,visibleCount:m,selectedCount:w,query:x,onQueryChange:p,filters:g,onFilterToggle:u,onClearFilters:l,onNewTask:v,onBulkMove:d,onBulkArchive:y,onBulkDelete:h,onClearSelection:b,className:I}=o,[P,$]=r.useState(!1),R=w>0;return e.jsx("div",{className:fe("v8-kanban-toolbar",I),style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"var(--space-2)",padding:"var(--space-2) var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius)"},children:R?e.jsxs(e.Fragment,{children:[e.jsxs("span",{style:{fontSize:"var(--fs-13)",fontWeight:600,color:"var(--fg)"},children:[w," selected"]}),e.jsx("span",{style:{flex:1}}),d!==void 0&&e.jsx(A,{size:"sm",variant:"secondary",leftIcon:e.jsx(Ie,{size:14,"aria-hidden":"true"}),onClick:()=>d(new Set),children:"Move…"}),y!==void 0&&e.jsx(A,{size:"sm",variant:"secondary",leftIcon:e.jsx(ge,{size:14,"aria-hidden":"true"}),onClick:()=>y(new Set),children:"Archive"}),h!==void 0&&e.jsx(A,{size:"sm",variant:"danger",leftIcon:e.jsx(he,{size:14,"aria-hidden":"true"}),onClick:()=>h(new Set),children:"Delete"}),b!==void 0&&e.jsx(ye,{"aria-label":"Clear selection",onClick:b,size:"sm",children:e.jsx(re,{size:14,"aria-hidden":"true"})})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"0 var(--space-2)",height:32,background:"var(--input-bg)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",minWidth:220,flex:"1 1 220px",maxWidth:360},children:[e.jsx(pe,{size:14,"aria-hidden":"true",style:{color:"var(--fg-muted)",flexShrink:0}}),e.jsx("input",{type:"search",value:x,placeholder:"Filter tasks…",onChange:k=>p(k.target.value),onFocus:()=>$(!0),onBlur:()=>$(!1),"aria-label":"Filter tasks",style:{flex:1,minWidth:0,border:0,outline:0,background:"transparent",color:"var(--fg)",fontSize:"var(--fs-13)",fontFamily:"inherit"}}),x!==""&&e.jsx("button",{type:"button",onClick:()=>p(""),"aria-label":"Clear search",style:{background:"transparent",border:0,padding:2,color:"var(--fg-muted)",cursor:"pointer",display:"inline-flex"},children:e.jsx(re,{size:12,"aria-hidden":"true"})})]}),g.length>0&&e.jsxs("div",{role:"toolbar","aria-label":"Task filters",style:{display:"flex",alignItems:"center",gap:4,flexWrap:"wrap"},children:[e.jsx(we,{size:12,"aria-hidden":"true",style:{color:"var(--fg-muted)",marginRight:2}}),g.map(k=>{const F=k.tone??"neutral",B=k.id.startsWith("active:"),S=B?k.id.slice(7):k.id,C=B;return e.jsxs("button",{type:"button",onClick:()=>u(S),"aria-pressed":C,style:{display:"inline-flex",alignItems:"center",gap:4,height:26,padding:"0 var(--space-2)",borderRadius:"var(--radius-pill)",border:`1px solid var(--${C?"accent":"border"})`,background:C?"color-mix(in oklch, var(--accent) 14%, transparent)":"transparent",color:"var(--fg-muted)",fontSize:"var(--fs-12)",fontWeight:500,cursor:"pointer"},children:[e.jsx("span",{"aria-hidden":"true",style:{width:6,height:6,borderRadius:"var(--radius-pill)",background:F==="neutral"?"var(--fg-muted)":`var(--${F})`}}),k.label]},k.id)}),g.some(k=>k.id.startsWith("active:"))&&e.jsx("button",{type:"button",onClick:l,style:{background:"transparent",border:0,color:"var(--fg-muted)",fontSize:"var(--fs-12)",cursor:"pointer",padding:"0 var(--space-2)",height:26},children:"Clear"})]}),e.jsx("span",{style:{flex:1}}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:m===t?`${t} task${t===1?"":"s"}`:`${m} of ${t}`}),v!==void 0&&e.jsx(A,{size:"sm",variant:"primary",leftIcon:e.jsx(ae,{size:14,"aria-hidden":"true"}),onClick:v,children:"New task"})]})})}function ze(){const[o,t]=r.useState(()=>new Set),m=r.useCallback(l=>{t(v=>{const d=new Set(v);return d.has(l)?d.delete(l):d.add(l),d})},[]),w=r.useCallback(l=>{l.length!==0&&t(v=>{const d=new Set(v);for(const y of l)d.add(y);return d})},[]),x=r.useCallback(l=>{l.length!==0&&t(v=>{const d=new Set(v);for(const y of l)d.delete(y);return d})},[]),p=r.useCallback(l=>{t(new Set(l))},[]),g=r.useCallback(()=>{t(l=>l.size===0?l:new Set)},[]);r.useEffect(()=>{const l=v=>{if(v.key!=="Escape")return;const d=v.target;if(d){const y=d.tagName;if(y==="INPUT"||y==="TEXTAREA"||d.isContentEditable)return}g()};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[g]);const u=r.useCallback(l=>o.has(l),[o]);return r.useMemo(()=>({selected:o,has:u,toggle:m,add:w,remove:x,set:p,clear:g}),[o,u,m,w,x,p,g])}const Fe=[{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"},{value:"urgent",label:"Urgent"}],De=[{value:"queued",label:"Backlog"},{value:"doing",label:"In progress"},{value:"blocked",label:"In review"},{value:"done",label:"Done"},{value:"archived",label:"Archived"}];function Ae(o){var T,O;const{task:t,open:m,onOpenChange:w,onDeleted:x}=o,[p,g]=r.useState(t.title),[u,l]=r.useState(t.description||""),[v,d]=r.useState(t.priority||"medium"),[y,h]=r.useState(t.status||"queued"),[b,I]=r.useState(t.assignee||""),[P,$]=r.useState(t.due||""),[R,k]=r.useState(t.branch||""),[F,B]=r.useState(""),[S,C]=r.useState(null),[W,M]=r.useState(null),[q,E]=r.useState(null),[H,V]=r.useState(!1);r.useEffect(()=>{m&&(g(t.title),l(t.description||""),d(t.priority||"medium"),h(t.status||"queued"),I(t.assignee||""),$(t.due||""),k(t.branch||""),B(""),M(null),E(null))},[m,t]);const D=async(a,z)=>{C(z),M(null),E(null);try{await N(`/api/tasks/${encodeURIComponent(t.id)}`,{method:"PATCH",body:a}),M(`${z} saved.`)}catch(Y){E(Y instanceof Error?Y.message:String(Y))}finally{C(null)}},X=()=>{p.trim()&&p!==t.title&&D({title:p.trim()},"Title")},Q=()=>{u!==(t.description||"")&&D({description:u},"Description")},_=a=>{d(a),a!==t.priority&&D({priority:a},"Priority")},s=a=>{h(a),a!==t.status&&D({status:a},"Status")},i=()=>{const a=b.trim();a!==(t.assignee||"")&&D({assignee:a},"Assignee")},n=()=>{const a=P.trim();a!==(t.due||"")&&D({due:a},"Due")},c=()=>{const a=R.trim();a!==(t.branch||"")&&D({branch:a},"Branch")},L=async()=>{const a=F.trim();if(a){C("comment"),E(null);try{await N(`/api/tasks/${encodeURIComponent(t.id)}/comments`,{method:"POST",body:{text:a}}),B(""),M("Comment added.")}catch(z){E(z instanceof Error?z.message:String(z))}finally{C(null)}}},j=async()=>{if(!(typeof window<"u"&&typeof window.confirm=="function")||window.confirm(`Delete task "${t.title}"? This is irreversible.`)){V(!0);try{await N(`/api/tasks/${encodeURIComponent(t.id)}`,{method:"DELETE"}),x==null||x(),w(!1)}catch(z){E(z instanceof Error?z.message:String(z)),V(!1)}}};return e.jsx(ce,{open:m,onOpenChange:w,children:e.jsx(ue,{side:"right",title:"Edit task",children:e.jsxs(f,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs(f,{gap:2,children:[e.jsx("label",{htmlFor:"task-title",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title"}),e.jsx(K,{id:"task-title",value:p,onChange:a=>g(a.target.value),onBlur:X,disabled:S!==null})]}),e.jsxs(f,{gap:2,children:[e.jsx("label",{htmlFor:"task-status",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Status"}),e.jsxs(ie,{value:y,onValueChange:s,children:[e.jsx(ne,{id:"task-status",size:"sm",placeholder:"Status"}),e.jsx(oe,{children:De.map(a=>e.jsx(le,{value:a.value,children:a.label},a.value))})]})]}),e.jsxs(U,{gap:2,children:[e.jsxs(f,{gap:2,style:{flex:1},children:[e.jsx("label",{htmlFor:"task-priority",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Priority"}),e.jsxs(ie,{value:v,onValueChange:_,children:[e.jsx(ne,{id:"task-priority",size:"sm",placeholder:"Priority"}),e.jsx(oe,{children:Fe.map(a=>e.jsx(le,{value:a.value,children:a.label},a.value))})]})]}),e.jsxs(f,{gap:2,style:{flex:1},children:[e.jsx("label",{htmlFor:"task-due",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Due"}),e.jsx(K,{id:"task-due",type:"date",value:P?P.slice(0,10):"",onChange:a=>$(a.target.value),onBlur:n,disabled:S!==null})]})]}),e.jsxs(U,{gap:2,children:[e.jsxs(f,{gap:2,style:{flex:1},children:[e.jsx("label",{htmlFor:"task-assignee",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Assignee"}),e.jsx(K,{id:"task-assignee",value:b,onChange:a=>I(a.target.value),onBlur:i,placeholder:"agent name (blank = unassigned)",disabled:S!==null})]}),e.jsxs(f,{gap:2,style:{flex:1},children:[e.jsx("label",{htmlFor:"task-branch",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Branch"}),e.jsx(K,{id:"task-branch",value:R,onChange:a=>k(a.target.value),onBlur:c,placeholder:"feature/foo",disabled:S!==null})]})]}),e.jsxs(f,{gap:2,children:[e.jsx("label",{htmlFor:"task-description",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Description"}),e.jsx(te,{id:"task-description",rows:5,value:u,onChange:a=>l(a.target.value),onBlur:Q,disabled:S!==null,placeholder:"What's the work, why, how to verify…"})]}),e.jsxs(f,{gap:2,children:[e.jsx("label",{htmlFor:"task-comment",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Add comment"}),e.jsxs(U,{gap:2,align:"start",children:[e.jsx(te,{id:"task-comment",rows:2,value:F,onChange:a=>B(a.target.value),placeholder:"Leave a progress note…",disabled:S!==null,style:{flex:1}}),e.jsxs(A,{variant:"secondary",onClick:()=>{L()},disabled:!F.trim()||S!==null,children:[e.jsx(ae,{size:14,"aria-hidden":!0})," Comment"]})]})]}),e.jsxs(f,{gap:2,children:[e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Metadata"}),e.jsxs(U,{gap:1,wrap:!0,children:[((T=t.metadata)==null?void 0:T.goalId)!==void 0&&typeof t.metadata.goalId=="string"&&e.jsxs(J,{tone:"info",title:`Linked to goal ${String(t.metadata.goalId)}`,children:["goal: ",String(t.metadata.goalId)]}),((O=t.metadata)==null?void 0:O.krId)!==void 0&&typeof t.metadata.krId=="string"&&e.jsxs(J,{tone:"info",title:`Linked to KR ${String(t.metadata.krId)}`,children:["kr: ",String(t.metadata.krId)]}),t.id&&e.jsxs(J,{tone:"neutral",title:t.id,children:["id: ",t.id]})]})]}),e.jsx("div",{style:{borderTop:"1px solid var(--border)",paddingTop:"var(--space-3)"},children:e.jsxs(A,{variant:"danger",onClick:()=>{j()},disabled:H||S!==null,children:[e.jsx(he,{size:14,"aria-hidden":!0})," ",H?"Deleting…":"Delete task"]})}),W!==null&&e.jsx("div",{role:"status",style:{fontSize:"var(--fs-12)",color:"var(--success)"},children:W}),q!==null&&e.jsx("div",{role:"alert",style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:q}),S!==null&&e.jsx(ee,{style:{height:12}})]})})})}const Z=[{id:"backlog",title:"Backlog",accentTone:"neutral"},{id:"queued",title:"Queued",accentTone:"info"},{id:"doing",title:"In progress",accentTone:"accent",wipLimit:5},{id:"blocked",title:"In review",accentTone:"warning"},{id:"done",title:"Done",accentTone:"success"},{id:"archived",title:"Archived",accentTone:"neutral"}],Be={low:"low",medium:"medium",high:"high",urgent:"urgent"};function de(o){return{id:o.id,taskId:o.id,columnId:se(o.status),title:o.title,priority:Be[o.priority||"medium"]||"medium",branch:o.branch,due:o.due,comments:o.comments,attachments:o.attachments}}function se(o){switch(o){case"backlog":case"queued":case"doing":case"blocked":case"done":case"archived":return o;default:return"backlog"}}function Ee({card:o}){const t=Se(o.id);return e.jsx(Ce,{card:o,isDragging:t.isDragging,dragHandleProps:{...t.attributes,...t.listeners,ref:t.setNodeRef,style:t.style}})}function mt(){var Q,_;const o=ve("/api/tasks"),[t,m]=r.useState([]),[w,x]=r.useState(null),[p,g]=r.useState(null),u=ze(),[l,v]=r.useState(""),[d,y]=r.useState(new Set),[h,b]=r.useState(null),[I,P]=r.useState(!1),$=async()=>{if(!(h===null||!h.title.trim())){P(!0);try{await N("/api/tasks",{method:"POST",body:{title:h.title.trim(),description:h.description,priority:h.priority,status:"queued"}}),b(null),o.refetch()}catch(s){x((s instanceof ke,s.message))}finally{P(!1)}}},R=r.useCallback(s=>{const i=s;i.type!=="tasks:removed"&&i.type!=="task:removed"||i.id&&(m(n=>n.filter(c=>c.taskId!==i.id)),u.remove([i.id]),p===i.id&&g(null))},[p,u]);G("tasks:removed",R),G("task:removed",R);const k=s=>{u.toggle(s)},F=async s=>{const i=Array.from(u.selected);if(i.length!==0){m(n=>n.map(c=>u.has(c.taskId)?{...c,columnId:s}:c));try{await N("/api/tasks/bulk-status",{method:"PATCH",body:{ids:i,status:s}}),u.clear()}catch(n){x(n instanceof Error?n.message:String(n))}}};r.useEffect(()=>{var s;(s=o.data)!=null&&s.tasks&&m(o.data.tasks.map(de))},[o.data]);const B=r.useCallback(s=>{if(s.type!=="tasks:change")return;const i=s.task;i&&m(n=>{const c=n.findIndex(T=>T.taskId===i.id),L=de({...i,status:se(i.status)});if(c===-1)return[...n,L];const j=n.slice();return j[c]={...j[c],...L},j})},[]);G("tasks:change",B);const S=r.useCallback(async(s,i,n)=>{const c=t.find(j=>j.taskId===s||j.id===s);if(!c)return;const L=se(n);m(j=>j.map(T=>T.taskId===s?{...T,columnId:L}:T));try{await N(`/api/tasks/${encodeURIComponent(c.taskId)}/status`,{method:"PATCH",body:{status:L}})}catch(j){x(j instanceof Error?j.message:String(j)),m(T=>T.map(O=>O.taskId===s?{...O,columnId:c.columnId}:O))}},[t]),C={};for(const s of t)C[s.columnId]=(C[s.columnId]||0)+1;const W=p?((_=(Q=o.data)==null?void 0:Q.tasks)==null?void 0:_.find(s=>s.id===p))??null:null,M=u.selected.size,q=r.useMemo(()=>{const s=l.trim().toLowerCase();return t.filter(i=>{if(d.size>0&&d.has(`status:${i.columnId}`)===!1){const n=i.priority!==void 0&&d.has(`priority:${i.priority}`),c=d.has(`status:${i.columnId}`);if(!n&&!c)return!1}return!(s!==""&&`${i.title} ${i.description??""}`.toLowerCase().includes(s)===!1)})},[t,l,d]),E=[{id:"priority:low",label:"Low",tone:"neutral"},{id:"priority:medium",label:"Medium",tone:"info"},{id:"priority:high",label:"High",tone:"warning"},{id:"priority:urgent",label:"Urgent",tone:"danger"}],H=Z.map(s=>({id:`status:${s.id}`,label:s.title})),V=[...E,...H],D=r.useCallback(s=>{y(i=>{const n=new Set(i);return n.has(s)?n.delete(s):n.add(s),n})},[]),X=r.useCallback(()=>y(new Set),[]);return e.jsxs(f,{gap:4,"data-testid":"tasks-view",children:[e.jsx(xe,{title:"Tasks",description:"Drag cards across columns. Click a card to edit. Use the checkbox to select multiple.",actions:e.jsxs(U,{gap:2,align:"center",children:[w!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:w}),e.jsxs(A,{variant:"primary",onClick:()=>b({title:"",description:"",priority:"medium"}),"data-testid":"task-create-open",children:[e.jsx(ae,{size:14,"aria-hidden":!0})," New task"]})]})}),M>0&&e.jsx(Te,{totalCount:t.length,visibleCount:q.length,selectedCount:M,query:l,onQueryChange:v,filters:V,onFilterToggle:D,onClearFilters:X,onNewTask:()=>b({title:"",description:"",priority:"medium"}),onBulkMove:()=>void F("doing"),onBulkArchive:()=>void F("archived"),onBulkDelete:async()=>{const s=Array.from(u.selected);if(s.length!==0&&window.confirm(`Delete ${s.length} task${s.length===1?"":"s"}? This cannot be undone.`))try{await N("/api/tasks/bulk-status",{method:"PATCH",body:{ids:s,status:"archived"}}),u.clear()}catch(i){x(i instanceof Error?i.message:String(i))}},onClearSelection:()=>u.clear()}),o.loading&&t.length===0?e.jsxs(f,{gap:3,children:[e.jsx(ee,{style:{height:120}}),e.jsx(ee,{style:{height:120}})]}):e.jsx(be,{columns:Z,onCardMove:S,children:Z.map(s=>{const i=q.filter(n=>n.columnId===s.id);return e.jsx(je,{column:{...s,count:C[s.id]||0},children:i.map(n=>e.jsxs("div",{style:{position:"relative"},children:[e.jsx("input",{type:"checkbox",checked:u.has(n.taskId),onChange:()=>k(n.taskId),onClick:c=>c.stopPropagation(),"aria-label":`Select ${n.title}`,style:{position:"absolute",top:8,left:8,zIndex:2}}),e.jsx("div",{onClick:()=>g(n.taskId),role:"button",tabIndex:0,onKeyDown:c=>{(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),g(n.taskId))},style:{cursor:"pointer"},children:e.jsx(Ee,{card:n})})]},n.id))},s.id)})}),W&&e.jsx(Ae,{task:W,open:p!==null,onOpenChange:s=>{s||g(null)},onDeleted:()=>{m(s=>s.filter(i=>i.taskId!==W.id)),g(null)}}),e.jsx(ce,{open:h!==null,onOpenChange:s=>{s||b(null)},children:e.jsx(ue,{side:"right",title:"New task",children:h!==null&&e.jsxs(f,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs(f,{gap:2,children:[e.jsx("label",{htmlFor:"task-create-title",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title"}),e.jsx(K,{id:"task-create-title",value:h.title,onChange:s=>b({...h,title:s.target.value}),placeholder:"What needs doing?",disabled:I,"data-testid":"task-create-title"})]}),e.jsxs(f,{gap:2,children:[e.jsx("label",{htmlFor:"task-create-desc",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Description (optional)"}),e.jsx(te,{id:"task-create-desc",value:h.description,onChange:s=>b({...h,description:s.target.value}),rows:4,disabled:I,"data-testid":"task-create-desc"})]}),e.jsxs(f,{gap:2,children:[e.jsx("label",{htmlFor:"task-create-priority",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Priority"}),e.jsxs("select",{id:"task-create-priority",value:h.priority,onChange:s=>b({...h,priority:s.target.value}),disabled:I,"data-testid":"task-create-priority",style:{height:32,padding:"0 var(--space-2)",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--surface-0)",color:"var(--fg)",fontSize:"var(--fs-13)"},children:[e.jsx("option",{value:"low",children:"Low"}),e.jsx("option",{value:"medium",children:"Medium"}),e.jsx("option",{value:"high",children:"High"}),e.jsx("option",{value:"urgent",children:"Urgent"})]})]}),e.jsxs(U,{gap:2,children:[e.jsx(A,{variant:"primary",onClick:()=>{$()},disabled:I||!h.title.trim(),"data-testid":"task-create-submit",children:"Create task"}),e.jsx(A,{variant:"ghost",onClick:()=>b(null),disabled:I,children:"Cancel"})]})]})})})]})}export{mt as TasksView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"TasksView-G-s_pwwr.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/arrow-right.js","../../src/web/v8/ui/kanban/KanbanToolbar.tsx","../../src/web/v8/ui/kanban/useKanbanSelection.ts","../../src/web/v8/ui/tasks/TaskDetail.tsx","../../src/web/v8/views/Tasks/TasksView.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 ArrowRight = createLucideIcon(\"ArrowRight\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n]);\n\nexport { ArrowRight as default };\n//# sourceMappingURL=arrow-right.js.map\n","import { useState, type ChangeEvent, type ReactNode } from 'react';\nimport { Plus, Search, Trash2, Archive, ArrowRight, X, Filter } from 'lucide-react';\nimport { Button } from '../controls/Button.js';\nimport { IconButton } from '../controls/IconButton.js';\nimport { cx } from '../utils/cx.js';\n\n/**\n * KanbanToolbar — top-of-board toolbar.\n *\n * Three modes:\n * - normal: search input + filter chips + \"New task\" button.\n * - selecting: replaces the action row with N-selected count +\n * bulk-actions (Move / Archive / Delete).\n * - filtered: shows a \"Clear filters\" pill next to the search.\n *\n * Consumers control query state via callbacks. The toolbar keeps no\n * internal search/filter state of its own — that lives in the view\n * so the board can re-derive visible cards.\n */\n\nexport interface KanbanFilter {\n /** Stable filter id; used as the chip key + for clearing. */\n id: string;\n /** Visible chip label (e.g. \"High priority\"). */\n label: ReactNode;\n /** Optional tone for the chip. */\n tone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger' | 'accent';\n}\n\nexport interface KanbanToolbarProps {\n /** Total number of cards on the board (for \"showing X of Y\"). */\n totalCount: number;\n /** Number of cards currently visible after filtering. */\n visibleCount: number;\n /** Number of selected cards. When >0, the toolbar swaps to bulk mode. */\n selectedCount: number;\n\n /** Free-text search. */\n query: string;\n onQueryChange: (value: string) => void;\n\n /** Active filters. */\n filters: readonly KanbanFilter[];\n onFilterToggle: (filterId: string) => void;\n onClearFilters: () => void;\n\n /** New-task action. Hidden when the toolbar is in bulk mode. */\n onNewTask?: () => void;\n\n /** Bulk actions, shown only when selectedCount > 0. */\n onBulkMove?: (selectedIds: ReadonlySet<string>) => void;\n onBulkArchive?: (selectedIds: ReadonlySet<string>) => void;\n onBulkDelete?: (selectedIds: ReadonlySet<string>) => void;\n onClearSelection?: () => void;\n\n className?: string;\n}\n\nexport function KanbanToolbar(props: KanbanToolbarProps): JSX.Element {\n const {\n totalCount,\n visibleCount,\n selectedCount,\n query,\n onQueryChange,\n filters,\n onFilterToggle,\n onClearFilters,\n onNewTask,\n onBulkMove,\n onBulkArchive,\n onBulkDelete,\n onClearSelection,\n className,\n } = props;\n\n const [searchFocused, setSearchFocused] = useState(false);\n const isBulk = selectedCount > 0;\n\n return (\n <div\n className={cx('v8-kanban-toolbar', className)}\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 'var(--space-2)',\n padding: 'var(--space-2) var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n }}\n >\n {isBulk ? (\n <>\n <span\n style={{\n fontSize: 'var(--fs-13)',\n fontWeight: 600,\n color: 'var(--fg)',\n }}\n >\n {selectedCount} selected\n </span>\n <span style={{ flex: 1 }} />\n {onBulkMove !== undefined && (\n <Button size=\"sm\" variant=\"secondary\" leftIcon={<ArrowRight size={14} aria-hidden=\"true\" />} onClick={() => onBulkMove(new Set())}>\n Move…\n </Button>\n )}\n {onBulkArchive !== undefined && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n leftIcon={<Archive size={14} aria-hidden=\"true\" />}\n onClick={() => onBulkArchive(new Set())}\n >\n Archive\n </Button>\n )}\n {onBulkDelete !== undefined && (\n <Button\n size=\"sm\"\n variant=\"danger\"\n leftIcon={<Trash2 size={14} aria-hidden=\"true\" />}\n onClick={() => onBulkDelete(new Set())}\n >\n Delete\n </Button>\n )}\n {onClearSelection !== undefined && (\n <IconButton aria-label=\"Clear selection\" onClick={onClearSelection} size=\"sm\">\n <X size={14} aria-hidden=\"true\" />\n </IconButton>\n )}\n </>\n ) : (\n <>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '0 var(--space-2)',\n height: 32,\n background: 'var(--input-bg)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n minWidth: 220,\n flex: '1 1 220px',\n maxWidth: 360,\n }}\n >\n <Search size={14} aria-hidden=\"true\" style={{ color: 'var(--fg-muted)', flexShrink: 0 }} />\n <input\n type=\"search\"\n value={query}\n placeholder=\"Filter tasks…\"\n onChange={(e: ChangeEvent<HTMLInputElement>) => onQueryChange(e.target.value)}\n onFocus={() => setSearchFocused(true)}\n onBlur={() => setSearchFocused(false)}\n aria-label=\"Filter tasks\"\n style={{\n flex: 1,\n minWidth: 0,\n border: 0,\n outline: 0,\n background: 'transparent',\n color: 'var(--fg)',\n fontSize: 'var(--fs-13)',\n fontFamily: 'inherit',\n }}\n />\n {query !== '' && (\n <button\n type=\"button\"\n onClick={() => onQueryChange('')}\n aria-label=\"Clear search\"\n style={{\n background: 'transparent',\n border: 0,\n padding: 2,\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n display: 'inline-flex',\n }}\n >\n <X size={12} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n {filters.length > 0 && (\n <div\n role=\"toolbar\"\n aria-label=\"Task filters\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n flexWrap: 'wrap',\n }}\n >\n <Filter\n size={12}\n aria-hidden=\"true\"\n style={{ color: 'var(--fg-muted)', marginRight: 2 }}\n />\n {filters.map((f) => {\n const tone = f.tone ?? 'neutral';\n const isActive = f.id.startsWith('active:');\n // Display rule: callers prepend \"active:\" when toggled on.\n const actualId = isActive ? f.id.slice('active:'.length) : f.id;\n const active = isActive;\n return (\n <button\n key={f.id}\n type=\"button\"\n onClick={() => onFilterToggle(actualId)}\n aria-pressed={active}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n height: 26,\n padding: '0 var(--space-2)',\n borderRadius: 'var(--radius-pill)',\n border: `1px solid var(--${active ? 'accent' : 'border'})`,\n background: active ? 'color-mix(in oklch, var(--accent) 14%, transparent)' : 'transparent',\n color: 'var(--fg-muted)',\n fontSize: 'var(--fs-12)',\n fontWeight: 500,\n cursor: 'pointer',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n width: 6,\n height: 6,\n borderRadius: 'var(--radius-pill)',\n background:\n tone === 'neutral'\n ? 'var(--fg-muted)'\n : `var(--${tone})`,\n }}\n />\n {f.label}\n </button>\n );\n })}\n {filters.some((f) => f.id.startsWith('active:')) && (\n <button\n type=\"button\"\n onClick={onClearFilters}\n style={{\n background: 'transparent',\n border: 0,\n color: 'var(--fg-muted)',\n fontSize: 'var(--fs-12)',\n cursor: 'pointer',\n padding: '0 var(--space-2)',\n height: 26,\n }}\n >\n Clear\n </button>\n )}\n </div>\n )}\n <span style={{ flex: 1 }} />\n <span\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {visibleCount === totalCount\n ? `${totalCount} task${totalCount === 1 ? '' : 's'}`\n : `${visibleCount} of ${totalCount}`}\n </span>\n {onNewTask !== undefined && (\n <Button size=\"sm\" variant=\"primary\" leftIcon={<Plus size={14} aria-hidden=\"true\" />} onClick={onNewTask}>\n New task\n </Button>\n )}\n </>\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\n\n/**\n * useKanbanSelection — track a Set<string> of selected card ids with\n * a small set of helpers, plus an Esc-to-clear keyboard shortcut.\n *\n * Designed for the kanban board's multi-select toolbar. Selection is\n * kept in component state so the board can hand it to the toolbar +\n * card checkbox without prop-drilling.\n */\n\nexport interface UseKanbanSelectionApi {\n /** Current selection. Use `.size` for the count. */\n selected: ReadonlySet<string>;\n /** True iff `id` is in the selection. */\n has: (id: string) => boolean;\n /** Add or remove a single id. */\n toggle: (id: string) => void;\n /** Add ids (no-op if already present). */\n add: (ids: readonly string[]) => void;\n /** Remove ids. */\n remove: (ids: readonly string[]) => void;\n /** Replace the whole selection. */\n set: (ids: readonly string[]) => void;\n /** Drop everything. */\n clear: () => void;\n}\n\nexport function useKanbanSelection(): UseKanbanSelectionApi {\n const [selected, setSelected] = useState<ReadonlySet<string>>(() => new Set());\n\n const toggle = useCallback((id: string) => {\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const add = useCallback((ids: readonly string[]) => {\n if (ids.length === 0) return;\n setSelected((prev) => {\n const next = new Set(prev);\n for (const id of ids) next.add(id);\n return next;\n });\n }, []);\n\n const remove = useCallback((ids: readonly string[]) => {\n if (ids.length === 0) return;\n setSelected((prev) => {\n const next = new Set(prev);\n for (const id of ids) next.delete(id);\n return next;\n });\n }, []);\n\n const set = useCallback((ids: readonly string[]) => {\n setSelected(new Set(ids));\n }, []);\n\n const clear = useCallback(() => {\n setSelected((prev) => (prev.size === 0 ? prev : new Set()));\n }, []);\n\n // Esc clears selection, but only when focus is not inside a text\n // input/textarea/contenteditable (so the user can still press Esc\n // inside an editor).\n useEffect(() => {\n const onKey = (ev: KeyboardEvent) => {\n if (ev.key !== 'Escape') return;\n const target = ev.target as HTMLElement | null;\n if (target) {\n const tag = target.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || target.isContentEditable) return;\n }\n clear();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [clear]);\n\n const has = useCallback((id: string) => selected.has(id), [selected]);\n\n return useMemo(\n () => ({ selected, has, toggle, add, remove, set, clear }),\n [selected, has, toggle, add, remove, set, clear],\n );\n}\n","import { useEffect, useState } from 'react';\nimport { Plus, Trash2 } from 'lucide-react';\nimport { Sheet, SheetContent } from '../feedback/Sheet.js';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Button } from '../controls/Button.js';\nimport { Input } from '../controls/Input.js';\nimport { Textarea } from '../controls/Textarea.js';\nimport { Select, SelectContent, SelectItem, SelectTrigger } from '../controls/Select.js';\nimport { Skeleton } from '../feedback/Skeleton.js';\nimport { Badge } from '../data/Badge.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport type { Task } from '../../data/types.js';\n\n/**\n * TaskDetail — right-side Drawer for editing a single task. Sprint S17.\n *\n * Source-of-truth lives on the backend (tasks-store). Each edit PATCHes\n * `/api/tasks/:id` and the server re-broadcasts the canonical state via\n * `tasks:change`. The Drawer stays open while the WS round-trip resolves\n * so optimistic UI + canonical merge feels seamless.\n */\n\nconst PRIORITY_OPTIONS = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n { value: 'urgent', label: 'Urgent' },\n];\n\nconst STATUS_OPTIONS = [\n { value: 'queued', label: 'Backlog' },\n { value: 'doing', label: 'In progress' },\n { value: 'blocked', label: 'In review' },\n { value: 'done', label: 'Done' },\n { value: 'archived', label: 'Archived' },\n];\n\nexport interface TaskDetailProps {\n task: Task;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onDeleted?: () => void;\n}\n\nexport function TaskDetail(props: TaskDetailProps): JSX.Element {\n const { task, open, onOpenChange, onDeleted } = props;\n const [title, setTitle] = useState<string>(task.title);\n const [description, setDescription] = useState<string>(task.description || '');\n const [priority, setPriority] = useState<string>(task.priority || 'medium');\n const [status, setStatus] = useState<string>(task.status || 'queued');\n const [assignee, setAssignee] = useState<string>(task.assignee || '');\n const [due, setDue] = useState<string>(task.due || '');\n const [branch, setBranch] = useState<string>(task.branch || '');\n const [comment, setComment] = useState<string>('');\n const [busy, setBusy] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [deleting, setDeleting] = useState<boolean>(false);\n\n useEffect(() => {\n if (open) {\n setTitle(task.title);\n setDescription(task.description || '');\n setPriority(task.priority || 'medium');\n setStatus(task.status || 'queued');\n setAssignee(task.assignee || '');\n setDue(task.due || '');\n setBranch(task.branch || '');\n setComment('');\n setMessage(null);\n setError(null);\n }\n }, [open, task]);\n\n const patch = async (body: Record<string, unknown>, label: string): Promise<void> => {\n setBusy(label);\n setMessage(null);\n setError(null);\n try {\n await fetchJson(`/api/tasks/${encodeURIComponent(task.id)}`, {\n method: 'PATCH',\n body,\n });\n setMessage(`${label} saved.`);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const saveTitle = (): void => {\n if (title.trim() && title !== task.title) void patch({ title: title.trim() }, 'Title');\n };\n const saveDescription = (): void => {\n if (description !== (task.description || '')) void patch({ description }, 'Description');\n };\n const savePriority = (v: string): void => {\n setPriority(v);\n if (v !== task.priority) void patch({ priority: v }, 'Priority');\n };\n const saveStatus = (v: string): void => {\n setStatus(v);\n if (v !== task.status) void patch({ status: v }, 'Status');\n };\n const saveAssignee = (): void => {\n const v = assignee.trim();\n if (v !== (task.assignee || '')) void patch({ assignee: v }, 'Assignee');\n };\n const saveDue = (): void => {\n const v = due.trim();\n if (v !== (task.due || '')) void patch({ due: v }, 'Due');\n };\n const saveBranch = (): void => {\n const v = branch.trim();\n if (v !== (task.branch || '')) void patch({ branch: v }, 'Branch');\n };\n\n const addComment = async (): Promise<void> => {\n const v = comment.trim();\n if (!v) return;\n setBusy('comment');\n setError(null);\n try {\n await fetchJson(`/api/tasks/${encodeURIComponent(task.id)}/comments`, {\n method: 'POST',\n body: { text: v },\n });\n setComment('');\n setMessage('Comment added.');\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const removeTask = async (): Promise<void> => {\n const ok = typeof window !== 'undefined' && typeof window.confirm === 'function'\n ? window.confirm(`Delete task \"${task.title}\"? This is irreversible.`)\n : true;\n if (!ok) return;\n setDeleting(true);\n try {\n await fetchJson(`/api/tasks/${encodeURIComponent(task.id)}`, { method: 'DELETE' });\n onDeleted?.();\n onOpenChange(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setDeleting(false);\n }\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" title=\"Edit task\">\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"task-title\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Title\n </label>\n <Input\n id=\"task-title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onBlur={saveTitle}\n disabled={busy !== null}\n />\n </Stack>\n\n <Stack gap={2}>\n <label htmlFor=\"task-status\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Status\n </label>\n <Select value={status} onValueChange={saveStatus}>\n <SelectTrigger id=\"task-status\" size=\"sm\" placeholder=\"Status\" />\n <SelectContent>\n {STATUS_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Stack>\n\n <Inline gap={2}>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"task-priority\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Priority\n </label>\n <Select value={priority} onValueChange={savePriority}>\n <SelectTrigger id=\"task-priority\" size=\"sm\" placeholder=\"Priority\" />\n <SelectContent>\n {PRIORITY_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Stack>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"task-due\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Due\n </label>\n <Input\n id=\"task-due\"\n type=\"date\"\n value={due ? due.slice(0, 10) : ''}\n onChange={(e) => setDue(e.target.value)}\n onBlur={saveDue}\n disabled={busy !== null}\n />\n </Stack>\n </Inline>\n\n <Inline gap={2}>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"task-assignee\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Assignee\n </label>\n <Input\n id=\"task-assignee\"\n value={assignee}\n onChange={(e) => setAssignee(e.target.value)}\n onBlur={saveAssignee}\n placeholder=\"agent name (blank = unassigned)\"\n disabled={busy !== null}\n />\n </Stack>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"task-branch\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Branch\n </label>\n <Input\n id=\"task-branch\"\n value={branch}\n onChange={(e) => setBranch(e.target.value)}\n onBlur={saveBranch}\n placeholder=\"feature/foo\"\n disabled={busy !== null}\n />\n </Stack>\n </Inline>\n\n <Stack gap={2}>\n <label htmlFor=\"task-description\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Description\n </label>\n <Textarea\n id=\"task-description\"\n rows={5}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onBlur={saveDescription}\n disabled={busy !== null}\n placeholder=\"What's the work, why, how to verify…\"\n />\n </Stack>\n\n <Stack gap={2}>\n <label htmlFor=\"task-comment\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Add comment\n </label>\n <Inline gap={2} align=\"start\">\n <Textarea\n id=\"task-comment\"\n rows={2}\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n placeholder=\"Leave a progress note…\"\n disabled={busy !== null}\n style={{ flex: 1 }}\n />\n <Button variant=\"secondary\" onClick={() => { void addComment(); }} disabled={!comment.trim() || busy !== null}>\n <Plus size={14} aria-hidden /> Comment\n </Button>\n </Inline>\n </Stack>\n\n <Stack gap={2}>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Metadata</div>\n <Inline gap={1} wrap>\n {task.metadata?.goalId !== undefined && typeof task.metadata.goalId === 'string' && (\n <Badge tone=\"info\" title={`Linked to goal ${String(task.metadata.goalId)}`}>\n goal: {String(task.metadata.goalId)}\n </Badge>\n )}\n {task.metadata?.krId !== undefined && typeof task.metadata.krId === 'string' && (\n <Badge tone=\"info\" title={`Linked to KR ${String(task.metadata.krId)}`}>\n kr: {String(task.metadata.krId)}\n </Badge>\n )}\n {task.id && <Badge tone=\"neutral\" title={task.id}>id: {task.id}</Badge>}\n </Inline>\n </Stack>\n\n <div style={{ borderTop: '1px solid var(--border)', paddingTop: 'var(--space-3)' }}>\n <Button variant=\"danger\" onClick={() => { void removeTask(); }} disabled={deleting || busy !== null}>\n <Trash2 size={14} aria-hidden /> {deleting ? 'Deleting…' : 'Delete task'}\n </Button>\n </div>\n\n {message !== null && (\n <div role=\"status\" style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>{message}</div>\n )}\n {error !== null && (\n <div role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{error}</div>\n )}\n {busy !== null && <Skeleton style={{ height: 12 }} />}\n </Stack>\n </SheetContent>\n </Sheet>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Plus } 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 { KanbanBoard } from '../../ui/kanban/KanbanBoard.js';\nimport { KanbanColumn, type KanbanColumnData } from '../../ui/kanban/KanbanColumn.js';\nimport { KanbanCard, useKanbanCardSortable, type KanbanCardData } from '../../ui/kanban/KanbanCard.js';\nimport { KanbanToolbar, useKanbanSelection, type KanbanFilter } from '../../ui/index.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { TaskDetail } from '../../ui/tasks/TaskDetail.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { Task, WsMessage } from '../../data/types.js';\n\ntype TaskStatus = NonNullable<Task['status']>;\n\n/**\n * TasksView — Sprint S10. Pulls `/api/tasks` and maps server statuses\n * to v8 kanban columns. Drag a card between columns → PATCH\n * /api/tasks/:id/status. Live updates via `tasks:change`.\n *\n * v10.0.6 — adds KanbanToolbar (search + priority filter chips +\n * bulk-actions row), useKanbanSelection hook (Esc-to-clear), and a\n * 6th \"Backlog\" column from PR #14.\n */\n\nconst COLUMNS: KanbanColumnData[] = [\n { id: 'backlog', title: 'Backlog', accentTone: 'neutral' },\n { id: 'queued', title: 'Queued', accentTone: 'info' },\n { id: 'doing', title: 'In progress', accentTone: 'accent', wipLimit: 5 },\n { id: 'blocked', title: 'In review', accentTone: 'warning' },\n { id: 'done', title: 'Done', accentTone: 'success' },\n { id: 'archived', title: 'Archived', accentTone: 'neutral' },\n];\n\nconst PRIORITY_MAP: Record<string, KanbanCardData['priority']> = {\n low: 'low',\n medium: 'medium',\n high: 'high',\n urgent: 'urgent',\n};\n\ninterface Card extends KanbanCardData {\n taskId: string;\n columnId: TaskStatus;\n}\n\nfunction taskToCard(t: Task): Card {\n return {\n id: t.id,\n taskId: t.id,\n columnId: statusToColumn(t.status),\n title: t.title,\n priority: PRIORITY_MAP[t.priority || 'medium'] || 'medium',\n branch: t.branch,\n due: t.due,\n comments: t.comments,\n attachments: t.attachments,\n };\n}\n\nfunction statusToColumn(status?: TaskStatus): TaskStatus {\n switch (status) {\n case 'backlog':\n case 'queued':\n case 'doing':\n case 'blocked':\n case 'done':\n case 'archived':\n return status;\n default:\n return 'backlog';\n }\n}\n\n/**\n * SortableCard — wraps a single KanbanCard with dnd-kit's useSortable\n * so KanbanBoard.onDragEnd can fire.\n */\nfunction SortableCard({ card }: { card: Card }): JSX.Element {\n const sortable = useKanbanCardSortable(card.id);\n return (\n <KanbanCard\n card={card}\n isDragging={sortable.isDragging}\n dragHandleProps={{ ...sortable.attributes, ...sortable.listeners, ref: sortable.setNodeRef, style: sortable.style }}\n />\n );\n}\n\nexport function TasksView(): JSX.Element {\n const tasks = useFetch<{ tasks?: Task[]; count?: number }>('/api/tasks');\n const [cards, setCards] = useState<Card[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [openTaskId, setOpenTaskId] = useState<string | null>(null);\n const selection = useKanbanSelection();\n const [query, setQuery] = useState<string>('');\n const [activeFilters, setActiveFilters] = useState<ReadonlySet<string>>(new Set());\n const [createDraft, setCreateDraft] = useState<{ title: string; description: string; priority: 'low' | 'medium' | 'high' | 'urgent' } | null>(null);\n const [creating, setCreating] = useState(false);\n\n const saveCreate = async (): Promise<void> => {\n if (createDraft === null || !createDraft.title.trim()) return;\n setCreating(true);\n try {\n await fetchJson('/api/tasks', { method: 'POST', body: { title: createDraft.title.trim(), description: createDraft.description, priority: createDraft.priority, status: 'queued' } });\n setCreateDraft(null);\n tasks.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const onWsRemove = useCallback((msg: WsMessage) => {\n const m = msg as { type?: string; id?: string };\n if (m.type !== 'tasks:removed' && m.type !== 'task:removed') return;\n if (!m.id) return;\n setCards((prev) => prev.filter((c) => c.taskId !== m.id));\n selection.remove([m.id]);\n if (openTaskId === m.id) setOpenTaskId(null);\n }, [openTaskId, selection]);\n useWsMessage('tasks:removed', onWsRemove);\n useWsMessage('task:removed', onWsRemove);\n\n const toggleSelect = (taskId: string): void => {\n selection.toggle(taskId);\n };\n\n const bulkMove = async (toStatus: TaskStatus): Promise<void> => {\n const ids = Array.from(selection.selected);\n if (ids.length === 0) return;\n setCards((prev) => prev.map((c) => (selection.has(c.taskId) ? { ...c, columnId: toStatus } : c)));\n try {\n await fetchJson('/api/tasks/bulk-status', {\n method: 'PATCH',\n body: { ids, status: toStatus },\n });\n selection.clear();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n }\n };\n\n // Sync fetched list → local state. Effect-driven so we don't setState\n // during render (which React warns about under StrictMode and which\n // can double-render the cards).\n useEffect(() => {\n if (tasks.data?.tasks) {\n setCards(tasks.data.tasks.map(taskToCard));\n }\n }, [tasks.data]);\n\n const onWsChange = useCallback((msg: WsMessage) => {\n if (msg.type !== 'tasks:change') return;\n const t = msg.task as Task | undefined;\n if (!t) return;\n setCards((prev) => {\n const idx = prev.findIndex((c) => c.taskId === t.id);\n const card = taskToCard({ ...t, status: statusToColumn(t.status) });\n if (idx === -1) return [...prev, card];\n const copy = prev.slice();\n copy[idx] = { ...copy[idx], ...card };\n return copy;\n });\n }, []);\n useWsMessage('tasks:change', onWsChange);\n\n const onCardMove = useCallback(async (cardId: string, _from: string, to: string) => {\n const card = cards.find((c) => c.taskId === cardId || c.id === cardId);\n if (!card) return;\n const nextStatus = statusToColumn(to as TaskStatus);\n setCards((prev) =>\n prev.map((c) => (c.taskId === cardId ? { ...c, columnId: nextStatus } : c)),\n );\n try {\n await fetchJson(`/api/tasks/${encodeURIComponent(card.taskId)}/status`, {\n method: 'PATCH',\n body: { status: nextStatus },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n // Roll back on failure.\n setCards((prev) =>\n prev.map((c) => (c.taskId === cardId ? { ...c, columnId: card.columnId } : c)),\n );\n }\n }, [cards]);\n\n const counts: Record<string, number> = {};\n for (const c of cards) counts[c.columnId] = (counts[c.columnId] || 0) + 1;\n\n const openTask = openTaskId ? tasks.data?.tasks?.find((t) => t.id === openTaskId) ?? null : null;\n const selectedCount = selection.selected.size;\n\n // ── v10.0.6 — search + filter chips (PR #14 toolbar wiring) ──\n const filteredCards = useMemo<Card[]>(() => {\n const q = query.trim().toLowerCase();\n return cards.filter((c) => {\n if (activeFilters.size > 0) {\n if (activeFilters.has(`status:${c.columnId}`) === false) {\n const hasPriority = c.priority !== undefined && activeFilters.has(`priority:${c.priority}`);\n const hasStatus = activeFilters.has(`status:${c.columnId}`);\n if (!hasPriority && !hasStatus) return false;\n }\n }\n if (q !== '') {\n const hay = `${c.title} ${c.description ?? ''}`.toLowerCase();\n if (hay.includes(q) === false) return false;\n }\n return true;\n });\n }, [cards, query, activeFilters]);\n\n const priorityFilters: KanbanFilter[] = [\n { id: 'priority:low', label: 'Low', tone: 'neutral' },\n { id: 'priority:medium', label: 'Medium', tone: 'info' },\n { id: 'priority:high', label: 'High', tone: 'warning' },\n { id: 'priority:urgent', label: 'Urgent', tone: 'danger' },\n ];\n const statusFilters: KanbanFilter[] = COLUMNS.map((c) => ({ id: `status:${c.id}`, label: c.title as string }));\n const allFilters: KanbanFilter[] = [...priorityFilters, ...statusFilters];\n\n const onFilterToggle = useCallback((id: string) => {\n setActiveFilters((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n const onClearFilters = useCallback(() => setActiveFilters(new Set()), []);\n\n return (\n <Stack gap={4} data-testid=\"tasks-view\">\n <ViewHeader\n title=\"Tasks\"\n description=\"Drag cards across columns. Click a card to edit. Use the checkbox to select multiple.\"\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=\"primary\" onClick={() => setCreateDraft({ title: '', description: '', priority: 'medium' })} data-testid=\"task-create-open\">\n <Plus size={14} aria-hidden /> New task\n </Button>\n </Inline>\n }\n />\n {selectedCount > 0 && (\n <KanbanToolbar\n totalCount={cards.length}\n visibleCount={filteredCards.length}\n selectedCount={selectedCount}\n query={query}\n onQueryChange={setQuery}\n filters={allFilters}\n onFilterToggle={onFilterToggle}\n onClearFilters={onClearFilters}\n onNewTask={() => setCreateDraft({ title: '', description: '', priority: 'medium' })}\n onBulkMove={() => void bulkMove('doing')}\n onBulkArchive={() => void bulkMove('archived')}\n onBulkDelete={async () => {\n const ids = Array.from(selection.selected);\n if (ids.length === 0) return;\n if (!window.confirm(`Delete ${ids.length} task${ids.length === 1 ? '' : 's'}? This cannot be undone.`)) return;\n try {\n await fetchJson('/api/tasks/bulk-status', { method: 'PATCH', body: { ids, status: 'archived' } });\n selection.clear();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n }\n }}\n onClearSelection={() => selection.clear()}\n />\n )}\n {tasks.loading && cards.length === 0 ? (\n <Stack gap={3}>\n <Skeleton style={{ height: 120 }} />\n <Skeleton style={{ height: 120 }} />\n </Stack>\n ) : (\n <KanbanBoard columns={COLUMNS} onCardMove={onCardMove}>\n {COLUMNS.map((col) => {\n const inColumn = filteredCards.filter((c) => c.columnId === col.id);\n return (\n <KanbanColumn\n key={col.id}\n column={{ ...col, count: counts[col.id] || 0 }}\n >\n {inColumn.map((card) => (\n <div key={card.id} style={{ position: 'relative' }}>\n <input\n type=\"checkbox\"\n checked={selection.has(card.taskId)}\n onChange={() => toggleSelect(card.taskId)}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Select ${card.title}`}\n style={{ position: 'absolute', top: 8, left: 8, zIndex: 2 }}\n />\n <div onClick={() => setOpenTaskId(card.taskId)} role=\"button\" tabIndex={0} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setOpenTaskId(card.taskId); } }} style={{ cursor: 'pointer' }}>\n <SortableCard card={card} />\n </div>\n </div>\n ))}\n </KanbanColumn>\n );\n })}\n </KanbanBoard>\n )}\n {openTask && (\n <TaskDetail\n task={openTask}\n open={openTaskId !== null}\n onOpenChange={(o) => { if (!o) setOpenTaskId(null); }}\n onDeleted={() => {\n setCards((prev) => prev.filter((c) => c.taskId !== openTask.id));\n setOpenTaskId(null);\n }}\n />\n )}\n\n {/* v9.2.0 — create-task Sheet. Replaces the missing \"new task\"\n action that the audit flagged as a HIGH gap. */}\n <Sheet open={createDraft !== null} onOpenChange={(o) => { if (!o) setCreateDraft(null); }}>\n <SheetContent side=\"right\" title=\"New task\">\n {createDraft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"task-create-title\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title</label>\n <Input\n id=\"task-create-title\"\n value={createDraft.title}\n onChange={(e) => setCreateDraft({ ...createDraft, title: e.target.value })}\n placeholder=\"What needs doing?\"\n disabled={creating}\n data-testid=\"task-create-title\"\n />\n </Stack>\n <Stack gap={2}>\n <label htmlFor=\"task-create-desc\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Description (optional)</label>\n <Textarea\n id=\"task-create-desc\"\n value={createDraft.description}\n onChange={(e) => setCreateDraft({ ...createDraft, description: e.target.value })}\n rows={4}\n disabled={creating}\n data-testid=\"task-create-desc\"\n />\n </Stack>\n <Stack gap={2}>\n <label htmlFor=\"task-create-priority\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Priority</label>\n <select\n id=\"task-create-priority\"\n value={createDraft.priority}\n onChange={(e) => setCreateDraft({ ...createDraft, priority: e.target.value as typeof createDraft.priority })}\n disabled={creating}\n data-testid=\"task-create-priority\"\n style={{ height: 32, padding: '0 var(--space-2)', borderRadius: 'var(--radius-sm)', border: '1px solid var(--border)', background: 'var(--surface-0)', color: 'var(--fg)', fontSize: 'var(--fs-13)' }}\n >\n <option value=\"low\">Low</option>\n <option value=\"medium\">Medium</option>\n <option value=\"high\">High</option>\n <option value=\"urgent\">Urgent</option>\n </select>\n </Stack>\n <Inline gap={2}>\n <Button variant=\"primary\" onClick={() => { void saveCreate(); }} disabled={creating || !createDraft.title.trim()} data-testid=\"task-create-submit\">\n Create task\n </Button>\n <Button variant=\"ghost\" onClick={() => setCreateDraft(null)} disabled={creating}>\n Cancel\n </Button>\n </Inline>\n </Stack>\n )}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["ArrowRight","createLucideIcon","KanbanToolbar","props","totalCount","visibleCount","selectedCount","query","onQueryChange","filters","onFilterToggle","onClearFilters","onNewTask","onBulkMove","onBulkArchive","onBulkDelete","onClearSelection","className","searchFocused","setSearchFocused","useState","isBulk","jsx","cx","jsxs","Fragment","Button","Archive","Trash2","IconButton","X","Search","e","Filter","f","tone","isActive","actualId","active","Plus","useKanbanSelection","selected","setSelected","toggle","useCallback","id","prev","next","add","ids","remove","set","clear","useEffect","onKey","ev","target","tag","has","useMemo","PRIORITY_OPTIONS","STATUS_OPTIONS","TaskDetail","task","open","onOpenChange","onDeleted","title","setTitle","description","setDescription","priority","setPriority","status","setStatus","assignee","setAssignee","due","setDue","branch","setBranch","comment","setComment","busy","setBusy","message","setMessage","error","setError","deleting","setDeleting","patch","body","label","fetchJson","err","saveTitle","saveDescription","savePriority","v","saveStatus","saveAssignee","saveDue","saveBranch","addComment","removeTask","Sheet","SheetContent","Stack","Input","Select","SelectTrigger","SelectContent","opt","SelectItem","Inline","Textarea","_a","Badge","_b","Skeleton","COLUMNS","PRIORITY_MAP","taskToCard","t","statusToColumn","SortableCard","card","sortable","useKanbanCardSortable","KanbanCard","TasksView","tasks","useFetch","cards","setCards","openTaskId","setOpenTaskId","selection","setQuery","activeFilters","setActiveFilters","createDraft","setCreateDraft","creating","setCreating","saveCreate","FetchError","onWsRemove","msg","m","useWsMessage","toggleSelect","taskId","bulkMove","toStatus","onWsChange","idx","c","copy","onCardMove","cardId","_from","to","nextStatus","counts","openTask","filteredCards","q","hasPriority","hasStatus","priorityFilters","statusFilters","allFilters","ViewHeader","KanbanBoard","col","inColumn","KanbanColumn","o"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- import{r as g,j as p}from"./cmdk-C3F6LD6N.js";import{g as x}from"./main-BRmJZcHt.js";const b=g.forwardRef(function(s,n){const{invalid:t,autoResize:a,disabled:i,rows:l=4,className:d,style:u,onInput:r,...c}=s,v={width:"100%",minHeight:64,padding:"var(--space-3)",fontSize:"var(--fs-13)",lineHeight:"var(--lh-base)",color:"var(--fg)",background:"var(--input-bg)",border:"1px solid",borderColor:t===!0?"var(--danger)":"var(--border)",borderRadius:"var(--radius-sm)",outline:0,resize:a===!0?"none":"vertical",opacity:i===!0?.55:1,fontFamily:"inherit",...u};return p.jsx("textarea",{ref:n,rows:l,disabled:i,"aria-invalid":t===!0?"true":void 0,className:x("v8-textarea",d),style:v,onInput:o=>{if(a===!0){const e=o.currentTarget;e.style.height="auto",e.style.height=`${e.scrollHeight}px`}r==null||r(o)},...c})});export{b as T};
@@ -1 +0,0 @@
1
- {"version":3,"file":"Textarea-BfXGMXQ7.js","sources":["../../src/web/v8/ui/controls/Textarea.tsx"],"sourcesContent":["import { forwardRef, type TextareaHTMLAttributes } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Textarea — multi-line input.\n *\n * Use for: descriptions, comments, chat input.\n * Pair with <Field> for label + hint + error.\n */\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n invalid?: boolean;\n autoResize?: boolean;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(props, ref) {\n const {\n invalid,\n autoResize,\n disabled,\n rows = 4,\n className,\n style,\n onInput,\n ...rest\n } = props;\n\n const computedStyle = {\n width: '100%',\n minHeight: 64,\n padding: 'var(--space-3)',\n fontSize: 'var(--fs-13)',\n lineHeight: 'var(--lh-base)',\n color: 'var(--fg)',\n background: 'var(--input-bg)',\n border: '1px solid',\n borderColor: invalid === true ? 'var(--danger)' : 'var(--border)',\n borderRadius: 'var(--radius-sm)',\n outline: 0,\n resize: autoResize === true ? 'none' : 'vertical',\n opacity: disabled === true ? 0.55 : 1,\n fontFamily: 'inherit',\n ...style,\n } as const;\n\n return (\n <textarea\n ref={ref}\n rows={rows}\n disabled={disabled}\n aria-invalid={invalid === true ? 'true' : undefined}\n className={cx('v8-textarea', className)}\n style={computedStyle}\n onInput={(e) => {\n if (autoResize === true) {\n const el = e.currentTarget;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n }\n onInput?.(e);\n }}\n {...rest}\n />\n );\n});"],"names":["Textarea","forwardRef","props","ref","invalid","autoResize","disabled","rows","className","style","onInput","rest","computedStyle","jsx","cx","e","el"],"mappings":"qFAcO,MAAMA,EAAWC,EAAAA,WAA+C,SAAkBC,EAAOC,EAAK,CACnG,KAAM,CACJ,QAAAC,EACA,WAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,EACP,UAAAC,EACA,MAAAC,EACA,QAAAC,EACA,GAAGC,CAAA,EACDT,EAEEU,EAAgB,CACpB,MAAO,OACP,UAAW,GACX,QAAS,iBACT,SAAU,eACV,WAAY,iBACZ,MAAO,YACP,WAAY,kBACZ,OAAQ,YACR,YAAaR,IAAY,GAAO,gBAAkB,gBAClD,aAAc,mBACd,QAAS,EACT,OAAQC,IAAe,GAAO,OAAS,WACvC,QAASC,IAAa,GAAO,IAAO,EACpC,WAAY,UACZ,GAAGG,CAAA,EAGL,OACEI,EAAAA,IAAC,WAAA,CACC,IAAAV,EACA,KAAAI,EACA,SAAAD,EACA,eAAcF,IAAY,GAAO,OAAS,OAC1C,UAAWU,EAAG,cAAeN,CAAS,EACtC,MAAOI,EACP,QAAUG,GAAM,CACd,GAAIV,IAAe,GAAM,CACvB,MAAMW,EAAKD,EAAE,cACbC,EAAG,MAAM,OAAS,OAClBA,EAAG,MAAM,OAAS,GAAGA,EAAG,YAAY,IACtC,CACAN,GAAA,MAAAA,EAAUK,EACZ,EACC,GAAGJ,CAAA,CAAA,CAGV,CAAC"}
@@ -1 +0,0 @@
1
- import{r,j as e}from"./cmdk-C3F6LD6N.js";import{u as F,a as g,S as c,I as t,B as i,_ as w,h as f,K as L,i as A,F as U}from"./main-BRmJZcHt.js";import{V as T}from"./ViewHeader-BsnaspKw.js";import{C as x,b as j}from"./Card-Clkvh43Q.js";import{E as V}from"./EmptyState-ccT__JZG.js";import{R as $}from"./refresh-ccw-DN_zCB1h.js";import{D}from"./download-B-mPX5P_.js";import{C as I}from"./circle-check-BMbe7Kkr.js";import{C as H}from"./circle-alert-QQTU4Quz.js";function Q(){const l=F("/api/updates/status"),[n,E]=r.useState(null),[m,v]=r.useState(!1),[y,h]=r.useState(!1),[C,d]=r.useState(null),[k,u]=r.useState([]),[S,p]=r.useState(null),R=r.useMemo(()=>{var a;return((a=l.data)==null?void 0:a.packages)??[]},[l.data]),b=r.useCallback(()=>{l.refetch()},[l]);g("update:progress",a=>{u(s=>[...s,{...a,type:"update:progress"}])}),g("update:log",a=>{u(s=>[...s,{...a,type:"update:log"}])}),g("update:complete",a=>{u(s=>[...s,{...a,type:"update:complete"}]),h(!1),b()});const B=async()=>{v(!0),p(null);try{const a=await A("/api/updates/check");E(a)}catch(a){p((a instanceof U,a.message))}finally{v(!1)}},z=async a=>{h(!0),p(null),d(null);try{await A("/api/updates/apply",{method:"POST",body:{packages:a}})}catch(s){p((s instanceof U,s.message)),h(!1)}},o=(n==null?void 0:n.packages)??R.map(a=>({...a,hasUpdate:!1}));return e.jsxs(c,{gap:4,"data-testid":"update-view",children:[e.jsx(T,{title:"Update",description:"Bizar package updates. Apply restarts on next launch.",actions:e.jsxs(t,{align:"center",gap:2,children:[S!==null&&e.jsx("span",{role:"alert","data-testid":"update-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:S}),e.jsxs(i,{variant:"ghost",onClick:()=>void b(),"data-testid":"update-refresh",children:[e.jsx($,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(i,{variant:"ghost",onClick:()=>void B(),disabled:m,"data-testid":"update-check",children:[e.jsx(D,{size:14,"aria-hidden":!0})," ",m?"Checking…":"Check"]}),e.jsxs(i,{variant:"primary",onClick:()=>d("all"),disabled:y||!((n==null?void 0:n.hasUpdates)??!1),"data-testid":"update-apply-all",children:[e.jsx(w,{size:14,"aria-hidden":!0})," Apply all"]})]})}),e.jsx(x,{variant:"default",children:e.jsx(j,{children:l.loading&&o.length===0?e.jsxs(c,{gap:1,children:[e.jsx(f,{style:{height:40}}),e.jsx(f,{style:{height:40}}),e.jsx(f,{style:{height:40}})]}):o.length===0?e.jsx(V,{icon:e.jsx(w,{size:28,"aria-hidden":!0}),title:"No packages",description:"Update status endpoint returned no packages."}):e.jsx(c,{gap:1,children:o.map(a=>{const s=C===a.id;return e.jsxs("div",{"data-testid":`update-row-${a.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)"},children:[e.jsxs(t,{align:"center",justify:"between",gap:2,children:[e.jsxs(c,{gap:0,children:[e.jsxs(t,{align:"center",gap:2,children:[e.jsx("strong",{children:a.label||a.id}),e.jsx("code",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:a.id})]}),e.jsxs(t,{align:"center",gap:2,children:[e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["installed: ",e.jsx("code",{children:a.installed??"?"})]}),a.latest!==void 0&&a.latest!==null&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["latest: ",e.jsx("code",{children:a.latest})]}),a.hasUpdate&&e.jsx("span",{"data-testid":`update-available-${a.id}`,style:{fontSize:"var(--fs-11)",color:"var(--accent)",fontWeight:600},children:"UPDATE AVAILABLE"})]})]}),e.jsx(t,{gap:1,children:a.hasUpdate&&e.jsx(i,{variant:"ghost",onClick:()=>d(P=>P===a.id?null:a.id),"data-testid":`update-apply-${a.id}`,disabled:y,children:"Apply"})})]}),s&&e.jsxs(t,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(i,{variant:"primary",onClick:()=>void z([a.id]),"data-testid":`update-confirm-apply-${a.id}`,children:"Confirm apply"}),e.jsx(i,{variant:"ghost",onClick:()=>d(null),children:"Cancel"})]})]},a.id)})})})}),C==="all"&&e.jsx(x,{variant:"default",children:e.jsx(j,{children:e.jsxs(c,{gap:2,children:[e.jsx("strong",{children:"Apply all updates?"}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[o.filter(a=>a.hasUpdate).length," package(s) will update on next launch."]}),e.jsxs(t,{gap:1,children:[e.jsx(i,{variant:"primary",onClick:()=>void z(o.filter(a=>a.hasUpdate).map(a=>a.id)),"data-testid":"update-confirm-apply-all",children:"Confirm apply all"}),e.jsx(i,{variant:"ghost",onClick:()=>d(null),children:"Cancel"})]})]})})}),k.length>0&&e.jsx(x,{variant:"default",children:e.jsxs(j,{children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Progress"}),e.jsx("div",{"data-testid":"update-log",style:{marginTop:"var(--space-2)",padding:"var(--space-2)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",maxHeight:240,overflow:"auto"},children:k.slice(-100).map((a,s)=>e.jsx("div",{style:{color:a.error?"var(--danger)":a.status==="done"?"var(--success)":"var(--fg)"},children:a.type==="update:complete"?e.jsxs(t,{align:"center",gap:1,children:[e.jsx(I,{size:12,"aria-hidden":!0,style:{color:"var(--success)"}})," complete"]}):a.error?e.jsxs(t,{align:"center",gap:1,children:[e.jsx(H,{size:12,"aria-hidden":!0,style:{color:"var(--danger)"}})," ",a.pkg??"?"," · ",a.error]}):e.jsxs(t,{align:"center",gap:1,children:[a.status==="installing"?e.jsx(L,{size:12,"aria-hidden":!0,style:{animation:"spin 1s linear infinite"}}):null,a.pkg??"?"," · ",a.status??a.line??""]})},s))})]})})]})}export{Q as UpdateView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"UpdateView-BKx3u9X8.js","sources":["../../src/web/v8/views/Update/UpdateView.tsx"],"sourcesContent":["/**\n * v8/views/Update/UpdateView.tsx — Sprint S42, v9.3.0.\n *\n * Package update status + Check + Apply:\n * - GET /api/updates/status — installed versions\n * - GET /api/updates/check — installed + latest + hasUpdates\n * - POST /api/updates/apply — kick install, streams via\n * `update:progress` / `update:log` / `update:complete` WS events.\n *\n * Per-package Apply (inline-confirm) + global Apply All button. Live\n * progress list rendered from a useWsMessage subscription.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Package, RefreshCcw, Download, CheckCircle2, AlertCircle, 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 { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface UpdateEntry {\n id: string;\n installed?: string;\n latest?: string | null;\n hasUpdate?: boolean;\n label?: string;\n}\n\ninterface StatusResponse {\n packages: UpdateEntry[];\n}\n\ninterface CheckResponse {\n packages: UpdateEntry[];\n hasUpdates?: boolean;\n}\n\ninterface ProgressEvent {\n type: 'update:progress' | 'update:log' | 'update:complete';\n pkg?: string;\n status?: string;\n line?: string;\n newVersion?: string;\n error?: string;\n}\n\nexport function UpdateView(): JSX.Element {\n const statusPayload = useFetch<StatusResponse>('/api/updates/status');\n const [check, setCheck] = useState<CheckResponse | null>(null);\n const [checking, setChecking] = useState<boolean>(false);\n const [applying, setApplying] = useState<boolean>(false);\n const [confirmApply, setConfirmApply] = useState<string | null>(null);\n const [log, setLog] = useState<ProgressEvent[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const installed = useMemo<UpdateEntry[]>(() => statusPayload.data?.packages ?? [], [statusPayload.data]);\n const refresh = useCallback(() => { void statusPayload.refetch(); }, [statusPayload]);\n\n // Subscribe to live progress events. `msg.type` is the discriminator\n // (e.g. 'update:progress'); spreading first then narrowing via the\n // cast avoids the TS2783 duplicate-key error we'd hit if we tried to\n // also set `type: 'update:progress'` literally.\n useWsMessage('update:progress', (msg) => {\n setLog((l) => [...l, { ...msg, type: 'update:progress' } as ProgressEvent]);\n });\n useWsMessage('update:log', (msg) => {\n setLog((l) => [...l, { ...msg, type: 'update:log' } as ProgressEvent]);\n });\n useWsMessage('update:complete', (msg) => {\n setLog((l) => [...l, { ...msg, type: 'update:complete' } as ProgressEvent]);\n setApplying(false);\n refresh();\n });\n\n const runCheck = async (): Promise<void> => {\n setChecking(true);\n setError(null);\n try {\n const r = await fetchJson<CheckResponse>('/api/updates/check');\n setCheck(r);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setChecking(false);\n }\n };\n\n const apply = async (ids: string[]): Promise<void> => {\n setApplying(true);\n setError(null);\n setConfirmApply(null);\n try {\n await fetchJson('/api/updates/apply', { method: 'POST', body: { packages: ids } });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n setApplying(false);\n }\n };\n\n const rows: UpdateEntry[] = check?.packages ?? installed.map((p) => ({ ...p, hasUpdate: false }));\n\n return (\n <Stack gap={4} data-testid=\"update-view\">\n <ViewHeader\n title=\"Update\"\n description=\"Bizar package updates. Apply restarts on next launch.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"update-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"update-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"ghost\" onClick={() => void runCheck()} disabled={checking} data-testid=\"update-check\">\n <Download size={14} aria-hidden /> {checking ? 'Checking…' : 'Check'}\n </Button>\n <Button\n variant=\"primary\"\n onClick={() => setConfirmApply('all')}\n disabled={applying || !(check?.hasUpdates ?? false)}\n data-testid=\"update-apply-all\"\n >\n <Package size={14} aria-hidden /> Apply all\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {statusPayload.loading && rows.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 40 }} />\n <Skeleton style={{ height: 40 }} />\n <Skeleton style={{ height: 40 }} />\n </Stack>\n ) : rows.length === 0 ? (\n <EmptyState icon={<Package size={28} aria-hidden />} title=\"No packages\" description=\"Update status endpoint returned no packages.\" />\n ) : (\n <Stack gap={1}>\n {rows.map((p) => {\n const isConfirming = confirmApply === p.id;\n return (\n <div\n key={p.id}\n data-testid={`update-row-${p.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}>\n <Inline align=\"center\" gap={2}>\n <strong>{p.label || p.id}</strong>\n <code style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{p.id}</code>\n </Inline>\n <Inline align=\"center\" gap={2}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n installed: <code>{p.installed ?? '?'}</code>\n </span>\n {p.latest !== undefined && p.latest !== null && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n latest: <code>{p.latest}</code>\n </span>\n )}\n {p.hasUpdate && (\n <span data-testid={`update-available-${p.id}`} style={{ fontSize: 'var(--fs-11)', color: 'var(--accent)', fontWeight: 600 }}>\n UPDATE AVAILABLE\n </span>\n )}\n </Inline>\n </Stack>\n <Inline gap={1}>\n {p.hasUpdate && (\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmApply((cur) => (cur === p.id ? null : p.id))}\n data-testid={`update-apply-${p.id}`}\n disabled={applying}\n >\n Apply\n </Button>\n )}\n </Inline>\n </Inline>\n {isConfirming && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button variant=\"primary\" onClick={() => void apply([p.id])} data-testid={`update-confirm-apply-${p.id}`}>\n Confirm apply\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmApply(null)}>Cancel</Button>\n </Inline>\n )}\n </div>\n );\n })}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n {confirmApply === 'all' && (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={2}>\n <strong>Apply all updates?</strong>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {rows.filter((p) => p.hasUpdate).length} package(s) will update on next launch.\n </span>\n <Inline gap={1}>\n <Button variant=\"primary\" onClick={() => void apply(rows.filter((p) => p.hasUpdate).map((p) => p.id))} data-testid=\"update-confirm-apply-all\">\n Confirm apply all\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmApply(null)}>Cancel</Button>\n </Inline>\n </Stack>\n </CardBody>\n </Card>\n )}\n\n {log.length > 0 && (\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Progress</strong>\n <div\n data-testid=\"update-log\"\n style={{\n marginTop: 'var(--space-2)',\n padding: 'var(--space-2)',\n background: 'var(--surface-1)',\n borderRadius: 'var(--radius-sm)',\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n maxHeight: 240,\n overflow: 'auto',\n }}\n >\n {log.slice(-100).map((l, i) => (\n <div key={i} style={{ color: l.error ? 'var(--danger)' : l.status === 'done' ? 'var(--success)' : 'var(--fg)' }}>\n {l.type === 'update:complete' ? (\n <Inline align=\"center\" gap={1}><CheckCircle2 size={12} aria-hidden style={{ color: 'var(--success)' }} /> complete</Inline>\n ) : l.error ? (\n <Inline align=\"center\" gap={1}><AlertCircle size={12} aria-hidden style={{ color: 'var(--danger)' }} /> {l.pkg ?? '?'} · {l.error}</Inline>\n ) : (\n <Inline align=\"center\" gap={1}>\n {l.status === 'installing' ? <Loader2 size={12} aria-hidden style={{ animation: 'spin 1s linear infinite' }} /> : null}\n {l.pkg ?? '?'} · {l.status ?? l.line ?? ''}\n </Inline>\n )}\n </div>\n ))}\n </div>\n </CardBody>\n </Card>\n )}\n </Stack>\n );\n}"],"names":["UpdateView","statusPayload","useFetch","check","setCheck","useState","checking","setChecking","applying","setApplying","confirmApply","setConfirmApply","log","setLog","error","setError","installed","useMemo","_a","refresh","useCallback","useWsMessage","msg","l","runCheck","r","fetchJson","err","FetchError","apply","ids","rows","p","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Download","Package","Card","CardBody","Skeleton","EmptyState","isConfirming","cur","i","CheckCircle2","AlertCircle","Loader2"],"mappings":"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"}
@@ -1 +0,0 @@
1
- import{r as b,j as e}from"./cmdk-C3F6LD6N.js";import{u as k,S as a,I as l,N as z,h as C}from"./main-BRmJZcHt.js";import{G as T}from"./Grid-Bojq8Sg7.js";import{V as w}from"./ViewHeader-BsnaspKw.js";import{C as g,b as h}from"./Card-Clkvh43Q.js";import{E as F}from"./ErrorState-BSqf65ka.js";import{T as I}from"./trending-up-qKTUQKIT.js";import{Z as R}from"./zap-Bz1Z8y1Q.js";import{C as q}from"./clock-OtT5mvF3.js";import"./Alert-pzFISNtS.js";import"./circle-alert-QQTU4Quz.js";import"./triangle-alert-BeY8LAv6.js";import"./circle-check-BMbe7Kkr.js";import"./refresh-ccw-DN_zCB1h.js";const E=[{id:"24h",label:"24 hours"},{id:"7d",label:"7 days"},{id:"30d",label:"30 days"}];function u(s){return s<1e3?String(s):s<1e6?`${(s/1e3).toFixed(1)}k`:`${(s/1e6).toFixed(2)}M`}function f({label:s,value:d,sub:t,icon:n}){return e.jsx(g,{variant:"default",children:e.jsx(h,{children:e.jsxs(a,{gap:1,children:[e.jsxs(l,{align:"center",gap:2,children:[e.jsx(n,{size:14,"aria-hidden":!0}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:s})]}),e.jsx("strong",{style:{fontSize:"var(--fs-18)",fontFamily:"var(--font-mono)"},children:d}),t&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:t})]})})})}function J(){var p,x,v,j,y;const[s,d]=b.useState("24h"),t=k(`/api/usage?range=${s}`),n=k("/api/usage/limits");b.useEffect(()=>{},[s]);const i=(p=t.data)==null?void 0:p.totals,o=((x=t.data)==null?void 0:x.byProvider)??[],m=((v=t.data)==null?void 0:v.byModel)??[],c=o.reduce((r,S)=>Math.max(r,S.tokens),0);return e.jsxs(a,{gap:5,"data-testid":"usage-view",children:[e.jsx(w,{title:"Usage",description:"Token consumption + quota limits from the rolling JSONL log.",actions:e.jsx(l,{gap:1,children:E.map(r=>e.jsx("button",{type:"button",onClick:()=>d(r.id),"aria-pressed":s===r.id,"data-testid":`usage-range-${r.id}`,style:{padding:"4px 10px",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:s===r.id?"var(--accent)":"var(--surface-1)",color:s===r.id?"var(--accent-fg)":"var(--fg)",fontSize:"var(--fs-12)",cursor:"pointer"},children:r.label},r.id))})}),e.jsxs(T,{cols:3,children:[e.jsx(f,{label:"Total tokens",icon:z,value:t.loading?"…":u((i==null?void 0:i.tokens)??0),sub:i?`${i.requests} requests`:""}),e.jsx(f,{label:"Distinct providers",icon:I,value:t.loading?"…":String(o.length)}),e.jsx(f,{label:"Live limits",icon:R,value:n.loading?"…":String(((y=(j=n.data)==null?void 0:j.models)==null?void 0:y.length)??0),sub:"active quotas"})]}),t.loading?e.jsx(C,{style:{height:200}}):t.error&&o.length===0?e.jsx(F,{block:!0,title:"Couldn't load usage",description:"Token analytics failed to fetch. Retry to refetch.",error:t.error,onRetry:()=>void t.refetch(),testid:"usage-error"}):o.length===0?e.jsx(g,{variant:"default",children:e.jsx(h,{children:e.jsxs(a,{gap:1,align:"center",style:{padding:"var(--space-4)"},children:[e.jsx(q,{size:24,"aria-hidden":!0}),e.jsxs("span",{style:{color:"var(--fg-muted)"},children:["No usage records for the last ",s,"."]})]})})}):e.jsx(g,{variant:"default",children:e.jsx(h,{children:e.jsxs(a,{gap:3,children:[e.jsx("strong",{children:"By provider"}),e.jsx(a,{gap:2,children:o.map(r=>e.jsxs(a,{gap:1,children:[e.jsxs(l,{align:"center",justify:"between",children:[e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:r.providerId}),e.jsxs("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[u(r.tokens)," · ",r.requests," req"]})]}),e.jsx("div",{role:"progressbar","aria-valuemin":0,"aria-valuemax":c||1,"aria-valuenow":r.tokens,style:{height:6,background:"var(--surface-1)",borderRadius:"var(--radius-pill)",overflow:"hidden"},children:e.jsx("div",{style:{width:`${c>0?r.tokens/c*100:0}%`,height:"100%",background:"var(--accent)"}})})]},r.providerId))}),m.length>0&&e.jsxs(a,{gap:2,children:[e.jsx("strong",{children:"Top models"}),m.slice(0,5).map(r=>e.jsxs(l,{align:"center",justify:"between",style:{fontSize:"var(--fs-12)"},children:[e.jsx("code",{style:{fontFamily:"var(--font-mono)"},children:r.modelId}),e.jsx("span",{style:{color:"var(--fg-muted)"},children:u(r.tokens)})]},r.modelId))]})]})})})]})}export{J as UsageView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"UsageView-M01G6bZQ.js","sources":["../../src/web/v8/views/Usage/UsageView.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { BarChart3, TrendingUp, Clock, Zap } 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 { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { useFetch } from '../../data/useFetch.js';\n\n/**\n * UsageView — Sprint S35. Token usage analytics from JSONL logs.\n */\n\ntype Range = '24h' | '7d' | '30d';\n\ninterface UsageTotals {\n tokens: number;\n cost?: number;\n requests: number;\n}\n\ninterface UsageByProvider {\n providerId: string;\n tokens: number;\n requests: number;\n}\n\ninterface UsageResponse {\n totals: UsageTotals;\n byProvider?: UsageByProvider[];\n byModel?: Array<{ modelId: string; tokens: number; requests: number }>;\n series?: Array<{ ts: number; tokens: number }>;\n}\n\ninterface LimitEntry {\n providerId?: string;\n modelId?: string;\n remaining?: number;\n limit?: number;\n}\n\ninterface LimitsResponse {\n models: LimitEntry[];\n}\n\nconst RANGE_OPTIONS: Array<{ id: Range; label: string }> = [\n { id: '24h', label: '24 hours' },\n { id: '7d', label: '7 days' },\n { id: '30d', label: '30 days' },\n];\n\nfunction fmtTokens(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(1)}k`;\n return `${(n / 1_000_000).toFixed(2)}M`;\n}\n\nfunction StatTile({ label, value, sub, icon: Icon }: { label: string; value: string; sub?: string; icon: typeof BarChart3 }): JSX.Element {\n return (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1}>\n <Inline align=\"center\" gap={2}>\n <Icon size={14} aria-hidden />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{label}</span>\n </Inline>\n <strong style={{ fontSize: 'var(--fs-18)', fontFamily: 'var(--font-mono)' }}>{value}</strong>\n {sub && <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{sub}</span>}\n </Stack>\n </CardBody>\n </Card>\n );\n}\n\nexport function UsageView(): JSX.Element {\n const [range, setRange] = useState<Range>('24h');\n const res = useFetch<UsageResponse>(`/api/usage?range=${range}`);\n const limits = useFetch<LimitsResponse>('/api/usage/limits');\n\n useEffect(() => {\n // refetch on range change is implicit (useFetch re-keys on URL change).\n }, [range]);\n\n const totals = res.data?.totals;\n const byProvider = res.data?.byProvider ?? [];\n const byModel = res.data?.byModel ?? [];\n const maxProvider = byProvider.reduce((m, p) => Math.max(m, p.tokens), 0);\n\n return (\n <Stack gap={5} data-testid=\"usage-view\">\n <ViewHeader\n title=\"Usage\"\n description=\"Token consumption + quota limits from the rolling JSONL log.\"\n actions={\n <Inline gap={1}>\n {RANGE_OPTIONS.map((r) => (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => setRange(r.id)}\n aria-pressed={range === r.id}\n data-testid={`usage-range-${r.id}`}\n style={{\n padding: '4px 10px',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: range === r.id ? 'var(--accent)' : 'var(--surface-1)',\n color: range === r.id ? 'var(--accent-fg)' : 'var(--fg)',\n fontSize: 'var(--fs-12)',\n cursor: 'pointer',\n }}\n >\n {r.label}\n </button>\n ))}\n </Inline>\n }\n />\n\n <Grid cols={3}>\n <StatTile\n label=\"Total tokens\"\n icon={BarChart3}\n value={res.loading ? '…' : fmtTokens(totals?.tokens ?? 0)}\n sub={totals ? `${totals.requests} requests` : ''}\n />\n <StatTile\n label=\"Distinct providers\"\n icon={TrendingUp}\n value={res.loading ? '…' : String(byProvider.length)}\n />\n <StatTile\n label=\"Live limits\"\n icon={Zap}\n value={limits.loading ? '…' : String(limits.data?.models?.length ?? 0)}\n sub=\"active quotas\"\n />\n </Grid>\n\n {res.loading ? (\n <Skeleton style={{ height: 200 }} />\n ) : res.error && byProvider.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't load usage\"\n description=\"Token analytics failed to fetch. Retry to refetch.\"\n error={res.error}\n onRetry={() => void res.refetch()}\n testid=\"usage-error\"\n />\n ) : byProvider.length === 0 ? (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={1} align=\"center\" style={{ padding: 'var(--space-4)' }}>\n <Clock size={24} aria-hidden />\n <span style={{ color: 'var(--fg-muted)' }}>No usage records for the last {range}.</span>\n </Stack>\n </CardBody>\n </Card>\n ) : (\n <Card variant=\"default\">\n <CardBody>\n <Stack gap={3}>\n <strong>By provider</strong>\n <Stack gap={2}>\n {byProvider.map((p) => (\n <Stack key={p.providerId} gap={1}>\n <Inline align=\"center\" justify=\"between\">\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{p.providerId}</span>\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {fmtTokens(p.tokens)} · {p.requests} req\n </span>\n </Inline>\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={maxProvider || 1}\n aria-valuenow={p.tokens}\n style={{\n height: 6,\n background: 'var(--surface-1)',\n borderRadius: 'var(--radius-pill)',\n overflow: 'hidden',\n }}\n >\n <div style={{ width: `${maxProvider > 0 ? (p.tokens / maxProvider) * 100 : 0}%`, height: '100%', background: 'var(--accent)' }} />\n </div>\n </Stack>\n ))}\n </Stack>\n {byModel.length > 0 && (\n <Stack gap={2}>\n <strong>Top models</strong>\n {byModel.slice(0, 5).map((m) => (\n <Inline key={m.modelId} align=\"center\" justify=\"between\" style={{ fontSize: 'var(--fs-12)' }}>\n <code style={{ fontFamily: 'var(--font-mono)' }}>{m.modelId}</code>\n <span style={{ color: 'var(--fg-muted)' }}>{fmtTokens(m.tokens)}</span>\n </Inline>\n ))}\n </Stack>\n )}\n </Stack>\n </CardBody>\n </Card>\n )}\n </Stack>\n );\n}"],"names":["RANGE_OPTIONS","fmtTokens","n","StatTile","label","value","sub","Icon","jsx","Card","CardBody","jsxs","Stack","Inline","UsageView","range","setRange","useState","res","useFetch","limits","useEffect","totals","_a","byProvider","_b","byModel","_c","maxProvider","m","p","ViewHeader","Grid","BarChart3","TrendingUp","Zap","_e","_d","Skeleton","ErrorState","Clock"],"mappings":"qkBA+CA,MAAMA,EAAqD,CACzD,CAAE,GAAI,MAAO,MAAO,UAAA,EACpB,CAAE,GAAI,KAAM,MAAO,QAAA,EACnB,CAAE,GAAI,MAAO,MAAO,SAAA,CACtB,EAEA,SAASC,EAAUC,EAAmB,CACpC,OAAIA,EAAI,IAAa,OAAOA,CAAC,EACzBA,EAAI,IAAkB,IAAIA,EAAI,KAAM,QAAQ,CAAC,CAAC,IAC3C,IAAIA,EAAI,KAAW,QAAQ,CAAC,CAAC,GACtC,CAEA,SAASC,EAAS,CAAE,MAAAC,EAAO,MAAAC,EAAO,IAAAC,EAAK,KAAMC,GAA6F,CACxI,OACEC,EAAAA,IAACC,GAAK,QAAQ,UACZ,eAACC,EAAA,CACC,SAAAC,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAD,EAAAA,KAACE,EAAA,CAAO,MAAM,SAAS,IAAK,EAC1B,SAAA,CAAAL,EAAAA,IAACD,EAAA,CAAK,KAAM,GAAI,cAAW,GAAC,EAC5BC,EAAAA,IAAC,QAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,iBAAA,EAAsB,SAAAJ,CAAA,CAAM,CAAA,EAC9E,EACAI,EAAAA,IAAC,UAAO,MAAO,CAAE,SAAU,eAAgB,WAAY,kBAAA,EAAuB,SAAAH,CAAA,CAAM,EACnFC,GAAOE,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,mBAAsB,SAAAF,CAAA,CAAI,CAAA,CAAA,CACpF,EACF,EACF,CAEJ,CAEO,SAASQ,GAAyB,eACvC,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAgB,KAAK,EACzCC,EAAMC,EAAwB,oBAAoBJ,CAAK,EAAE,EACzDK,EAASD,EAAyB,mBAAmB,EAE3DE,EAAAA,UAAU,IAAM,CAEhB,EAAG,CAACN,CAAK,CAAC,EAEV,MAAMO,GAASC,EAAAL,EAAI,OAAJ,YAAAK,EAAU,OACnBC,IAAaC,EAAAP,EAAI,OAAJ,YAAAO,EAAU,aAAc,CAAA,EACrCC,IAAUC,EAAAT,EAAI,OAAJ,YAAAS,EAAU,UAAW,CAAA,EAC/BC,EAAcJ,EAAW,OAAO,CAACK,EAAGC,IAAM,KAAK,IAAID,EAAGC,EAAE,MAAM,EAAG,CAAC,EAExE,OACEnB,EAAAA,KAACC,EAAA,CAAM,IAAK,EAAG,cAAY,aACzB,SAAA,CAAAJ,EAAAA,IAACuB,EAAA,CACC,MAAM,QACN,YAAY,+DACZ,cACGlB,EAAA,CAAO,IAAK,EACV,SAAAb,EAAc,IAAK,GAClBQ,EAAAA,IAAC,SAAA,CAEC,KAAK,SACL,QAAS,IAAMQ,EAAS,EAAE,EAAE,EAC5B,eAAcD,IAAU,EAAE,GAC1B,cAAa,eAAe,EAAE,EAAE,GAChC,MAAO,CACL,QAAS,WACT,OAAQ,0BACR,aAAc,mBACd,WAAYA,IAAU,EAAE,GAAK,gBAAkB,mBAC/C,MAAOA,IAAU,EAAE,GAAK,mBAAqB,YAC7C,SAAU,eACV,OAAQ,SAAA,EAGT,SAAA,EAAE,KAAA,EAfE,EAAE,EAAA,CAiBV,CAAA,CACH,CAAA,CAAA,EAIJJ,EAAAA,KAACqB,EAAA,CAAK,KAAM,EACV,SAAA,CAAAxB,EAAAA,IAACL,EAAA,CACC,MAAM,eACN,KAAM8B,EACN,MAAOf,EAAI,QAAU,IAAMjB,GAAUqB,GAAA,YAAAA,EAAQ,SAAU,CAAC,EACxD,IAAKA,EAAS,GAAGA,EAAO,QAAQ,YAAc,EAAA,CAAA,EAEhDd,EAAAA,IAACL,EAAA,CACC,MAAM,qBACN,KAAM+B,EACN,MAAOhB,EAAI,QAAU,IAAM,OAAOM,EAAW,MAAM,CAAA,CAAA,EAErDhB,EAAAA,IAACL,EAAA,CACC,MAAM,cACN,KAAMgC,EACN,MAAOf,EAAO,QAAU,IAAM,SAAOgB,GAAAC,EAAAjB,EAAO,OAAP,YAAAiB,EAAa,SAAb,YAAAD,EAAqB,SAAU,CAAC,EACrE,IAAI,eAAA,CAAA,CACN,EACF,EAEClB,EAAI,QACHV,EAAAA,IAAC8B,EAAA,CAAS,MAAO,CAAE,OAAQ,GAAA,CAAI,CAAG,EAChCpB,EAAI,OAASM,EAAW,SAAW,EACrChB,EAAAA,IAAC+B,EAAA,CACC,MAAK,GACL,MAAM,sBACN,YAAY,qDACZ,MAAOrB,EAAI,MACX,QAAS,IAAM,KAAKA,EAAI,QAAA,EACxB,OAAO,aAAA,CAAA,EAEPM,EAAW,SAAW,QACvBf,EAAA,CAAK,QAAQ,UACZ,SAAAD,EAAAA,IAACE,EAAA,CACC,gBAACE,EAAA,CAAM,IAAK,EAAG,MAAM,SAAS,MAAO,CAAE,QAAS,kBAC9C,SAAA,CAAAJ,EAAAA,IAACgC,EAAA,CAAM,KAAM,GAAI,cAAW,GAAC,SAC5B,OAAA,CAAK,MAAO,CAAE,MAAO,mBAAqB,SAAA,CAAA,iCAA+BzB,EAAM,GAAA,CAAA,CAAC,CAAA,CAAA,CACnF,CAAA,CACF,EACF,EAEAP,EAAAA,IAACC,EAAA,CAAK,QAAQ,UACZ,SAAAD,EAAAA,IAACE,EAAA,CACC,SAAAC,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAJ,EAAAA,IAAC,UAAO,SAAA,aAAA,CAAW,EACnBA,EAAAA,IAACI,EAAA,CAAM,IAAK,EACT,SAAAY,EAAW,IAAKM,GACfnB,EAAAA,KAACC,EAAA,CAAyB,IAAK,EAC7B,SAAA,CAAAD,EAAAA,KAACE,EAAA,CAAO,MAAM,SAAS,QAAQ,UAC7B,SAAA,CAAAL,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,WAAY,mBAAoB,SAAU,cAAA,EAAmB,SAAAsB,EAAE,UAAA,CAAW,EACzFnB,EAAAA,KAAC,OAAA,CAAK,MAAO,CAAE,WAAY,mBAAoB,SAAU,eAAgB,MAAO,iBAAA,EAC7E,SAAA,CAAAV,EAAU6B,EAAE,MAAM,EAAE,MAAIA,EAAE,SAAS,MAAA,CAAA,CACtC,CAAA,EACF,EACAtB,EAAAA,IAAC,MAAA,CACC,KAAK,cACL,gBAAe,EACf,gBAAeoB,GAAe,EAC9B,gBAAeE,EAAE,OACjB,MAAO,CACL,OAAQ,EACR,WAAY,mBACZ,aAAc,qBACd,SAAU,QAAA,EAGZ,eAAC,MAAA,CAAI,MAAO,CAAE,MAAO,GAAGF,EAAc,EAAKE,EAAE,OAASF,EAAe,IAAM,CAAC,IAAK,OAAQ,OAAQ,WAAY,gBAAgB,CAAG,CAAA,CAAA,CAClI,CAAA,EApBUE,EAAE,UAqBd,CACD,EACH,EACCJ,EAAQ,OAAS,GAChBf,EAAAA,KAACC,EAAA,CAAM,IAAK,EACV,SAAA,CAAAJ,EAAAA,IAAC,UAAO,SAAA,YAAA,CAAU,EACjBkB,EAAQ,MAAM,EAAG,CAAC,EAAE,IAAKG,GACxBlB,EAAAA,KAACE,EAAA,CAAuB,MAAM,SAAS,QAAQ,UAAU,MAAO,CAAE,SAAU,gBAC1E,SAAA,CAAAL,MAAC,QAAK,MAAO,CAAE,WAAY,kBAAA,EAAuB,WAAE,QAAQ,EAC5DA,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAO,mBAAsB,SAAAP,EAAU4B,EAAE,MAAM,CAAA,CAAE,CAAA,CAAA,EAFrDA,EAAE,OAGf,CACD,CAAA,CAAA,CACH,CAAA,CAAA,CAEJ,EACF,CAAA,CACF,CAAA,EAEJ,CAEJ"}
@@ -1,6 +0,0 @@
1
- import{r as f,j as e}from"./cmdk-C3F6LD6N.js";import{d as x,g as m}from"./main-BRmJZcHt.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 y=x("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]),w=f.forwardRef(function(n,o){const{title:c,description:s,breadcrumb:r,action:d,actions:p,meta:t,className:h,style:v,...g}=n;return e.jsxs("header",{ref:o,className:m("v8-view-header",h),style:{display:"flex",flexDirection:"column",gap:"var(--space-2)",padding:"var(--space-4) 0 var(--space-5)",borderBottom:"1px solid var(--border)",marginBottom:"var(--space-5)",...v},...g,children:[r!==void 0&&r.length>0&&e.jsx("nav",{"aria-label":"Breadcrumb",style:{display:"flex",alignItems:"center",gap:4,fontSize:"var(--fs-12)",color:"var(--fg-subtle)",marginBottom:"var(--space-1)"},children:r.map((a,i)=>{const l=i===r.length-1;return e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[a.onClick!==void 0?e.jsx("button",{onClick:a.onClick,style:{background:"transparent",border:0,padding:0,font:"inherit",color:"inherit",cursor:"pointer"},children:a.label}):e.jsx("span",{style:{color:l?"var(--fg)":"inherit"},children:a.label}),!l&&e.jsx(y,{size:12,"aria-hidden":"true",style:{color:"var(--fg-subtle)"}})]},i)})}),e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-4)"},children:[e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("h1",{style:{fontSize:"var(--fs-24)",lineHeight:"var(--lh-tight)",fontWeight:600,margin:0,color:"var(--fg)"},children:c}),s!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",marginTop:4},children:s})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)",flexShrink:0},children:[p,d]})]}),t!==void 0&&e.jsx("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)",flexWrap:"wrap"},children:t})]})});export{y as C,w as V};
@@ -1 +0,0 @@
1
- {"version":3,"file":"ViewHeader-BsnaspKw.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../../src/web/v8/ui/data/ViewHeader.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 ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { ChevronRight } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * ViewHeader — page-level header pattern (title, description, breadcrumb, actions).\n *\n * Layout:\n * [Breadcrumb]\n * [Title] [Primary action]\n * [Description] [Secondary actions...]\n *\n * Use at the top of every view: Overview, Tasks, Goals, Agents, etc.\n */\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface ViewHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: ReactNode;\n description?: ReactNode;\n /** Optional breadcrumb trail rendered above the title. */\n breadcrumb?: readonly BreadcrumbItem[];\n /** Primary action (e.g. \"New task\"). */\n action?: ReactNode;\n /** Secondary actions (e.g. filter, export). */\n actions?: ReactNode;\n /** Optional metadata row below the description (e.g. status pills, counts). */\n meta?: ReactNode;\n}\n\nexport const ViewHeader = forwardRef<HTMLDivElement, ViewHeaderProps>(function ViewHeader(\n props,\n ref,\n) {\n const { title, description, breadcrumb, action, actions, meta, className, style, ...rest } = props;\n return (\n <header\n ref={ref}\n className={cx('v8-view-header', className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-2)',\n padding: 'var(--space-4) 0 var(--space-5)',\n borderBottom: '1px solid var(--border)',\n marginBottom: 'var(--space-5)',\n ...style,\n }}\n {...rest}\n >\n {breadcrumb !== undefined && breadcrumb.length > 0 && (\n <nav\n aria-label=\"Breadcrumb\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n marginBottom: 'var(--space-1)',\n }}\n >\n {breadcrumb.map((item, i) => {\n const isLast = i === breadcrumb.length - 1;\n return (\n <span\n key={i}\n style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}\n >\n {item.onClick !== undefined ? (\n <button\n onClick={item.onClick}\n style={{\n background: 'transparent',\n border: 0,\n padding: 0,\n font: 'inherit',\n color: 'inherit',\n cursor: 'pointer',\n }}\n >\n {item.label}\n </button>\n ) : (\n <span style={{ color: isLast ? 'var(--fg)' : 'inherit' }}>{item.label}</span>\n )}\n {!isLast && (\n <ChevronRight size={12} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n )}\n </span>\n );\n })}\n </nav>\n )}\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-4)' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <h1 style={{ fontSize: 'var(--fs-24)', lineHeight: 'var(--lh-tight)', fontWeight: 600, margin: 0, color: 'var(--fg)' }}>\n {title}\n </h1>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)', marginTop: 4 }}>\n {description}\n </div>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)', flexShrink: 0 }}>\n {actions}\n {action}\n </div>\n </div>\n {meta !== undefined && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)', flexWrap: 'wrap' }}>\n {meta}\n </div>\n )}\n </header>\n );\n});"],"names":["ChevronRight","createLucideIcon","ViewHeader","forwardRef","props","ref","title","description","breadcrumb","action","actions","meta","className","style","rest","jsxs","cx","jsx","item","isLast"],"mappings":"4FAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC,ECuBYC,EAAaC,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CAAE,MAAAC,EAAO,YAAAC,EAAa,WAAAC,EAAY,OAAAC,EAAQ,QAAAC,EAAS,KAAAC,EAAM,UAAAC,EAAW,MAAAC,EAAO,GAAGC,CAAA,EAASV,EAC7F,OACEW,EAAAA,KAAC,SAAA,CACC,IAAAV,EACA,UAAWW,EAAG,iBAAkBJ,CAAS,EACzC,MAAO,CACL,QAAS,OACT,cAAe,SACf,IAAK,iBACL,QAAS,kCACT,aAAc,0BACd,aAAc,iBACd,GAAGC,CAAA,EAEJ,GAAGC,EAEH,SAAA,CAAAN,IAAe,QAAaA,EAAW,OAAS,GAC/CS,EAAAA,IAAC,MAAA,CACC,aAAW,aACX,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,EACL,SAAU,eACV,MAAO,mBACP,aAAc,gBAAA,EAGf,SAAAT,EAAW,IAAI,CAACU,EAAM,IAAM,CAC3B,MAAMC,EAAS,IAAMX,EAAW,OAAS,EACzC,OACEO,EAAAA,KAAC,OAAA,CAEC,MAAO,CAAE,QAAS,cAAe,WAAY,SAAU,IAAK,CAAA,EAE3D,SAAA,CAAAG,EAAK,UAAY,OAChBD,EAAAA,IAAC,SAAA,CACC,QAASC,EAAK,QACd,MAAO,CACL,WAAY,cACZ,OAAQ,EACR,QAAS,EACT,KAAM,UACN,MAAO,UACP,OAAQ,SAAA,EAGT,SAAAA,EAAK,KAAA,CAAA,EAGRD,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAOE,EAAS,YAAc,SAAA,EAAc,SAAAD,EAAK,KAAA,CAAM,EAEvE,CAACC,GACAF,EAAAA,IAACjB,EAAA,CAAa,KAAM,GAAI,cAAY,OAAO,MAAO,CAAE,MAAO,kBAAA,CAAmB,CAAG,CAAA,CAAA,EArB9E,CAAA,CAyBX,CAAC,CAAA,CAAA,EAGLe,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,aAAc,eAAgB,gBAAiB,IAAK,gBAAA,EAC7F,SAAA,CAAAA,OAAC,OAAI,MAAO,CAAE,KAAM,EAAG,SAAU,GAC/B,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,MAAO,CAAE,SAAU,eAAgB,WAAY,kBAAmB,WAAY,IAAK,OAAQ,EAAG,MAAO,aACtG,SAAAX,EACH,EACCC,IAAgB,QACfU,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAmB,UAAW,CAAA,EAC1E,SAAAV,CAAA,CACH,CAAA,EAEJ,EACAQ,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,WAAY,CAAA,EACrF,SAAA,CAAAL,EACAD,CAAA,CAAA,CACH,CAAA,EACF,EACCE,IAAS,QACRM,MAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,iBAAkB,SAAU,MAAA,EACnF,SAAAN,CAAA,CACH,CAAA,CAAA,CAAA,CAIR,CAAC","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- import{r as i,j as e}from"./cmdk-C3F6LD6N.js";import{u as j,S as u,I as h,B as d,h as m,a0 as y,i as C,F as S}from"./main-BRmJZcHt.js";import{V as w}from"./ViewHeader-BsnaspKw.js";import{C as b,b as k}from"./Card-Clkvh43Q.js";import{S as E,a as U}from"./Sheet-BwMVGN-8.js";import{E as z}from"./EmptyState-ccT__JZG.js";import{R as $}from"./refresh-ccw-DN_zCB1h.js";import{U as F}from"./upload-BZCtmqIh.js";import{T as V}from"./trash-2-B_Y6HrfN.js";function H(){const s=j("/api/voice/list"),[g,r]=i.useState(null),[x,o]=i.useState(!1),[c,p]=i.useState(null),l=i.useMemo(()=>{var a;return((a=s.data)==null?void 0:a.memos)??[]},[s.data]),n=i.useCallback(()=>{s.refetch()},[s]),f=async a=>{p(null);try{await C(`/api/voice/${a}`,{method:"DELETE"}),r(null),n()}catch(t){p((t instanceof S,t.message))}};return e.jsxs(u,{gap:4,"data-testid":"voice-view",children:[e.jsx(w,{title:"Voice",description:"Voice memos. Upload a recording; play it inline.",actions:e.jsxs(h,{align:"center",gap:2,children:[c!==null&&e.jsx("span",{role:"alert","data-testid":"voice-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:c}),e.jsxs(d,{variant:"ghost",onClick:()=>void n(),"data-testid":"voice-refresh",children:[e.jsx($,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(d,{variant:"primary",onClick:()=>o(!0),"data-testid":"voice-upload",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Upload"]})]})}),e.jsx(b,{variant:"default",children:e.jsx(k,{children:s.loading&&l.length===0?e.jsxs(u,{gap:1,children:[e.jsx(m,{style:{height:48}}),e.jsx(m,{style:{height:48}})]}):l.length===0?e.jsx(z,{icon:e.jsx(y,{size:28,"aria-hidden":!0}),title:"No voice memos",description:"Voice memos are audio recordings captured during sessions — useful for verbal scratch notes and hands-free capture. Upload a .wav, .mp3, or .m4a file to get started."}):e.jsx(u,{gap:1,children:l.map(a=>{const t=g===a.id;return e.jsxs("div",{"data-testid":`voice-row-${a.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(h,{align:"center",justify:"between",gap:2,children:[e.jsxs(u,{gap:0,style:{minWidth:0,flex:1},children:[e.jsxs(h,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:a.filename||a.id}),a.durationMs!==void 0&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[(a.durationMs/1e3).toFixed(1),"s"]}),a.createdAt&&e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:a.createdAt})]}),e.jsx("audio",{controls:!0,preload:"none","data-testid":`voice-audio-${a.id}`,src:`/api/voice/${a.id}/audio`,style:{width:"100%",maxWidth:480}})]}),e.jsx(d,{variant:"ghost",onClick:()=>r(v=>v===a.id?null:a.id),"data-testid":`voice-delete-${a.id}`,"aria-label":`Delete ${a.id}`,children:e.jsx(V,{size:14,"aria-hidden":!0})})]}),t&&e.jsxs(h,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(d,{variant:"danger",onClick:()=>void f(a.id),"data-testid":`voice-confirm-delete-${a.id}`,children:"Confirm delete"}),e.jsx(d,{variant:"ghost",onClick:()=>r(null),children:"Cancel"})]})]},a.id)})})})}),e.jsx(E,{open:x,onOpenChange:o,children:e.jsx(U,{side:"right",title:"Upload voice memo",description:"Pick a .wav / .mp3 / .m4a file.",children:e.jsx(D,{onSubmit:async a=>{const t=new FormData;t.append("file",a);const v=await fetch("/api/voice/upload",{method:"POST",body:t});if(!v.ok)throw new Error(`upload failed: ${v.status}`);o(!1),n()},onCancel:()=>o(!1)})})})]})}function D({onSubmit:s,onCancel:g}){const[r,x]=i.useState(null),[o,c]=i.useState(!1),[p,l]=i.useState(null);return e.jsxs(u,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsx("input",{type:"file",accept:"audio/*","data-testid":"voice-upload-input",onChange:n=>{var f;return x(((f=n.target.files)==null?void 0:f[0])??null)}}),p!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:p}),e.jsxs(h,{justify:"end",gap:2,children:[e.jsx(d,{variant:"ghost",onClick:g,children:"Cancel"}),e.jsx(d,{variant:"primary",disabled:o||!r,"data-testid":"voice-upload-submit",onClick:async()=>{if(r){c(!0),l(null);try{await s(r)}catch(n){l(n.message),c(!1)}}},children:o?"Uploading…":"Upload"})]})]})}export{H as VoiceView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"VoiceView-rWE8vziD.js","sources":["../../src/web/v8/views/Voice/VoiceView.tsx"],"sourcesContent":["/**\n * v8/views/Voice/VoiceView.tsx — Sprint S43, v9.3.0.\n *\n * Voice memo list (GET /api/voice/list), per-row audio player\n * (GET /api/voice/:id/audio) + inline-confirm Delete\n * (DELETE /api/voice/:id), and Upload Sheet that POSTs FormData to\n * /api/voice/upload.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { Mic, Upload, Trash2, 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 { 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 VoiceMemo {\n id: string;\n filename?: string;\n durationMs?: number;\n createdAt?: string;\n size?: number;\n contentType?: string;\n}\n\nexport function VoiceView(): JSX.Element {\n const payload = useFetch<{ memos: VoiceMemo[] }>('/api/voice/list');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [uploading, setUploading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const memos = useMemo<VoiceMemo[]>(() => payload.data?.memos ?? [], [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/voice/${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=\"voice-view\">\n <ViewHeader\n title=\"Voice\"\n description=\"Voice memos. Upload a recording; play it inline.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"voice-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"voice-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setUploading(true)} data-testid=\"voice-upload\">\n <Upload size={14} aria-hidden /> Upload\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && memos.length === 0 ? (\n <Stack gap={1}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n ) : memos.length === 0 ? (\n <EmptyState icon={<Mic size={28} aria-hidden />} title=\"No voice memos\" description=\"Voice memos are audio recordings captured during sessions — useful for verbal scratch notes and hands-free capture. Upload a .wav, .mp3, or .m4a file to get started.\" />\n ) : (\n <Stack gap={1}>\n {memos.map((m) => {\n const isConfirming = confirmDelete === m.id;\n return (\n <div\n key={m.id}\n data-testid={`voice-row-${m.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)' }}>{m.filename || m.id}</strong>\n {m.durationMs !== undefined && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {(m.durationMs / 1000).toFixed(1)}s\n </span>\n )}\n {m.createdAt && (\n <span style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>{m.createdAt}</span>\n )}\n </Inline>\n <audio\n controls\n preload=\"none\"\n data-testid={`voice-audio-${m.id}`}\n src={`/api/voice/${m.id}/audio`}\n style={{ width: '100%', maxWidth: 480 }}\n />\n </Stack>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete((cur) => (cur === m.id ? null : m.id))} data-testid={`voice-delete-${m.id}`} aria-label={`Delete ${m.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(m.id)} data-testid={`voice-confirm-delete-${m.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={uploading} onOpenChange={setUploading}>\n <SheetContent side=\"right\" title=\"Upload voice memo\" description=\"Pick a .wav / .mp3 / .m4a file.\">\n <UploadForm\n onSubmit={async (file) => {\n const fd = new FormData();\n fd.append('file', file);\n const r = await fetch('/api/voice/upload', { method: 'POST', body: fd });\n if (!r.ok) throw new Error(`upload failed: ${r.status}`);\n setUploading(false);\n refresh();\n }}\n onCancel={() => setUploading(false)}\n />\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction UploadForm({\n onSubmit,\n onCancel,\n}: {\n onSubmit: (file: File) => Promise<void>;\n onCancel: () => void;\n}): JSX.Element {\n const [file, setFile] = useState<File | null>(null);\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 <input\n type=\"file\"\n accept=\"audio/*\"\n data-testid=\"voice-upload-input\"\n onChange={(e) => setFile((e.target as HTMLInputElement).files?.[0] ?? null)}\n />\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 || !file}\n data-testid=\"voice-upload-submit\"\n onClick={async () => {\n if (!file) return;\n setBusy(true);\n setError(null);\n try { await onSubmit(file); }\n catch (err) { setError((err as Error).message); setBusy(false); }\n }}\n >\n {busy ? 'Uploading…' : 'Upload'}\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["VoiceView","payload","useFetch","confirmDelete","setConfirmDelete","useState","uploading","setUploading","error","setError","memos","useMemo","_a","refresh","useCallback","drop","id","fetchJson","err","FetchError","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Upload","Card","CardBody","Skeleton","EmptyState","Mic","m","isConfirming","cur","Trash2","Sheet","SheetContent","UploadForm","file","fd","r","onSubmit","onCancel","setFile","busy","setBusy","e"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import{d as a}from"./main-BRmJZcHt.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 t=a("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);export{t as B};
@@ -1 +0,0 @@
1
- {"version":3,"file":"brain-D7k5s8vH.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/brain.js"],"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 Brain = createLucideIcon(\"Brain\", [\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z\",\n key: \"l5xja\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z\",\n key: \"ep3f8r\"\n }\n ],\n [\"path\", { d: \"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4\", key: \"1p4c4q\" }],\n [\"path\", { d: \"M17.599 6.5a3 3 0 0 0 .399-1.375\", key: \"tmeiqw\" }],\n [\"path\", { d: \"M6.003 5.125A3 3 0 0 0 6.401 6.5\", key: \"105sqy\" }],\n [\"path\", { d: \"M3.477 10.896a4 4 0 0 1 .585-.396\", key: \"ql3yin\" }],\n [\"path\", { d: \"M19.938 10.5a4 4 0 0 1 .585.396\", key: \"1qfode\" }],\n [\"path\", { d: \"M6 18a4 4 0 0 1-1.967-.516\", key: \"2e4loj\" }],\n [\"path\", { d: \"M19.967 17.484A4 4 0 0 1 18 18\", key: \"159ez6\" }]\n]);\n\nexport { Brain as default };\n//# sourceMappingURL=brain.js.map\n"],"names":["Brain","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAQC,EAAiB,QAAS,CACtC,CACE,OACA,CACE,EAAG,uFACH,IAAK,OACX,CACA,EACE,CACE,OACA,CACE,EAAG,uFACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,QAAQ,CAAE,EAC3E,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,oCAAqC,IAAK,QAAQ,CAAE,EAClE,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,6BAA8B,IAAK,QAAQ,CAAE,EAC3D,CAAC,OAAQ,CAAE,EAAG,iCAAkC,IAAK,QAAQ,CAAE,CACjE,CAAC","x_google_ignoreList":[0]}
@@ -1,6 +0,0 @@
1
- import{d as e}from"./main-BRmJZcHt.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 a=e("Calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);export{a as C};
@@ -1 +0,0 @@
1
- {"version":3,"file":"calendar-CAZoDd-l.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/calendar.js"],"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 Calendar = createLucideIcon(\"Calendar\", [\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }]\n]);\n\nexport { Calendar as default };\n//# sourceMappingURL=calendar.js.map\n"],"names":["Calendar","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CAAC,OAAQ,CAAE,EAAG,SAAU,IAAK,QAAQ,CAAE,EACvC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EAC9E,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC","x_google_ignoreList":[0]}
@@ -1,6 +0,0 @@
1
- import{d as c}from"./main-BRmJZcHt.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 r=c("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);export{r as C};
@@ -1 +0,0 @@
1
- {"version":3,"file":"circle-D99cZJBr.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/circle.js"],"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 Circle = createLucideIcon(\"Circle\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n]);\n\nexport { Circle as default };\n//# sourceMappingURL=circle.js.map\n"],"names":["Circle","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,QAAQ,CAAE,CAC3D,CAAC","x_google_ignoreList":[0]}
@@ -1,6 +0,0 @@
1
- import{d as e}from"./main-BRmJZcHt.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 r=e("CircleAlert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);export{r as C};
@@ -1 +0,0 @@
1
- {"version":3,"file":"circle-alert-QQTU4Quz.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/circle-alert.js"],"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 CircleAlert = createLucideIcon(\"CircleAlert\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n]);\n\nexport { CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n"],"names":["CircleAlert","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAcC,EAAiB,cAAe,CAClD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,IAAK,GAAI,KAAM,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,QAAS,GAAI,KAAM,GAAI,KAAM,IAAK,QAAQ,CAAE,CACvE,CAAC","x_google_ignoreList":[0]}
@@ -1,6 +0,0 @@
1
- import{d as c}from"./main-BRmJZcHt.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 r=c("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);export{r as C};
@@ -1 +0,0 @@
1
- {"version":3,"file":"circle-check-BMbe7Kkr.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/circle-check.js"],"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 CircleCheck = createLucideIcon(\"CircleCheck\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { CircleCheck as default };\n//# sourceMappingURL=circle-check.js.map\n"],"names":["CircleCheck","createLucideIcon"],"mappings":"uCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAcC,EAAiB,cAAe,CAClD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC","x_google_ignoreList":[0]}
@@ -1,6 +0,0 @@
1
- import{d as c}from"./main-BRmJZcHt.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 o=c("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);export{o as C};