@jlongo78/agent-spaces 0.9.8 → 0.9.9

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 (356) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +3 -0
  3. package/.next/standalone/.next/build-manifest.json +2 -2
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/routes-manifest.json +23 -0
  6. package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page.js.nft.json +1 -1
  7. package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/(desktop)/admin/users/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(desktop)/analytics/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(desktop)/cortex/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(desktop)/network/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(desktop)/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(desktop)/projects/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(desktop)/sessions/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(desktop)/settings/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/(desktop)/terminal/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/(desktop)/terminal/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(desktop)/workspaces/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  23. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  24. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  25. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  26. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  27. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  28. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  29. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  31. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  32. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  33. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  34. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  35. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  36. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  37. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  38. package/.next/standalone/.next/server/app/admin/analytics.html +1 -1
  39. package/.next/standalone/.next/server/app/admin/analytics.rsc +3 -3
  40. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics/__PAGE__.segment.rsc +2 -2
  41. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics.segment.rsc +1 -1
  42. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  43. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  44. package/.next/standalone/.next/server/app/admin/analytics.segments/_full.segment.rsc +3 -3
  45. package/.next/standalone/.next/server/app/admin/analytics.segments/_head.segment.rsc +1 -1
  46. package/.next/standalone/.next/server/app/admin/analytics.segments/_index.segment.rsc +2 -2
  47. package/.next/standalone/.next/server/app/admin/analytics.segments/_tree.segment.rsc +2 -2
  48. package/.next/standalone/.next/server/app/admin/users.html +1 -1
  49. package/.next/standalone/.next/server/app/admin/users.rsc +2 -2
  50. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users/__PAGE__.segment.rsc +1 -1
  51. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users.segment.rsc +1 -1
  52. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  53. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  54. package/.next/standalone/.next/server/app/admin/users.segments/_full.segment.rsc +2 -2
  55. package/.next/standalone/.next/server/app/admin/users.segments/_head.segment.rsc +1 -1
  56. package/.next/standalone/.next/server/app/admin/users.segments/_index.segment.rsc +2 -2
  57. package/.next/standalone/.next/server/app/admin/users.segments/_tree.segment.rsc +2 -2
  58. package/.next/standalone/.next/server/app/analytics.html +1 -1
  59. package/.next/standalone/.next/server/app/analytics.rsc +2 -2
  60. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics/__PAGE__.segment.rsc +1 -1
  61. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics.segment.rsc +1 -1
  62. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  63. package/.next/standalone/.next/server/app/analytics.segments/_full.segment.rsc +2 -2
  64. package/.next/standalone/.next/server/app/analytics.segments/_head.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/analytics.segments/_index.segment.rsc +2 -2
  66. package/.next/standalone/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  67. package/.next/standalone/.next/server/app/api/claude/usage/route/app-paths-manifest.json +3 -0
  68. package/.next/standalone/.next/server/app/api/claude/usage/route/build-manifest.json +11 -0
  69. package/.next/standalone/.next/server/app/api/claude/usage/route/server-reference-manifest.json +4 -0
  70. package/.next/standalone/.next/server/app/api/claude/usage/route.js +8 -0
  71. package/.next/standalone/.next/server/app/api/claude/usage/route.js.map +5 -0
  72. package/.next/standalone/.next/server/app/api/claude/usage/route.js.nft.json +1 -0
  73. package/.next/standalone/.next/server/app/api/claude/usage/route_client-reference-manifest.js +2 -0
  74. package/.next/standalone/.next/server/app/api/whisper/route.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route/app-paths-manifest.json +3 -0
  76. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route/build-manifest.json +11 -0
  77. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route/server-reference-manifest.json +4 -0
  78. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js +8 -0
  79. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js.map +5 -0
  80. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js.nft.json +1 -0
  81. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route_client-reference-manifest.js +2 -0
  82. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route/app-paths-manifest.json +3 -0
  83. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route/build-manifest.json +11 -0
  84. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route/server-reference-manifest.json +4 -0
  85. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js +8 -0
  86. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js.map +5 -0
  87. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js.nft.json +1 -0
  88. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route_client-reference-manifest.js +2 -0
  89. package/.next/standalone/.next/server/app/cortex.html +1 -1
  90. package/.next/standalone/.next/server/app/cortex.rsc +2 -2
  91. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex/__PAGE__.segment.rsc +1 -1
  92. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex.segment.rsc +1 -1
  93. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  94. package/.next/standalone/.next/server/app/cortex.segments/_full.segment.rsc +2 -2
  95. package/.next/standalone/.next/server/app/cortex.segments/_head.segment.rsc +1 -1
  96. package/.next/standalone/.next/server/app/cortex.segments/_index.segment.rsc +2 -2
  97. package/.next/standalone/.next/server/app/cortex.segments/_tree.segment.rsc +2 -2
  98. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/login.html +1 -1
  100. package/.next/standalone/.next/server/app/login.rsc +2 -2
  101. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +2 -2
  102. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  103. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
  104. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  105. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  106. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  107. package/.next/standalone/.next/server/app/m/page_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/m/projects/page_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/m/projects.html +1 -1
  110. package/.next/standalone/.next/server/app/m/projects.rsc +2 -2
  111. package/.next/standalone/.next/server/app/m/projects.segments/_full.segment.rsc +2 -2
  112. package/.next/standalone/.next/server/app/m/projects.segments/_head.segment.rsc +1 -1
  113. package/.next/standalone/.next/server/app/m/projects.segments/_index.segment.rsc +2 -2
  114. package/.next/standalone/.next/server/app/m/projects.segments/_tree.segment.rsc +2 -2
  115. package/.next/standalone/.next/server/app/m/projects.segments/m/projects/__PAGE__.segment.rsc +1 -1
  116. package/.next/standalone/.next/server/app/m/projects.segments/m/projects.segment.rsc +1 -1
  117. package/.next/standalone/.next/server/app/m/projects.segments/m.segment.rsc +1 -1
  118. package/.next/standalone/.next/server/app/m/sessions/[id]/page_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/m/sessions/page_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/m/sessions.html +1 -1
  121. package/.next/standalone/.next/server/app/m/sessions.rsc +2 -2
  122. package/.next/standalone/.next/server/app/m/sessions.segments/_full.segment.rsc +2 -2
  123. package/.next/standalone/.next/server/app/m/sessions.segments/_head.segment.rsc +1 -1
  124. package/.next/standalone/.next/server/app/m/sessions.segments/_index.segment.rsc +2 -2
  125. package/.next/standalone/.next/server/app/m/sessions.segments/_tree.segment.rsc +2 -2
  126. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions/__PAGE__.segment.rsc +1 -1
  127. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions.segment.rsc +1 -1
  128. package/.next/standalone/.next/server/app/m/sessions.segments/m.segment.rsc +1 -1
  129. package/.next/standalone/.next/server/app/m/settings/page_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/m/settings.html +1 -1
  131. package/.next/standalone/.next/server/app/m/settings.rsc +2 -2
  132. package/.next/standalone/.next/server/app/m/settings.segments/_full.segment.rsc +2 -2
  133. package/.next/standalone/.next/server/app/m/settings.segments/_head.segment.rsc +1 -1
  134. package/.next/standalone/.next/server/app/m/settings.segments/_index.segment.rsc +2 -2
  135. package/.next/standalone/.next/server/app/m/settings.segments/_tree.segment.rsc +2 -2
  136. package/.next/standalone/.next/server/app/m/settings.segments/m/settings/__PAGE__.segment.rsc +1 -1
  137. package/.next/standalone/.next/server/app/m/settings.segments/m/settings.segment.rsc +1 -1
  138. package/.next/standalone/.next/server/app/m/settings.segments/m.segment.rsc +1 -1
  139. package/.next/standalone/.next/server/app/m/terminal/page_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/m/terminal.html +1 -1
  141. package/.next/standalone/.next/server/app/m/terminal.rsc +2 -2
  142. package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +2 -2
  143. package/.next/standalone/.next/server/app/m/terminal.segments/_head.segment.rsc +1 -1
  144. package/.next/standalone/.next/server/app/m/terminal.segments/_index.segment.rsc +2 -2
  145. package/.next/standalone/.next/server/app/m/terminal.segments/_tree.segment.rsc +2 -2
  146. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal/__PAGE__.segment.rsc +1 -1
  147. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal.segment.rsc +1 -1
  148. package/.next/standalone/.next/server/app/m/terminal.segments/m.segment.rsc +1 -1
  149. package/.next/standalone/.next/server/app/m.html +1 -1
  150. package/.next/standalone/.next/server/app/m.rsc +2 -2
  151. package/.next/standalone/.next/server/app/m.segments/_full.segment.rsc +2 -2
  152. package/.next/standalone/.next/server/app/m.segments/_head.segment.rsc +1 -1
  153. package/.next/standalone/.next/server/app/m.segments/_index.segment.rsc +2 -2
  154. package/.next/standalone/.next/server/app/m.segments/_tree.segment.rsc +2 -2
  155. package/.next/standalone/.next/server/app/m.segments/m/__PAGE__.segment.rsc +1 -1
  156. package/.next/standalone/.next/server/app/m.segments/m.segment.rsc +1 -1
  157. package/.next/standalone/.next/server/app/network.html +1 -1
  158. package/.next/standalone/.next/server/app/network.rsc +2 -2
  159. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network/__PAGE__.segment.rsc +1 -1
  160. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network.segment.rsc +1 -1
  161. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  162. package/.next/standalone/.next/server/app/network.segments/_full.segment.rsc +2 -2
  163. package/.next/standalone/.next/server/app/network.segments/_head.segment.rsc +1 -1
  164. package/.next/standalone/.next/server/app/network.segments/_index.segment.rsc +2 -2
  165. package/.next/standalone/.next/server/app/network.segments/_tree.segment.rsc +2 -2
  166. package/.next/standalone/.next/server/app/projects.html +1 -1
  167. package/.next/standalone/.next/server/app/projects.rsc +2 -2
  168. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects/__PAGE__.segment.rsc +1 -1
  169. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects.segment.rsc +1 -1
  170. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  171. package/.next/standalone/.next/server/app/projects.segments/_full.segment.rsc +2 -2
  172. package/.next/standalone/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  173. package/.next/standalone/.next/server/app/projects.segments/_index.segment.rsc +2 -2
  174. package/.next/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  175. package/.next/standalone/.next/server/app/sessions.html +1 -1
  176. package/.next/standalone/.next/server/app/sessions.rsc +2 -2
  177. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions/__PAGE__.segment.rsc +1 -1
  178. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions.segment.rsc +1 -1
  179. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  180. package/.next/standalone/.next/server/app/sessions.segments/_full.segment.rsc +2 -2
  181. package/.next/standalone/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
  182. package/.next/standalone/.next/server/app/sessions.segments/_index.segment.rsc +2 -2
  183. package/.next/standalone/.next/server/app/sessions.segments/_tree.segment.rsc +2 -2
  184. package/.next/standalone/.next/server/app/settings.html +1 -1
  185. package/.next/standalone/.next/server/app/settings.rsc +3 -3
  186. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings/__PAGE__.segment.rsc +2 -2
  187. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings.segment.rsc +1 -1
  188. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  189. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  190. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  191. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  192. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  193. package/.next/standalone/.next/server/app/terminal.html +1 -1
  194. package/.next/standalone/.next/server/app/terminal.rsc +3 -3
  195. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal/__PAGE__.segment.rsc +2 -2
  196. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal.segment.rsc +1 -1
  197. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  198. package/.next/standalone/.next/server/app/terminal.segments/_full.segment.rsc +3 -3
  199. package/.next/standalone/.next/server/app/terminal.segments/_head.segment.rsc +1 -1
  200. package/.next/standalone/.next/server/app/terminal.segments/_index.segment.rsc +2 -2
  201. package/.next/standalone/.next/server/app/terminal.segments/_tree.segment.rsc +2 -2
  202. package/.next/standalone/.next/server/app/vr/page_client-reference-manifest.js +1 -1
  203. package/.next/standalone/.next/server/app/vr.html +1 -1
  204. package/.next/standalone/.next/server/app/vr.rsc +2 -2
  205. package/.next/standalone/.next/server/app/vr.segments/_full.segment.rsc +2 -2
  206. package/.next/standalone/.next/server/app/vr.segments/_head.segment.rsc +1 -1
  207. package/.next/standalone/.next/server/app/vr.segments/_index.segment.rsc +2 -2
  208. package/.next/standalone/.next/server/app/vr.segments/_tree.segment.rsc +2 -2
  209. package/.next/standalone/.next/server/app/vr.segments/vr/__PAGE__.segment.rsc +1 -1
  210. package/.next/standalone/.next/server/app/vr.segments/vr.segment.rsc +1 -1
  211. package/.next/standalone/.next/server/app/workspaces.html +1 -1
  212. package/.next/standalone/.next/server/app/workspaces.rsc +2 -2
  213. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces/__PAGE__.segment.rsc +1 -1
  214. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces.segment.rsc +1 -1
  215. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  216. package/.next/standalone/.next/server/app/workspaces.segments/_full.segment.rsc +2 -2
  217. package/.next/standalone/.next/server/app/workspaces.segments/_head.segment.rsc +1 -1
  218. package/.next/standalone/.next/server/app/workspaces.segments/_index.segment.rsc +2 -2
  219. package/.next/standalone/.next/server/app/workspaces.segments/_tree.segment.rsc +2 -2
  220. package/.next/standalone/.next/server/app-paths-manifest.json +3 -0
  221. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00e90fc6._.js +15 -2
  222. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01ab8675._.js +15 -2
  223. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03974f05._.js +15 -2
  224. package/.next/standalone/.next/server/chunks/[root-of-the-server]__046c9b91._.js +15 -2
  225. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04ae6bf0._.js +15 -2
  226. package/.next/standalone/.next/server/chunks/[root-of-the-server]__056fa416._.js +1 -1
  227. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ac4ea3f._.js +1 -1
  228. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b8e64cb._.js +15 -2
  229. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0facd39e._.js +15 -2
  230. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10bc76a3._.js +1 -1
  231. package/.next/standalone/.next/server/chunks/[root-of-the-server]__115f3934._.js +15 -2
  232. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11f155f1._.js +1 -1
  233. package/.next/standalone/.next/server/chunks/[root-of-the-server]__160e7c73._.js +52 -24
  234. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17a3b966._.js +15 -2
  235. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17d3a2b2._.js +15 -2
  236. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a86c055._.js +15 -2
  237. package/.next/standalone/.next/server/chunks/[root-of-the-server]__20b5e9c4._.js +1 -1
  238. package/.next/standalone/.next/server/chunks/[root-of-the-server]__28d6fbd8._.js +15 -2
  239. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2a3f866b._.js +16 -3
  240. package/.next/standalone/.next/server/chunks/[root-of-the-server]__316617e7._.js +2 -2
  241. package/.next/standalone/.next/server/chunks/[root-of-the-server]__32ad8f71._.js +15 -2
  242. package/.next/standalone/.next/server/chunks/[root-of-the-server]__35457394._.js +15 -2
  243. package/.next/standalone/.next/server/chunks/[root-of-the-server]__35de78e6._.js +15 -2
  244. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3685ffcb._.js +15 -2
  245. package/.next/standalone/.next/server/chunks/[root-of-the-server]__38954988._.js +15 -2
  246. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3a32b624._.js +111 -0
  247. package/.next/standalone/.next/server/chunks/[root-of-the-server]__426ad936._.js +17 -4
  248. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4985c034._.js +15 -2
  249. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c6ce9ed._.js +16 -3
  250. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5cebe58a._.js +15 -2
  251. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5d5e4789._.js +15 -2
  252. package/.next/standalone/.next/server/chunks/[root-of-the-server]__65676930._.js +1 -1
  253. package/.next/standalone/.next/server/chunks/[root-of-the-server]__67cab326._.js +2 -2
  254. package/.next/standalone/.next/server/chunks/[root-of-the-server]__698c6f01._.js +16 -3
  255. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6c64af29._.js +22 -9
  256. package/.next/standalone/.next/server/chunks/[root-of-the-server]__73aed9f5._.js +15 -2
  257. package/.next/standalone/.next/server/chunks/[root-of-the-server]__79b6a9bb._.js +15 -2
  258. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7db704c6._.js +17 -4
  259. package/.next/standalone/.next/server/chunks/[root-of-the-server]__812ca02b._.js +15 -2
  260. package/.next/standalone/.next/server/chunks/[root-of-the-server]__821f50fa._.js +15 -2
  261. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8716b86e._.js +15 -2
  262. package/.next/standalone/.next/server/chunks/[root-of-the-server]__884ef754._.js +15 -2
  263. package/.next/standalone/.next/server/chunks/[root-of-the-server]__88cdbd68._.js +15 -2
  264. package/.next/standalone/.next/server/chunks/[root-of-the-server]__89d9aba9._.js +15 -2
  265. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8c2e1260._.js +111 -0
  266. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8d536cb5._.js +15 -2
  267. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8df8c5d1._.js +15 -2
  268. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8f2ccc41._.js +15 -2
  269. package/.next/standalone/.next/server/chunks/[root-of-the-server]__95c9d682._.js +15 -2
  270. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9e5d7774._.js +15 -2
  271. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9edcff87._.js +15 -2
  272. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a049dfc2._.js +15 -2
  273. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a5b4bb9a._.js +16 -3
  274. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a83262a1._.js +15 -2
  275. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9cd1240._.js +15 -2
  276. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9d7f822._.js +15 -2
  277. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad08c221._.js +15 -2
  278. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad585f2f._.js +15 -2
  279. package/.next/standalone/.next/server/chunks/[root-of-the-server]__afcb8f7d._.js +15 -2
  280. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bc250d43._.js +15 -2
  281. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bce2a6e7._.js +15 -2
  282. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c011bf91._.js +15 -2
  283. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c37d6380._.js +1 -1
  284. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cae392eb._.js +15 -2
  285. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cc2616bb._.js +16 -3
  286. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d501fa9b._.js +15 -2
  287. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d59c6c15._.js +16 -3
  288. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d5c1db32._.js +15 -2
  289. package/.next/standalone/.next/server/chunks/[root-of-the-server]__dba60c86._.js +15 -2
  290. package/.next/standalone/.next/server/chunks/[root-of-the-server]__de14b9ae._.js +15 -2
  291. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e10643d1._.js +15 -2
  292. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e2a996e5._.js +23 -10
  293. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3477417._.js +15 -2
  294. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e4db362e._.js +1 -1
  295. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e4e70b86._.js +15 -2
  296. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e54925af._.js +15 -2
  297. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8cbeaca._.js +111 -0
  298. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8edc5b0._.js +15 -2
  299. package/.next/standalone/.next/server/chunks/[root-of-the-server]__eab4d83b._.js +15 -2
  300. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ead29015._.js +1 -1
  301. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f056fd83._.js +15 -2
  302. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f0e99572._.js +15 -2
  303. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fe1e16d0._.js +15 -2
  304. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ff9cd277._.js +15 -2
  305. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ffaea2ce._.js +15 -2
  306. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_claude_usage_route_actions_fe002ec1.js +3 -0
  307. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_workspaces_[id]_todos_route_actions_0d4ffac5.js +3 -0
  308. package/.next/standalone/.next/server/chunks/ce889_server_app_api_workspaces_[id]_todos_[todoId]_route_actions_754fe6b9.js +3 -0
  309. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__66aca5d4._.js +1 -1
  310. package/.next/standalone/.next/server/chunks/ssr/{_17b946fd._.js → _20c2cf3a._.js} +2 -2
  311. package/.next/standalone/.next/server/chunks/ssr/_5f55bf8f._.js +3 -0
  312. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_settings_page_tsx_f74824b3._.js +1 -1
  313. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_terminal_page_tsx_de5e8d85._.js +1 -1
  314. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__90eeddae._.js +1 -1
  315. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  316. package/.next/standalone/.next/server/pages/404.html +1 -1
  317. package/.next/standalone/.next/server/pages/500.html +2 -2
  318. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  319. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  320. package/.next/standalone/.next/static/chunks/14216197f9dcbe5b.css +3 -0
  321. package/.next/standalone/.next/static/chunks/{0852575eb90c1e8d.js → 4c9fb0a38f041a3d.js} +2 -2
  322. package/.next/standalone/.next/static/chunks/8f6f93ab45a5ff5b.js +1 -0
  323. package/.next/standalone/.next/static/chunks/{e62bb488d02db247.js → d2566c2dcf53fef3.js} +1 -1
  324. package/.next/standalone/.next/static/chunks/{7f6a14f1849fa94d.js → ff7d85dade44d1f3.js} +1 -1
  325. package/.next/standalone/cortex-hook-debug.log +61 -0
  326. package/.next/standalone/docs/features/claude-usage.md +105 -0
  327. package/.next/standalone/docs/features/workspace-todos.md +127 -0
  328. package/.next/standalone/docs/superpowers/plans/2026-04-21-workspace-todos.md +1097 -0
  329. package/.next/standalone/docs/superpowers/plans/2026-04-22-claude-usage-display.md +749 -0
  330. package/.next/standalone/docs/superpowers/specs/2026-04-21-workspace-todos-design.md +180 -0
  331. package/.next/standalone/docs/superpowers/specs/2026-04-22-claude-usage-display-design.md +183 -0
  332. package/.next/standalone/package-lock.json +2 -2
  333. package/.next/standalone/package.json +1 -1
  334. package/.next/standalone/src/app/(desktop)/settings/page.tsx +40 -1
  335. package/.next/standalone/src/app/(desktop)/terminal/page.tsx +54 -2
  336. package/.next/standalone/src/app/api/claude/usage/route.ts +33 -0
  337. package/.next/standalone/src/app/api/config/route.ts +3 -0
  338. package/.next/standalone/src/app/api/workspaces/[id]/todos/[todoId]/route.ts +55 -0
  339. package/.next/standalone/src/app/api/workspaces/[id]/todos/route.ts +43 -0
  340. package/.next/standalone/src/components/claude/claude-usage-strip.tsx +175 -0
  341. package/.next/standalone/src/components/workspace/workspace-todos.tsx +265 -0
  342. package/.next/standalone/src/hooks/use-claude-usage.ts +66 -0
  343. package/.next/standalone/src/lib/claude/credentials.ts +36 -0
  344. package/.next/standalone/src/lib/claude/usage.ts +69 -0
  345. package/.next/standalone/src/lib/config.ts +3 -0
  346. package/.next/standalone/src/lib/db/queries.ts +103 -1
  347. package/.next/standalone/src/lib/db/schema.ts +18 -0
  348. package/.next/standalone/src/types/claude.ts +39 -0
  349. package/.next/standalone/tests/db/workspace-todos.test.ts +156 -0
  350. package/package.json +1 -1
  351. package/.next/standalone/.next/server/chunks/ssr/_3ba93bdd._.js +0 -3
  352. package/.next/standalone/.next/static/chunks/074df89a63b6a854.js +0 -1
  353. package/.next/standalone/.next/static/chunks/2b769d1597e4fc1c.css +0 -3
  354. /package/.next/standalone/.next/static/{u1pHON3drz1mBi7owkbBP → bAQs2gDlFrq3e8w9ni9tr}/_buildManifest.js +0 -0
  355. /package/.next/standalone/.next/static/{u1pHON3drz1mBi7owkbBP → bAQs2gDlFrq3e8w9ni9tr}/_clientMiddlewareManifest.json +0 -0
  356. /package/.next/standalone/.next/static/{u1pHON3drz1mBi7owkbBP → bAQs2gDlFrq3e8w9ni9tr}/_ssgManifest.js +0 -0
