@shepai/cli 1.148.0 → 1.149.0-pr463.3fd9e4e

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 (200) hide show
  1. package/dist/packages/core/src/application/use-cases/features/get-branch-sync-status.use-case.d.ts.map +1 -1
  2. package/dist/packages/core/src/application/use-cases/features/get-branch-sync-status.use-case.js +4 -0
  3. package/dist/src/presentation/web/app/api/agent-events/route.js +1 -1
  4. package/dist/src/presentation/web/app/api/sessions/route.d.ts.map +1 -1
  5. package/dist/src/presentation/web/app/api/sessions/route.js +2 -268
  6. package/dist/src/presentation/web/app/api/sessions-batch/route.d.ts +17 -0
  7. package/dist/src/presentation/web/app/api/sessions-batch/route.d.ts.map +1 -0
  8. package/dist/src/presentation/web/app/api/sessions-batch/route.js +61 -0
  9. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  10. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +6 -3
  11. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts +1 -1
  12. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts.map +1 -1
  13. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +15 -73
  14. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.d.ts.map +1 -1
  15. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.js +18 -17
  16. package/dist/src/presentation/web/components/features/control-center/control-center.d.ts.map +1 -1
  17. package/dist/src/presentation/web/components/features/control-center/control-center.js +2 -1
  18. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  19. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +4 -1
  20. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +32 -33
  22. package/dist/src/presentation/web/hooks/sessions-provider.d.ts +12 -0
  23. package/dist/src/presentation/web/hooks/sessions-provider.d.ts.map +1 -0
  24. package/dist/src/presentation/web/hooks/sessions-provider.js +57 -0
  25. package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -1
  26. package/dist/src/presentation/web/hooks/use-deploy-action.js +8 -54
  27. package/dist/src/presentation/web/lib/session-scanner.d.ts +27 -0
  28. package/dist/src/presentation/web/lib/session-scanner.d.ts.map +1 -0
  29. package/dist/src/presentation/web/lib/session-scanner.js +255 -0
  30. package/dist/tsconfig.build.tsbuildinfo +1 -1
  31. package/package.json +1 -1
  32. package/web/.next/BUILD_ID +1 -1
  33. package/web/.next/app-path-routes-manifest.json +1 -0
  34. package/web/.next/build-manifest.json +2 -2
  35. package/web/.next/fallback-build-manifest.json +2 -2
  36. package/web/.next/prerender-manifest.json +3 -3
  37. package/web/.next/required-server-files.js +3 -3
  38. package/web/.next/required-server-files.json +3 -3
  39. package/web/.next/routes-manifest.json +6 -0
  40. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  41. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
  44. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  47. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  50. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  53. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +28 -28
  56. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  59. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  65. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  68. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/_global-error.html +2 -2
  71. package/web/.next/server/app/_global-error.rsc +1 -1
  72. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  74. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  75. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  76. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  77. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  78. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  80. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  81. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  82. package/web/.next/server/app/api/sessions/route.js +2 -3
  83. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  84. package/web/.next/server/app/api/sessions-batch/route/app-paths-manifest.json +3 -0
  85. package/web/.next/server/app/api/sessions-batch/route/build-manifest.json +11 -0
  86. package/web/.next/server/app/api/sessions-batch/route/server-reference-manifest.json +4 -0
  87. package/web/.next/server/app/api/sessions-batch/route.js +7 -0
  88. package/web/.next/server/app/api/sessions-batch/route.js.map +5 -0
  89. package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -0
  90. package/web/.next/server/app/api/sessions-batch/route_client-reference-manifest.js +2 -0
  91. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  92. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  93. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  95. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  96. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  98. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  99. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  101. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app-paths-manifest.json +1 -0
  103. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +1 -1
  104. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  105. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_sessions-batch_route_actions_4859f283.js +3 -0
  106. package/web/.next/server/chunks/[root-of-the-server]__0d33c29e._.js +3 -0
  107. package/web/.next/server/chunks/[root-of-the-server]__0d33c29e._.js.map +1 -0
  108. package/web/.next/server/chunks/[root-of-the-server]__2f61738a._.js +3 -0
  109. package/web/.next/server/chunks/[root-of-the-server]__2f61738a._.js.map +1 -0
  110. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  111. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  112. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js +2 -2
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +3 -3
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +1 -1
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +1 -1
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  135. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
  137. package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  139. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
  141. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
  143. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
  145. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/_6256a985._.js +1 -1
  147. package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
  149. package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/_8fcc39d4._.js +1 -1
  151. package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
  152. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/_cd7fb17f._.js +4 -0
  154. package/web/.next/server/chunks/ssr/_cd7fb17f._.js.map +1 -0
  155. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  156. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/{_fe63a7f9._.js → _fff03050._.js} +2 -2
  158. package/web/.next/server/chunks/ssr/{_fe63a7f9._.js.map → _fff03050._.js.map} +1 -1
  159. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  160. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  162. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  164. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  166. package/web/.next/server/chunks/ssr/{src_presentation_web_7b2fda40._.js → src_presentation_web_bc27a88f._.js} +2 -2
  167. package/web/.next/server/chunks/ssr/{src_presentation_web_7b2fda40._.js.map → src_presentation_web_bc27a88f._.js.map} +1 -1
  168. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  169. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  171. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  172. package/web/.next/server/pages/500.html +2 -2
  173. package/web/.next/server/server-reference-manifest.js +1 -1
  174. package/web/.next/server/server-reference-manifest.json +44 -44
  175. package/web/.next/static/chunks/{6f76e63ead3fac2e.js → 121c2afa739794c8.js} +1 -1
  176. package/web/.next/static/chunks/3fc3c48d5fc1d34b.js +1 -0
  177. package/web/.next/static/chunks/6fb988bb7502376a.js +1 -0
  178. package/web/.next/static/chunks/7510c0f6c2e3f7ed.js +1 -0
  179. package/web/.next/static/chunks/{c731682077fbac4f.js → 768af4e247048769.js} +1 -1
  180. package/web/.next/static/chunks/834e374897ece7a3.js +1 -0
  181. package/web/.next/static/chunks/{7c5131e33516a325.js → 9d71dd508eeb2a7b.js} +1 -1
  182. package/web/.next/static/chunks/{48850e202dd814ac.js → ab62defde8095aaf.js} +1 -1
  183. package/web/.next/static/chunks/{9dad6769d10a32df.js → b2e8d1bb057a5233.js} +1 -1
  184. package/web/.next/static/chunks/{04869f1d3f5d9071.js → b9170990200dc7f7.js} +1 -1
  185. package/web/.next/static/chunks/{0137d4850cab3c45.js → ca75d824df20fe75.js} +3 -3
  186. package/web/.next/static/chunks/fdebfc97662845ff.js +2 -0
  187. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_ff60e4a5.js +0 -3
  188. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_ff60e4a5.js.map +0 -1
  189. package/web/.next/server/chunks/[externals]__448264a3._.js +0 -3
  190. package/web/.next/server/chunks/ssr/_4533d6f8._.js +0 -4
  191. package/web/.next/server/chunks/ssr/_4533d6f8._.js.map +0 -1
  192. package/web/.next/static/chunks/063a24b49d9818a0.js +0 -1
  193. package/web/.next/static/chunks/21e82fee1a7e1668.js +0 -1
  194. package/web/.next/static/chunks/682563e4503cbd58.js +0 -1
  195. package/web/.next/static/chunks/683b1d85e789c2eb.js +0 -2
  196. package/web/.next/static/chunks/d62ae5e449d87057.js +0 -1
  197. /package/web/.next/server/chunks/{[externals]__448264a3._.js.map → 744ca_web__next-internal_server_app_api_sessions-batch_route_actions_4859f283.js.map} +0 -0
  198. /package/web/.next/static/{zYKuE1zbe1UWwAJv5EVwg → uf467r-P2iBzLS8YsN7j2}/_buildManifest.js +0 -0
  199. /package/web/.next/static/{zYKuE1zbe1UWwAJv5EVwg → uf467r-P2iBzLS8YsN7j2}/_clientMiddlewareManifest.json +0 -0
  200. /package/web/.next/static/{zYKuE1zbe1UWwAJv5EVwg → uf467r-P2iBzLS8YsN7j2}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/components/ui/sidebar.tsx","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-scroll-area%401.2.10_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types_ba0b3d60c668755d5c2d6349c8477ebb/node_modules/%40radix-ui/react-scroll-area/dist/index.mjs","../../../../../../../src/presentation/web/components/ui/scroll-area.tsx","../../../../../../../src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.tsx","../../../../../../../src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.tsx","../../../../../../../src/presentation/web/hooks/use-npm-version-check.ts","../../../../../../../src/presentation/web/hooks/use-cli-upgrade.ts","../../../../../../../src/presentation/web/components/common/version-badge/version-badge.tsx","../../../../../../../src/presentation/web/components/common/elapsed-time/elapsed-time.tsx","../../../../../../../src/presentation/web/components/common/feature-status-config.ts","../../../../../../../src/presentation/web/components/common/feature-list-item/feature-list-item.tsx","../../../../../../../src/presentation/web/hooks/useTheme.ts","../../../../../../../src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.tsx","../../../../../../../src/presentation/web/hooks/use-deferred-mount.ts","../../../../../../../src/presentation/web/components/ui/sheet.tsx","../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx","../../../../../../../src/presentation/web/components/common/floating-action-button/floating-action-button.tsx","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-url-input.tsx","../../../../../../../src/presentation/web/app/actions/data%3A237ea9%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.tsx","../../../../../../../src/presentation/web/app/actions/data%3Ab2e430%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-import-dialog.tsx","../../../../../../../src/presentation/web/hooks/use-notifications.ts","../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx","../../../../../../../src/presentation/web/hooks/use-version.ts","../../../../../../../src/presentation/web/hooks/use-mobile.ts","../../../../../../../src/presentation/web/components/ui/skeleton.tsx","../../../../../../../src/presentation/web/lib/compare-versions.ts","../../../../../../../src/presentation/web/components/common/shep-logo/shep-logo.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/lock.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/panel-left.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/volume-off.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/house.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/sun.ts","../../../../../../../src/presentation/web/types/theme.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/volume-2.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/settings.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/moon.ts","../../../../../../../src/presentation/web/components/common/feature-status-group/feature-status-group.tsx","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-scroll-area%401.2.10_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types_ba0b3d60c668755d5c2d6349c8477ebb/node_modules/%40radix-ui/react-scroll-area/src/use-state-machine.ts","../../../../../../../src/presentation/web/components/ui/sonner.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { PanelLeftIcon } from 'lucide-react';\nimport { Slot } from 'radix-ui';\n\nimport { useIsMobile } from '@/hooks/use-mobile';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Separator } from '@/components/ui/separator';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '@/components/ui/sheet';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nconst SIDEBAR_STORAGE_KEY = 'shep-sidebar-open';\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ninterface SidebarContextProps {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n /** Whether transitions should be enabled (false until first user toggle). */\n animated: boolean;\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n const [animated, setAnimated] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n // defaultOpen comes from server-side cookie reading, so SSR and client agree.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // Persist sidebar state to localStorage and a cookie (so the server can\n // read it on the next request and render the correct initial state).\n try {\n localStorage.setItem(SIDEBAR_STORAGE_KEY, String(openState));\n document.cookie = `${SIDEBAR_STORAGE_KEY}=${openState}; path=/; max-age=31536000; SameSite=Lax`;\n } catch {\n // Silently ignore storage errors (e.g. quota exceeded, private browsing).\n }\n },\n [setOpenProp, open]\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n setAnimated(true);\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Seed cookie from localStorage for existing users who have localStorage\n // but no cookie yet (one-time migration).\n React.useEffect(() => {\n try {\n if (!document.cookie.includes(SIDEBAR_STORAGE_KEY)) {\n const stored = localStorage.getItem(SIDEBAR_STORAGE_KEY);\n if (stored != null) {\n document.cookie = `${SIDEBAR_STORAGE_KEY}=${stored}; path=/; max-age=31536000; SameSite=Lax`;\n }\n }\n } catch {\n // Ignore\n }\n }, []);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n animated,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar, animated]\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n 'group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full',\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n const { isMobile, state, openMobile, setOpenMobile, animated } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative w-(--sidebar-width) bg-transparent',\n animated && 'transition-[width] duration-200 ease-linear',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)'\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) md:flex',\n animated && 'transition-[left,right,width] duration-200 ease-linear',\n side === 'left'\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',\n 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n 'bg-background relative flex w-full flex-1 flex-col',\n 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn('bg-background h-8 w-full shadow-none', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn('bg-sidebar-border mx-2 w-auto', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n 'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : 'div';\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn('w-full text-sm', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn('flex w-full min-w-0 flex-col gap-1', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative', className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n outline:\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'h-8 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : 'button';\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== 'collapsed' || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon ? (\n <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />\n ) : null}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn('group/menu-sub-item relative', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : 'a';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n SIDEBAR_STORAGE_KEY,\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","\"use client\";\n\n// src/scroll-area.tsx\nimport * as React2 from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport { clamp } from \"@radix-ui/number\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\n\n// src/use-state-machine.ts\nimport * as React from \"react\";\nfunction useStateMachine(initialState, machine) {\n return React.useReducer((state, event) => {\n const nextState = machine[state][event];\n return nextState ?? state;\n }, initialState);\n}\n\n// src/scroll-area.tsx\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar SCROLL_AREA_NAME = \"ScrollArea\";\nvar [createScrollAreaContext, createScrollAreaScope] = createContextScope(SCROLL_AREA_NAME);\nvar [ScrollAreaProvider, useScrollAreaContext] = createScrollAreaContext(SCROLL_AREA_NAME);\nvar ScrollArea = React2.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeScrollArea,\n type = \"hover\",\n dir,\n scrollHideDelay = 600,\n ...scrollAreaProps\n } = props;\n const [scrollArea, setScrollArea] = React2.useState(null);\n const [viewport, setViewport] = React2.useState(null);\n const [content, setContent] = React2.useState(null);\n const [scrollbarX, setScrollbarX] = React2.useState(null);\n const [scrollbarY, setScrollbarY] = React2.useState(null);\n const [cornerWidth, setCornerWidth] = React2.useState(0);\n const [cornerHeight, setCornerHeight] = React2.useState(0);\n const [scrollbarXEnabled, setScrollbarXEnabled] = React2.useState(false);\n const [scrollbarYEnabled, setScrollbarYEnabled] = React2.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setScrollArea(node));\n const direction = useDirection(dir);\n return /* @__PURE__ */ jsx(\n ScrollAreaProvider,\n {\n scope: __scopeScrollArea,\n type,\n dir: direction,\n scrollHideDelay,\n scrollArea,\n viewport,\n onViewportChange: setViewport,\n content,\n onContentChange: setContent,\n scrollbarX,\n onScrollbarXChange: setScrollbarX,\n scrollbarXEnabled,\n onScrollbarXEnabledChange: setScrollbarXEnabled,\n scrollbarY,\n onScrollbarYChange: setScrollbarY,\n scrollbarYEnabled,\n onScrollbarYEnabledChange: setScrollbarYEnabled,\n onCornerWidthChange: setCornerWidth,\n onCornerHeightChange: setCornerHeight,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n ...scrollAreaProps,\n ref: composedRefs,\n style: {\n position: \"relative\",\n // Pass corner sizes as CSS vars to reduce re-renders of context consumers\n [\"--radix-scroll-area-corner-width\"]: cornerWidth + \"px\",\n [\"--radix-scroll-area-corner-height\"]: cornerHeight + \"px\",\n ...props.style\n }\n }\n )\n }\n );\n }\n);\nScrollArea.displayName = SCROLL_AREA_NAME;\nvar VIEWPORT_NAME = \"ScrollAreaViewport\";\nvar ScrollAreaViewport = React2.forwardRef(\n (props, forwardedRef) => {\n const { __scopeScrollArea, children, nonce, ...viewportProps } = props;\n const context = useScrollAreaContext(VIEWPORT_NAME, __scopeScrollArea);\n const ref = React2.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onViewportChange);\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n \"style\",\n {\n dangerouslySetInnerHTML: {\n __html: `[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}`\n },\n nonce\n }\n ),\n /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-radix-scroll-area-viewport\": \"\",\n ...viewportProps,\n ref: composedRefs,\n style: {\n /**\n * We don't support `visible` because the intention is to have at least one scrollbar\n * if this component is used and `visible` will behave like `auto` in that case\n * https://developer.mozilla.org/en-US/docs/Web/CSS/overflow#description\n *\n * We don't handle `auto` because the intention is for the native implementation\n * to be hidden if using this component. We just want to ensure the node is scrollable\n * so could have used either `scroll` or `auto` here. We picked `scroll` to prevent\n * the browser from having to work out whether to render native scrollbars or not,\n * we tell it to with the intention of hiding them in CSS.\n */\n overflowX: context.scrollbarXEnabled ? \"scroll\" : \"hidden\",\n overflowY: context.scrollbarYEnabled ? \"scroll\" : \"hidden\",\n ...props.style\n },\n children: /* @__PURE__ */ jsx(\"div\", { ref: context.onContentChange, style: { minWidth: \"100%\", display: \"table\" }, children })\n }\n )\n ] });\n }\n);\nScrollAreaViewport.displayName = VIEWPORT_NAME;\nvar SCROLLBAR_NAME = \"ScrollAreaScrollbar\";\nvar ScrollAreaScrollbar = React2.forwardRef(\n (props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { onScrollbarXEnabledChange, onScrollbarYEnabledChange } = context;\n const isHorizontal = props.orientation === \"horizontal\";\n React2.useEffect(() => {\n isHorizontal ? onScrollbarXEnabledChange(true) : onScrollbarYEnabledChange(true);\n return () => {\n isHorizontal ? onScrollbarXEnabledChange(false) : onScrollbarYEnabledChange(false);\n };\n }, [isHorizontal, onScrollbarXEnabledChange, onScrollbarYEnabledChange]);\n return context.type === \"hover\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarHover, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"scroll\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarScroll, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"auto\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarAuto, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"always\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarVisible, { ...scrollbarProps, ref: forwardedRef }) : null;\n }\n);\nScrollAreaScrollbar.displayName = SCROLLBAR_NAME;\nvar ScrollAreaScrollbarHover = React2.forwardRef((props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [visible, setVisible] = React2.useState(false);\n React2.useEffect(() => {\n const scrollArea = context.scrollArea;\n let hideTimer = 0;\n if (scrollArea) {\n const handlePointerEnter = () => {\n window.clearTimeout(hideTimer);\n setVisible(true);\n };\n const handlePointerLeave = () => {\n hideTimer = window.setTimeout(() => setVisible(false), context.scrollHideDelay);\n };\n scrollArea.addEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.addEventListener(\"pointerleave\", handlePointerLeave);\n return () => {\n window.clearTimeout(hideTimer);\n scrollArea.removeEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.removeEventListener(\"pointerleave\", handlePointerLeave);\n };\n }\n }, [context.scrollArea, context.scrollHideDelay]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarAuto,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n});\nvar ScrollAreaScrollbarScroll = React2.forwardRef((props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const isHorizontal = props.orientation === \"horizontal\";\n const debounceScrollEnd = useDebounceCallback(() => send(\"SCROLL_END\"), 100);\n const [state, send] = useStateMachine(\"hidden\", {\n hidden: {\n SCROLL: \"scrolling\"\n },\n scrolling: {\n SCROLL_END: \"idle\",\n POINTER_ENTER: \"interacting\"\n },\n interacting: {\n SCROLL: \"interacting\",\n POINTER_LEAVE: \"idle\"\n },\n idle: {\n HIDE: \"hidden\",\n SCROLL: \"scrolling\",\n POINTER_ENTER: \"interacting\"\n }\n });\n React2.useEffect(() => {\n if (state === \"idle\") {\n const hideTimer = window.setTimeout(() => send(\"HIDE\"), context.scrollHideDelay);\n return () => window.clearTimeout(hideTimer);\n }\n }, [state, context.scrollHideDelay, send]);\n React2.useEffect(() => {\n const viewport = context.viewport;\n const scrollDirection = isHorizontal ? \"scrollLeft\" : \"scrollTop\";\n if (viewport) {\n let prevScrollPos = viewport[scrollDirection];\n const handleScroll = () => {\n const scrollPos = viewport[scrollDirection];\n const hasScrollInDirectionChanged = prevScrollPos !== scrollPos;\n if (hasScrollInDirectionChanged) {\n send(\"SCROLL\");\n debounceScrollEnd();\n }\n prevScrollPos = scrollPos;\n };\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [context.viewport, isHorizontal, send, debounceScrollEnd]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || state !== \"hidden\", children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": state === \"hidden\" ? \"hidden\" : \"visible\",\n ...scrollbarProps,\n ref: forwardedRef,\n onPointerEnter: composeEventHandlers(props.onPointerEnter, () => send(\"POINTER_ENTER\")),\n onPointerLeave: composeEventHandlers(props.onPointerLeave, () => send(\"POINTER_LEAVE\"))\n }\n ) });\n});\nvar ScrollAreaScrollbarAuto = React2.forwardRef((props, forwardedRef) => {\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { forceMount, ...scrollbarProps } = props;\n const [visible, setVisible] = React2.useState(false);\n const isHorizontal = props.orientation === \"horizontal\";\n const handleResize = useDebounceCallback(() => {\n if (context.viewport) {\n const isOverflowX = context.viewport.offsetWidth < context.viewport.scrollWidth;\n const isOverflowY = context.viewport.offsetHeight < context.viewport.scrollHeight;\n setVisible(isHorizontal ? isOverflowX : isOverflowY);\n }\n }, 10);\n useResizeObserver(context.viewport, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n});\nvar ScrollAreaScrollbarVisible = React2.forwardRef((props, forwardedRef) => {\n const { orientation = \"vertical\", ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const thumbRef = React2.useRef(null);\n const pointerOffsetRef = React2.useRef(0);\n const [sizes, setSizes] = React2.useState({\n content: 0,\n viewport: 0,\n scrollbar: { size: 0, paddingStart: 0, paddingEnd: 0 }\n });\n const thumbRatio = getThumbRatio(sizes.viewport, sizes.content);\n const commonProps = {\n ...scrollbarProps,\n sizes,\n onSizesChange: setSizes,\n hasThumb: Boolean(thumbRatio > 0 && thumbRatio < 1),\n onThumbChange: (thumb) => thumbRef.current = thumb,\n onThumbPointerUp: () => pointerOffsetRef.current = 0,\n onThumbPointerDown: (pointerPos) => pointerOffsetRef.current = pointerPos\n };\n function getScrollPosition(pointerPos, dir) {\n return getScrollPositionFromPointer(pointerPos, pointerOffsetRef.current, sizes, dir);\n }\n if (orientation === \"horizontal\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarX,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollLeft;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes, context.dir);\n thumbRef.current.style.transform = `translate3d(${offset}px, 0, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollLeft = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) {\n context.viewport.scrollLeft = getScrollPosition(pointerPos, context.dir);\n }\n }\n }\n );\n }\n if (orientation === \"vertical\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarY,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollTop;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes);\n thumbRef.current.style.transform = `translate3d(0, ${offset}px, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollTop = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) context.viewport.scrollTop = getScrollPosition(pointerPos);\n }\n }\n );\n }\n return null;\n});\nvar ScrollAreaScrollbarX = React2.forwardRef((props, forwardedRef) => {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarXChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"horizontal\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n bottom: 0,\n left: context.dir === \"rtl\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n right: context.dir === \"ltr\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n [\"--radix-scroll-area-thumb-width\"]: getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.x),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.x),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollLeft + event.deltaX;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollWidth,\n viewport: context.viewport.offsetWidth,\n scrollbar: {\n size: ref.current.clientWidth,\n paddingStart: toInt(computedStyle.paddingLeft),\n paddingEnd: toInt(computedStyle.paddingRight)\n }\n });\n }\n }\n }\n );\n});\nvar ScrollAreaScrollbarY = React2.forwardRef((props, forwardedRef) => {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarYChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"vertical\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n top: 0,\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: \"var(--radix-scroll-area-corner-height)\",\n [\"--radix-scroll-area-thumb-height\"]: getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.y),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.y),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollTop + event.deltaY;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollHeight,\n viewport: context.viewport.offsetHeight,\n scrollbar: {\n size: ref.current.clientHeight,\n paddingStart: toInt(computedStyle.paddingTop),\n paddingEnd: toInt(computedStyle.paddingBottom)\n }\n });\n }\n }\n }\n );\n});\nvar [ScrollbarProvider, useScrollbarContext] = createScrollAreaContext(SCROLLBAR_NAME);\nvar ScrollAreaScrollbarImpl = React2.forwardRef((props, forwardedRef) => {\n const {\n __scopeScrollArea,\n sizes,\n hasThumb,\n onThumbChange,\n onThumbPointerUp,\n onThumbPointerDown,\n onThumbPositionChange,\n onDragScroll,\n onWheelScroll,\n onResize,\n ...scrollbarProps\n } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, __scopeScrollArea);\n const [scrollbar, setScrollbar] = React2.useState(null);\n const composeRefs = useComposedRefs(forwardedRef, (node) => setScrollbar(node));\n const rectRef = React2.useRef(null);\n const prevWebkitUserSelectRef = React2.useRef(\"\");\n const viewport = context.viewport;\n const maxScrollPos = sizes.content - sizes.viewport;\n const handleWheelScroll = useCallbackRef(onWheelScroll);\n const handleThumbPositionChange = useCallbackRef(onThumbPositionChange);\n const handleResize = useDebounceCallback(onResize, 10);\n function handleDragScroll(event) {\n if (rectRef.current) {\n const x = event.clientX - rectRef.current.left;\n const y = event.clientY - rectRef.current.top;\n onDragScroll({ x, y });\n }\n }\n React2.useEffect(() => {\n const handleWheel = (event) => {\n const element = event.target;\n const isScrollbarWheel = scrollbar?.contains(element);\n if (isScrollbarWheel) handleWheelScroll(event, maxScrollPos);\n };\n document.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => document.removeEventListener(\"wheel\", handleWheel, { passive: false });\n }, [viewport, scrollbar, maxScrollPos, handleWheelScroll]);\n React2.useEffect(handleThumbPositionChange, [sizes, handleThumbPositionChange]);\n useResizeObserver(scrollbar, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(\n ScrollbarProvider,\n {\n scope: __scopeScrollArea,\n scrollbar,\n hasThumb,\n onThumbChange: useCallbackRef(onThumbChange),\n onThumbPointerUp: useCallbackRef(onThumbPointerUp),\n onThumbPositionChange: handleThumbPositionChange,\n onThumbPointerDown: useCallbackRef(onThumbPointerDown),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...scrollbarProps,\n ref: composeRefs,\n style: { position: \"absolute\", ...scrollbarProps.style },\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n const mainPointer = 0;\n if (event.button === mainPointer) {\n const element = event.target;\n element.setPointerCapture(event.pointerId);\n rectRef.current = scrollbar.getBoundingClientRect();\n prevWebkitUserSelectRef.current = document.body.style.webkitUserSelect;\n document.body.style.webkitUserSelect = \"none\";\n if (context.viewport) context.viewport.style.scrollBehavior = \"auto\";\n handleDragScroll(event);\n }\n }),\n onPointerMove: composeEventHandlers(props.onPointerMove, handleDragScroll),\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n const element = event.target;\n if (element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n document.body.style.webkitUserSelect = prevWebkitUserSelectRef.current;\n if (context.viewport) context.viewport.style.scrollBehavior = \"\";\n rectRef.current = null;\n })\n }\n )\n }\n );\n});\nvar THUMB_NAME = \"ScrollAreaThumb\";\nvar ScrollAreaThumb = React2.forwardRef(\n (props, forwardedRef) => {\n const { forceMount, ...thumbProps } = props;\n const scrollbarContext = useScrollbarContext(THUMB_NAME, props.__scopeScrollArea);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || scrollbarContext.hasThumb, children: /* @__PURE__ */ jsx(ScrollAreaThumbImpl, { ref: forwardedRef, ...thumbProps }) });\n }\n);\nvar ScrollAreaThumbImpl = React2.forwardRef(\n (props, forwardedRef) => {\n const { __scopeScrollArea, style, ...thumbProps } = props;\n const scrollAreaContext = useScrollAreaContext(THUMB_NAME, __scopeScrollArea);\n const scrollbarContext = useScrollbarContext(THUMB_NAME, __scopeScrollArea);\n const { onThumbPositionChange } = scrollbarContext;\n const composedRef = useComposedRefs(\n forwardedRef,\n (node) => scrollbarContext.onThumbChange(node)\n );\n const removeUnlinkedScrollListenerRef = React2.useRef(void 0);\n const debounceScrollEnd = useDebounceCallback(() => {\n if (removeUnlinkedScrollListenerRef.current) {\n removeUnlinkedScrollListenerRef.current();\n removeUnlinkedScrollListenerRef.current = void 0;\n }\n }, 100);\n React2.useEffect(() => {\n const viewport = scrollAreaContext.viewport;\n if (viewport) {\n const handleScroll = () => {\n debounceScrollEnd();\n if (!removeUnlinkedScrollListenerRef.current) {\n const listener = addUnlinkedScrollListener(viewport, onThumbPositionChange);\n removeUnlinkedScrollListenerRef.current = listener;\n onThumbPositionChange();\n }\n };\n onThumbPositionChange();\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [scrollAreaContext.viewport, debounceScrollEnd, onThumbPositionChange]);\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": scrollbarContext.hasThumb ? \"visible\" : \"hidden\",\n ...thumbProps,\n ref: composedRef,\n style: {\n width: \"var(--radix-scroll-area-thumb-width)\",\n height: \"var(--radix-scroll-area-thumb-height)\",\n ...style\n },\n onPointerDownCapture: composeEventHandlers(props.onPointerDownCapture, (event) => {\n const thumb = event.target;\n const thumbRect = thumb.getBoundingClientRect();\n const x = event.clientX - thumbRect.left;\n const y = event.clientY - thumbRect.top;\n scrollbarContext.onThumbPointerDown({ x, y });\n }),\n onPointerUp: composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp)\n }\n );\n }\n);\nScrollAreaThumb.displayName = THUMB_NAME;\nvar CORNER_NAME = \"ScrollAreaCorner\";\nvar ScrollAreaCorner = React2.forwardRef(\n (props, forwardedRef) => {\n const context = useScrollAreaContext(CORNER_NAME, props.__scopeScrollArea);\n const hasBothScrollbarsVisible = Boolean(context.scrollbarX && context.scrollbarY);\n const hasCorner = context.type !== \"scroll\" && hasBothScrollbarsVisible;\n return hasCorner ? /* @__PURE__ */ jsx(ScrollAreaCornerImpl, { ...props, ref: forwardedRef }) : null;\n }\n);\nScrollAreaCorner.displayName = CORNER_NAME;\nvar ScrollAreaCornerImpl = React2.forwardRef((props, forwardedRef) => {\n const { __scopeScrollArea, ...cornerProps } = props;\n const context = useScrollAreaContext(CORNER_NAME, __scopeScrollArea);\n const [width, setWidth] = React2.useState(0);\n const [height, setHeight] = React2.useState(0);\n const hasSize = Boolean(width && height);\n useResizeObserver(context.scrollbarX, () => {\n const height2 = context.scrollbarX?.offsetHeight || 0;\n context.onCornerHeightChange(height2);\n setHeight(height2);\n });\n useResizeObserver(context.scrollbarY, () => {\n const width2 = context.scrollbarY?.offsetWidth || 0;\n context.onCornerWidthChange(width2);\n setWidth(width2);\n });\n return hasSize ? /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...cornerProps,\n ref: forwardedRef,\n style: {\n width,\n height,\n position: \"absolute\",\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: 0,\n ...props.style\n }\n }\n ) : null;\n});\nfunction toInt(value) {\n return value ? parseInt(value, 10) : 0;\n}\nfunction getThumbRatio(viewportSize, contentSize) {\n const ratio = viewportSize / contentSize;\n return isNaN(ratio) ? 0 : ratio;\n}\nfunction getThumbSize(sizes) {\n const ratio = getThumbRatio(sizes.viewport, sizes.content);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const thumbSize = (sizes.scrollbar.size - scrollbarPadding) * ratio;\n return Math.max(thumbSize, 18);\n}\nfunction getScrollPositionFromPointer(pointerPos, pointerOffset, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const thumbCenter = thumbSizePx / 2;\n const offset = pointerOffset || thumbCenter;\n const thumbOffsetFromEnd = thumbSizePx - offset;\n const minPointerPos = sizes.scrollbar.paddingStart + offset;\n const maxPointerPos = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - thumbOffsetFromEnd;\n const maxScrollPos = sizes.content - sizes.viewport;\n const scrollRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const interpolate = linearScale([minPointerPos, maxPointerPos], scrollRange);\n return interpolate(pointerPos);\n}\nfunction getThumbOffsetFromScroll(scrollPos, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const scrollbar = sizes.scrollbar.size - scrollbarPadding;\n const maxScrollPos = sizes.content - sizes.viewport;\n const maxThumbPos = scrollbar - thumbSizePx;\n const scrollClampRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const scrollWithoutMomentum = clamp(scrollPos, scrollClampRange);\n const interpolate = linearScale([0, maxScrollPos], [0, maxThumbPos]);\n return interpolate(scrollWithoutMomentum);\n}\nfunction linearScale(input, output) {\n return (value) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\nfunction isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos) {\n return scrollPos > 0 && scrollPos < maxScrollPos;\n}\nvar addUnlinkedScrollListener = (node, handler = () => {\n}) => {\n let prevPosition = { left: node.scrollLeft, top: node.scrollTop };\n let rAF = 0;\n (function loop() {\n const position = { left: node.scrollLeft, top: node.scrollTop };\n const isHorizontalScroll = prevPosition.left !== position.left;\n const isVerticalScroll = prevPosition.top !== position.top;\n if (isHorizontalScroll || isVerticalScroll) handler();\n prevPosition = position;\n rAF = window.requestAnimationFrame(loop);\n })();\n return () => window.cancelAnimationFrame(rAF);\n};\nfunction useDebounceCallback(callback, delay) {\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = React2.useRef(0);\n React2.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), []);\n return React2.useCallback(() => {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = window.setTimeout(handleCallback, delay);\n }, [handleCallback, delay]);\n}\nfunction useResizeObserver(element, onResize) {\n const handleResize = useCallbackRef(onResize);\n useLayoutEffect(() => {\n let rAF = 0;\n if (element) {\n const resizeObserver = new ResizeObserver(() => {\n cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(handleResize);\n });\n resizeObserver.observe(element);\n return () => {\n window.cancelAnimationFrame(rAF);\n resizeObserver.unobserve(element);\n };\n }\n }, [element, handleResize]);\n}\nvar Root = ScrollArea;\nvar Viewport = ScrollAreaViewport;\nvar Scrollbar = ScrollAreaScrollbar;\nvar Thumb = ScrollAreaThumb;\nvar Corner = ScrollAreaCorner;\nexport {\n Corner,\n Root,\n ScrollArea,\n ScrollAreaCorner,\n ScrollAreaScrollbar,\n ScrollAreaThumb,\n ScrollAreaViewport,\n Scrollbar,\n Thumb,\n Viewport,\n createScrollAreaScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as React from 'react';\nimport { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn('relative', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1 [&>div]:block!\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none p-px transition-colors select-none',\n orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent',\n orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent',\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","'use client';\n\nimport Link from 'next/link';\nimport type { Route } from 'next';\nimport type { LucideIcon } from 'lucide-react';\nimport { SidebarMenuItem, SidebarMenuButton } from '@/components/ui/sidebar';\nimport { useSoundAction } from '@/hooks/use-sound-action';\n\nexport interface SidebarNavItemProps {\n icon: LucideIcon;\n label: string;\n href: string;\n active?: boolean;\n}\n\nexport function SidebarNavItem({ icon: Icon, label, href, active = false }: SidebarNavItemProps) {\n const navigateSound = useSoundAction('navigate');\n\n return (\n <SidebarMenuItem data-testid=\"sidebar-nav-item\">\n <SidebarMenuButton asChild isActive={active} tooltip={label}>\n <Link href={href as Route} onClick={() => navigateSound.play()}>\n <Icon />\n <span>{label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n}\n","'use client';\n\nimport { PanelLeft } from 'lucide-react';\nimport { useSidebar } from '@/components/ui/sidebar';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\nimport { useSoundAction } from '@/hooks/use-sound-action';\n\nexport interface SidebarCollapseToggleProps {\n className?: string;\n}\n\nexport function SidebarCollapseToggle({ className }: SidebarCollapseToggleProps) {\n const { toggleSidebar, open } = useSidebar();\n const expandSound = useSoundAction('expand');\n const collapseSound = useSoundAction('collapse');\n const label = open ? 'Collapse sidebar' : 'Expand sidebar';\n\n const handleClick = () => {\n // Play sound based on current state (before toggle)\n if (open) {\n collapseSound.play();\n } else {\n expandSound.play();\n }\n toggleSidebar();\n };\n\n return (\n <div className={cn('flex', className)}>\n <Button\n data-testid=\"sidebar-collapse-toggle\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 cursor-pointer group-data-[collapsible=icon]:size-8!\"\n onClick={handleClick}\n aria-label={label}\n >\n <PanelLeft className=\"size-4\" />\n </Button>\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { compareVersions } from '@/lib/compare-versions';\n\nexport interface NpmVersionCheckResult {\n /** Latest version on npm, or null if not yet fetched / error */\n latest: string | null;\n /** Whether a newer version is available on npm */\n updateAvailable: boolean;\n /** True while the fetch is in progress */\n loading: boolean;\n}\n\nexport function useNpmVersionCheck(currentVersion: string): NpmVersionCheckResult {\n const [latest, setLatest] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n\n async function check() {\n try {\n const res = await fetch('/api/npm-version');\n if (!res.ok) return;\n const data = (await res.json()) as { latest?: string | null };\n if (!cancelled && data.latest) {\n setLatest(data.latest);\n }\n } catch {\n // Silently fail — version check is non-critical\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n check();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const updateAvailable = latest !== null && compareVersions(latest, currentVersion) > 0;\n\n return { latest, updateAvailable, loading };\n}\n","'use client';\n\nimport { useCallback, useRef, useState } from 'react';\n\nexport type UpgradeStatus =\n | 'idle'\n | 'upgrading'\n | 'restarting'\n | 'upgraded'\n | 'up-to-date'\n | 'error';\n\n/** How often to poll the server during restart (ms). */\nconst RESTART_POLL_MS = 500;\n/** Maximum time to wait for the server to come back after restart (ms). */\nconst RESTART_TIMEOUT_MS = 30_000;\n\nexport interface CliUpgradeState {\n status: UpgradeStatus;\n output: string;\n errorMessage?: string;\n}\n\nexport interface CliUpgradeActions {\n startUpgrade: () => void;\n}\n\n/**\n * Poll the server until it responds, then reload the page.\n */\nfunction waitForServerAndReload(timeoutMs: number, pollMs: number): void {\n const deadline = Date.now() + timeoutMs;\n\n const poll = () => {\n if (Date.now() > deadline) return;\n\n fetch('/api/version', { method: 'GET', cache: 'no-store' })\n .then((res) => {\n if (res.ok) {\n window.location.reload();\n } else {\n setTimeout(poll, pollMs);\n }\n })\n .catch(() => {\n setTimeout(poll, pollMs);\n });\n };\n\n // Brief initial delay to let the old server shut down\n setTimeout(poll, pollMs);\n}\n\nexport function useCliUpgrade(): CliUpgradeState & CliUpgradeActions {\n const [status, setStatus] = useState<UpgradeStatus>('idle');\n const [output, setOutput] = useState('');\n const [errorMessage, setErrorMessage] = useState<string | undefined>();\n const abortRef = useRef<AbortController | null>(null);\n const restartingRef = useRef(false);\n\n const startUpgrade = useCallback(() => {\n if (status === 'upgrading' || status === 'restarting') return;\n\n setStatus('upgrading');\n setOutput('');\n setErrorMessage(undefined);\n restartingRef.current = false;\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n fetch('/api/cli-upgrade', { method: 'POST', signal: controller.signal })\n .then(async (response) => {\n if (!response.ok || !response.body) {\n setStatus('error');\n setErrorMessage(`Server returned ${response.status}`);\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('event: restarting')) {\n restartingRef.current = true;\n setStatus('restarting');\n waitForServerAndReload(RESTART_TIMEOUT_MS, RESTART_POLL_MS);\n continue;\n }\n if (line.startsWith('event: done')) {\n // Next data line contains the final result\n continue;\n }\n if (line.startsWith('data: ')) {\n const payload = line.slice(6);\n // Try to parse as final JSON result\n try {\n const result = JSON.parse(payload) as {\n status: string;\n errorMessage?: string;\n };\n if (result.status === 'upgraded') {\n setStatus('upgraded');\n } else if (result.status === 'up-to-date') {\n setStatus('up-to-date');\n } else if (result.status === 'error') {\n setStatus('error');\n setErrorMessage(result.errorMessage);\n }\n } catch {\n // Regular output line\n setOutput((prev) => prev + payload);\n }\n }\n }\n }\n })\n .catch((err: unknown) => {\n // If we're in restarting state, the connection dropping is expected\n if (restartingRef.current) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setStatus('error');\n setErrorMessage(err instanceof Error ? err.message : 'Upgrade failed');\n });\n\n return () => {\n controller.abort();\n };\n }, [status]);\n\n return { status, output, errorMessage, startUpgrade };\n}\n","'use client';\n\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useNpmVersionCheck } from '@/hooks/use-npm-version-check';\nimport { useCliUpgrade } from '@/hooks/use-cli-upgrade';\n\nexport interface VersionBadgeProps {\n version: string;\n branch?: string;\n commitHash?: string;\n isDev?: boolean;\n packageName?: string;\n description?: string;\n instancePath?: string;\n}\n\nexport function VersionBadge({\n version,\n branch,\n commitHash,\n isDev = false,\n packageName = '@shepai/cli',\n description,\n instancePath,\n}: VersionBadgeProps) {\n const shortHash = commitHash?.slice(0, 7);\n const { latest, updateAvailable } = useNpmVersionCheck(version);\n const { status: upgradeStatus, startUpgrade } = useCliUpgrade();\n\n // In dev mode show \"1.92.2-dev\", in production show \"v1.92.2\"\n const displayVersion = isDev ? `${version}-dev` : `v${version}`;\n\n const isUpgrading = upgradeStatus === 'upgrading';\n const isRestarting = upgradeStatus === 'restarting';\n const didUpgrade = upgradeStatus === 'upgraded';\n const upgradeError = upgradeStatus === 'error';\n\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"text-muted-foreground/80 hover:text-muted-foreground relative cursor-default text-[11px] leading-tight transition-colors\"\n data-testid=\"version-label\"\n >\n {displayVersion}\n {updateAvailable && !didUpgrade && !isRestarting ? (\n <span\n className=\"absolute -top-0.5 -right-1.5 size-1.5 rounded-full bg-emerald-400\"\n data-testid=\"update-dot\"\n />\n ) : null}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-[280px] space-y-1 p-3 text-left\">\n <div className=\"mb-1.5 text-xs font-semibold\">{packageName}</div>\n {description ? (\n <div className=\"text-[10px] leading-snug opacity-70\">{description}</div>\n ) : null}\n <div className=\"border-t border-white/10 pt-1.5\">\n <Row label=\"Version\" value={displayVersion} />\n {isDev && branch ? <Row label=\"Branch\" value={branch} /> : null}\n {isDev && shortHash ? <Row label=\"Commit\" value={shortHash} mono /> : null}\n {isDev && instancePath ? <Row label=\"Path\" value={instancePath} mono /> : null}\n {latest ? (\n <Row label=\"Latest\" value={`v${latest}`} highlight={updateAvailable} />\n ) : null}\n </div>\n {isRestarting ? (\n <div className=\"border-t border-white/10 pt-1.5\">\n <span\n className=\"text-[10px] font-medium text-emerald-400\"\n data-testid=\"upgrade-restarting\"\n >\n Restarting...\n </span>\n </div>\n ) : didUpgrade ? (\n <div className=\"border-t border-white/10 pt-1.5\">\n <span\n className=\"text-[10px] font-medium text-emerald-400\"\n data-testid=\"upgrade-success\"\n >\n Upgraded successfully\n </span>\n </div>\n ) : upgradeError ? (\n <div className=\"border-t border-white/10 pt-1.5\">\n <span className=\"text-[10px] font-medium text-red-400\" data-testid=\"upgrade-error\">\n Upgrade failed\n </span>\n </div>\n ) : updateAvailable ? (\n <div className=\"border-t border-white/10 pt-1.5\">\n <button\n type=\"button\"\n onClick={startUpgrade}\n disabled={isUpgrading || isRestarting}\n className=\"inline-flex items-center gap-1 text-[10px] font-medium text-emerald-400 transition-colors hover:text-emerald-300 disabled:opacity-50\"\n data-testid=\"upgrade-button\"\n >\n {isUpgrading\n ? 'Upgrading...'\n : isRestarting\n ? 'Restarting...'\n : `Upgrade to v${latest}`}\n </button>\n </div>\n ) : null}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nfunction Row({\n label,\n value,\n highlight,\n mono,\n}: {\n label: string;\n value: string;\n highlight?: boolean;\n mono?: boolean;\n}) {\n return (\n <div className=\"flex items-center justify-between gap-4 text-[10px]\">\n <span className=\"opacity-60\">{label}</span>\n <span\n className={[\n highlight ? 'font-medium text-emerald-400' : '',\n mono || !highlight ? 'font-mono' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {value}\n </span>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useEffect, startTransition } from 'react';\n\ninterface ElapsedTimeProps {\n startedAt: number;\n}\n\nexport function formatElapsed(elapsedMs: number): string {\n const totalSeconds = Math.floor(elapsedMs / 1000);\n\n if (totalSeconds >= 3600) {\n const hours = Math.floor(totalSeconds / 3600);\n return `${hours}h`;\n }\n\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n}\n\nexport function ElapsedTime({ startedAt }: ElapsedTimeProps) {\n const [elapsed, setElapsed] = useState(() => Date.now() - startedAt);\n\n useEffect(() => {\n const id = setInterval(() => {\n startTransition(() => setElapsed(Date.now() - startedAt));\n }, 1000);\n\n return () => clearInterval(id);\n }, [startedAt]);\n\n return (\n <span data-testid=\"elapsed-time\" className=\"tabular-nums\">\n {formatElapsed(elapsed)}\n </span>\n );\n}\n","import { CircleAlert, Loader2, CircleCheck, Ban, CircleX, Clock } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport type FeatureStatus =\n | 'action-needed'\n | 'in-progress'\n | 'pending'\n | 'blocked'\n | 'error'\n | 'done';\n\nexport interface FeatureStatusConfig {\n icon: LucideIcon;\n iconClass: string;\n bgClass: string;\n label: string;\n}\n\nexport const featureStatusConfig: Record<FeatureStatus, FeatureStatusConfig> = {\n 'action-needed': {\n icon: CircleAlert,\n iconClass: 'text-amber-500',\n bgClass: 'bg-amber-500/10',\n label: 'Action Needed',\n },\n 'in-progress': {\n icon: Loader2,\n iconClass: 'text-blue-500 animate-spin',\n bgClass: 'bg-blue-500/10',\n label: 'In Progress',\n },\n pending: {\n icon: Clock,\n iconClass: 'text-slate-400',\n bgClass: 'bg-slate-400/10',\n label: 'Pending',\n },\n blocked: {\n icon: Ban,\n iconClass: 'text-gray-400',\n bgClass: 'bg-gray-400/10',\n label: 'Blocked',\n },\n error: {\n icon: CircleX,\n iconClass: 'text-red-500',\n bgClass: 'bg-red-500/10',\n label: 'Error',\n },\n done: {\n icon: CircleCheck,\n iconClass: 'text-emerald-500',\n bgClass: 'bg-emerald-500/10',\n label: 'Done',\n },\n};\n\nexport const featureStatusOrder: FeatureStatus[] = [\n 'action-needed',\n 'error',\n 'blocked',\n 'in-progress',\n 'pending',\n 'done',\n];\n","'use client';\n\nimport { SidebarMenuItem, SidebarMenuButton } from '@/components/ui/sidebar';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { ElapsedTime } from '@/components/common/elapsed-time';\nimport { featureStatusConfig } from '@/components/common/feature-status-config';\nimport type { FeatureStatus } from '@/components/common/feature-status-config';\nimport {\n getAgentTypeIcon,\n agentTypeLabels,\n type AgentTypeValue,\n} from '@/components/common/feature-node/agent-type-icons';\nimport { getModelMeta } from '@/lib/model-metadata';\n\nexport interface FeatureListItemProps {\n name: string;\n status: FeatureStatus;\n startedAt?: number;\n duration?: string;\n agentType?: string;\n modelId?: string;\n onClick?: () => void;\n}\n\nexport function FeatureListItem({\n name,\n status,\n startedAt,\n duration,\n agentType,\n modelId,\n onClick,\n}: FeatureListItemProps) {\n const { icon: StatusIcon, iconClass } = featureStatusConfig[status];\n const AgentIcon = agentType ? getAgentTypeIcon(agentType) : null;\n\n return (\n <SidebarMenuItem data-testid=\"feature-list-item\">\n <SidebarMenuButton size=\"sm\" onClick={onClick} tooltip={name} className=\"cursor-pointer\">\n <StatusIcon className={iconClass} />\n <span className=\"flex-1 truncate font-medium\">{name}</span>\n {status === 'in-progress' && startedAt != null ? (\n <span\n data-testid=\"feature-list-item-meta\"\n className=\"text-muted-foreground ml-auto text-xs tabular-nums\"\n >\n <ElapsedTime startedAt={startedAt} />\n </span>\n ) : null}\n {status === 'done' && duration ? (\n <span\n data-testid=\"feature-list-item-meta\"\n className=\"text-muted-foreground ml-auto text-xs tabular-nums\"\n >\n {duration}\n </span>\n ) : null}\n {AgentIcon ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"ml-auto shrink-0\">\n <AgentIcon className=\"h-3.5 w-3.5\" />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n <span className=\"font-medium\">\n {agentTypeLabels[agentType as AgentTypeValue] ?? agentType}\n </span>\n {modelId ? (\n <span className=\"ml-1 opacity-70\">\n · {getModelMeta(modelId).displayName || modelId}\n </span>\n ) : null}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : null}\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { type Theme, THEME_STORAGE_KEY } from '@/types/theme';\n\n/**\n * Hook to manage theme state with localStorage persistence\n * and system preference detection.\n */\nexport function useTheme() {\n const [theme, setTheme] = useState<Theme>('system');\n const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>('light');\n\n // Get the system preference\n const getSystemTheme = useCallback((): 'light' | 'dark' => {\n if (typeof window === 'undefined') {\n return 'light';\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }, []);\n\n // Resolve the actual theme based on current setting\n const resolveTheme = useCallback(\n (currentTheme: Theme): 'light' | 'dark' => {\n if (currentTheme === 'system') {\n return getSystemTheme();\n }\n return currentTheme;\n },\n [getSystemTheme]\n );\n\n // Apply theme to document\n const applyTheme = useCallback((resolved: 'light' | 'dark') => {\n if (typeof document === 'undefined') {\n return;\n }\n const root = document.documentElement;\n root.classList.remove('light', 'dark');\n root.classList.add(resolved);\n setResolvedTheme(resolved);\n }, []);\n\n // Set theme and persist to localStorage\n const setThemeAndPersist = useCallback(\n (newTheme: Theme) => {\n setTheme(newTheme);\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(THEME_STORAGE_KEY, newTheme);\n }\n const resolved = resolveTheme(newTheme);\n applyTheme(resolved);\n },\n [resolveTheme, applyTheme]\n );\n\n // Initialize theme from localStorage or system preference\n useEffect(() => {\n const stored = localStorage.getItem(THEME_STORAGE_KEY) as Theme | null;\n const initialTheme = stored ?? 'system';\n setTheme(initialTheme);\n const resolved = resolveTheme(initialTheme);\n applyTheme(resolved);\n }, [resolveTheme, applyTheme]);\n\n // Listen for system preference changes\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const handleChange = () => {\n if (theme === 'system') {\n const resolved = resolveTheme('system');\n applyTheme(resolved);\n }\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [theme, resolveTheme, applyTheme]);\n\n return {\n theme,\n resolvedTheme,\n setTheme: setThemeAndPersist,\n };\n}\n","'use client';\n\nimport { SidebarGroup } from '@/components/ui/sidebar';\nimport { cn } from '@/lib/utils';\n\nexport interface SidebarSectionHeaderProps {\n label: string;\n className?: string;\n}\n\nexport function SidebarSectionHeader({ label, className }: SidebarSectionHeaderProps) {\n return (\n <SidebarGroup data-testid=\"sidebar-section-header\" className={cn('px-2 py-1', className)}>\n <div className=\"text-sidebar-foreground flex h-7 w-full shrink-0 items-center px-2 text-sm font-medium\">\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </div>\n </SidebarGroup>\n );\n}\n","'use client';\n\nimport { useState, useEffect } from 'react';\n\n/**\n * Defers mount/unmount of content to allow opacity transitions.\n * When expanding: mounts immediately, then sets visible on next frame.\n * When collapsing: hides immediately, then unmounts after `ms` delay.\n */\nexport function useDeferredMount(isCollapsed: boolean, ms: number) {\n const [mounted, setMounted] = useState(!isCollapsed);\n const [visible, setVisible] = useState(!isCollapsed);\n\n useEffect(() => {\n if (!isCollapsed) {\n setMounted(true);\n // delay visibility by one frame so the element mounts at opacity-0 first\n const raf = requestAnimationFrame(() => setVisible(true));\n return () => cancelAnimationFrame(raf);\n }\n setVisible(false);\n const t = window.setTimeout(() => setMounted(false), ms);\n return () => window.clearTimeout(t);\n }, [isCollapsed, ms]);\n\n return { mounted, visible };\n}\n","'use client';\n\nimport * as React from 'react';\nimport { XIcon } from 'lucide-react';\nimport { Dialog as SheetPrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left';\n showCloseButton?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500',\n side === 'right' &&\n 'data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm',\n side === 'left' &&\n 'data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm',\n side === 'top' &&\n 'data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b',\n side === 'bottom' &&\n 'data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t',\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton ? (\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n ) : null}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn('flex flex-col gap-1.5 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn('mt-auto flex flex-col gap-2 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn('text-foreground font-semibold', className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","'use client';\n\nimport { usePathname } from 'next/navigation';\nimport Link from 'next/link';\nimport type { Route } from 'next';\nimport { Home, Moon, Sun, Volume2, VolumeOff, Wrench, Puzzle, Settings } from 'lucide-react';\nimport {\n Sidebar,\n SidebarHeader,\n SidebarContent,\n SidebarFooter,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n SidebarRail,\n useSidebar,\n} from '@/components/ui/sidebar';\n\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { SidebarNavItem } from '@/components/common/sidebar-nav-item';\nimport { SidebarCollapseToggle } from '@/components/common/sidebar-collapse-toggle';\nimport { ShepLogo } from '@/components/common/shep-logo';\nimport { VersionBadge } from '@/components/common/version-badge';\nimport { FeatureListItem } from '@/components/common/feature-list-item';\nimport { useSoundEnabled } from '@/hooks/use-sound-enabled';\nimport { useTheme } from '@/hooks/useTheme';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { FeatureStatusGroup } from '@/components/common/feature-status-group';\nimport { SidebarSectionHeader } from '@/components/common/sidebar-section-header';\nimport { featureStatusConfig, featureStatusOrder } from '@/components/common/feature-status-config';\nimport type { FeatureStatus } from '@/components/common/feature-status-config';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useDeferredMount } from '@/hooks/use-deferred-mount';\nimport { useVersion } from '@/hooks/use-version';\nimport type { FeatureFlagsState } from '@/lib/feature-flags';\n\nexport interface FeatureItem {\n featureId: string;\n name: string;\n status: FeatureStatus;\n startedAt?: number;\n duration?: string;\n agentType?: string;\n modelId?: string;\n}\n\nexport interface AppSidebarProps {\n features: FeatureItem[];\n featureFlags: FeatureFlagsState;\n\n onFeatureClick?: (featureId: string) => void;\n}\n\nexport function AppSidebar({\n features,\n featureFlags,\n\n onFeatureClick,\n}: AppSidebarProps) {\n const pathname = usePathname();\n const { state } = useSidebar();\n const collapsed = state === 'collapsed';\n const { mounted: showExpanded, visible: expandedVisible } = useDeferredMount(collapsed, 200);\n const versionData = useVersion();\n const { enabled: soundEnabled, toggle: toggleSound } = useSoundEnabled();\n const { resolvedTheme, theme, setTheme } = useTheme();\n const toggleOnSound = useSoundAction('toggle-on');\n const toggleOffSound = useSoundAction('toggle-off');\n const clickSound = useSoundAction('navigate');\n\n const grouped = featureStatusOrder.map((key) => {\n const { label } = featureStatusConfig[key];\n const items = features.filter((f) => f.status === key);\n return { key, label, items };\n });\n\n return (\n <Sidebar data-testid=\"app-sidebar\" data-no-drawer-close collapsible=\"icon\">\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <div className=\"flex h-8 items-center group-data-[collapsible=icon]:justify-center\">\n {showExpanded ? (\n <div\n className={[\n 'flex min-w-0 flex-1 items-center gap-2 overflow-hidden px-2',\n 'transition-opacity duration-200 ease-out',\n expandedVisible ? 'opacity-100' : 'opacity-0',\n ].join(' ')}\n aria-hidden={!expandedVisible}\n >\n <ShepLogo\n className=\"shrink-0\"\n size={20}\n variant={versionData.isDev ? 'dev' : 'default'}\n />\n <span className=\"truncate text-sm font-semibold tracking-tight\">Shep</span>\n <VersionBadge\n version={versionData.version}\n branch={versionData.branch || undefined}\n commitHash={versionData.commitHash || undefined}\n isDev={versionData.isDev}\n packageName={versionData.packageName}\n description={versionData.description}\n instancePath={versionData.instancePath || undefined}\n />\n </div>\n ) : null}\n <SidebarCollapseToggle className=\"shrink-0 transition-all duration-200\" />\n </div>\n </SidebarMenuItem>\n\n <SidebarNavItem icon={Home} label=\"Control Center\" href=\"/\" active={pathname === '/'} />\n <SidebarNavItem\n icon={Wrench}\n label=\"Tools\"\n href=\"/tools\"\n active={pathname === '/tools'}\n />\n {featureFlags.skills ? (\n <SidebarNavItem\n icon={Puzzle}\n label=\"Skills\"\n href=\"/skills\"\n active={pathname === '/skills'}\n />\n ) : null}\n </SidebarMenu>\n </SidebarHeader>\n\n <SidebarContent>\n {showExpanded ? (\n <div\n className={[\n 'flex min-h-0 flex-1 flex-col overflow-hidden transition-opacity duration-200 ease-out',\n '[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',\n expandedVisible ? 'opacity-100' : 'opacity-0',\n ].join(' ')}\n >\n <SidebarSectionHeader label=\"Features\" />\n <ScrollArea className=\"min-h-0 flex-1\">\n {grouped.map(({ key, label, items }) =>\n items.length > 0 ? (\n <FeatureStatusGroup key={key} label={label} count={items.length}>\n {items.map((feature) => (\n <FeatureListItem\n key={feature.featureId}\n name={feature.name}\n status={feature.status}\n startedAt={feature.startedAt}\n duration={feature.duration}\n agentType={feature.agentType}\n modelId={feature.modelId}\n onClick={\n onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined\n }\n />\n ))}\n </FeatureStatusGroup>\n ) : null\n )}\n </ScrollArea>\n </div>\n ) : null}\n </SidebarContent>\n\n <SidebarFooter className=\"border-t p-2\">\n <SidebarMenu>\n <SidebarMenuItem>\n <div className=\"flex items-center gap-1\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarMenuButton asChild tooltip=\"Settings\" className=\"w-auto flex-none\">\n <Link href={'/settings' as Route} onClick={() => clickSound.play()}>\n <Settings className=\"h-4 w-4\" />\n </Link>\n </SidebarMenuButton>\n </TooltipTrigger>\n <TooltipContent side=\"top\" hidden={collapsed}>\n Settings\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n {!collapsed && <div className=\"flex-1\" />}\n {!collapsed && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarMenuButton\n className=\"w-auto flex-none\"\n onClick={() => {\n clickSound.play();\n toggleSound();\n }}\n aria-label={soundEnabled ? 'Mute sounds' : 'Unmute sounds'}\n >\n {soundEnabled ? (\n <Volume2 className=\"h-4 w-4\" />\n ) : (\n <VolumeOff className=\"h-4 w-4\" />\n )}\n </SidebarMenuButton>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n {soundEnabled ? 'Mute sounds' : 'Unmute sounds'}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarMenuButton\n className=\"w-auto flex-none\"\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n const currentResolved = theme === 'system' ? resolvedTheme : theme;\n const goingToDark = currentResolved !== 'dark';\n const newTheme =\n theme === 'system'\n ? resolvedTheme === 'dark'\n ? 'light'\n : 'dark'\n : theme === 'dark'\n ? 'light'\n : 'dark';\n if (goingToDark) {\n toggleOnSound.play();\n } else {\n toggleOffSound.play();\n }\n const prefersReducedMotion =\n typeof window !== 'undefined' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (!('startViewTransition' in document) || prefersReducedMotion) {\n setTheme(newTheme);\n return;\n }\n document.documentElement.style.setProperty('--x', `${e.clientX}px`);\n document.documentElement.style.setProperty('--y', `${e.clientY}px`);\n (\n document as unknown as { startViewTransition: (cb: () => void) => void }\n ).startViewTransition(() => {\n setTheme(newTheme);\n });\n }}\n aria-label={`Switch to ${resolvedTheme === 'dark' ? 'light' : 'dark'} mode`}\n >\n <Sun className=\"h-4 w-4 scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <Moon className=\"absolute h-4 w-4 scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n </SidebarMenuButton>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n {resolvedTheme === 'dark' ? 'Light mode' : 'Dark mode'}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n\n <SidebarRail />\n </Sidebar>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { Plus, Loader2, X } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\n\nexport interface FloatingActionButtonAction {\n /** Unique key for the action. */\n id: string;\n /** Accessible label shown next to the icon. */\n label: string;\n /** Lucide icon component. */\n icon: React.ReactNode;\n /** Called when the action is clicked. */\n onClick: () => void;\n /** Whether the action is currently loading. */\n loading?: boolean;\n /** Whether the action is disabled. */\n disabled?: boolean;\n}\n\nexport interface FloatingActionButtonProps {\n /** Action items shown when the FAB is expanded. */\n actions: FloatingActionButtonAction[];\n /** Additional CSS classes for the container. */\n className?: string;\n}\n\n/** Stagger delay between each item animation in ms. */\nconst STAGGER_MS = 50;\n\n/** Total animation duration in ms. */\nconst DURATION_MS = 250;\n\nexport function FloatingActionButton({ actions, className }: FloatingActionButtonProps) {\n const [open, setOpen] = useState(false);\n\n // Close on Escape key\n useEffect(() => {\n if (!open) return;\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n }\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [open]);\n\n // Reversed actions so bottom-most item in stack = first action\n const reversedActions = [...actions].reverse();\n\n return (\n <>\n {/* Invisible click-outside catcher */}\n {open ? (\n <div\n data-testid=\"fab-overlay\"\n className=\"fixed inset-0 z-40\"\n onClick={() => setOpen(false)}\n aria-hidden=\"true\"\n />\n ) : null}\n\n {/* FAB container */}\n <div\n data-testid=\"floating-action-button\"\n className={cn('fixed right-6 bottom-6 z-50', className)}\n >\n {/* Action chips — vertical stack expanding upward */}\n <div\n className=\"absolute right-0 bottom-16 flex flex-col-reverse items-end gap-3\"\n data-testid=\"fab-actions\"\n >\n {reversedActions.map((action, reversedIndex) => {\n const originalIndex = actions.length - 1 - reversedIndex;\n // Stagger: bottom items appear first (closest to FAB)\n const openDelay = originalIndex * STAGGER_MS;\n // Close: top items disappear first\n const closeDelay = reversedIndex * STAGGER_MS;\n\n return (\n <button\n key={action.id}\n data-testid={`fab-action-${action.id}`}\n aria-label={action.label}\n disabled={action.disabled ?? action.loading}\n className={cn(\n 'flex items-center gap-3 rounded-full px-4 py-2.5',\n 'bg-background text-foreground shadow-lg',\n 'border-border border',\n 'transition-all ease-out',\n 'hover:bg-accent hover:text-accent-foreground',\n 'disabled:pointer-events-none disabled:opacity-50',\n open\n ? 'translate-y-0 scale-100 opacity-100'\n : 'pointer-events-none translate-y-4 scale-95 opacity-0'\n )}\n style={{\n transitionDuration: `${DURATION_MS}ms`,\n transitionDelay: open ? `${openDelay}ms` : `${closeDelay}ms`,\n }}\n onClick={() => {\n action.onClick();\n setOpen(false);\n }}\n >\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {action.loading ? <Loader2 className=\"h-5 w-5 animate-spin\" /> : action.icon}\n </span>\n <span className=\"text-sm font-medium whitespace-nowrap\">{action.label}</span>\n </button>\n );\n })}\n </div>\n\n {/* Primary FAB trigger */}\n <Button\n size=\"icon\"\n data-testid=\"fab-trigger\"\n aria-label={open ? 'Close actions' : 'Open actions'}\n className={cn(\n 'relative h-12 w-12 rounded-full shadow-lg',\n 'transition-colors duration-200'\n )}\n onClick={() => setOpen((prev) => !prev)}\n >\n {/* Plus icon — fades out when open */}\n <Plus\n className={cn(\n 'absolute h-5 w-5 transition-all',\n open ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100'\n )}\n style={{ transitionDuration: `${DURATION_MS}ms` }}\n />\n {/* X icon — fades in when open */}\n <X\n className={cn(\n 'absolute h-5 w-5 transition-all',\n open ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0'\n )}\n style={{ transitionDuration: `${DURATION_MS}ms` }}\n />\n </Button>\n </div>\n </>\n );\n}\n","'use client';\n\nimport { useState, type KeyboardEvent } from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { Label } from '@/components/ui/label';\n\n/**\n * Matches supported GitHub URL formats:\n * - https://github.com/owner/repo\n * - https://github.com/owner/repo.git\n * - git@github.com:owner/repo.git\n * - owner/repo (shorthand)\n */\nconst GITHUB_URL_PATTERN =\n /^(?:https:\\/\\/github\\.com\\/([a-zA-Z0-9._-]+)\\/([a-zA-Z0-9._-]+?)(?:\\.git)?|git@github\\.com:([a-zA-Z0-9._-]+)\\/([a-zA-Z0-9._-]+?)(?:\\.git)?|([a-zA-Z0-9._-]+)\\/([a-zA-Z0-9._-]+))$/;\n\nexport function isValidGitHubUrl(url: string): boolean {\n return GITHUB_URL_PATTERN.test(url.trim());\n}\n\nexport interface GitHubUrlInputProps {\n onSubmit: (url: string) => void;\n loading?: boolean;\n}\n\nexport function GitHubUrlInput({ onSubmit, loading = false }: GitHubUrlInputProps) {\n const [url, setUrl] = useState('');\n const [error, setError] = useState('');\n\n function handleSubmit() {\n const trimmed = url.trim();\n if (!trimmed) {\n setError('Please enter a GitHub URL');\n return;\n }\n if (!isValidGitHubUrl(trimmed)) {\n setError('Enter a valid GitHub URL (e.g. owner/repo or https://github.com/owner/repo)');\n return;\n }\n setError('');\n onSubmit(trimmed);\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"github-url-input\">GitHub URL</Label>\n <div className=\"flex gap-2\">\n <Input\n id=\"github-url-input\"\n placeholder=\"owner/repo or https://github.com/owner/repo\"\n value={url}\n onChange={(e) => {\n setUrl(e.target.value);\n if (error) setError('');\n }}\n onKeyDown={handleKeyDown}\n disabled={loading}\n aria-invalid={!!error}\n aria-describedby={error ? 'github-url-error' : undefined}\n />\n <Button onClick={handleSubmit} disabled={loading || !url.trim()} size=\"sm\">\n {loading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : 'Import'}\n </Button>\n </div>\n {error ? (\n <p id=\"github-url-error\" className=\"text-destructive text-sm\" role=\"alert\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40c8daccf6fd712e278ed7a2b897db0b52697e11a7\":\"listGitHubRepositories\"},\"src/presentation/web/app/actions/list-github-repositories.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40c8daccf6fd712e278ed7a2b897db0b52697e11a7\",callServer,void 0,findSourceMapURL,\"listGitHubRepositories\");export{$$RSC_SERVER_ACTION_0 as listGitHubRepositories};","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Lock, Globe, Loader2, Search, AlertCircle } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Badge } from '@/components/ui/badge';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { listGitHubRepositories } from '@/app/actions/list-github-repositories';\nimport type { GitHubRepo } from '@shepai/core/application/ports/output/services/github-repository-service.interface';\n\nexport interface GitHubRepoBrowserProps {\n onSelect: (nameWithOwner: string) => void;\n loading?: boolean;\n /** Override the fetch function for testing/stories */\n fetchRepos?: (input?: {\n search?: string;\n limit?: number;\n }) => Promise<{ repos?: GitHubRepo[]; error?: string }>;\n}\n\nexport function GitHubRepoBrowser({\n onSelect,\n loading: externalLoading = false,\n fetchRepos = listGitHubRepositories,\n}: GitHubRepoBrowserProps) {\n const [repos, setRepos] = useState<GitHubRepo[]>([]);\n const [fetching, setFetching] = useState(true);\n const [error, setError] = useState('');\n const [search, setSearch] = useState('');\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const fetchData = useCallback(\n async (searchTerm?: string) => {\n setFetching(true);\n setError('');\n try {\n const result = await fetchRepos(searchTerm ? { search: searchTerm } : undefined);\n if (result.error) {\n setError(result.error);\n setRepos([]);\n } else {\n setRepos(result.repos ?? []);\n }\n } catch {\n setError('Failed to fetch repositories');\n setRepos([]);\n } finally {\n setFetching(false);\n }\n },\n [fetchRepos]\n );\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n function handleSearchChange(value: string) {\n setSearch(value);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n fetchData(value || undefined);\n }, 300);\n }\n\n const disabled = externalLoading;\n\n if (error && !fetching) {\n return (\n <div\n className=\"flex flex-col items-center gap-2 py-8 text-center\"\n data-testid=\"repo-browser-error\"\n >\n <AlertCircle className=\"text-destructive h-8 w-8\" />\n <p className=\"text-destructive text-sm\">{error}</p>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2\" />\n <Input\n placeholder=\"Search repositories...\"\n value={search}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"pl-9\"\n disabled={disabled}\n aria-label=\"Search repositories\"\n />\n </div>\n\n <div\n className=\"max-h-64 overflow-x-hidden overflow-y-auto rounded-md border\"\n role=\"listbox\"\n aria-label=\"GitHub repositories\"\n >\n {fetching ? (\n <div className=\"flex flex-col gap-2 p-3\" data-testid=\"repo-browser-loading\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={`skeleton-${String(i)}`} className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-4 w-48\" />\n <Skeleton className=\"h-3 w-72\" />\n </div>\n ))}\n </div>\n ) : repos.length === 0 ? (\n <div\n className=\"text-muted-foreground py-8 text-center text-sm\"\n data-testid=\"repo-browser-empty\"\n >\n No repositories found\n </div>\n ) : (\n repos.map((repo) => (\n <button\n key={repo.nameWithOwner}\n type=\"button\"\n role=\"option\"\n aria-selected={false}\n className=\"hover:bg-accent flex w-full items-start gap-2 border-b px-3 py-2.5 text-left last:border-b-0 disabled:opacity-50\"\n onClick={() => onSelect(repo.nameWithOwner)}\n disabled={disabled}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\">{repo.nameWithOwner}</span>\n <Badge\n variant={repo.isPrivate ? 'secondary' : 'outline'}\n className=\"shrink-0 text-xs\"\n >\n {repo.isPrivate ? (\n <>\n <Lock className=\"mr-1 h-3 w-3\" />\n Private\n </>\n ) : (\n <>\n <Globe className=\"mr-1 h-3 w-3\" />\n Public\n </>\n )}\n </Badge>\n </div>\n {repo.description ? (\n <p className=\"text-muted-foreground mt-0.5 truncate text-xs\">\n {repo.description}\n </p>\n ) : null}\n </div>\n {disabled ? <Loader2 className=\"mt-0.5 h-4 w-4 shrink-0 animate-spin\" /> : null}\n </button>\n ))\n )}\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"408a911977ed31ce34aebc3a067ec3329e22bc458c\":\"importGitHubRepository\"},\"src/presentation/web/app/actions/import-github-repository.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"408a911977ed31ce34aebc3a067ec3329e22bc458c\",callServer,void 0,findSourceMapURL,\"importGitHubRepository\");export{$$RSC_SERVER_ACTION_0 as importGitHubRepository};","'use client';\n\nimport { useState } from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { GitHubUrlInput } from './github-url-input';\nimport { GitHubRepoBrowser } from './github-repo-browser';\nimport { importGitHubRepository } from '@/app/actions/import-github-repository';\nimport type { Repository } from '@shepai/core/domain/generated/output';\n\nexport interface GitHubImportDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onImportComplete: (repository: Repository) => void;\n}\n\nexport function GitHubImportDialog({\n open,\n onOpenChange,\n onImportComplete,\n}: GitHubImportDialogProps) {\n const [importing, setImporting] = useState(false);\n const [error, setError] = useState('');\n\n async function handleImport(url: string) {\n setImporting(true);\n setError('');\n try {\n const result = await importGitHubRepository({ url });\n if (result.error) {\n setError(result.error);\n } else if (result.repository) {\n onImportComplete(result.repository);\n onOpenChange(false);\n }\n } catch {\n setError('An unexpected error occurred');\n } finally {\n setImporting(false);\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"overflow-hidden sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>Import from GitHub</DialogTitle>\n <DialogDescription>Clone a GitHub repository and add it to Shep.</DialogDescription>\n </DialogHeader>\n\n <Tabs defaultValue=\"url\" className=\"min-w-0\">\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"url\">URL</TabsTrigger>\n <TabsTrigger value=\"browse\">Browse</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"url\" className=\"mt-4\">\n <GitHubUrlInput onSubmit={handleImport} loading={importing} />\n </TabsContent>\n\n <TabsContent value=\"browse\" className=\"mt-4\">\n <GitHubRepoBrowser onSelect={handleImport} loading={importing} />\n </TabsContent>\n </Tabs>\n\n {error ? (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n {error}\n </p>\n ) : null}\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { toast } from 'sonner';\nimport type { NotificationEvent } from '@shepai/core/domain/generated/output';\nimport { NotificationEventType, NotificationSeverity } from '@shepai/core/domain/generated/output';\nimport { useAgentEventsContext } from './agent-events-provider';\nimport { useSoundAction } from './use-sound-action';\nimport type { SoundAction } from './use-sound-action';\n\nconst SEVERITY_TO_TOAST: Record<NotificationSeverity, 'success' | 'error' | 'warning' | 'info'> = {\n [NotificationSeverity.Success]: 'success',\n [NotificationSeverity.Error]: 'error',\n [NotificationSeverity.Warning]: 'warning',\n [NotificationSeverity.Info]: 'info',\n};\n\nfunction dispatchToast(event: NotificationEvent, navigate?: (path: string) => void): void {\n const method = SEVERITY_TO_TOAST[event.severity] ?? 'info';\n const isActionable =\n event.eventType === NotificationEventType.WaitingApproval ||\n event.eventType === NotificationEventType.MergeReviewReady;\n toast[method](event.featureName, {\n description: event.message,\n ...(isActionable &&\n navigate && {\n action: {\n label: 'Review',\n onClick: () => {\n navigate(`/feature/${event.featureId}`);\n },\n },\n }),\n });\n}\n\nconst SEVERITY_TO_ACTION: Record<NotificationSeverity, SoundAction> = {\n [NotificationSeverity.Success]: 'notification-success',\n [NotificationSeverity.Error]: 'notification-error',\n [NotificationSeverity.Warning]: 'notification-warning',\n [NotificationSeverity.Info]: 'notification-info',\n};\n\nexport function useNotifications(): void {\n const router = useRouter();\n const { events } = useAgentEventsContext();\n\n const successSound = useSoundAction('notification-success');\n const errorSound = useSoundAction('notification-error');\n const warningSound = useSoundAction('notification-warning');\n const infoSound = useSoundAction('notification-info');\n\n const soundsByAction = useMemo<Record<string, { play: () => void }>>(\n () => ({\n 'notification-success': successSound,\n 'notification-error': errorSound,\n 'notification-warning': warningSound,\n 'notification-info': infoSound,\n }),\n [successSound, errorSound, warningSound, infoSound]\n );\n\n // Track how many events from the array we've already processed.\n // Using the array index (instead of lastEvent) prevents React batching\n // from silently dropping events when multiple SSE messages arrive together.\n const processedCountRef = useRef(0);\n\n useEffect(() => {\n if (events.length <= processedCountRef.current) return;\n\n const newEvents = events.slice(processedCountRef.current);\n processedCountRef.current = events.length;\n\n for (const event of newEvents) {\n // Only notify for actionable events and completion celebrations.\n // MergeReviewReady is Info severity but always shown as it requires user action.\n const isAlwaysShown = event.eventType === NotificationEventType.MergeReviewReady;\n if (\n !isAlwaysShown &&\n event.severity !== NotificationSeverity.Error &&\n event.severity !== NotificationSeverity.Warning &&\n event.severity !== NotificationSeverity.Success\n ) {\n continue;\n }\n\n dispatchToast(event, (path) => router.push(path as Parameters<typeof router.push>[0]));\n\n const actionName = SEVERITY_TO_ACTION[event.severity];\n soundsByAction[actionName]?.play();\n }\n }, [events, soundsByAction, router]);\n}\n","'use client';\n\nimport { useCallback, useMemo, useState, type ReactNode } from 'react';\nimport { useRouter, usePathname } from 'next/navigation';\nimport { Plus, FolderPlus, Github, GitBranch } from 'lucide-react';\nimport { SidebarProvider, SidebarInset } from '@/components/ui/sidebar';\nimport { AppSidebar } from '@/components/layouts/app-sidebar';\nimport {\n FloatingActionButton,\n type FloatingActionButtonAction,\n} from '@/components/common/floating-action-button';\nimport { ReactFileManagerDialog } from '@/components/common/react-file-manager-dialog';\nimport { pickFolder } from '@/components/common/add-repository-button/pick-folder';\nimport { GitHubImportDialog } from '@/components/common/github-import-dialog';\nimport { AgentEventsProvider } from '@/hooks/agent-events-provider';\nimport { DrawerCloseGuardProvider, useDrawerCloseGuard } from '@/hooks/drawer-close-guard';\nimport {\n SidebarFeaturesProvider,\n useSidebarFeaturesContext,\n} from '@/hooks/sidebar-features-context';\n\nimport { useNotifications } from '@/hooks/use-notifications';\nimport { useFeatureFlags } from '@/hooks/feature-flags-context';\n\ninterface AppShellProps {\n children: ReactNode;\n /** Server-read sidebar state from cookie. */\n sidebarOpen?: boolean;\n}\n\n/** Control center route prefixes where the FAB should be visible. */\nconst CONTROL_CENTER_PREFIXES = ['/', '/create', '/adopt', '/feature', '/repository'];\n\nfunction isControlCenterRoute(pathname: string): boolean {\n return CONTROL_CENTER_PREFIXES.some(\n (prefix) => pathname === prefix || (prefix !== '/' && pathname.startsWith(`${prefix}/`))\n );\n}\n\nfunction AppShellInner({ children, sidebarOpen }: AppShellProps) {\n const router = useRouter();\n const pathname = usePathname();\n const { guardedNavigate } = useDrawerCloseGuard();\n const featureFlags = useFeatureFlags();\n\n // Subscribe to agent lifecycle events and dispatch toast/browser notifications\n useNotifications();\n\n const { features, hasRepositories } = useSidebarFeaturesContext();\n const handleNewFeature = useCallback(() => {\n guardedNavigate(() => router.push('/create'));\n }, [router, guardedNavigate]);\n\n const handleAdoptBranch = useCallback(() => {\n guardedNavigate(() => router.push('/adopt'));\n }, [router, guardedNavigate]);\n\n const handleFeatureClick = useCallback(\n (featureId: string) => {\n guardedNavigate(() => router.push(`/feature/${featureId}`));\n },\n [router, guardedNavigate]\n );\n\n const [addingRepo, setAddingRepo] = useState(false);\n const [githubDialogOpen, setGithubDialogOpen] = useState(false);\n const [showReactPicker, setShowReactPicker] = useState(false);\n\n const handleAddRepository = useCallback(async () => {\n if (addingRepo) return;\n\n if (featureFlags.reactFileManager) {\n setShowReactPicker(true);\n return;\n }\n\n setAddingRepo(true);\n try {\n const path = await pickFolder();\n if (path) {\n window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));\n }\n } catch {\n // Native picker failed — fall back to React file manager\n setShowReactPicker(true);\n } finally {\n setAddingRepo(false);\n }\n }, [addingRepo, featureFlags.reactFileManager]);\n\n const handleReactPickerSelect = useCallback((path: string | null) => {\n if (path) {\n window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));\n }\n setShowReactPicker(false);\n }, []);\n\n const handleImportFromGitHub = useCallback(() => {\n setGithubDialogOpen(true);\n }, []);\n\n const handleGitHubImportComplete = useCallback((repository: { path?: string }) => {\n if (repository.path) {\n window.dispatchEvent(\n new CustomEvent('shep:add-repository', { detail: { path: repository.path } })\n );\n }\n }, []);\n\n const fabActions: FloatingActionButtonAction[] = useMemo(() => {\n const actions: FloatingActionButtonAction[] = [\n {\n id: 'new-feature',\n label: 'New Feature',\n icon: <Plus className=\"h-4 w-4\" />,\n onClick: handleNewFeature,\n },\n ...(featureFlags.adoptBranch\n ? [\n {\n id: 'adopt-branch',\n label: 'Adopt Branch',\n icon: <GitBranch className=\"h-4 w-4\" />,\n onClick: handleAdoptBranch,\n },\n ]\n : []),\n {\n id: 'add-repository',\n label: 'Add Repository',\n icon: <FolderPlus className=\"h-4 w-4\" />,\n onClick: handleAddRepository,\n loading: addingRepo,\n },\n ];\n if (featureFlags.githubImport) {\n actions.push({\n id: 'import-github',\n label: 'Import from GitHub',\n icon: <Github className=\"h-4 w-4\" />,\n onClick: handleImportFromGitHub,\n });\n }\n return actions;\n }, [\n handleNewFeature,\n handleAdoptBranch,\n handleAddRepository,\n addingRepo,\n handleImportFromGitHub,\n featureFlags.githubImport,\n featureFlags.adoptBranch,\n ]);\n\n return (\n <SidebarProvider defaultOpen={sidebarOpen ?? false}>\n <AppSidebar\n features={features}\n featureFlags={featureFlags}\n onFeatureClick={handleFeatureClick}\n />\n <SidebarInset>\n <div className=\"relative h-full\">\n <main className=\"h-full\">{children}</main>\n {isControlCenterRoute(pathname) && hasRepositories ? (\n <FloatingActionButton actions={fabActions} />\n ) : null}\n {featureFlags.githubImport ? (\n <GitHubImportDialog\n open={githubDialogOpen}\n onOpenChange={setGithubDialogOpen}\n onImportComplete={handleGitHubImportComplete}\n />\n ) : null}\n </div>\n </SidebarInset>\n <ReactFileManagerDialog\n open={showReactPicker}\n onOpenChange={(open) => {\n if (!open) setShowReactPicker(false);\n }}\n onSelect={handleReactPickerSelect}\n />\n </SidebarProvider>\n );\n}\n\nexport function AppShell({ children, sidebarOpen }: AppShellProps) {\n return (\n <AgentEventsProvider>\n <DrawerCloseGuardProvider>\n <SidebarFeaturesProvider>\n <AppShellInner sidebarOpen={sidebarOpen}>{children}</AppShellInner>\n </SidebarFeaturesProvider>\n </DrawerCloseGuardProvider>\n </AgentEventsProvider>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nexport interface VersionData {\n version: string;\n packageName: string;\n description: string;\n branch: string;\n commitHash: string;\n instancePath: string;\n isDev: boolean;\n}\n\nconst DEFAULT_VERSION_DATA: VersionData = {\n version: 'unknown',\n packageName: '@shepai/cli',\n description: 'Autonomous AI Native SDLC Platform',\n branch: '',\n commitHash: '',\n instancePath: '',\n isDev: false,\n};\n\n/**\n * Fetches runtime version info from the server API.\n *\n * NEXT_PUBLIC_* env vars are inlined at build time for client components,\n * so they can show a stale version after a CLI upgrade. This hook fetches\n * the version from a server-side API route that reads the env vars at runtime.\n */\nexport function useVersion(): VersionData {\n const [data, setData] = useState<VersionData>(DEFAULT_VERSION_DATA);\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchVersion() {\n try {\n const res = await fetch('/api/version');\n if (!res.ok) return;\n const json = (await res.json()) as VersionData;\n if (!cancelled) {\n setData(json);\n }\n } catch {\n // Version fetch is non-critical — keep defaults\n }\n }\n\n fetchVersion();\n return () => {\n cancelled = true;\n };\n }, []);\n\n return data;\n}\n","import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n","import { cn } from '@/lib/utils';\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn('bg-accent animate-pulse rounded-md', className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","/**\n * Compare two semver version strings.\n * Returns 1 if a > b, -1 if a < b, 0 if equal.\n * Only compares major.minor.patch (ignores pre-release/build metadata).\n */\nexport function compareVersions(a: string, b: string): -1 | 0 | 1 {\n const parse = (v: string) => v.split('-')[0].split('.').map(Number);\n const pa = parse(a);\n const pb = parse(b);\n for (let i = 0; i < 3; i++) {\n const na = pa[i] ?? 0;\n const nb = pb[i] ?? 0;\n if (na > nb) return 1;\n if (na < nb) return -1;\n }\n return 0;\n}\n","import { cn } from '@/lib/utils';\n\nexport interface ShepLogoProps {\n className?: string;\n size?: number;\n variant?: 'default' | 'dev';\n}\n\nexport function ShepLogo({ className, size = 24, variant = 'default' }: ShepLogoProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 194 200\"\n width={size}\n height={size}\n className={cn('shrink-0', variant === 'dev' && 'text-cyan-400', className)}\n aria-hidden=\"true\"\n >\n <g transform=\"matrix(1, 0, 0, 1, -111, -208)\">\n <path\n d=\"M 198 406 C196,405 194,403 193,401 C192,399 191,398 186,398 C178,397 174,394 170,387 L 168 381 L 163 381 C156,381 150,377 147,370 C144,364 143,359 146,353 C148,348 148,347 147,347 C145,347 140,343 138,339 C133,329 139,314 149,311 L 152 311 L 149 307 C145,302 145,294 149,290 C151,288 152,287 151,286 C150,283 152,278 155,276 C156,275 159,274 162,273 C165,273 166,273 168,276 C171,278 171,280 172,287 C173,294 174,297 177,304 C180,309 182,314 183,316 C186,327 193,336 199,339 C204,342 211,342 216,340 C222,336 231,324 234,314 C235,312 237,307 239,302 C240,298 242,292 242,289 C243,281 245,278 247,275 C250,273 251,273 255,273 C261,274 264,278 264,282 C264,284 264,286 263,287 C262,287 263,288 265,290 C272,295 272,303 267,309 L 265 312 L 269 314 C276,317 279,323 279,332 C279,339 277,343 272,347 C268,351 268,351 269,354 C272,358 271,366 269,371 C266,376 259,381 254,381 C252,381 251,382 248,386 C242,395 234,400 227,399 C224,398 223,398 221,401 C220,403 217,405 216,406 C211,409 203,409 198,406 ZM 136 271 C123,267 115,262 113,256 C111,251 111,251 113,251 C118,254 124,254 132,252 C136,252 141,251 144,251 C149,251 157,253 162,256 C166,258 166,258 166,264 L 166 269 L 160 270 C149,272 142,272 136,271 ZM 264 271 C263,271 259,270 256,270 L 250 270 L 250 265 C249,259 250,257 259,254 C265,251 272,251 289,252 C297,253 299,253 302,252 C305,250 305,250 305,252 C305,255 301,262 297,264 C289,270 272,273 264,271 ZM 162 249 C160,247 159,245 159,242 C159,236 164,230 169,230 C170,230 171,228 171,225 C171,216 176,210 184,209 C189,209 195,211 195,213 C195,214 196,213 197,212 C201,209 204,208 208,208 C212,208 217,210 219,212 C220,214 220,213 223,211 C226,208 234,208 239,211 C243,214 246,221 246,226 C245,230 245,230 247,230 C253,230 258,238 257,244 C256,249 251,252 245,252 C241,252 237,251 234,248 C232,247 232,247 228,249 C225,251 222,252 220,252 C216,252 212,250 210,247 C209,246 209,246 206,248 C201,252 192,253 185,248 C183,247 183,247 178,249 C172,253 166,253 162,249 ZM 116 249 C112,248 114,247 119,247 C122,247 127,246 130,245 C138,242 146,242 152,245 L 158 248 L 148 247 C142,247 138,247 133,248 C128,250 120,250 116,249 ZM 284 248 C281,247 277,247 270,247 L 260 248 L 263 246 C269,243 276,242 284,245 C289,246 295,247 298,247 C303,247 304,247 303,248 C301,250 289,250 284,248 Z\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '11', x: '3', y: '11', rx: '2', ry: '2', key: '1w4ew1' }],\n ['path', { d: 'M7 11V7a5 5 0 0 1 10 0v4', key: 'fwvmzm' }],\n];\n\n/**\n * @component @name Lock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTEiIHg9IjMiIHk9IjExIiByeD0iMiIgcnk9IjIiIC8+CiAgPHBhdGggZD0iTTcgMTFWN2E1IDUgMCAwIDEgMTAgMHY0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/lock\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Lock = createLucideIcon('lock', __iconNode);\n\nexport default Lock;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M9 3v18', key: 'fh3hqa' }],\n];\n\n/**\n * @component @name PanelLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik05IDN2MTgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/panel-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst PanelLeft = createLucideIcon('panel-left', __iconNode);\n\nexport default PanelLeft;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M16 9a5 5 0 0 1 .95 2.293', key: '1fgyg8' }],\n ['path', { d: 'M19.364 5.636a9 9 0 0 1 1.889 9.96', key: 'l3zxae' }],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n [\n 'path',\n {\n d: 'm7 7-.587.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298V11',\n key: '1gbwow',\n },\n ],\n ['path', { d: 'M9.828 4.172A.686.686 0 0 1 11 4.657v.686', key: 's2je0y' }],\n];\n\n/**\n * @component @name VolumeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgOWE1IDUgMCAwIDEgLjk1IDIuMjkzIiAvPgogIDxwYXRoIGQ9Ik0xOS4zNjQgNS42MzZhOSA5IDAgMCAxIDEuODg5IDkuOTYiIC8+CiAgPHBhdGggZD0ibTIgMiAyMCAyMCIgLz4KICA8cGF0aCBkPSJtNyA3LS41ODcuNTg3QTEuNCAxLjQgMCAwIDEgNS40MTYgOEgzYTEgMSAwIDAgMC0xIDF2NmExIDEgMCAwIDAgMSAxaDIuNDE2YTEuNCAxLjQgMCAwIDEgLjk5Ny40MTNsMy4zODMgMy4zODRBLjcwNS43MDUgMCAwIDAgMTEgMTkuMjk4VjExIiAvPgogIDxwYXRoIGQ9Ik05LjgyOCA0LjE3MkEuNjg2LjY4NiAwIDAgMSAxMSA0LjY1N3YuNjg2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/volume-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst VolumeOff = createLucideIcon('volume-off', __iconNode);\n\nexport default VolumeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8', key: '5wwlr5' }],\n [\n 'path',\n {\n d: 'M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z',\n key: 'r6nss1',\n },\n ],\n];\n\n/**\n * @component @name House\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgMjF2LThhMSAxIDAgMCAwLTEtMWgtNGExIDEgMCAwIDAtMSAxdjgiIC8+CiAgPHBhdGggZD0iTTMgMTBhMiAyIDAgMCAxIC43MDktMS41MjhsNy02YTIgMiAwIDAgMSAyLjU4MiAwbDcgNkEyIDIgMCAwIDEgMjEgMTB2OWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnoiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/house\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst House = createLucideIcon('house', __iconNode);\n\nexport default House;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],\n ['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],\n ['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],\n];\n\n/**\n * @component @name Sun\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xMiAydjIiIC8+CiAgPHBhdGggZD0iTTEyIDIwdjIiIC8+CiAgPHBhdGggZD0ibTQuOTMgNC45MyAxLjQxIDEuNDEiIC8+CiAgPHBhdGggZD0ibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJNMiAxMmgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxMmgyIiAvPgogIDxwYXRoIGQ9Im02LjM0IDE3LjY2LTEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJtMTkuMDcgNC45My0xLjQxIDEuNDEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sun\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Sun = createLucideIcon('sun', __iconNode);\n\nexport default Sun;\n","/**\n * Theme type definitions for the Shep AI Web UI\n */\n\nexport type Theme = 'light' | 'dark' | 'system';\n\nexport interface ThemeContextValue {\n theme: Theme;\n resolvedTheme: 'light' | 'dark';\n setTheme: (theme: Theme) => void;\n}\n\nexport const THEME_STORAGE_KEY = 'shep-theme';\n\nexport const themes: Theme[] = ['light', 'dark', 'system'];\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z',\n key: 'uqj9uw',\n },\n ],\n ['path', { d: 'M16 9a5 5 0 0 1 0 6', key: '1q6k2b' }],\n ['path', { d: 'M19.364 18.364a9 9 0 0 0 0-12.728', key: 'ijwkga' }],\n];\n\n/**\n * @component @name Volume2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTEgNC43MDJhLjcwNS43MDUgMCAwIDAtMS4yMDMtLjQ5OEw2LjQxMyA3LjU4N0ExLjQgMS40IDAgMCAxIDUuNDE2IDhIM2ExIDEgMCAwIDAtMSAxdjZhMSAxIDAgMCAwIDEgMWgyLjQxNmExLjQgMS40IDAgMCAxIC45OTcuNDEzbDMuMzgzIDMuMzg0QS43MDUuNzA1IDAgMCAwIDExIDE5LjI5OHoiIC8+CiAgPHBhdGggZD0iTTE2IDlhNSA1IDAgMCAxIDAgNiIgLz4KICA8cGF0aCBkPSJNMTkuMzY0IDE4LjM2NGE5IDkgMCAwIDAgMC0xMi43MjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/volume-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Volume2 = createLucideIcon('volume-2', __iconNode);\n\nexport default Volume2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401',\n key: 'kfwtm',\n },\n ],\n];\n\n/**\n * @component @name Moon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/moon\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Moon = createLucideIcon('moon', __iconNode);\n\nexport default Moon;\n","import type { ReactNode } from 'react';\nimport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarGroupContent,\n SidebarMenu,\n} from '@/components/ui/sidebar';\n\nexport interface FeatureStatusGroupProps {\n label: string;\n count: number;\n children: ReactNode;\n}\n\nexport function FeatureStatusGroup({ label, count, children }: FeatureStatusGroupProps) {\n return (\n <SidebarGroup data-testid=\"feature-status-group\" className=\"px-2 py-1\">\n <SidebarGroupLabel className=\"text-muted-foreground h-6 px-2 text-[0.65rem] font-semibold tracking-wider uppercase\">\n {label}\n <span\n aria-label={`${count} items`}\n className=\"bg-sidebar-accent text-sidebar-accent-foreground ml-1.5 inline-flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[0.6rem] font-medium tabular-nums\"\n role=\"img\"\n >\n {count}\n </span>\n </SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu className=\"gap-0.5\">{children}</SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n","import * as React from 'react';\n\ntype Machine<S> = { [k: string]: { [k: string]: S } };\ntype MachineState<T> = keyof T;\ntype MachineEvent<T> = keyof UnionToIntersection<T[keyof T]>;\n\n// 🤯 https://fettblog.eu/typescript-union-to-intersection/\ntype UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any\n ? R\n : never;\n\nexport function useStateMachine<M>(\n initialState: MachineState<M>,\n machine: M & Machine<MachineState<M>>\n) {\n return React.useReducer((state: MachineState<M>, event: MachineEvent<M>): MachineState<M> => {\n const nextState = (machine[state] as any)[event];\n return nextState ?? state;\n }, initialState);\n}\n","'use client';\n\nimport { Toaster as Sonner } from 'sonner';\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>;\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n return (\n <Sonner\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n 'group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg',\n description: 'group-[.toast]:text-muted-foreground',\n actionButton: 'group-[.toast]:bg-primary group-[.toast]:text-primary-foreground',\n cancelButton: 'group-[.toast]:bg-muted group-[.toast]:text-muted-foreground',\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n"],"names":[],"mappings":"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","ignoreList":[1,29,30,31,32,33,35,36,37,39]}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/components/common/feature-list-item/feature-list-item.tsx","../../../../../../../src/presentation/web/components/ui/sidebar.tsx","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-scroll-area%401.2.10_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types_ba0b3d60c668755d5c2d6349c8477ebb/node_modules/%40radix-ui/react-scroll-area/dist/index.mjs","../../../../../../../src/presentation/web/components/ui/scroll-area.tsx","../../../../../../../src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.tsx","../../../../../../../src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.tsx","../../../../../../../src/presentation/web/hooks/use-npm-version-check.ts","../../../../../../../src/presentation/web/hooks/use-cli-upgrade.ts","../../../../../../../src/presentation/web/components/common/version-badge/version-badge.tsx","../../../../../../../src/presentation/web/components/common/elapsed-time/elapsed-time.tsx","../../../../../../../src/presentation/web/components/common/feature-status-config.ts","../../../../../../../src/presentation/web/components/ui/sheet.tsx","../../../../../../../src/presentation/web/hooks/useTheme.ts","../../../../../../../src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.tsx","../../../../../../../src/presentation/web/hooks/use-deferred-mount.ts","../../../../../../../src/presentation/web/hooks/use-version.ts","../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx","../../../../../../../src/presentation/web/components/common/floating-action-button/floating-action-button.tsx","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-url-input.tsx","../../../../../../../src/presentation/web/app/actions/data%3A491e13%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.tsx","../../../../../../../src/presentation/web/app/actions/data%3A530100%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-import-dialog.tsx","../../../../../../../src/presentation/web/hooks/use-notifications.ts","../../../../../../../src/presentation/web/hooks/use-mobile.ts","../../../../../../../src/presentation/web/components/ui/skeleton.tsx","../../../../../../../src/presentation/web/lib/compare-versions.ts","../../../../../../../src/presentation/web/components/common/shep-logo/shep-logo.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/sun.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/lock.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/panel-left.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/volume-off.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/house.ts","../../../../../../../src/presentation/web/types/theme.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/volume-2.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/settings.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/moon.ts","../../../../../../../src/presentation/web/components/common/feature-status-group/feature-status-group.tsx","../../../../../../../src/presentation/web/components/ui/sonner.tsx"],"sourcesContent":["'use client';\n\nimport { SidebarMenuItem, SidebarMenuButton } from '@/components/ui/sidebar';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { ElapsedTime } from '@/components/common/elapsed-time';\nimport { featureStatusConfig } from '@/components/common/feature-status-config';\nimport type { FeatureStatus } from '@/components/common/feature-status-config';\nimport {\n getAgentTypeIcon,\n agentTypeLabels,\n type AgentTypeValue,\n} from '@/components/common/feature-node/agent-type-icons';\nimport { getModelMeta } from '@/lib/model-metadata';\n\nexport interface FeatureListItemProps {\n name: string;\n status: FeatureStatus;\n startedAt?: number;\n duration?: string;\n agentType?: string;\n modelId?: string;\n onClick?: () => void;\n}\n\nexport function FeatureListItem({\n name,\n status,\n startedAt,\n duration,\n agentType,\n modelId,\n onClick,\n}: FeatureListItemProps) {\n const { icon: StatusIcon, iconClass } = featureStatusConfig[status];\n const AgentIcon = agentType ? getAgentTypeIcon(agentType) : null;\n\n return (\n <SidebarMenuItem data-testid=\"feature-list-item\">\n <SidebarMenuButton size=\"sm\" onClick={onClick} tooltip={name} className=\"cursor-pointer\">\n <StatusIcon className={iconClass} />\n <span className=\"flex-1 truncate font-medium\">{name}</span>\n {status === 'in-progress' && startedAt != null ? (\n <span\n data-testid=\"feature-list-item-meta\"\n className=\"text-muted-foreground ml-auto text-xs tabular-nums\"\n >\n <ElapsedTime startedAt={startedAt} />\n </span>\n ) : null}\n {status === 'done' && duration ? (\n <span\n data-testid=\"feature-list-item-meta\"\n className=\"text-muted-foreground ml-auto text-xs tabular-nums\"\n >\n {duration}\n </span>\n ) : null}\n {AgentIcon ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"ml-auto shrink-0\">\n <AgentIcon className=\"h-3.5 w-3.5\" />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n <span className=\"font-medium\">\n {agentTypeLabels[agentType as AgentTypeValue] ?? agentType}\n </span>\n {modelId ? (\n <span className=\"ml-1 opacity-70\">\n · {getModelMeta(modelId).displayName || modelId}\n </span>\n ) : null}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : null}\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { PanelLeftIcon } from 'lucide-react';\nimport { Slot } from 'radix-ui';\n\nimport { useIsMobile } from '@/hooks/use-mobile';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Separator } from '@/components/ui/separator';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '@/components/ui/sheet';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nconst SIDEBAR_STORAGE_KEY = 'shep-sidebar-open';\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ninterface SidebarContextProps {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n /** Whether transitions should be enabled (false until first user toggle). */\n animated: boolean;\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n const [animated, setAnimated] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n // defaultOpen comes from server-side cookie reading, so SSR and client agree.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // Persist sidebar state to localStorage and a cookie (so the server can\n // read it on the next request and render the correct initial state).\n try {\n localStorage.setItem(SIDEBAR_STORAGE_KEY, String(openState));\n document.cookie = `${SIDEBAR_STORAGE_KEY}=${openState}; path=/; max-age=31536000; SameSite=Lax`;\n } catch {\n // Silently ignore storage errors (e.g. quota exceeded, private browsing).\n }\n },\n [setOpenProp, open]\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n setAnimated(true);\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Seed cookie from localStorage for existing users who have localStorage\n // but no cookie yet (one-time migration).\n React.useEffect(() => {\n try {\n if (!document.cookie.includes(SIDEBAR_STORAGE_KEY)) {\n const stored = localStorage.getItem(SIDEBAR_STORAGE_KEY);\n if (stored != null) {\n document.cookie = `${SIDEBAR_STORAGE_KEY}=${stored}; path=/; max-age=31536000; SameSite=Lax`;\n }\n }\n } catch {\n // Ignore\n }\n }, []);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n animated,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar, animated]\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n 'group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full',\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n const { isMobile, state, openMobile, setOpenMobile, animated } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative w-(--sidebar-width) bg-transparent',\n animated && 'transition-[width] duration-200 ease-linear',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)'\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) md:flex',\n animated && 'transition-[left,right,width] duration-200 ease-linear',\n side === 'left'\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',\n 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n 'bg-background relative flex w-full flex-1 flex-col',\n 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn('bg-background h-8 w-full shadow-none', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn('bg-sidebar-border mx-2 w-auto', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n 'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : 'div';\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn('w-full text-sm', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn('flex w-full min-w-0 flex-col gap-1', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative', className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n outline:\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'h-8 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : 'button';\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== 'collapsed' || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon ? (\n <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />\n ) : null}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn('group/menu-sub-item relative', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : 'a';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n SIDEBAR_STORAGE_KEY,\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","\"use client\";\n\n// src/scroll-area.tsx\nimport * as React2 from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport { clamp } from \"@radix-ui/number\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\n\n// src/use-state-machine.ts\nimport * as React from \"react\";\nfunction useStateMachine(initialState, machine) {\n return React.useReducer((state, event) => {\n const nextState = machine[state][event];\n return nextState ?? state;\n }, initialState);\n}\n\n// src/scroll-area.tsx\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar SCROLL_AREA_NAME = \"ScrollArea\";\nvar [createScrollAreaContext, createScrollAreaScope] = createContextScope(SCROLL_AREA_NAME);\nvar [ScrollAreaProvider, useScrollAreaContext] = createScrollAreaContext(SCROLL_AREA_NAME);\nvar ScrollArea = React2.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeScrollArea,\n type = \"hover\",\n dir,\n scrollHideDelay = 600,\n ...scrollAreaProps\n } = props;\n const [scrollArea, setScrollArea] = React2.useState(null);\n const [viewport, setViewport] = React2.useState(null);\n const [content, setContent] = React2.useState(null);\n const [scrollbarX, setScrollbarX] = React2.useState(null);\n const [scrollbarY, setScrollbarY] = React2.useState(null);\n const [cornerWidth, setCornerWidth] = React2.useState(0);\n const [cornerHeight, setCornerHeight] = React2.useState(0);\n const [scrollbarXEnabled, setScrollbarXEnabled] = React2.useState(false);\n const [scrollbarYEnabled, setScrollbarYEnabled] = React2.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setScrollArea(node));\n const direction = useDirection(dir);\n return /* @__PURE__ */ jsx(\n ScrollAreaProvider,\n {\n scope: __scopeScrollArea,\n type,\n dir: direction,\n scrollHideDelay,\n scrollArea,\n viewport,\n onViewportChange: setViewport,\n content,\n onContentChange: setContent,\n scrollbarX,\n onScrollbarXChange: setScrollbarX,\n scrollbarXEnabled,\n onScrollbarXEnabledChange: setScrollbarXEnabled,\n scrollbarY,\n onScrollbarYChange: setScrollbarY,\n scrollbarYEnabled,\n onScrollbarYEnabledChange: setScrollbarYEnabled,\n onCornerWidthChange: setCornerWidth,\n onCornerHeightChange: setCornerHeight,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n ...scrollAreaProps,\n ref: composedRefs,\n style: {\n position: \"relative\",\n // Pass corner sizes as CSS vars to reduce re-renders of context consumers\n [\"--radix-scroll-area-corner-width\"]: cornerWidth + \"px\",\n [\"--radix-scroll-area-corner-height\"]: cornerHeight + \"px\",\n ...props.style\n }\n }\n )\n }\n );\n }\n);\nScrollArea.displayName = SCROLL_AREA_NAME;\nvar VIEWPORT_NAME = \"ScrollAreaViewport\";\nvar ScrollAreaViewport = React2.forwardRef(\n (props, forwardedRef) => {\n const { __scopeScrollArea, children, nonce, ...viewportProps } = props;\n const context = useScrollAreaContext(VIEWPORT_NAME, __scopeScrollArea);\n const ref = React2.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onViewportChange);\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n \"style\",\n {\n dangerouslySetInnerHTML: {\n __html: `[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}`\n },\n nonce\n }\n ),\n /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-radix-scroll-area-viewport\": \"\",\n ...viewportProps,\n ref: composedRefs,\n style: {\n /**\n * We don't support `visible` because the intention is to have at least one scrollbar\n * if this component is used and `visible` will behave like `auto` in that case\n * https://developer.mozilla.org/en-US/docs/Web/CSS/overflow#description\n *\n * We don't handle `auto` because the intention is for the native implementation\n * to be hidden if using this component. We just want to ensure the node is scrollable\n * so could have used either `scroll` or `auto` here. We picked `scroll` to prevent\n * the browser from having to work out whether to render native scrollbars or not,\n * we tell it to with the intention of hiding them in CSS.\n */\n overflowX: context.scrollbarXEnabled ? \"scroll\" : \"hidden\",\n overflowY: context.scrollbarYEnabled ? \"scroll\" : \"hidden\",\n ...props.style\n },\n children: /* @__PURE__ */ jsx(\"div\", { ref: context.onContentChange, style: { minWidth: \"100%\", display: \"table\" }, children })\n }\n )\n ] });\n }\n);\nScrollAreaViewport.displayName = VIEWPORT_NAME;\nvar SCROLLBAR_NAME = \"ScrollAreaScrollbar\";\nvar ScrollAreaScrollbar = React2.forwardRef(\n (props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { onScrollbarXEnabledChange, onScrollbarYEnabledChange } = context;\n const isHorizontal = props.orientation === \"horizontal\";\n React2.useEffect(() => {\n isHorizontal ? onScrollbarXEnabledChange(true) : onScrollbarYEnabledChange(true);\n return () => {\n isHorizontal ? onScrollbarXEnabledChange(false) : onScrollbarYEnabledChange(false);\n };\n }, [isHorizontal, onScrollbarXEnabledChange, onScrollbarYEnabledChange]);\n return context.type === \"hover\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarHover, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"scroll\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarScroll, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"auto\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarAuto, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"always\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarVisible, { ...scrollbarProps, ref: forwardedRef }) : null;\n }\n);\nScrollAreaScrollbar.displayName = SCROLLBAR_NAME;\nvar ScrollAreaScrollbarHover = React2.forwardRef((props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [visible, setVisible] = React2.useState(false);\n React2.useEffect(() => {\n const scrollArea = context.scrollArea;\n let hideTimer = 0;\n if (scrollArea) {\n const handlePointerEnter = () => {\n window.clearTimeout(hideTimer);\n setVisible(true);\n };\n const handlePointerLeave = () => {\n hideTimer = window.setTimeout(() => setVisible(false), context.scrollHideDelay);\n };\n scrollArea.addEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.addEventListener(\"pointerleave\", handlePointerLeave);\n return () => {\n window.clearTimeout(hideTimer);\n scrollArea.removeEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.removeEventListener(\"pointerleave\", handlePointerLeave);\n };\n }\n }, [context.scrollArea, context.scrollHideDelay]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarAuto,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n});\nvar ScrollAreaScrollbarScroll = React2.forwardRef((props, forwardedRef) => {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const isHorizontal = props.orientation === \"horizontal\";\n const debounceScrollEnd = useDebounceCallback(() => send(\"SCROLL_END\"), 100);\n const [state, send] = useStateMachine(\"hidden\", {\n hidden: {\n SCROLL: \"scrolling\"\n },\n scrolling: {\n SCROLL_END: \"idle\",\n POINTER_ENTER: \"interacting\"\n },\n interacting: {\n SCROLL: \"interacting\",\n POINTER_LEAVE: \"idle\"\n },\n idle: {\n HIDE: \"hidden\",\n SCROLL: \"scrolling\",\n POINTER_ENTER: \"interacting\"\n }\n });\n React2.useEffect(() => {\n if (state === \"idle\") {\n const hideTimer = window.setTimeout(() => send(\"HIDE\"), context.scrollHideDelay);\n return () => window.clearTimeout(hideTimer);\n }\n }, [state, context.scrollHideDelay, send]);\n React2.useEffect(() => {\n const viewport = context.viewport;\n const scrollDirection = isHorizontal ? \"scrollLeft\" : \"scrollTop\";\n if (viewport) {\n let prevScrollPos = viewport[scrollDirection];\n const handleScroll = () => {\n const scrollPos = viewport[scrollDirection];\n const hasScrollInDirectionChanged = prevScrollPos !== scrollPos;\n if (hasScrollInDirectionChanged) {\n send(\"SCROLL\");\n debounceScrollEnd();\n }\n prevScrollPos = scrollPos;\n };\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [context.viewport, isHorizontal, send, debounceScrollEnd]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || state !== \"hidden\", children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": state === \"hidden\" ? \"hidden\" : \"visible\",\n ...scrollbarProps,\n ref: forwardedRef,\n onPointerEnter: composeEventHandlers(props.onPointerEnter, () => send(\"POINTER_ENTER\")),\n onPointerLeave: composeEventHandlers(props.onPointerLeave, () => send(\"POINTER_LEAVE\"))\n }\n ) });\n});\nvar ScrollAreaScrollbarAuto = React2.forwardRef((props, forwardedRef) => {\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { forceMount, ...scrollbarProps } = props;\n const [visible, setVisible] = React2.useState(false);\n const isHorizontal = props.orientation === \"horizontal\";\n const handleResize = useDebounceCallback(() => {\n if (context.viewport) {\n const isOverflowX = context.viewport.offsetWidth < context.viewport.scrollWidth;\n const isOverflowY = context.viewport.offsetHeight < context.viewport.scrollHeight;\n setVisible(isHorizontal ? isOverflowX : isOverflowY);\n }\n }, 10);\n useResizeObserver(context.viewport, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n});\nvar ScrollAreaScrollbarVisible = React2.forwardRef((props, forwardedRef) => {\n const { orientation = \"vertical\", ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const thumbRef = React2.useRef(null);\n const pointerOffsetRef = React2.useRef(0);\n const [sizes, setSizes] = React2.useState({\n content: 0,\n viewport: 0,\n scrollbar: { size: 0, paddingStart: 0, paddingEnd: 0 }\n });\n const thumbRatio = getThumbRatio(sizes.viewport, sizes.content);\n const commonProps = {\n ...scrollbarProps,\n sizes,\n onSizesChange: setSizes,\n hasThumb: Boolean(thumbRatio > 0 && thumbRatio < 1),\n onThumbChange: (thumb) => thumbRef.current = thumb,\n onThumbPointerUp: () => pointerOffsetRef.current = 0,\n onThumbPointerDown: (pointerPos) => pointerOffsetRef.current = pointerPos\n };\n function getScrollPosition(pointerPos, dir) {\n return getScrollPositionFromPointer(pointerPos, pointerOffsetRef.current, sizes, dir);\n }\n if (orientation === \"horizontal\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarX,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollLeft;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes, context.dir);\n thumbRef.current.style.transform = `translate3d(${offset}px, 0, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollLeft = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) {\n context.viewport.scrollLeft = getScrollPosition(pointerPos, context.dir);\n }\n }\n }\n );\n }\n if (orientation === \"vertical\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarY,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollTop;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes);\n thumbRef.current.style.transform = `translate3d(0, ${offset}px, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollTop = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) context.viewport.scrollTop = getScrollPosition(pointerPos);\n }\n }\n );\n }\n return null;\n});\nvar ScrollAreaScrollbarX = React2.forwardRef((props, forwardedRef) => {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarXChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"horizontal\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n bottom: 0,\n left: context.dir === \"rtl\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n right: context.dir === \"ltr\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n [\"--radix-scroll-area-thumb-width\"]: getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.x),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.x),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollLeft + event.deltaX;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollWidth,\n viewport: context.viewport.offsetWidth,\n scrollbar: {\n size: ref.current.clientWidth,\n paddingStart: toInt(computedStyle.paddingLeft),\n paddingEnd: toInt(computedStyle.paddingRight)\n }\n });\n }\n }\n }\n );\n});\nvar ScrollAreaScrollbarY = React2.forwardRef((props, forwardedRef) => {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarYChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"vertical\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n top: 0,\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: \"var(--radix-scroll-area-corner-height)\",\n [\"--radix-scroll-area-thumb-height\"]: getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.y),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.y),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollTop + event.deltaY;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollHeight,\n viewport: context.viewport.offsetHeight,\n scrollbar: {\n size: ref.current.clientHeight,\n paddingStart: toInt(computedStyle.paddingTop),\n paddingEnd: toInt(computedStyle.paddingBottom)\n }\n });\n }\n }\n }\n );\n});\nvar [ScrollbarProvider, useScrollbarContext] = createScrollAreaContext(SCROLLBAR_NAME);\nvar ScrollAreaScrollbarImpl = React2.forwardRef((props, forwardedRef) => {\n const {\n __scopeScrollArea,\n sizes,\n hasThumb,\n onThumbChange,\n onThumbPointerUp,\n onThumbPointerDown,\n onThumbPositionChange,\n onDragScroll,\n onWheelScroll,\n onResize,\n ...scrollbarProps\n } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, __scopeScrollArea);\n const [scrollbar, setScrollbar] = React2.useState(null);\n const composeRefs = useComposedRefs(forwardedRef, (node) => setScrollbar(node));\n const rectRef = React2.useRef(null);\n const prevWebkitUserSelectRef = React2.useRef(\"\");\n const viewport = context.viewport;\n const maxScrollPos = sizes.content - sizes.viewport;\n const handleWheelScroll = useCallbackRef(onWheelScroll);\n const handleThumbPositionChange = useCallbackRef(onThumbPositionChange);\n const handleResize = useDebounceCallback(onResize, 10);\n function handleDragScroll(event) {\n if (rectRef.current) {\n const x = event.clientX - rectRef.current.left;\n const y = event.clientY - rectRef.current.top;\n onDragScroll({ x, y });\n }\n }\n React2.useEffect(() => {\n const handleWheel = (event) => {\n const element = event.target;\n const isScrollbarWheel = scrollbar?.contains(element);\n if (isScrollbarWheel) handleWheelScroll(event, maxScrollPos);\n };\n document.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => document.removeEventListener(\"wheel\", handleWheel, { passive: false });\n }, [viewport, scrollbar, maxScrollPos, handleWheelScroll]);\n React2.useEffect(handleThumbPositionChange, [sizes, handleThumbPositionChange]);\n useResizeObserver(scrollbar, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(\n ScrollbarProvider,\n {\n scope: __scopeScrollArea,\n scrollbar,\n hasThumb,\n onThumbChange: useCallbackRef(onThumbChange),\n onThumbPointerUp: useCallbackRef(onThumbPointerUp),\n onThumbPositionChange: handleThumbPositionChange,\n onThumbPointerDown: useCallbackRef(onThumbPointerDown),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...scrollbarProps,\n ref: composeRefs,\n style: { position: \"absolute\", ...scrollbarProps.style },\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n const mainPointer = 0;\n if (event.button === mainPointer) {\n const element = event.target;\n element.setPointerCapture(event.pointerId);\n rectRef.current = scrollbar.getBoundingClientRect();\n prevWebkitUserSelectRef.current = document.body.style.webkitUserSelect;\n document.body.style.webkitUserSelect = \"none\";\n if (context.viewport) context.viewport.style.scrollBehavior = \"auto\";\n handleDragScroll(event);\n }\n }),\n onPointerMove: composeEventHandlers(props.onPointerMove, handleDragScroll),\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n const element = event.target;\n if (element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n document.body.style.webkitUserSelect = prevWebkitUserSelectRef.current;\n if (context.viewport) context.viewport.style.scrollBehavior = \"\";\n rectRef.current = null;\n })\n }\n )\n }\n );\n});\nvar THUMB_NAME = \"ScrollAreaThumb\";\nvar ScrollAreaThumb = React2.forwardRef(\n (props, forwardedRef) => {\n const { forceMount, ...thumbProps } = props;\n const scrollbarContext = useScrollbarContext(THUMB_NAME, props.__scopeScrollArea);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || scrollbarContext.hasThumb, children: /* @__PURE__ */ jsx(ScrollAreaThumbImpl, { ref: forwardedRef, ...thumbProps }) });\n }\n);\nvar ScrollAreaThumbImpl = React2.forwardRef(\n (props, forwardedRef) => {\n const { __scopeScrollArea, style, ...thumbProps } = props;\n const scrollAreaContext = useScrollAreaContext(THUMB_NAME, __scopeScrollArea);\n const scrollbarContext = useScrollbarContext(THUMB_NAME, __scopeScrollArea);\n const { onThumbPositionChange } = scrollbarContext;\n const composedRef = useComposedRefs(\n forwardedRef,\n (node) => scrollbarContext.onThumbChange(node)\n );\n const removeUnlinkedScrollListenerRef = React2.useRef(void 0);\n const debounceScrollEnd = useDebounceCallback(() => {\n if (removeUnlinkedScrollListenerRef.current) {\n removeUnlinkedScrollListenerRef.current();\n removeUnlinkedScrollListenerRef.current = void 0;\n }\n }, 100);\n React2.useEffect(() => {\n const viewport = scrollAreaContext.viewport;\n if (viewport) {\n const handleScroll = () => {\n debounceScrollEnd();\n if (!removeUnlinkedScrollListenerRef.current) {\n const listener = addUnlinkedScrollListener(viewport, onThumbPositionChange);\n removeUnlinkedScrollListenerRef.current = listener;\n onThumbPositionChange();\n }\n };\n onThumbPositionChange();\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [scrollAreaContext.viewport, debounceScrollEnd, onThumbPositionChange]);\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": scrollbarContext.hasThumb ? \"visible\" : \"hidden\",\n ...thumbProps,\n ref: composedRef,\n style: {\n width: \"var(--radix-scroll-area-thumb-width)\",\n height: \"var(--radix-scroll-area-thumb-height)\",\n ...style\n },\n onPointerDownCapture: composeEventHandlers(props.onPointerDownCapture, (event) => {\n const thumb = event.target;\n const thumbRect = thumb.getBoundingClientRect();\n const x = event.clientX - thumbRect.left;\n const y = event.clientY - thumbRect.top;\n scrollbarContext.onThumbPointerDown({ x, y });\n }),\n onPointerUp: composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp)\n }\n );\n }\n);\nScrollAreaThumb.displayName = THUMB_NAME;\nvar CORNER_NAME = \"ScrollAreaCorner\";\nvar ScrollAreaCorner = React2.forwardRef(\n (props, forwardedRef) => {\n const context = useScrollAreaContext(CORNER_NAME, props.__scopeScrollArea);\n const hasBothScrollbarsVisible = Boolean(context.scrollbarX && context.scrollbarY);\n const hasCorner = context.type !== \"scroll\" && hasBothScrollbarsVisible;\n return hasCorner ? /* @__PURE__ */ jsx(ScrollAreaCornerImpl, { ...props, ref: forwardedRef }) : null;\n }\n);\nScrollAreaCorner.displayName = CORNER_NAME;\nvar ScrollAreaCornerImpl = React2.forwardRef((props, forwardedRef) => {\n const { __scopeScrollArea, ...cornerProps } = props;\n const context = useScrollAreaContext(CORNER_NAME, __scopeScrollArea);\n const [width, setWidth] = React2.useState(0);\n const [height, setHeight] = React2.useState(0);\n const hasSize = Boolean(width && height);\n useResizeObserver(context.scrollbarX, () => {\n const height2 = context.scrollbarX?.offsetHeight || 0;\n context.onCornerHeightChange(height2);\n setHeight(height2);\n });\n useResizeObserver(context.scrollbarY, () => {\n const width2 = context.scrollbarY?.offsetWidth || 0;\n context.onCornerWidthChange(width2);\n setWidth(width2);\n });\n return hasSize ? /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...cornerProps,\n ref: forwardedRef,\n style: {\n width,\n height,\n position: \"absolute\",\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: 0,\n ...props.style\n }\n }\n ) : null;\n});\nfunction toInt(value) {\n return value ? parseInt(value, 10) : 0;\n}\nfunction getThumbRatio(viewportSize, contentSize) {\n const ratio = viewportSize / contentSize;\n return isNaN(ratio) ? 0 : ratio;\n}\nfunction getThumbSize(sizes) {\n const ratio = getThumbRatio(sizes.viewport, sizes.content);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const thumbSize = (sizes.scrollbar.size - scrollbarPadding) * ratio;\n return Math.max(thumbSize, 18);\n}\nfunction getScrollPositionFromPointer(pointerPos, pointerOffset, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const thumbCenter = thumbSizePx / 2;\n const offset = pointerOffset || thumbCenter;\n const thumbOffsetFromEnd = thumbSizePx - offset;\n const minPointerPos = sizes.scrollbar.paddingStart + offset;\n const maxPointerPos = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - thumbOffsetFromEnd;\n const maxScrollPos = sizes.content - sizes.viewport;\n const scrollRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const interpolate = linearScale([minPointerPos, maxPointerPos], scrollRange);\n return interpolate(pointerPos);\n}\nfunction getThumbOffsetFromScroll(scrollPos, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const scrollbar = sizes.scrollbar.size - scrollbarPadding;\n const maxScrollPos = sizes.content - sizes.viewport;\n const maxThumbPos = scrollbar - thumbSizePx;\n const scrollClampRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const scrollWithoutMomentum = clamp(scrollPos, scrollClampRange);\n const interpolate = linearScale([0, maxScrollPos], [0, maxThumbPos]);\n return interpolate(scrollWithoutMomentum);\n}\nfunction linearScale(input, output) {\n return (value) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\nfunction isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos) {\n return scrollPos > 0 && scrollPos < maxScrollPos;\n}\nvar addUnlinkedScrollListener = (node, handler = () => {\n}) => {\n let prevPosition = { left: node.scrollLeft, top: node.scrollTop };\n let rAF = 0;\n (function loop() {\n const position = { left: node.scrollLeft, top: node.scrollTop };\n const isHorizontalScroll = prevPosition.left !== position.left;\n const isVerticalScroll = prevPosition.top !== position.top;\n if (isHorizontalScroll || isVerticalScroll) handler();\n prevPosition = position;\n rAF = window.requestAnimationFrame(loop);\n })();\n return () => window.cancelAnimationFrame(rAF);\n};\nfunction useDebounceCallback(callback, delay) {\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = React2.useRef(0);\n React2.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), []);\n return React2.useCallback(() => {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = window.setTimeout(handleCallback, delay);\n }, [handleCallback, delay]);\n}\nfunction useResizeObserver(element, onResize) {\n const handleResize = useCallbackRef(onResize);\n useLayoutEffect(() => {\n let rAF = 0;\n if (element) {\n const resizeObserver = new ResizeObserver(() => {\n cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(handleResize);\n });\n resizeObserver.observe(element);\n return () => {\n window.cancelAnimationFrame(rAF);\n resizeObserver.unobserve(element);\n };\n }\n }, [element, handleResize]);\n}\nvar Root = ScrollArea;\nvar Viewport = ScrollAreaViewport;\nvar Scrollbar = ScrollAreaScrollbar;\nvar Thumb = ScrollAreaThumb;\nvar Corner = ScrollAreaCorner;\nexport {\n Corner,\n Root,\n ScrollArea,\n ScrollAreaCorner,\n ScrollAreaScrollbar,\n ScrollAreaThumb,\n ScrollAreaViewport,\n Scrollbar,\n Thumb,\n Viewport,\n createScrollAreaScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as React from 'react';\nimport { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn('relative', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1 [&>div]:block!\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none p-px transition-colors select-none',\n orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent',\n orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent',\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","'use client';\n\nimport Link from 'next/link';\nimport type { Route } from 'next';\nimport type { LucideIcon } from 'lucide-react';\nimport { SidebarMenuItem, SidebarMenuButton } from '@/components/ui/sidebar';\nimport { useSoundAction } from '@/hooks/use-sound-action';\n\nexport interface SidebarNavItemProps {\n icon: LucideIcon;\n label: string;\n href: string;\n active?: boolean;\n}\n\nexport function SidebarNavItem({ icon: Icon, label, href, active = false }: SidebarNavItemProps) {\n const navigateSound = useSoundAction('navigate');\n\n return (\n <SidebarMenuItem data-testid=\"sidebar-nav-item\">\n <SidebarMenuButton asChild isActive={active} tooltip={label}>\n <Link href={href as Route} onClick={() => navigateSound.play()}>\n <Icon />\n <span>{label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n}\n","'use client';\n\nimport { PanelLeft } from 'lucide-react';\nimport { useSidebar } from '@/components/ui/sidebar';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\nimport { useSoundAction } from '@/hooks/use-sound-action';\n\nexport interface SidebarCollapseToggleProps {\n className?: string;\n}\n\nexport function SidebarCollapseToggle({ className }: SidebarCollapseToggleProps) {\n const { toggleSidebar, open } = useSidebar();\n const expandSound = useSoundAction('expand');\n const collapseSound = useSoundAction('collapse');\n const label = open ? 'Collapse sidebar' : 'Expand sidebar';\n\n const handleClick = () => {\n // Play sound based on current state (before toggle)\n if (open) {\n collapseSound.play();\n } else {\n expandSound.play();\n }\n toggleSidebar();\n };\n\n return (\n <div className={cn('flex', className)}>\n <Button\n data-testid=\"sidebar-collapse-toggle\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 cursor-pointer group-data-[collapsible=icon]:size-8!\"\n onClick={handleClick}\n aria-label={label}\n >\n <PanelLeft className=\"size-4\" />\n </Button>\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { compareVersions } from '@/lib/compare-versions';\n\nexport interface NpmVersionCheckResult {\n /** Latest version on npm, or null if not yet fetched / error */\n latest: string | null;\n /** Whether a newer version is available on npm */\n updateAvailable: boolean;\n /** True while the fetch is in progress */\n loading: boolean;\n}\n\nexport function useNpmVersionCheck(currentVersion: string): NpmVersionCheckResult {\n const [latest, setLatest] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n\n async function check() {\n try {\n const res = await fetch('/api/npm-version');\n if (!res.ok) return;\n const data = (await res.json()) as { latest?: string | null };\n if (!cancelled && data.latest) {\n setLatest(data.latest);\n }\n } catch {\n // Silently fail — version check is non-critical\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n check();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const updateAvailable = latest !== null && compareVersions(latest, currentVersion) > 0;\n\n return { latest, updateAvailable, loading };\n}\n","'use client';\n\nimport { useCallback, useRef, useState } from 'react';\n\nexport type UpgradeStatus =\n | 'idle'\n | 'upgrading'\n | 'restarting'\n | 'upgraded'\n | 'up-to-date'\n | 'error';\n\n/** How often to poll the server during restart (ms). */\nconst RESTART_POLL_MS = 500;\n/** Maximum time to wait for the server to come back after restart (ms). */\nconst RESTART_TIMEOUT_MS = 30_000;\n\nexport interface CliUpgradeState {\n status: UpgradeStatus;\n output: string;\n errorMessage?: string;\n}\n\nexport interface CliUpgradeActions {\n startUpgrade: () => void;\n}\n\n/**\n * Poll the server until it responds, then reload the page.\n */\nfunction waitForServerAndReload(timeoutMs: number, pollMs: number): void {\n const deadline = Date.now() + timeoutMs;\n\n const poll = () => {\n if (Date.now() > deadline) return;\n\n fetch('/api/version', { method: 'GET', cache: 'no-store' })\n .then((res) => {\n if (res.ok) {\n window.location.reload();\n } else {\n setTimeout(poll, pollMs);\n }\n })\n .catch(() => {\n setTimeout(poll, pollMs);\n });\n };\n\n // Brief initial delay to let the old server shut down\n setTimeout(poll, pollMs);\n}\n\nexport function useCliUpgrade(): CliUpgradeState & CliUpgradeActions {\n const [status, setStatus] = useState<UpgradeStatus>('idle');\n const [output, setOutput] = useState('');\n const [errorMessage, setErrorMessage] = useState<string | undefined>();\n const abortRef = useRef<AbortController | null>(null);\n const restartingRef = useRef(false);\n\n const startUpgrade = useCallback(() => {\n if (status === 'upgrading' || status === 'restarting') return;\n\n setStatus('upgrading');\n setOutput('');\n setErrorMessage(undefined);\n restartingRef.current = false;\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n fetch('/api/cli-upgrade', { method: 'POST', signal: controller.signal })\n .then(async (response) => {\n if (!response.ok || !response.body) {\n setStatus('error');\n setErrorMessage(`Server returned ${response.status}`);\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('event: restarting')) {\n restartingRef.current = true;\n setStatus('restarting');\n waitForServerAndReload(RESTART_TIMEOUT_MS, RESTART_POLL_MS);\n continue;\n }\n if (line.startsWith('event: done')) {\n // Next data line contains the final result\n continue;\n }\n if (line.startsWith('data: ')) {\n const payload = line.slice(6);\n // Try to parse as final JSON result\n try {\n const result = JSON.parse(payload) as {\n status: string;\n errorMessage?: string;\n };\n if (result.status === 'upgraded') {\n setStatus('upgraded');\n } else if (result.status === 'up-to-date') {\n setStatus('up-to-date');\n } else if (result.status === 'error') {\n setStatus('error');\n setErrorMessage(result.errorMessage);\n }\n } catch {\n // Regular output line\n setOutput((prev) => prev + payload);\n }\n }\n }\n }\n })\n .catch((err: unknown) => {\n // If we're in restarting state, the connection dropping is expected\n if (restartingRef.current) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setStatus('error');\n setErrorMessage(err instanceof Error ? err.message : 'Upgrade failed');\n });\n\n return () => {\n controller.abort();\n };\n }, [status]);\n\n return { status, output, errorMessage, startUpgrade };\n}\n","'use client';\n\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useNpmVersionCheck } from '@/hooks/use-npm-version-check';\nimport { useCliUpgrade } from '@/hooks/use-cli-upgrade';\n\nexport interface VersionBadgeProps {\n version: string;\n branch?: string;\n commitHash?: string;\n isDev?: boolean;\n packageName?: string;\n description?: string;\n instancePath?: string;\n}\n\nexport function VersionBadge({\n version,\n branch,\n commitHash,\n isDev = false,\n packageName = '@shepai/cli',\n description,\n instancePath,\n}: VersionBadgeProps) {\n const shortHash = commitHash?.slice(0, 7);\n const { latest, updateAvailable } = useNpmVersionCheck(version);\n const { status: upgradeStatus, startUpgrade } = useCliUpgrade();\n\n // In dev mode show \"1.92.2-dev\", in production show \"v1.92.2\"\n const displayVersion = isDev ? `${version}-dev` : `v${version}`;\n\n const isUpgrading = upgradeStatus === 'upgrading';\n const isRestarting = upgradeStatus === 'restarting';\n const didUpgrade = upgradeStatus === 'upgraded';\n const upgradeError = upgradeStatus === 'error';\n\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"text-muted-foreground/80 hover:text-muted-foreground relative cursor-default text-[11px] leading-tight transition-colors\"\n data-testid=\"version-label\"\n >\n {displayVersion}\n {updateAvailable && !didUpgrade && !isRestarting ? (\n <span\n className=\"absolute -top-0.5 -right-1.5 size-1.5 rounded-full bg-emerald-400\"\n data-testid=\"update-dot\"\n />\n ) : null}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-[280px] space-y-1 p-3 text-left\">\n <div className=\"mb-1.5 text-xs font-semibold\">{packageName}</div>\n {description ? (\n <div className=\"text-[10px] leading-snug opacity-70\">{description}</div>\n ) : null}\n <div className=\"border-t border-white/10 pt-1.5\">\n <Row label=\"Version\" value={displayVersion} />\n {isDev && branch ? <Row label=\"Branch\" value={branch} /> : null}\n {isDev && shortHash ? <Row label=\"Commit\" value={shortHash} mono /> : null}\n {isDev && instancePath ? <Row label=\"Path\" value={instancePath} mono /> : null}\n {latest ? (\n <Row label=\"Latest\" value={`v${latest}`} highlight={updateAvailable} />\n ) : null}\n </div>\n {isRestarting ? (\n <div className=\"border-t border-white/10 pt-1.5\">\n <span\n className=\"text-[10px] font-medium text-emerald-400\"\n data-testid=\"upgrade-restarting\"\n >\n Restarting...\n </span>\n </div>\n ) : didUpgrade ? (\n <div className=\"border-t border-white/10 pt-1.5\">\n <span\n className=\"text-[10px] font-medium text-emerald-400\"\n data-testid=\"upgrade-success\"\n >\n Upgraded successfully\n </span>\n </div>\n ) : upgradeError ? (\n <div className=\"border-t border-white/10 pt-1.5\">\n <span className=\"text-[10px] font-medium text-red-400\" data-testid=\"upgrade-error\">\n Upgrade failed\n </span>\n </div>\n ) : updateAvailable ? (\n <div className=\"border-t border-white/10 pt-1.5\">\n <button\n type=\"button\"\n onClick={startUpgrade}\n disabled={isUpgrading || isRestarting}\n className=\"inline-flex items-center gap-1 text-[10px] font-medium text-emerald-400 transition-colors hover:text-emerald-300 disabled:opacity-50\"\n data-testid=\"upgrade-button\"\n >\n {isUpgrading\n ? 'Upgrading...'\n : isRestarting\n ? 'Restarting...'\n : `Upgrade to v${latest}`}\n </button>\n </div>\n ) : null}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nfunction Row({\n label,\n value,\n highlight,\n mono,\n}: {\n label: string;\n value: string;\n highlight?: boolean;\n mono?: boolean;\n}) {\n return (\n <div className=\"flex items-center justify-between gap-4 text-[10px]\">\n <span className=\"opacity-60\">{label}</span>\n <span\n className={[\n highlight ? 'font-medium text-emerald-400' : '',\n mono || !highlight ? 'font-mono' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {value}\n </span>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useEffect, startTransition } from 'react';\n\ninterface ElapsedTimeProps {\n startedAt: number;\n}\n\nexport function formatElapsed(elapsedMs: number): string {\n const totalSeconds = Math.floor(elapsedMs / 1000);\n\n if (totalSeconds >= 3600) {\n const hours = Math.floor(totalSeconds / 3600);\n return `${hours}h`;\n }\n\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n}\n\nexport function ElapsedTime({ startedAt }: ElapsedTimeProps) {\n const [elapsed, setElapsed] = useState(() => Date.now() - startedAt);\n\n useEffect(() => {\n const id = setInterval(() => {\n startTransition(() => setElapsed(Date.now() - startedAt));\n }, 1000);\n\n return () => clearInterval(id);\n }, [startedAt]);\n\n return (\n <span data-testid=\"elapsed-time\" className=\"tabular-nums\">\n {formatElapsed(elapsed)}\n </span>\n );\n}\n","import { CircleAlert, Loader2, CircleCheck, Ban, CircleX, Clock } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport type FeatureStatus =\n | 'action-needed'\n | 'in-progress'\n | 'pending'\n | 'blocked'\n | 'error'\n | 'done';\n\nexport interface FeatureStatusConfig {\n icon: LucideIcon;\n iconClass: string;\n bgClass: string;\n label: string;\n}\n\nexport const featureStatusConfig: Record<FeatureStatus, FeatureStatusConfig> = {\n 'action-needed': {\n icon: CircleAlert,\n iconClass: 'text-amber-500',\n bgClass: 'bg-amber-500/10',\n label: 'Action Needed',\n },\n 'in-progress': {\n icon: Loader2,\n iconClass: 'text-blue-500 animate-spin',\n bgClass: 'bg-blue-500/10',\n label: 'In Progress',\n },\n pending: {\n icon: Clock,\n iconClass: 'text-slate-400',\n bgClass: 'bg-slate-400/10',\n label: 'Pending',\n },\n blocked: {\n icon: Ban,\n iconClass: 'text-gray-400',\n bgClass: 'bg-gray-400/10',\n label: 'Blocked',\n },\n error: {\n icon: CircleX,\n iconClass: 'text-red-500',\n bgClass: 'bg-red-500/10',\n label: 'Error',\n },\n done: {\n icon: CircleCheck,\n iconClass: 'text-emerald-500',\n bgClass: 'bg-emerald-500/10',\n label: 'Done',\n },\n};\n\nexport const featureStatusOrder: FeatureStatus[] = [\n 'action-needed',\n 'error',\n 'blocked',\n 'in-progress',\n 'pending',\n 'done',\n];\n","'use client';\n\nimport * as React from 'react';\nimport { XIcon } from 'lucide-react';\nimport { Dialog as SheetPrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left';\n showCloseButton?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500',\n side === 'right' &&\n 'data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm',\n side === 'left' &&\n 'data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm',\n side === 'top' &&\n 'data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b',\n side === 'bottom' &&\n 'data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t',\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton ? (\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n ) : null}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn('flex flex-col gap-1.5 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn('mt-auto flex flex-col gap-2 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn('text-foreground font-semibold', className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { type Theme, THEME_STORAGE_KEY } from '@/types/theme';\n\n/**\n * Hook to manage theme state with localStorage persistence\n * and system preference detection.\n */\nexport function useTheme() {\n const [theme, setTheme] = useState<Theme>('system');\n const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>('light');\n\n // Get the system preference\n const getSystemTheme = useCallback((): 'light' | 'dark' => {\n if (typeof window === 'undefined') {\n return 'light';\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }, []);\n\n // Resolve the actual theme based on current setting\n const resolveTheme = useCallback(\n (currentTheme: Theme): 'light' | 'dark' => {\n if (currentTheme === 'system') {\n return getSystemTheme();\n }\n return currentTheme;\n },\n [getSystemTheme]\n );\n\n // Apply theme to document\n const applyTheme = useCallback((resolved: 'light' | 'dark') => {\n if (typeof document === 'undefined') {\n return;\n }\n const root = document.documentElement;\n root.classList.remove('light', 'dark');\n root.classList.add(resolved);\n setResolvedTheme(resolved);\n }, []);\n\n // Set theme and persist to localStorage\n const setThemeAndPersist = useCallback(\n (newTheme: Theme) => {\n setTheme(newTheme);\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(THEME_STORAGE_KEY, newTheme);\n }\n const resolved = resolveTheme(newTheme);\n applyTheme(resolved);\n },\n [resolveTheme, applyTheme]\n );\n\n // Initialize theme from localStorage or system preference\n useEffect(() => {\n const stored = localStorage.getItem(THEME_STORAGE_KEY) as Theme | null;\n const initialTheme = stored ?? 'system';\n setTheme(initialTheme);\n const resolved = resolveTheme(initialTheme);\n applyTheme(resolved);\n }, [resolveTheme, applyTheme]);\n\n // Listen for system preference changes\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const handleChange = () => {\n if (theme === 'system') {\n const resolved = resolveTheme('system');\n applyTheme(resolved);\n }\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [theme, resolveTheme, applyTheme]);\n\n return {\n theme,\n resolvedTheme,\n setTheme: setThemeAndPersist,\n };\n}\n","'use client';\n\nimport { SidebarGroup } from '@/components/ui/sidebar';\nimport { cn } from '@/lib/utils';\n\nexport interface SidebarSectionHeaderProps {\n label: string;\n className?: string;\n}\n\nexport function SidebarSectionHeader({ label, className }: SidebarSectionHeaderProps) {\n return (\n <SidebarGroup data-testid=\"sidebar-section-header\" className={cn('px-2 py-1', className)}>\n <div className=\"text-sidebar-foreground flex h-7 w-full shrink-0 items-center px-2 text-sm font-medium\">\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </div>\n </SidebarGroup>\n );\n}\n","'use client';\n\nimport { useState, useEffect } from 'react';\n\n/**\n * Defers mount/unmount of content to allow opacity transitions.\n * When expanding: mounts immediately, then sets visible on next frame.\n * When collapsing: hides immediately, then unmounts after `ms` delay.\n */\nexport function useDeferredMount(isCollapsed: boolean, ms: number) {\n const [mounted, setMounted] = useState(!isCollapsed);\n const [visible, setVisible] = useState(!isCollapsed);\n\n useEffect(() => {\n if (!isCollapsed) {\n setMounted(true);\n // delay visibility by one frame so the element mounts at opacity-0 first\n const raf = requestAnimationFrame(() => setVisible(true));\n return () => cancelAnimationFrame(raf);\n }\n setVisible(false);\n const t = window.setTimeout(() => setMounted(false), ms);\n return () => window.clearTimeout(t);\n }, [isCollapsed, ms]);\n\n return { mounted, visible };\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nexport interface VersionData {\n version: string;\n packageName: string;\n description: string;\n branch: string;\n commitHash: string;\n instancePath: string;\n isDev: boolean;\n}\n\nconst DEFAULT_VERSION_DATA: VersionData = {\n version: 'unknown',\n packageName: '@shepai/cli',\n description: 'Autonomous AI Native SDLC Platform',\n branch: '',\n commitHash: '',\n instancePath: '',\n isDev: false,\n};\n\n/**\n * Fetches runtime version info from the server API.\n *\n * NEXT_PUBLIC_* env vars are inlined at build time for client components,\n * so they can show a stale version after a CLI upgrade. This hook fetches\n * the version from a server-side API route that reads the env vars at runtime.\n */\nexport function useVersion(): VersionData {\n const [data, setData] = useState<VersionData>(DEFAULT_VERSION_DATA);\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchVersion() {\n try {\n const res = await fetch('/api/version');\n if (!res.ok) return;\n const json = (await res.json()) as VersionData;\n if (!cancelled) {\n setData(json);\n }\n } catch {\n // Version fetch is non-critical — keep defaults\n }\n }\n\n fetchVersion();\n return () => {\n cancelled = true;\n };\n }, []);\n\n return data;\n}\n","'use client';\n\nimport { usePathname } from 'next/navigation';\nimport { Home, Moon, Sun, Volume2, VolumeOff, Wrench, Puzzle, Settings } from 'lucide-react';\nimport {\n Sidebar,\n SidebarHeader,\n SidebarContent,\n SidebarFooter,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n SidebarRail,\n useSidebar,\n} from '@/components/ui/sidebar';\n\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { SidebarNavItem } from '@/components/common/sidebar-nav-item';\nimport { SidebarCollapseToggle } from '@/components/common/sidebar-collapse-toggle';\nimport { ShepLogo } from '@/components/common/shep-logo';\nimport { VersionBadge } from '@/components/common/version-badge';\nimport { FeatureListItem } from '@/components/common/feature-list-item';\nimport { useSoundEnabled } from '@/hooks/use-sound-enabled';\nimport { useTheme } from '@/hooks/useTheme';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { FeatureStatusGroup } from '@/components/common/feature-status-group';\nimport { SidebarSectionHeader } from '@/components/common/sidebar-section-header';\nimport { featureStatusConfig, featureStatusOrder } from '@/components/common/feature-status-config';\nimport type { FeatureStatus } from '@/components/common/feature-status-config';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useDeferredMount } from '@/hooks/use-deferred-mount';\nimport { useVersion } from '@/hooks/use-version';\nimport type { FeatureFlagsState } from '@/lib/feature-flags';\n\nexport interface FeatureItem {\n featureId: string;\n name: string;\n status: FeatureStatus;\n startedAt?: number;\n duration?: string;\n agentType?: string;\n modelId?: string;\n}\n\nexport interface AppSidebarProps {\n features: FeatureItem[];\n featureFlags: FeatureFlagsState;\n\n onFeatureClick?: (featureId: string) => void;\n}\n\nexport function AppSidebar({\n features,\n featureFlags,\n\n onFeatureClick,\n}: AppSidebarProps) {\n const pathname = usePathname();\n const { state } = useSidebar();\n const collapsed = state === 'collapsed';\n const { mounted: showExpanded, visible: expandedVisible } = useDeferredMount(collapsed, 200);\n const versionData = useVersion();\n const { enabled: soundEnabled, toggle: toggleSound } = useSoundEnabled();\n const { resolvedTheme, theme, setTheme } = useTheme();\n const toggleOnSound = useSoundAction('toggle-on');\n const toggleOffSound = useSoundAction('toggle-off');\n const clickSound = useSoundAction('navigate');\n\n const grouped = featureStatusOrder.map((key) => {\n const { label } = featureStatusConfig[key];\n const items = features.filter((f) => f.status === key);\n return { key, label, items };\n });\n\n return (\n <Sidebar data-testid=\"app-sidebar\" data-no-drawer-close collapsible=\"icon\">\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <div className=\"flex h-8 items-center group-data-[collapsible=icon]:justify-center\">\n {showExpanded ? (\n <div\n className={[\n 'flex min-w-0 flex-1 items-center gap-2 overflow-hidden px-2',\n 'transition-opacity duration-200 ease-out',\n expandedVisible ? 'opacity-100' : 'opacity-0',\n ].join(' ')}\n aria-hidden={!expandedVisible}\n >\n <ShepLogo\n className=\"shrink-0\"\n size={20}\n variant={versionData.isDev ? 'dev' : 'default'}\n />\n <span className=\"truncate text-sm font-semibold tracking-tight\">Shep</span>\n <VersionBadge\n version={versionData.version}\n branch={versionData.branch || undefined}\n commitHash={versionData.commitHash || undefined}\n isDev={versionData.isDev}\n packageName={versionData.packageName}\n description={versionData.description}\n instancePath={versionData.instancePath || undefined}\n />\n </div>\n ) : null}\n <SidebarCollapseToggle className=\"shrink-0 transition-all duration-200\" />\n </div>\n </SidebarMenuItem>\n\n <SidebarNavItem icon={Home} label=\"Control Center\" href=\"/\" active={pathname === '/'} />\n <SidebarNavItem\n icon={Wrench}\n label=\"Tools\"\n href=\"/tools\"\n active={pathname === '/tools'}\n />\n {featureFlags.skills ? (\n <SidebarNavItem\n icon={Puzzle}\n label=\"Skills\"\n href=\"/skills\"\n active={pathname === '/skills'}\n />\n ) : null}\n <SidebarNavItem\n icon={Settings}\n label=\"Settings\"\n href=\"/settings\"\n active={pathname === '/settings'}\n />\n </SidebarMenu>\n </SidebarHeader>\n\n <SidebarContent>\n {showExpanded ? (\n <div\n className={[\n 'flex min-h-0 flex-1 flex-col overflow-hidden transition-opacity duration-200 ease-out',\n '[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',\n expandedVisible ? 'opacity-100' : 'opacity-0',\n ].join(' ')}\n >\n <SidebarSectionHeader label=\"Features\" />\n <ScrollArea className=\"min-h-0 flex-1\">\n {grouped.map(({ key, label, items }) =>\n items.length > 0 ? (\n <FeatureStatusGroup key={key} label={label} count={items.length}>\n {items.map((feature) => (\n <FeatureListItem\n key={feature.featureId}\n name={feature.name}\n status={feature.status}\n startedAt={feature.startedAt}\n duration={feature.duration}\n agentType={feature.agentType}\n modelId={feature.modelId}\n onClick={\n onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined\n }\n />\n ))}\n </FeatureStatusGroup>\n ) : null\n )}\n </ScrollArea>\n </div>\n ) : null}\n </SidebarContent>\n\n <SidebarFooter className=\"border-t p-2\">\n <SidebarMenu>\n <SidebarMenuItem>\n <div className=\"flex items-center gap-1\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarMenuButton\n className=\"w-auto flex-none\"\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n const currentResolved = theme === 'system' ? resolvedTheme : theme;\n const goingToDark = currentResolved !== 'dark';\n const newTheme =\n theme === 'system'\n ? resolvedTheme === 'dark'\n ? 'light'\n : 'dark'\n : theme === 'dark'\n ? 'light'\n : 'dark';\n if (goingToDark) {\n toggleOnSound.play();\n } else {\n toggleOffSound.play();\n }\n const prefersReducedMotion =\n typeof window !== 'undefined' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (!('startViewTransition' in document) || prefersReducedMotion) {\n setTheme(newTheme);\n return;\n }\n document.documentElement.style.setProperty('--x', `${e.clientX}px`);\n document.documentElement.style.setProperty('--y', `${e.clientY}px`);\n (\n document as unknown as { startViewTransition: (cb: () => void) => void }\n ).startViewTransition(() => {\n setTheme(newTheme);\n });\n }}\n aria-label={`Switch to ${resolvedTheme === 'dark' ? 'light' : 'dark'} mode`}\n >\n <Sun className=\"h-4 w-4 scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <Moon className=\"absolute h-4 w-4 scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n </SidebarMenuButton>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n {resolvedTheme === 'dark' ? 'Light mode' : 'Dark mode'}\n </TooltipContent>\n </Tooltip>\n {!collapsed && (\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarMenuButton\n className=\"w-auto flex-none\"\n onClick={() => {\n clickSound.play();\n toggleSound();\n }}\n aria-label={soundEnabled ? 'Mute sounds' : 'Unmute sounds'}\n >\n {soundEnabled ? (\n <Volume2 className=\"h-4 w-4\" />\n ) : (\n <VolumeOff className=\"h-4 w-4\" />\n )}\n </SidebarMenuButton>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n {soundEnabled ? 'Mute sounds' : 'Unmute sounds'}\n </TooltipContent>\n </Tooltip>\n )}\n </TooltipProvider>\n </div>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n\n <SidebarRail />\n </Sidebar>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { Plus, Loader2, X } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\n\nexport interface FloatingActionButtonAction {\n /** Unique key for the action. */\n id: string;\n /** Accessible label shown next to the icon. */\n label: string;\n /** Lucide icon component. */\n icon: React.ReactNode;\n /** Called when the action is clicked. */\n onClick: () => void;\n /** Whether the action is currently loading. */\n loading?: boolean;\n /** Whether the action is disabled. */\n disabled?: boolean;\n}\n\nexport interface FloatingActionButtonProps {\n /** Action items shown when the FAB is expanded. */\n actions: FloatingActionButtonAction[];\n /** Additional CSS classes for the container. */\n className?: string;\n}\n\n/** Stagger delay between each item animation in ms. */\nconst STAGGER_MS = 50;\n\n/** Total animation duration in ms. */\nconst DURATION_MS = 250;\n\nexport function FloatingActionButton({ actions, className }: FloatingActionButtonProps) {\n const [open, setOpen] = useState(false);\n\n // Close on Escape key\n useEffect(() => {\n if (!open) return;\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n }\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [open]);\n\n // Reversed actions so bottom-most item in stack = first action\n const reversedActions = [...actions].reverse();\n\n return (\n <>\n {/* Invisible click-outside catcher */}\n {open ? (\n <div\n data-testid=\"fab-overlay\"\n className=\"fixed inset-0 z-40\"\n onClick={() => setOpen(false)}\n aria-hidden=\"true\"\n />\n ) : null}\n\n {/* FAB container */}\n <div\n data-testid=\"floating-action-button\"\n className={cn('fixed right-6 bottom-6 z-50', className)}\n >\n {/* Action chips — vertical stack expanding upward */}\n <div\n className=\"absolute right-0 bottom-16 flex flex-col-reverse items-end gap-3\"\n data-testid=\"fab-actions\"\n >\n {reversedActions.map((action, reversedIndex) => {\n const originalIndex = actions.length - 1 - reversedIndex;\n // Stagger: bottom items appear first (closest to FAB)\n const openDelay = originalIndex * STAGGER_MS;\n // Close: top items disappear first\n const closeDelay = reversedIndex * STAGGER_MS;\n\n return (\n <button\n key={action.id}\n data-testid={`fab-action-${action.id}`}\n aria-label={action.label}\n disabled={action.disabled ?? action.loading}\n className={cn(\n 'flex items-center gap-3 rounded-full px-4 py-2.5',\n 'bg-background text-foreground shadow-lg',\n 'border-border border',\n 'transition-all ease-out',\n 'hover:bg-accent hover:text-accent-foreground',\n 'disabled:pointer-events-none disabled:opacity-50',\n open\n ? 'translate-y-0 scale-100 opacity-100'\n : 'pointer-events-none translate-y-4 scale-95 opacity-0'\n )}\n style={{\n transitionDuration: `${DURATION_MS}ms`,\n transitionDelay: open ? `${openDelay}ms` : `${closeDelay}ms`,\n }}\n onClick={() => {\n action.onClick();\n setOpen(false);\n }}\n >\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {action.loading ? <Loader2 className=\"h-5 w-5 animate-spin\" /> : action.icon}\n </span>\n <span className=\"text-sm font-medium whitespace-nowrap\">{action.label}</span>\n </button>\n );\n })}\n </div>\n\n {/* Primary FAB trigger */}\n <Button\n size=\"icon\"\n data-testid=\"fab-trigger\"\n aria-label={open ? 'Close actions' : 'Open actions'}\n className={cn(\n 'relative h-12 w-12 rounded-full shadow-lg',\n 'transition-colors duration-200'\n )}\n onClick={() => setOpen((prev) => !prev)}\n >\n {/* Plus icon — fades out when open */}\n <Plus\n className={cn(\n 'absolute h-5 w-5 transition-all',\n open ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100'\n )}\n style={{ transitionDuration: `${DURATION_MS}ms` }}\n />\n {/* X icon — fades in when open */}\n <X\n className={cn(\n 'absolute h-5 w-5 transition-all',\n open ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0'\n )}\n style={{ transitionDuration: `${DURATION_MS}ms` }}\n />\n </Button>\n </div>\n </>\n );\n}\n","'use client';\n\nimport { useState, type KeyboardEvent } from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { Label } from '@/components/ui/label';\n\n/**\n * Matches supported GitHub URL formats:\n * - https://github.com/owner/repo\n * - https://github.com/owner/repo.git\n * - git@github.com:owner/repo.git\n * - owner/repo (shorthand)\n */\nconst GITHUB_URL_PATTERN =\n /^(?:https:\\/\\/github\\.com\\/([a-zA-Z0-9._-]+)\\/([a-zA-Z0-9._-]+?)(?:\\.git)?|git@github\\.com:([a-zA-Z0-9._-]+)\\/([a-zA-Z0-9._-]+?)(?:\\.git)?|([a-zA-Z0-9._-]+)\\/([a-zA-Z0-9._-]+))$/;\n\nexport function isValidGitHubUrl(url: string): boolean {\n return GITHUB_URL_PATTERN.test(url.trim());\n}\n\nexport interface GitHubUrlInputProps {\n onSubmit: (url: string) => void;\n loading?: boolean;\n}\n\nexport function GitHubUrlInput({ onSubmit, loading = false }: GitHubUrlInputProps) {\n const [url, setUrl] = useState('');\n const [error, setError] = useState('');\n\n function handleSubmit() {\n const trimmed = url.trim();\n if (!trimmed) {\n setError('Please enter a GitHub URL');\n return;\n }\n if (!isValidGitHubUrl(trimmed)) {\n setError('Enter a valid GitHub URL (e.g. owner/repo or https://github.com/owner/repo)');\n return;\n }\n setError('');\n onSubmit(trimmed);\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"github-url-input\">GitHub URL</Label>\n <div className=\"flex gap-2\">\n <Input\n id=\"github-url-input\"\n placeholder=\"owner/repo or https://github.com/owner/repo\"\n value={url}\n onChange={(e) => {\n setUrl(e.target.value);\n if (error) setError('');\n }}\n onKeyDown={handleKeyDown}\n disabled={loading}\n aria-invalid={!!error}\n aria-describedby={error ? 'github-url-error' : undefined}\n />\n <Button onClick={handleSubmit} disabled={loading || !url.trim()} size=\"sm\">\n {loading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : 'Import'}\n </Button>\n </div>\n {error ? (\n <p id=\"github-url-error\" className=\"text-destructive text-sm\" role=\"alert\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40af8f5d6f923d30f5fe5911f73e1d18ec9f8954ff\":\"listGitHubRepositories\"},\"src/presentation/web/app/actions/list-github-repositories.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40af8f5d6f923d30f5fe5911f73e1d18ec9f8954ff\",callServer,void 0,findSourceMapURL,\"listGitHubRepositories\");export{$$RSC_SERVER_ACTION_0 as listGitHubRepositories};","'use client';\n\nimport { useCallback, useMemo, useState, type ReactNode } from 'react';\nimport { useRouter, usePathname } from 'next/navigation';\nimport { Plus, FolderPlus, Github, GitBranch } from 'lucide-react';\nimport { SidebarProvider, SidebarInset } from '@/components/ui/sidebar';\nimport { AppSidebar } from '@/components/layouts/app-sidebar';\nimport {\n FloatingActionButton,\n type FloatingActionButtonAction,\n} from '@/components/common/floating-action-button';\nimport { ReactFileManagerDialog } from '@/components/common/react-file-manager-dialog';\nimport { pickFolder } from '@/components/common/add-repository-button/pick-folder';\nimport { GitHubImportDialog } from '@/components/common/github-import-dialog';\nimport { AgentEventsProvider } from '@/hooks/agent-events-provider';\nimport { DrawerCloseGuardProvider, useDrawerCloseGuard } from '@/hooks/drawer-close-guard';\nimport {\n SidebarFeaturesProvider,\n useSidebarFeaturesContext,\n} from '@/hooks/sidebar-features-context';\n\nimport { useNotifications } from '@/hooks/use-notifications';\nimport { useFeatureFlags } from '@/hooks/feature-flags-context';\n\ninterface AppShellProps {\n children: ReactNode;\n /** Server-read sidebar state from cookie. */\n sidebarOpen?: boolean;\n}\n\n/** Control center route prefixes where the FAB should be visible. */\nconst CONTROL_CENTER_PREFIXES = ['/', '/create', '/adopt', '/feature', '/repository'];\n\nfunction isControlCenterRoute(pathname: string): boolean {\n return CONTROL_CENTER_PREFIXES.some(\n (prefix) => pathname === prefix || (prefix !== '/' && pathname.startsWith(`${prefix}/`))\n );\n}\n\nfunction AppShellInner({ children, sidebarOpen }: AppShellProps) {\n const router = useRouter();\n const pathname = usePathname();\n const { guardedNavigate } = useDrawerCloseGuard();\n const featureFlags = useFeatureFlags();\n\n // Subscribe to agent lifecycle events and dispatch toast/browser notifications\n useNotifications();\n\n const { features, hasRepositories } = useSidebarFeaturesContext();\n const handleNewFeature = useCallback(() => {\n guardedNavigate(() => router.push('/create'));\n }, [router, guardedNavigate]);\n\n const handleAdoptBranch = useCallback(() => {\n guardedNavigate(() => router.push('/adopt'));\n }, [router, guardedNavigate]);\n\n const handleFeatureClick = useCallback(\n (featureId: string) => {\n guardedNavigate(() => router.push(`/feature/${featureId}`));\n },\n [router, guardedNavigate]\n );\n\n const [addingRepo, setAddingRepo] = useState(false);\n const [githubDialogOpen, setGithubDialogOpen] = useState(false);\n const [showReactPicker, setShowReactPicker] = useState(false);\n\n const handleAddRepository = useCallback(async () => {\n if (addingRepo) return;\n\n if (featureFlags.reactFileManager) {\n setShowReactPicker(true);\n return;\n }\n\n setAddingRepo(true);\n try {\n const path = await pickFolder();\n if (path) {\n window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));\n }\n } catch {\n // Native picker failed — fall back to React file manager\n setShowReactPicker(true);\n } finally {\n setAddingRepo(false);\n }\n }, [addingRepo, featureFlags.reactFileManager]);\n\n const handleReactPickerSelect = useCallback((path: string | null) => {\n if (path) {\n window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));\n }\n setShowReactPicker(false);\n }, []);\n\n const handleImportFromGitHub = useCallback(() => {\n setGithubDialogOpen(true);\n }, []);\n\n const handleGitHubImportComplete = useCallback((repository: { path?: string }) => {\n if (repository.path) {\n window.dispatchEvent(\n new CustomEvent('shep:add-repository', { detail: { path: repository.path } })\n );\n }\n }, []);\n\n const fabActions: FloatingActionButtonAction[] = useMemo(() => {\n const actions: FloatingActionButtonAction[] = [\n {\n id: 'new-feature',\n label: 'New Feature',\n icon: <Plus className=\"h-4 w-4\" />,\n onClick: handleNewFeature,\n },\n ...(featureFlags.adoptBranch\n ? [\n {\n id: 'adopt-branch',\n label: 'Adopt Branch',\n icon: <GitBranch className=\"h-4 w-4\" />,\n onClick: handleAdoptBranch,\n },\n ]\n : []),\n {\n id: 'add-repository',\n label: 'Add Repository',\n icon: <FolderPlus className=\"h-4 w-4\" />,\n onClick: handleAddRepository,\n loading: addingRepo,\n },\n ];\n if (featureFlags.githubImport) {\n actions.push({\n id: 'import-github',\n label: 'Import from GitHub',\n icon: <Github className=\"h-4 w-4\" />,\n onClick: handleImportFromGitHub,\n });\n }\n return actions;\n }, [\n handleNewFeature,\n handleAdoptBranch,\n handleAddRepository,\n addingRepo,\n handleImportFromGitHub,\n featureFlags.githubImport,\n featureFlags.adoptBranch,\n ]);\n\n return (\n <SidebarProvider defaultOpen={sidebarOpen ?? false}>\n <AppSidebar\n features={features}\n featureFlags={featureFlags}\n onFeatureClick={handleFeatureClick}\n />\n <SidebarInset>\n <div className=\"relative h-full\">\n <main className=\"h-full\">{children}</main>\n {isControlCenterRoute(pathname) && hasRepositories ? (\n <FloatingActionButton actions={fabActions} />\n ) : null}\n {featureFlags.githubImport ? (\n <GitHubImportDialog\n open={githubDialogOpen}\n onOpenChange={setGithubDialogOpen}\n onImportComplete={handleGitHubImportComplete}\n />\n ) : null}\n </div>\n </SidebarInset>\n <ReactFileManagerDialog\n open={showReactPicker}\n onOpenChange={(open) => {\n if (!open) setShowReactPicker(false);\n }}\n onSelect={handleReactPickerSelect}\n />\n </SidebarProvider>\n );\n}\n\nexport function AppShell({ children, sidebarOpen }: AppShellProps) {\n return (\n <AgentEventsProvider>\n <DrawerCloseGuardProvider>\n <SidebarFeaturesProvider>\n <AppShellInner sidebarOpen={sidebarOpen}>{children}</AppShellInner>\n </SidebarFeaturesProvider>\n </DrawerCloseGuardProvider>\n </AgentEventsProvider>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Lock, Globe, Loader2, Search, AlertCircle } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Badge } from '@/components/ui/badge';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { listGitHubRepositories } from '@/app/actions/list-github-repositories';\nimport type { GitHubRepo } from '@shepai/core/application/ports/output/services/github-repository-service.interface';\n\nexport interface GitHubRepoBrowserProps {\n onSelect: (nameWithOwner: string) => void;\n loading?: boolean;\n /** Override the fetch function for testing/stories */\n fetchRepos?: (input?: {\n search?: string;\n limit?: number;\n }) => Promise<{ repos?: GitHubRepo[]; error?: string }>;\n}\n\nexport function GitHubRepoBrowser({\n onSelect,\n loading: externalLoading = false,\n fetchRepos = listGitHubRepositories,\n}: GitHubRepoBrowserProps) {\n const [repos, setRepos] = useState<GitHubRepo[]>([]);\n const [fetching, setFetching] = useState(true);\n const [error, setError] = useState('');\n const [search, setSearch] = useState('');\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const fetchData = useCallback(\n async (searchTerm?: string) => {\n setFetching(true);\n setError('');\n try {\n const result = await fetchRepos(searchTerm ? { search: searchTerm } : undefined);\n if (result.error) {\n setError(result.error);\n setRepos([]);\n } else {\n setRepos(result.repos ?? []);\n }\n } catch {\n setError('Failed to fetch repositories');\n setRepos([]);\n } finally {\n setFetching(false);\n }\n },\n [fetchRepos]\n );\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n function handleSearchChange(value: string) {\n setSearch(value);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n fetchData(value || undefined);\n }, 300);\n }\n\n const disabled = externalLoading;\n\n if (error && !fetching) {\n return (\n <div\n className=\"flex flex-col items-center gap-2 py-8 text-center\"\n data-testid=\"repo-browser-error\"\n >\n <AlertCircle className=\"text-destructive h-8 w-8\" />\n <p className=\"text-destructive text-sm\">{error}</p>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2\" />\n <Input\n placeholder=\"Search repositories...\"\n value={search}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"pl-9\"\n disabled={disabled}\n aria-label=\"Search repositories\"\n />\n </div>\n\n <div\n className=\"max-h-64 overflow-x-hidden overflow-y-auto rounded-md border\"\n role=\"listbox\"\n aria-label=\"GitHub repositories\"\n >\n {fetching ? (\n <div className=\"flex flex-col gap-2 p-3\" data-testid=\"repo-browser-loading\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={`skeleton-${String(i)}`} className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-4 w-48\" />\n <Skeleton className=\"h-3 w-72\" />\n </div>\n ))}\n </div>\n ) : repos.length === 0 ? (\n <div\n className=\"text-muted-foreground py-8 text-center text-sm\"\n data-testid=\"repo-browser-empty\"\n >\n No repositories found\n </div>\n ) : (\n repos.map((repo) => (\n <button\n key={repo.nameWithOwner}\n type=\"button\"\n role=\"option\"\n aria-selected={false}\n className=\"hover:bg-accent flex w-full items-start gap-2 border-b px-3 py-2.5 text-left last:border-b-0 disabled:opacity-50\"\n onClick={() => onSelect(repo.nameWithOwner)}\n disabled={disabled}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\">{repo.nameWithOwner}</span>\n <Badge\n variant={repo.isPrivate ? 'secondary' : 'outline'}\n className=\"shrink-0 text-xs\"\n >\n {repo.isPrivate ? (\n <>\n <Lock className=\"mr-1 h-3 w-3\" />\n Private\n </>\n ) : (\n <>\n <Globe className=\"mr-1 h-3 w-3\" />\n Public\n </>\n )}\n </Badge>\n </div>\n {repo.description ? (\n <p className=\"text-muted-foreground mt-0.5 truncate text-xs\">\n {repo.description}\n </p>\n ) : null}\n </div>\n {disabled ? <Loader2 className=\"mt-0.5 h-4 w-4 shrink-0 animate-spin\" /> : null}\n </button>\n ))\n )}\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40e89c37381b42d2c5244f966fc1ff4d9083640ed3\":\"importGitHubRepository\"},\"src/presentation/web/app/actions/import-github-repository.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40e89c37381b42d2c5244f966fc1ff4d9083640ed3\",callServer,void 0,findSourceMapURL,\"importGitHubRepository\");export{$$RSC_SERVER_ACTION_0 as importGitHubRepository};","'use client';\n\nimport { useState } from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { GitHubUrlInput } from './github-url-input';\nimport { GitHubRepoBrowser } from './github-repo-browser';\nimport { importGitHubRepository } from '@/app/actions/import-github-repository';\nimport type { Repository } from '@shepai/core/domain/generated/output';\n\nexport interface GitHubImportDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onImportComplete: (repository: Repository) => void;\n}\n\nexport function GitHubImportDialog({\n open,\n onOpenChange,\n onImportComplete,\n}: GitHubImportDialogProps) {\n const [importing, setImporting] = useState(false);\n const [error, setError] = useState('');\n\n async function handleImport(url: string) {\n setImporting(true);\n setError('');\n try {\n const result = await importGitHubRepository({ url });\n if (result.error) {\n setError(result.error);\n } else if (result.repository) {\n onImportComplete(result.repository);\n onOpenChange(false);\n }\n } catch {\n setError('An unexpected error occurred');\n } finally {\n setImporting(false);\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"overflow-hidden sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>Import from GitHub</DialogTitle>\n <DialogDescription>Clone a GitHub repository and add it to Shep.</DialogDescription>\n </DialogHeader>\n\n <Tabs defaultValue=\"url\" className=\"min-w-0\">\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"url\">URL</TabsTrigger>\n <TabsTrigger value=\"browse\">Browse</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"url\" className=\"mt-4\">\n <GitHubUrlInput onSubmit={handleImport} loading={importing} />\n </TabsContent>\n\n <TabsContent value=\"browse\" className=\"mt-4\">\n <GitHubRepoBrowser onSelect={handleImport} loading={importing} />\n </TabsContent>\n </Tabs>\n\n {error ? (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n {error}\n </p>\n ) : null}\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { toast } from 'sonner';\nimport type { NotificationEvent } from '@shepai/core/domain/generated/output';\nimport { NotificationEventType, NotificationSeverity } from '@shepai/core/domain/generated/output';\nimport { useAgentEventsContext } from './agent-events-provider';\nimport { useSoundAction } from './use-sound-action';\nimport type { SoundAction } from './use-sound-action';\n\nconst SEVERITY_TO_TOAST: Record<NotificationSeverity, 'success' | 'error' | 'warning' | 'info'> = {\n [NotificationSeverity.Success]: 'success',\n [NotificationSeverity.Error]: 'error',\n [NotificationSeverity.Warning]: 'warning',\n [NotificationSeverity.Info]: 'info',\n};\n\nfunction dispatchToast(event: NotificationEvent, navigate?: (path: string) => void): void {\n const method = SEVERITY_TO_TOAST[event.severity] ?? 'info';\n const isActionable =\n event.eventType === NotificationEventType.WaitingApproval ||\n event.eventType === NotificationEventType.MergeReviewReady;\n toast[method](event.featureName, {\n description: event.message,\n ...(isActionable &&\n navigate && {\n action: {\n label: 'Review',\n onClick: () => {\n navigate(`/feature/${event.featureId}`);\n },\n },\n }),\n });\n}\n\nconst SEVERITY_TO_ACTION: Record<NotificationSeverity, SoundAction> = {\n [NotificationSeverity.Success]: 'notification-success',\n [NotificationSeverity.Error]: 'notification-error',\n [NotificationSeverity.Warning]: 'notification-warning',\n [NotificationSeverity.Info]: 'notification-info',\n};\n\nexport function useNotifications(): void {\n const router = useRouter();\n const { events } = useAgentEventsContext();\n\n const successSound = useSoundAction('notification-success');\n const errorSound = useSoundAction('notification-error');\n const warningSound = useSoundAction('notification-warning');\n const infoSound = useSoundAction('notification-info');\n\n const soundsByAction = useMemo<Record<string, { play: () => void }>>(\n () => ({\n 'notification-success': successSound,\n 'notification-error': errorSound,\n 'notification-warning': warningSound,\n 'notification-info': infoSound,\n }),\n [successSound, errorSound, warningSound, infoSound]\n );\n\n // Track how many events from the array we've already processed.\n // Using the array index (instead of lastEvent) prevents React batching\n // from silently dropping events when multiple SSE messages arrive together.\n const processedCountRef = useRef(0);\n\n useEffect(() => {\n if (events.length <= processedCountRef.current) return;\n\n const newEvents = events.slice(processedCountRef.current);\n processedCountRef.current = events.length;\n\n for (const event of newEvents) {\n // Only notify for actionable events and completion celebrations.\n // MergeReviewReady is Info severity but always shown as it requires user action.\n const isAlwaysShown = event.eventType === NotificationEventType.MergeReviewReady;\n if (\n !isAlwaysShown &&\n event.severity !== NotificationSeverity.Error &&\n event.severity !== NotificationSeverity.Warning &&\n event.severity !== NotificationSeverity.Success\n ) {\n continue;\n }\n\n dispatchToast(event, (path) => router.push(path as Parameters<typeof router.push>[0]));\n\n const actionName = SEVERITY_TO_ACTION[event.severity];\n soundsByAction[actionName]?.play();\n }\n }, [events, soundsByAction, router]);\n}\n","import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n","import { cn } from '@/lib/utils';\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn('bg-accent animate-pulse rounded-md', className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","/**\n * Compare two semver version strings.\n * Returns 1 if a > b, -1 if a < b, 0 if equal.\n * Only compares major.minor.patch (ignores pre-release/build metadata).\n */\nexport function compareVersions(a: string, b: string): -1 | 0 | 1 {\n const parse = (v: string) => v.split('-')[0].split('.').map(Number);\n const pa = parse(a);\n const pb = parse(b);\n for (let i = 0; i < 3; i++) {\n const na = pa[i] ?? 0;\n const nb = pb[i] ?? 0;\n if (na > nb) return 1;\n if (na < nb) return -1;\n }\n return 0;\n}\n","import { cn } from '@/lib/utils';\n\nexport interface ShepLogoProps {\n className?: string;\n size?: number;\n variant?: 'default' | 'dev';\n}\n\nexport function ShepLogo({ className, size = 24, variant = 'default' }: ShepLogoProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 194 200\"\n width={size}\n height={size}\n className={cn('shrink-0', variant === 'dev' && 'text-cyan-400', className)}\n aria-hidden=\"true\"\n >\n <g transform=\"matrix(1, 0, 0, 1, -111, -208)\">\n <path\n d=\"M 198 406 C196,405 194,403 193,401 C192,399 191,398 186,398 C178,397 174,394 170,387 L 168 381 L 163 381 C156,381 150,377 147,370 C144,364 143,359 146,353 C148,348 148,347 147,347 C145,347 140,343 138,339 C133,329 139,314 149,311 L 152 311 L 149 307 C145,302 145,294 149,290 C151,288 152,287 151,286 C150,283 152,278 155,276 C156,275 159,274 162,273 C165,273 166,273 168,276 C171,278 171,280 172,287 C173,294 174,297 177,304 C180,309 182,314 183,316 C186,327 193,336 199,339 C204,342 211,342 216,340 C222,336 231,324 234,314 C235,312 237,307 239,302 C240,298 242,292 242,289 C243,281 245,278 247,275 C250,273 251,273 255,273 C261,274 264,278 264,282 C264,284 264,286 263,287 C262,287 263,288 265,290 C272,295 272,303 267,309 L 265 312 L 269 314 C276,317 279,323 279,332 C279,339 277,343 272,347 C268,351 268,351 269,354 C272,358 271,366 269,371 C266,376 259,381 254,381 C252,381 251,382 248,386 C242,395 234,400 227,399 C224,398 223,398 221,401 C220,403 217,405 216,406 C211,409 203,409 198,406 ZM 136 271 C123,267 115,262 113,256 C111,251 111,251 113,251 C118,254 124,254 132,252 C136,252 141,251 144,251 C149,251 157,253 162,256 C166,258 166,258 166,264 L 166 269 L 160 270 C149,272 142,272 136,271 ZM 264 271 C263,271 259,270 256,270 L 250 270 L 250 265 C249,259 250,257 259,254 C265,251 272,251 289,252 C297,253 299,253 302,252 C305,250 305,250 305,252 C305,255 301,262 297,264 C289,270 272,273 264,271 ZM 162 249 C160,247 159,245 159,242 C159,236 164,230 169,230 C170,230 171,228 171,225 C171,216 176,210 184,209 C189,209 195,211 195,213 C195,214 196,213 197,212 C201,209 204,208 208,208 C212,208 217,210 219,212 C220,214 220,213 223,211 C226,208 234,208 239,211 C243,214 246,221 246,226 C245,230 245,230 247,230 C253,230 258,238 257,244 C256,249 251,252 245,252 C241,252 237,251 234,248 C232,247 232,247 228,249 C225,251 222,252 220,252 C216,252 212,250 210,247 C209,246 209,246 206,248 C201,252 192,253 185,248 C183,247 183,247 178,249 C172,253 166,253 162,249 ZM 116 249 C112,248 114,247 119,247 C122,247 127,246 130,245 C138,242 146,242 152,245 L 158 248 L 148 247 C142,247 138,247 133,248 C128,250 120,250 116,249 ZM 284 248 C281,247 277,247 270,247 L 260 248 L 263 246 C269,243 276,242 284,245 C289,246 295,247 298,247 C303,247 304,247 303,248 C301,250 289,250 284,248 Z\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],\n ['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],\n ['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],\n];\n\n/**\n * @component @name Sun\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xMiAydjIiIC8+CiAgPHBhdGggZD0iTTEyIDIwdjIiIC8+CiAgPHBhdGggZD0ibTQuOTMgNC45MyAxLjQxIDEuNDEiIC8+CiAgPHBhdGggZD0ibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJNMiAxMmgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxMmgyIiAvPgogIDxwYXRoIGQ9Im02LjM0IDE3LjY2LTEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJtMTkuMDcgNC45My0xLjQxIDEuNDEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sun\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Sun = createLucideIcon('sun', __iconNode);\n\nexport default Sun;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '11', x: '3', y: '11', rx: '2', ry: '2', key: '1w4ew1' }],\n ['path', { d: 'M7 11V7a5 5 0 0 1 10 0v4', key: 'fwvmzm' }],\n];\n\n/**\n * @component @name Lock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTEiIHg9IjMiIHk9IjExIiByeD0iMiIgcnk9IjIiIC8+CiAgPHBhdGggZD0iTTcgMTFWN2E1IDUgMCAwIDEgMTAgMHY0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/lock\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Lock = createLucideIcon('lock', __iconNode);\n\nexport default Lock;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M9 3v18', key: 'fh3hqa' }],\n];\n\n/**\n * @component @name PanelLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik05IDN2MTgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/panel-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst PanelLeft = createLucideIcon('panel-left', __iconNode);\n\nexport default PanelLeft;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M16 9a5 5 0 0 1 .95 2.293', key: '1fgyg8' }],\n ['path', { d: 'M19.364 5.636a9 9 0 0 1 1.889 9.96', key: 'l3zxae' }],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n [\n 'path',\n {\n d: 'm7 7-.587.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298V11',\n key: '1gbwow',\n },\n ],\n ['path', { d: 'M9.828 4.172A.686.686 0 0 1 11 4.657v.686', key: 's2je0y' }],\n];\n\n/**\n * @component @name VolumeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgOWE1IDUgMCAwIDEgLjk1IDIuMjkzIiAvPgogIDxwYXRoIGQ9Ik0xOS4zNjQgNS42MzZhOSA5IDAgMCAxIDEuODg5IDkuOTYiIC8+CiAgPHBhdGggZD0ibTIgMiAyMCAyMCIgLz4KICA8cGF0aCBkPSJtNyA3LS41ODcuNTg3QTEuNCAxLjQgMCAwIDEgNS40MTYgOEgzYTEgMSAwIDAgMC0xIDF2NmExIDEgMCAwIDAgMSAxaDIuNDE2YTEuNCAxLjQgMCAwIDEgLjk5Ny40MTNsMy4zODMgMy4zODRBLjcwNS43MDUgMCAwIDAgMTEgMTkuMjk4VjExIiAvPgogIDxwYXRoIGQ9Ik05LjgyOCA0LjE3MkEuNjg2LjY4NiAwIDAgMSAxMSA0LjY1N3YuNjg2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/volume-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst VolumeOff = createLucideIcon('volume-off', __iconNode);\n\nexport default VolumeOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8', key: '5wwlr5' }],\n [\n 'path',\n {\n d: 'M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z',\n key: 'r6nss1',\n },\n ],\n];\n\n/**\n * @component @name House\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgMjF2LThhMSAxIDAgMCAwLTEtMWgtNGExIDEgMCAwIDAtMSAxdjgiIC8+CiAgPHBhdGggZD0iTTMgMTBhMiAyIDAgMCAxIC43MDktMS41MjhsNy02YTIgMiAwIDAgMSAyLjU4MiAwbDcgNkEyIDIgMCAwIDEgMjEgMTB2OWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnoiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/house\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst House = createLucideIcon('house', __iconNode);\n\nexport default House;\n","/**\n * Theme type definitions for the Shep AI Web UI\n */\n\nexport type Theme = 'light' | 'dark' | 'system';\n\nexport interface ThemeContextValue {\n theme: Theme;\n resolvedTheme: 'light' | 'dark';\n setTheme: (theme: Theme) => void;\n}\n\nexport const THEME_STORAGE_KEY = 'shep-theme';\n\nexport const themes: Theme[] = ['light', 'dark', 'system'];\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z',\n key: 'uqj9uw',\n },\n ],\n ['path', { d: 'M16 9a5 5 0 0 1 0 6', key: '1q6k2b' }],\n ['path', { d: 'M19.364 18.364a9 9 0 0 0 0-12.728', key: 'ijwkga' }],\n];\n\n/**\n * @component @name Volume2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTEgNC43MDJhLjcwNS43MDUgMCAwIDAtMS4yMDMtLjQ5OEw2LjQxMyA3LjU4N0ExLjQgMS40IDAgMCAxIDUuNDE2IDhIM2ExIDEgMCAwIDAtMSAxdjZhMSAxIDAgMCAwIDEgMWgyLjQxNmExLjQgMS40IDAgMCAxIC45OTcuNDEzbDMuMzgzIDMuMzg0QS43MDUuNzA1IDAgMCAwIDExIDE5LjI5OHoiIC8+CiAgPHBhdGggZD0iTTE2IDlhNSA1IDAgMCAxIDAgNiIgLz4KICA8cGF0aCBkPSJNMTkuMzY0IDE4LjM2NGE5IDkgMCAwIDAgMC0xMi43MjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/volume-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Volume2 = createLucideIcon('volume-2', __iconNode);\n\nexport default Volume2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915',\n key: '1i5ecw',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n];\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiIC8+CiAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('settings', __iconNode);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401',\n key: 'kfwtm',\n },\n ],\n];\n\n/**\n * @component @name Moon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/moon\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Moon = createLucideIcon('moon', __iconNode);\n\nexport default Moon;\n","import type { ReactNode } from 'react';\nimport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarGroupContent,\n SidebarMenu,\n} from '@/components/ui/sidebar';\n\nexport interface FeatureStatusGroupProps {\n label: string;\n count: number;\n children: ReactNode;\n}\n\nexport function FeatureStatusGroup({ label, count, children }: FeatureStatusGroupProps) {\n return (\n <SidebarGroup data-testid=\"feature-status-group\" className=\"px-2 py-1\">\n <SidebarGroupLabel className=\"text-muted-foreground h-6 px-2 text-[0.65rem] font-semibold tracking-wider uppercase\">\n {label}\n <span\n aria-label={`${count} items`}\n className=\"bg-sidebar-accent text-sidebar-accent-foreground ml-1.5 inline-flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[0.6rem] font-medium tabular-nums\"\n role=\"img\"\n >\n {count}\n </span>\n </SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu className=\"gap-0.5\">{children}</SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n","'use client';\n\nimport { Toaster as Sonner } from 'sonner';\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>;\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n return (\n <Sonner\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n 'group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg',\n description: 'group-[.toast]:text-muted-foreground',\n actionButton: 'group-[.toast]:bg-primary group-[.toast]:text-primary-foreground',\n cancelButton: 'group-[.toast]:bg-muted group-[.toast]:text-muted-foreground',\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n"],"names":[],"mappings":"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","ignoreList":[2,29,30,31,32,33,35,36,37]}