@shepai/cli 1.60.0 → 1.61.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 (180) hide show
  1. package/dist/src/presentation/web/components/common/action-button/action-button.d.ts.map +1 -1
  2. package/dist/src/presentation/web/components/common/action-button/action-button.js +7 -1
  3. package/dist/src/presentation/web/components/common/action-button/action-button.stories.d.ts +1 -1
  4. package/dist/src/presentation/web/components/common/action-button/action-button.stories.d.ts.map +1 -1
  5. package/dist/src/presentation/web/components/common/action-button/action-button.stories.js +1 -1
  6. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -1
  7. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +10 -1
  8. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts +20 -0
  9. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts.map +1 -0
  10. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.js +68 -0
  11. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  12. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +21 -2
  13. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  14. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +13 -2
  15. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +16 -3
  17. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +1 -1
  18. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
  19. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -1
  20. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.js +14 -1
  22. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.d.ts +2 -0
  23. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.js +2 -0
  25. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.js +4 -1
  27. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.d.ts +1 -0
  28. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.js +1 -0
  30. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +14 -1
  32. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +1 -1
  33. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -1
  35. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.d.ts.map +1 -1
  36. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.js +13 -0
  37. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts +2 -0
  38. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts.map +1 -1
  39. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.js +2 -0
  40. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
  41. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  42. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +7 -13
  43. package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -1
  44. package/dist/src/presentation/web/hooks/use-notifications.js +18 -18
  45. package/dist/src/presentation/web/hooks/use-sound-action.d.ts +100 -0
  46. package/dist/src/presentation/web/hooks/use-sound-action.d.ts.map +1 -0
  47. package/dist/src/presentation/web/hooks/use-sound-action.js +42 -0
  48. package/dist/src/presentation/web/hooks/use-sound-action.stories.d.ts +6 -0
  49. package/dist/src/presentation/web/hooks/use-sound-action.stories.d.ts.map +1 -0
  50. package/dist/src/presentation/web/hooks/use-sound-action.stories.js +61 -0
  51. package/dist/tsconfig.build.tsbuildinfo +1 -1
  52. package/package.json +1 -1
  53. package/web/.next/BUILD_ID +1 -1
  54. package/web/.next/build-manifest.json +2 -2
  55. package/web/.next/cache/.previewinfo +1 -1
  56. package/web/.next/cache/.rscinfo +1 -1
  57. package/web/.next/cache/.tsbuildinfo +1 -1
  58. package/web/.next/cache/config.json +3 -3
  59. package/web/.next/fallback-build-manifest.json +2 -2
  60. package/web/.next/prerender-manifest.json +3 -3
  61. package/web/.next/required-server-files.js +1 -1
  62. package/web/.next/required-server-files.json +1 -1
  63. package/web/.next/server/app/_global-error.html +2 -2
  64. package/web/.next/server/app/_global-error.rsc +1 -1
  65. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  66. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  67. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  68. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  70. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  71. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  72. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/page/server-reference-manifest.json +14 -14
  74. package/web/.next/server/app/page.js.nft.json +1 -1
  75. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/skills/page/server-reference-manifest.json +1 -1
  77. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  78. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  80. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  81. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  83. package/web/.next/server/app/version/page.js.nft.json +1 -1
  84. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +2 -2
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  102. package/web/.next/server/chunks/ssr/{_34627374._.js → _d3711354._.js} +2 -2
  103. package/web/.next/server/chunks/ssr/_d3711354._.js.map +1 -0
  104. package/web/.next/server/pages/500.html +2 -2
  105. package/web/.next/server/server-reference-manifest.js +1 -1
  106. package/web/.next/server/server-reference-manifest.json +15 -15
  107. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  108. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  109. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  110. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  111. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  112. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  113. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  114. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  115. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  116. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  117. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  118. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  119. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  120. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  121. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
  122. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  123. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  124. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +1 -1
  125. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  126. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  127. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  128. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  129. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  130. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  131. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  132. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  133. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  134. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +1 -1
  135. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  136. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  137. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +1 -1
  138. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  139. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +2 -2
  140. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +1 -1
  141. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  142. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_34627374._.js → _d3711354._.js} +2 -2
  143. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  144. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  145. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +15 -15
  146. package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.stories.tsx +1 -1
  147. package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.tsx +9 -1
  148. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.tsx +82 -0
  149. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +16 -2
  150. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +27 -3
  151. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +14 -2
  152. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +1 -1
  153. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +17 -4
  154. package/web/.next/standalone/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.tsx +2 -0
  155. package/web/.next/standalone/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.tsx +14 -1
  156. package/web/.next/standalone/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.tsx +1 -0
  157. package/web/.next/standalone/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.tsx +6 -1
  158. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +1 -1
  159. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +14 -1
  160. package/web/.next/standalone/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.tsx +2 -0
  161. package/web/.next/standalone/src/presentation/web/components/common/theme-toggle/theme-toggle.tsx +14 -0
  162. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +2 -2
  163. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +7 -12
  164. package/web/.next/standalone/src/presentation/web/hooks/use-notifications.ts +20 -19
  165. package/web/.next/standalone/src/presentation/web/hooks/use-sound-action.stories.tsx +107 -0
  166. package/web/.next/standalone/src/presentation/web/hooks/use-sound-action.ts +53 -0
  167. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  168. package/web/.next/static/chunks/{bac5122e95f5c7eb.js → 13664c029245afc8.js} +1 -1
  169. package/web/.next/static/chunks/2960a70537e4fd12.js +10 -0
  170. package/web/.next/static/chunks/45f510f84c7c417d.css +2 -0
  171. package/web/.next/static/chunks/79718b1f5713fdc0.js +1 -0
  172. package/web/.next/trace +1 -1
  173. package/web/.next/trace-build +1 -1
  174. package/web/.next/server/chunks/ssr/_34627374._.js.map +0 -1
  175. package/web/.next/static/chunks/1fe24572a810eafa.js +0 -10
  176. package/web/.next/static/chunks/7d3c5ae8f47e74cd.js +0 -1
  177. package/web/.next/static/chunks/8b2879f911a05b55.css +0 -2
  178. /package/web/.next/static/{enyZhg62FqP6oInxg1T3h → _DBWexyU1QkK02q15qod2}/_buildManifest.js +0 -0
  179. /package/web/.next/static/{enyZhg62FqP6oInxg1T3h → _DBWexyU1QkK02q15qod2}/_clientMiddlewareManifest.json +0 -0
  180. /package/web/.next/static/{enyZhg62FqP6oInxg1T3h → _DBWexyU1QkK02q15qod2}/_ssgManifest.js +0 -0
@@ -25,7 +25,7 @@ import type { PrdQuestionnaireData } from '@/components/common/prd-questionnaire
25
25
  import { TechDecisionsDrawer } from '@/components/common/tech-decisions-review';
26
26
  import { MergeReviewDrawer } from '@/components/common/merge-review';
27
27
  import { NotificationPermissionBanner } from '@/components/common/notification-permission-banner';
28
- import { useSound } from '@/hooks/use-sound';
28
+ import { useSoundAction } from '@/hooks/use-sound-action';
29
29
  import { ControlCenterEmptyState } from './control-center-empty-state';
30
30
  import { useControlCenterState } from './use-control-center-state';
31
31
 
@@ -88,7 +88,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
88
88
 
89
89
  // Reject state (shared by both drawers)
90
90
  const [isRejecting, setIsRejecting] = useState(false);
91
- const rejectSound = useSound('caution', { volume: 0.5 });
91
+ const rejectSound = useSoundAction('reject');
92
92
 
93
93
  // Tech decisions drawer state
94
94
  const [techDecisionsData, setTechDecisionsData] = useState<TechDecisionsReviewData | null>(null);
@@ -14,7 +14,7 @@ import { deleteFeature } from '@/app/actions/delete-feature';
14
14
  import { addRepository } from '@/app/actions/add-repository';
15
15
  import { deleteRepository } from '@/app/actions/delete-repository';
16
16
  import { useAgentEventsContext } from '@/hooks/agent-events-provider';
17
- import { useSound } from '@/hooks/use-sound';
17
+ import { useSoundAction } from '@/hooks/use-sound-action';
18
18
  import {
19
19
  mapEventTypeToState,
20
20
  mapPhaseNameToLifecycle,
@@ -73,9 +73,9 @@ export function useControlCenterState(
73
73
  const [selectedNode, setSelectedNode] = useState<FeatureNodeData | null>(null);
74
74
  const [isCreateDrawerOpen, setIsCreateDrawerOpen] = useState(false);
75
75
  const [isDeleting, setIsDeleting] = useState(false);
76
- const deleteSound = useSound('transition_down', { volume: 0.5 });
77
- const createSound = useSound('transition_up', { volume: 0.5 });
78
- const clickSound = useSound('tap_01', { volume: 0.3 });
76
+ const deleteSound = useSoundAction('delete');
77
+ const createSound = useSoundAction('create');
78
+ const clickSound = useSoundAction('click');
79
79
  const [pendingRepoNodeId, setPendingRepoNodeId] = useState<string | null>(null);
80
80
 
81
81
  // Sync server props into local state when router.refresh() delivers new data
@@ -262,13 +262,9 @@ export function useControlCenterState(
262
262
  setNodes((ns) => applyNodeChanges(changes, ns));
263
263
  }, []);
264
264
 
265
- const closeSound = useSound('transition_down', { volume: 0.01 });
266
265
  const clearSelection = useCallback(() => {
267
- setSelectedNode((prev) => {
268
- if (prev) closeSound.play();
269
- return null;
270
- });
271
- }, [closeSound]);
266
+ setSelectedNode(null);
267
+ }, []);
272
268
 
273
269
  const handleNodeClick = useCallback(
274
270
  (_event: React.MouseEvent, node: CanvasNodeType) => {
@@ -509,10 +505,9 @@ export function useControlCenterState(
509
505
  );
510
506
 
511
507
  const closeCreateDrawer = useCallback(() => {
512
- closeSound.play();
513
508
  setIsCreateDrawerOpen(false);
514
509
  setPendingParentFeatureId(undefined);
515
- }, [closeSound]);
510
+ }, []);
516
511
 
517
512
  const handleDeleteFeature = useCallback(
518
513
  async (featureId: string) => {
@@ -5,7 +5,8 @@ import { toast } from 'sonner';
5
5
  import type { NotificationEvent } from '@shepai/core/domain/generated/output';
6
6
  import { NotificationEventType, NotificationSeverity } from '@shepai/core/domain/generated/output';
7
7
  import { useAgentEventsContext } from './agent-events-provider';
8
- import { useSound } from './use-sound';
8
+ import { useSoundAction } from './use-sound-action';
9
+ import type { SoundAction } from './use-sound-action';
9
10
 
10
11
  export interface UseNotificationsResult {
11
12
  requestBrowserPermission: () => Promise<void>;
@@ -47,27 +48,27 @@ function dispatchBrowserNotification(event: NotificationEvent): void {
47
48
  });
48
49
  }
49
50
 
50
- const SEVERITY_TO_SOUND = {
51
- [NotificationSeverity.Success]: 'celebration',
52
- [NotificationSeverity.Error]: 'caution',
53
- [NotificationSeverity.Warning]: 'notification',
54
- [NotificationSeverity.Info]: 'button',
55
- } as const;
51
+ const SEVERITY_TO_ACTION: Record<NotificationSeverity, SoundAction> = {
52
+ [NotificationSeverity.Success]: 'notification-success',
53
+ [NotificationSeverity.Error]: 'notification-error',
54
+ [NotificationSeverity.Warning]: 'notification-warning',
55
+ [NotificationSeverity.Info]: 'notification-info',
56
+ };
56
57
 
57
58
  export function useNotifications(): UseNotificationsResult {
58
59
  const { events } = useAgentEventsContext();
59
60
 
60
- const successSound = useSound('celebration', { volume: 0.5 });
61
- const errorSound = useSound('caution', { volume: 0.5 });
62
- const warningSound = useSound('notification', { volume: 0.5 });
63
- const infoSound = useSound('button', { volume: 0.5 });
61
+ const successSound = useSoundAction('notification-success');
62
+ const errorSound = useSoundAction('notification-error');
63
+ const warningSound = useSoundAction('notification-warning');
64
+ const infoSound = useSoundAction('notification-info');
64
65
 
65
- const soundsByName = useMemo<Record<string, { play: () => void }>>(
66
+ const soundsByAction = useMemo<Record<string, { play: () => void }>>(
66
67
  () => ({
67
- celebration: successSound,
68
- caution: errorSound,
69
- notification: warningSound,
70
- button: infoSound,
68
+ 'notification-success': successSound,
69
+ 'notification-error': errorSound,
70
+ 'notification-warning': warningSound,
71
+ 'notification-info': infoSound,
71
72
  }),
72
73
  [successSound, errorSound, warningSound, infoSound]
73
74
  );
@@ -103,10 +104,10 @@ export function useNotifications(): UseNotificationsResult {
103
104
  dispatchToast(event);
104
105
  dispatchBrowserNotification(event);
105
106
 
106
- const soundName = SEVERITY_TO_SOUND[event.severity];
107
- soundsByName[soundName]?.play();
107
+ const actionName = SEVERITY_TO_ACTION[event.severity];
108
+ soundsByAction[actionName]?.play();
108
109
  }
109
- }, [events, soundsByName]);
110
+ }, [events, soundsByAction]);
110
111
 