@@ -0,0 +1,69 @@
1
+ import { createHash } from 'crypto';
2
+ import type { Utilization } from '@/types/claude';
3
+
4
+ const ANTHROPIC_USAGE_URL = 'https://api.anthropic.com/api/oauth/usage';
5
+ const REQUEST_TIMEOUT_MS = 5_000;
6
+ const CACHE_TTL_MS = 30_000;
7
+
8
+ // UA + anthropic-beta header match Claude Code's. The endpoint requires the
9
+ // beta header; see claude-code/src/utils/http.ts (getAuthHeaders) and
10
+ // claude-code/src/constants/oauth.ts (OAUTH_BETA_HEADER).
11
+ const USER_AGENT = 'claude-code/spaces';
12
+ const OAUTH_BETA_HEADER = 'oauth-2025-04-20';
13
+
14
+ interface CacheEntry {
15
+ fetchedAt: number;
16
+ data: Utilization;
17
+ }
18
+
19
+ const cache = new Map<string, CacheEntry>();
20
+
21
+ function cacheKey(accessToken: string): string {
22
+ // Full SHA-256 of the token so two tokens sharing a prefix cannot collide.
23
+ return createHash('sha256').update(accessToken).digest('hex');
24
+ }
25
+
26
+ export type FetchOutcome =
27
+ | { ok: true; data: Utilization }
28
+ | { ok: false; reason: 'upstream_error' };
29
+
30
+ export async function fetchUtilization(accessToken: string): Promise<FetchOutcome> {
31
+ const key = cacheKey(accessToken);
32
+ const cached = cache.get(key);
33
+ if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {
34
+ return { ok: true, data: cached.data };
35
+ }
36
+
37
+ const controller = new AbortController();
38
+ const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
39
+
40
+ try {
41
+ const res = await fetch(ANTHROPIC_USAGE_URL, {
42
+ method: 'GET',
43
+ headers: {
44
+ 'Authorization': `Bearer ${accessToken}`,
45
+ 'anthropic-beta': OAUTH_BETA_HEADER,
46
+ 'Content-Type': 'application/json',
47
+ 'User-Agent': USER_AGENT,
48
+ },
49
+ signal: controller.signal,
50
+ });
51
+
52
+ if (!res.ok) {
53
+ return { ok: false, reason: 'upstream_error' };
54
+ }
55
+
56
+ const data = (await res.json()) as Utilization;
57
+ cache.set(key, { fetchedAt: Date.now(), data });
58
+ return { ok: true, data };
59
+ } catch {
60
+ return { ok: false, reason: 'upstream_error' };
61
+ } finally {
62
+ clearTimeout(timer);
63
+ }
64
+ }
65
+
66
+ /** Testing/hot-reload helper. */
67
+ export function __clearUsageCache() {
68
+ cache.clear();
69
+ }
@@ -90,6 +90,7 @@ export interface SpacesConfig {
90
90
  installId: string;
91
91
  telemetryOptOut: boolean;
92
92
  devDirectories: string[];
93
+ todosEnabled: boolean;
93
94
  cortex?: CortexConfig;
94
95
  customModels?: CustomModelConfig[];
95
96
  }
