@shepai/cli 1.181.0 → 1.182.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/dist/src/presentation/cli/commands/app/del.command.d.ts +14 -0
  2. package/dist/src/presentation/cli/commands/app/del.command.d.ts.map +1 -0
  3. package/dist/src/presentation/cli/commands/app/del.command.js +58 -0
  4. package/dist/src/presentation/cli/commands/app/index.d.ts +20 -0
  5. package/dist/src/presentation/cli/commands/app/index.d.ts.map +1 -0
  6. package/dist/src/presentation/cli/commands/app/index.js +33 -0
  7. package/dist/src/presentation/cli/commands/app/ls.command.d.ts +11 -0
  8. package/dist/src/presentation/cli/commands/app/ls.command.d.ts.map +1 -0
  9. package/dist/src/presentation/cli/commands/app/ls.command.js +74 -0
  10. package/dist/src/presentation/cli/commands/app/new.command.d.ts +17 -0
  11. package/dist/src/presentation/cli/commands/app/new.command.d.ts.map +1 -0
  12. package/dist/src/presentation/cli/commands/app/new.command.js +58 -0
  13. package/dist/src/presentation/cli/commands/app/resolve-application.d.ts +10 -0
  14. package/dist/src/presentation/cli/commands/app/resolve-application.d.ts.map +1 -0
  15. package/dist/src/presentation/cli/commands/app/resolve-application.js +33 -0
  16. package/dist/src/presentation/cli/commands/app/show.command.d.ts +11 -0
  17. package/dist/src/presentation/cli/commands/app/show.command.d.ts.map +1 -0
  18. package/dist/src/presentation/cli/commands/app/show.command.js +95 -0
  19. package/dist/src/presentation/cli/index.js +2 -0
  20. package/dist/translations/ar/cli.json +63 -0
  21. package/dist/translations/de/cli.json +63 -0
  22. package/dist/translations/en/cli.json +63 -0
  23. package/dist/translations/es/cli.json +63 -0
  24. package/dist/translations/fr/cli.json +63 -0
  25. package/dist/translations/he/cli.json +63 -0
  26. package/dist/translations/pt/cli.json +63 -0
  27. package/dist/translations/ru/cli.json +63 -0
  28. package/dist/translations/uk/cli.json +63 -0
  29. package/dist/tsconfig.build.tsbuildinfo +1 -1
  30. package/package.json +1 -1
  31. package/web/.next/BUILD_ID +1 -1
  32. package/web/.next/build-manifest.json +2 -2
  33. package/web/.next/fallback-build-manifest.json +2 -2
  34. package/web/.next/prerender-manifest.json +3 -3
  35. package/web/.next/required-server-files.js +2 -2
  36. package/web/.next/required-server-files.json +2 -2
  37. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +32 -32
  38. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +30 -30
  41. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +33 -33
  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 +41 -41
  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 +41 -41
  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]/[tab]/page/server-reference-manifest.json +31 -31
  53. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +31 -31
  56. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +30 -30
  59. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +33 -33
  62. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +41 -41
  65. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +41 -41
  68. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +30 -30
  71. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +31 -31
  74. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +31 -31
  77. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/_global-error.html +2 -2
  80. package/web/.next/server/app/_global-error.rsc +1 -1
  81. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  82. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  83. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  84. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  85. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  86. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  87. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +15 -15
  89. package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
  90. package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/features/page/server-reference-manifest.json +7 -7
  92. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/settings/page/server-reference-manifest.json +10 -10
  94. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  95. package/web/.next/server/app/skills/page/server-reference-manifest.json +15 -15
  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 +13 -13
  98. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/version/page/server-reference-manifest.json +7 -7
  100. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  102. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  103. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  105. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__1925bef0._.js +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js +2 -2
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__4ee8be85._.js +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__e265da61._.js +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/_0277d3b5._.js +1 -1
  128. package/web/.next/server/chunks/ssr/_0277d3b5._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/{_da028026._.js → _177d29c6._.js} +2 -2
  130. package/web/.next/server/chunks/ssr/{_da028026._.js.map → _177d29c6._.js.map} +1 -1
  131. package/web/.next/server/chunks/ssr/{_5bb39227._.js → _21cc662b._.js} +2 -2
  132. package/web/.next/server/chunks/ssr/{_5bb39227._.js.map → _21cc662b._.js.map} +1 -1
  133. package/web/.next/server/chunks/ssr/{_655cc4fd._.js → _503102fc._.js} +2 -2
  134. package/web/.next/server/chunks/ssr/{_655cc4fd._.js.map → _503102fc._.js.map} +1 -1
  135. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  136. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/{_e5753970._.js → _575fe3ee._.js} +2 -2
  138. package/web/.next/server/chunks/ssr/{_e5753970._.js.map → _575fe3ee._.js.map} +1 -1
  139. package/web/.next/server/chunks/ssr/_946a7fc6._.js +1 -1
  140. package/web/.next/server/chunks/ssr/_946a7fc6._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/{_fbf4db9c._.js → _a7184dfa._.js} +2 -2
  142. package/web/.next/server/chunks/ssr/{_fbf4db9c._.js.map → _a7184dfa._.js.map} +1 -1
  143. package/web/.next/server/chunks/ssr/_eff1b518._.js +1 -1
  144. package/web/.next/server/chunks/ssr/_eff1b518._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/_f227429a._.js +1 -1
  146. package/web/.next/server/chunks/ssr/_f227429a._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/_f86fc1bf._.js +1 -1
  148. package/web/.next/server/chunks/ssr/_f86fc1bf._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/_f8c55130._.js +1 -1
  150. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  151. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  153. package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js +1 -1
  154. package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js +1 -1
  162. package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js +1 -1
  164. package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js +1 -1
  166. package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js +1 -1
  168. package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js +1 -1
  170. package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +3 -3
  172. package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js +1 -1
  173. package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  175. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js +1 -1
  177. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  179. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  181. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js +1 -1
  183. package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js +1 -1
  185. package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js.map +1 -1
  186. package/web/.next/server/pages/500.html +2 -2
  187. package/web/.next/server/server-reference-manifest.js +1 -1
  188. package/web/.next/server/server-reference-manifest.json +54 -54
  189. package/web/.next/static/chunks/{be165be5db7a6054.js → 2424ab50273fe1d9.js} +1 -1
  190. package/web/.next/static/chunks/{443c0073e58878d8.js → 33dc7a1041f4ab64.js} +1 -1
  191. package/web/.next/static/chunks/{53f9385d4a447ad4.js → 6afd16b2fe544054.js} +2 -2
  192. package/web/.next/static/chunks/{b40755bc75789277.js → 7604027076448f2b.js} +1 -1
  193. package/web/.next/static/chunks/{ae94e98b7163890b.js → 87a0df5389e06641.js} +1 -1
  194. package/web/.next/static/chunks/{e65f14d14ad46a32.js → 8c9016ab8c1f6204.js} +1 -1
  195. package/web/.next/static/chunks/94e8559ae19a16e1.js +1 -0
  196. package/web/.next/static/chunks/a0cfca1e5fd467e9.js +1 -0
  197. package/web/.next/static/chunks/{7a9d8b705c0f8d2d.js → a2531137c7d36d54.js} +1 -1
  198. package/web/.next/static/chunks/{6ad23a3ac827b65b.js → ac22076c64634ac1.js} +1 -1
  199. package/web/.next/static/chunks/{e11508a76f5fca98.js → b4aa3a83f2451e07.js} +1 -1
  200. package/web/.next/static/chunks/{5635fe220632fced.js → b87904ecdddde972.js} +1 -1
  201. package/web/.next/static/chunks/{15951ad67a810e2c.js → be2e80436bc15812.js} +3 -3
  202. package/web/.next/static/chunks/{fe29d30a75e697ed.js → ceff12f8a2e5bc08.js} +1 -1
  203. package/web/.next/static/chunks/de7de1db2a8788dd.js +1 -0
  204. package/web/.next/static/chunks/{d8e96baa3feb79cb.js → e4f0ca20b62bd66f.js} +1 -1
  205. package/web/.next/static/chunks/25bbd99fa3dcc0b2.js +0 -1
  206. package/web/.next/static/chunks/b6ddc3e5f64bef7f.js +0 -1
  207. package/web/.next/static/chunks/d7310881615cb55b.js +0 -1
  208. /package/web/.next/static/{_PzlF7w3QzhaBsMnhT75_ → EVCmRtpgNX9ebXGb-bV1G}/_buildManifest.js +0 -0
  209. /package/web/.next/static/{_PzlF7w3QzhaBsMnhT75_ → EVCmRtpgNX9ebXGb-bV1G}/_clientMiddlewareManifest.json +0 -0
  210. /package/web/.next/static/{_PzlF7w3QzhaBsMnhT75_ → EVCmRtpgNX9ebXGb-bV1G}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/components/features/chat/ChatSheet.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/use-animations-enabled.ts","../../../../../../../src/presentation/web/hooks/useTheme.ts","../../../../../../../src/presentation/web/components/common/repo-group/repo-group.tsx","../../../../../../../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/sidebar-nav-item/sidebar-nav-item.tsx","../../../../../../../src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.tsx","../../../../../../../src/presentation/web/app/actions/data%3Ac62cb7%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3Ade3f99%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.tsx","../../../../../../../src/presentation/web/app/actions/data%3Af112bc%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-import-dialog.tsx","../../../../../../../src/presentation/web/hooks/use-notifications.ts","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-url-input.tsx","../../../../../../../src/presentation/web/lib/compare-versions.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/zap-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/grip-vertical.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/minimize-2.ts","../../../../../../../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/volume-off.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/table-properties.ts","../../../../../../../src/presentation/web/types/theme.ts","../../../../../../../src/presentation/web/components/common/feature-status-group/feature-status-group.tsx","../../../../../../../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/moon.ts","../../../../../../../src/presentation/web/components/ui/sonner.tsx","../../../../../../../node_modules/.pnpm/%40tanstack%2Bquery-core%405.95.1/node_modules/%40tanstack/query-core/build/modern/queryClient.js","../../../../../../../src/presentation/web/components/providers/query-provider.tsx","../../../../../../../node_modules/.pnpm/%40tanstack%2Bquery-core%405.95.1/node_modules/%40tanstack/query-core/build/modern/mutationCache.js","../../../../../../../node_modules/.pnpm/%40tanstack%2Bquery-core%405.95.1/node_modules/%40tanstack/query-core/build/modern/queryCache.js","../../../../../../../node_modules/.pnpm/%40tanstack%2Bquery-core%405.95.1/node_modules/%40tanstack/query-core/build/modern/infiniteQueryBehavior.js","../../../../../../../src/presentation/web/components/providers/i18n-provider.tsx","../../../../../../../src/presentation/web/lib/i18n.ts","../../../../../../../src/presentation/web/lib/rtl-fonts.ts"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MessageSquare, X, Bot, GripVertical, Maximize2, Minimize2 } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { ChatTab } from './ChatTab';\nimport { ChatDotIndicator } from './ChatDotIndicator';\nimport { useTurnStatus } from '@/hooks/turn-statuses-provider';\nimport { useFabLayout } from '@/hooks/fab-layout-context';\nimport { useSidebar } from '@/components/ui/sidebar';\nimport { useSidebarFeaturesContext } from '@/hooks/sidebar-features-context';\n\n// ── Persistent global chat popup (draggable + resizable) ──────────────────\n\nconst DEFAULT_W = 520;\nconst DEFAULT_H_VH = 70; // percentage of viewport height\nconst MIN_W = 360;\nconst MIN_H = 300;\n\ninterface Position {\n x: number;\n y: number;\n}\n\ninterface Size {\n w: number;\n h: number;\n}\n\nconst STORAGE_KEY = 'shep-global-chat';\n\nfunction loadPersistedState(): { pos: Position | null; size: Size | null } {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return { pos: null, size: null };\n const parsed = JSON.parse(raw);\n let size: Size | null = parsed.size ?? null;\n // Clamp persisted size to minimums — prevents invisible panel from bad state\n if (size && (size.w < MIN_W || size.h < MIN_H)) {\n size = { w: Math.max(MIN_W, size.w), h: Math.max(MIN_H, size.h) };\n }\n return {\n pos: parsed.pos ?? null,\n size,\n };\n } catch {\n return { pos: null, size: null };\n }\n}\n\nfunction persistState(pos: Position | null, size: Size | null) {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ pos, size }));\n } catch {\n // Storage full or unavailable — ignore\n }\n}\n\nexport function GlobalChatPopup() {\n const { t } = useTranslation('web');\n const [isOpen, setIsOpen] = useState(false);\n const [hasOpened, setHasOpened] = useState(false);\n const [isMaximized, setIsMaximized] = useState(false);\n const globalChatTurnStatus = useTurnStatus('global');\n const { swapPosition } = useFabLayout();\n const { state: sidebarState } = useSidebar();\n const { hasRepositories } = useSidebarFeaturesContext();\n\n // Position/size — initialized from localStorage\n // eslint-disable-next-line react/hook-use-state -- wrapped setters below\n const [pos, setPosRaw] = useState<Position | null>(() => loadPersistedState().pos);\n // eslint-disable-next-line react/hook-use-state -- wrapped setters below\n const [size, setSizeRaw] = useState<Size | null>(() => loadPersistedState().size);\n\n // Wrapped setters that also persist\n const setPos = useCallback(\n (v: Position | null | ((prev: Position | null) => Position | null)) => {\n setPosRaw((prev) => {\n const next = typeof v === 'function' ? v(prev) : v;\n // Defer persist to avoid doing it on every mousemove frame\n return next;\n });\n },\n []\n );\n\n const setSize = useCallback((v: Size | null | ((prev: Size | null) => Size | null)) => {\n setSizeRaw((prev) => {\n const next = typeof v === 'function' ? v(prev) : v;\n return next;\n });\n }, []);\n\n const panelRef = useRef<HTMLDivElement>(null);\n const dragRef = useRef<{\n startX: number;\n startY: number;\n startPosX: number;\n startPosY: number;\n } | null>(null);\n const resizeRef = useRef<{\n startX: number;\n startY: number;\n startW: number;\n startH: number;\n } | null>(null);\n\n const toggle = useCallback(() => {\n setIsOpen((prev) => {\n if (!prev) setHasOpened(true);\n return !prev;\n });\n }, []);\n\n // Store pre-maximize pos/size so we can restore\n const preMaxRef = useRef<{ pos: Position | null; size: Size | null }>({ pos: null, size: null });\n\n const toggleMaximize = useCallback(() => {\n if (!isOpen) {\n setIsOpen(true);\n setHasOpened(true);\n }\n setIsMaximized((prev) => {\n if (!prev) {\n // Entering maximize — save current state\n preMaxRef.current = { pos, size };\n } else {\n // Leaving maximize — restore previous state\n setPos(preMaxRef.current.pos);\n setSize(preMaxRef.current.size);\n }\n return !prev;\n });\n }, [isOpen, pos, size, setPos, setSize]);\n\n // Keyboard shortcuts: Cmd/Ctrl+Shift+K = toggle, Cmd/Ctrl+Shift+M = maximize\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.shiftKey && (e.key === 'k' || e.key === 'K')) {\n e.preventDefault();\n if (isMaximized) setIsMaximized(false);\n toggle();\n // Focus the composer input after panel opens\n requestAnimationFrame(() => {\n setTimeout(() => {\n const input = panelRef.current?.querySelector<HTMLTextAreaElement>('textarea');\n input?.focus();\n }, 100);\n });\n }\n if ((e.metaKey || e.ctrlKey) && e.shiftKey && (e.key === 'm' || e.key === 'M')) {\n e.preventDefault();\n toggleMaximize();\n }\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [toggle, toggleMaximize, isMaximized]);\n\n // Persist position/size to localStorage (debounced)\n useEffect(() => {\n const timer = setTimeout(() => persistState(pos, size), 300);\n return () => clearTimeout(timer);\n }, [pos, size]);\n\n /** Clamp position so the header (top 48px) stays within viewport. */\n const clampPos = useCallback((x: number, y: number, w: number): Position => {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const HEADER_H = 48;\n return {\n // Keep at least 100px of width visible horizontally\n x: Math.max(-w + 100, Math.min(x, vw - 100)),\n // Keep header on screen: top >= 0, top <= viewport - header height\n y: Math.max(0, Math.min(y, vh - HEADER_H)),\n };\n }, []);\n\n // ── Drag handling ──────────────────────────────────────────────────────\n const onDragStart = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n const panel = panelRef.current;\n if (!panel) return;\n\n const rect = panel.getBoundingClientRect();\n const currentX = pos?.x ?? rect.left;\n const currentY = pos?.y ?? rect.top;\n\n dragRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startPosX: currentX,\n startPosY: currentY,\n };\n\n const panelW = size?.w ?? rect.width;\n\n const onMove = (ev: MouseEvent) => {\n if (!dragRef.current) return;\n const dx = ev.clientX - dragRef.current.startX;\n const dy = ev.clientY - dragRef.current.startY;\n setPos(clampPos(dragRef.current.startPosX + dx, dragRef.current.startPosY + dy, panelW));\n };\n\n const onUp = () => {\n dragRef.current = null;\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n };\n\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n },\n [pos, size, setPos, clampPos]\n );\n\n // ── Resize handling (from top-right corner) ────────────────────────────\n const onResizeStart = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const panel = panelRef.current;\n if (!panel) return;\n\n const rect = panel.getBoundingClientRect();\n const startW = size?.w ?? rect.width;\n const startH = size?.h ?? rect.height;\n const startX = e.clientX;\n const startY = e.clientY;\n const startPosY = pos?.y ?? rect.top;\n\n resizeRef.current = { startX, startY, startW, startH };\n\n // Capture position if not set yet\n if (!pos) {\n setPos({ x: rect.left, y: rect.top });\n }\n\n const onMove = (ev: MouseEvent) => {\n if (!resizeRef.current) return;\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n const newW = Math.max(MIN_W, startW + dx);\n const newH = Math.max(MIN_H, startH - dy);\n // Top edge moves with height change, clamped to viewport\n const newY = Math.max(0, startPosY + dy);\n setSize({ w: newW, h: newH });\n setPos((prev) => clampPos(prev?.x ?? rect.left, newY, newW));\n };\n\n const onUp = () => {\n resizeRef.current = null;\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n };\n\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n },\n [size, pos, setPos, setSize, clampPos]\n );\n\n // Reset position/size on close for clean reopen\n const handleClose = useCallback(() => {\n setIsOpen(false);\n setIsMaximized(false);\n }, []);\n\n // Compute panel style — maximized overrides everything\n const panelStyle: React.CSSProperties = isMaximized\n ? {}\n : pos\n ? {\n position: 'fixed',\n left: pos.x,\n top: pos.y,\n width: size?.w ?? DEFAULT_W,\n height: size?.h ?? `${DEFAULT_H_VH}vh`,\n }\n : {\n width: size?.w ?? DEFAULT_W,\n height: size?.h ?? `${DEFAULT_H_VH}vh`,\n };\n\n return (\n <>\n {/* Chat panel */}\n {hasOpened ? (\n <div\n ref={panelRef}\n className={cn(\n isMaximized\n ? 'bg-background fixed inset-0 z-[60] flex flex-col overflow-hidden dark:bg-neutral-900'\n : cn(\n !pos && (swapPosition ? 'fixed start-8 bottom-24' : 'fixed end-8 bottom-24'),\n 'z-[60] flex flex-col overflow-hidden rounded-lg',\n 'border-border/60 border dark:border-white/10',\n 'bg-background dark:bg-neutral-900',\n 'shadow-[0_8px_40px_-8px_rgba(0,0,0,0.2)] dark:shadow-[0_8px_40px_-8px_rgba(0,0,0,0.6)]'\n ),\n 'transition-opacity duration-300 ease-out',\n isOpen ? 'pointer-events-auto opacity-100' : 'pointer-events-none opacity-0'\n )}\n style={panelStyle}\n >\n {/* Violet accent strip at top */}\n {!isMaximized ? (\n <div className=\"h-[2px] shrink-0 bg-gradient-to-r from-transparent via-violet-500/50 to-transparent\" />\n ) : null}\n\n {/* Resize handle — top-right corner (hidden when maximized) */}\n {!isMaximized ? (\n <div\n onMouseDown={onResizeStart}\n className=\"absolute end-0 top-0 z-10 h-4 w-4 cursor-ne-resize\"\n />\n ) : null}\n\n {/* Header — draggable when not maximized */}\n <div\n onMouseDown={isMaximized ? undefined : onDragStart}\n className={cn(\n 'relative flex h-11 shrink-0 items-center gap-2.5 border-b border-black/[0.06] px-3.5 dark:border-white/[0.06]',\n !isMaximized && 'cursor-grab active:cursor-grabbing'\n )}\n >\n <div className=\"from-foreground/[0.02] to-foreground/[0.02] pointer-events-none absolute inset-0 bg-gradient-to-r via-transparent\" />\n {!isMaximized ? (\n <GripVertical className=\"text-foreground/15 relative h-3.5 w-3.5 shrink-0\" />\n ) : null}\n <div className=\"relative flex h-5 w-5 items-center justify-center\">\n <Bot className=\"text-foreground/50 h-4 w-4\" />\n </div>\n <div className=\"relative flex items-baseline gap-2\">\n <span className=\"text-foreground/90 text-base font-bold tracking-tight\">Shep</span>\n <span className=\"text-foreground/30 text-xs font-medium tracking-widest uppercase\">\n global\n </span>\n </div>\n <div className=\"relative ms-auto flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={toggleMaximize}\n className=\"text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors\"\n title={isMaximized ? 'Restore (⌘⇧M)' : 'Maximize (⌘⇧M)'}\n >\n {isMaximized ? (\n <Minimize2 className=\"h-3.5 w-3.5\" />\n ) : (\n <Maximize2 className=\"h-3.5 w-3.5\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors\"\n title=\"Close (⌘⇧K)\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n\n {/* Chat content */}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n <ChatTab featureId=\"global\" />\n </div>\n\n {/* Resize handle — bottom-right corner (hidden when maximized) */}\n {!isMaximized ? (\n <div\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n const panel = panelRef.current;\n if (!panel) return;\n const rect = panel.getBoundingClientRect();\n const startX = e.clientX;\n const startY = e.clientY;\n const startW = size?.w ?? rect.width;\n const startH = size?.h ?? rect.height;\n if (!pos) setPos({ x: rect.left, y: rect.top });\n\n const onMove = (ev: MouseEvent) => {\n const maxH = window.innerHeight - (pos?.y ?? rect.top);\n setSize({\n w: Math.max(MIN_W, startW + (ev.clientX - startX)),\n h: Math.max(MIN_H, Math.min(startH + (ev.clientY - startY), maxH)),\n });\n };\n const onUp = () => {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n };\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n }}\n className=\"absolute end-0 bottom-0 z-10 h-4 w-4 cursor-se-resize\"\n />\n ) : null}\n </div>\n ) : null}\n\n {/* Chat FAB — hidden during onboarding (no repos), shown after first project */}\n {!hasRepositories ? null : (\n <ChatFabWrapper\n swapPosition={swapPosition}\n sidebarState={sidebarState}\n isMaximized={isMaximized}\n >\n <Button\n size=\"icon\"\n onClick={toggle}\n className={cn(\n 'relative h-14 w-14 rounded-full shadow-lg',\n 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95',\n isOpen\n ? 'bg-violet-600 text-white hover:bg-violet-500'\n : 'bg-violet-500 text-white hover:bg-violet-400 dark:bg-violet-500 dark:hover:bg-violet-400',\n // Animated states when chat is closed\n !isOpen && globalChatTurnStatus === 'processing' && 'chat-fab-spinning',\n !isOpen && globalChatTurnStatus === 'unread' && 'chat-fab-glow-unread',\n !isOpen && globalChatTurnStatus === 'awaiting_input' && 'chat-fab-glow-awaiting'\n )}\n >\n <MessageSquare\n className={cn(\n 'absolute h-7 w-7 stroke-[2.5] transition-all duration-200',\n isOpen ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100'\n )}\n />\n <X\n className={cn(\n 'absolute h-6 w-6 stroke-[2.5] transition-all duration-200',\n isOpen ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0'\n )}\n />\n {!isOpen && <ChatDotIndicator status={globalChatTurnStatus} className=\"end-0 top-0\" />}\n </Button>\n {/* Tooltip — slides up on hover */}\n <div className=\"pointer-events-none absolute bottom-[calc(100%+8px)] left-1/2 -translate-x-1/2 translate-y-1 opacity-0 transition-all duration-200 group-hover/fab:translate-y-0 group-hover/fab:opacity-100\">\n <div className=\"bg-foreground rounded-lg px-3 py-1.5 text-center shadow-lg\">\n <p className=\"text-background text-xs font-medium whitespace-nowrap\">\n {t('chat.shepChat')}\n </p>\n <p className=\"text-background/50 mt-0.5 flex items-center justify-center gap-1 text-[10px]\">\n <kbd className=\"bg-background/15 rounded px-1 py-px font-mono\">⌘</kbd>\n <kbd className=\"bg-background/15 rounded px-1 py-px font-mono\">⇧</kbd>\n <kbd className=\"bg-background/15 rounded px-1 py-px font-mono\">K</kbd>\n </p>\n </div>\n </div>\n </ChatFabWrapper>\n )}\n </>\n );\n}\n\n/** Wrapper for the Chat FAB that handles position swapping. */\nfunction ChatFabWrapper({\n swapPosition,\n sidebarState,\n isMaximized,\n children,\n}: {\n swapPosition: boolean;\n sidebarState: 'expanded' | 'collapsed';\n isMaximized: boolean;\n children: React.ReactNode;\n}) {\n const { i18n } = useTranslation('web');\n const isRtl = i18n.dir() === 'rtl';\n\n if (!swapPosition) {\n return (\n <div className={cn('group/fab fixed end-8 bottom-6 z-30', isMaximized && 'hidden')}>\n {children}\n </div>\n );\n }\n\n // Swapped: chat FAB moves to start side, tracking sidebar width\n const sidebarOffset =\n sidebarState === 'expanded'\n ? 'calc(var(--sidebar-width) + 32px)'\n : 'calc(var(--sidebar-width-icon) + 32px)';\n\n const positionStyle: React.CSSProperties = isRtl\n ? { right: sidebarOffset, transition: 'right 200ms ease-in-out' }\n : { left: sidebarOffset, transition: 'left 200ms ease-in-out' };\n\n return (\n <div\n className={cn('group/fab fixed bottom-6 z-30', isMaximized && 'hidden')}\n style={positionStyle}\n >\n {children}\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 { useTranslation } from 'react-i18next';\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 { t } = useTranslation('web');\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-start\">\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={t('versionBadge.version')} value={displayVersion} />\n {isDev && branch ? <Row label={t('versionBadge.branch')} value={branch} /> : null}\n {isDev && shortHash ? (\n <Row label={t('versionBadge.commit')} value={shortHash} mono />\n ) : null}\n {isDev && instancePath ? (\n <Row label={t('versionBadge.path')} value={instancePath} mono />\n ) : 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 /** i18n translation key under the `web` namespace (e.g. `sidebar.statusActionNeeded`). */\n labelKey: 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 labelKey: 'sidebar.statusActionNeeded',\n },\n 'in-progress': {\n icon: Loader2,\n iconClass: 'text-blue-500 animate-spin',\n bgClass: 'bg-blue-500/10',\n labelKey: 'sidebar.statusInProgress',\n },\n pending: {\n icon: Clock,\n iconClass: 'text-slate-400',\n bgClass: 'bg-slate-400/10',\n labelKey: 'sidebar.statusPending',\n },\n blocked: {\n icon: Ban,\n iconClass: 'text-gray-400',\n bgClass: 'bg-gray-400/10',\n labelKey: 'sidebar.statusBlocked',\n },\n error: {\n icon: CircleX,\n iconClass: 'text-red-500',\n bgClass: 'bg-red-500/10',\n labelKey: 'sidebar.statusError',\n },\n done: {\n icon: CircleCheck,\n iconClass: 'text-emerald-500',\n bgClass: 'bg-emerald-500/10',\n labelKey: 'sidebar.statusDone',\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=\"ms-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';\n\nconst STORAGE_KEY = 'shep-animations-enabled';\nconst SYNC_EVENT = 'shep:animations-toggle';\nconst BODY_CLASS = 'no-animations';\n\nexport interface UseAnimationsEnabledResult {\n enabled: boolean;\n toggle: () => void;\n}\n\nexport function useAnimationsEnabled(): UseAnimationsEnabledResult {\n const [enabled, setEnabled] = useState(true);\n\n useEffect(() => {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored === 'false') {\n setEnabled(false);\n document.body.classList.add(BODY_CLASS);\n }\n\n const onSync = (e: Event) => {\n const next = (e as CustomEvent<boolean>).detail;\n setEnabled(next);\n document.body.classList.toggle(BODY_CLASS, !next);\n };\n window.addEventListener(SYNC_EVENT, onSync);\n return () => window.removeEventListener(SYNC_EVENT, onSync);\n }, []);\n\n const toggle = useCallback(() => {\n const next = !enabled;\n localStorage.setItem(STORAGE_KEY, String(next));\n setEnabled(next);\n document.body.classList.toggle(BODY_CLASS, !next);\n window.dispatchEvent(new CustomEvent(SYNC_EVENT, { detail: next }));\n }, [enabled]);\n\n return { enabled, toggle };\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 { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { ChevronDown, GitFork, Plus } from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\nexport interface RepoGroupProps {\n /** Display name for the repository */\n repoName: string;\n /** Total number of features in this repo */\n featureCount: number;\n children: ReactNode;\n /** Whether the group starts expanded (default: true) */\n defaultOpen?: boolean;\n /** Called when the user clicks the + button to add a feature */\n onAddFeature?: () => void;\n}\n\nexport function RepoGroup({\n repoName,\n featureCount,\n children,\n defaultOpen = true,\n onAddFeature,\n}: RepoGroupProps) {\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <div data-testid=\"repo-group\" className=\"group/repo mb-1\">\n <div className=\"flex items-center\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className={cn(\n 'text-sidebar-foreground hover:bg-sidebar-accent flex min-w-0 flex-1 items-center gap-1.5 rounded-md px-2 py-1.5 text-left text-xs font-semibold',\n 'transition-colors duration-100'\n )}\n aria-expanded={open}\n >\n <ChevronDown\n className={cn(\n 'text-muted-foreground h-3.5 w-3.5 shrink-0 transition-transform duration-200',\n !open && '-rotate-90'\n )}\n />\n <GitFork className=\"text-muted-foreground h-3.5 w-3.5 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{repoName}</span>\n <span\n aria-label={`${featureCount} features`}\n className=\"bg-sidebar-accent text-sidebar-accent-foreground ml-auto inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full px-1 text-[0.6rem] font-medium tabular-nums\"\n role=\"img\"\n >\n {featureCount}\n </span>\n </button>\n {onAddFeature ? (\n <button\n type=\"button\"\n data-testid=\"repo-add-feature\"\n onClick={(e) => {\n e.stopPropagation();\n onAddFeature();\n }}\n className={cn(\n 'text-muted-foreground hover:text-sidebar-foreground hover:bg-sidebar-accent mr-2 shrink-0 rounded-md p-1 opacity-0 transition-all duration-100 group-hover/repo:opacity-100',\n 'focus-visible:ring-ring focus-visible:opacity-100 focus-visible:ring-1 focus-visible:outline-none'\n )}\n aria-label={`Add feature to ${repoName}`}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n {open ? <div className=\"pl-2\">{children}</div> : null}\n </div>\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 { useMemo } from 'react';\nimport { usePathname } from 'next/navigation';\nimport {\n Home,\n Moon,\n Sun,\n Volume2,\n VolumeOff,\n Zap,\n ZapOff,\n Wrench,\n Puzzle,\n Settings,\n TableProperties,\n} from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\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 { useAnimationsEnabled } from '@/hooks/use-animations-enabled';\nimport { useTheme } from '@/hooks/useTheme';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { FeatureStatusGroup } from '@/components/common/feature-status-group';\nimport { RepoGroup } from '@/components/common/repo-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 repositoryPath: string;\n repositoryName: string;\n}\n\nexport interface AppSidebarProps {\n features: FeatureItem[];\n featureFlags: FeatureFlagsState;\n\n onFeatureClick?: (featureId: string) => void;\n /** Called when the user clicks the + button on a repo group to create a feature */\n onAddFeature?: (repositoryPath: string) => void;\n}\n\nexport function AppSidebar({\n features,\n featureFlags,\n\n onFeatureClick,\n onAddFeature,\n}: AppSidebarProps) {\n const { t, i18n } = useTranslation('web');\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 { enabled: animationsEnabled, toggle: toggleAnimations } = useAnimationsEnabled();\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 // Group features by repository, then by status within each repo\n const repoGroups = useMemo(() => {\n const byRepo = new Map<string, { repoName: string; features: FeatureItem[] }>();\n for (const feature of features) {\n const key = feature.repositoryPath;\n let group = byRepo.get(key);\n if (!group) {\n group = { repoName: feature.repositoryName, features: [] };\n byRepo.set(key, group);\n }\n group.features.push(feature);\n }\n return Array.from(byRepo.entries()).map(([repoPath, { repoName, features: repoFeatures }]) => ({\n repoPath,\n repoName,\n featureCount: repoFeatures.length,\n statusGroups: featureStatusOrder\n .map((statusKey) => ({\n statusKey,\n label: t(featureStatusConfig[statusKey].labelKey),\n items: repoFeatures.filter((f) => f.status === statusKey),\n }))\n .filter((g) => g.items.length > 0),\n }));\n }, [features, t]);\n\n return (\n <Sidebar\n data-testid=\"app-sidebar\"\n data-no-drawer-close\n collapsible=\"icon\"\n side={i18n.dir() === 'rtl' ? 'right' : 'left'}\n >\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\n icon={Home}\n label={t('navigation.controlCenter')}\n href=\"/\"\n active={pathname === '/'}\n />\n {featureFlags.inventory ? (\n <SidebarNavItem\n icon={TableProperties}\n label={t('navigation.inventory')}\n href=\"/features\"\n active={pathname === '/features'}\n />\n ) : null}\n <SidebarNavItem\n icon={Wrench}\n label={t('navigation.tools')}\n href=\"/tools\"\n active={pathname === '/tools'}\n />\n {featureFlags.skills ? (\n <SidebarNavItem\n icon={Puzzle}\n label={t('navigation.skills')}\n href=\"/skills\"\n active={pathname === '/skills'}\n />\n ) : null}\n <SidebarNavItem\n icon={Settings}\n label={t('navigation.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={t('sidebar.features')} />\n <ScrollArea className=\"min-h-0 flex-1\">\n {repoGroups.map(({ repoPath, repoName, featureCount, statusGroups }) => (\n <RepoGroup\n key={repoPath}\n repoName={repoName}\n featureCount={featureCount}\n onAddFeature={onAddFeature ? () => onAddFeature(repoPath) : undefined}\n >\n {statusGroups.map(({ statusKey, label, items }) => (\n <FeatureStatusGroup key={statusKey} 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 ))}\n </RepoGroup>\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={\n resolvedTheme === 'dark'\n ? t('sidebar.switchToLight')\n : t('sidebar.switchToDark')\n }\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'\n ? t('sidebar.switchToLight')\n : t('sidebar.switchToDark')}\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={\n soundEnabled ? t('sidebar.muteSounds') : t('sidebar.unmuteSounds')\n }\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 ? t('sidebar.muteSounds') : t('sidebar.unmuteSounds')}\n </TooltipContent>\n </Tooltip>\n )}\n {!collapsed && (\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarMenuButton\n className=\"w-auto flex-none\"\n onClick={() => {\n clickSound.play();\n toggleAnimations();\n }}\n aria-label={animationsEnabled ? 'Disable animations' : 'Enable animations'}\n >\n {animationsEnabled ? (\n <Zap className=\"h-4 w-4\" />\n ) : (\n <ZapOff className=\"h-4 w-4\" />\n )}\n </SidebarMenuButton>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n {animationsEnabled ? 'Disable animations' : 'Enable animations'}\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 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","/* __next_internal_action_entry_do_not_use__ [{\"40192685e178327248c4ee3e7ed433168089f96062\":\"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(\"40192685e178327248c4ee3e7ed433168089f96062\",callServer,void 0,findSourceMapURL,\"listGitHubRepositories\");export{$$RSC_SERVER_ACTION_0 as listGitHubRepositories};","/* __next_internal_action_entry_do_not_use__ [{\"00bd27b30e6c35aa39ca5fcf0280d5b3379cd1c07e\":\"listGitHubOrganizations\"},\"src/presentation/web/app/actions/list-github-organizations.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"00bd27b30e6c35aa39ca5fcf0280d5b3379cd1c07e\",callServer,void 0,findSourceMapURL,\"listGitHubOrganizations\");export{$$RSC_SERVER_ACTION_0 as listGitHubOrganizations};","'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 {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { listGitHubRepositories } from '@/app/actions/list-github-repositories';\nimport { listGitHubOrganizations } from '@/app/actions/list-github-organizations';\nimport type { GitHubRepo } from '@shepai/core/application/ports/output/services/github-repository-service.interface';\nimport type { GitHubOrganization } from '@shepai/core/application/ports/output/services/github-repository-service.interface';\n\n/** Sentinel value representing the authenticated user's personal account */\nconst PERSONAL_OWNER = '__personal__';\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 owner?: string;\n }) => Promise<{ repos?: GitHubRepo[]; error?: string }>;\n /** Override the fetch function for testing/stories */\n fetchOrgs?: () => Promise<{ orgs?: GitHubOrganization[]; error?: string }>;\n}\n\nexport function GitHubRepoBrowser({\n onSelect,\n loading: externalLoading = false,\n fetchRepos = listGitHubRepositories,\n fetchOrgs = listGitHubOrganizations,\n}: GitHubRepoBrowserProps) {\n const [repos, setRepos] = useState<GitHubRepo[]>([]);\n const [orgs, setOrgs] = useState<GitHubOrganization[]>([]);\n const [fetching, setFetching] = useState(true);\n const [error, setError] = useState('');\n const [search, setSearch] = useState('');\n const [selectedOwner, setSelectedOwner] = useState(PERSONAL_OWNER);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Fetch organizations on mount\n useEffect(() => {\n async function loadOrgs() {\n try {\n const result = await fetchOrgs();\n if (result.orgs) {\n setOrgs(result.orgs);\n }\n } catch {\n // Org listing failure is non-critical — user can still browse personal repos\n }\n }\n loadOrgs();\n }, [fetchOrgs]);\n\n const fetchData = useCallback(\n async (searchTerm?: string, owner?: string) => {\n setFetching(true);\n setError('');\n try {\n const input: { search?: string; owner?: string } = {};\n if (searchTerm) input.search = searchTerm;\n if (owner && owner !== PERSONAL_OWNER) input.owner = owner;\n const result = await fetchRepos(Object.keys(input).length > 0 ? input : 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(search || undefined, selectedOwner);\n }, [fetchData, selectedOwner]); // eslint-disable-line react-hooks/exhaustive-deps\n\n function handleSearchChange(value: string) {\n setSearch(value);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n fetchData(value || undefined, selectedOwner);\n }, 300);\n }\n\n function handleOwnerChange(value: string) {\n setSelectedOwner(value);\n setSearch('');\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 {orgs.length > 0 ? (\n <Select value={selectedOwner} onValueChange={handleOwnerChange} disabled={disabled}>\n <SelectTrigger aria-label=\"Select owner\">\n <SelectValue placeholder=\"Select owner\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={PERSONAL_OWNER}>My repositories</SelectItem>\n {orgs.map((org) => (\n <SelectItem key={org.login} value={org.login}>\n {org.login}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n\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=\"ps-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-start 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=\"me-1 h-3 w-3\" />\n Private\n </>\n ) : (\n <>\n <Globe className=\"me-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__ [{\"401df75e6c7fb8e097b733abb8797bdfcdccbefb47\":\"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(\"401df75e6c7fb8e097b733abb8797bdfcdccbefb47\",callServer,void 0,findSourceMapURL,\"importGitHubRepository\");export{$$RSC_SERVER_ACTION_0 as importGitHubRepository};","'use client';\n\nimport { useCallback, useEffect, useState, type ReactNode } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { useTranslation } from 'react-i18next';\nimport { Direction } from 'radix-ui';\nimport { SidebarProvider, SidebarInset } from '@/components/ui/sidebar';\nimport { AppSidebar } from '@/components/layouts/app-sidebar';\nimport { ReactFileManagerDialog } from '@/components/common/react-file-manager-dialog';\nimport { GlobalChatPopup } from '@/components/features/chat/ChatSheet';\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';\nimport { TurnStatusesProvider } from '@/hooks/turn-statuses-provider';\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\nfunction AppShellInner({ children, sidebarOpen }: AppShellProps) {\n const router = useRouter();\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 } = useSidebarFeaturesContext();\n\n const handleFeatureClick = useCallback(\n (featureId: string) => {\n guardedNavigate(() => router.push(`/feature/${featureId}`));\n },\n [router, guardedNavigate]\n );\n\n const handleAddFeature = useCallback(\n (repositoryPath: string) => {\n guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repositoryPath)}`));\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 // Listen for pick-folder events from the canvas toolbar\n useEffect(() => {\n const handler = () => {\n void handleAddRepository();\n };\n window.addEventListener('shep:pick-folder', handler);\n return () => window.removeEventListener('shep:pick-folder', handler);\n }, [handleAddRepository]);\n\n // Listen for GitHub import event from (+) FAB\n useEffect(() => {\n const handler = () => setGithubDialogOpen(true);\n window.addEventListener('shep:open-github-import', handler);\n return () => window.removeEventListener('shep:open-github-import', handler);\n }, []);\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 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 return (\n <SidebarProvider defaultOpen={sidebarOpen ?? false}>\n <AppSidebar\n features={features}\n featureFlags={featureFlags}\n onFeatureClick={handleFeatureClick}\n onAddFeature={handleAddFeature}\n />\n <SidebarInset>\n <div className=\"relative h-full\">\n <main className=\"h-full\">{children}</main>\n {/* Global chat popup — fixed, visible across all pages */}\n <GlobalChatPopup />\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\n/** Wraps children with TurnStatusesProvider (polls all active statuses from backend). */\nfunction TurnStatusesBridge({ children }: { children: ReactNode }) {\n return <TurnStatusesProvider>{children}</TurnStatusesProvider>;\n}\n\nexport function AppShell({ children, sidebarOpen }: AppShellProps) {\n const { i18n } = useTranslation();\n const dir = i18n.dir();\n\n return (\n <Direction.Provider dir={dir}>\n <AgentEventsProvider>\n <DrawerCloseGuardProvider>\n <SidebarFeaturesProvider>\n <TurnStatusesBridge>\n <AppShellInner sidebarOpen={sidebarOpen}>{children}</AppShellInner>\n </TurnStatusesBridge>\n </SidebarFeaturesProvider>\n </DrawerCloseGuardProvider>\n </AgentEventsProvider>\n </Direction.Provider>\n );\n}\n","'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 { 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","/**\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 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 ['path', { d: 'M10.513 4.856 13.12 2.17a.5.5 0 0 1 .86.46l-1.377 4.317', key: '193nxd' }],\n ['path', { d: 'M15.656 10H20a1 1 0 0 1 .78 1.63l-1.72 1.773', key: '27a7lr' }],\n [\n 'path',\n {\n d: 'M16.273 16.273 10.88 21.83a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14H4a1 1 0 0 1-.78-1.63l4.507-4.643',\n key: '1e0qe9',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name ZapOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNTEzIDQuODU2IDEzLjEyIDIuMTdhLjUuNSAwIDAgMSAuODYuNDZsLTEuMzc3IDQuMzE3IiAvPgogIDxwYXRoIGQ9Ik0xNS42NTYgMTBIMjBhMSAxIDAgMCAxIC43OCAxLjYzbC0xLjcyIDEuNzczIiAvPgogIDxwYXRoIGQ9Ik0xNi4yNzMgMTYuMjczIDEwLjg4IDIxLjgzYS41LjUgMCAwIDEtLjg2LS40NmwxLjkyLTYuMDJBMSAxIDAgMCAwIDExIDE0SDRhMSAxIDAgMCAxLS43OC0xLjYzbDQuNTA3LTQuNjQzIiAvPgogIDxwYXRoIGQ9Im0yIDIgMjAgMjAiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/zap-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 ZapOff = createLucideIcon('zap-off', __iconNode);\n\nexport default ZapOff;\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: '9', cy: '12', r: '1', key: '1vctgf' }],\n ['circle', { cx: '9', cy: '5', r: '1', key: 'hp0tcf' }],\n ['circle', { cx: '9', cy: '19', r: '1', key: 'fkjjf6' }],\n ['circle', { cx: '15', cy: '12', r: '1', key: '1tmaij' }],\n ['circle', { cx: '15', cy: '5', r: '1', key: '19l28e' }],\n ['circle', { cx: '15', cy: '19', r: '1', key: 'f4zoj3' }],\n];\n\n/**\n * @component @name GripVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjUiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTUiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTkiIHI9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/grip-vertical\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 GripVertical = createLucideIcon('grip-vertical', __iconNode);\n\nexport default GripVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm14 10 7-7', key: 'oa77jy' }],\n ['path', { d: 'M20 10h-6V4', key: 'mjg0md' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M4 14h6v6', key: 'rmj7iw' }],\n];\n\n/**\n * @component @name Minimize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTQgMTAgNy03IiAvPgogIDxwYXRoIGQ9Ik0yMCAxMGgtNlY0IiAvPgogIDxwYXRoIGQ9Im0zIDIxIDctNyIgLz4KICA8cGF0aCBkPSJNNCAxNGg2djYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/minimize-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 Minimize2 = createLucideIcon('minimize-2', __iconNode);\n\nexport default Minimize2;\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 ['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 3v18', key: '14nvp0' }],\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M21 9H3', key: '1338ky' }],\n ['path', { d: 'M21 15H3', key: '9uk58r' }],\n];\n\n/**\n * @component @name TableProperties\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM3YxOCIgLz4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik0yMSA5SDMiIC8+CiAgPHBhdGggZD0iTTIxIDE1SDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/table-properties\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 TableProperties = createLucideIcon('table-properties', __iconNode);\n\nexport default TableProperties;\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 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 ms-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 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: '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","'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","// src/queryClient.ts\nimport {\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n noop,\n partialMatchKey,\n resolveStaleTime,\n skipToken\n} from \"./utils.js\";\nimport { QueryCache } from \"./queryCache.js\";\nimport { MutationCache } from \"./mutationCache.js\";\nimport { focusManager } from \"./focusManager.js\";\nimport { onlineManager } from \"./onlineManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { infiniteQueryBehavior } from \"./infiniteQueryBehavior.js\";\nvar QueryClient = class {\n #queryCache;\n #mutationCache;\n #defaultOptions;\n #queryDefaults;\n #mutationDefaults;\n #mountCount;\n #unsubscribeFocus;\n #unsubscribeOnline;\n constructor(config = {}) {\n this.#queryCache = config.queryCache || new QueryCache();\n this.#mutationCache = config.mutationCache || new MutationCache();\n this.#defaultOptions = config.defaultOptions || {};\n this.#queryDefaults = /* @__PURE__ */ new Map();\n this.#mutationDefaults = /* @__PURE__ */ new Map();\n this.#mountCount = 0;\n }\n mount() {\n this.#mountCount++;\n if (this.#mountCount !== 1) return;\n this.#unsubscribeFocus = focusManager.subscribe(async (focused) => {\n if (focused) {\n await this.resumePausedMutations();\n this.#queryCache.onFocus();\n }\n });\n this.#unsubscribeOnline = onlineManager.subscribe(async (online) => {\n if (online) {\n await this.resumePausedMutations();\n this.#queryCache.onOnline();\n }\n });\n }\n unmount() {\n this.#mountCount--;\n if (this.#mountCount !== 0) return;\n this.#unsubscribeFocus?.();\n this.#unsubscribeFocus = void 0;\n this.#unsubscribeOnline?.();\n this.#unsubscribeOnline = void 0;\n }\n isFetching(filters) {\n return this.#queryCache.findAll({ ...filters, fetchStatus: \"fetching\" }).length;\n }\n isMutating(filters) {\n return this.#mutationCache.findAll({ ...filters, status: \"pending\" }).length;\n }\n /**\n * Imperative (non-reactive) way to retrieve data for a QueryKey.\n * Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates.\n *\n * Hint: Do not use this function inside a component, because it won't receive updates.\n * Use `useQuery` to create a `QueryObserver` that subscribes to changes.\n */\n getQueryData(queryKey) {\n const options = this.defaultQueryOptions({ queryKey });\n return this.#queryCache.get(options.queryHash)?.state.data;\n }\n ensureQueryData(options) {\n const defaultedOptions = this.defaultQueryOptions(options);\n const query = this.#queryCache.build(this, defaultedOptions);\n const cachedData = query.state.data;\n if (cachedData === void 0) {\n return this.fetchQuery(options);\n }\n if (options.revalidateIfStale && query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))) {\n void this.prefetchQuery(defaultedOptions);\n }\n return Promise.resolve(cachedData);\n }\n getQueriesData(filters) {\n return this.#queryCache.findAll(filters).map(({ queryKey, state }) => {\n const data = state.data;\n return [queryKey, data];\n });\n }\n setQueryData(queryKey, updater, options) {\n const defaultedOptions = this.defaultQueryOptions({ queryKey });\n const query = this.#queryCache.get(\n defaultedOptions.queryHash\n );\n const prevData = query?.state.data;\n const data = functionalUpdate(updater, prevData);\n if (data === void 0) {\n return void 0;\n }\n return this.#queryCache.build(this, defaultedOptions).setData(data, { ...options, manual: true });\n }\n setQueriesData(filters, updater, options) {\n return notifyManager.batch(\n () => this.#queryCache.findAll(filters).map(({ queryKey }) => [\n queryKey,\n this.setQueryData(queryKey, updater, options)\n ])\n );\n }\n getQueryState(queryKey) {\n const options = this.defaultQueryOptions({ queryKey });\n return this.#queryCache.get(\n options.queryHash\n )?.state;\n }\n removeQueries(filters) {\n const queryCache = this.#queryCache;\n notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n queryCache.remove(query);\n });\n });\n }\n resetQueries(filters, options) {\n const queryCache = this.#queryCache;\n return notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n query.reset();\n });\n return this.refetchQueries(\n {\n type: \"active\",\n ...filters\n },\n options\n );\n });\n }\n cancelQueries(filters, cancelOptions = {}) {\n const defaultedCancelOptions = { revert: true, ...cancelOptions };\n const promises = notifyManager.batch(\n () => this.#queryCache.findAll(filters).map((query) => query.cancel(defaultedCancelOptions))\n );\n return Promise.all(promises).then(noop).catch(noop);\n }\n invalidateQueries(filters, options = {}) {\n return notifyManager.batch(() => {\n this.#queryCache.findAll(filters).forEach((query) => {\n query.invalidate();\n });\n if (filters?.refetchType === \"none\") {\n return Promise.resolve();\n }\n return this.refetchQueries(\n {\n ...filters,\n type: filters?.refetchType ?? filters?.type ?? \"active\"\n },\n options\n );\n });\n }\n refetchQueries(filters, options = {}) {\n const fetchOptions = {\n ...options,\n cancelRefetch: options.cancelRefetch ?? true\n };\n const promises = notifyManager.batch(\n () => this.#queryCache.findAll(filters).filter((query) => !query.isDisabled() && !query.isStatic()).map((query) => {\n let promise = query.fetch(void 0, fetchOptions);\n if (!fetchOptions.throwOnError) {\n promise = promise.catch(noop);\n }\n return query.state.fetchStatus === \"paused\" ? Promise.resolve() : promise;\n })\n );\n return Promise.all(promises).then(noop);\n }\n fetchQuery(options) {\n const defaultedOptions = this.defaultQueryOptions(options);\n if (defaultedOptions.retry === void 0) {\n defaultedOptions.retry = false;\n }\n const query = this.#queryCache.build(this, defaultedOptions);\n return query.isStaleByTime(\n resolveStaleTime(defaultedOptions.staleTime, query)\n ) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data);\n }\n prefetchQuery(options) {\n return this.fetchQuery(options).then(noop).catch(noop);\n }\n fetchInfiniteQuery(options) {\n options.behavior = infiniteQueryBehavior(options.pages);\n return this.fetchQuery(options);\n }\n prefetchInfiniteQuery(options) {\n return this.fetchInfiniteQuery(options).then(noop).catch(noop);\n }\n ensureInfiniteQueryData(options) {\n options.behavior = infiniteQueryBehavior(options.pages);\n return this.ensureQueryData(options);\n }\n resumePausedMutations() {\n if (onlineManager.isOnline()) {\n return this.#mutationCache.resumePausedMutations();\n }\n return Promise.resolve();\n }\n getQueryCache() {\n return this.#queryCache;\n }\n getMutationCache() {\n return this.#mutationCache;\n }\n getDefaultOptions() {\n return this.#defaultOptions;\n }\n setDefaultOptions(options) {\n this.#defaultOptions = options;\n }\n setQueryDefaults(queryKey, options) {\n this.#queryDefaults.set(hashKey(queryKey), {\n queryKey,\n defaultOptions: options\n });\n }\n getQueryDefaults(queryKey) {\n const defaults = [...this.#queryDefaults.values()];\n const result = {};\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(queryKey, queryDefault.queryKey)) {\n Object.assign(result, queryDefault.defaultOptions);\n }\n });\n return result;\n }\n setMutationDefaults(mutationKey, options) {\n this.#mutationDefaults.set(hashKey(mutationKey), {\n mutationKey,\n defaultOptions: options\n });\n }\n getMutationDefaults(mutationKey) {\n const defaults = [...this.#mutationDefaults.values()];\n const result = {};\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(mutationKey, queryDefault.mutationKey)) {\n Object.assign(result, queryDefault.defaultOptions);\n }\n });\n return result;\n }\n defaultQueryOptions(options) {\n if (options._defaulted) {\n return options;\n }\n const defaultedOptions = {\n ...this.#defaultOptions.queries,\n ...this.getQueryDefaults(options.queryKey),\n ...options,\n _defaulted: true\n };\n if (!defaultedOptions.queryHash) {\n defaultedOptions.queryHash = hashQueryKeyByOptions(\n defaultedOptions.queryKey,\n defaultedOptions\n );\n }\n if (defaultedOptions.refetchOnReconnect === void 0) {\n defaultedOptions.refetchOnReconnect = defaultedOptions.networkMode !== \"always\";\n }\n if (defaultedOptions.throwOnError === void 0) {\n defaultedOptions.throwOnError = !!defaultedOptions.suspense;\n }\n if (!defaultedOptions.networkMode && defaultedOptions.persister) {\n defaultedOptions.networkMode = \"offlineFirst\";\n }\n if (defaultedOptions.queryFn === skipToken) {\n defaultedOptions.enabled = false;\n }\n return defaultedOptions;\n }\n defaultMutationOptions(options) {\n if (options?._defaulted) {\n return options;\n }\n return {\n ...this.#defaultOptions.mutations,\n ...options?.mutationKey && this.getMutationDefaults(options.mutationKey),\n ...options,\n _defaulted: true\n };\n }\n clear() {\n this.#queryCache.clear();\n this.#mutationCache.clear();\n }\n};\nexport {\n QueryClient\n};\n//# sourceMappingURL=queryClient.js.map","'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useState } from 'react';\n\nexport function QueryProvider({ children }: { children: React.ReactNode }) {\n // eslint-disable-next-line react/hook-use-state -- intentionally omitting setter; stable instance\n const [queryClient] = useState(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000,\n refetchOnWindowFocus: false,\n },\n },\n })\n );\n\n return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;\n}\n","// src/mutationCache.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Mutation } from \"./mutation.js\";\nimport { matchMutation, noop } from \"./utils.js\";\nimport { Subscribable } from \"./subscribable.js\";\nvar MutationCache = class extends Subscribable {\n constructor(config = {}) {\n super();\n this.config = config;\n this.#mutations = /* @__PURE__ */ new Set();\n this.#scopes = /* @__PURE__ */ new Map();\n this.#mutationId = 0;\n }\n #mutations;\n #scopes;\n #mutationId;\n build(client, options, state) {\n const mutation = new Mutation({\n client,\n mutationCache: this,\n mutationId: ++this.#mutationId,\n options: client.defaultMutationOptions(options),\n state\n });\n this.add(mutation);\n return mutation;\n }\n add(mutation) {\n this.#mutations.add(mutation);\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const scopedMutations = this.#scopes.get(scope);\n if (scopedMutations) {\n scopedMutations.push(mutation);\n } else {\n this.#scopes.set(scope, [mutation]);\n }\n }\n this.notify({ type: \"added\", mutation });\n }\n remove(mutation) {\n if (this.#mutations.delete(mutation)) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const scopedMutations = this.#scopes.get(scope);\n if (scopedMutations) {\n if (scopedMutations.length > 1) {\n const index = scopedMutations.indexOf(mutation);\n if (index !== -1) {\n scopedMutations.splice(index, 1);\n }\n } else if (scopedMutations[0] === mutation) {\n this.#scopes.delete(scope);\n }\n }\n }\n }\n this.notify({ type: \"removed\", mutation });\n }\n canRun(mutation) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const mutationsWithSameScope = this.#scopes.get(scope);\n const firstPendingMutation = mutationsWithSameScope?.find(\n (m) => m.state.status === \"pending\"\n );\n return !firstPendingMutation || firstPendingMutation === mutation;\n } else {\n return true;\n }\n }\n runNext(mutation) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const foundMutation = this.#scopes.get(scope)?.find((m) => m !== mutation && m.state.isPaused);\n return foundMutation?.continue() ?? Promise.resolve();\n } else {\n return Promise.resolve();\n }\n }\n clear() {\n notifyManager.batch(() => {\n this.#mutations.forEach((mutation) => {\n this.notify({ type: \"removed\", mutation });\n });\n this.#mutations.clear();\n this.#scopes.clear();\n });\n }\n getAll() {\n return Array.from(this.#mutations);\n }\n find(filters) {\n const defaultedFilters = { exact: true, ...filters };\n return this.getAll().find(\n (mutation) => matchMutation(defaultedFilters, mutation)\n );\n }\n findAll(filters = {}) {\n return this.getAll().filter((mutation) => matchMutation(filters, mutation));\n }\n notify(event) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event);\n });\n });\n }\n resumePausedMutations() {\n const pausedMutations = this.getAll().filter((x) => x.state.isPaused);\n return notifyManager.batch(\n () => Promise.all(\n pausedMutations.map((mutation) => mutation.continue().catch(noop))\n )\n );\n }\n};\nfunction scopeFor(mutation) {\n return mutation.options.scope?.id;\n}\nexport {\n MutationCache\n};\n//# sourceMappingURL=mutationCache.js.map","// src/queryCache.ts\nimport { hashQueryKeyByOptions, matchQuery } from \"./utils.js\";\nimport { Query } from \"./query.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nvar QueryCache = class extends Subscribable {\n constructor(config = {}) {\n super();\n this.config = config;\n this.#queries = /* @__PURE__ */ new Map();\n }\n #queries;\n build(client, options, state) {\n const queryKey = options.queryKey;\n const queryHash = options.queryHash ?? hashQueryKeyByOptions(queryKey, options);\n let query = this.get(queryHash);\n if (!query) {\n query = new Query({\n client,\n queryKey,\n queryHash,\n options: client.defaultQueryOptions(options),\n state,\n defaultOptions: client.getQueryDefaults(queryKey)\n });\n this.add(query);\n }\n return query;\n }\n add(query) {\n if (!this.#queries.has(query.queryHash)) {\n this.#queries.set(query.queryHash, query);\n this.notify({\n type: \"added\",\n query\n });\n }\n }\n remove(query) {\n const queryInMap = this.#queries.get(query.queryHash);\n if (queryInMap) {\n query.destroy();\n if (queryInMap === query) {\n this.#queries.delete(query.queryHash);\n }\n this.notify({ type: \"removed\", query });\n }\n }\n clear() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n this.remove(query);\n });\n });\n }\n get(queryHash) {\n return this.#queries.get(queryHash);\n }\n getAll() {\n return [...this.#queries.values()];\n }\n find(filters) {\n const defaultedFilters = { exact: true, ...filters };\n return this.getAll().find(\n (query) => matchQuery(defaultedFilters, query)\n );\n }\n findAll(filters = {}) {\n const queries = this.getAll();\n return Object.keys(filters).length > 0 ? queries.filter((query) => matchQuery(filters, query)) : queries;\n }\n notify(event) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event);\n });\n });\n }\n onFocus() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onFocus();\n });\n });\n }\n onOnline() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onOnline();\n });\n });\n }\n};\nexport {\n QueryCache\n};\n//# sourceMappingURL=queryCache.js.map","// src/infiniteQueryBehavior.ts\nimport {\n addConsumeAwareSignal,\n addToEnd,\n addToStart,\n ensureQueryFn\n} from \"./utils.js\";\nfunction infiniteQueryBehavior(pages) {\n return {\n onFetch: (context, query) => {\n const options = context.options;\n const direction = context.fetchOptions?.meta?.fetchMore?.direction;\n const oldPages = context.state.data?.pages || [];\n const oldPageParams = context.state.data?.pageParams || [];\n let result = { pages: [], pageParams: [] };\n let currentPage = 0;\n const fetchFn = async () => {\n let cancelled = false;\n const addSignalProperty = (object) => {\n addConsumeAwareSignal(\n object,\n () => context.signal,\n () => cancelled = true\n );\n };\n const queryFn = ensureQueryFn(context.options, context.fetchOptions);\n const fetchPage = async (data, param, previous) => {\n if (cancelled) {\n return Promise.reject();\n }\n if (param == null && data.pages.length) {\n return Promise.resolve(data);\n }\n const createQueryFnContext = () => {\n const queryFnContext2 = {\n client: context.client,\n queryKey: context.queryKey,\n pageParam: param,\n direction: previous ? \"backward\" : \"forward\",\n meta: context.options.meta\n };\n addSignalProperty(queryFnContext2);\n return queryFnContext2;\n };\n const queryFnContext = createQueryFnContext();\n const page = await queryFn(queryFnContext);\n const { maxPages } = context.options;\n const addTo = previous ? addToStart : addToEnd;\n return {\n pages: addTo(data.pages, page, maxPages),\n pageParams: addTo(data.pageParams, param, maxPages)\n };\n };\n if (direction && oldPages.length) {\n const previous = direction === \"backward\";\n const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;\n const oldData = {\n pages: oldPages,\n pageParams: oldPageParams\n };\n const param = pageParamFn(options, oldData);\n result = await fetchPage(oldData, param, previous);\n } else {\n const remainingPages = pages ?? oldPages.length;\n do {\n const param = currentPage === 0 ? oldPageParams[0] ?? options.initialPageParam : getNextPageParam(options, result);\n if (currentPage > 0 && param == null) {\n break;\n }\n result = await fetchPage(result, param);\n currentPage++;\n } while (currentPage < remainingPages);\n }\n return result;\n };\n if (context.options.persister) {\n context.fetchFn = () => {\n return context.options.persister?.(\n fetchFn,\n {\n client: context.client,\n queryKey: context.queryKey,\n meta: context.options.meta,\n signal: context.signal\n },\n query\n );\n };\n } else {\n context.fetchFn = fetchFn;\n }\n }\n };\n}\nfunction getNextPageParam(options, { pages, pageParams }) {\n const lastIndex = pages.length - 1;\n return pages.length > 0 ? options.getNextPageParam(\n pages[lastIndex],\n pages,\n pageParams[lastIndex],\n pageParams\n ) : void 0;\n}\nfunction getPreviousPageParam(options, { pages, pageParams }) {\n return pages.length > 0 ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams) : void 0;\n}\nfunction hasNextPage(options, data) {\n if (!data) return false;\n return getNextPageParam(options, data) != null;\n}\nfunction hasPreviousPage(options, data) {\n if (!data || !options.getPreviousPageParam) return false;\n return getPreviousPageParam(options, data) != null;\n}\nexport {\n hasNextPage,\n hasPreviousPage,\n infiniteQueryBehavior\n};\n//# sourceMappingURL=infiniteQueryBehavior.js.map","'use client';\n\nimport { useEffect } from 'react';\nimport { I18nextProvider } from 'react-i18next';\nimport webI18n from '@/lib/i18n';\nimport { applyRtlFont } from '@/lib/rtl-fonts';\n\ninterface I18nProviderProps {\n initialLanguage: string;\n children: React.ReactNode;\n}\n\n/**\n * Client-side i18n provider that wraps the application with react-i18next.\n *\n * Receives the initial language from the server-side layout and sets it\n * on the i18next instance. Language changes at runtime (e.g. from settings)\n * call i18n.changeLanguage() which re-renders all translated components.\n *\n * Also handles lazy-loading RTL fonts (Noto Sans Arabic/Hebrew) when the\n * active language requires them.\n */\nexport function I18nProvider({ initialLanguage, children }: I18nProviderProps) {\n useEffect(() => {\n if (webI18n.language !== initialLanguage) {\n webI18n.changeLanguage(initialLanguage);\n }\n // Apply RTL font for the initial language (lazy-loads if needed)\n applyRtlFont(initialLanguage);\n }, [initialLanguage]);\n\n // Listen for runtime language changes and apply/remove RTL fonts\n useEffect(() => {\n function onLanguageChanged(lng: string) {\n applyRtlFont(lng);\n }\n webI18n.on('languageChanged', onLanguageChanged);\n return () => {\n webI18n.off('languageChanged', onLanguageChanged);\n };\n }, []);\n\n return <I18nextProvider i18n={webI18n}>{children}</I18nextProvider>;\n}\n","/**\n * Web UI i18n configuration.\n *\n * Initializes i18next with react-i18next for the web presentation layer.\n * Uses the common and web namespaces. All supported language translations\n * are bundled inline so language switching works immediately.\n */\n\nimport i18next, { type i18n } from 'i18next';\nimport { initReactI18next } from 'react-i18next';\n\n// Import all language translations inline\nimport commonEn from '../../../../translations/en/common.json';\nimport webEn from '../../../../translations/en/web.json';\nimport commonRu from '../../../../translations/ru/common.json';\nimport webRu from '../../../../translations/ru/web.json';\nimport commonPt from '../../../../translations/pt/common.json';\nimport webPt from '../../../../translations/pt/web.json';\nimport commonEs from '../../../../translations/es/common.json';\nimport webEs from '../../../../translations/es/web.json';\nimport commonAr from '../../../../translations/ar/common.json';\nimport webAr from '../../../../translations/ar/web.json';\nimport commonHe from '../../../../translations/he/common.json';\nimport webHe from '../../../../translations/he/web.json';\nimport commonFr from '../../../../translations/fr/common.json';\nimport webFr from '../../../../translations/fr/web.json';\nimport commonDe from '../../../../translations/de/common.json';\nimport webDe from '../../../../translations/de/web.json';\n\nconst FALLBACK_LANGUAGE = 'en';\nconst NAMESPACES = ['common', 'web'] as const;\n\n/**\n * Create and configure the web i18next instance.\n *\n * Returns a singleton instance — multiple calls return the same object.\n * Use `changeLanguage()` on the returned instance to switch locales at runtime.\n */\nfunction createI18nInstance(): i18n {\n const instance = i18next.createInstance();\n\n instance.use(initReactI18next).init({\n lng: FALLBACK_LANGUAGE,\n fallbackLng: FALLBACK_LANGUAGE,\n defaultNS: 'common',\n ns: [...NAMESPACES],\n resources: {\n en: { common: commonEn, web: webEn },\n ru: { common: commonRu, web: webRu },\n pt: { common: commonPt, web: webPt },\n es: { common: commonEs, web: webEs },\n ar: { common: commonAr, web: webAr },\n he: { common: commonHe, web: webHe },\n fr: { common: commonFr, web: webFr },\n de: { common: commonDe, web: webDe },\n },\n interpolation: {\n escapeValue: false, // React already escapes output\n },\n react: {\n useSuspense: false, // Avoid suspense boundaries for i18n\n },\n });\n\n return instance;\n}\n\n/** Singleton web i18next instance. */\nconst webI18n: i18n = createI18nInstance();\n\nexport default webI18n;\nexport { FALLBACK_LANGUAGE, NAMESPACES };\n","/**\n * Lazy font loader for RTL languages (Arabic and Hebrew).\n *\n * Dynamically loads Noto Sans Arabic or Noto Sans Hebrew from Google Fonts\n * when the user switches to an RTL language. Fonts are cached after first\n * load — subsequent calls for the same language are no-ops.\n *\n * This module must only be imported in client components (uses DOM APIs).\n */\n\nconst FONT_CONFIG: Record<string, { family: string; cssUrl: string }> = {\n ar: {\n family: 'Noto Sans Arabic',\n cssUrl:\n 'https://fonts.googleapis.com/css2?family=Noto+Sans+Arabic:wght@400;500;600;700&display=swap',\n },\n he: {\n family: 'Noto Sans Hebrew',\n cssUrl:\n 'https://fonts.googleapis.com/css2?family=Noto+Sans+Hebrew:wght@400;500;600;700&display=swap',\n },\n};\n\n/**\n * Load the appropriate font for an RTL language and apply it to the document.\n *\n * For non-RTL languages this removes any previously applied RTL font class.\n * The Google Fonts stylesheet is injected as a `<link>` element in `<head>`,\n * which the browser caches normally (no re-download on subsequent visits).\n * Duplicate link elements are avoided by checking DOM existence.\n */\nexport function applyRtlFont(language: string): void {\n const config = FONT_CONFIG[language];\n\n // Remove any existing RTL font class\n document.documentElement.classList.remove('font-rtl-arabic', 'font-rtl-hebrew');\n\n if (!config) {\n // LTR language — clear RTL font override\n document.documentElement.style.removeProperty('--font-rtl');\n return;\n }\n\n // Set the CSS custom property for the RTL font family\n document.documentElement.style.setProperty('--font-rtl', `\"${config.family}\"`);\n\n // Add language-specific font class\n const fontClass = language === 'ar' ? 'font-rtl-arabic' : 'font-rtl-hebrew';\n document.documentElement.classList.add(fontClass);\n\n // Load the font stylesheet if not already present in the DOM\n const linkId = `rtl-font-${language}`;\n if (!document.getElementById(linkId)) {\n const link = document.createElement('link');\n link.id = linkId;\n link.rel = 'stylesheet';\n link.href = config.cssUrl;\n document.head.appendChild(link);\n }\n}\n"],"names":[],"mappings":"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","ignoreList":[25,26,27,28,29,30,31,32,35,36,38,40,41,42]}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/components/features/chat/ChatSheet.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/use-animations-enabled.ts","../../../../../../../src/presentation/web/hooks/useTheme.ts","../../../../../../../src/presentation/web/components/common/repo-group/repo-group.tsx","../../../../../../../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/sidebar-nav-item/sidebar-nav-item.tsx","../../../../../../../src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.tsx","../../../../../../../src/presentation/web/app/actions/data%3Ad83598%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A9b4c5f%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.tsx","../../../../../../../src/presentation/web/app/actions/data%3A238fc0%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-import-dialog.tsx","../../../../../../../src/presentation/web/hooks/use-notifications.ts","../../../../../../../src/presentation/web/components/common/github-import-dialog/github-url-input.tsx","../../../../../../../src/presentation/web/lib/compare-versions.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/zap-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/grip-vertical.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/minimize-2.ts","../../../../../../../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/volume-off.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/table-properties.ts","../../../../../../../src/presentation/web/types/theme.ts","../../../../../../../src/presentation/web/components/common/feature-status-group/feature-status-group.tsx","../../../../../../../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/moon.ts","../../../../../../../src/presentation/web/components/ui/sonner.tsx","../../../../../../../node_modules/.pnpm/%40tanstack%2Bquery-core%405.95.1/node_modules/%40tanstack/query-core/build/modern/queryClient.js","../../../../../../../src/presentation/web/components/providers/query-provider.tsx","../../../../../../../node_modules/.pnpm/%40tanstack%2Bquery-core%405.95.1/node_modules/%40tanstack/query-core/build/modern/mutationCache.js","../../../../../../../node_modules/.pnpm/%40tanstack%2Bquery-core%405.95.1/node_modules/%40tanstack/query-core/build/modern/queryCache.js","../../../../../../../node_modules/.pnpm/%40tanstack%2Bquery-core%405.95.1/node_modules/%40tanstack/query-core/build/modern/infiniteQueryBehavior.js","../../../../../../../src/presentation/web/components/providers/i18n-provider.tsx","../../../../../../../src/presentation/web/lib/i18n.ts","../../../../../../../src/presentation/web/lib/rtl-fonts.ts"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MessageSquare, X, Bot, GripVertical, Maximize2, Minimize2 } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { ChatTab } from './ChatTab';\nimport { ChatDotIndicator } from './ChatDotIndicator';\nimport { useTurnStatus } from '@/hooks/turn-statuses-provider';\nimport { useFabLayout } from '@/hooks/fab-layout-context';\nimport { useSidebar } from '@/components/ui/sidebar';\nimport { useSidebarFeaturesContext } from '@/hooks/sidebar-features-context';\n\n// ── Persistent global chat popup (draggable + resizable) ──────────────────\n\nconst DEFAULT_W = 520;\nconst DEFAULT_H_VH = 70; // percentage of viewport height\nconst MIN_W = 360;\nconst MIN_H = 300;\n\ninterface Position {\n x: number;\n y: number;\n}\n\ninterface Size {\n w: number;\n h: number;\n}\n\nconst STORAGE_KEY = 'shep-global-chat';\n\nfunction loadPersistedState(): { pos: Position | null; size: Size | null } {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return { pos: null, size: null };\n const parsed = JSON.parse(raw);\n let size: Size | null = parsed.size ?? null;\n // Clamp persisted size to minimums — prevents invisible panel from bad state\n if (size && (size.w < MIN_W || size.h < MIN_H)) {\n size = { w: Math.max(MIN_W, size.w), h: Math.max(MIN_H, size.h) };\n }\n return {\n pos: parsed.pos ?? null,\n size,\n };\n } catch {\n return { pos: null, size: null };\n }\n}\n\nfunction persistState(pos: Position | null, size: Size | null) {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ pos, size }));\n } catch {\n // Storage full or unavailable — ignore\n }\n}\n\nexport function GlobalChatPopup() {\n const { t } = useTranslation('web');\n const [isOpen, setIsOpen] = useState(false);\n const [hasOpened, setHasOpened] = useState(false);\n const [isMaximized, setIsMaximized] = useState(false);\n const globalChatTurnStatus = useTurnStatus('global');\n const { swapPosition } = useFabLayout();\n const { state: sidebarState } = useSidebar();\n const { hasRepositories } = useSidebarFeaturesContext();\n\n // Position/size — initialized from localStorage\n // eslint-disable-next-line react/hook-use-state -- wrapped setters below\n const [pos, setPosRaw] = useState<Position | null>(() => loadPersistedState().pos);\n // eslint-disable-next-line react/hook-use-state -- wrapped setters below\n const [size, setSizeRaw] = useState<Size | null>(() => loadPersistedState().size);\n\n // Wrapped setters that also persist\n const setPos = useCallback(\n (v: Position | null | ((prev: Position | null) => Position | null)) => {\n setPosRaw((prev) => {\n const next = typeof v === 'function' ? v(prev) : v;\n // Defer persist to avoid doing it on every mousemove frame\n return next;\n });\n },\n []\n );\n\n const setSize = useCallback((v: Size | null | ((prev: Size | null) => Size | null)) => {\n setSizeRaw((prev) => {\n const next = typeof v === 'function' ? v(prev) : v;\n return next;\n });\n }, []);\n\n const panelRef = useRef<HTMLDivElement>(null);\n const dragRef = useRef<{\n startX: number;\n startY: number;\n startPosX: number;\n startPosY: number;\n } | null>(null);\n const resizeRef = useRef<{\n startX: number;\n startY: number;\n startW: number;\n startH: number;\n } | null>(null);\n\n const toggle = useCallback(() => {\n setIsOpen((prev) => {\n if (!prev) setHasOpened(true);\n return !prev;\n });\n }, []);\n\n // Store pre-maximize pos/size so we can restore\n const preMaxRef = useRef<{ pos: Position | null; size: Size | null }>({ pos: null, size: null });\n\n const toggleMaximize = useCallback(() => {\n if (!isOpen) {\n setIsOpen(true);\n setHasOpened(true);\n }\n setIsMaximized((prev) => {\n if (!prev) {\n // Entering maximize — save current state\n preMaxRef.current = { pos, size };\n } else {\n // Leaving maximize — restore previous state\n setPos(preMaxRef.current.pos);\n setSize(preMaxRef.current.size);\n }\n return !prev;\n });\n }, [isOpen, pos, size, setPos, setSize]);\n\n // Keyboard shortcuts: Cmd/Ctrl+Shift+K = toggle, Cmd/Ctrl+Shift+M = maximize\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.shiftKey && (e.key === 'k' || e.key === 'K')) {\n e.preventDefault();\n if (isMaximized) setIsMaximized(false);\n toggle();\n // Focus the composer input after panel opens\n requestAnimationFrame(() => {\n setTimeout(() => {\n const input = panelRef.current?.querySelector<HTMLTextAreaElement>('textarea');\n input?.focus();\n }, 100);\n });\n }\n if ((e.metaKey || e.ctrlKey) && e.shiftKey && (e.key === 'm' || e.key === 'M')) {\n e.preventDefault();\n toggleMaximize();\n }\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [toggle, toggleMaximize, isMaximized]);\n\n // Persist position/size to localStorage (debounced)\n useEffect(() => {\n const timer = setTimeout(() => persistState(pos, size), 300);\n return () => clearTimeout(timer);\n }, [pos, size]);\n\n /** Clamp position so the header (top 48px) stays within viewport. */\n const clampPos = useCallback((x: number, y: number, w: number): Position => {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const HEADER_H = 48;\n return {\n // Keep at least 100px of width visible horizontally\n x: Math.max(-w + 100, Math.min(x, vw - 100)),\n // Keep header on screen: top >= 0, top <= viewport - header height\n y: Math.max(0, Math.min(y, vh - HEADER_H)),\n };\n }, []);\n\n // ── Drag handling ──────────────────────────────────────────────────────\n const onDragStart = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n const panel = panelRef.current;\n if (!panel) return;\n\n const rect = panel.getBoundingClientRect();\n const currentX = pos?.x ?? rect.left;\n const currentY = pos?.y ?? rect.top;\n\n dragRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startPosX: currentX,\n startPosY: currentY,\n };\n\n const panelW = size?.w ?? rect.width;\n\n const onMove = (ev: MouseEvent) => {\n if (!dragRef.current) return;\n const dx = ev.clientX - dragRef.current.startX;\n const dy = ev.clientY - dragRef.current.startY;\n setPos(clampPos(dragRef.current.startPosX + dx, dragRef.current.startPosY + dy, panelW));\n };\n\n const onUp = () => {\n dragRef.current = null;\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n };\n\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n },\n [pos, size, setPos, clampPos]\n );\n\n // ── Resize handling (from top-right corner) ────────────────────────────\n const onResizeStart = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const panel = panelRef.current;\n if (!panel) return;\n\n const rect = panel.getBoundingClientRect();\n const startW = size?.w ?? rect.width;\n const startH = size?.h ?? rect.height;\n const startX = e.clientX;\n const startY = e.clientY;\n const startPosY = pos?.y ?? rect.top;\n\n resizeRef.current = { startX, startY, startW, startH };\n\n // Capture position if not set yet\n if (!pos) {\n setPos({ x: rect.left, y: rect.top });\n }\n\n const onMove = (ev: MouseEvent) => {\n if (!resizeRef.current) return;\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n const newW = Math.max(MIN_W, startW + dx);\n const newH = Math.max(MIN_H, startH - dy);\n // Top edge moves with height change, clamped to viewport\n const newY = Math.max(0, startPosY + dy);\n setSize({ w: newW, h: newH });\n setPos((prev) => clampPos(prev?.x ?? rect.left, newY, newW));\n };\n\n const onUp = () => {\n resizeRef.current = null;\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n };\n\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n },\n [size, pos, setPos, setSize, clampPos]\n );\n\n // Reset position/size on close for clean reopen\n const handleClose = useCallback(() => {\n setIsOpen(false);\n setIsMaximized(false);\n }, []);\n\n // Compute panel style — maximized overrides everything\n const panelStyle: React.CSSProperties = isMaximized\n ? {}\n : pos\n ? {\n position: 'fixed',\n left: pos.x,\n top: pos.y,\n width: size?.w ?? DEFAULT_W,\n height: size?.h ?? `${DEFAULT_H_VH}vh`,\n }\n : {\n width: size?.w ?? DEFAULT_W,\n height: size?.h ?? `${DEFAULT_H_VH}vh`,\n };\n\n return (\n <>\n {/* Chat panel */}\n {hasOpened ? (\n <div\n ref={panelRef}\n className={cn(\n isMaximized\n ? 'bg-background fixed inset-0 z-[60] flex flex-col overflow-hidden dark:bg-neutral-900'\n : cn(\n !pos && (swapPosition ? 'fixed start-8 bottom-24' : 'fixed end-8 bottom-24'),\n 'z-[60] flex flex-col overflow-hidden rounded-lg',\n 'border-border/60 border dark:border-white/10',\n 'bg-background dark:bg-neutral-900',\n 'shadow-[0_8px_40px_-8px_rgba(0,0,0,0.2)] dark:shadow-[0_8px_40px_-8px_rgba(0,0,0,0.6)]'\n ),\n 'transition-opacity duration-300 ease-out',\n isOpen ? 'pointer-events-auto opacity-100' : 'pointer-events-none opacity-0'\n )}\n style={panelStyle}\n >\n {/* Violet accent strip at top */}\n {!isMaximized ? (\n <div className=\"h-[2px] shrink-0 bg-gradient-to-r from-transparent via-violet-500/50 to-transparent\" />\n ) : null}\n\n {/* Resize handle — top-right corner (hidden when maximized) */}\n {!isMaximized ? (\n <div\n onMouseDown={onResizeStart}\n className=\"absolute end-0 top-0 z-10 h-4 w-4 cursor-ne-resize\"\n />\n ) : null}\n\n {/* Header — draggable when not maximized */}\n <div\n onMouseDown={isMaximized ? undefined : onDragStart}\n className={cn(\n 'relative flex h-11 shrink-0 items-center gap-2.5 border-b border-black/[0.06] px-3.5 dark:border-white/[0.06]',\n !isMaximized && 'cursor-grab active:cursor-grabbing'\n )}\n >\n <div className=\"from-foreground/[0.02] to-foreground/[0.02] pointer-events-none absolute inset-0 bg-gradient-to-r via-transparent\" />\n {!isMaximized ? (\n <GripVertical className=\"text-foreground/15 relative h-3.5 w-3.5 shrink-0\" />\n ) : null}\n <div className=\"relative flex h-5 w-5 items-center justify-center\">\n <Bot className=\"text-foreground/50 h-4 w-4\" />\n </div>\n <div className=\"relative flex items-baseline gap-2\">\n <span className=\"text-foreground/90 text-base font-bold tracking-tight\">Shep</span>\n <span className=\"text-foreground/30 text-xs font-medium tracking-widest uppercase\">\n global\n </span>\n </div>\n <div className=\"relative ms-auto flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={toggleMaximize}\n className=\"text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors\"\n title={isMaximized ? 'Restore (⌘⇧M)' : 'Maximize (⌘⇧M)'}\n >\n {isMaximized ? (\n <Minimize2 className=\"h-3.5 w-3.5\" />\n ) : (\n <Maximize2 className=\"h-3.5 w-3.5\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors\"\n title=\"Close (⌘⇧K)\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n\n {/* Chat content */}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n <ChatTab featureId=\"global\" />\n </div>\n\n {/* Resize handle — bottom-right corner (hidden when maximized) */}\n {!isMaximized ? (\n <div\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n const panel = panelRef.current;\n if (!panel) return;\n const rect = panel.getBoundingClientRect();\n const startX = e.clientX;\n const startY = e.clientY;\n const startW = size?.w ?? rect.width;\n const startH = size?.h ?? rect.height;\n if (!pos) setPos({ x: rect.left, y: rect.top });\n\n const onMove = (ev: MouseEvent) => {\n const maxH = window.innerHeight - (pos?.y ?? rect.top);\n setSize({\n w: Math.max(MIN_W, startW + (ev.clientX - startX)),\n h: Math.max(MIN_H, Math.min(startH + (ev.clientY - startY), maxH)),\n });\n };\n const onUp = () => {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n };\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n }}\n className=\"absolute end-0 bottom-0 z-10 h-4 w-4 cursor-se-resize\"\n />\n ) : null}\n </div>\n ) : null}\n\n {/* Chat FAB — hidden during onboarding (no repos), shown after first project */}\n {!hasRepositories ? null : (\n <ChatFabWrapper\n swapPosition={swapPosition}\n sidebarState={sidebarState}\n isMaximized={isMaximized}\n >\n <Button\n size=\"icon\"\n onClick={toggle}\n className={cn(\n 'relative h-14 w-14 rounded-full shadow-lg',\n 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95',\n isOpen\n ? 'bg-violet-600 text-white hover:bg-violet-500'\n : 'bg-violet-500 text-white hover:bg-violet-400 dark:bg-violet-500 dark:hover:bg-violet-400',\n // Animated states when chat is closed\n !isOpen && globalChatTurnStatus === 'processing' && 'chat-fab-spinning',\n !isOpen && globalChatTurnStatus === 'unread' && 'chat-fab-glow-unread',\n !isOpen && globalChatTurnStatus === 'awaiting_input' && 'chat-fab-glow-awaiting'\n )}\n >\n <MessageSquare\n className={cn(\n 'absolute h-7 w-7 stroke-[2.5] transition-all duration-200',\n isOpen ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100'\n )}\n />\n <X\n className={cn(\n 'absolute h-6 w-6 stroke-[2.5] transition-all duration-200',\n isOpen ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0'\n )}\n />\n {!isOpen && <ChatDotIndicator status={globalChatTurnStatus} className=\"end-0 top-0\" />}\n </Button>\n {/* Tooltip — slides up on hover */}\n <div className=\"pointer-events-none absolute bottom-[calc(100%+8px)] left-1/2 -translate-x-1/2 translate-y-1 opacity-0 transition-all duration-200 group-hover/fab:translate-y-0 group-hover/fab:opacity-100\">\n <div className=\"bg-foreground rounded-lg px-3 py-1.5 text-center shadow-lg\">\n <p className=\"text-background text-xs font-medium whitespace-nowrap\">\n {t('chat.shepChat')}\n </p>\n <p className=\"text-background/50 mt-0.5 flex items-center justify-center gap-1 text-[10px]\">\n <kbd className=\"bg-background/15 rounded px-1 py-px font-mono\">⌘</kbd>\n <kbd className=\"bg-background/15 rounded px-1 py-px font-mono\">⇧</kbd>\n <kbd className=\"bg-background/15 rounded px-1 py-px font-mono\">K</kbd>\n </p>\n </div>\n </div>\n </ChatFabWrapper>\n )}\n </>\n );\n}\n\n/** Wrapper for the Chat FAB that handles position swapping. */\nfunction ChatFabWrapper({\n swapPosition,\n sidebarState,\n isMaximized,\n children,\n}: {\n swapPosition: boolean;\n sidebarState: 'expanded' | 'collapsed';\n isMaximized: boolean;\n children: React.ReactNode;\n}) {\n const { i18n } = useTranslation('web');\n const isRtl = i18n.dir() === 'rtl';\n\n if (!swapPosition) {\n return (\n <div className={cn('group/fab fixed end-8 bottom-6 z-30', isMaximized && 'hidden')}>\n {children}\n </div>\n );\n }\n\n // Swapped: chat FAB moves to start side, tracking sidebar width\n const sidebarOffset =\n sidebarState === 'expanded'\n ? 'calc(var(--sidebar-width) + 32px)'\n : 'calc(var(--sidebar-width-icon) + 32px)';\n\n const positionStyle: React.CSSProperties = isRtl\n ? { right: sidebarOffset, transition: 'right 200ms ease-in-out' }\n : { left: sidebarOffset, transition: 'left 200ms ease-in-out' };\n\n return (\n <div\n className={cn('group/fab fixed bottom-6 z-30', isMaximized && 'hidden')}\n style={positionStyle}\n >\n {children}\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 { useTranslation } from 'react-i18next';\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 { t } = useTranslation('web');\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-start\">\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={t('versionBadge.version')} value={displayVersion} />\n {isDev && branch ? <Row label={t('versionBadge.branch')} value={branch} /> : null}\n {isDev && shortHash ? (\n <Row label={t('versionBadge.commit')} value={shortHash} mono />\n ) : null}\n {isDev && instancePath ? (\n <Row label={t('versionBadge.path')} value={instancePath} mono />\n ) : 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 /** i18n translation key under the `web` namespace (e.g. `sidebar.statusActionNeeded`). */\n labelKey: 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 labelKey: 'sidebar.statusActionNeeded',\n },\n 'in-progress': {\n icon: Loader2,\n iconClass: 'text-blue-500 animate-spin',\n bgClass: 'bg-blue-500/10',\n labelKey: 'sidebar.statusInProgress',\n },\n pending: {\n icon: Clock,\n iconClass: 'text-slate-400',\n bgClass: 'bg-slate-400/10',\n labelKey: 'sidebar.statusPending',\n },\n blocked: {\n icon: Ban,\n iconClass: 'text-gray-400',\n bgClass: 'bg-gray-400/10',\n labelKey: 'sidebar.statusBlocked',\n },\n error: {\n icon: CircleX,\n iconClass: 'text-red-500',\n bgClass: 'bg-red-500/10',\n labelKey: 'sidebar.statusError',\n },\n done: {\n icon: CircleCheck,\n iconClass: 'text-emerald-500',\n bgClass: 'bg-emerald-500/10',\n labelKey: 'sidebar.statusDone',\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=\"ms-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';\n\nconst STORAGE_KEY = 'shep-animations-enabled';\nconst SYNC_EVENT = 'shep:animations-toggle';\nconst BODY_CLASS = 'no-animations';\n\nexport interface UseAnimationsEnabledResult {\n enabled: boolean;\n toggle: () => void;\n}\n\nexport function useAnimationsEnabled(): UseAnimationsEnabledResult {\n const [enabled, setEnabled] = useState(true);\n\n useEffect(() => {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored === 'false') {\n setEnabled(false);\n document.body.classList.add(BODY_CLASS);\n }\n\n const onSync = (e: Event) => {\n const next = (e as CustomEvent<boolean>).detail;\n setEnabled(next);\n document.body.classList.toggle(BODY_CLASS, !next);\n };\n window.addEventListener(SYNC_EVENT, onSync);\n return () => window.removeEventListener(SYNC_EVENT, onSync);\n }, []);\n\n const toggle = useCallback(() => {\n const next = !enabled;\n localStorage.setItem(STORAGE_KEY, String(next));\n setEnabled(next);\n document.body.classList.toggle(BODY_CLASS, !next);\n window.dispatchEvent(new CustomEvent(SYNC_EVENT, { detail: next }));\n }, [enabled]);\n\n return { enabled, toggle };\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 { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { ChevronDown, GitFork, Plus } from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\nexport interface RepoGroupProps {\n /** Display name for the repository */\n repoName: string;\n /** Total number of features in this repo */\n featureCount: number;\n children: ReactNode;\n /** Whether the group starts expanded (default: true) */\n defaultOpen?: boolean;\n /** Called when the user clicks the + button to add a feature */\n onAddFeature?: () => void;\n}\n\nexport function RepoGroup({\n repoName,\n featureCount,\n children,\n defaultOpen = true,\n onAddFeature,\n}: RepoGroupProps) {\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <div data-testid=\"repo-group\" className=\"group/repo mb-1\">\n <div className=\"flex items-center\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className={cn(\n 'text-sidebar-foreground hover:bg-sidebar-accent flex min-w-0 flex-1 items-center gap-1.5 rounded-md px-2 py-1.5 text-left text-xs font-semibold',\n 'transition-colors duration-100'\n )}\n aria-expanded={open}\n >\n <ChevronDown\n className={cn(\n 'text-muted-foreground h-3.5 w-3.5 shrink-0 transition-transform duration-200',\n !open && '-rotate-90'\n )}\n />\n <GitFork className=\"text-muted-foreground h-3.5 w-3.5 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{repoName}</span>\n <span\n aria-label={`${featureCount} features`}\n className=\"bg-sidebar-accent text-sidebar-accent-foreground ml-auto inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full px-1 text-[0.6rem] font-medium tabular-nums\"\n role=\"img\"\n >\n {featureCount}\n </span>\n </button>\n {onAddFeature ? (\n <button\n type=\"button\"\n data-testid=\"repo-add-feature\"\n onClick={(e) => {\n e.stopPropagation();\n onAddFeature();\n }}\n className={cn(\n 'text-muted-foreground hover:text-sidebar-foreground hover:bg-sidebar-accent mr-2 shrink-0 rounded-md p-1 opacity-0 transition-all duration-100 group-hover/repo:opacity-100',\n 'focus-visible:ring-ring focus-visible:opacity-100 focus-visible:ring-1 focus-visible:outline-none'\n )}\n aria-label={`Add feature to ${repoName}`}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n {open ? <div className=\"pl-2\">{children}</div> : null}\n </div>\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 { useMemo } from 'react';\nimport { usePathname } from 'next/navigation';\nimport {\n Home,\n Moon,\n Sun,\n Volume2,\n VolumeOff,\n Zap,\n ZapOff,\n Wrench,\n Puzzle,\n Settings,\n TableProperties,\n} from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\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 { useAnimationsEnabled } from '@/hooks/use-animations-enabled';\nimport { useTheme } from '@/hooks/useTheme';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { FeatureStatusGroup } from '@/components/common/feature-status-group';\nimport { RepoGroup } from '@/components/common/repo-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 repositoryPath: string;\n repositoryName: string;\n}\n\nexport interface AppSidebarProps {\n features: FeatureItem[];\n featureFlags: FeatureFlagsState;\n\n onFeatureClick?: (featureId: string) => void;\n /** Called when the user clicks the + button on a repo group to create a feature */\n onAddFeature?: (repositoryPath: string) => void;\n}\n\nexport function AppSidebar({\n features,\n featureFlags,\n\n onFeatureClick,\n onAddFeature,\n}: AppSidebarProps) {\n const { t, i18n } = useTranslation('web');\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 { enabled: animationsEnabled, toggle: toggleAnimations } = useAnimationsEnabled();\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 // Group features by repository, then by status within each repo\n const repoGroups = useMemo(() => {\n const byRepo = new Map<string, { repoName: string; features: FeatureItem[] }>();\n for (const feature of features) {\n const key = feature.repositoryPath;\n let group = byRepo.get(key);\n if (!group) {\n group = { repoName: feature.repositoryName, features: [] };\n byRepo.set(key, group);\n }\n group.features.push(feature);\n }\n return Array.from(byRepo.entries()).map(([repoPath, { repoName, features: repoFeatures }]) => ({\n repoPath,\n repoName,\n featureCount: repoFeatures.length,\n statusGroups: featureStatusOrder\n .map((statusKey) => ({\n statusKey,\n label: t(featureStatusConfig[statusKey].labelKey),\n items: repoFeatures.filter((f) => f.status === statusKey),\n }))\n .filter((g) => g.items.length > 0),\n }));\n }, [features, t]);\n\n return (\n <Sidebar\n data-testid=\"app-sidebar\"\n data-no-drawer-close\n collapsible=\"icon\"\n side={i18n.dir() === 'rtl' ? 'right' : 'left'}\n >\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\n icon={Home}\n label={t('navigation.controlCenter')}\n href=\"/\"\n active={pathname === '/'}\n />\n {featureFlags.inventory ? (\n <SidebarNavItem\n icon={TableProperties}\n label={t('navigation.inventory')}\n href=\"/features\"\n active={pathname === '/features'}\n />\n ) : null}\n <SidebarNavItem\n icon={Wrench}\n label={t('navigation.tools')}\n href=\"/tools\"\n active={pathname === '/tools'}\n />\n {featureFlags.skills ? (\n <SidebarNavItem\n icon={Puzzle}\n label={t('navigation.skills')}\n href=\"/skills\"\n active={pathname === '/skills'}\n />\n ) : null}\n <SidebarNavItem\n icon={Settings}\n label={t('navigation.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={t('sidebar.features')} />\n <ScrollArea className=\"min-h-0 flex-1\">\n {repoGroups.map(({ repoPath, repoName, featureCount, statusGroups }) => (\n <RepoGroup\n key={repoPath}\n repoName={repoName}\n featureCount={featureCount}\n onAddFeature={onAddFeature ? () => onAddFeature(repoPath) : undefined}\n >\n {statusGroups.map(({ statusKey, label, items }) => (\n <FeatureStatusGroup key={statusKey} 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 ))}\n </RepoGroup>\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={\n resolvedTheme === 'dark'\n ? t('sidebar.switchToLight')\n : t('sidebar.switchToDark')\n }\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'\n ? t('sidebar.switchToLight')\n : t('sidebar.switchToDark')}\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={\n soundEnabled ? t('sidebar.muteSounds') : t('sidebar.unmuteSounds')\n }\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 ? t('sidebar.muteSounds') : t('sidebar.unmuteSounds')}\n </TooltipContent>\n </Tooltip>\n )}\n {!collapsed && (\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarMenuButton\n className=\"w-auto flex-none\"\n onClick={() => {\n clickSound.play();\n toggleAnimations();\n }}\n aria-label={animationsEnabled ? 'Disable animations' : 'Enable animations'}\n >\n {animationsEnabled ? (\n <Zap className=\"h-4 w-4\" />\n ) : (\n <ZapOff className=\"h-4 w-4\" />\n )}\n </SidebarMenuButton>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n {animationsEnabled ? 'Disable animations' : 'Enable animations'}\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 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","/* __next_internal_action_entry_do_not_use__ [{\"40f17cd57586bb2fa54f262248dcce3ee1e9e21e73\":\"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(\"40f17cd57586bb2fa54f262248dcce3ee1e9e21e73\",callServer,void 0,findSourceMapURL,\"listGitHubRepositories\");export{$$RSC_SERVER_ACTION_0 as listGitHubRepositories};","/* __next_internal_action_entry_do_not_use__ [{\"00da7d4452a7dfe670ada510be8f6bf1489124b108\":\"listGitHubOrganizations\"},\"src/presentation/web/app/actions/list-github-organizations.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"00da7d4452a7dfe670ada510be8f6bf1489124b108\",callServer,void 0,findSourceMapURL,\"listGitHubOrganizations\");export{$$RSC_SERVER_ACTION_0 as listGitHubOrganizations};","'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 {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { listGitHubRepositories } from '@/app/actions/list-github-repositories';\nimport { listGitHubOrganizations } from '@/app/actions/list-github-organizations';\nimport type { GitHubRepo } from '@shepai/core/application/ports/output/services/github-repository-service.interface';\nimport type { GitHubOrganization } from '@shepai/core/application/ports/output/services/github-repository-service.interface';\n\n/** Sentinel value representing the authenticated user's personal account */\nconst PERSONAL_OWNER = '__personal__';\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 owner?: string;\n }) => Promise<{ repos?: GitHubRepo[]; error?: string }>;\n /** Override the fetch function for testing/stories */\n fetchOrgs?: () => Promise<{ orgs?: GitHubOrganization[]; error?: string }>;\n}\n\nexport function GitHubRepoBrowser({\n onSelect,\n loading: externalLoading = false,\n fetchRepos = listGitHubRepositories,\n fetchOrgs = listGitHubOrganizations,\n}: GitHubRepoBrowserProps) {\n const [repos, setRepos] = useState<GitHubRepo[]>([]);\n const [orgs, setOrgs] = useState<GitHubOrganization[]>([]);\n const [fetching, setFetching] = useState(true);\n const [error, setError] = useState('');\n const [search, setSearch] = useState('');\n const [selectedOwner, setSelectedOwner] = useState(PERSONAL_OWNER);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Fetch organizations on mount\n useEffect(() => {\n async function loadOrgs() {\n try {\n const result = await fetchOrgs();\n if (result.orgs) {\n setOrgs(result.orgs);\n }\n } catch {\n // Org listing failure is non-critical — user can still browse personal repos\n }\n }\n loadOrgs();\n }, [fetchOrgs]);\n\n const fetchData = useCallback(\n async (searchTerm?: string, owner?: string) => {\n setFetching(true);\n setError('');\n try {\n const input: { search?: string; owner?: string } = {};\n if (searchTerm) input.search = searchTerm;\n if (owner && owner !== PERSONAL_OWNER) input.owner = owner;\n const result = await fetchRepos(Object.keys(input).length > 0 ? input : 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(search || undefined, selectedOwner);\n }, [fetchData, selectedOwner]); // eslint-disable-line react-hooks/exhaustive-deps\n\n function handleSearchChange(value: string) {\n setSearch(value);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n fetchData(value || undefined, selectedOwner);\n }, 300);\n }\n\n function handleOwnerChange(value: string) {\n setSelectedOwner(value);\n setSearch('');\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 {orgs.length > 0 ? (\n <Select value={selectedOwner} onValueChange={handleOwnerChange} disabled={disabled}>\n <SelectTrigger aria-label=\"Select owner\">\n <SelectValue placeholder=\"Select owner\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={PERSONAL_OWNER}>My repositories</SelectItem>\n {orgs.map((org) => (\n <SelectItem key={org.login} value={org.login}>\n {org.login}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n\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=\"ps-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-start 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=\"me-1 h-3 w-3\" />\n Private\n </>\n ) : (\n <>\n <Globe className=\"me-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__ [{\"404e73f4011dad1aae02357f58af12bb02bb204eca\":\"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(\"404e73f4011dad1aae02357f58af12bb02bb204eca\",callServer,void 0,findSourceMapURL,\"importGitHubRepository\");export{$$RSC_SERVER_ACTION_0 as importGitHubRepository};","'use client';\n\nimport { useCallback, useEffect, useState, type ReactNode } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { useTranslation } from 'react-i18next';\nimport { Direction } from 'radix-ui';\nimport { SidebarProvider, SidebarInset } from '@/components/ui/sidebar';\nimport { AppSidebar } from '@/components/layouts/app-sidebar';\nimport { ReactFileManagerDialog } from '@/components/common/react-file-manager-dialog';\nimport { GlobalChatPopup } from '@/components/features/chat/ChatSheet';\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';\nimport { TurnStatusesProvider } from '@/hooks/turn-statuses-provider';\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\nfunction AppShellInner({ children, sidebarOpen }: AppShellProps) {\n const router = useRouter();\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 } = useSidebarFeaturesContext();\n\n const handleFeatureClick = useCallback(\n (featureId: string) => {\n guardedNavigate(() => router.push(`/feature/${featureId}`));\n },\n [router, guardedNavigate]\n );\n\n const handleAddFeature = useCallback(\n (repositoryPath: string) => {\n guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repositoryPath)}`));\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 // Listen for pick-folder events from the canvas toolbar\n useEffect(() => {\n const handler = () => {\n void handleAddRepository();\n };\n window.addEventListener('shep:pick-folder', handler);\n return () => window.removeEventListener('shep:pick-folder', handler);\n }, [handleAddRepository]);\n\n // Listen for GitHub import event from (+) FAB\n useEffect(() => {\n const handler = () => setGithubDialogOpen(true);\n window.addEventListener('shep:open-github-import', handler);\n return () => window.removeEventListener('shep:open-github-import', handler);\n }, []);\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 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 return (\n <SidebarProvider defaultOpen={sidebarOpen ?? false}>\n <AppSidebar\n features={features}\n featureFlags={featureFlags}\n onFeatureClick={handleFeatureClick}\n onAddFeature={handleAddFeature}\n />\n <SidebarInset>\n <div className=\"relative h-full\">\n <main className=\"h-full\">{children}</main>\n {/* Global chat popup — fixed, visible across all pages */}\n <GlobalChatPopup />\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\n/** Wraps children with TurnStatusesProvider (polls all active statuses from backend). */\nfunction TurnStatusesBridge({ children }: { children: ReactNode }) {\n return <TurnStatusesProvider>{children}</TurnStatusesProvider>;\n}\n\nexport function AppShell({ children, sidebarOpen }: AppShellProps) {\n const { i18n } = useTranslation();\n const dir = i18n.dir();\n\n return (\n <Direction.Provider dir={dir}>\n <AgentEventsProvider>\n <DrawerCloseGuardProvider>\n <SidebarFeaturesProvider>\n <TurnStatusesBridge>\n <AppShellInner sidebarOpen={sidebarOpen}>{children}</AppShellInner>\n </TurnStatusesBridge>\n </SidebarFeaturesProvider>\n </DrawerCloseGuardProvider>\n </AgentEventsProvider>\n </Direction.Provider>\n );\n}\n","'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 { 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","/**\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 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 ['path', { d: 'M10.513 4.856 13.12 2.17a.5.5 0 0 1 .86.46l-1.377 4.317', key: '193nxd' }],\n ['path', { d: 'M15.656 10H20a1 1 0 0 1 .78 1.63l-1.72 1.773', key: '27a7lr' }],\n [\n 'path',\n {\n d: 'M16.273 16.273 10.88 21.83a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14H4a1 1 0 0 1-.78-1.63l4.507-4.643',\n key: '1e0qe9',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name ZapOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNTEzIDQuODU2IDEzLjEyIDIuMTdhLjUuNSAwIDAgMSAuODYuNDZsLTEuMzc3IDQuMzE3IiAvPgogIDxwYXRoIGQ9Ik0xNS42NTYgMTBIMjBhMSAxIDAgMCAxIC43OCAxLjYzbC0xLjcyIDEuNzczIiAvPgogIDxwYXRoIGQ9Ik0xNi4yNzMgMTYuMjczIDEwLjg4IDIxLjgzYS41LjUgMCAwIDEtLjg2LS40NmwxLjkyLTYuMDJBMSAxIDAgMCAwIDExIDE0SDRhMSAxIDAgMCAxLS43OC0xLjYzbDQuNTA3LTQuNjQzIiAvPgogIDxwYXRoIGQ9Im0yIDIgMjAgMjAiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/zap-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 ZapOff = createLucideIcon('zap-off', __iconNode);\n\nexport default ZapOff;\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: '9', cy: '12', r: '1', key: '1vctgf' }],\n ['circle', { cx: '9', cy: '5', r: '1', key: 'hp0tcf' }],\n ['circle', { cx: '9', cy: '19', r: '1', key: 'fkjjf6' }],\n ['circle', { cx: '15', cy: '12', r: '1', key: '1tmaij' }],\n ['circle', { cx: '15', cy: '5', r: '1', key: '19l28e' }],\n ['circle', { cx: '15', cy: '19', r: '1', key: 'f4zoj3' }],\n];\n\n/**\n * @component @name GripVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjUiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTUiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTkiIHI9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/grip-vertical\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 GripVertical = createLucideIcon('grip-vertical', __iconNode);\n\nexport default GripVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm14 10 7-7', key: 'oa77jy' }],\n ['path', { d: 'M20 10h-6V4', key: 'mjg0md' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M4 14h6v6', key: 'rmj7iw' }],\n];\n\n/**\n * @component @name Minimize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTQgMTAgNy03IiAvPgogIDxwYXRoIGQ9Ik0yMCAxMGgtNlY0IiAvPgogIDxwYXRoIGQ9Im0zIDIxIDctNyIgLz4KICA8cGF0aCBkPSJNNCAxNGg2djYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/minimize-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 Minimize2 = createLucideIcon('minimize-2', __iconNode);\n\nexport default Minimize2;\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 ['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 3v18', key: '14nvp0' }],\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M21 9H3', key: '1338ky' }],\n ['path', { d: 'M21 15H3', key: '9uk58r' }],\n];\n\n/**\n * @component @name TableProperties\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM3YxOCIgLz4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik0yMSA5SDMiIC8+CiAgPHBhdGggZD0iTTIxIDE1SDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/table-properties\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 TableProperties = createLucideIcon('table-properties', __iconNode);\n\nexport default TableProperties;\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 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 ms-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 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: '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","'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","// src/queryClient.ts\nimport {\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n noop,\n partialMatchKey,\n resolveStaleTime,\n skipToken\n} from \"./utils.js\";\nimport { QueryCache } from \"./queryCache.js\";\nimport { MutationCache } from \"./mutationCache.js\";\nimport { focusManager } from \"./focusManager.js\";\nimport { onlineManager } from \"./onlineManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { infiniteQueryBehavior } from \"./infiniteQueryBehavior.js\";\nvar QueryClient = class {\n #queryCache;\n #mutationCache;\n #defaultOptions;\n #queryDefaults;\n #mutationDefaults;\n #mountCount;\n #unsubscribeFocus;\n #unsubscribeOnline;\n constructor(config = {}) {\n this.#queryCache = config.queryCache || new QueryCache();\n this.#mutationCache = config.mutationCache || new MutationCache();\n this.#defaultOptions = config.defaultOptions || {};\n this.#queryDefaults = /* @__PURE__ */ new Map();\n this.#mutationDefaults = /* @__PURE__ */ new Map();\n this.#mountCount = 0;\n }\n mount() {\n this.#mountCount++;\n if (this.#mountCount !== 1) return;\n this.#unsubscribeFocus = focusManager.subscribe(async (focused) => {\n if (focused) {\n await this.resumePausedMutations();\n this.#queryCache.onFocus();\n }\n });\n this.#unsubscribeOnline = onlineManager.subscribe(async (online) => {\n if (online) {\n await this.resumePausedMutations();\n this.#queryCache.onOnline();\n }\n });\n }\n unmount() {\n this.#mountCount--;\n if (this.#mountCount !== 0) return;\n this.#unsubscribeFocus?.();\n this.#unsubscribeFocus = void 0;\n this.#unsubscribeOnline?.();\n this.#unsubscribeOnline = void 0;\n }\n isFetching(filters) {\n return this.#queryCache.findAll({ ...filters, fetchStatus: \"fetching\" }).length;\n }\n isMutating(filters) {\n return this.#mutationCache.findAll({ ...filters, status: \"pending\" }).length;\n }\n /**\n * Imperative (non-reactive) way to retrieve data for a QueryKey.\n * Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates.\n *\n * Hint: Do not use this function inside a component, because it won't receive updates.\n * Use `useQuery` to create a `QueryObserver` that subscribes to changes.\n */\n getQueryData(queryKey) {\n const options = this.defaultQueryOptions({ queryKey });\n return this.#queryCache.get(options.queryHash)?.state.data;\n }\n ensureQueryData(options) {\n const defaultedOptions = this.defaultQueryOptions(options);\n const query = this.#queryCache.build(this, defaultedOptions);\n const cachedData = query.state.data;\n if (cachedData === void 0) {\n return this.fetchQuery(options);\n }\n if (options.revalidateIfStale && query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))) {\n void this.prefetchQuery(defaultedOptions);\n }\n return Promise.resolve(cachedData);\n }\n getQueriesData(filters) {\n return this.#queryCache.findAll(filters).map(({ queryKey, state }) => {\n const data = state.data;\n return [queryKey, data];\n });\n }\n setQueryData(queryKey, updater, options) {\n const defaultedOptions = this.defaultQueryOptions({ queryKey });\n const query = this.#queryCache.get(\n defaultedOptions.queryHash\n );\n const prevData = query?.state.data;\n const data = functionalUpdate(updater, prevData);\n if (data === void 0) {\n return void 0;\n }\n return this.#queryCache.build(this, defaultedOptions).setData(data, { ...options, manual: true });\n }\n setQueriesData(filters, updater, options) {\n return notifyManager.batch(\n () => this.#queryCache.findAll(filters).map(({ queryKey }) => [\n queryKey,\n this.setQueryData(queryKey, updater, options)\n ])\n );\n }\n getQueryState(queryKey) {\n const options = this.defaultQueryOptions({ queryKey });\n return this.#queryCache.get(\n options.queryHash\n )?.state;\n }\n removeQueries(filters) {\n const queryCache = this.#queryCache;\n notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n queryCache.remove(query);\n });\n });\n }\n resetQueries(filters, options) {\n const queryCache = this.#queryCache;\n return notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n query.reset();\n });\n return this.refetchQueries(\n {\n type: \"active\",\n ...filters\n },\n options\n );\n });\n }\n cancelQueries(filters, cancelOptions = {}) {\n const defaultedCancelOptions = { revert: true, ...cancelOptions };\n const promises = notifyManager.batch(\n () => this.#queryCache.findAll(filters).map((query) => query.cancel(defaultedCancelOptions))\n );\n return Promise.all(promises).then(noop).catch(noop);\n }\n invalidateQueries(filters, options = {}) {\n return notifyManager.batch(() => {\n this.#queryCache.findAll(filters).forEach((query) => {\n query.invalidate();\n });\n if (filters?.refetchType === \"none\") {\n return Promise.resolve();\n }\n return this.refetchQueries(\n {\n ...filters,\n type: filters?.refetchType ?? filters?.type ?? \"active\"\n },\n options\n );\n });\n }\n refetchQueries(filters, options = {}) {\n const fetchOptions = {\n ...options,\n cancelRefetch: options.cancelRefetch ?? true\n };\n const promises = notifyManager.batch(\n () => this.#queryCache.findAll(filters).filter((query) => !query.isDisabled() && !query.isStatic()).map((query) => {\n let promise = query.fetch(void 0, fetchOptions);\n if (!fetchOptions.throwOnError) {\n promise = promise.catch(noop);\n }\n return query.state.fetchStatus === \"paused\" ? Promise.resolve() : promise;\n })\n );\n return Promise.all(promises).then(noop);\n }\n fetchQuery(options) {\n const defaultedOptions = this.defaultQueryOptions(options);\n if (defaultedOptions.retry === void 0) {\n defaultedOptions.retry = false;\n }\n const query = this.#queryCache.build(this, defaultedOptions);\n return query.isStaleByTime(\n resolveStaleTime(defaultedOptions.staleTime, query)\n ) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data);\n }\n prefetchQuery(options) {\n return this.fetchQuery(options).then(noop).catch(noop);\n }\n fetchInfiniteQuery(options) {\n options.behavior = infiniteQueryBehavior(options.pages);\n return this.fetchQuery(options);\n }\n prefetchInfiniteQuery(options) {\n return this.fetchInfiniteQuery(options).then(noop).catch(noop);\n }\n ensureInfiniteQueryData(options) {\n options.behavior = infiniteQueryBehavior(options.pages);\n return this.ensureQueryData(options);\n }\n resumePausedMutations() {\n if (onlineManager.isOnline()) {\n return this.#mutationCache.resumePausedMutations();\n }\n return Promise.resolve();\n }\n getQueryCache() {\n return this.#queryCache;\n }\n getMutationCache() {\n return this.#mutationCache;\n }\n getDefaultOptions() {\n return this.#defaultOptions;\n }\n setDefaultOptions(options) {\n this.#defaultOptions = options;\n }\n setQueryDefaults(queryKey, options) {\n this.#queryDefaults.set(hashKey(queryKey), {\n queryKey,\n defaultOptions: options\n });\n }\n getQueryDefaults(queryKey) {\n const defaults = [...this.#queryDefaults.values()];\n const result = {};\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(queryKey, queryDefault.queryKey)) {\n Object.assign(result, queryDefault.defaultOptions);\n }\n });\n return result;\n }\n setMutationDefaults(mutationKey, options) {\n this.#mutationDefaults.set(hashKey(mutationKey), {\n mutationKey,\n defaultOptions: options\n });\n }\n getMutationDefaults(mutationKey) {\n const defaults = [...this.#mutationDefaults.values()];\n const result = {};\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(mutationKey, queryDefault.mutationKey)) {\n Object.assign(result, queryDefault.defaultOptions);\n }\n });\n return result;\n }\n defaultQueryOptions(options) {\n if (options._defaulted) {\n return options;\n }\n const defaultedOptions = {\n ...this.#defaultOptions.queries,\n ...this.getQueryDefaults(options.queryKey),\n ...options,\n _defaulted: true\n };\n if (!defaultedOptions.queryHash) {\n defaultedOptions.queryHash = hashQueryKeyByOptions(\n defaultedOptions.queryKey,\n defaultedOptions\n );\n }\n if (defaultedOptions.refetchOnReconnect === void 0) {\n defaultedOptions.refetchOnReconnect = defaultedOptions.networkMode !== \"always\";\n }\n if (defaultedOptions.throwOnError === void 0) {\n defaultedOptions.throwOnError = !!defaultedOptions.suspense;\n }\n if (!defaultedOptions.networkMode && defaultedOptions.persister) {\n defaultedOptions.networkMode = \"offlineFirst\";\n }\n if (defaultedOptions.queryFn === skipToken) {\n defaultedOptions.enabled = false;\n }\n return defaultedOptions;\n }\n defaultMutationOptions(options) {\n if (options?._defaulted) {\n return options;\n }\n return {\n ...this.#defaultOptions.mutations,\n ...options?.mutationKey && this.getMutationDefaults(options.mutationKey),\n ...options,\n _defaulted: true\n };\n }\n clear() {\n this.#queryCache.clear();\n this.#mutationCache.clear();\n }\n};\nexport {\n QueryClient\n};\n//# sourceMappingURL=queryClient.js.map","'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useState } from 'react';\n\nexport function QueryProvider({ children }: { children: React.ReactNode }) {\n // eslint-disable-next-line react/hook-use-state -- intentionally omitting setter; stable instance\n const [queryClient] = useState(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000,\n refetchOnWindowFocus: false,\n },\n },\n })\n );\n\n return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;\n}\n","// src/mutationCache.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Mutation } from \"./mutation.js\";\nimport { matchMutation, noop } from \"./utils.js\";\nimport { Subscribable } from \"./subscribable.js\";\nvar MutationCache = class extends Subscribable {\n constructor(config = {}) {\n super();\n this.config = config;\n this.#mutations = /* @__PURE__ */ new Set();\n this.#scopes = /* @__PURE__ */ new Map();\n this.#mutationId = 0;\n }\n #mutations;\n #scopes;\n #mutationId;\n build(client, options, state) {\n const mutation = new Mutation({\n client,\n mutationCache: this,\n mutationId: ++this.#mutationId,\n options: client.defaultMutationOptions(options),\n state\n });\n this.add(mutation);\n return mutation;\n }\n add(mutation) {\n this.#mutations.add(mutation);\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const scopedMutations = this.#scopes.get(scope);\n if (scopedMutations) {\n scopedMutations.push(mutation);\n } else {\n this.#scopes.set(scope, [mutation]);\n }\n }\n this.notify({ type: \"added\", mutation });\n }\n remove(mutation) {\n if (this.#mutations.delete(mutation)) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const scopedMutations = this.#scopes.get(scope);\n if (scopedMutations) {\n if (scopedMutations.length > 1) {\n const index = scopedMutations.indexOf(mutation);\n if (index !== -1) {\n scopedMutations.splice(index, 1);\n }\n } else if (scopedMutations[0] === mutation) {\n this.#scopes.delete(scope);\n }\n }\n }\n }\n this.notify({ type: \"removed\", mutation });\n }\n canRun(mutation) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const mutationsWithSameScope = this.#scopes.get(scope);\n const firstPendingMutation = mutationsWithSameScope?.find(\n (m) => m.state.status === \"pending\"\n );\n return !firstPendingMutation || firstPendingMutation === mutation;\n } else {\n return true;\n }\n }\n runNext(mutation) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const foundMutation = this.#scopes.get(scope)?.find((m) => m !== mutation && m.state.isPaused);\n return foundMutation?.continue() ?? Promise.resolve();\n } else {\n return Promise.resolve();\n }\n }\n clear() {\n notifyManager.batch(() => {\n this.#mutations.forEach((mutation) => {\n this.notify({ type: \"removed\", mutation });\n });\n this.#mutations.clear();\n this.#scopes.clear();\n });\n }\n getAll() {\n return Array.from(this.#mutations);\n }\n find(filters) {\n const defaultedFilters = { exact: true, ...filters };\n return this.getAll().find(\n (mutation) => matchMutation(defaultedFilters, mutation)\n );\n }\n findAll(filters = {}) {\n return this.getAll().filter((mutation) => matchMutation(filters, mutation));\n }\n notify(event) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event);\n });\n });\n }\n resumePausedMutations() {\n const pausedMutations = this.getAll().filter((x) => x.state.isPaused);\n return notifyManager.batch(\n () => Promise.all(\n pausedMutations.map((mutation) => mutation.continue().catch(noop))\n )\n );\n }\n};\nfunction scopeFor(mutation) {\n return mutation.options.scope?.id;\n}\nexport {\n MutationCache\n};\n//# sourceMappingURL=mutationCache.js.map","// src/queryCache.ts\nimport { hashQueryKeyByOptions, matchQuery } from \"./utils.js\";\nimport { Query } from \"./query.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nvar QueryCache = class extends Subscribable {\n constructor(config = {}) {\n super();\n this.config = config;\n this.#queries = /* @__PURE__ */ new Map();\n }\n #queries;\n build(client, options, state) {\n const queryKey = options.queryKey;\n const queryHash = options.queryHash ?? hashQueryKeyByOptions(queryKey, options);\n let query = this.get(queryHash);\n if (!query) {\n query = new Query({\n client,\n queryKey,\n queryHash,\n options: client.defaultQueryOptions(options),\n state,\n defaultOptions: client.getQueryDefaults(queryKey)\n });\n this.add(query);\n }\n return query;\n }\n add(query) {\n if (!this.#queries.has(query.queryHash)) {\n this.#queries.set(query.queryHash, query);\n this.notify({\n type: \"added\",\n query\n });\n }\n }\n remove(query) {\n const queryInMap = this.#queries.get(query.queryHash);\n if (queryInMap) {\n query.destroy();\n if (queryInMap === query) {\n this.#queries.delete(query.queryHash);\n }\n this.notify({ type: \"removed\", query });\n }\n }\n clear() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n this.remove(query);\n });\n });\n }\n get(queryHash) {\n return this.#queries.get(queryHash);\n }\n getAll() {\n return [...this.#queries.values()];\n }\n find(filters) {\n const defaultedFilters = { exact: true, ...filters };\n return this.getAll().find(\n (query) => matchQuery(defaultedFilters, query)\n );\n }\n findAll(filters = {}) {\n const queries = this.getAll();\n return Object.keys(filters).length > 0 ? queries.filter((query) => matchQuery(filters, query)) : queries;\n }\n notify(event) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event);\n });\n });\n }\n onFocus() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onFocus();\n });\n });\n }\n onOnline() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onOnline();\n });\n });\n }\n};\nexport {\n QueryCache\n};\n//# sourceMappingURL=queryCache.js.map","// src/infiniteQueryBehavior.ts\nimport {\n addConsumeAwareSignal,\n addToEnd,\n addToStart,\n ensureQueryFn\n} from \"./utils.js\";\nfunction infiniteQueryBehavior(pages) {\n return {\n onFetch: (context, query) => {\n const options = context.options;\n const direction = context.fetchOptions?.meta?.fetchMore?.direction;\n const oldPages = context.state.data?.pages || [];\n const oldPageParams = context.state.data?.pageParams || [];\n let result = { pages: [], pageParams: [] };\n let currentPage = 0;\n const fetchFn = async () => {\n let cancelled = false;\n const addSignalProperty = (object) => {\n addConsumeAwareSignal(\n object,\n () => context.signal,\n () => cancelled = true\n );\n };\n const queryFn = ensureQueryFn(context.options, context.fetchOptions);\n const fetchPage = async (data, param, previous) => {\n if (cancelled) {\n return Promise.reject();\n }\n if (param == null && data.pages.length) {\n return Promise.resolve(data);\n }\n const createQueryFnContext = () => {\n const queryFnContext2 = {\n client: context.client,\n queryKey: context.queryKey,\n pageParam: param,\n direction: previous ? \"backward\" : \"forward\",\n meta: context.options.meta\n };\n addSignalProperty(queryFnContext2);\n return queryFnContext2;\n };\n const queryFnContext = createQueryFnContext();\n const page = await queryFn(queryFnContext);\n const { maxPages } = context.options;\n const addTo = previous ? addToStart : addToEnd;\n return {\n pages: addTo(data.pages, page, maxPages),\n pageParams: addTo(data.pageParams, param, maxPages)\n };\n };\n if (direction && oldPages.length) {\n const previous = direction === \"backward\";\n const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;\n const oldData = {\n pages: oldPages,\n pageParams: oldPageParams\n };\n const param = pageParamFn(options, oldData);\n result = await fetchPage(oldData, param, previous);\n } else {\n const remainingPages = pages ?? oldPages.length;\n do {\n const param = currentPage === 0 ? oldPageParams[0] ?? options.initialPageParam : getNextPageParam(options, result);\n if (currentPage > 0 && param == null) {\n break;\n }\n result = await fetchPage(result, param);\n currentPage++;\n } while (currentPage < remainingPages);\n }\n return result;\n };\n if (context.options.persister) {\n context.fetchFn = () => {\n return context.options.persister?.(\n fetchFn,\n {\n client: context.client,\n queryKey: context.queryKey,\n meta: context.options.meta,\n signal: context.signal\n },\n query\n );\n };\n } else {\n context.fetchFn = fetchFn;\n }\n }\n };\n}\nfunction getNextPageParam(options, { pages, pageParams }) {\n const lastIndex = pages.length - 1;\n return pages.length > 0 ? options.getNextPageParam(\n pages[lastIndex],\n pages,\n pageParams[lastIndex],\n pageParams\n ) : void 0;\n}\nfunction getPreviousPageParam(options, { pages, pageParams }) {\n return pages.length > 0 ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams) : void 0;\n}\nfunction hasNextPage(options, data) {\n if (!data) return false;\n return getNextPageParam(options, data) != null;\n}\nfunction hasPreviousPage(options, data) {\n if (!data || !options.getPreviousPageParam) return false;\n return getPreviousPageParam(options, data) != null;\n}\nexport {\n hasNextPage,\n hasPreviousPage,\n infiniteQueryBehavior\n};\n//# sourceMappingURL=infiniteQueryBehavior.js.map","'use client';\n\nimport { useEffect } from 'react';\nimport { I18nextProvider } from 'react-i18next';\nimport webI18n from '@/lib/i18n';\nimport { applyRtlFont } from '@/lib/rtl-fonts';\n\ninterface I18nProviderProps {\n initialLanguage: string;\n children: React.ReactNode;\n}\n\n/**\n * Client-side i18n provider that wraps the application with react-i18next.\n *\n * Receives the initial language from the server-side layout and sets it\n * on the i18next instance. Language changes at runtime (e.g. from settings)\n * call i18n.changeLanguage() which re-renders all translated components.\n *\n * Also handles lazy-loading RTL fonts (Noto Sans Arabic/Hebrew) when the\n * active language requires them.\n */\nexport function I18nProvider({ initialLanguage, children }: I18nProviderProps) {\n useEffect(() => {\n if (webI18n.language !== initialLanguage) {\n webI18n.changeLanguage(initialLanguage);\n }\n // Apply RTL font for the initial language (lazy-loads if needed)\n applyRtlFont(initialLanguage);\n }, [initialLanguage]);\n\n // Listen for runtime language changes and apply/remove RTL fonts\n useEffect(() => {\n function onLanguageChanged(lng: string) {\n applyRtlFont(lng);\n }\n webI18n.on('languageChanged', onLanguageChanged);\n return () => {\n webI18n.off('languageChanged', onLanguageChanged);\n };\n }, []);\n\n return <I18nextProvider i18n={webI18n}>{children}</I18nextProvider>;\n}\n","/**\n * Web UI i18n configuration.\n *\n * Initializes i18next with react-i18next for the web presentation layer.\n * Uses the common and web namespaces. All supported language translations\n * are bundled inline so language switching works immediately.\n */\n\nimport i18next, { type i18n } from 'i18next';\nimport { initReactI18next } from 'react-i18next';\n\n// Import all language translations inline\nimport commonEn from '../../../../translations/en/common.json';\nimport webEn from '../../../../translations/en/web.json';\nimport commonRu from '../../../../translations/ru/common.json';\nimport webRu from '../../../../translations/ru/web.json';\nimport commonPt from '../../../../translations/pt/common.json';\nimport webPt from '../../../../translations/pt/web.json';\nimport commonEs from '../../../../translations/es/common.json';\nimport webEs from '../../../../translations/es/web.json';\nimport commonAr from '../../../../translations/ar/common.json';\nimport webAr from '../../../../translations/ar/web.json';\nimport commonHe from '../../../../translations/he/common.json';\nimport webHe from '../../../../translations/he/web.json';\nimport commonFr from '../../../../translations/fr/common.json';\nimport webFr from '../../../../translations/fr/web.json';\nimport commonDe from '../../../../translations/de/common.json';\nimport webDe from '../../../../translations/de/web.json';\n\nconst FALLBACK_LANGUAGE = 'en';\nconst NAMESPACES = ['common', 'web'] as const;\n\n/**\n * Create and configure the web i18next instance.\n *\n * Returns a singleton instance — multiple calls return the same object.\n * Use `changeLanguage()` on the returned instance to switch locales at runtime.\n */\nfunction createI18nInstance(): i18n {\n const instance = i18next.createInstance();\n\n instance.use(initReactI18next).init({\n lng: FALLBACK_LANGUAGE,\n fallbackLng: FALLBACK_LANGUAGE,\n defaultNS: 'common',\n ns: [...NAMESPACES],\n resources: {\n en: { common: commonEn, web: webEn },\n ru: { common: commonRu, web: webRu },\n pt: { common: commonPt, web: webPt },\n es: { common: commonEs, web: webEs },\n ar: { common: commonAr, web: webAr },\n he: { common: commonHe, web: webHe },\n fr: { common: commonFr, web: webFr },\n de: { common: commonDe, web: webDe },\n },\n interpolation: {\n escapeValue: false, // React already escapes output\n },\n react: {\n useSuspense: false, // Avoid suspense boundaries for i18n\n },\n });\n\n return instance;\n}\n\n/** Singleton web i18next instance. */\nconst webI18n: i18n = createI18nInstance();\n\nexport default webI18n;\nexport { FALLBACK_LANGUAGE, NAMESPACES };\n","/**\n * Lazy font loader for RTL languages (Arabic and Hebrew).\n *\n * Dynamically loads Noto Sans Arabic or Noto Sans Hebrew from Google Fonts\n * when the user switches to an RTL language. Fonts are cached after first\n * load — subsequent calls for the same language are no-ops.\n *\n * This module must only be imported in client components (uses DOM APIs).\n */\n\nconst FONT_CONFIG: Record<string, { family: string; cssUrl: string }> = {\n ar: {\n family: 'Noto Sans Arabic',\n cssUrl:\n 'https://fonts.googleapis.com/css2?family=Noto+Sans+Arabic:wght@400;500;600;700&display=swap',\n },\n he: {\n family: 'Noto Sans Hebrew',\n cssUrl:\n 'https://fonts.googleapis.com/css2?family=Noto+Sans+Hebrew:wght@400;500;600;700&display=swap',\n },\n};\n\n/**\n * Load the appropriate font for an RTL language and apply it to the document.\n *\n * For non-RTL languages this removes any previously applied RTL font class.\n * The Google Fonts stylesheet is injected as a `<link>` element in `<head>`,\n * which the browser caches normally (no re-download on subsequent visits).\n * Duplicate link elements are avoided by checking DOM existence.\n */\nexport function applyRtlFont(language: string): void {\n const config = FONT_CONFIG[language];\n\n // Remove any existing RTL font class\n document.documentElement.classList.remove('font-rtl-arabic', 'font-rtl-hebrew');\n\n if (!config) {\n // LTR language — clear RTL font override\n document.documentElement.style.removeProperty('--font-rtl');\n return;\n }\n\n // Set the CSS custom property for the RTL font family\n document.documentElement.style.setProperty('--font-rtl', `\"${config.family}\"`);\n\n // Add language-specific font class\n const fontClass = language === 'ar' ? 'font-rtl-arabic' : 'font-rtl-hebrew';\n document.documentElement.classList.add(fontClass);\n\n // Load the font stylesheet if not already present in the DOM\n const linkId = `rtl-font-${language}`;\n if (!document.getElementById(linkId)) {\n const link = document.createElement('link');\n link.id = linkId;\n link.rel = 'stylesheet';\n link.href = config.cssUrl;\n document.head.appendChild(link);\n }\n}\n"],"names":[],"mappings":"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","ignoreList":[25,26,27,28,29,30,31,32,35,36,38,40,41,42]}