111
112
  const requestBrowserPermission = useCallback(async () => {
112
113
  if (typeof globalThis.Notification === 'undefined') return;
@@ -0,0 +1,107 @@
1
+ import { useState } from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import { Button } from '@/components/ui/button';
4
+ import { useSoundAction, SOUND_ACTION_MAP, type SoundAction } from './use-sound-action';
5
+
6
+ /* ------------------------------------------------------------------ */
7
+ /* Action categories for display grouping */
8
+ /* ------------------------------------------------------------------ */
9
+
10
+ const ACTION_CATEGORIES: Record<string, SoundAction[]> = {
11
+ 'Navigation (0.2)': ['navigate', 'menu-item'],
12
+ 'Toggles & Selections (0.3)': [
13
+ 'select',
14
+ 'toggle-on',
15
+ 'toggle-off',
16
+ 'click',
17
+ 'cancel',
18
+ 'expand',
19
+ 'collapse',
20
+ 'menu-open',
21
+ 'copy',
22
+ ],
23
+ 'Drawers & Transitions (0.4)': ['drawer-open', 'drawer-close', 'submit'],
24
+ 'Significant Actions (0.5)': ['approve', 'reject', 'create', 'delete'],
25
+ 'Notifications (0.5)': [
26
+ 'notification-success',
27
+ 'notification-error',
28
+ 'notification-warning',
29
+ 'notification-info',
30
+ ],
31
+ };
32
+
33
+ /* ------------------------------------------------------------------ */
34
+ /* Single action button */
35
+ /* ------------------------------------------------------------------ */
36
+
37
+ function ActionSoundButton({ action }: { action: SoundAction }) {
38
+ const { play } = useSoundAction(action);
39
+ const [playing, setPlaying] = useState(false);
40
+ const entry = SOUND_ACTION_MAP[action];
41
+
42
+ const handleClick = () => {
43
+ play();
44
+ setPlaying(true);
45
+ setTimeout(() => setPlaying(false), 600);
46
+ };
47
+
48
+ return (
49
+ <Button
50
+ size="sm"
51
+ variant={playing ? 'default' : 'outline'}
52
+ onClick={handleClick}
53
+ className="min-w-[160px] font-mono text-xs"
54
+ >
55
+ {action}
56
+ <span className="text-muted-foreground ml-1 text-[10px]">
57
+ ({entry.sound} @ {entry.volume})
58
+ </span>
59
+ </Button>
60
+ );
61
+ }
62
+
63
+ /* ------------------------------------------------------------------ */
64
+ /* Full catalog */
65
+ /* ------------------------------------------------------------------ */
66
+
67
+ function SoundActionCatalog() {
68
+ return (
69
+ <div className="flex w-[640px] flex-col gap-6">
70
+ <div className="flex flex-col gap-1">
71
+ <h2 className="text-base font-semibold">Sound Action Map</h2>
72
+ <p className="text-muted-foreground text-sm">
73
+ {Object.keys(SOUND_ACTION_MAP).length} semantic actions mapped to sounds. Volume
74
+ hierarchy: navigation (0.2) → toggles (0.3) → drawers (0.4) → actions (0.5).
75
+ </p>
76
+ </div>
77
+
78
+ {Object.entries(ACTION_CATEGORIES).map(([category, actions]) => (
79
+ <div key={category} className="flex flex-col gap-2">
80
+ <h3 className="text-sm font-semibold">{category}</h3>
81
+ <div className="flex flex-wrap gap-2">
82
+ {actions.map((action) => (
83
+ <ActionSoundButton key={action} action={action} />
84
+ ))}
85
+ </div>
86
+ </div>
87
+ ))}
88
+ </div>
89
+ );
90
+ }
91
+
92
+ /* ------------------------------------------------------------------ */
93
+ /* Storybook meta */
94
+ /* ------------------------------------------------------------------ */
95
+
96
+ const meta: Meta = {
97
+ title: 'Hooks/useSoundAction',
98
+ parameters: { layout: 'centered' },
99
+ tags: ['autodocs'],
100
+ };
101
+
102
+ export default meta;
103
+ type Story = StoryObj;
104
+
105
+ export const Catalog: Story = {
106
+ render: () => <SoundActionCatalog />,
107
+ };
@@ -0,0 +1,53 @@
1
+ 'use client';
2
+
3
+ import { useSound, type SoundName } from './use-sound';
4
+ import type { UseSoundResult } from './use-sound';
5
+
6
+ /* ------------------------------------------------------------------ */
7
+ /* Sound Action Map — single source of truth for action → sound */
8
+ /* ------------------------------------------------------------------ */
9
+
10
+ /** Maps semantic UI actions to their sound name and volume. */
11
+ export const SOUND_ACTION_MAP = {
12
+ // Navigation (volume 0.2) — subtle taps for frequent interactions
13
+ navigate: { sound: 'tap_01', volume: 0.2 },
14
+ 'menu-item': { sound: 'tap_01', volume: 0.2 },
15
+
16
+ // Toggles & selections (volume 0.3) — moderate feedback
17
+ select: { sound: 'select', volume: 0.3 },
18
+ 'toggle-on': { sound: 'toggle_on', volume: 0.3 },
19
+ 'toggle-off': { sound: 'toggle_off', volume: 0.3 },
20
+ click: { sound: 'tap_01', volume: 0.3 },
21
+ cancel: { sound: 'transition_down', volume: 0.3 },
22
+ expand: { sound: 'swipe', volume: 0.3 },
23
+ collapse: { sound: 'swipe', volume: 0.3 },
24
+ 'menu-open': { sound: 'select', volume: 0.3 },
25
+ copy: { sound: 'select', volume: 0.3 },
26
+
27
+ // Drawers & transitions (volume 0.4) — noticeable transitions
28
+ 'drawer-open': { sound: 'transition_up', volume: 0.4 },
29
+ 'drawer-close': { sound: 'transition_down', volume: 0.4 },
30
+ submit: { sound: 'button', volume: 0.4 },
31
+
32
+ // Significant actions (volume 0.5) — prominent feedback
33
+ approve: { sound: 'celebration', volume: 0.5 },
34
+ reject: { sound: 'caution', volume: 0.5 },
35
+ create: { sound: 'transition_up', volume: 0.5 },
36
+ delete: { sound: 'transition_down', volume: 0.5 },
37
+ 'notification-success': { sound: 'celebration', volume: 0.5 },
38
+ 'notification-error': { sound: 'caution', volume: 0.5 },
39
+ 'notification-warning': { sound: 'notification', volume: 0.5 },
40
+ 'notification-info': { sound: 'button', volume: 0.5 },
41
+ } as const satisfies Record<string, { sound: SoundName; volume: number }>;
42
+
43
+ /** Union of all semantic action names available in the sound system. */
44
+ export type SoundAction = keyof typeof SOUND_ACTION_MAP;
45
+
46
+ /**
47
+ * Returns `{ play, stop, isPlaying }` for the given semantic action.
48
+ * Sound name and volume are resolved from `SOUND_ACTION_MAP`.
49
+ */
50
+ export function useSoundAction(action: SoundAction): UseSoundResult {
51
+ const { sound, volume } = SOUND_ACTION_MAP[action];
52
+ return useSound(sound, { volume });
53
+ }
@@ -15,7 +15,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
15
15
  const hostname = process.env.HOSTNAME || '0.0.0.0'
16
16
 
17
17
  let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
18
- const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.59.0","NEXT_PUBLIC_SHEP_PACKAGE_NAME":"@shepai/cli","NEXT_PUBLIC_SHEP_DESCRIPTION":"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":true,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/cli/cli","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"dynamicOnHover":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":false,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":false,"lockDistDir":true,"isolatedDevBuild":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":false,"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/runner/work/cli/cli"},"serverExternalPackages":["tsyringe","reflect-metadata","better-sqlite3","node:os","node:child_process","node:fs"],"distDirRoot":".next"}
18
+ const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.60.0","NEXT_PUBLIC_SHEP_PACKAGE_NAME":"@shepai/cli","NEXT_PUBLIC_SHEP_DESCRIPTION":"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":true,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/cli/cli","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"dynamicOnHover":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":false,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":false,"lockDistDir":true,"isolatedDevBuild":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":false,"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/runner/work/cli/cli"},"serverExternalPackages":["tsyringe","reflect-metadata","better-sqlite3","node:os","node:child_process","node:fs"],"distDirRoot":".next"}
19
19
 
20
20
  process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
21
21
 