@@ -103,6 +104,7 @@ export function readConfig(username: string): SpacesConfig {
103
104
  installId: raw.installId || crypto.randomUUID(),
104
105
  telemetryOptOut: !!raw.telemetryOptOut,
105
106
  devDirectories: Array.isArray(raw.devDirectories) ? raw.devDirectories.filter((d: unknown) => typeof d === 'string') : [],
107
+ todosEnabled: !!raw.todosEnabled,
106
108
  ...(raw.cortex && typeof raw.cortex === 'object' ? { cortex: raw.cortex } : {}),
107
109
  customModels: Array.isArray(raw.customModels) ? raw.customModels : [],
108
110
  };
@@ -117,6 +119,7 @@ export function readConfig(username: string): SpacesConfig {
117
119
  installId: crypto.randomUUID(),
118
120
  telemetryOptOut: false,
119
121
  devDirectories: [],
122
+ todosEnabled: false,
120
123
  customModels: [],
121
124
  };
122
125
  fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
@@ -1,6 +1,6 @@
1
1
  import crypto from 'crypto';
2
2
  import { getDb } from './schema';
3
- import type { SessionWithMeta, Project, Workspace, Tag, SearchResult } from '@/types/claude';
3
+ import type { SessionWithMeta, Project, Workspace, Tag, SearchResult, WorkspaceTodo } from '@/types/claude';
4
4
 
5
5
  // ─── Projects ───────────────────────────────────────────────
6
6
 
@@ -738,3 +738,105 @@ export function getDailyActivity(days = 30): { date: string; sessionCount: numbe
738
738
  `).all(`-${days} days`) as any[];
739
739
  }
740
740
 
741
+ // ─── Workspace Todos ───────────────────────────────────────
742
+
743
+ interface TodoRow {
744
+ id: number;
745
+ workspace_id: number;
746
+ text: string;
747
+ completed: number;
748
+ sort_order: number;
749
+ created: string;
750
+ completed_at: string | null;
751
+ }
752
+
753
+ function rowToTodo(r: TodoRow): WorkspaceTodo {
754
+ return {
755
+ id: r.id,
756
+ workspaceId: r.workspace_id,
757
+ text: r.text,
758
+ completed: !!r.completed,
759
+ sortOrder: r.sort_order,
760
+ created: r.created,
761
+ completedAt: r.completed_at,
762
+ };
763
+ }
764
+
765
+ export function getWorkspaceTodos(workspaceId: number): WorkspaceTodo[] {
766
+ const db = getDb();
767
+ const rows = db.prepare(`
768
+ SELECT id, workspace_id, text, completed, sort_order, created, completed_at
769
+ FROM workspace_todos
770
+ WHERE workspace_id = ?
771
+ ORDER BY completed ASC,
772
+ CASE WHEN completed = 0 THEN sort_order END ASC,
773
+ completed_at DESC
774
+ `).all(workspaceId) as TodoRow[];
775
+ return rows.map(rowToTodo);
776
+ }
777
+
778
+ export function addWorkspaceTodo(workspaceId: number, text: string): WorkspaceTodo {
779
+ const db = getDb();
780
+ const trimmed = text.trim();
781
+ if (!trimmed) throw new Error('todo text is required');
782
+
783
+ const maxRow = db.prepare(`
784
+ SELECT COALESCE(MAX(sort_order), -1) AS max_order
785
+ FROM workspace_todos
786
+ WHERE workspace_id = ? AND completed = 0
787
+ `).get(workspaceId) as { max_order: number };
788
+ const nextOrder = (maxRow?.max_order ?? -1) + 1;
789
+
790
+ const info = db.prepare(`
791
+ INSERT INTO workspace_todos (workspace_id, text, sort_order)
792
+ VALUES (?, ?, ?)
793
+ `).run(workspaceId, trimmed, nextOrder);
794
+
795
+ const row = db.prepare(`
796
+ SELECT id, workspace_id, text, completed, sort_order, created, completed_at
797
+ FROM workspace_todos WHERE id = ?
798
+ `).get(Number(info.lastInsertRowid)) as TodoRow;
799
+ return rowToTodo(row);
800
+ }
801
+
802
+ export function updateWorkspaceTodo(
803
+ workspaceId: number,
804
+ todoId: number,
805
+ data: { text?: string; completed?: boolean }
806
+ ): WorkspaceTodo | null {
807
+ const db = getDb();
808
+
809
+ if (data.text !== undefined) {
810
+ const trimmed = data.text.trim();
811
+ if (!trimmed) throw new Error('todo text cannot be empty');
812
+ db.prepare('UPDATE workspace_todos SET text = ? WHERE id = ? AND workspace_id = ?').run(trimmed, todoId, workspaceId);
813
+ }
814
+
815
+ if (data.completed !== undefined) {
816
+ if (data.completed) {
817
+ db.prepare(`
818
+ UPDATE workspace_todos
819
+ SET completed = 1, completed_at = datetime('now')
820
+ WHERE id = ? AND workspace_id = ?
821
+ `).run(todoId, workspaceId);
822
+ } else {
823
+ db.prepare(`
824
+ UPDATE workspace_todos
825
+ SET completed = 0, completed_at = NULL
826
+ WHERE id = ? AND workspace_id = ?
827
+ `).run(todoId, workspaceId);
828
+ }
829
+ }
830
+
831
+ const row = db.prepare(`
832
+ SELECT id, workspace_id, text, completed, sort_order, created, completed_at
833
+ FROM workspace_todos WHERE id = ? AND workspace_id = ?
834
+ `).get(todoId, workspaceId) as TodoRow | undefined;
835
+ return row ? rowToTodo(row) : null;
836
+ }
837
+
838
+ export function deleteWorkspaceTodo(workspaceId: number, todoId: number): void {
839
+ const db = getDb();
840
+ db.prepare('DELETE FROM workspace_todos WHERE id = ? AND workspace_id = ?').run(todoId, workspaceId);
841
+ }
842
+
@@ -113,6 +113,19 @@ function initSchema(db: Database.Database) {
113
113
  enabled INTEGER DEFAULT 0,
114
114
  created TEXT DEFAULT (datetime('now'))
115
115
  );
116
+
117
+ CREATE TABLE IF NOT EXISTS workspace_todos (
118
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
119
+ workspace_id INTEGER NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
120
+ text TEXT NOT NULL,
121
+ completed INTEGER NOT NULL DEFAULT 0,
122
+ sort_order INTEGER NOT NULL DEFAULT 0,
123
+ created TEXT NOT NULL DEFAULT (datetime('now')),
124
+ completed_at TEXT
125
+ );
126
+
127
+ CREATE INDEX IF NOT EXISTS idx_workspace_todos_workspace
128
+ ON workspace_todos(workspace_id);
116
129
  `);
117
130
 
118
131
  // Migrate: add workspace and popout columns to existing tables
@@ -204,3 +217,8 @@ export function closeDb() {
204
217
  }
205
218
  _dbs.clear();
206
219
  }
220
+
221
+ // Test-only export. Do not use outside of tests.
222
+ export const __testing = {
223
+ dbs: _dbs,
224
+ };
@@ -206,3 +206,42 @@ export interface AnalyticsOverview {
206
206
  dailyActivity: DailyActivity[];
207
207
  dailyModelTokens: DailyModelTokens[];
208
208
  }