@@ -1 +1 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,24270,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"warnOnce",{enumerable:!0,get:function(){return o}});let o=e=>{}},81975,83428,e=>{"use strict";var t=e.i(3645);let r=(0,t.default)("wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]]);e.s(["Wrench",()=>r],81975);let o=(0,t.default)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);e.s(["Loader2",()=>o],83428)},76314,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var o={assign:function(){return s},searchParamsToUrlQuery:function(){return i},urlQueryToSearchParams:function(){return l}};for(var n in o)Object.defineProperty(r,n,{enumerable:!0,get:o[n]});function i(e){let t={};for(let[r,o]of e.entries()){let e=t[r];void 0===e?t[r]=o:Array.isArray(e)?e.push(o):t[r]=[e,o]}return t}function a(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function l(e){let t=new URLSearchParams;for(let[r,o]of Object.entries(e))if(Array.isArray(o))for(let e of o)t.append(r,a(e));else t.set(r,a(o));return t}function s(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,o]of r.entries())e.append(t,o)}return e}},95889,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var o={formatUrl:function(){return l},formatWithValidation:function(){return u},urlObjectKeys:function(){return s}};for(var n in o)Object.defineProperty(r,n,{enumerable:!0,get:o[n]});let i=e.r(44066)._(e.r(76314)),a=/https?|ftp|gopher|file/;function l(e){let{auth:t,hostname:r}=e,o=e.protocol||"",n=e.pathname||"",l=e.hash||"",s=e.query||"",u=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?u=t+e.host:r&&(u=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(u+=":"+e.port)),s&&"object"==typeof s&&(s=String(i.urlQueryToSearchParams(s)));let c=e.search||s&&`?${s}`||"";return o&&!o.endsWith(":")&&(o+=":"),e.slashes||(!o||a.test(o))&&!1!==u?(u="//"+(u||""),n&&"/"!==n[0]&&(n="/"+n)):u||(u=""),l&&"#"!==l[0]&&(l="#"+l),c&&"?"!==c[0]&&(c="?"+c),n=n.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${o}${u}${n}${c}${l}`}let s=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function u(e){return l(e)}},80764,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return n}});let o=e.r(79054);function n(e,t){let r=(0,o.useRef)(null),n=(0,o.useRef)(null);return(0,o.useCallback)(o=>{if(null===o){let e=r.current;e&&(r.current=null,e());let t=n.current;t&&(n.current=null,t())}else e&&(r.current=i(e,o)),t&&(n.current=i(t,o))},[e,t])}function i(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},58464,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var o={DecodeError:function(){return b},MiddlewareNotFoundError:function(){return x},MissingStaticPage:function(){return y},NormalizeError:function(){return g},PageNotFoundError:function(){return w},SP:function(){return v},ST:function(){return m},WEB_VITALS:function(){return i},execOnce:function(){return a},getDisplayName:function(){return d},getLocationOrigin:function(){return u},getURL:function(){return c},isAbsoluteUrl:function(){return s},isResSent:function(){return f},loadGetInitialProps:function(){return h},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return S}};for(var n in o)Object.defineProperty(r,n,{enumerable:!0,get:o[n]});let i=["CLS","FCP","FID","INP","LCP","TTFB"];function a(e){let t,r=!1;return(...o)=>(r||(r=!0,t=e(...o)),t)}let l=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,s=e=>l.test(e);function u(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function c(){let{href:e}=window.location,t=u();return e.substring(t.length)}function d(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function h(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await h(t.Component,t.ctx)}:{};let o=await e.getInitialProps(t);if(r&&f(r))return o;if(!o)throw Object.defineProperty(Error(`"${d(e)}.getInitialProps()" should resolve to an object. But found "${o}" instead.`),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return o}let v="u">typeof performance,m=v&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class b extends Error{}class g extends Error{}class w extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class y extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class x extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function S(e){return JSON.stringify({message:e.message,stack:e.stack})}},51380,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return i}});let o=e.r(58464),n=e.r(53626);function i(e){if(!(0,o.isAbsoluteUrl)(e))return!0;try{let t=(0,o.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,n.hasBasePath)(r.pathname)}catch(e){return!1}}},38670,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return o}});let o=e=>{}},24035,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var o={default:function(){return b},useLinkStatus:function(){return w}};for(var n in o)Object.defineProperty(r,n,{enumerable:!0,get:o[n]});let i=e.r(44066),a=e.r(20314),l=i._(e.r(79054)),s=e.r(95889),u=e.r(18152),c=e.r(80764),d=e.r(58464),f=e.r(99267);e.r(24270);let p=e.r(59624),h=e.r(51380),v=e.r(95555);function m(e){return"string"==typeof e?e:(0,s.formatUrl)(e)}function b(t){var r;let o,n,i,[s,b]=(0,l.useOptimistic)(p.IDLE_LINK_STATUS),w=(0,l.useRef)(null),{href:y,as:x,children:S,prefetch:j=null,passHref:C,replace:E,shallow:P,scroll:T,onClick:N,onMouseEnter:R,onTouchStart:_,legacyBehavior:k=!1,onNavigate:A,ref:L,unstable_dynamicOnHover:O,...D}=t;o=S,k&&("string"==typeof o||"number"==typeof o)&&(o=(0,a.jsx)("a",{children:o}));let z=l.default.useContext(u.AppRouterContext),M=!1!==j,I=!1!==j?null===(r=j)||"auto"===r?v.FetchStrategy.PPR:v.FetchStrategy.Full:v.FetchStrategy.PPR,{href:U,as:H}=l.default.useMemo(()=>{let e=m(y);return{href:e,as:x?m(x):e}},[y,x]);if(k){if(o?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});n=l.default.Children.only(o)}let F=k?n&&"object"==typeof n&&n.ref:L,W=l.default.useCallback(e=>(null!==z&&(w.current=(0,p.mountLinkInstance)(e,U,z,I,M,b)),()=>{w.current&&((0,p.unmountLinkForCurrentNavigation)(w.current),w.current=null),(0,p.unmountPrefetchableInstance)(e)}),[M,U,z,I,b]),B={ref:(0,c.useMergedRef)(W,F),onClick(t){k||"function"!=typeof N||N(t),k&&n.props&&"function"==typeof n.props.onClick&&n.props.onClick(t),!z||t.defaultPrevented||function(t,r,o,n,i,a,s){if("u">typeof window){let u,{nodeName:c}=t.currentTarget;if("A"===c.toUpperCase()&&((u=t.currentTarget.getAttribute("target"))&&"_self"!==u||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,h.isLocalURL)(r)){i&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:d}=e.r(81574);l.default.startTransition(()=>{d(o||r,i?"replace":"push",a??!0,n.current)})}}(t,U,H,w,E,T,A)},onMouseEnter(e){k||"function"!=typeof R||R(e),k&&n.props&&"function"==typeof n.props.onMouseEnter&&n.props.onMouseEnter(e),z&&M&&(0,p.onNavigationIntent)(e.currentTarget,!0===O)},onTouchStart:function(e){k||"function"!=typeof _||_(e),k&&n.props&&"function"==typeof n.props.onTouchStart&&n.props.onTouchStart(e),z&&M&&(0,p.onNavigationIntent)(e.currentTarget,!0===O)}};return(0,d.isAbsoluteUrl)(H)?B.href=H:k&&!C&&("a"!==n.type||"href"in n.props)||(B.href=(0,f.addBasePath)(H)),i=k?l.default.cloneElement(n,B):(0,a.jsx)("a",{...D,...B,children:o}),(0,a.jsx)(g.Provider,{value:s,children:i})}e.r(38670);let g=(0,l.createContext)(p.IDLE_LINK_STATUS),w=()=>(0,l.useContext)(g);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},98127,e=>{"use strict";var t=e.i(20314),r=e.i(31777);function o({className:e,type:o,...n}){return(0,t.jsx)("input",{type:o,"data-slot":"input",className:(0,r.cn)("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",e),...n})}e.s(["Input",()=>o])},25235,e=>{"use strict";var t=e.i(20314),r=e.i(79054),o=e.i(87620),n="horizontal",i=["horizontal","vertical"],a=r.forwardRef((e,r)=>{var a;let{decorative:l,orientation:s=n,...u}=e,c=(a=s,i.includes(a))?s:n;return(0,t.jsx)(o.Primitive.div,{"data-orientation":c,...l?{role:"none"}:{"aria-orientation":"vertical"===c?c:void 0,role:"separator"},...u,ref:r})});a.displayName="Separator",e.s(["Root",()=>a,"Separator",()=>a],47402);var l=e.i(47402),l=l,s=e.i(31777);function u({className:e,orientation:r="horizontal",decorative:o=!0,...n}){return(0,t.jsx)(l.Root,{"data-slot":"separator",decorative:o,orientation:r,className:(0,s.cn)("bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",e),...n})}e.s(["Separator",()=>u],25235)},48249,e=>{"use strict";var t=e.i(90537);e.s(["XIcon",()=>t.default])},51240,e=>{"use strict";var t=e.i(20314),r=e.i(48249),o=e.i(90033),n=e.i(31777);function i({...e}){return(0,t.jsx)(o.Dialog.Root,{"data-slot":"sheet",...e})}function a({...e}){return(0,t.jsx)(o.Dialog.Portal,{"data-slot":"sheet-portal",...e})}function l({className:e,...r}){return(0,t.jsx)(o.Dialog.Overlay,{"data-slot":"sheet-overlay",className:(0,n.cn)("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...r})}function s({className:e,children:i,side:s="right",showCloseButton:u=!0,...c}){return(0,t.jsxs)(a,{children:[(0,t.jsx)(l,{}),(0,t.jsxs)(o.Dialog.Content,{"data-slot":"sheet-content",className:(0,n.cn)("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500","right"===s&&"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm","left"===s&&"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm","top"===s&&"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b","bottom"===s&&"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",e),...c,children:[i,u?(0,t.jsxs)(o.Dialog.Close,{className:"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none",children:[(0,t.jsx)(r.XIcon,{className:"size-4"}),(0,t.jsx)("span",{className:"sr-only",children:"Close"})]}):null]})]})}function u({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"sheet-header",className:(0,n.cn)("flex flex-col gap-1.5 p-4",e),...r})}function c({className:e,...r}){return(0,t.jsx)(o.Dialog.Title,{"data-slot":"sheet-title",className:(0,n.cn)("text-foreground font-semibold",e),...r})}function d({className:e,...r}){return(0,t.jsx)(o.Dialog.Description,{"data-slot":"sheet-description",className:(0,n.cn)("text-muted-foreground text-sm",e),...r})}e.s(["Sheet",()=>i,"SheetContent",()=>s,"SheetDescription",()=>d,"SheetHeader",()=>u,"SheetTitle",()=>c])},12103,e=>{"use strict";let t=(0,e.i(3645).default)("puzzle",[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]]);e.s(["Puzzle",()=>t],12103)},35340,e=>{"use strict";var t=e.i(20314),r=e.i(79054),o=e.i(87620),n=e.i(85995),i=e.i(22528),a=e.i(5978),l=e.i(29297),s=e.i(66033),u=e.i(5192),c=e.i(91967),d="ScrollArea",[f,p]=(0,i.createContextScope)(d),[h,v]=f(d),m=r.forwardRef((e,n)=>{let{__scopeScrollArea:i,type:l="hover",dir:u,scrollHideDelay:c=600,...d}=e,[f,p]=r.useState(null),[v,m]=r.useState(null),[b,g]=r.useState(null),[w,y]=r.useState(null),[x,S]=r.useState(null),[j,C]=r.useState(0),[E,P]=r.useState(0),[T,N]=r.useState(!1),[R,_]=r.useState(!1),k=(0,a.useComposedRefs)(n,e=>p(e)),A=(0,s.useDirection)(u);return(0,t.jsx)(h,{scope:i,type:l,dir:A,scrollHideDelay:c,scrollArea:f,viewport:v,onViewportChange:m,content:b,onContentChange:g,scrollbarX:w,onScrollbarXChange:y,scrollbarXEnabled:T,onScrollbarXEnabledChange:N,scrollbarY:x,onScrollbarYChange:S,scrollbarYEnabled:R,onScrollbarYEnabledChange:_,onCornerWidthChange:C,onCornerHeightChange:P,children:(0,t.jsx)(o.Primitive.div,{dir:A,...d,ref:k,style:{position:"relative","--radix-scroll-area-corner-width":j+"px","--radix-scroll-area-corner-height":E+"px",...e.style}})})});m.displayName=d;var b="ScrollAreaViewport",g=r.forwardRef((e,n)=>{let{__scopeScrollArea:i,children:l,nonce:s,...u}=e,c=v(b,i),d=r.useRef(null),f=(0,a.useComposedRefs)(n,d,c.onViewportChange);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:s}),(0,t.jsx)(o.Primitive.div,{"data-radix-scroll-area-viewport":"",...u,ref:f,style:{overflowX:c.scrollbarXEnabled?"scroll":"hidden",overflowY:c.scrollbarYEnabled?"scroll":"hidden",...e.style},children:(0,t.jsx)("div",{ref:c.onContentChange,style:{minWidth:"100%",display:"table"},children:l})})]})});g.displayName=b;var w="ScrollAreaScrollbar",y=r.forwardRef((e,o)=>{let{forceMount:n,...i}=e,a=v(w,e.__scopeScrollArea),{onScrollbarXEnabledChange:l,onScrollbarYEnabledChange:s}=a,u="horizontal"===e.orientation;return r.useEffect(()=>(u?l(!0):s(!0),()=>{u?l(!1):s(!1)}),[u,l,s]),"hover"===a.type?(0,t.jsx)(x,{...i,ref:o,forceMount:n}):"scroll"===a.type?(0,t.jsx)(S,{...i,ref:o,forceMount:n}):"auto"===a.type?(0,t.jsx)(j,{...i,ref:o,forceMount:n}):"always"===a.type?(0,t.jsx)(C,{...i,ref:o}):null});y.displayName=w;var x=r.forwardRef((e,o)=>{let{forceMount:i,...a}=e,l=v(w,e.__scopeScrollArea),[s,u]=r.useState(!1);return r.useEffect(()=>{let e=l.scrollArea,t=0;if(e){let r=()=>{window.clearTimeout(t),u(!0)},o=()=>{t=window.setTimeout(()=>u(!1),l.scrollHideDelay)};return e.addEventListener("pointerenter",r),e.addEventListener("pointerleave",o),()=>{window.clearTimeout(t),e.removeEventListener("pointerenter",r),e.removeEventListener("pointerleave",o)}}},[l.scrollArea,l.scrollHideDelay]),(0,t.jsx)(n.Presence,{present:i||s,children:(0,t.jsx)(j,{"data-state":s?"visible":"hidden",...a,ref:o})})}),S=r.forwardRef((e,o)=>{var i;let{forceMount:a,...l}=e,s=v(w,e.__scopeScrollArea),u="horizontal"===e.orientation,d=W(()=>p("SCROLL_END"),100),[f,p]=(i={hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}},r.useReducer((e,t)=>i[e][t]??e,"hidden"));return r.useEffect(()=>{if("idle"===f){let e=window.setTimeout(()=>p("HIDE"),s.scrollHideDelay);return()=>window.clearTimeout(e)}},[f,s.scrollHideDelay,p]),r.useEffect(()=>{let e=s.viewport,t=u?"scrollLeft":"scrollTop";if(e){let r=e[t],o=()=>{let o=e[t];r!==o&&(p("SCROLL"),d()),r=o};return e.addEventListener("scroll",o),()=>e.removeEventListener("scroll",o)}},[s.viewport,u,p,d]),(0,t.jsx)(n.Presence,{present:a||"hidden"!==f,children:(0,t.jsx)(C,{"data-state":"hidden"===f?"hidden":"visible",...l,ref:o,onPointerEnter:(0,c.composeEventHandlers)(e.onPointerEnter,()=>p("POINTER_ENTER")),onPointerLeave:(0,c.composeEventHandlers)(e.onPointerLeave,()=>p("POINTER_LEAVE"))})})}),j=r.forwardRef((e,o)=>{let i=v(w,e.__scopeScrollArea),{forceMount:a,...l}=e,[s,u]=r.useState(!1),c="horizontal"===e.orientation,d=W(()=>{if(i.viewport){let e=i.viewport.offsetWidth<i.viewport.scrollWidth,t=i.viewport.offsetHeight<i.viewport.scrollHeight;u(c?e:t)}},10);return B(i.viewport,d),B(i.content,d),(0,t.jsx)(n.Presence,{present:a||s,children:(0,t.jsx)(C,{"data-state":s?"visible":"hidden",...l,ref:o})})}),C=r.forwardRef((e,o)=>{let{orientation:n="vertical",...i}=e,a=v(w,e.__scopeScrollArea),l=r.useRef(null),s=r.useRef(0),[u,c]=r.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),d=M(u.viewport,u.content),f={...i,sizes:u,onSizesChange:c,hasThumb:!!(d>0&&d<1),onThumbChange:e=>l.current=e,onThumbPointerUp:()=>s.current=0,onThumbPointerDown:e=>s.current=e};function p(e,t){return function(e,t,r,o="ltr"){let n=I(r),i=t||n/2,a=r.scrollbar.paddingStart+i,l=r.scrollbar.size-r.scrollbar.paddingEnd-(n-i),s=r.content-r.viewport;return H([a,l],"ltr"===o?[0,s]:[-1*s,0])(e)}(e,s.current,u,t)}return"horizontal"===n?(0,t.jsx)(E,{...f,ref:o,onThumbPositionChange:()=>{if(a.viewport&&l.current){let e=U(a.viewport.scrollLeft,u,a.dir);l.current.style.transform=`translate3d(${e}px, 0, 0)`}},onWheelScroll:e=>{a.viewport&&(a.viewport.scrollLeft=e)},onDragScroll:e=>{a.viewport&&(a.viewport.scrollLeft=p(e,a.dir))}}):"vertical"===n?(0,t.jsx)(P,{...f,ref:o,onThumbPositionChange:()=>{if(a.viewport&&l.current){let e=U(a.viewport.scrollTop,u);l.current.style.transform=`translate3d(0, ${e}px, 0)`}},onWheelScroll:e=>{a.viewport&&(a.viewport.scrollTop=e)},onDragScroll:e=>{a.viewport&&(a.viewport.scrollTop=p(e))}}):null}),E=r.forwardRef((e,o)=>{let{sizes:n,onSizesChange:i,...l}=e,s=v(w,e.__scopeScrollArea),[u,c]=r.useState(),d=r.useRef(null),f=(0,a.useComposedRefs)(o,d,s.onScrollbarXChange);return r.useEffect(()=>{d.current&&c(getComputedStyle(d.current))},[d]),(0,t.jsx)(R,{"data-orientation":"horizontal",...l,ref:f,sizes:n,style:{bottom:0,left:"rtl"===s.dir?"var(--radix-scroll-area-corner-width)":0,right:"ltr"===s.dir?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":I(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.x),onDragScroll:t=>e.onDragScroll(t.x),onWheelScroll:(t,r)=>{if(s.viewport){var o,n;let i=s.viewport.scrollLeft+t.deltaX;e.onWheelScroll(i),o=i,n=r,o>0&&o<n&&t.preventDefault()}},onResize:()=>{d.current&&s.viewport&&u&&i({content:s.viewport.scrollWidth,viewport:s.viewport.offsetWidth,scrollbar:{size:d.current.clientWidth,paddingStart:z(u.paddingLeft),paddingEnd:z(u.paddingRight)}})}})}),P=r.forwardRef((e,o)=>{let{sizes:n,onSizesChange:i,...l}=e,s=v(w,e.__scopeScrollArea),[u,c]=r.useState(),d=r.useRef(null),f=(0,a.useComposedRefs)(o,d,s.onScrollbarYChange);return r.useEffect(()=>{d.current&&c(getComputedStyle(d.current))},[d]),(0,t.jsx)(R,{"data-orientation":"vertical",...l,ref:f,sizes:n,style:{top:0,right:"ltr"===s.dir?0:void 0,left:"rtl"===s.dir?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":I(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.y),onDragScroll:t=>e.onDragScroll(t.y),onWheelScroll:(t,r)=>{if(s.viewport){var o,n;let i=s.viewport.scrollTop+t.deltaY;e.onWheelScroll(i),o=i,n=r,o>0&&o<n&&t.preventDefault()}},onResize:()=>{d.current&&s.viewport&&u&&i({content:s.viewport.scrollHeight,viewport:s.viewport.offsetHeight,scrollbar:{size:d.current.clientHeight,paddingStart:z(u.paddingTop),paddingEnd:z(u.paddingBottom)}})}})}),[T,N]=f(w),R=r.forwardRef((e,n)=>{let{__scopeScrollArea:i,sizes:s,hasThumb:u,onThumbChange:d,onThumbPointerUp:f,onThumbPointerDown:p,onThumbPositionChange:h,onDragScroll:m,onWheelScroll:b,onResize:g,...y}=e,x=v(w,i),[S,j]=r.useState(null),C=(0,a.useComposedRefs)(n,e=>j(e)),E=r.useRef(null),P=r.useRef(""),N=x.viewport,R=s.content-s.viewport,_=(0,l.useCallbackRef)(b),k=(0,l.useCallbackRef)(h),A=W(g,10);function L(e){E.current&&m({x:e.clientX-E.current.left,y:e.clientY-E.current.top})}return r.useEffect(()=>{let e=e=>{let t=e.target;S?.contains(t)&&_(e,R)};return document.addEventListener("wheel",e,{passive:!1}),()=>document.removeEventListener("wheel",e,{passive:!1})},[N,S,R,_]),r.useEffect(k,[s,k]),B(S,A),B(x.content,A),(0,t.jsx)(T,{scope:i,scrollbar:S,hasThumb:u,onThumbChange:(0,l.useCallbackRef)(d),onThumbPointerUp:(0,l.useCallbackRef)(f),onThumbPositionChange:k,onThumbPointerDown:(0,l.useCallbackRef)(p),children:(0,t.jsx)(o.Primitive.div,{...y,ref:C,style:{position:"absolute",...y.style},onPointerDown:(0,c.composeEventHandlers)(e.onPointerDown,e=>{0===e.button&&(e.target.setPointerCapture(e.pointerId),E.current=S.getBoundingClientRect(),P.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",x.viewport&&(x.viewport.style.scrollBehavior="auto"),L(e))}),onPointerMove:(0,c.composeEventHandlers)(e.onPointerMove,L),onPointerUp:(0,c.composeEventHandlers)(e.onPointerUp,e=>{let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),document.body.style.webkitUserSelect=P.current,x.viewport&&(x.viewport.style.scrollBehavior=""),E.current=null})})})}),_="ScrollAreaThumb",k=r.forwardRef((e,r)=>{let{forceMount:o,...i}=e,a=N(_,e.__scopeScrollArea);return(0,t.jsx)(n.Presence,{present:o||a.hasThumb,children:(0,t.jsx)(A,{ref:r,...i})})}),A=r.forwardRef((e,n)=>{let{__scopeScrollArea:i,style:l,...s}=e,u=v(_,i),d=N(_,i),{onThumbPositionChange:f}=d,p=(0,a.useComposedRefs)(n,e=>d.onThumbChange(e)),h=r.useRef(void 0),m=W(()=>{h.current&&(h.current(),h.current=void 0)},100);return r.useEffect(()=>{let e=u.viewport;if(e){let t=()=>{m(),h.current||(h.current=F(e,f),f())};return f(),e.addEventListener("scroll",t),()=>e.removeEventListener("scroll",t)}},[u.viewport,m,f]),(0,t.jsx)(o.Primitive.div,{"data-state":d.hasThumb?"visible":"hidden",...s,ref:p,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...l},onPointerDownCapture:(0,c.composeEventHandlers)(e.onPointerDownCapture,e=>{let t=e.target.getBoundingClientRect(),r=e.clientX-t.left,o=e.clientY-t.top;d.onThumbPointerDown({x:r,y:o})}),onPointerUp:(0,c.composeEventHandlers)(e.onPointerUp,d.onThumbPointerUp)})});k.displayName=_;var L="ScrollAreaCorner",O=r.forwardRef((e,r)=>{let o=v(L,e.__scopeScrollArea),n=!!(o.scrollbarX&&o.scrollbarY);return"scroll"!==o.type&&n?(0,t.jsx)(D,{...e,ref:r}):null});O.displayName=L;var D=r.forwardRef((e,n)=>{let{__scopeScrollArea:i,...a}=e,l=v(L,i),[s,u]=r.useState(0),[c,d]=r.useState(0),f=!!(s&&c);return B(l.scrollbarX,()=>{let e=l.scrollbarX?.offsetHeight||0;l.onCornerHeightChange(e),d(e)}),B(l.scrollbarY,()=>{let e=l.scrollbarY?.offsetWidth||0;l.onCornerWidthChange(e),u(e)}),f?(0,t.jsx)(o.Primitive.div,{...a,ref:n,style:{width:s,height:c,position:"absolute",right:"ltr"===l.dir?0:void 0,left:"rtl"===l.dir?0:void 0,bottom:0,...e.style}}):null});function z(e){return e?parseInt(e,10):0}function M(e,t){let r=e/t;return isNaN(r)?0:r}function I(e){let t=M(e.viewport,e.content),r=e.scrollbar.paddingStart+e.scrollbar.paddingEnd;return Math.max((e.scrollbar.size-r)*t,18)}function U(e,t,r="ltr"){let o=I(t),n=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,i=t.scrollbar.size-n,a=t.content-t.viewport,l=function(e,[t,r]){return Math.min(r,Math.max(t,e))}(e,"ltr"===r?[0,a]:[-1*a,0]);return H([0,a],[0,i-o])(l)}function H(e,t){return r=>{if(e[0]===e[1]||t[0]===t[1])return t[0];let o=(t[1]-t[0])/(e[1]-e[0]);return t[0]+o*(r-e[0])}}var F=(e,t=()=>{})=>{let r={left:e.scrollLeft,top:e.scrollTop},o=0;return!function n(){let i={left:e.scrollLeft,top:e.scrollTop},a=r.left!==i.left,l=r.top!==i.top;(a||l)&&t(),r=i,o=window.requestAnimationFrame(n)}(),()=>window.cancelAnimationFrame(o)};function W(e,t){let o=(0,l.useCallbackRef)(e),n=r.useRef(0);return r.useEffect(()=>()=>window.clearTimeout(n.current),[]),r.useCallback(()=>{window.clearTimeout(n.current),n.current=window.setTimeout(o,t)},[o,t])}function B(e,t){let r=(0,l.useCallbackRef)(t);(0,u.useLayoutEffect)(()=>{let t=0;if(e){let o=new ResizeObserver(()=>{cancelAnimationFrame(t),t=window.requestAnimationFrame(r)});return o.observe(e),()=>{window.cancelAnimationFrame(t),o.unobserve(e)}}},[e,r])}e.s(["Corner",()=>O,"Root",()=>m,"ScrollArea",()=>m,"ScrollAreaCorner",()=>O,"ScrollAreaScrollbar",()=>y,"ScrollAreaThumb",()=>k,"ScrollAreaViewport",()=>g,"Scrollbar",()=>y,"Thumb",()=>k,"Viewport",()=>g,"createScrollAreaScope",()=>p],87516);var $=e.i(87516),$=$,X=e.i(31777);function V({className:e,children:r,...o}){return(0,t.jsxs)($.Root,{"data-slot":"scroll-area",className:(0,X.cn)("relative",e),...o,children:[(0,t.jsx)($.Viewport,{"data-slot":"scroll-area-viewport",className:"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",children:r}),(0,t.jsx)(Y,{}),(0,t.jsx)($.Corner,{})]})}function Y({className:e,orientation:r="vertical",...o}){return(0,t.jsx)($.ScrollAreaScrollbar,{"data-slot":"scroll-area-scrollbar",orientation:r,className:(0,X.cn)("flex touch-none p-px transition-colors select-none","vertical"===r&&"h-full w-2.5 border-l border-l-transparent","horizontal"===r&&"h-2.5 flex-col border-t border-t-transparent",e),...o,children:(0,t.jsx)($.ScrollAreaThumb,{"data-slot":"scroll-area-thumb",className:"bg-border relative flex-1 rounded-full"})})}e.s(["ScrollArea",()=>V],35340)},87292,e=>{"use strict";var t,r=e.i(20314),o=e.i(79054),n=e.i(57638),i=e.i(31406),a=e.i(3645);let l=(0,a.default)("house",[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{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",key:"r6nss1"}]]);var s=e.i(81975),u=e.i(12103),c=e.i(3214),d=e.i(35340);e.i(90491);var f=e.i(90798);e.i(85462);var p=e.i(26506);e.i(92233);var h=e.i(10025);e.i(8356);var v=e.i(71045);e.i(78788);var m=e.i(91495);e.i(72028);var b=e.i(41506),g=e.i(40327);let w={skills:"true"===(t=e.i(44172).default.env.NEXT_PUBLIC_FLAG_SKILLS)||"1"===t};function y({features:e,onNewFeature:t,onFeatureClick:a,onFeaturesFolderClick:y,onFeaturesMenuClick:x}){let S=(0,i.usePathname)(),{state:j}=(0,n.useSidebar)(),{mounted:C,visible:E}=function(e,t){let[r,n]=(0,o.useState)(!e),[i,a]=(0,o.useState)(!e);return(0,o.useEffect)(()=>{if(!e){n(!0);let e=requestAnimationFrame(()=>a(!0));return()=>cancelAnimationFrame(e)}a(!1);let t=window.setTimeout(()=>n(!1),200);return()=>window.clearTimeout(t)},[e,200]),{mounted:r,visible:i}}("collapsed"===j,0),P=g.featureStatusOrder.map(t=>{let{label:r}=g.featureStatusConfig[t],o=e.filter(e=>e.status===t);return{key:t,label:r,items:o}});return(0,r.jsxs)(n.Sidebar,{"data-testid":"app-sidebar",collapsible:"icon",children:[(0,r.jsx)(n.SidebarHeader,{children:(0,r.jsxs)(n.SidebarMenu,{children:[(0,r.jsx)(n.SidebarMenuItem,{children:(0,r.jsxs)("div",{className:"flex h-8 items-center group-data-[collapsible=icon]:justify-center",children:[C?(0,r.jsxs)("div",{className:["flex min-w-0 flex-1 items-center gap-2 overflow-hidden px-2 transition-opacity duration-200 ease-out",E?"opacity-100":"opacity-0"].join(" "),"aria-hidden":!E,children:[(0,r.jsx)(h.ShepLogo,{className:"shrink-0",size:20}),(0,r.jsx)("span",{className:"truncate text-sm font-semibold tracking-tight",children:"Shep"})]}):null,(0,r.jsx)(p.SidebarCollapseToggle,{className:"shrink-0 transition-all duration-200"})]})}),(0,r.jsx)(f.SidebarNavItem,{icon:l,label:"Control Center",href:"/",active:"/"===S}),(0,r.jsx)(f.SidebarNavItem,{icon:s.Wrench,label:"Tools",href:"/tools",active:"/tools"===S}),w.skills?(0,r.jsx)(f.SidebarNavItem,{icon:u.Puzzle,label:"Skills",href:"/skills",active:"/skills"===S}):null]})}),(0,r.jsx)(n.SidebarContent,{children:C?(0,r.jsxs)("div",{className:["min-w-0 overflow-hidden transition-opacity duration-200 ease-out [&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none",E?"opacity-100":"opacity-0"].join(" "),children:[(0,r.jsx)(b.SidebarSectionHeader,{label:"Features",onFolderClick:y,onMenuClick:x}),(0,r.jsx)(d.ScrollArea,{children:P.map(({key:e,label:t,items:o})=>o.length>0?(0,r.jsx)(m.FeatureStatusGroup,{label:t,count:o.length,children:o.map(e=>(0,r.jsx)(v.FeatureListItem,{name:e.name,status:e.status,startedAt:e.startedAt,duration:e.duration,onClick:a?()=>a(e.name):void 0},e.name))},e):null)})]}):null}),(0,r.jsx)(n.SidebarFooter,{children:(0,r.jsx)(n.SidebarMenu,{children:(0,r.jsx)(n.SidebarMenuItem,{children:(0,r.jsxs)(n.SidebarMenuButton,{onClick:t,tooltip:"New feature",children:[(0,r.jsx)(c.Plus,{}),(0,r.jsx)("span",{children:"New feature"})]})})})}),(0,r.jsx)(n.SidebarRail,{})]})}e.i(1354);var x=e.i(17845);e.i(53777);var S=e.i(25732);let j=(0,a.default)("volume-2",[["path",{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",key:"uqj9uw"}],["path",{d:"M16 9a5 5 0 0 1 0 6",key:"1q6k2b"}],["path",{d:"M19.364 18.364a9 9 0 0 0 0-12.728",key:"ijwkga"}]]),C=(0,a.default)("volume-off",[["path",{d:"M16 9a5 5 0 0 1 .95 2.293",key:"1fgyg8"}],["path",{d:"M19.364 5.636a9 9 0 0 1 1.889 9.96",key:"l3zxae"}],["path",{d:"m2 2 20 20",key:"1ooewy"}],["path",{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",key:"1gbwow"}],["path",{d:"M9.828 4.172A.686.686 0 0 1 11 4.657v.686",key:"s2je0y"}]]);var E=e.i(35364),P=e.i(73709);function T(){let{enabled:e,toggle:t}=(0,P.useSoundEnabled)();return(0,r.jsxs)(E.Button,{variant:"ghost",size:"icon",onClick:t,"aria-label":e?"Mute sounds":"Unmute sounds",children:[e?(0,r.jsx)(j,{className:"h-5 w-5"}):(0,r.jsx)(C,{className:"h-5 w-5"}),(0,r.jsx)("span",{className:"sr-only",children:"Toggle sound"})]})}var N=e.i(39443),R=e.i(60112),_=e.i(17406),k=e.i(17607);let A={[_.NotificationSeverity.Success]:"success",[_.NotificationSeverity.Error]:"error",[_.NotificationSeverity.Warning]:"warning",[_.NotificationSeverity.Info]:"info"},L={[_.NotificationSeverity.Success]:"celebration",[_.NotificationSeverity.Error]:"caution",[_.NotificationSeverity.Warning]:"notification",[_.NotificationSeverity.Info]:"button"};function O({children:e}){!function(){let{events:e}=(0,N.useAgentEventsContext)(),t=(0,k.useSound)("celebration",{volume:.5}),r=(0,k.useSound)("caution",{volume:.5}),n=(0,k.useSound)("notification",{volume:.5}),i=(0,k.useSound)("button",{volume:.5}),a=(0,o.useMemo)(()=>({celebration:t,caution:r,notification:n,button:i}),[t,r,n,i]),[l,s]=(0,o.useState)(()=>void 0===globalThis.Notification?"default":globalThis.Notification.permission),u=(0,o.useRef)(0);(0,o.useEffect)(()=>{if(e.length<=u.current)return;let t=e.slice(u.current);for(let r of(u.current=e.length,t)){if(r.severity!==_.NotificationSeverity.Error&&r.severity!==_.NotificationSeverity.Warning&&r.severity!==_.NotificationSeverity.Success)continue;!function(e){let t=A[e.severity]??"info",r=e.eventType===_.NotificationEventType.WaitingApproval;R.toast[t](e.featureName,{description:e.message,...r&&{action:{label:"Review",onClick:()=>{window.dispatchEvent(new CustomEvent("shep:select-feature",{detail:{featureId:e.featureId}}))}}}})}(r),globalThis.Notification?.permission==="granted"&&new Notification(`Shep: ${r.featureName}`,{body:r.message,icon:"/favicon-light.svg"});let e=L[r.severity];a[e]?.play()}},[e,a]),(0,o.useCallback)(async()=>{void 0===globalThis.Notification||s(await globalThis.Notification.requestPermission())},[])}();let t=(0,o.useCallback)(()=>{window.dispatchEvent(new CustomEvent("shep:open-create-drawer"))},[]),i=(0,o.useCallback)(e=>{window.dispatchEvent(new CustomEvent("shep:add-repository",{detail:{path:e}}))},[]);return(0,r.jsxs)(n.SidebarProvider,{children:[(0,r.jsx)(y,{features:[],onNewFeature:t}),(0,r.jsx)(n.SidebarInset,{children:(0,r.jsxs)("div",{className:"relative h-full",children:[(0,r.jsxs)("div",{className:"absolute top-3 right-3 z-50 flex gap-1",children:[(0,r.jsx)(x.AddRepositoryButton,{onSelect:i}),(0,r.jsx)(T,{}),(0,r.jsx)(S.ThemeToggle,{})]}),(0,r.jsx)("main",{className:"h-full",children:e})]})})]})}function D({children:e}){return(0,r.jsx)(N.AgentEventsProvider,{children:(0,r.jsx)(O,{children:e})})}e.s(["AppShell",()=>D],87292)},25251,e=>{"use strict";var t=e.i(20314),r=e.i(60112);let o=({...e})=>(0,t.jsx)(r.Toaster,{className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...e});e.s(["Toaster",()=>o])}]);
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,24270,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"warnOnce",{enumerable:!0,get:function(){return o}});let o=e=>{}},81975,83428,e=>{"use strict";var t=e.i(3645);let r=(0,t.default)("wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]]);e.s(["Wrench",()=>r],81975);let o=(0,t.default)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);e.s(["Loader2",()=>o],83428)},76314,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var o={assign:function(){return s},searchParamsToUrlQuery:function(){return i},urlQueryToSearchParams:function(){return l}};for(var n in o)Object.defineProperty(r,n,{enumerable:!0,get:o[n]});function i(e){let t={};for(let[r,o]of e.entries()){let e=t[r];void 0===e?t[r]=o:Array.isArray(e)?e.push(o):t[r]=[e,o]}return t}function a(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function l(e){let t=new URLSearchParams;for(let[r,o]of Object.entries(e))if(Array.isArray(o))for(let e of o)t.append(r,a(e));else t.set(r,a(o));return t}function s(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,o]of r.entries())e.append(t,o)}return e}},95889,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var o={formatUrl:function(){return l},formatWithValidation:function(){return c},urlObjectKeys:function(){return s}};for(var n in o)Object.defineProperty(r,n,{enumerable:!0,get:o[n]});let i=e.r(44066)._(e.r(76314)),a=/https?|ftp|gopher|file/;function l(e){let{auth:t,hostname:r}=e,o=e.protocol||"",n=e.pathname||"",l=e.hash||"",s=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),s&&"object"==typeof s&&(s=String(i.urlQueryToSearchParams(s)));let u=e.search||s&&`?${s}`||"";return o&&!o.endsWith(":")&&(o+=":"),e.slashes||(!o||a.test(o))&&!1!==c?(c="//"+(c||""),n&&"/"!==n[0]&&(n="/"+n)):c||(c=""),l&&"#"!==l[0]&&(l="#"+l),u&&"?"!==u[0]&&(u="?"+u),n=n.replace(/[?#]/g,encodeURIComponent),u=u.replace("#","%23"),`${o}${c}${n}${u}${l}`}let s=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return l(e)}},80764,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return n}});let o=e.r(79054);function n(e,t){let r=(0,o.useRef)(null),n=(0,o.useRef)(null);return(0,o.useCallback)(o=>{if(null===o){let e=r.current;e&&(r.current=null,e());let t=n.current;t&&(n.current=null,t())}else e&&(r.current=i(e,o)),t&&(n.current=i(t,o))},[e,t])}function i(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},58464,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var o={DecodeError:function(){return g},MiddlewareNotFoundError:function(){return x},MissingStaticPage:function(){return y},NormalizeError:function(){return b},PageNotFoundError:function(){return w},SP:function(){return v},ST:function(){return m},WEB_VITALS:function(){return i},execOnce:function(){return a},getDisplayName:function(){return d},getLocationOrigin:function(){return c},getURL:function(){return u},isAbsoluteUrl:function(){return s},isResSent:function(){return f},loadGetInitialProps:function(){return h},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return S}};for(var n in o)Object.defineProperty(r,n,{enumerable:!0,get:o[n]});let i=["CLS","FCP","FID","INP","LCP","TTFB"];function a(e){let t,r=!1;return(...o)=>(r||(r=!0,t=e(...o)),t)}let l=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,s=e=>l.test(e);function c(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function u(){let{href:e}=window.location,t=c();return e.substring(t.length)}function d(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function h(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await h(t.Component,t.ctx)}:{};let o=await e.getInitialProps(t);if(r&&f(r))return o;if(!o)throw Object.defineProperty(Error(`"${d(e)}.getInitialProps()" should resolve to an object. But found "${o}" instead.`),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return o}let v="u">typeof performance,m=v&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class g extends Error{}class b extends Error{}class w extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class y extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class x extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function S(e){return JSON.stringify({message:e.message,stack:e.stack})}},51380,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return i}});let o=e.r(58464),n=e.r(53626);function i(e){if(!(0,o.isAbsoluteUrl)(e))return!0;try{let t=(0,o.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,n.hasBasePath)(r.pathname)}catch(e){return!1}}},38670,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return o}});let o=e=>{}},24035,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var o={default:function(){return g},useLinkStatus:function(){return w}};for(var n in o)Object.defineProperty(r,n,{enumerable:!0,get:o[n]});let i=e.r(44066),a=e.r(20314),l=i._(e.r(79054)),s=e.r(95889),c=e.r(18152),u=e.r(80764),d=e.r(58464),f=e.r(99267);e.r(24270);let p=e.r(59624),h=e.r(51380),v=e.r(95555);function m(e){return"string"==typeof e?e:(0,s.formatUrl)(e)}function g(t){var r;let o,n,i,[s,g]=(0,l.useOptimistic)(p.IDLE_LINK_STATUS),w=(0,l.useRef)(null),{href:y,as:x,children:S,prefetch:j=null,passHref:C,replace:E,shallow:P,scroll:T,onClick:N,onMouseEnter:R,onTouchStart:_,legacyBehavior:A=!1,onNavigate:k,ref:L,unstable_dynamicOnHover:O,...D}=t;o=S,A&&("string"==typeof o||"number"==typeof o)&&(o=(0,a.jsx)("a",{children:o}));let z=l.default.useContext(c.AppRouterContext),M=!1!==j,I=!1!==j?null===(r=j)||"auto"===r?v.FetchStrategy.PPR:v.FetchStrategy.Full:v.FetchStrategy.PPR,{href:U,as:H}=l.default.useMemo(()=>{let e=m(y);return{href:e,as:x?m(x):e}},[y,x]);if(A){if(o?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});n=l.default.Children.only(o)}let F=A?n&&"object"==typeof n&&n.ref:L,W=l.default.useCallback(e=>(null!==z&&(w.current=(0,p.mountLinkInstance)(e,U,z,I,M,g)),()=>{w.current&&((0,p.unmountLinkForCurrentNavigation)(w.current),w.current=null),(0,p.unmountPrefetchableInstance)(e)}),[M,U,z,I,g]),B={ref:(0,u.useMergedRef)(W,F),onClick(t){A||"function"!=typeof N||N(t),A&&n.props&&"function"==typeof n.props.onClick&&n.props.onClick(t),!z||t.defaultPrevented||function(t,r,o,n,i,a,s){if("u">typeof window){let c,{nodeName:u}=t.currentTarget;if("A"===u.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,h.isLocalURL)(r)){i&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:d}=e.r(81574);l.default.startTransition(()=>{d(o||r,i?"replace":"push",a??!0,n.current)})}}(t,U,H,w,E,T,k)},onMouseEnter(e){A||"function"!=typeof R||R(e),A&&n.props&&"function"==typeof n.props.onMouseEnter&&n.props.onMouseEnter(e),z&&M&&(0,p.onNavigationIntent)(e.currentTarget,!0===O)},onTouchStart:function(e){A||"function"!=typeof _||_(e),A&&n.props&&"function"==typeof n.props.onTouchStart&&n.props.onTouchStart(e),z&&M&&(0,p.onNavigationIntent)(e.currentTarget,!0===O)}};return(0,d.isAbsoluteUrl)(H)?B.href=H:A&&!C&&("a"!==n.type||"href"in n.props)||(B.href=(0,f.addBasePath)(H)),i=A?l.default.cloneElement(n,B):(0,a.jsx)("a",{...D,...B,children:o}),(0,a.jsx)(b.Provider,{value:s,children:i})}e.r(38670);let b=(0,l.createContext)(p.IDLE_LINK_STATUS),w=()=>(0,l.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},98127,e=>{"use strict";var t=e.i(20314),r=e.i(31777);function o({className:e,type:o,...n}){return(0,t.jsx)("input",{type:o,"data-slot":"input",className:(0,r.cn)("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",e),...n})}e.s(["Input",()=>o])},25235,e=>{"use strict";var t=e.i(20314),r=e.i(79054),o=e.i(87620),n="horizontal",i=["horizontal","vertical"],a=r.forwardRef((e,r)=>{var a;let{decorative:l,orientation:s=n,...c}=e,u=(a=s,i.includes(a))?s:n;return(0,t.jsx)(o.Primitive.div,{"data-orientation":u,...l?{role:"none"}:{"aria-orientation":"vertical"===u?u:void 0,role:"separator"},...c,ref:r})});a.displayName="Separator",e.s(["Root",()=>a,"Separator",()=>a],47402);var l=e.i(47402),l=l,s=e.i(31777);function c({className:e,orientation:r="horizontal",decorative:o=!0,...n}){return(0,t.jsx)(l.Root,{"data-slot":"separator",decorative:o,orientation:r,className:(0,s.cn)("bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",e),...n})}e.s(["Separator",()=>c],25235)},48249,e=>{"use strict";var t=e.i(90537);e.s(["XIcon",()=>t.default])},51240,e=>{"use strict";var t=e.i(20314),r=e.i(48249),o=e.i(90033),n=e.i(31777);function i({...e}){return(0,t.jsx)(o.Dialog.Root,{"data-slot":"sheet",...e})}function a({...e}){return(0,t.jsx)(o.Dialog.Portal,{"data-slot":"sheet-portal",...e})}function l({className:e,...r}){return(0,t.jsx)(o.Dialog.Overlay,{"data-slot":"sheet-overlay",className:(0,n.cn)("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...r})}function s({className:e,children:i,side:s="right",showCloseButton:c=!0,...u}){return(0,t.jsxs)(a,{children:[(0,t.jsx)(l,{}),(0,t.jsxs)(o.Dialog.Content,{"data-slot":"sheet-content",className:(0,n.cn)("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500","right"===s&&"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm","left"===s&&"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm","top"===s&&"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b","bottom"===s&&"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",e),...u,children:[i,c?(0,t.jsxs)(o.Dialog.Close,{className:"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none",children:[(0,t.jsx)(r.XIcon,{className:"size-4"}),(0,t.jsx)("span",{className:"sr-only",children:"Close"})]}):null]})]})}function c({className:e,...r}){return(0,t.jsx)("div",{"data-slot":"sheet-header",className:(0,n.cn)("flex flex-col gap-1.5 p-4",e),...r})}function u({className:e,...r}){return(0,t.jsx)(o.Dialog.Title,{"data-slot":"sheet-title",className:(0,n.cn)("text-foreground font-semibold",e),...r})}function d({className:e,...r}){return(0,t.jsx)(o.Dialog.Description,{"data-slot":"sheet-description",className:(0,n.cn)("text-muted-foreground text-sm",e),...r})}e.s(["Sheet",()=>i,"SheetContent",()=>s,"SheetDescription",()=>d,"SheetHeader",()=>c,"SheetTitle",()=>u])},12103,e=>{"use strict";let t=(0,e.i(3645).default)("puzzle",[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]]);e.s(["Puzzle",()=>t],12103)},35340,e=>{"use strict";var t=e.i(20314),r=e.i(79054),o=e.i(87620),n=e.i(85995),i=e.i(22528),a=e.i(5978),l=e.i(29297),s=e.i(66033),c=e.i(5192),u=e.i(91967),d="ScrollArea",[f,p]=(0,i.createContextScope)(d),[h,v]=f(d),m=r.forwardRef((e,n)=>{let{__scopeScrollArea:i,type:l="hover",dir:c,scrollHideDelay:u=600,...d}=e,[f,p]=r.useState(null),[v,m]=r.useState(null),[g,b]=r.useState(null),[w,y]=r.useState(null),[x,S]=r.useState(null),[j,C]=r.useState(0),[E,P]=r.useState(0),[T,N]=r.useState(!1),[R,_]=r.useState(!1),A=(0,a.useComposedRefs)(n,e=>p(e)),k=(0,s.useDirection)(c);return(0,t.jsx)(h,{scope:i,type:l,dir:k,scrollHideDelay:u,scrollArea:f,viewport:v,onViewportChange:m,content:g,onContentChange:b,scrollbarX:w,onScrollbarXChange:y,scrollbarXEnabled:T,onScrollbarXEnabledChange:N,scrollbarY:x,onScrollbarYChange:S,scrollbarYEnabled:R,onScrollbarYEnabledChange:_,onCornerWidthChange:C,onCornerHeightChange:P,children:(0,t.jsx)(o.Primitive.div,{dir:k,...d,ref:A,style:{position:"relative","--radix-scroll-area-corner-width":j+"px","--radix-scroll-area-corner-height":E+"px",...e.style}})})});m.displayName=d;var g="ScrollAreaViewport",b=r.forwardRef((e,n)=>{let{__scopeScrollArea:i,children:l,nonce:s,...c}=e,u=v(g,i),d=r.useRef(null),f=(0,a.useComposedRefs)(n,d,u.onViewportChange);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:s}),(0,t.jsx)(o.Primitive.div,{"data-radix-scroll-area-viewport":"",...c,ref:f,style:{overflowX:u.scrollbarXEnabled?"scroll":"hidden",overflowY:u.scrollbarYEnabled?"scroll":"hidden",...e.style},children:(0,t.jsx)("div",{ref:u.onContentChange,style:{minWidth:"100%",display:"table"},children:l})})]})});b.displayName=g;var w="ScrollAreaScrollbar",y=r.forwardRef((e,o)=>{let{forceMount:n,...i}=e,a=v(w,e.__scopeScrollArea),{onScrollbarXEnabledChange:l,onScrollbarYEnabledChange:s}=a,c="horizontal"===e.orientation;return r.useEffect(()=>(c?l(!0):s(!0),()=>{c?l(!1):s(!1)}),[c,l,s]),"hover"===a.type?(0,t.jsx)(x,{...i,ref:o,forceMount:n}):"scroll"===a.type?(0,t.jsx)(S,{...i,ref:o,forceMount:n}):"auto"===a.type?(0,t.jsx)(j,{...i,ref:o,forceMount:n}):"always"===a.type?(0,t.jsx)(C,{...i,ref:o}):null});y.displayName=w;var x=r.forwardRef((e,o)=>{let{forceMount:i,...a}=e,l=v(w,e.__scopeScrollArea),[s,c]=r.useState(!1);return r.useEffect(()=>{let e=l.scrollArea,t=0;if(e){let r=()=>{window.clearTimeout(t),c(!0)},o=()=>{t=window.setTimeout(()=>c(!1),l.scrollHideDelay)};return e.addEventListener("pointerenter",r),e.addEventListener("pointerleave",o),()=>{window.clearTimeout(t),e.removeEventListener("pointerenter",r),e.removeEventListener("pointerleave",o)}}},[l.scrollArea,l.scrollHideDelay]),(0,t.jsx)(n.Presence,{present:i||s,children:(0,t.jsx)(j,{"data-state":s?"visible":"hidden",...a,ref:o})})}),S=r.forwardRef((e,o)=>{var i;let{forceMount:a,...l}=e,s=v(w,e.__scopeScrollArea),c="horizontal"===e.orientation,d=W(()=>p("SCROLL_END"),100),[f,p]=(i={hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}},r.useReducer((e,t)=>i[e][t]??e,"hidden"));return r.useEffect(()=>{if("idle"===f){let e=window.setTimeout(()=>p("HIDE"),s.scrollHideDelay);return()=>window.clearTimeout(e)}},[f,s.scrollHideDelay,p]),r.useEffect(()=>{let e=s.viewport,t=c?"scrollLeft":"scrollTop";if(e){let r=e[t],o=()=>{let o=e[t];r!==o&&(p("SCROLL"),d()),r=o};return e.addEventListener("scroll",o),()=>e.removeEventListener("scroll",o)}},[s.viewport,c,p,d]),(0,t.jsx)(n.Presence,{present:a||"hidden"!==f,children:(0,t.jsx)(C,{"data-state":"hidden"===f?"hidden":"visible",...l,ref:o,onPointerEnter:(0,u.composeEventHandlers)(e.onPointerEnter,()=>p("POINTER_ENTER")),onPointerLeave:(0,u.composeEventHandlers)(e.onPointerLeave,()=>p("POINTER_LEAVE"))})})}),j=r.forwardRef((e,o)=>{let i=v(w,e.__scopeScrollArea),{forceMount:a,...l}=e,[s,c]=r.useState(!1),u="horizontal"===e.orientation,d=W(()=>{if(i.viewport){let e=i.viewport.offsetWidth<i.viewport.scrollWidth,t=i.viewport.offsetHeight<i.viewport.scrollHeight;c(u?e:t)}},10);return B(i.viewport,d),B(i.content,d),(0,t.jsx)(n.Presence,{present:a||s,children:(0,t.jsx)(C,{"data-state":s?"visible":"hidden",...l,ref:o})})}),C=r.forwardRef((e,o)=>{let{orientation:n="vertical",...i}=e,a=v(w,e.__scopeScrollArea),l=r.useRef(null),s=r.useRef(0),[c,u]=r.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),d=M(c.viewport,c.content),f={...i,sizes:c,onSizesChange:u,hasThumb:!!(d>0&&d<1),onThumbChange:e=>l.current=e,onThumbPointerUp:()=>s.current=0,onThumbPointerDown:e=>s.current=e};function p(e,t){return function(e,t,r,o="ltr"){let n=I(r),i=t||n/2,a=r.scrollbar.paddingStart+i,l=r.scrollbar.size-r.scrollbar.paddingEnd-(n-i),s=r.content-r.viewport;return H([a,l],"ltr"===o?[0,s]:[-1*s,0])(e)}(e,s.current,c,t)}return"horizontal"===n?(0,t.jsx)(E,{...f,ref:o,onThumbPositionChange:()=>{if(a.viewport&&l.current){let e=U(a.viewport.scrollLeft,c,a.dir);l.current.style.transform=`translate3d(${e}px, 0, 0)`}},onWheelScroll:e=>{a.viewport&&(a.viewport.scrollLeft=e)},onDragScroll:e=>{a.viewport&&(a.viewport.scrollLeft=p(e,a.dir))}}):"vertical"===n?(0,t.jsx)(P,{...f,ref:o,onThumbPositionChange:()=>{if(a.viewport&&l.current){let e=U(a.viewport.scrollTop,c);l.current.style.transform=`translate3d(0, ${e}px, 0)`}},onWheelScroll:e=>{a.viewport&&(a.viewport.scrollTop=e)},onDragScroll:e=>{a.viewport&&(a.viewport.scrollTop=p(e))}}):null}),E=r.forwardRef((e,o)=>{let{sizes:n,onSizesChange:i,...l}=e,s=v(w,e.__scopeScrollArea),[c,u]=r.useState(),d=r.useRef(null),f=(0,a.useComposedRefs)(o,d,s.onScrollbarXChange);return r.useEffect(()=>{d.current&&u(getComputedStyle(d.current))},[d]),(0,t.jsx)(R,{"data-orientation":"horizontal",...l,ref:f,sizes:n,style:{bottom:0,left:"rtl"===s.dir?"var(--radix-scroll-area-corner-width)":0,right:"ltr"===s.dir?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":I(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.x),onDragScroll:t=>e.onDragScroll(t.x),onWheelScroll:(t,r)=>{if(s.viewport){var o,n;let i=s.viewport.scrollLeft+t.deltaX;e.onWheelScroll(i),o=i,n=r,o>0&&o<n&&t.preventDefault()}},onResize:()=>{d.current&&s.viewport&&c&&i({content:s.viewport.scrollWidth,viewport:s.viewport.offsetWidth,scrollbar:{size:d.current.clientWidth,paddingStart:z(c.paddingLeft),paddingEnd:z(c.paddingRight)}})}})}),P=r.forwardRef((e,o)=>{let{sizes:n,onSizesChange:i,...l}=e,s=v(w,e.__scopeScrollArea),[c,u]=r.useState(),d=r.useRef(null),f=(0,a.useComposedRefs)(o,d,s.onScrollbarYChange);return r.useEffect(()=>{d.current&&u(getComputedStyle(d.current))},[d]),(0,t.jsx)(R,{"data-orientation":"vertical",...l,ref:f,sizes:n,style:{top:0,right:"ltr"===s.dir?0:void 0,left:"rtl"===s.dir?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":I(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.y),onDragScroll:t=>e.onDragScroll(t.y),onWheelScroll:(t,r)=>{if(s.viewport){var o,n;let i=s.viewport.scrollTop+t.deltaY;e.onWheelScroll(i),o=i,n=r,o>0&&o<n&&t.preventDefault()}},onResize:()=>{d.current&&s.viewport&&c&&i({content:s.viewport.scrollHeight,viewport:s.viewport.offsetHeight,scrollbar:{size:d.current.clientHeight,paddingStart:z(c.paddingTop),paddingEnd:z(c.paddingBottom)}})}})}),[T,N]=f(w),R=r.forwardRef((e,n)=>{let{__scopeScrollArea:i,sizes:s,hasThumb:c,onThumbChange:d,onThumbPointerUp:f,onThumbPointerDown:p,onThumbPositionChange:h,onDragScroll:m,onWheelScroll:g,onResize:b,...y}=e,x=v(w,i),[S,j]=r.useState(null),C=(0,a.useComposedRefs)(n,e=>j(e)),E=r.useRef(null),P=r.useRef(""),N=x.viewport,R=s.content-s.viewport,_=(0,l.useCallbackRef)(g),A=(0,l.useCallbackRef)(h),k=W(b,10);function L(e){E.current&&m({x:e.clientX-E.current.left,y:e.clientY-E.current.top})}return r.useEffect(()=>{let e=e=>{let t=e.target;S?.contains(t)&&_(e,R)};return document.addEventListener("wheel",e,{passive:!1}),()=>document.removeEventListener("wheel",e,{passive:!1})},[N,S,R,_]),r.useEffect(A,[s,A]),B(S,k),B(x.content,k),(0,t.jsx)(T,{scope:i,scrollbar:S,hasThumb:c,onThumbChange:(0,l.useCallbackRef)(d),onThumbPointerUp:(0,l.useCallbackRef)(f),onThumbPositionChange:A,onThumbPointerDown:(0,l.useCallbackRef)(p),children:(0,t.jsx)(o.Primitive.div,{...y,ref:C,style:{position:"absolute",...y.style},onPointerDown:(0,u.composeEventHandlers)(e.onPointerDown,e=>{0===e.button&&(e.target.setPointerCapture(e.pointerId),E.current=S.getBoundingClientRect(),P.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",x.viewport&&(x.viewport.style.scrollBehavior="auto"),L(e))}),onPointerMove:(0,u.composeEventHandlers)(e.onPointerMove,L),onPointerUp:(0,u.composeEventHandlers)(e.onPointerUp,e=>{let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),document.body.style.webkitUserSelect=P.current,x.viewport&&(x.viewport.style.scrollBehavior=""),E.current=null})})})}),_="ScrollAreaThumb",A=r.forwardRef((e,r)=>{let{forceMount:o,...i}=e,a=N(_,e.__scopeScrollArea);return(0,t.jsx)(n.Presence,{present:o||a.hasThumb,children:(0,t.jsx)(k,{ref:r,...i})})}),k=r.forwardRef((e,n)=>{let{__scopeScrollArea:i,style:l,...s}=e,c=v(_,i),d=N(_,i),{onThumbPositionChange:f}=d,p=(0,a.useComposedRefs)(n,e=>d.onThumbChange(e)),h=r.useRef(void 0),m=W(()=>{h.current&&(h.current(),h.current=void 0)},100);return r.useEffect(()=>{let e=c.viewport;if(e){let t=()=>{m(),h.current||(h.current=F(e,f),f())};return f(),e.addEventListener("scroll",t),()=>e.removeEventListener("scroll",t)}},[c.viewport,m,f]),(0,t.jsx)(o.Primitive.div,{"data-state":d.hasThumb?"visible":"hidden",...s,ref:p,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...l},onPointerDownCapture:(0,u.composeEventHandlers)(e.onPointerDownCapture,e=>{let t=e.target.getBoundingClientRect(),r=e.clientX-t.left,o=e.clientY-t.top;d.onThumbPointerDown({x:r,y:o})}),onPointerUp:(0,u.composeEventHandlers)(e.onPointerUp,d.onThumbPointerUp)})});A.displayName=_;var L="ScrollAreaCorner",O=r.forwardRef((e,r)=>{let o=v(L,e.__scopeScrollArea),n=!!(o.scrollbarX&&o.scrollbarY);return"scroll"!==o.type&&n?(0,t.jsx)(D,{...e,ref:r}):null});O.displayName=L;var D=r.forwardRef((e,n)=>{let{__scopeScrollArea:i,...a}=e,l=v(L,i),[s,c]=r.useState(0),[u,d]=r.useState(0),f=!!(s&&u);return B(l.scrollbarX,()=>{let e=l.scrollbarX?.offsetHeight||0;l.onCornerHeightChange(e),d(e)}),B(l.scrollbarY,()=>{let e=l.scrollbarY?.offsetWidth||0;l.onCornerWidthChange(e),c(e)}),f?(0,t.jsx)(o.Primitive.div,{...a,ref:n,style:{width:s,height:u,position:"absolute",right:"ltr"===l.dir?0:void 0,left:"rtl"===l.dir?0:void 0,bottom:0,...e.style}}):null});function z(e){return e?parseInt(e,10):0}function M(e,t){let r=e/t;return isNaN(r)?0:r}function I(e){let t=M(e.viewport,e.content),r=e.scrollbar.paddingStart+e.scrollbar.paddingEnd;return Math.max((e.scrollbar.size-r)*t,18)}function U(e,t,r="ltr"){let o=I(t),n=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,i=t.scrollbar.size-n,a=t.content-t.viewport,l=function(e,[t,r]){return Math.min(r,Math.max(t,e))}(e,"ltr"===r?[0,a]:[-1*a,0]);return H([0,a],[0,i-o])(l)}function H(e,t){return r=>{if(e[0]===e[1]||t[0]===t[1])return t[0];let o=(t[1]-t[0])/(e[1]-e[0]);return t[0]+o*(r-e[0])}}var F=(e,t=()=>{})=>{let r={left:e.scrollLeft,top:e.scrollTop},o=0;return!function n(){let i={left:e.scrollLeft,top:e.scrollTop},a=r.left!==i.left,l=r.top!==i.top;(a||l)&&t(),r=i,o=window.requestAnimationFrame(n)}(),()=>window.cancelAnimationFrame(o)};function W(e,t){let o=(0,l.useCallbackRef)(e),n=r.useRef(0);return r.useEffect(()=>()=>window.clearTimeout(n.current),[]),r.useCallback(()=>{window.clearTimeout(n.current),n.current=window.setTimeout(o,t)},[o,t])}function B(e,t){let r=(0,l.useCallbackRef)(t);(0,c.useLayoutEffect)(()=>{let t=0;if(e){let o=new ResizeObserver(()=>{cancelAnimationFrame(t),t=window.requestAnimationFrame(r)});return o.observe(e),()=>{window.cancelAnimationFrame(t),o.unobserve(e)}}},[e,r])}e.s(["Corner",()=>O,"Root",()=>m,"ScrollArea",()=>m,"ScrollAreaCorner",()=>O,"ScrollAreaScrollbar",()=>y,"ScrollAreaThumb",()=>A,"ScrollAreaViewport",()=>b,"Scrollbar",()=>y,"Thumb",()=>A,"Viewport",()=>b,"createScrollAreaScope",()=>p],87516);var $=e.i(87516),$=$,X=e.i(31777);function V({className:e,children:r,...o}){return(0,t.jsxs)($.Root,{"data-slot":"scroll-area",className:(0,X.cn)("relative",e),...o,children:[(0,t.jsx)($.Viewport,{"data-slot":"scroll-area-viewport",className:"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",children:r}),(0,t.jsx)(Y,{}),(0,t.jsx)($.Corner,{})]})}function Y({className:e,orientation:r="vertical",...o}){return(0,t.jsx)($.ScrollAreaScrollbar,{"data-slot":"scroll-area-scrollbar",orientation:r,className:(0,X.cn)("flex touch-none p-px transition-colors select-none","vertical"===r&&"h-full w-2.5 border-l border-l-transparent","horizontal"===r&&"h-2.5 flex-col border-t border-t-transparent",e),...o,children:(0,t.jsx)($.ScrollAreaThumb,{"data-slot":"scroll-area-thumb",className:"bg-border relative flex-1 rounded-full"})})}e.s(["ScrollArea",()=>V],35340)},87292,e=>{"use strict";var t,r=e.i(20314),o=e.i(79054),n=e.i(57638),i=e.i(31406),a=e.i(3645);let l=(0,a.default)("house",[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{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",key:"r6nss1"}]]);var s=e.i(81975),c=e.i(12103),u=e.i(3214),d=e.i(35340);e.i(90491);var f=e.i(90798);e.i(85462);var p=e.i(26506);e.i(92233);var h=e.i(10025);e.i(8356);var v=e.i(71045);e.i(78788);var m=e.i(91495);e.i(72028);var g=e.i(41506),b=e.i(40327);let w={skills:"true"===(t=e.i(44172).default.env.NEXT_PUBLIC_FLAG_SKILLS)||"1"===t};function y({features:e,onNewFeature:t,onFeatureClick:a,onFeaturesFolderClick:y,onFeaturesMenuClick:x}){let S=(0,i.usePathname)(),{state:j}=(0,n.useSidebar)(),{mounted:C,visible:E}=function(e,t){let[r,n]=(0,o.useState)(!e),[i,a]=(0,o.useState)(!e);return(0,o.useEffect)(()=>{if(!e){n(!0);let e=requestAnimationFrame(()=>a(!0));return()=>cancelAnimationFrame(e)}a(!1);let t=window.setTimeout(()=>n(!1),200);return()=>window.clearTimeout(t)},[e,200]),{mounted:r,visible:i}}("collapsed"===j,0),P=b.featureStatusOrder.map(t=>{let{label:r}=b.featureStatusConfig[t],o=e.filter(e=>e.status===t);return{key:t,label:r,items:o}});return(0,r.jsxs)(n.Sidebar,{"data-testid":"app-sidebar",collapsible:"icon",children:[(0,r.jsx)(n.SidebarHeader,{children:(0,r.jsxs)(n.SidebarMenu,{children:[(0,r.jsx)(n.SidebarMenuItem,{children:(0,r.jsxs)("div",{className:"flex h-8 items-center group-data-[collapsible=icon]:justify-center",children:[C?(0,r.jsxs)("div",{className:["flex min-w-0 flex-1 items-center gap-2 overflow-hidden px-2 transition-opacity duration-200 ease-out",E?"opacity-100":"opacity-0"].join(" "),"aria-hidden":!E,children:[(0,r.jsx)(h.ShepLogo,{className:"shrink-0",size:20}),(0,r.jsx)("span",{className:"truncate text-sm font-semibold tracking-tight",children:"Shep"})]}):null,(0,r.jsx)(p.SidebarCollapseToggle,{className:"shrink-0 transition-all duration-200"})]})}),(0,r.jsx)(f.SidebarNavItem,{icon:l,label:"Control Center",href:"/",active:"/"===S}),(0,r.jsx)(f.SidebarNavItem,{icon:s.Wrench,label:"Tools",href:"/tools",active:"/tools"===S}),w.skills?(0,r.jsx)(f.SidebarNavItem,{icon:c.Puzzle,label:"Skills",href:"/skills",active:"/skills"===S}):null]})}),(0,r.jsx)(n.SidebarContent,{children:C?(0,r.jsxs)("div",{className:["min-w-0 overflow-hidden transition-opacity duration-200 ease-out [&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none",E?"opacity-100":"opacity-0"].join(" "),children:[(0,r.jsx)(g.SidebarSectionHeader,{label:"Features",onFolderClick:y,onMenuClick:x}),(0,r.jsx)(d.ScrollArea,{children:P.map(({key:e,label:t,items:o})=>o.length>0?(0,r.jsx)(m.FeatureStatusGroup,{label:t,count:o.length,children:o.map(e=>(0,r.jsx)(v.FeatureListItem,{name:e.name,status:e.status,startedAt:e.startedAt,duration:e.duration,onClick:a?()=>a(e.name):void 0},e.name))},e):null)})]}):null}),(0,r.jsx)(n.SidebarFooter,{children:(0,r.jsx)(n.SidebarMenu,{children:(0,r.jsx)(n.SidebarMenuItem,{children:(0,r.jsxs)(n.SidebarMenuButton,{onClick:t,tooltip:"New feature",children:[(0,r.jsx)(u.Plus,{}),(0,r.jsx)("span",{children:"New feature"})]})})})}),(0,r.jsx)(n.SidebarRail,{})]})}e.i(1354);var x=e.i(17845);e.i(53777);var S=e.i(25732);let j=(0,a.default)("volume-2",[["path",{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",key:"uqj9uw"}],["path",{d:"M16 9a5 5 0 0 1 0 6",key:"1q6k2b"}],["path",{d:"M19.364 18.364a9 9 0 0 0 0-12.728",key:"ijwkga"}]]),C=(0,a.default)("volume-off",[["path",{d:"M16 9a5 5 0 0 1 .95 2.293",key:"1fgyg8"}],["path",{d:"M19.364 5.636a9 9 0 0 1 1.889 9.96",key:"l3zxae"}],["path",{d:"m2 2 20 20",key:"1ooewy"}],["path",{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",key:"1gbwow"}],["path",{d:"M9.828 4.172A.686.686 0 0 1 11 4.657v.686",key:"s2je0y"}]]);var E=e.i(35364),P=e.i(73709);function T(){let{enabled:e,toggle:t}=(0,P.useSoundEnabled)();return(0,r.jsxs)(E.Button,{variant:"ghost",size:"icon",onClick:t,"aria-label":e?"Mute sounds":"Unmute sounds",children:[e?(0,r.jsx)(j,{className:"h-5 w-5"}):(0,r.jsx)(C,{className:"h-5 w-5"}),(0,r.jsx)("span",{className:"sr-only",children:"Toggle sound"})]})}var N=e.i(39443),R=e.i(60112),_=e.i(17406),A=e.i(8361);let k={[_.NotificationSeverity.Success]:"success",[_.NotificationSeverity.Error]:"error",[_.NotificationSeverity.Warning]:"warning",[_.NotificationSeverity.Info]:"info"},L={[_.NotificationSeverity.Success]:"notification-success",[_.NotificationSeverity.Error]:"notification-error",[_.NotificationSeverity.Warning]:"notification-warning",[_.NotificationSeverity.Info]:"notification-info"};function O({children:e}){!function(){let{events:e}=(0,N.useAgentEventsContext)(),t=(0,A.useSoundAction)("notification-success"),r=(0,A.useSoundAction)("notification-error"),n=(0,A.useSoundAction)("notification-warning"),i=(0,A.useSoundAction)("notification-info"),a=(0,o.useMemo)(()=>({"notification-success":t,"notification-error":r,"notification-warning":n,"notification-info":i}),[t,r,n,i]),[l,s]=(0,o.useState)(()=>void 0===globalThis.Notification?"default":globalThis.Notification.permission),c=(0,o.useRef)(0);(0,o.useEffect)(()=>{if(e.length<=c.current)return;let t=e.slice(c.current);for(let r of(c.current=e.length,t)){if(r.severity!==_.NotificationSeverity.Error&&r.severity!==_.NotificationSeverity.Warning&&r.severity!==_.NotificationSeverity.Success)continue;!function(e){let t=k[e.severity]??"info",r=e.eventType===_.NotificationEventType.WaitingApproval;R.toast[t](e.featureName,{description:e.message,...r&&{action:{label:"Review",onClick:()=>{window.dispatchEvent(new CustomEvent("shep:select-feature",{detail:{featureId:e.featureId}}))}}}})}(r),globalThis.Notification?.permission==="granted"&&new Notification(`Shep: ${r.featureName}`,{body:r.message,icon:"/favicon-light.svg"});let e=L[r.severity];a[e]?.play()}},[e,a]),(0,o.useCallback)(async()=>{void 0===globalThis.Notification||s(await globalThis.Notification.requestPermission())},[])}();let t=(0,o.useCallback)(()=>{window.dispatchEvent(new CustomEvent("shep:open-create-drawer"))},[]),i=(0,o.useCallback)(e=>{window.dispatchEvent(new CustomEvent("shep:add-repository",{detail:{path:e}}))},[]);return(0,r.jsxs)(n.SidebarProvider,{children:[(0,r.jsx)(y,{features:[],onNewFeature:t}),(0,r.jsx)(n.SidebarInset,{children:(0,r.jsxs)("div",{className:"relative h-full",children:[(0,r.jsxs)("div",{className:"absolute top-3 right-3 z-50 flex gap-1",children:[(0,r.jsx)(x.AddRepositoryButton,{onSelect:i}),(0,r.jsx)(T,{}),(0,r.jsx)(S.ThemeToggle,{})]}),(0,r.jsx)("main",{className:"h-full",children:e})]})})]})}function D({children:e}){return(0,r.jsx)(N.AgentEventsProvider,{children:(0,r.jsx)(O,{children:e})})}e.s(["AppShell",()=>D],87292)},25251,e=>{"use strict";var t=e.i(20314),r=e.i(60112);let o=({...e})=>(0,t.jsx)(r.Toaster,{className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...e});e.s(["Toaster",()=>o])}]);