209
+
210
+ export interface WorkspaceTodo {
211
+ id: number;
212
+ workspaceId: number;
213
+ text: string;
214
+ completed: boolean;
215
+ sortOrder: number;
216
+ created: string;
217
+ completedAt: string | null;
218
+ }
219
+
220
+ // ─── Claude plan-usage (mirrors /usage in Claude Code) ───────
221
+
222
+ export interface RateLimit {
223
+ utilization: number | null; // 0-100
224
+ resets_at: string | null; // ISO 8601
225
+ }
226
+
227
+ export interface ExtraUsage {
228
+ is_enabled: boolean;
229
+ monthly_limit: number | null;
230
+ used_credits: number | null;
231
+ utilization: number | null;
232
+ }
233
+
234
+ export interface Utilization {
235
+ five_hour?: RateLimit | null;
236
+ seven_day?: RateLimit | null;
237
+ seven_day_oauth_apps?: RateLimit | null;
238
+ seven_day_opus?: RateLimit | null;
239
+ seven_day_sonnet?: RateLimit | null;
240
+ extra_usage?: ExtraUsage | null;
241
+ }
242
+
243
+ export type UsageResponse =
244
+ | { status: 'ok'; data: Utilization }
245
+ | { status: 'unauthenticated' }
246
+ | { status: 'expired' }
247
+ | { status: 'upstream_error' };
@@ -0,0 +1,156 @@
1
+ import fs from 'fs';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import Database from 'better-sqlite3';
6
+
7
+ import { __testing } from '@/lib/db/schema';
8
+ import {
9
+ getWorkspaceTodos,
10
+ addWorkspaceTodo,
11
+ updateWorkspaceTodo,
12
+ deleteWorkspaceTodo,
13
+ } from '@/lib/db/queries';
14
+
15
+ const TEST_USER = 'test-user'; // matches tests/setup.ts auth mock
16
+ let db: Database.Database;
17
+ let tempDir: string;
18
+
19
+ beforeEach(() => {
20
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'spaces-todos-test-'));
21
+ const dbPath = path.join(tempDir, 'test.db');
22
+ db = new Database(dbPath);
23
+ db.pragma('journal_mode = WAL');
24
+ db.pragma('foreign_keys = ON');
25
+
26
+ const ddl = [
27
+ `CREATE TABLE workspaces (
28
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
29
+ name TEXT NOT NULL,
30
+ color TEXT DEFAULT '#6366f1',
31
+ created TEXT DEFAULT (datetime('now'))
32
+ )`,
33
+ `CREATE TABLE workspace_todos (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
35
+ workspace_id INTEGER NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
36
+ text TEXT NOT NULL,
37
+ completed INTEGER NOT NULL DEFAULT 0,
38
+ sort_order INTEGER NOT NULL DEFAULT 0,
39
+ created TEXT NOT NULL DEFAULT (datetime('now')),
40
+ completed_at TEXT
41
+ )`,
42
+ `CREATE INDEX idx_workspace_todos_workspace ON workspace_todos(workspace_id)`,
43
+ ];
44
+ for (const stmt of ddl) {
45
+ db.prepare(stmt).run();
46
+ }
47
+
48
+ __testing.dbs.set(TEST_USER, db);
49
+
50
+ db.prepare("INSERT INTO workspaces (id, name) VALUES (1, 'Test WS')").run();
51
+ });
52
+
53
+ afterEach(() => {
54
+ try { db.close(); } catch {}
55
+ __testing.dbs.delete(TEST_USER);
56
+ fs.rmSync(tempDir, { recursive: true, force: true });
57
+ });
58
+
59
+ describe('workspace todos query helpers', () => {
60
+ it('adds a todo with incrementing sort_order among uncompleted rows', () => {
61
+ const a = addWorkspaceTodo(1, 'first');
62
+ const b = addWorkspaceTodo(1, 'second');
63
+ const c = addWorkspaceTodo(1, 'third');
64
+
65
+ expect(a.sortOrder).toBe(0);
66
+ expect(b.sortOrder).toBe(1);
67
+ expect(c.sortOrder).toBe(2);
68
+ expect(a.completed).toBe(false);
69
+ expect(a.text).toBe('first');
70
+ });
71
+
72
+ it('trims text and rejects empty', () => {
73
+ const t = addWorkspaceTodo(1, ' hello ');
74
+ expect(t.text).toBe('hello');
75
+
76
+ expect(() => addWorkspaceTodo(1, ' ')).toThrow();
77
+ expect(() => addWorkspaceTodo(1, '')).toThrow();
78
+ });
79
+
80
+ it('toggles completed and sets/clears completed_at', () => {
81
+ const t = addWorkspaceTodo(1, 'toggle me');
82
+ expect(t.completedAt).toBeNull();
83
+
84
+ const done = updateWorkspaceTodo(1, t.id, { completed: true });
85
+ expect(done?.completed).toBe(true);
86
+ expect(done?.completedAt).not.toBeNull();
87
+
88
+ const undone = updateWorkspaceTodo(1, t.id, { completed: false });
89
+ expect(undone?.completed).toBe(false);
90
+ expect(undone?.completedAt).toBeNull();
91
+ });
92
+
93
+ it('updates text, trims, rejects empty', () => {
94
+ const t = addWorkspaceTodo(1, 'original');
95
+ const upd = updateWorkspaceTodo(1, t.id, { text: ' edited ' });
96
+ expect(upd?.text).toBe('edited');
97
+
98
+ expect(() => updateWorkspaceTodo(1, t.id, { text: ' ' })).toThrow();
99
+ });
100
+
101
+ it('lists todos: uncompleted first by sort_order, completed last by completed_at desc', () => {
102
+ const a = addWorkspaceTodo(1, 'a');
103
+ const b = addWorkspaceTodo(1, 'b');
104
+ const c = addWorkspaceTodo(1, 'c');
105
+
106
+ updateWorkspaceTodo(1, b.id, { completed: true });
107
+ updateWorkspaceTodo(1, a.id, { completed: true });
108
+
109
+ const list = getWorkspaceTodos(1);
110
+ expect(list.map(t => t.text)).toEqual(['c', 'a', 'b']);
111
+ });
112
+
113
+ it('deletes a todo', () => {
114
+ const t = addWorkspaceTodo(1, 'doomed');
115
+ deleteWorkspaceTodo(1, t.id);
116
+ expect(getWorkspaceTodos(1)).toHaveLength(0);
117
+ });
118
+
119
+ it('cascades when the workspace is deleted', () => {
120
+ addWorkspaceTodo(1, 'x');
121
+ addWorkspaceTodo(1, 'y');
122
+ db.prepare('DELETE FROM workspaces WHERE id = 1').run();
123
+ const rows = db.prepare('SELECT COUNT(*) AS n FROM workspace_todos').get() as { n: number };
124
+ expect(rows.n).toBe(0);
125
+ });
126
+
127
+ it('scopes listing by workspace', () => {
128
+ db.prepare("INSERT INTO workspaces (id, name) VALUES (2, 'Other')").run();
129
+ addWorkspaceTodo(1, 'ws-1-a');
130
+ addWorkspaceTodo(2, 'ws-2-a');
131
+ addWorkspaceTodo(1, 'ws-1-b');
132
+
133
+ const ws1 = getWorkspaceTodos(1);
134
+ const ws2 = getWorkspaceTodos(2);
135
+ expect(ws1.map(t => t.text).sort()).toEqual(['ws-1-a', 'ws-1-b']);
136
+ expect(ws2.map(t => t.text)).toEqual(['ws-2-a']);
137
+ });
138
+
139
+ it('refuses to update or delete a todo from a different workspace', () => {
140
+ db.prepare("INSERT INTO workspaces (id, name) VALUES (2, 'Other')").run();
141
+ const t = addWorkspaceTodo(1, 'belongs to ws 1');
142
+
143
+ // Update with the wrong workspace id → returns null, leaves row untouched.
144
+ const update = updateWorkspaceTodo(2, t.id, { text: 'hijacked' });
145
+ expect(update).toBeNull();
146
+ expect(getWorkspaceTodos(1)[0].text).toBe('belongs to ws 1');
147
+
148
+ // Delete with the wrong workspace id → row survives.
149
+ deleteWorkspaceTodo(2, t.id);
150
+ expect(getWorkspaceTodos(1)).toHaveLength(1);
151
+
152
+ // Correct workspace → works.
153
+ deleteWorkspaceTodo(1, t.id);
154
+ expect(getWorkspaceTodos(1)).toHaveLength(0);
155
+ });
156
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jlongo78/agent-spaces",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "Agent workspace manager for Claude, Codex, Gemini, and more",
5
5
  "bin": {
6
6
  "spaces": "./bin/spaces.js"
@@ -1,3 +0,0 @@
1
- module.exports=[935112,(a,b,c)=>{"use strict";b.exports=a.r(342602).vendored["react-ssr"].ReactDOM},596221,a=>{"use strict";let b=(0,a.i(883706).default)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);a.s(["Loader2",()=>b],596221)},641710,a=>{"use strict";let b=(0,a.i(883706).default)("clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 6v6l4 2",key:"mmk7yg"}]]);a.s(["Clock",()=>b],641710)},951906,a=>{"use strict";var b=a.i(187924),c=a.i(572131),d=a.i(290669),e=a.i(596221),f=a.i(883706);let g=(0,f.default)("log-in",[["path",{d:"m10 17 5-5-5-5",key:"1bsop3"}],["path",{d:"M15 12H3",key:"6jk70r"}],["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4",key:"u53s6r"}]]);var h=a.i(641710),i=a.i(660246);let j=(0,f.default)("zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]);var k=a.i(618155),l=a.i(923665),m=a.i(39622),n=a.i(985811),o=a.i(758042),p=a.i(994222),q=a.i(659854),r=a.i(48662),s=a.i(119032);function t(){let[a,f]=(0,c.useState)(null),[t,x]=(0,c.useState)(!0),[y,z]=(0,c.useState)(""),[A,B]=(0,c.useState)(30);if((0,c.useEffect)(()=>{x(!0),fetch((0,s.api)(`/api/admin/analytics?days=${A}`)).then(a=>{if(!a.ok)throw Error(403===a.status?"Forbidden":"Failed to load analytics");return a.json()}).then(a=>{f(a),z("")}).catch(a=>z(a.message)).finally(()=>x(!1))},[A]),t)return(0,b.jsxs)("div",{className:"p-6 flex items-center gap-2 text-zinc-400",children:[(0,b.jsx)(e.Loader2,{className:"w-4 h-4 animate-spin"}),"Loading activity data..."]});if(y)return(0,b.jsx)("div",{className:"p-6",children:(0,b.jsx)("p",{className:"text-red-400 text-sm",children:y})});if(!a)return null;let C=new Set(a.userSummary.map(a=>a.username)).size,D=a.dailyLogins.map(a=>({date:new Date(a.date+"T00:00:00").toLocaleDateString("en-US",{month:"short",day:"numeric"}),logins:a.count})),E=a.dailySessionTime.map(a=>({date:new Date(a.date+"T00:00:00").toLocaleDateString("en-US",{month:"short",day:"numeric"}),hours:Math.round(a.minutes/6)/10}));return(0,b.jsxs)("div",{className:"p-6 space-y-6 max-w-7xl",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[(0,b.jsx)(d.Activity,{className:"w-6 h-6"}),"Team Activity"]}),(0,b.jsx)("p",{className:"text-muted-foreground text-sm mt-1",children:"Login and terminal session analytics across all users"})]}),(0,b.jsx)("div",{className:"flex items-center gap-1 bg-zinc-100 dark:bg-zinc-800 rounded-lg p-1",children:[7,30,90].map(a=>(0,b.jsxs)("button",{onClick:()=>B(a),className:`px-3 py-1.5 text-xs rounded-md transition-colors ${A===a?"bg-white dark:bg-zinc-700 text-zinc-900 dark:text-zinc-100 shadow-sm font-medium":"text-zinc-500 hover:text-zinc-700 dark:hover:text-zinc-300"}`,children:[a,"d"]},a))})]}),(0,b.jsxs)("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-4",children:[(0,b.jsx)(u,{icon:(0,b.jsx)(j,{className:"w-4 h-4 text-green-500"}),label:"Active Now",value:a.activeSessions}),(0,b.jsx)(u,{icon:(0,b.jsx)(g,{className:"w-4 h-4 text-indigo-500"}),label:"Total Logins",value:a.totalLogins}),(0,b.jsx)(u,{icon:(0,b.jsx)(h.Clock,{className:"w-4 h-4 text-violet-500"}),label:"Total Vibe Time",value:v(a.totalSessionMinutes)}),(0,b.jsx)(u,{icon:(0,b.jsx)(i.Users,{className:"w-4 h-4 text-amber-500"}),label:"Unique Users",value:C})]}),(0,b.jsxs)("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[(0,b.jsxs)("div",{className:"bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-lg p-4",children:[(0,b.jsx)("h3",{className:"font-semibold mb-4",children:"Daily Logins"}),0===D.length?(0,b.jsx)("p",{className:"text-sm text-muted-foreground h-[200px] flex items-center justify-center",children:"No login data yet"}):(0,b.jsx)(r.ResponsiveContainer,{width:"100%",height:200,children:(0,b.jsxs)(k.BarChart,{data:D,children:[(0,b.jsx)(o.XAxis,{dataKey:"date",tick:{fontSize:11}}),(0,b.jsx)(p.YAxis,{tick:{fontSize:11},allowDecimals:!1}),(0,b.jsx)(q.Tooltip,{contentStyle:{background:"var(--background)",border:"1px solid var(--border)",borderRadius:"0.5rem",fontSize:"12px"}}),(0,b.jsx)(l.Bar,{dataKey:"logins",fill:"#6366f1",radius:[2,2,0,0]})]})})]}),(0,b.jsxs)("div",{className:"bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-lg p-4",children:[(0,b.jsx)("h3",{className:"font-semibold mb-4",children:"Daily Vibe Time"}),0===E.length?(0,b.jsx)("p",{className:"text-sm text-muted-foreground h-[200px] flex items-center justify-center",children:"No session data yet"}):(0,b.jsx)(r.ResponsiveContainer,{width:"100%",height:200,children:(0,b.jsxs)(m.AreaChart,{data:E,children:[(0,b.jsx)(o.XAxis,{dataKey:"date",tick:{fontSize:11}}),(0,b.jsx)(p.YAxis,{tick:{fontSize:11},tickFormatter:a=>`${a}h`}),(0,b.jsx)(q.Tooltip,{formatter:a=>[`${a}h`,"Time"],contentStyle:{background:"var(--background)",border:"1px solid var(--border)",borderRadius:"0.5rem",fontSize:"12px"}}),(0,b.jsx)(n.Area,{type:"monotone",dataKey:"hours",fill:"#8b5cf6",fillOpacity:.2,stroke:"#8b5cf6"})]})})]})]}),(0,b.jsxs)("div",{className:"bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-lg overflow-hidden",children:[(0,b.jsx)("div",{className:"p-4 border-b border-zinc-200 dark:border-zinc-800",children:(0,b.jsx)("h3",{className:"font-semibold",children:"User Leaderboard"})}),(0,b.jsxs)("table",{className:"w-full text-sm",children:[(0,b.jsx)("thead",{className:"bg-zinc-50 dark:bg-zinc-800/50",children:(0,b.jsxs)("tr",{children:[(0,b.jsx)("th",{className:"text-left px-4 py-3 font-medium text-zinc-500",children:"Username"}),(0,b.jsx)("th",{className:"text-right px-4 py-3 font-medium text-zinc-500",children:"Sessions"}),(0,b.jsx)("th",{className:"text-right px-4 py-3 font-medium text-zinc-500",children:"Total Time"}),(0,b.jsx)("th",{className:"text-right px-4 py-3 font-medium text-zinc-500",children:"Last Login"})]})}),(0,b.jsxs)("tbody",{className:"divide-y divide-zinc-100 dark:divide-zinc-800",children:[a.userSummary.map(a=>(0,b.jsxs)("tr",{className:"hover:bg-zinc-50 dark:hover:bg-zinc-800/30",children:[(0,b.jsx)("td",{className:"px-4 py-3 font-mono",children:a.username}),(0,b.jsx)("td",{className:"px-4 py-3 text-right text-zinc-400",children:a.session_count}),(0,b.jsx)("td",{className:"px-4 py-3 text-right text-zinc-400",children:v(Math.round(a.total_minutes))}),(0,b.jsx)("td",{className:"px-4 py-3 text-right text-zinc-400 text-xs",children:a.last_login?w(a.last_login):"-"})]},a.username)),0===a.userSummary.length&&(0,b.jsx)("tr",{children:(0,b.jsx)("td",{colSpan:4,className:"px-4 py-8 text-center text-zinc-500",children:"No session data yet"})})]})]})]}),(0,b.jsxs)("div",{className:"bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-lg overflow-hidden",children:[(0,b.jsx)("div",{className:"p-4 border-b border-zinc-200 dark:border-zinc-800",children:(0,b.jsx)("h3",{className:"font-semibold",children:"Recent Logins"})}),(0,b.jsxs)("table",{className:"w-full text-sm",children:[(0,b.jsx)("thead",{className:"bg-zinc-50 dark:bg-zinc-800/50",children:(0,b.jsxs)("tr",{children:[(0,b.jsx)("th",{className:"text-left px-4 py-3 font-medium text-zinc-500",children:"Username"}),(0,b.jsx)("th",{className:"text-left px-4 py-3 font-medium text-zinc-500",children:"Time"}),(0,b.jsx)("th",{className:"text-left px-4 py-3 font-medium text-zinc-500",children:"IP Address"})]})}),(0,b.jsxs)("tbody",{className:"divide-y divide-zinc-100 dark:divide-zinc-800",children:[a.recentLogins.slice(0,25).map((a,c)=>(0,b.jsxs)("tr",{className:"hover:bg-zinc-50 dark:hover:bg-zinc-800/30",children:[(0,b.jsx)("td",{className:"px-4 py-3 font-mono",children:a.username}),(0,b.jsx)("td",{className:"px-4 py-3 text-zinc-400 text-xs",children:w(a.timestamp)}),(0,b.jsx)("td",{className:"px-4 py-3 text-zinc-400 font-mono text-xs",children:a.ip_address||"-"})]},c)),0===a.recentLogins.length&&(0,b.jsx)("tr",{children:(0,b.jsx)("td",{colSpan:3,className:"px-4 py-8 text-center text-zinc-500",children:"No login events yet"})})]})]})]})]})}function u({icon:a,label:c,value:d}){return(0,b.jsxs)("div",{className:"bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-lg p-4",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 text-xs text-zinc-500 mb-2",children:[a,c]}),(0,b.jsx)("div",{className:"text-2xl font-bold",children:d})]})}function v(a){if(a<60)return`${a}m`;let b=Math.floor(a/60),c=a%60;return c>0?`${b}h ${c}m`:`${b}h`}function w(a){try{return new Date(a.includes("T")?a:a+"Z").toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})}catch{return a}}a.s(["default",()=>t],951906)}];
2
-
3
- //# sourceMappingURL=_3ba93bdd._.js.map
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,531278,e=>{"use strict";let t=(0,e.i(475254).default)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);e.s(["Loader2",()=>t],531278)},503116,e=>{"use strict";let t=(0,e.i(475254).default)("clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 6v6l4 2",key:"mmk7yg"}]]);e.s(["Clock",()=>t],503116)},755838,(e,t,r)=>{"use strict";var n=e.r(271645),a="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},i=n.useState,l=n.useEffect,s=n.useLayoutEffect,o=n.useDebugValue;function c(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!a(e,r)}catch(e){return!0}}var u="u"<typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var r=t(),n=i({inst:{value:r,getSnapshot:t}}),a=n[0].inst,u=n[1];return s(function(){a.value=r,a.getSnapshot=t,c(a)&&u({inst:a})},[e,r,t]),l(function(){return c(a)&&u({inst:a}),e(function(){c(a)&&u({inst:a})})},[e]),o(r),r};r.useSyncExternalStore=void 0!==n.useSyncExternalStore?n.useSyncExternalStore:u},802239,(e,t,r)=>{"use strict";t.exports=e.r(755838)},752822,(e,t,r)=>{"use strict";var n=e.r(271645),a=e.r(802239),i="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},l=a.useSyncExternalStore,s=n.useRef,o=n.useEffect,c=n.useMemo,u=n.useDebugValue;r.useSyncExternalStoreWithSelector=function(e,t,r,n,a){var d=s(null);if(null===d.current){var f={hasValue:!1,value:null};d.current=f}else f=d.current;var h=l(e,(d=c(function(){function e(e){if(!o){if(o=!0,l=e,e=n(e),void 0!==a&&f.hasValue){var t=f.value;if(a(t,e))return s=t}return s=e}if(t=s,i(l,e))return t;var r=n(e);return void 0!==a&&a(t,r)?(l=e,t):(l=e,s=r)}var l,s,o=!1,c=void 0===r?null:r;return[function(){return e(t())},null===c?void 0:function(){return e(c())}]},[t,r,n,a]))[0],d[1]);return o(function(){f.hasValue=!0,f.value=h},[h]),u(h),h}},430224,(e,t,r)=>{"use strict";t.exports=e.r(752822)},365332,e=>{"use strict";function t(e,t){switch(arguments.length){case 0:break;case 1:this.range(e);break;default:this.range(t).domain(e)}return this}function r(e,t){switch(arguments.length){case 0:break;case 1:"function"==typeof e?this.interpolator(e):this.range(e);break;default:this.domain(e),"function"==typeof t?this.interpolator(t):this.range(t)}return this}e.s(["initInterpolator",()=>r,"initRange",()=>t])},451381,e=>{"use strict";class t extends Map{constructor(e,t=n){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:t}}),null!=e)for(const[t,r]of e)this.set(t,r)}get(e){return super.get(r(this,e))}has(e){return super.has(r(this,e))}set(e,t){return super.set(function({_intern:e,_key:t},r){let n=t(r);return e.has(n)?e.get(n):(e.set(n,r),r)}(this,e),t)}delete(e){return super.delete(function({_intern:e,_key:t},r){let n=t(r);return e.has(n)&&(r=e.get(n),e.delete(n)),r}(this,e))}}function r({_intern:e,_key:t},r){let n=t(r);return e.has(n)?e.get(n):r}function n(e){return null!==e&&"object"==typeof e?e.valueOf():e}e.s(["InternMap",()=>t])},65232,e=>{"use strict";var t=e.i(451381),r=e.i(365332);let n=Symbol("implicit");e.s(["default",()=>function e(){var a=new t.InternMap,i=[],l=[],s=n;function o(e){let t=a.get(e);if(void 0===t){if(s!==n)return s;a.set(e,t=i.push(e)-1)}return l[t%l.length]}return o.domain=function(e){if(!arguments.length)return i.slice();for(let r of(i=[],a=new t.InternMap,e))a.has(r)||a.set(r,i.push(r)-1);return o},o.range=function(e){return arguments.length?(l=Array.from(e),o):l.slice()},o.unknown=function(e){return arguments.length?(s=e,o):s},o.copy=function(){return e(i,l).unknown(s)},r.initRange.apply(o,arguments),o},"implicit",0,n])},479996,47238,e=>{"use strict";function t(e,t,r){e.prototype=t.prototype=r,r.constructor=e}function r(e,t){var r=Object.create(e.prototype);for(var n in t)r[n]=t[n];return r}function n(){}var a="\\s*([+-]?\\d+)\\s*",i="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",l="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",s=/^#([0-9a-f]{3,8})$/,o=RegExp(`^rgb\\(${a},${a},${a}\\)$`),c=RegExp(`^rgb\\(${l},${l},${l}\\)$`),u=RegExp(`^rgba\\(${a},${a},${a},${i}\\)$`),d=RegExp(`^rgba\\(${l},${l},${l},${i}\\)$`),f=RegExp(`^hsl\\(${i},${l},${l}\\)$`),h=RegExp(`^hsla\\(${i},${l},${l},${i}\\)$`),p={aliceblue:0xf0f8ff,antiquewhite:0xfaebd7,aqua:65535,aquamarine:8388564,azure:0xf0ffff,beige:0xf5f5dc,bisque:0xffe4c4,black:0,blanchedalmond:0xffebcd,blue:255,blueviolet:9055202,brown:0xa52a2a,burlywood:0xdeb887,cadetblue:6266528,chartreuse:8388352,chocolate:0xd2691e,coral:0xff7f50,cornflowerblue:6591981,cornsilk:0xfff8dc,crimson:0xdc143c,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:0xb8860b,darkgray:0xa9a9a9,darkgreen:25600,darkgrey:0xa9a9a9,darkkhaki:0xbdb76b,darkmagenta:9109643,darkolivegreen:5597999,darkorange:0xff8c00,darkorchid:0x9932cc,darkred:9109504,darksalmon:0xe9967a,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:0xff1493,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:0xb22222,floralwhite:0xfffaf0,forestgreen:2263842,fuchsia:0xff00ff,gainsboro:0xdcdcdc,ghostwhite:0xf8f8ff,gold:0xffd700,goldenrod:0xdaa520,gray:8421504,green:32768,greenyellow:0xadff2f,grey:8421504,honeydew:0xf0fff0,hotpink:0xff69b4,indianred:0xcd5c5c,indigo:4915330,ivory:0xfffff0,khaki:0xf0e68c,lavender:0xe6e6fa,lavenderblush:0xfff0f5,lawngreen:8190976,lemonchiffon:0xfffacd,lightblue:0xadd8e6,lightcoral:0xf08080,lightcyan:0xe0ffff,lightgoldenrodyellow:0xfafad2,lightgray:0xd3d3d3,lightgreen:9498256,lightgrey:0xd3d3d3,lightpink:0xffb6c1,lightsalmon:0xffa07a,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:0xb0c4de,lightyellow:0xffffe0,lime:65280,limegreen:3329330,linen:0xfaf0e6,magenta:0xff00ff,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:0xba55d3,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:0xc71585,midnightblue:1644912,mintcream:0xf5fffa,mistyrose:0xffe4e1,moccasin:0xffe4b5,navajowhite:0xffdead,navy:128,oldlace:0xfdf5e6,olive:8421376,olivedrab:7048739,orange:0xffa500,orangered:0xff4500,orchid:0xda70d6,palegoldenrod:0xeee8aa,palegreen:0x98fb98,paleturquoise:0xafeeee,palevioletred:0xdb7093,papayawhip:0xffefd5,peachpuff:0xffdab9,peru:0xcd853f,pink:0xffc0cb,plum:0xdda0dd,powderblue:0xb0e0e6,purple:8388736,rebeccapurple:6697881,red:0xff0000,rosybrown:0xbc8f8f,royalblue:4286945,saddlebrown:9127187,salmon:0xfa8072,sandybrown:0xf4a460,seagreen:3050327,seashell:0xfff5ee,sienna:0xa0522d,silver:0xc0c0c0,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:0xfffafa,springgreen:65407,steelblue:4620980,tan:0xd2b48c,teal:32896,thistle:0xd8bfd8,tomato:0xff6347,turquoise:4251856,violet:0xee82ee,wheat:0xf5deb3,white:0xffffff,whitesmoke:0xf5f5f5,yellow:0xffff00,yellowgreen:0x9acd32};function m(){return this.rgb().formatHex()}function x(){return this.rgb().formatRgb()}function y(e){var t,r;return e=(e+"").trim().toLowerCase(),(t=s.exec(e))?(r=t[1].length,t=parseInt(t[1],16),6===r?g(t):3===r?new N(t>>8&15|t>>4&240,t>>4&15|240&t,(15&t)<<4|15&t,1):8===r?b(t>>24&255,t>>16&255,t>>8&255,(255&t)/255):4===r?b(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|240&t,((15&t)<<4|15&t)/255):null):(t=o.exec(e))?new N(t[1],t[2],t[3],1):(t=c.exec(e))?new N(255*t[1]/100,255*t[2]/100,255*t[3]/100,1):(t=u.exec(e))?b(t[1],t[2],t[3],t[4]):(t=d.exec(e))?b(255*t[1]/100,255*t[2]/100,255*t[3]/100,t[4]):(t=f.exec(e))?O(t[1],t[2]/100,t[3]/100,1):(t=h.exec(e))?O(t[1],t[2]/100,t[3]/100,t[4]):p.hasOwnProperty(e)?g(p[e]):"transparent"===e?new N(NaN,NaN,NaN,0):null}function g(e){return new N(e>>16&255,e>>8&255,255&e,1)}function b(e,t,r,n){return n<=0&&(e=t=r=NaN),new N(e,t,r,n)}function v(e,t,r,a){var i;return 1==arguments.length?((i=e)instanceof n||(i=y(i)),i)?new N((i=i.rgb()).r,i.g,i.b,i.opacity):new N:new N(e,t,r,null==a?1:a)}function N(e,t,r,n){this.r=+e,this.g=+t,this.b=+r,this.opacity=+n}function j(){return`#${P(this.r)}${P(this.g)}${P(this.b)}`}function w(){let e=k(this.opacity);return`${1===e?"rgb(":"rgba("}${E(this.r)}, ${E(this.g)}, ${E(this.b)}${1===e?")":`, ${e})`}`}function k(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function E(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function P(e){return((e=E(e))<16?"0":"")+e.toString(16)}function O(e,t,r,n){return n<=0?e=t=r=NaN:r<=0||r>=1?e=t=NaN:t<=0&&(e=NaN),new A(e,t,r,n)}function S(e){if(e instanceof A)return new A(e.h,e.s,e.l,e.opacity);if(e instanceof n||(e=y(e)),!e)return new A;if(e instanceof A)return e;var t=(e=e.rgb()).r/255,r=e.g/255,a=e.b/255,i=Math.min(t,r,a),l=Math.max(t,r,a),s=NaN,o=l-i,c=(l+i)/2;return o?(s=t===l?(r-a)/o+(r<a)*6:r===l?(a-t)/o+2:(t-r)/o+4,o/=c<.5?l+i:2-l-i,s*=60):o=c>0&&c<1?0:s,new A(s,o,c,e.opacity)}function A(e,t,r,n){this.h=+e,this.s=+t,this.l=+r,this.opacity=+n}function I(e){return(e=(e||0)%360)<0?e+360:e}function z(e){return Math.max(0,Math.min(1,e||0))}function C(e,t,r){return(e<60?t+(r-t)*e/60:e<180?r:e<240?t+(r-t)*(240-e)/60:t)*255}t(n,y,{copy(e){return Object.assign(new this.constructor,this,e)},displayable(){return this.rgb().displayable()},hex:m,formatHex:m,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return S(this).formatHsl()},formatRgb:x,toString:x}),t(N,v,r(n,{brighter(e){return e=null==e?1.4285714285714286:Math.pow(1.4285714285714286,e),new N(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=null==e?.7:Math.pow(.7,e),new N(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new N(E(this.r),E(this.g),E(this.b),k(this.opacity))},displayable(){return -.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:j,formatHex:j,formatHex8:function(){return`#${P(this.r)}${P(this.g)}${P(this.b)}${P((isNaN(this.opacity)?1:this.opacity)*255)}`},formatRgb:w,toString:w})),t(A,function(e,t,r,n){return 1==arguments.length?S(e):new A(e,t,r,null==n?1:n)},r(n,{brighter(e){return e=null==e?1.4285714285714286:Math.pow(1.4285714285714286,e),new A(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=null==e?.7:Math.pow(.7,e),new A(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*t,a=2*r-n;return new N(C(e>=240?e-240:e+120,a,n),C(e,a,n),C(e<120?e+240:e-120,a,n),this.opacity)},clamp(){return new A(I(this.h),z(this.s),z(this.l),k(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let e=k(this.opacity);return`${1===e?"hsl(":"hsla("}${I(this.h)}, ${100*z(this.s)}%, ${100*z(this.l)}%${1===e?")":`, ${e})`}`}})),e.s(["default",()=>y,"rgb",()=>v],47238),e.s(["color",()=>y],479996)},565445,100625,e=>{"use strict";var t=e.i(47238);function r(e,t,r,n,a){var i=e*e,l=i*e;return((1-3*e+3*i-l)*t+(4-6*i+3*l)*r+(1+3*e+3*i-3*l)*n+l*a)/6}let n=e=>()=>e;function a(e,t){var r=t-e;return r?function(t){return e+t*r}:n(isNaN(e)?t:e)}e.s(["default",0,n],100625);let i=function e(r){var i,l=1==(i=+r)?a:function(e,t){var r,a,l;return t-e?(r=e,a=t,r=Math.pow(r,l=i),a=Math.pow(a,l)-r,l=1/l,function(e){return Math.pow(r+e*a,l)}):n(isNaN(e)?t:e)};function s(e,r){var n=l((e=(0,t.rgb)(e)).r,(r=(0,t.rgb)(r)).r),i=l(e.g,r.g),s=l(e.b,r.b),o=a(e.opacity,r.opacity);return function(t){return e.r=n(t),e.g=i(t),e.b=s(t),e.opacity=o(t),e+""}}return s.gamma=e,s}(1);function l(e){return function(r){var n,a,i=r.length,l=Array(i),s=Array(i),o=Array(i);for(n=0;n<i;++n)a=(0,t.rgb)(r[n]),l[n]=a.r||0,s[n]=a.g||0,o[n]=a.b||0;return l=e(l),s=e(s),o=e(o),a.opacity=1,function(e){return a.r=l(e),a.g=s(e),a.b=o(e),a+""}}}l(function(e){var t=e.length-1;return function(n){var a=n<=0?n=0:n>=1?(n=1,t-1):Math.floor(n*t),i=e[a],l=e[a+1],s=a>0?e[a-1]:2*i-l,o=a<t-1?e[a+2]:2*l-i;return r((n-a/t)*t,s,i,l,o)}}),l(function(e){var t=e.length;return function(n){var a=Math.floor(((n%=1)<0?++n:n)*t),i=e[(a+t-1)%t],l=e[a%t],s=e[(a+1)%t],o=e[(a+2)%t];return r((n-a/t)*t,i,l,s,o)}}),e.s(["default",0,i],565445)},668593,e=>{"use strict";e.s(["default",0,function(e,t){return e*=1,t*=1,function(r){return e*(1-r)+t*r}}])},935204,e=>{"use strict";var t=e.i(668593),r=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,n=RegExp(r.source,"g");e.s(["default",0,function(e,a){var i,l,s,o,c,u=r.lastIndex=n.lastIndex=0,d=-1,f=[],h=[];for(e+="",a+="";(s=r.exec(e))&&(o=n.exec(a));)(c=o.index)>u&&(c=a.slice(u,c),f[d]?f[d]+=c:f[++d]=c),(s=s[0])===(o=o[0])?f[d]?f[d]+=o:f[++d]=o:(f[++d]=null,h.push({i:d,x:(0,t.default)(s,o)})),u=n.lastIndex;return u<a.length&&(c=a.slice(u),f[d]?f[d]+=c:f[++d]=c),f.length<2?h[0]?(i=h[0].x,function(e){return i(e)+""}):(l=a,function(){return l}):(a=h.length,function(e){for(var t,r=0;r<a;++r)f[(t=h[r]).i]=t.x(e);return f.join("")})}])},552491,e=>{"use strict";var t=e.i(668593);e.s(["interpolateNumber",()=>t.default])},789785,e=>{"use strict";function t(e,t){let r;if(void 0===t)for(let t of e)null!=t&&(r<t||void 0===r&&t>=t)&&(r=t);else{let n=-1;for(let a of e)null!=(a=t(a,++n,e))&&(r<a||void 0===r&&a>=a)&&(r=a)}return r}e.s(["default",()=>t])},265993,e=>{"use strict";function t(e,t){let r;if(void 0===t)for(let t of e)null!=t&&(r>t||void 0===r&&t>=t)&&(r=t);else{let n=-1;for(let a of e)null!=(a=t(a,++n,e))&&(r>a||void 0===r&&a>=a)&&(r=a)}return r}e.s(["default",()=>t])},101725,e=>{"use strict";var t=e.i(271645),r=e.i(925949),n=e.i(433369),a=["axis"],i=(0,t.forwardRef)((e,i)=>t.createElement(n.CartesianChart,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:a,tooltipPayloadSearcher:r.arrayTooltipSearcher,categoricalChartProps:e,ref:i}));e.s(["AreaChart",()=>i])},400237,e=>{"use strict";e.s(["Area",()=>ek,"computeArea",()=>ew],400237);var t=e.i(271645),r=e.i(207670),n=e.i(372733),a=e.i(997865),i=e.i(969212),l=e.i(373393),s=e.i(257999),o=e.i(794395);function c(){return(c=Object.assign.bind()).apply(null,arguments)}var u=e=>{var{cx:n,cy:a,r:i,className:u}=e,d=(0,r.clsx)("recharts-dot",u);return(0,o.isNumber)(n)&&(0,o.isNumber)(a)&&(0,o.isNumber)(i)?t.createElement("circle",c({},(0,s.svgPropertiesNoEvents)(e),(0,l.adaptEventHandlers)(e),{className:d,cx:n,cy:a,r:i})):null},d=e.i(781977),f=e.i(43404),h=e.i(629601),p=e.i(318457),m=["points"];function x(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function y(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?x(Object(r),!0).forEach(function(t){var n,a,i;n=e,a=t,i=r[t],(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a))in n?Object.defineProperty(n,a,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[a]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):x(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function g(){return(g=Object.assign.bind()).apply(null,arguments)}function b(e){var{option:n,dotProps:a,className:i}=e;if((0,t.isValidElement)(n))return(0,t.cloneElement)(n,a);if("function"==typeof n)return n(a);var l=(0,r.clsx)(i,"boolean"!=typeof n?n.className:""),s=null!=a?a:{},{points:o}=s,c=function(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r={};for(var n in e)if(({}).hasOwnProperty.call(e,n)){if(-1!==t.indexOf(n))continue;r[n]=e[n]}return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],-1===t.indexOf(r)&&({}).propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}(s,m);return t.createElement(u,g({},c,{className:l}))}function v(e){var{points:r,dot:n,className:i,dotClassName:l,dataKey:s,baseProps:o,needClip:c,clipPathId:u,zIndex:m=p.DefaultZIndexes.scatter}=e;if(null==r||!n&&1!==r.length)return null;var x=(0,d.isClipDot)(n),v=(0,f.svgPropertiesAndEventsFromUnknown)(n),N=r.map((e,a)=>{var i,c,u=y(y(y({r:3},o),v),{},{index:a,cx:null!=(i=e.x)?i:void 0,cy:null!=(c=e.y)?c:void 0,dataKey:s,value:e.value,payload:e.payload,points:r});return t.createElement(b,{key:"dot-".concat(a),option:n,dotProps:u,className:l})}),j={};return c&&null!=u&&(j.clipPath="url(#clipPath-".concat(x?"":"dots-").concat(u,")")),t.createElement(h.ZIndexLayer,{zIndex:m},t.createElement(a.Layer,g({className:i},j),N))}var N=e.i(562728),j=e.i(779812),w=e.i(127241),k=e.i(676735),E=e.i(352734);function P(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function O(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?P(Object(r),!0).forEach(function(t){var n,a,i;n=e,a=t,i=r[t],(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a))in n?Object.defineProperty(n,a,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[a]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):P(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var S=e=>{var r,{point:n,childIndex:i,mainColor:o,activeDot:c,dataKey:d,clipPath:f}=e;if(!1===c||null==n.x||null==n.y)return null;var h=O(O(O({},{index:i,dataKey:d,cx:n.x,cy:n.y,r:4,fill:null!=o?o:"none",strokeWidth:2,stroke:"#fff",payload:n.payload,value:n.value}),(0,s.svgPropertiesNoEventsFromUnknown)(c)),(0,l.adaptEventHandlers)(c));return r=(0,t.isValidElement)(c)?(0,t.cloneElement)(c,h):"function"==typeof c?c(h):t.createElement(u,h),t.createElement(a.Layer,{className:"recharts-active-dot",clipPath:f},r)};function A(e){var{points:r,mainColor:n,activeDot:a,itemDataKey:i,clipPath:l,zIndex:s=p.DefaultZIndexes.activeDot}=e,c=(0,w.useAppSelector)(k.selectActiveTooltipIndex),u=(0,E.useActiveTooltipDataPoints)();if(null==r||null==u)return null;var d=r.find(e=>u.includes(e.payload));return(0,o.isNullish)(d)?null:t.createElement(h.ZIndexLayer,{zIndex:s},t.createElement(S,{point:d,childIndex:Number(c),mainColor:n,dataKey:i,activeDot:a,clipPath:l}))}var I=e.i(844),z=e.i(659798),C=e.i(661849),$=e.i(661764),M=e.i(846710),L=e.i(992860),D=e.i(291526),T=e.i(377320),R=e.i(142221),W=(e,t,r)=>(0,$.selectAxisWithScale)(e,"xAxis",(0,R.selectXAxisIdFromGraphicalItemId)(e,t),r),K=(e,t,r)=>(0,$.selectTicksOfGraphicalItem)(e,"xAxis",(0,R.selectXAxisIdFromGraphicalItemId)(e,t),r),B=(e,t,r)=>(0,$.selectAxisWithScale)(e,"yAxis",(0,R.selectYAxisIdFromGraphicalItemId)(e,t),r),V=(e,t,r)=>(0,$.selectTicksOfGraphicalItem)(e,"yAxis",(0,R.selectYAxisIdFromGraphicalItemId)(e,t),r),F=(0,C.createSelector)([M.selectChartLayout,W,B,K,V],(e,t,r,n,a)=>(0,j.isCategoricalAxis)(e,"xAxis")?(0,j.getBandSizeOfAxis)(t,n,!1):(0,j.getBandSizeOfAxis)(r,a,!1)),U=(0,C.createSelector)([$.selectUnfilteredCartesianItems,(e,t)=>t],(e,t)=>e.filter(e=>"area"===e.type).find(e=>e.id===t)),G=e=>{var t=(0,M.selectChartLayout)(e);return(0,j.isCategoricalAxis)(t,"xAxis")?"yAxis":"xAxis"},q=(0,C.createSelector)([U,(e,t,r)=>(0,$.selectStackGroups)(e,G(e),"yAxis"===G(e)?(0,R.selectYAxisIdFromGraphicalItemId)(e,t):(0,R.selectXAxisIdFromGraphicalItemId)(e,t),r)],(e,t)=>{if(null!=e&&null!=t){var r,{stackId:n}=e,a=(0,D.getStackSeriesIdentifier)(e);if(null!=n&&null!=a){var i=null==(r=t[n])?void 0:r.stackedData,l=null==i?void 0:i.find(e=>e.key===a);if(null!=l)return l.map(e=>[e[0],e[1]])}}}),H=(0,C.createSelector)([M.selectChartLayout,W,B,K,V,q,L.selectChartDataWithIndexesIfNotInPanoramaPosition3,F,U,T.selectChartBaseValue],(e,t,r,n,a,i,l,s,o,c)=>{var u,{chartData:d,dataStartIndex:f,dataEndIndex:h}=l;if(null!=o&&("horizontal"===e||"vertical"===e)&&null!=t&&null!=r&&null!=n&&null!=a&&0!==n.length&&0!==a.length&&null!=s){var{data:p}=o;if(null!=(u=p&&p.length>0?p:null==d?void 0:d.slice(f,h+1)))return ew({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:a,dataStartIndex:f,areaSettings:o,stackedData:i,displayedData:u,chartBaseValue:c,bandSize:s})}}),Z=e.i(375337),_=e.i(275502),X=e.i(795146),Y=e.i(440657),J=e.i(51883),Q=e.i(822075),ee=e.i(415549),et=e.i(591187),er=e.i(466576),en=e.i(920135),ea=["id"],ei=["activeDot","animationBegin","animationDuration","animationEasing","connectNulls","dot","fill","fillOpacity","hide","isAnimationActive","legendType","stroke","xAxisId","yAxisId"];function el(){return(el=Object.assign.bind()).apply(null,arguments)}function es(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r={};for(var n in e)if(({}).hasOwnProperty.call(e,n)){if(-1!==t.indexOf(n))continue;r[n]=e[n]}return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],-1===t.indexOf(r)&&({}).propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function eo(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function ec(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?eo(Object(r),!0).forEach(function(t){var n,a,i;n=e,a=t,i=r[t],(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a))in n?Object.defineProperty(n,a,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[a]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):eo(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function eu(e,t){return e&&"none"!==e?e:t}var ed=t.memo(e=>{var{dataKey:r,data:n,stroke:a,strokeWidth:i,fill:l,name:s,hide:c,unit:u,tooltipType:d,id:f}=e,h={dataDefinedOnItem:n,getPosition:o.noop,settings:{stroke:a,strokeWidth:i,fill:l,dataKey:r,nameKey:void 0,name:(0,j.getTooltipNameProp)(s,r),hide:c,type:d,color:eu(a,l),unit:u,graphicalItemId:f}};return t.createElement(I.SetTooltipEntrySettings,{tooltipEntrySettings:h})});function ef(e){var{clipPathId:r,points:n,props:a}=e,{needClip:i,dot:l,dataKey:o}=a,c=(0,s.svgPropertiesNoEvents)(a);return t.createElement(v,{points:n,dot:l,className:"recharts-area-dots",dotClassName:"recharts-area-dot",dataKey:o,baseProps:c,needClip:i,clipPathId:r})}function eh(e){var{showLabels:r,children:n,points:a}=e,l=a.map(e=>{var t,r,n={x:null!=(t=e.x)?t:0,y:null!=(r=e.y)?r:0,width:0,lowerWidth:0,upperWidth:0,height:0};return ec(ec({},n),{},{value:e.value,payload:e.payload,parentViewBox:void 0,viewBox:n,fill:void 0})});return t.createElement(i.CartesianLabelListContextProvider,{value:r?l:void 0},n)}function ep(e){var{points:r,baseLine:i,needClip:l,clipPathId:o,props:c}=e,{layout:u,type:d,stroke:h,connectNulls:p,isRange:m}=c,{id:x}=c,y=es(c,ea),g=(0,s.svgPropertiesNoEvents)(y),b=(0,f.svgPropertiesAndEvents)(y);return t.createElement(t.Fragment,null,(null==r?void 0:r.length)>1&&t.createElement(a.Layer,{clipPath:l?"url(#clipPath-".concat(o,")"):void 0},t.createElement(n.Curve,el({},b,{id:x,points:r,connectNulls:p,type:d,baseLine:i,layout:u,stroke:"none",className:"recharts-area-area"})),"none"!==h&&t.createElement(n.Curve,el({},g,{className:"recharts-area-curve",layout:u,type:d,connectNulls:p,fill:"none",points:r})),"none"!==h&&m&&t.createElement(n.Curve,el({},g,{className:"recharts-area-curve",layout:u,type:d,connectNulls:p,fill:"none",points:i}))),t.createElement(ef,{points:r,props:y,clipPathId:o}))}function em(e){var r,n,{alpha:a,baseLine:i,points:l,strokeWidth:s}=e,c=null==(r=l[0])?void 0:r.y,u=null==(n=l[l.length-1])?void 0:n.y;if(!(0,Q.isWellBehavedNumber)(c)||!(0,Q.isWellBehavedNumber)(u))return null;var d=a*Math.abs(c-u),f=Math.max(...l.map(e=>e.x||0));return((0,o.isNumber)(i)?f=Math.max(i,f):i&&Array.isArray(i)&&i.length&&(f=Math.max(...i.map(e=>e.x||0),f)),(0,o.isNumber)(f))?t.createElement("rect",{x:0,y:c<u?c:c-d,width:f+(s?parseInt("".concat(s),10):1),height:Math.floor(d)}):null}function ex(e){var r,n,{alpha:a,baseLine:i,points:l,strokeWidth:s}=e,c=null==(r=l[0])?void 0:r.x,u=null==(n=l[l.length-1])?void 0:n.x;if(!(0,Q.isWellBehavedNumber)(c)||!(0,Q.isWellBehavedNumber)(u))return null;var d=a*Math.abs(c-u),f=Math.max(...l.map(e=>e.y||0));return((0,o.isNumber)(i)?f=Math.max(i,f):i&&Array.isArray(i)&&i.length&&(f=Math.max(...i.map(e=>e.y||0),f)),(0,o.isNumber)(f))?t.createElement("rect",{x:c<u?c:c-d,y:0,width:d,height:Math.floor(f+(s?parseInt("".concat(s),10):1))}):null}function ey(e){var{alpha:r,layout:n,points:a,baseLine:i,strokeWidth:l}=e;return"vertical"===n?t.createElement(em,{alpha:r,points:a,baseLine:i,strokeWidth:l}):t.createElement(ex,{alpha:r,points:a,baseLine:i,strokeWidth:l})}function eg(e){var{needClip:r,clipPathId:n,props:l,previousPointsRef:s,previousBaselineRef:c}=e,{points:u,baseLine:d,isAnimationActive:f,animationBegin:h,animationDuration:p,animationEasing:m,onAnimationStart:x,onAnimationEnd:y}=l,g=(0,t.useMemo)(()=>({points:u,baseLine:d}),[u,d]),b=(0,Y.useAnimationId)(g,"recharts-area-"),v=(0,M.useCartesianChartLayout)(),[N,j]=(0,t.useState)(!1),w=(0,t.useCallback)(()=>{"function"==typeof y&&y(),j(!1)},[y]),k=(0,t.useCallback)(()=>{"function"==typeof x&&x(),j(!0)},[x]);if(null==v)return null;var E=s.current,P=c.current;return t.createElement(eh,{showLabels:!N,points:u},l.children,t.createElement(er.JavascriptAnimate,{animationId:b,begin:h,duration:p,isActive:f,easing:m,onAnimationEnd:w,onAnimationStart:k,key:b},e=>{if(E){var i,h=E.length/u.length,p=1===e?u:u.map((t,r)=>{var n=Math.floor(r*h);if(E[n]){var a=E[n];return ec(ec({},t),{},{x:(0,o.interpolate)(a.x,t.x,e),y:(0,o.interpolate)(a.y,t.y,e)})}return t});return i=(0,o.isNumber)(d)?(0,o.interpolate)(P,d,e):(0,o.isNullish)(d)||(0,o.isNan)(d)?(0,o.interpolate)(P,0,e):d.map((t,r)=>{var n=Math.floor(r*h);if(Array.isArray(P)&&P[n]){var a=P[n];return ec(ec({},t),{},{x:(0,o.interpolate)(a.x,t.x,e),y:(0,o.interpolate)(a.y,t.y,e)})}return t}),e>0&&(s.current=p,c.current=i),t.createElement(ep,{points:p,baseLine:i,needClip:r,clipPathId:n,props:l})}return e>0&&(s.current=u,c.current=d),t.createElement(a.Layer,null,f&&t.createElement("defs",null,t.createElement("clipPath",{id:"animationClipPath-".concat(n)},t.createElement(ey,{alpha:e,points:u,baseLine:d,layout:v,strokeWidth:l.strokeWidth}))),t.createElement(a.Layer,{clipPath:"url(#animationClipPath-".concat(n,")")},t.createElement(ep,{points:u,baseLine:d,needClip:r,clipPathId:n,props:l})))}),t.createElement(i.LabelListFromLabelProp,{label:l.label}))}function eb(e){var{needClip:r,clipPathId:n,props:a}=e,i=(0,t.useRef)(null),l=(0,t.useRef)();return t.createElement(eg,{needClip:r,clipPathId:n,props:a,previousPointsRef:i,previousBaselineRef:l})}class ev extends t.PureComponent{render(){var{hide:e,dot:n,points:i,className:l,top:o,left:c,needClip:u,xAxisId:f,yAxisId:p,width:m,height:x,id:y,baseLine:g,zIndex:b}=this.props;if(e)return null;var v=(0,r.clsx)("recharts-area",l),{r:N,strokeWidth:j}=function(e){var t=(0,s.svgPropertiesNoEventsFromUnknown)(e);if(null!=t){var{r,strokeWidth:n}=t,a=Number(r),i=Number(n);return(Number.isNaN(a)||a<0)&&(a=3),(Number.isNaN(i)||i<0)&&(i=2),{r:a,strokeWidth:i}}return{r:3,strokeWidth:2}}(n),w=(0,d.isClipDot)(n),k=2*N+j,E=u?"url(#clipPath-".concat(w?"":"dots-").concat(y,")"):void 0;return t.createElement(h.ZIndexLayer,{zIndex:b},t.createElement(a.Layer,{className:v},u&&t.createElement("defs",null,t.createElement(z.GraphicalItemClipPath,{clipPathId:y,xAxisId:f,yAxisId:p}),!w&&t.createElement("clipPath",{id:"clipPath-dots-".concat(y)},t.createElement("rect",{x:c-k/2,y:o-k/2,width:m+k,height:x+k}))),t.createElement(eb,{needClip:u,clipPathId:y,props:this.props})),t.createElement(A,{points:i,mainColor:eu(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:E}),this.props.isRange&&Array.isArray(g)&&t.createElement(A,{points:g,mainColor:eu(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:E}))}}var eN={activeDot:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",connectNulls:!1,dot:!1,fill:"#3182bd",fillOpacity:.6,hide:!1,isAnimationActive:"auto",legendType:"line",stroke:"#3182bd",strokeWidth:1,type:"linear",label:!1,xAxisId:0,yAxisId:0,zIndex:p.DefaultZIndexes.area};function ej(e){var r,n=(0,J.resolveDefaultProps)(e,eN),{activeDot:a,animationBegin:i,animationDuration:l,animationEasing:s,connectNulls:o,dot:c,fill:u,fillOpacity:d,hide:f,isAnimationActive:h,legendType:p,stroke:m,xAxisId:x,yAxisId:y}=n,g=es(n,ei),b=(0,M.useChartLayout)(),v=(0,_.useChartName)(),{needClip:j}=(0,z.useNeedsClip)(x,y),k=(0,Z.useIsPanorama)(),{points:P,isRange:O,baseLine:S}=null!=(r=(0,w.useAppSelector)(t=>H(t,e.id,k)))?r:{},A=(0,E.usePlotArea)();if("horizontal"!==b&&"vertical"!==b||null==A||"AreaChart"!==v&&"ComposedChart"!==v)return null;var{height:I,width:C,x:$,y:L}=A;return P&&P.length?t.createElement(ev,el({},g,{activeDot:a,animationBegin:i,animationDuration:l,animationEasing:s,baseLine:S,connectNulls:o,dot:c,fill:u,fillOpacity:d,height:I,hide:f,layout:b,isAnimationActive:"auto"===h?!N.Global.isSsr:h,isRange:O,legendType:p,needClip:j,points:P,stroke:m,width:C,left:$,top:L,xAxisId:x,yAxisId:y})):null}function ew(e){var t,{areaSettings:{connectNulls:r,baseValue:n,dataKey:a},stackedData:i,layout:l,chartBaseValue:s,xAxis:c,yAxis:u,displayedData:d,dataStartIndex:f,xAxisTicks:h,yAxisTicks:p,bandSize:m}=e,x=i&&i.length,y=((e,t,r,n,a)=>{var i=null!=r?r:t;if((0,o.isNumber)(i))return i;var l="horizontal"===e?a:n,s=l.scale.domain();if("number"===l.type){var c=Math.max(s[0],s[1]),u=Math.min(s[0],s[1]);return"dataMin"===i?u:"dataMax"===i||c<0?c:Math.max(Math.min(s[0],s[1]),0)}return"dataMin"===i?s[0]:"dataMax"===i?s[1]:s[0]})(l,s,n,c,u),g="horizontal"===l,b=!1,v=d.map((e,t)=>{if(x)o=i[f+t];else{var n,l,s,o,d,v=(0,j.getValueByDataKey)(e,a);Array.isArray(v)?(o=v,b=!0):o=[y,v]}var N=null!=(n=null==(l=o)?void 0:l[1])?n:null,w=null==N||x&&!r&&null==(0,j.getValueByDataKey)(e,a);return g?{x:(0,j.getCateCoordinateOfLine)({axis:c,ticks:h,bandSize:m,entry:e,index:t}),y:w?null:null!=(d=u.scale.map(N))?d:null,value:o,payload:e}:{x:w?null:null!=(s=c.scale.map(N))?s:null,y:(0,j.getCateCoordinateOfLine)({axis:u,ticks:p,bandSize:m,entry:e,index:t}),value:o,payload:e}});return t=x||b?v.map(e=>{var t,r,n=Array.isArray(e.value)?e.value[0]:null;return g?{x:e.x,y:null!=n&&null!=e.y&&null!=(r=u.scale.map(n))?r:null,payload:e.payload}:{x:null!=n&&null!=(t=c.scale.map(n))?t:null,y:e.y,payload:e.payload}}):g?u.scale.map(y):c.scale.map(y),{points:v,baseLine:null!=t?t:0,isRange:b}}var ek=t.memo(function(e){var r=(0,J.resolveDefaultProps)(e,eN),n=(0,Z.useIsPanorama)();return t.createElement(ee.RegisterGraphicalItemId,{id:r.id,type:"area"},e=>t.createElement(t.Fragment,null,t.createElement(X.SetLegendPayload,{legendPayload:(e=>{var{dataKey:t,name:r,stroke:n,fill:a,legendType:i,hide:l}=e;return[{inactive:l,dataKey:t,type:i,color:eu(n,a),value:(0,j.getTooltipNameProp)(r,t),payload:e}]})(r)}),t.createElement(ed,{dataKey:r.dataKey,data:r.data,stroke:r.stroke,strokeWidth:r.strokeWidth,fill:r.fill,name:r.name,hide:r.hide,unit:r.unit,tooltipType:r.tooltipType,id:e}),t.createElement(et.SetCartesianGraphicalItem,{type:"area",id:e,data:r.data,dataKey:r.dataKey,xAxisId:r.xAxisId,yAxisId:r.yAxisId,zAxisId:0,stackId:(0,j.getNormalizedStackId)(r.stackId),hide:r.hide,barSize:void 0,baseValue:r.baseValue,isPanorama:n,connectNulls:r.connectNulls}),t.createElement(ej,el({},r,{id:e}))))},en.propsAreEqual);ek.displayName="Area"},158537,e=>{"use strict";var t=e.i(843476),r=e.i(271645),n=e.i(21218),a=e.i(531278),i=e.i(475254);let l=(0,i.default)("log-in",[["path",{d:"m10 17 5-5-5-5",key:"1bsop3"}],["path",{d:"M15 12H3",key:"6jk70r"}],["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4",key:"u53s6r"}]]);var s=e.i(503116),o=e.i(761911);let c=(0,i.default)("zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]);var u=e.i(509694),d=e.i(475225),f=e.i(101725),h=e.i(400237),p=e.i(785183),m=e.i(93230),x=e.i(234239),y=e.i(731195),g=e.i(209165);function b(){let[e,i]=(0,r.useState)(null),[b,w]=(0,r.useState)(!0),[k,E]=(0,r.useState)(""),[P,O]=(0,r.useState)(30);if((0,r.useEffect)(()=>{w(!0),fetch((0,g.api)(`/api/admin/analytics?days=${P}`)).then(e=>{if(!e.ok)throw Error(403===e.status?"Forbidden":"Failed to load analytics");return e.json()}).then(e=>{i(e),E("")}).catch(e=>E(e.message)).finally(()=>w(!1))},[P]),b)return(0,t.jsxs)("div",{className:"p-6 flex items-center gap-2 text-zinc-400",children:[(0,t.jsx)(a.Loader2,{className:"w-4 h-4 animate-spin"}),"Loading activity data..."]});if(k)return(0,t.jsx)("div",{className:"p-6",children:(0,t.jsx)("p",{className:"text-red-400 text-sm",children:k})});if(!e)return null;let S=new Set(e.userSummary.map(e=>e.username)).size,A=e.dailyLogins.map(e=>({date:new Date(e.date+"T00:00:00").toLocaleDateString("en-US",{month:"short",day:"numeric"}),logins:e.count})),I=e.dailySessionTime.map(e=>({date:new Date(e.date+"T00:00:00").toLocaleDateString("en-US",{month:"short",day:"numeric"}),hours:Math.round(e.minutes/6)/10}));return(0,t.jsxs)("div",{className:"p-6 space-y-6 max-w-7xl",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[(0,t.jsx)(n.Activity,{className:"w-6 h-6"}),"Team Activity"]}),(0,t.jsx)("p",{className:"text-muted-foreground text-sm mt-1",children:"Login and terminal session analytics across all users"})]}),(0,t.jsx)("div",{className:"flex items-center gap-1 bg-zinc-100 dark:bg-zinc-800 rounded-lg p-1",children:[7,30,90].map(e=>(0,t.jsxs)("button",{onClick:()=>O(e),className:`px-3 py-1.5 text-xs rounded-md transition-colors ${P===e?"bg-white dark:bg-zinc-700 text-zinc-900 dark:text-zinc-100 shadow-sm font-medium":"text-zinc-500 hover:text-zinc-700 dark:hover:text-zinc-300"}`,children:[e,"d"]},e))})]}),(0,t.jsxs)("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-4",children:[(0,t.jsx)(v,{icon:(0,t.jsx)(c,{className:"w-4 h-4 text-green-500"}),label:"Active Now",value:e.activeSessions}),(0,t.jsx)(v,{icon:(0,t.jsx)(l,{className:"w-4 h-4 text-indigo-500"}),label:"Total Logins",value:e.totalLogins}),(0,t.jsx)(v,{icon:(0,t.jsx)(s.Clock,{className:"w-4 h-4 text-violet-500"}),label:"Total Vibe Time",value:N(e.totalSessionMinutes)}),(0,t.jsx)(v,{icon:(0,t.jsx)(o.Users,{className:"w-4 h-4 text-amber-500"}),label:"Unique Users",value:S})]}),(0,t.jsxs)("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[(0,t.jsxs)("div",{className:"bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-lg p-4",children:[(0,t.jsx)("h3",{className:"font-semibold mb-4",children:"Daily Logins"}),0===A.length?(0,t.jsx)("p",{className:"text-sm text-muted-foreground h-[200px] flex items-center justify-center",children:"No login data yet"}):(0,t.jsx)(y.ResponsiveContainer,{width:"100%",height:200,children:(0,t.jsxs)(u.BarChart,{data:A,children:[(0,t.jsx)(p.XAxis,{dataKey:"date",tick:{fontSize:11}}),(0,t.jsx)(m.YAxis,{tick:{fontSize:11},allowDecimals:!1}),(0,t.jsx)(x.Tooltip,{contentStyle:{background:"var(--background)",border:"1px solid var(--border)",borderRadius:"0.5rem",fontSize:"12px"}}),(0,t.jsx)(d.Bar,{dataKey:"logins",fill:"#6366f1",radius:[2,2,0,0]})]})})]}),(0,t.jsxs)("div",{className:"bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-lg p-4",children:[(0,t.jsx)("h3",{className:"font-semibold mb-4",children:"Daily Vibe Time"}),0===I.length?(0,t.jsx)("p",{className:"text-sm text-muted-foreground h-[200px] flex items-center justify-center",children:"No session data yet"}):(0,t.jsx)(y.ResponsiveContainer,{width:"100%",height:200,children:(0,t.jsxs)(f.AreaChart,{data:I,children:[(0,t.jsx)(p.XAxis,{dataKey:"date",tick:{fontSize:11}}),(0,t.jsx)(m.YAxis,{tick:{fontSize:11},tickFormatter:e=>`${e}h`}),(0,t.jsx)(x.Tooltip,{formatter:e=>[`${e}h`,"Time"],contentStyle:{background:"var(--background)",border:"1px solid var(--border)",borderRadius:"0.5rem",fontSize:"12px"}}),(0,t.jsx)(h.Area,{type:"monotone",dataKey:"hours",fill:"#8b5cf6",fillOpacity:.2,stroke:"#8b5cf6"})]})})]})]}),(0,t.jsxs)("div",{className:"bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-lg overflow-hidden",children:[(0,t.jsx)("div",{className:"p-4 border-b border-zinc-200 dark:border-zinc-800",children:(0,t.jsx)("h3",{className:"font-semibold",children:"User Leaderboard"})}),(0,t.jsxs)("table",{className:"w-full text-sm",children:[(0,t.jsx)("thead",{className:"bg-zinc-50 dark:bg-zinc-800/50",children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{className:"text-left px-4 py-3 font-medium text-zinc-500",children:"Username"}),(0,t.jsx)("th",{className:"text-right px-4 py-3 font-medium text-zinc-500",children:"Sessions"}),(0,t.jsx)("th",{className:"text-right px-4 py-3 font-medium text-zinc-500",children:"Total Time"}),(0,t.jsx)("th",{className:"text-right px-4 py-3 font-medium text-zinc-500",children:"Last Login"})]})}),(0,t.jsxs)("tbody",{className:"divide-y divide-zinc-100 dark:divide-zinc-800",children:[e.userSummary.map(e=>(0,t.jsxs)("tr",{className:"hover:bg-zinc-50 dark:hover:bg-zinc-800/30",children:[(0,t.jsx)("td",{className:"px-4 py-3 font-mono",children:e.username}),(0,t.jsx)("td",{className:"px-4 py-3 text-right text-zinc-400",children:e.session_count}),(0,t.jsx)("td",{className:"px-4 py-3 text-right text-zinc-400",children:N(Math.round(e.total_minutes))}),(0,t.jsx)("td",{className:"px-4 py-3 text-right text-zinc-400 text-xs",children:e.last_login?j(e.last_login):"-"})]},e.username)),0===e.userSummary.length&&(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:4,className:"px-4 py-8 text-center text-zinc-500",children:"No session data yet"})})]})]})]}),(0,t.jsxs)("div",{className:"bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-lg overflow-hidden",children:[(0,t.jsx)("div",{className:"p-4 border-b border-zinc-200 dark:border-zinc-800",children:(0,t.jsx)("h3",{className:"font-semibold",children:"Recent Logins"})}),(0,t.jsxs)("table",{className:"w-full text-sm",children:[(0,t.jsx)("thead",{className:"bg-zinc-50 dark:bg-zinc-800/50",children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{className:"text-left px-4 py-3 font-medium text-zinc-500",children:"Username"}),(0,t.jsx)("th",{className:"text-left px-4 py-3 font-medium text-zinc-500",children:"Time"}),(0,t.jsx)("th",{className:"text-left px-4 py-3 font-medium text-zinc-500",children:"IP Address"})]})}),(0,t.jsxs)("tbody",{className:"divide-y divide-zinc-100 dark:divide-zinc-800",children:[e.recentLogins.slice(0,25).map((e,r)=>(0,t.jsxs)("tr",{className:"hover:bg-zinc-50 dark:hover:bg-zinc-800/30",children:[(0,t.jsx)("td",{className:"px-4 py-3 font-mono",children:e.username}),(0,t.jsx)("td",{className:"px-4 py-3 text-zinc-400 text-xs",children:j(e.timestamp)}),(0,t.jsx)("td",{className:"px-4 py-3 text-zinc-400 font-mono text-xs",children:e.ip_address||"-"})]},r)),0===e.recentLogins.length&&(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:3,className:"px-4 py-8 text-center text-zinc-500",children:"No login events yet"})})]})]})]})]})}function v({icon:e,label:r,value:n}){return(0,t.jsxs)("div",{className:"bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-lg p-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 text-xs text-zinc-500 mb-2",children:[e,r]}),(0,t.jsx)("div",{className:"text-2xl font-bold",children:n})]})}function N(e){if(e<60)return`${e}m`;let t=Math.floor(e/60),r=e%60;return r>0?`${t}h ${r}m`:`${t}h`}function j(e){try{return new Date(e.includes("T")?e:e+"Z").toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})}catch{return e}}e.s(["default",()=>b],158537)}]);