@shepai/cli 1.106.3 → 1.106.4-pr327.f3fea88
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.
- package/apis/json-schema/FeatureFlags.yaml +5 -0
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +4 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +3 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +11 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +5 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.js +6 -1
- package/dist/src/presentation/web/app/api/chat/stream/route.d.ts +14 -0
- package/dist/src/presentation/web/app/api/chat/stream/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/chat/stream/route.js +153 -0
- package/dist/src/presentation/web/app/chat/page.d.ts +4 -0
- package/dist/src/presentation/web/app/chat/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/chat/page.js +11 -0
- package/dist/src/presentation/web/components/features/chat/chat-empty-state.d.ts +6 -0
- package/dist/src/presentation/web/components/features/chat/chat-empty-state.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/chat/chat-empty-state.js +14 -0
- package/dist/src/presentation/web/components/features/chat/chat-empty-state.stories.d.ts +7 -0
- package/dist/src/presentation/web/components/features/chat/chat-empty-state.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/chat/chat-empty-state.stories.js +15 -0
- package/dist/src/presentation/web/components/features/chat/chat-header.d.ts +7 -0
- package/dist/src/presentation/web/components/features/chat/chat-header.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/chat/chat-header.js +10 -0
- package/dist/src/presentation/web/components/features/chat/chat-header.stories.d.ts +8 -0
- package/dist/src/presentation/web/components/features/chat/chat-header.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/chat/chat-header.stories.js +20 -0
- package/dist/src/presentation/web/components/features/chat/chat-page-client.d.ts +2 -0
- package/dist/src/presentation/web/components/features/chat/chat-page-client.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/chat/chat-page-client.js +50 -0
- package/dist/src/presentation/web/components/features/chat/chat-page-client.stories.d.ts +7 -0
- package/dist/src/presentation/web/components/features/chat/chat-page-client.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/chat/chat-page-client.stories.js +15 -0
- package/dist/src/presentation/web/components/features/chat/chat-view.d.ts +24 -0
- package/dist/src/presentation/web/components/features/chat/chat-view.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/chat/chat-view.js +17 -0
- package/dist/src/presentation/web/components/features/chat/chat-view.stories.d.ts +14 -0
- package/dist/src/presentation/web/components/features/chat/chat-view.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/chat/chat-view.stories.js +149 -0
- package/dist/src/presentation/web/components/features/chat/index.d.ts +5 -0
- package/dist/src/presentation/web/components/features/chat/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/chat/index.js +4 -0
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +3 -1
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
- package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +6 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -1
- package/dist/src/presentation/web/components/ui/avatar.d.ts +12 -0
- package/dist/src/presentation/web/components/ui/avatar.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/avatar.js +23 -0
- package/dist/src/presentation/web/components/ui/chat-container.d.ts +17 -0
- package/dist/src/presentation/web/components/ui/chat-container.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/chat-container.js +14 -0
- package/dist/src/presentation/web/components/ui/code-block.d.ts +17 -0
- package/dist/src/presentation/web/components/ui/code-block.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/code-block.js +29 -0
- package/dist/src/presentation/web/components/ui/loader.d.ts +60 -0
- package/dist/src/presentation/web/components/ui/loader.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/loader.js +190 -0
- package/dist/src/presentation/web/components/ui/markdown.d.ts +12 -0
- package/dist/src/presentation/web/components/ui/markdown.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/markdown.js +50 -0
- package/dist/src/presentation/web/components/ui/message.d.ts +35 -0
- package/dist/src/presentation/web/components/ui/message.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/message.js +18 -0
- package/dist/src/presentation/web/components/ui/prompt-input.d.ts +30 -0
- package/dist/src/presentation/web/components/ui/prompt-input.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/prompt-input.js +98 -0
- package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/feature-flags-context.js +6 -1
- package/dist/src/presentation/web/hooks/use-chat.d.ts +57 -0
- package/dist/src/presentation/web/hooks/use-chat.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-chat.js +217 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/feature-flags.js +7 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +2 -0
- package/web/.next/build-manifest.json +7 -7
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/routes-manifest.json +12 -0
- package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +5 -5
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +5 -5
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +5 -5
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +5 -5
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +5 -5
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +5 -5
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +5 -5
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/build-manifest.json +5 -5
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +5 -5
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page/build-manifest.json +5 -5
- package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +7 -7
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/build-manifest.json +5 -5
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/agent-events/route.js +1 -2
- package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/attachments/upload-from-path/route.js +1 -1
- package/web/.next/server/app/api/attachments/upload-from-path/route.js.nft.json +1 -1
- package/web/.next/server/app/api/chat/stream/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/chat/stream/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/chat/stream/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/chat/stream/route.js +6 -0
- package/web/.next/server/app/api/chat/stream/route.js.map +5 -0
- package/web/.next/server/app/api/chat/stream/route.js.nft.json +1 -0
- package/web/.next/server/app/api/chat/stream/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/feature-logs/route.js +1 -1
- package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
- package/web/.next/server/app/chat/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/chat/page/build-manifest.json +18 -0
- package/web/.next/server/app/chat/page/next-font-manifest.json +6 -0
- package/web/.next/server/app/chat/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/chat/page/server-reference-manifest.json +20 -0
- package/web/.next/server/app/chat/page.js +17 -0
- package/web/.next/server/app/chat/page.js.map +5 -0
- package/web/.next/server/app/chat/page.js.nft.json +1 -0
- package/web/.next/server/app/chat/page_client-reference-manifest.js +2 -0
- package/web/.next/server/app/settings/page/build-manifest.json +5 -5
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/build-manifest.json +5 -5
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js +4 -4
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/build-manifest.json +5 -5
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/build-manifest.json +5 -5
- package/web/.next/server/app/version/page/server-reference-manifest.json +2 -2
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +2 -0
- package/web/.next/server/chunks/403f9_next_567de315._.js +1 -1
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_chat_stream_route_actions_ea265361.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__0866d2b5._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__332c8d91._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__3b72e8b0._.js +1 -1
- package/web/.next/server/chunks/{[root-of-the-server]__91d44424._.js → [root-of-the-server]__52c318d1._.js} +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__57104a4c._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__7d63f9a4._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__9191749c._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__99c20fe5._.js +5 -0
- package/web/.next/server/chunks/[root-of-the-server]__99c20fe5._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__9a136c79._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a1c7c02a._.js +1 -1
- package/web/.next/server/chunks/{[root-of-the-server]__db04ed44._.js → [root-of-the-server]__a5879003._.js} +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__aae14de3._.js +6 -0
- package/web/.next/server/chunks/[root-of-the-server]__aae14de3._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__b2f9a412._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__d2c18946._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__d9d410a8._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__e247a485._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js +1 -1
- package/web/.next/server/chunks/ssr/403f9_next_dist_31ea46d3._.js +1 -1
- package/web/.next/server/chunks/ssr/403f9_next_dist_c9d9b4d7._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +4 -0
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13482941._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13482941._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f1931f8._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f1931f8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__248ee887._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__26d31159._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__26d31159._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2a6f3e3f._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2a6f3e3f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6803b571._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6803b571._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__845a9d2a._.js → [root-of-the-server]__753f42eb._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__753f42eb._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__99857356._.js +61 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__99857356._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9b8f6941._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9b8f6941._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b062b383._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_1f9b7ad3._.js → _15dc3761._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_1f9b7ad3._.js.map → _15dc3761._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_25eb2abf._.js +4 -0
- package/web/.next/server/chunks/ssr/_25eb2abf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_273d4632._.js +1 -1
- package/web/.next/server/chunks/ssr/_34ba40e0._.js +3 -0
- package/web/.next/server/chunks/ssr/_34ba40e0._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_4093a637._.js +5 -0
- package/web/.next/server/chunks/ssr/_4093a637._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_6a2e8373._.js +3 -0
- package/web/.next/server/chunks/ssr/_6a2e8373._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_7ba5f9bd._.js +9 -0
- package/web/.next/server/chunks/ssr/_7ba5f9bd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +2 -2
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_906e9cde._.js +3 -0
- package/web/.next/server/chunks/ssr/_906e9cde._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
- package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_b407679c._.js +3 -0
- package/web/.next/server/chunks/ssr/_b407679c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d7c4fb01._.js +7 -0
- package/web/.next/server/chunks/ssr/_d7c4fb01._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_eb8add9f._.js +4 -0
- package/web/.next/server/chunks/ssr/_eb8add9f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f5316e67._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js +3 -0
- package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_7275ce5d._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_7275ce5d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_758dfa10._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_758dfa10._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js.map +1 -0
- package/web/.next/server/middleware-build-manifest.js +5 -5
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +38 -31
- package/web/.next/static/chunks/0000a3bd9d33363e.js +1 -0
- package/web/.next/static/chunks/{29c29800f5a2acc6.js → 0146cc63e09aa1fc.js} +1 -1
- package/web/.next/static/chunks/01c44c0f52e94d13.js +1 -0
- package/web/.next/static/chunks/025972c91961cb4f.js +1 -0
- package/web/.next/static/chunks/04077bc8814ebb95.js +1 -0
- package/web/.next/static/chunks/040f765faf202f21.js +1 -0
- package/web/.next/static/chunks/0452bf6331941e3f.js +1 -0
- package/web/.next/static/chunks/04abfd0d3656c990.js +1 -0
- package/web/.next/static/chunks/04ba2061ab93d4b4.js +1 -0
- package/web/.next/static/chunks/053a7b986353ec4b.js +1 -0
- package/web/.next/static/chunks/06f273bdc5828685.js +1 -0
- package/web/.next/static/chunks/0749a5b512d6df6b.js +1 -0
- package/web/.next/static/chunks/07720f62d0494cff.js +1 -0
- package/web/.next/static/chunks/07b3a3fe5ed6806c.js +1 -0
- package/web/.next/static/chunks/07ed2655f92b082d.js +1 -0
- package/web/.next/static/chunks/0820c893f5292ab6.js +1 -0
- package/web/.next/static/chunks/08fb03f101641646.js +1 -0
- package/web/.next/static/chunks/0992e1494eb73f73.js +1 -0
- package/web/.next/static/chunks/{b2b65ee0666a829a.js → 0b0f65124c9e6e98.js} +1 -1
- package/web/.next/static/chunks/0b64f70d18b592a9.js +1 -0
- package/web/.next/static/chunks/0b925ca1a402d3cd.js +1 -0
- package/web/.next/static/chunks/0c4d93176dc739f0.js +1 -0
- package/web/.next/static/chunks/0c65283281ae11be.js +1 -0
- package/web/.next/static/chunks/0c82301271695b04.js +1 -0
- package/web/.next/static/chunks/0d6db841c33ab4f1.js +1 -0
- package/web/.next/static/chunks/0d813d73dacd9b43.js +1 -0
- package/web/.next/static/chunks/0dcf159fb9a610e4.js +1 -0
- package/web/.next/static/chunks/0e7dfad45e402b87.js +1 -0
- package/web/.next/static/chunks/0e827c7f60ca4551.js +1 -0
- package/web/.next/static/chunks/0f619c5c402fb9f4.js +1 -0
- package/web/.next/static/chunks/0f83f16fa24fd5d7.js +1 -0
- package/web/.next/static/chunks/0feedea346fd5fbe.js +1 -0
- package/web/.next/static/chunks/12dbfd5ed203fd8c.js +1 -0
- package/web/.next/static/chunks/13ab63bcbd1b9d73.js +1 -0
- package/web/.next/static/chunks/14e6e069b833483c.js +1 -0
- package/web/.next/static/chunks/15049e8c70931a5c.js +1 -0
- package/web/.next/static/chunks/15e9e6d3526dba19.js +1 -0
- package/web/.next/static/chunks/1675a99c138a8dff.js +1 -0
- package/web/.next/static/chunks/18257a988399c500.js +1 -0
- package/web/.next/static/chunks/18b8b7c0f43653ed.js +1 -0
- package/web/.next/static/chunks/1903ea0fc4a1c66a.js +1 -0
- package/web/.next/static/chunks/1a9763ce5ba22b57.js +1 -0
- package/web/.next/static/chunks/1c5a18c436c08be5.js +1 -0
- package/web/.next/static/chunks/1d95a3b4ad425e84.js +1 -0
- package/web/.next/static/chunks/1e88753738d86281.js +1 -0
- package/web/.next/static/chunks/1f5b06b26b55f61e.js +1 -0
- package/web/.next/static/chunks/20e893034947cff0.js +1 -0
- package/web/.next/static/chunks/2199bd4a3f61c371.js +1 -0
- package/web/.next/static/chunks/21f6010e9d824e2b.js +1 -0
- package/web/.next/static/chunks/2277de4cd5d76ea0.js +1 -0
- package/web/.next/static/chunks/23874b32b27bc398.js +1 -0
- package/web/.next/static/chunks/242af1b1794692bb.js +1 -0
- package/web/.next/static/chunks/24ff7613e7640548.js +1 -0
- package/web/.next/static/chunks/255b89458bc45261.js +1 -0
- package/web/.next/static/chunks/256f95ef70dd81c3.js +1 -0
- package/web/.next/static/chunks/2612e5560f8ba2c2.js +1 -0
- package/web/.next/static/chunks/26cc1fb330a4c4ef.js +1 -0
- package/web/.next/static/chunks/2796913db81fa3a0.js +1 -0
- package/web/.next/static/chunks/2a0985b01345546d.js +1 -0
- package/web/.next/static/chunks/2a13aed05cd157cb.js +1 -0
- package/web/.next/static/chunks/2a65cbda6248ac45.js +1 -0
- package/web/.next/static/chunks/2a9e798066780ccb.js +1 -0
- package/web/.next/static/chunks/2aecaa7075dff32c.js +1 -0
- package/web/.next/static/chunks/2aff3eb00311b5ff.js +1 -0
- package/web/.next/static/chunks/2b601943d3e94e5b.js +1 -0
- package/web/.next/static/chunks/2ce5939b18e1a21e.js +1 -0
- package/web/.next/static/chunks/2d204a2a777b935d.js +1 -0
- package/web/.next/static/chunks/2d64b4ffcaccace0.js +1 -0
- package/web/.next/static/chunks/2d890ccc3bdefafa.js +1 -0
- package/web/.next/static/chunks/2e25aca5b7400f56.js +1 -0
- package/web/.next/static/chunks/2ed750fa9ff05fb4.js +1 -0
- package/web/.next/static/chunks/2f1a7ab193aa56ab.js +1 -0
- package/web/.next/static/chunks/2fc0965d77242987.js +1 -0
- package/web/.next/static/chunks/3054fd6667aee1d2.js +1 -0
- package/web/.next/static/chunks/305ea36a55b1b01d.js +1 -0
- package/web/.next/static/chunks/31345772bfb5b56d.js +1 -0
- package/web/.next/static/chunks/31e19c87048a2dd2.js +1 -0
- package/web/.next/static/chunks/32a5dff7a1424ce7.js +1 -0
- package/web/.next/static/chunks/3320db3c4bd922dd.js +1 -0
- package/web/.next/static/chunks/338b409bcf9c5da6.js +1 -0
- package/web/.next/static/chunks/33f71ecfbcc40eb8.js +1 -0
- package/web/.next/static/chunks/35bc063ce1c82d62.js +1 -0
- package/web/.next/static/chunks/366630af12ceb9aa.js +1 -0
- package/web/.next/static/chunks/36a02bc96e797be1.js +1 -0
- package/web/.next/static/chunks/3857a5a593f557b6.js +1 -0
- package/web/.next/static/chunks/38f38199611b387a.js +1 -0
- package/web/.next/static/chunks/39fd8dea78ce33a1.js +1 -0
- package/web/.next/static/chunks/3a9753d40e045b8f.js +1 -0
- package/web/.next/static/chunks/3ae3c50c728eab31.js +11 -0
- package/web/.next/static/chunks/3b811f725088f5ec.js +1 -0
- package/web/.next/static/chunks/3d0086082ce28745.js +1 -0
- package/web/.next/static/chunks/3daba4c77e106a0b.js +1 -0
- package/web/.next/static/chunks/3eeb840a2075bfde.js +1 -0
- package/web/.next/static/chunks/3f2585c9332265e2.js +1 -0
- package/web/.next/static/chunks/3f701f917196c596.js +1 -0
- package/web/.next/static/chunks/4028b1961891bd0b.js +1 -0
- package/web/.next/static/chunks/40962df79d5b9308.js +1 -0
- package/web/.next/static/chunks/40bdb6b0b6b24b30.js +1 -0
- package/web/.next/static/chunks/419f2849c47d15b0.js +1 -0
- package/web/.next/static/chunks/4301b2746001957f.js +1 -0
- package/web/.next/static/chunks/458a6ec844531967.js +1 -0
- package/web/.next/static/chunks/45ae42a60c5885ba.js +1 -0
- package/web/.next/static/chunks/45d55f26409a62e9.js +1 -0
- package/web/.next/static/chunks/469057391d9b81af.js +1 -0
- package/web/.next/static/chunks/46af0d08db9ec138.js +1 -0
- package/web/.next/static/chunks/47dd15642d568b90.js +1 -0
- package/web/.next/static/chunks/4be33773114cd302.js +1 -0
- package/web/.next/static/chunks/4c3eff62cda82668.js +1 -0
- package/web/.next/static/chunks/4c592610236f630f.js +4 -0
- package/web/.next/static/chunks/4cc404bcff34a71f.js +1 -0
- package/web/.next/static/chunks/4d44c49ec4cdd79f.js +1 -0
- package/web/.next/static/chunks/4f0c36555d75e5fe.js +1 -0
- package/web/.next/static/chunks/554aadda059a8430.js +1 -0
- package/web/.next/static/chunks/55c4d9d2fddbead4.js +1 -0
- package/web/.next/static/chunks/55dc4e8d31455c2d.js +1 -0
- package/web/.next/static/chunks/5737640b5eb3844c.js +1 -0
- package/web/.next/static/chunks/5874c94c33f9b7b0.js +1 -0
- package/web/.next/static/chunks/58d9b3be51fd5de0.js +1 -0
- package/web/.next/static/chunks/5a4e2f295be16022.js +1 -0
- package/web/.next/static/chunks/5bc3c8f3a6aca6fa.js +1 -0
- package/web/.next/static/chunks/5c3c605bb590e3e7.js +1 -0
- package/web/.next/static/chunks/5c955aad7e021e56.js +1 -0
- package/web/.next/static/chunks/5cb21622c5e5747e.js +1 -0
- package/web/.next/static/chunks/5cdf0942d4f7ed5f.js +1 -0
- package/web/.next/static/chunks/5d4a3f9a24a357ab.js +1 -0
- package/web/.next/static/chunks/5d97d16f083409e9.js +1 -0
- package/web/.next/static/chunks/60f3d869542bf677.js +1 -0
- package/web/.next/static/chunks/62224eae737b4521.js +1 -0
- package/web/.next/static/chunks/6539d0757f0cfc29.js +1 -0
- package/web/.next/static/chunks/65a238abdcb11bcd.js +1 -0
- package/web/.next/static/chunks/65b76ab700c2a9d0.js +1 -0
- package/web/.next/static/chunks/660ad72a4adcb7fc.js +1 -0
- package/web/.next/static/chunks/664c671566a249f4.js +1 -0
- package/web/.next/static/chunks/66bbfced65db425f.js +1 -0
- package/web/.next/static/chunks/68b6eedefa12f8c7.js +1 -0
- package/web/.next/static/chunks/68fa8559029f9f41.js +1 -0
- package/web/.next/static/chunks/6947ab623933a779.js +1 -0
- package/web/.next/static/chunks/6e9f2a1a17352af0.js +1 -0
- package/web/.next/static/chunks/6ee18bbefc401436.js +1 -0
- package/web/.next/static/chunks/6f83a2cba6850e4a.js +1 -0
- package/web/.next/static/chunks/6fb42a88b84aa22b.js +1 -0
- package/web/.next/static/chunks/6ffd8d481eb5e86a.js +1 -0
- package/web/.next/static/chunks/70ebb562067defff.js +1 -0
- package/web/.next/static/chunks/719ffd0d25696861.js +1 -0
- package/web/.next/static/chunks/71bbf75ff7ac7d1c.js +1 -0
- package/web/.next/static/chunks/72452c79bb483893.js +1 -0
- package/web/.next/static/chunks/{0102ce60a2a42fab.js → 73512dcafc035901.js} +1 -1
- package/web/.next/static/chunks/737b452d10950f75.js +1 -0
- package/web/.next/static/chunks/73c9849a26d56eaf.js +1 -0
- package/web/.next/static/chunks/742ddcbde2de0a5f.js +1 -0
- package/web/.next/static/chunks/75f20501876081ae.js +1 -0
- package/web/.next/static/chunks/771904aa3f2b5890.js +1 -0
- package/web/.next/static/chunks/78140b3927f34ee1.js +1 -0
- package/web/.next/static/chunks/78c2221a0e9ac3e0.js +1 -0
- package/web/.next/static/chunks/7a16988476a29ae1.js +1 -0
- package/web/.next/static/chunks/7aebb2852b03cf3b.js +1 -0
- package/web/.next/static/chunks/{d4ee1f8f03cee0aa.js → 7b3bad34a11293ef.js} +1 -1
- package/web/.next/static/chunks/7cada01735a2de18.js +1 -0
- package/web/.next/static/chunks/7cd5e13ac856cf73.js +1 -0
- package/web/.next/static/chunks/7d0c918f6da54095.js +1 -0
- package/web/.next/static/chunks/7e55ce83f10514a3.js +1 -0
- package/web/.next/static/chunks/7e70c7df8d1224f0.js +1 -0
- package/web/.next/static/chunks/7f3161de6996c05f.js +1 -0
- package/web/.next/static/chunks/806207333fba56e3.js +1 -0
- package/web/.next/static/chunks/825f5a75a38db3ec.js +1 -0
- package/web/.next/static/chunks/82df15d2af5efffe.js +1 -0
- package/web/.next/static/chunks/83397d71344d405d.js +1 -0
- package/web/.next/static/chunks/8478b108a35675bb.js +1 -0
- package/web/.next/static/chunks/84b6fde40fe98bbc.js +1 -0
- package/web/.next/static/chunks/8525e0fed6102ee4.js +1 -0
- package/web/.next/static/chunks/858a571e17cbe069.js +1 -0
- package/web/.next/static/chunks/8599414ffd4e15f5.js +1 -0
- package/web/.next/static/chunks/85da8b6aabbfc33c.js +1 -0
- package/web/.next/static/chunks/8866422156b74976.js +1 -0
- package/web/.next/static/chunks/8884218357d06e4c.js +1 -0
- package/web/.next/static/chunks/890e85bcb002030f.js +1 -0
- package/web/.next/static/chunks/8a6482e4289bd485.js +1 -0
- package/web/.next/static/chunks/8b34938e48e56746.js +1 -0
- package/web/.next/static/chunks/8bc16f2ee0ac282b.js +1 -0
- package/web/.next/static/chunks/8c05e7493172a40a.js +1 -0
- package/web/.next/static/chunks/8c16bb1814e36e5d.js +1 -0
- package/web/.next/static/chunks/8d9c6ac44d75942c.js +1 -0
- package/web/.next/static/chunks/8e2d9292729601b9.js +1 -0
- package/web/.next/static/chunks/8ed313638226f782.js +1 -0
- package/web/.next/static/chunks/{cfe4dc9904fcfddb.js → 8f4b01641dd98daa.js} +1 -1
- package/web/.next/static/chunks/8f98e5a8f241fe53.js +1 -0
- package/web/.next/static/chunks/8fc154c5edda0beb.js +1 -0
- package/web/.next/static/chunks/8fe2d5b09bf432b8.js +1 -0
- package/web/.next/static/chunks/8fe35ce71e4ad05b.js +1 -0
- package/web/.next/static/chunks/9067d4871d0c903f.js +1 -0
- package/web/.next/static/chunks/92d091aa318b78fb.js +1 -0
- package/web/.next/static/chunks/93af57e60f3a66ba.js +1 -0
- package/web/.next/static/chunks/93dd149a0766adcc.js +1 -0
- package/web/.next/static/chunks/957474fa08a22115.js +1 -0
- package/web/.next/static/chunks/95b925bb74686af7.js +1 -0
- package/web/.next/static/chunks/96158847987b2403.js +1 -0
- package/web/.next/static/chunks/975c124d34c8c6a8.js +1 -0
- package/web/.next/static/chunks/97bf3636621b58c7.js +1 -0
- package/web/.next/static/chunks/97e9c48e0abc9a50.js +1 -0
- package/web/.next/static/chunks/{fe70e73feb07bcfd.js → 98c68c9ea7a9e597.js} +1 -1
- package/web/.next/static/chunks/99052b059a0075f9.js +1 -0
- package/web/.next/static/chunks/99de3f6268e262a3.js +1 -0
- package/web/.next/static/chunks/99e12f466e3868ca.js +1 -0
- package/web/.next/static/chunks/9ba434534d00d922.js +1 -0
- package/web/.next/static/chunks/9d3cb38ab5fb405b.js +1 -0
- package/web/.next/static/chunks/9d5adb23e0187d9c.js +1 -0
- package/web/.next/static/chunks/9d8444f3f16a0998.js +1 -0
- package/web/.next/static/chunks/9dd2a16ac3fea1f1.js +1 -0
- package/web/.next/static/chunks/9e66ab37fd08bc66.js +1 -0
- package/web/.next/static/chunks/a09fa49dbf0f3636.js +1 -0
- package/web/.next/static/chunks/a2000986cd87a131.js +1 -0
- package/web/.next/static/chunks/a31fd9cfaa7a3158.js +1 -0
- package/web/.next/static/chunks/a38e1790e76ded6c.js +1 -0
- package/web/.next/static/chunks/a662e9340d282c55.js +1 -0
- package/web/.next/static/chunks/a77c0a719a2cc920.js +1 -0
- package/web/.next/static/chunks/a7f8cdb6749f9bdd.js +1 -0
- package/web/.next/static/chunks/a8a4fdbbcb3a5998.js +1 -0
- package/web/.next/static/chunks/a8f26eabe8187392.js +1 -0
- package/web/.next/static/chunks/a954d978d5e9781e.js +1 -0
- package/web/.next/static/chunks/a977e04dad1a77c7.js +1 -0
- package/web/.next/static/chunks/abd77592929f00d5.js +1 -0
- package/web/.next/static/chunks/ac53962c1a4765c7.js +1 -0
- package/web/.next/static/chunks/ade5ee5b3412436e.js +1 -0
- package/web/.next/static/chunks/ae84e9326b9e9200.js +2 -0
- package/web/.next/static/chunks/b0810838151379a2.js +1 -0
- package/web/.next/static/chunks/b1106224fbc2f015.js +1 -0
- package/web/.next/static/chunks/b13329875853d9a5.js +1 -0
- package/web/.next/static/chunks/b1460995e7a388b9.css +1 -0
- package/web/.next/static/chunks/b2b08e8fb70210c7.js +1 -0
- package/web/.next/static/chunks/b2f0e49369262eea.js +1 -0
- package/web/.next/static/chunks/b46abe587d05f58c.js +1 -0
- package/web/.next/static/chunks/b555154c60b9d90c.js +1 -0
- package/web/.next/static/chunks/b61982efe6f7e40e.js +1 -0
- package/web/.next/static/chunks/b6972d679174ce65.js +1 -0
- package/web/.next/static/chunks/b6ae34a5c2627d04.js +1 -0
- package/web/.next/static/chunks/bae57337da9a2d34.js +1 -0
- package/web/.next/static/chunks/bba2ccf4fd7849e1.js +1 -0
- package/web/.next/static/chunks/bc21e40585b8dcf4.js +1 -0
- package/web/.next/static/chunks/bd0cd7805b800eab.js +1 -0
- package/web/.next/static/chunks/bf13e9bc0390b21d.js +59 -0
- package/web/.next/static/chunks/bfec0c4899344791.js +1 -0
- package/web/.next/static/chunks/c1a40361928a6f90.js +1 -0
- package/web/.next/static/chunks/c1f34786f0d6908c.js +2 -0
- package/web/.next/static/chunks/c1fa94e9df162cb2.js +1 -0
- package/web/.next/static/chunks/c260a37325b283d3.js +1 -0
- package/web/.next/static/chunks/c3abb9ed0d089656.js +1 -0
- package/web/.next/static/chunks/c49a32e2d002dd91.js +1 -0
- package/web/.next/static/chunks/c564bdda2d517997.js +1 -0
- package/web/.next/static/chunks/c5c7a925445f4d05.js +1 -0
- package/web/.next/static/chunks/c7e793951b20a67f.js +1 -0
- package/web/.next/static/chunks/c86d4c471f194ad0.js +1 -0
- package/web/.next/static/chunks/c8d2cd372806e8b4.js +1 -0
- package/web/.next/static/chunks/c932b41ef3a40647.js +1 -0
- package/web/.next/static/chunks/c95abf23ce28b320.js +1 -0
- package/web/.next/static/chunks/c9d225b49db0980e.js +1 -0
- package/web/.next/static/chunks/c9e3afa09e76a4b2.js +1 -0
- package/web/.next/static/chunks/c9ef2470073e11cb.js +1 -0
- package/web/.next/static/chunks/ca201ae288dba155.js +1 -0
- package/web/.next/static/chunks/ca6196a863fc258d.js +1 -0
- package/web/.next/static/chunks/cac3a64966a112f7.js +1 -0
- package/web/.next/static/chunks/cb1e02415930189c.js +1 -0
- package/web/.next/static/chunks/cb412c095989545d.js +1 -0
- package/web/.next/static/chunks/cba332976e88a351.js +1 -0
- package/web/.next/static/chunks/cbf0c6470851a2f0.js +1 -0
- package/web/.next/static/chunks/cc60420e9bf53d96.js +1 -0
- package/web/.next/static/chunks/cc9054c5e6e1c706.js +1 -0
- package/web/.next/static/chunks/cd3bf2c5469b9646.js +1 -0
- package/web/.next/static/chunks/cdd7964a31b63d66.js +1 -0
- package/web/.next/static/chunks/cdd7f91e23b5ea49.js +1 -0
- package/web/.next/static/chunks/ce6a2fd4485c50c7.js +1 -0
- package/web/.next/static/chunks/d04de4be30ab78ca.js +3 -0
- package/web/.next/static/chunks/d0be65e7d38590b6.js +1 -0
- package/web/.next/static/chunks/d128b5501807e6f0.js +1 -0
- package/web/.next/static/chunks/d2124558f2b71c54.js +1 -0
- package/web/.next/static/chunks/d21a7ac5bcd538a3.js +1 -0
- package/web/.next/static/chunks/d35123b0dc2e2702.js +1 -0
- package/web/.next/static/chunks/d3ff3d218c7ad329.js +1 -0
- package/web/.next/static/chunks/d47def0da790a783.js +1 -0
- package/web/.next/static/chunks/d56169a6ceb14d27.js +1 -0
- package/web/.next/static/chunks/d5f1eede831e271a.js +1 -0
- package/web/.next/static/chunks/d62ba6ca7b41e179.js +1 -0
- package/web/.next/static/chunks/d6e74c394e816b3a.js +1 -0
- package/web/.next/static/chunks/d700d036b0dd9d28.js +1 -0
- package/web/.next/static/chunks/d7922dc82b3d8177.js +1 -0
- package/web/.next/static/chunks/d79a28dee31b3e43.js +1 -0
- package/web/.next/static/chunks/d88d6c7dd4fb3eb0.js +1 -0
- package/web/.next/static/chunks/d95b6e4c9a832b75.js +1 -0
- package/web/.next/static/chunks/dac044a4e6d8e3d4.js +1 -0
- package/web/.next/static/chunks/db873305cb622122.js +1 -0
- package/web/.next/static/chunks/dba11645cc1ddde8.js +1 -0
- package/web/.next/static/chunks/dbfb2921fe1fbe42.js +1 -0
- package/web/.next/static/chunks/dc75258a3914ab28.js +1 -0
- package/web/.next/static/chunks/ddbb7e6d2aa7940f.js +1 -0
- package/web/.next/static/chunks/ddcfb6c08594ccb7.js +1 -0
- package/web/.next/static/chunks/de82d83003608b30.js +1 -0
- package/web/.next/static/chunks/debe9e537fa1dd5c.js +1 -0
- package/web/.next/static/chunks/e0e2881173c1b4ea.js +1 -0
- package/web/.next/static/chunks/e16538f1db410909.js +1 -0
- package/web/.next/static/chunks/e1dcb6b88dd2cbfb.js +1 -0
- package/web/.next/static/chunks/e1ec2aeadbc3e43e.js +1 -0
- package/web/.next/static/chunks/e4967b0e84ca5a95.js +1 -0
- package/web/.next/static/chunks/e4c653eb9557c225.js +1 -0
- package/web/.next/static/chunks/e51516e366109a4d.js +1 -0
- package/web/.next/static/chunks/e759235b76258903.js +1 -0
- package/web/.next/static/chunks/e75c5376799db08c.js +1 -0
- package/web/.next/static/chunks/e8341f198526730e.js +1 -0
- package/web/.next/static/chunks/e8d014f4a5df5f4b.js +1 -0
- package/web/.next/static/chunks/eab21ff64827175b.js +1 -0
- package/web/.next/static/chunks/eaf5638419fe834d.js +1 -0
- package/web/.next/static/chunks/eb49387d22b57020.js +1 -0
- package/web/.next/static/chunks/ebb7e6387076d1f2.js +1 -0
- package/web/.next/static/chunks/ecf9bd4e51bc22b2.js +1 -0
- package/web/.next/static/chunks/ed5f5eaaba3fe86e.js +1 -0
- package/web/.next/static/chunks/ee3792dfe67952fc.js +1 -0
- package/web/.next/static/chunks/ee96f625d002bb6f.js +1 -0
- package/web/.next/static/chunks/f01c407dc77e32e6.js +1 -0
- package/web/.next/static/chunks/f05e324248b7eefa.js +1 -0
- package/web/.next/static/chunks/f116adff993e4e78.js +1 -0
- package/web/.next/static/chunks/f48a6189ac11bc51.js +1 -0
- package/web/.next/static/chunks/f57a12cf8a7fa100.js +1 -0
- package/web/.next/static/chunks/f6bf8273ddaca996.js +1 -0
- package/web/.next/static/chunks/f7313a12522304e8.js +1 -0
- package/web/.next/static/chunks/f7938fccffa01b89.js +1 -0
- package/web/.next/static/chunks/f7b685bb0cb377c2.js +1 -0
- package/web/.next/static/chunks/f7e499a9733db05b.js +1 -0
- package/web/.next/static/chunks/fa113f988d09306b.js +1 -0
- package/web/.next/static/chunks/fc1587c1e44444d4.js +1 -0
- package/web/.next/static/chunks/fcb420148a0cf38e.js +1 -0
- package/web/.next/static/chunks/fd6bbc9c53b0101e.js +1 -0
- package/web/.next/static/chunks/fef1f3b5114b8d2d.js +1 -0
- package/web/.next/static/chunks/{b1eadf24106c53ce.js → ff20a3511ab6687b.js} +1 -1
- package/web/.next/static/chunks/{turbopack-426d9bc2450816ba.js → turbopack-19fdba76a6171f31.js} +1 -1
- package/web/package.json +6 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +0 -6
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__3b22a1eb._.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__3b22a1eb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js +0 -3
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__52485955._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d91fdd51._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d91fdd51._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_025a2fa0._.js +0 -4
- package/web/.next/server/chunks/ssr/_025a2fa0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1bb131c4._.js +0 -3
- package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_3a4c94e3._.js +0 -3
- package/web/.next/server/chunks/ssr/_3a4c94e3._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_8afac0ca._.js +0 -3
- package/web/.next/server/chunks/ssr/_8afac0ca._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_9ac70f88._.js +0 -5
- package/web/.next/server/chunks/ssr/_9ac70f88._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a68d7e1c._.js +0 -9
- package/web/.next/server/chunks/ssr/_a68d7e1c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_b5fc318a._.js +0 -3
- package/web/.next/server/chunks/ssr/_b5fc318a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_e6f2da4f._.js +0 -7
- package/web/.next/server/chunks/ssr/_e6f2da4f._.js.map +0 -1
- package/web/.next/static/chunks/07b853e29af1e5f2.js +0 -1
- package/web/.next/static/chunks/3bb35e0689e8b6b7.js +0 -1
- package/web/.next/static/chunks/52b56677c842e45f.js +0 -3
- package/web/.next/static/chunks/77ae4e64052864f9.js +0 -2
- package/web/.next/static/chunks/79474459eb409359.js +0 -1
- package/web/.next/static/chunks/84a181ff3270fd9f.js +0 -1
- package/web/.next/static/chunks/8c0f3126502dea0a.js +0 -11
- package/web/.next/static/chunks/8c3a1b4dd386fb21.js +0 -1
- package/web/.next/static/chunks/c750d771701b9b97.js +0 -1
- package/web/.next/static/chunks/d4d8f0a137bd2eb4.js +0 -4
- package/web/.next/static/chunks/db122a6247f69104.css +0 -1
- package/web/.next/static/chunks/ea320f314a210a70.js +0 -2
- package/web/.next/static/chunks/ed3a602003bcb31b.js +0 -1
- /package/web/.next/server/chunks/{ssr/[root-of-the-server]__52485955._.js.map → 744ca_web__next-internal_server_app_api_chat_stream_route_actions_ea265361.js.map} +0 -0
- /package/web/.next/server/chunks/{[root-of-the-server]__91d44424._.js.map → [root-of-the-server]__52c318d1._.js.map} +0 -0
- /package/web/.next/server/chunks/{[root-of-the-server]__db04ed44._.js.map → [root-of-the-server]__a5879003._.js.map} +0 -0
- /package/web/.next/static/{uT0QQwg2cbMo46NG69Bky → OiQDaxgdMUYHZ4ZGZWNWt}/_buildManifest.js +0 -0
- /package/web/.next/static/{uT0QQwg2cbMo46NG69Bky → OiQDaxgdMUYHZ4ZGZWNWt}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{uT0QQwg2cbMo46NG69Bky → OiQDaxgdMUYHZ4ZGZWNWt}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/presentation/web/app/actions/data%3A0704be%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx","../../../../../../../src/presentation/web/app/actions/data%3A2e013d%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A31082e%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A958168%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A0a3222%20%3Ctext/javascript%3E","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-menu%402.1.16_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types%2Breact%40_0322d2fb1ba5ea1a4d797d357cec024b/node_modules/%40radix-ui/react-menu/dist/index.mjs","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-dropdown-menu%402.1.16_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40typ_292e07ad4d6f23c210a3c040c01e35d6/node_modules/%40radix-ui/react-dropdown-menu/dist/index.mjs","../../../../../../../src/presentation/web/components/ui/dropdown-menu.tsx","../../../../../../../src/presentation/web/components/common/open-action-menu/open-action-menu.tsx","../../../../../../../src/presentation/web/app/actions/data%3A102547%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3Afd761f%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx","../../../../../../../src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx","../../../../../../../src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx","../../../../../../../src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.tsx","../../../../../../../src/presentation/web/components/common/ci-status-badge/ci-status-badge.tsx","../../../../../../../src/presentation/web/components/common/merge-review/diff-view.tsx","../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx","../../../../../../../src/presentation/web/components/common/inline-attachments/inline-attachments.tsx","../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx","../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx","../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/log-tab.tsx","../../../../../../../src/presentation/web/components/common/task-progress-view/task-progress-view.tsx","../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/plan-tab.tsx","../../../../../../../src/presentation/web/hooks/use-feature-logs.ts","../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.ts","../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx","../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts","../../../../../../../src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.ts","../../../../../../../src/presentation/web/components/ui/comet-spinner.tsx","../../../../../../../src/presentation/web/lib/format-duration.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/circle-dashed.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/clipboard-list.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/arrow-right.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/clock.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/list-todo.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/arrow-down.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/image-off.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/git-compare-arrows.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/git-commit-horizontal.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/monitor-play.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/file-minus.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/triangle-alert.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/file-diff.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/layers.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/file-plus.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/file-pen.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/camera.ts","../../../../../../../src/presentation/web/components/common/control-center-drawer/drawer-view.ts","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-dropdown-menu%402.1.16_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40typ_292e07ad4d6f23c210a3c040c01e35d6/node_modules/%40radix-ui/react-dropdown-menu/src/dropdown-menu.tsx"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"40329fc9d2e1925005e7776841588b82f6da65e177\":\"getFeaturePlan\"},\"src/presentation/web/app/actions/get-feature-plan.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40329fc9d2e1925005e7776841588b82f6da65e177\",callServer,void 0,findSourceMapURL,\"getFeaturePlan\");export{$$RSC_SERVER_ACTION_0 as getFeaturePlan};","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { useRouter, usePathname } from 'next/navigation';\nimport { toast } from 'sonner';\nimport { Loader2, Trash2, Play, Square, Copy, Check, Code2, ExternalLink } from 'lucide-react';\nimport type {\n PrdApprovalPayload,\n QuestionSelectionChange,\n} from '@shepai/core/domain/generated/output';\nimport { approveFeature } from '@/app/actions/approve-feature';\nimport { rejectFeature } from '@/app/actions/reject-feature';\nimport type { RejectAttachment } from '@/components/common/drawer-action-bar';\nimport { getFeatureArtifact } from '@/app/actions/get-feature-artifact';\nimport { getResearchArtifact } from '@/app/actions/get-research-artifact';\nimport { getMergeReviewData } from '@/app/actions/get-merge-review-data';\nimport { deleteFeature } from '@/app/actions/delete-feature';\nimport { useFeatureFlags } from '@/hooks/feature-flags-context';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { useGuardedDrawerClose } from '@/hooks/drawer-close-guard';\nimport { useDeployAction } from '@/hooks/use-deploy-action';\nimport { useAgentEventsContext } from '@/hooks/agent-events-provider';\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DeploymentStatusBadge } from '@/components/common/deployment-status-badge';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Button } from '@/components/ui/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { DeleteFeatureDialog } from '@/components/common/delete-feature-dialog';\nimport { ActionButton } from '@/components/common/action-button';\nimport { OpenActionMenu } from '@/components/common/open-action-menu';\nimport { FeatureDrawerTabs } from '@/components/common/feature-drawer-tabs';\nimport { useFeatureActions } from '@/components/common/feature-drawer/use-feature-actions';\nimport type { PrdQuestionnaireData } from '@/components/common/prd-questionnaire';\nimport type { TechDecisionsReviewData } from '@/components/common/tech-decisions-review';\nimport type { ProductDecisionsSummaryData } from '@/components/common/product-decisions-summary';\nimport type { MergeReviewData } from '@/components/common/merge-review';\nimport { resolveSseEventUpdates } from '@/components/common/feature-node/derive-feature-state';\nimport { deriveInitialTab } from './drawer-view';\nimport type { DrawerView, FeatureTabKey } from './drawer-view';\nimport { useArtifactFetch } from './use-artifact-fetch';\n\nexport interface FeatureDrawerClientProps {\n view: DrawerView;\n /** Tab key extracted from the URL path segment (e.g. /feature/[id]/activity → 'activity'). */\n urlTab?: FeatureTabKey;\n}\n\nexport function FeatureDrawerClient({ view: initialView, urlTab }: FeatureDrawerClientProps) {\n const featureFlags = useFeatureFlags();\n const router = useRouter();\n const deleteSound = useSoundAction('delete');\n const rejectSound = useSoundAction('reject');\n\n // Track the view locally so SSE events can update the drawer type in real-time\n const [view, setView] = useState(initialView);\n\n // Sync when server re-renders with new props (e.g. after router.refresh())\n useEffect(() => {\n setView(initialView);\n }, [initialView]);\n\n const featureNode = view.type === 'feature' ? view.node : null;\n\n // SSE: update drawer view when feature state changes\n const { events } = useAgentEventsContext();\n const processedCountRef = useRef(0);\n\n useEffect(() => {\n // Clamp cursor if events were pruned\n if (processedCountRef.current > events.length) {\n processedCountRef.current = 0;\n }\n if (!featureNode || events.length <= processedCountRef.current) return;\n\n const newEvents = events.slice(processedCountRef.current);\n processedCountRef.current = events.length;\n\n for (const update of resolveSseEventUpdates(newEvents)) {\n if (update.featureId !== featureNode.featureId) continue;\n\n // Skip SSE updates for features in 'deleting' state — prevents stale\n // events from overwriting the delete animation or triggering artifact\n // fetches (which would fail with \"not found\" for soft-deleted features).\n if (featureNode.state === 'deleting') continue;\n\n // Trigger a server refresh to get the latest drawer view,\n // but skip when the drawer is closed, the user has unsaved changes,\n // or a rejection is in-flight to avoid unnecessary refreshes.\n if (isOpenRef.current && !isDirtyRef.current && !isRejectingRef.current) router.refresh();\n\n if (update.state !== undefined || update.lifecycle !== undefined) {\n // Optimistically update the node data AND re-derive the initial tab so the\n // drawer switches immediately (e.g. prd-review → overview when agent resumes)\n // without waiting for the router.refresh() round-trip.\n setView((prev) => {\n if (prev.type !== 'feature') return prev;\n const updatedNode = {\n ...prev.node,\n ...(update.state !== undefined && { state: update.state }),\n ...(update.lifecycle !== undefined && { lifecycle: update.lifecycle }),\n };\n return { ...prev, node: updatedNode, initialTab: deriveInitialTab(updatedNode) };\n });\n }\n }\n }, [events, featureNode, router]);\n\n // Derive open state from the URL. Next.js parallel routes preserve slot\n // content during soft navigation, so this component is NOT unmounted when\n // navigating to `/`. Instead, we watch the pathname and let Vaul handle\n // the close animation when the path no longer matches a feature route.\n const pathname = usePathname();\n const isOpen = pathname.startsWith('/feature/');\n const isOpenRef = useRef(isOpen);\n const wasOpenRef = useRef(isOpen);\n\n // When the drawer re-opens, force a server refresh so the view is always fresh.\n // SSE skips router.refresh() while the drawer is closed, so data can go stale.\n useEffect(() => {\n if (isOpen && !wasOpenRef.current) {\n router.refresh();\n }\n wasOpenRef.current = isOpen;\n }, [isOpen, router]);\n\n isOpenRef.current = isOpen;\n\n const onClose = useCallback(() => {\n router.push('/');\n }, [router]);\n\n // ── Chat input state (shared across all review views) ────────────────\n const [chatInput, setChatInput] = useState('');\n\n // ── PRD state ──────────────────────────────────────────────────────────\n const [prdData, setPrdData] = useState<PrdQuestionnaireData | null>(null);\n const [prdSelections, setPrdSelections] = useState<Record<string, string>>({});\n const [prdDefaultSelections, setPrdDefaultSelections] = useState<Record<string, string>>({});\n\n // ── Tech state ─────────────────────────────────────────────────────────\n const [techData, setTechData] = useState<TechDecisionsReviewData | null>(null);\n\n // ── Product decisions state (for tech review Product tab) ─────────────\n const [techProductData, setTechProductData] = useState<\n ProductDecisionsSummaryData | null | undefined\n >(undefined);\n\n // ── Merge state ────────────────────────────────────────────────────────\n const [mergeData, setMergeData] = useState<MergeReviewData | null>(null);\n\n // ── Delete state ───────────────────────────────────────────────────────\n const [isDeleting, setIsDeleting] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n\n // ── Shared reject state ────────────────────────────────────────────────\n const [isRejecting, setIsRejecting] = useState(false);\n const isRejectingRef = useRef(false);\n\n // Reset chat input whenever the initialTab changes (lifecycle transition)\n const initialTab = view.type === 'feature' ? view.initialTab : undefined;\n useEffect(() => {\n setChatInput('');\n }, [initialTab]);\n\n // ── Data fetching ─────────────────────────────────────────────────────\n\n const prdFeatureId =\n featureNode?.lifecycle === 'requirements' && featureNode?.state === 'action-required'\n ? featureNode.featureId\n : null;\n const isLoadingPrd = useArtifactFetch(\n prdFeatureId,\n getFeatureArtifact,\n (result) => {\n if (result.error) {\n toast.error(result.error);\n return;\n }\n if (result.questionnaire) {\n setPrdData(result.questionnaire);\n const defaults: Record<string, string> = {};\n for (const q of result.questionnaire.questions) {\n const recommended = q.options.find((o) => o.recommended);\n if (recommended) defaults[q.id] = recommended.id;\n }\n setPrdSelections(defaults);\n setPrdDefaultSelections(defaults);\n }\n },\n () => {\n setPrdSelections({});\n setPrdDefaultSelections({});\n setPrdData(null);\n },\n 'Failed to load questionnaire'\n );\n\n const techFeatureId =\n featureNode?.lifecycle === 'implementation' && featureNode?.state === 'action-required'\n ? featureNode.featureId\n : null;\n const isLoadingTech = useArtifactFetch(\n techFeatureId,\n getResearchArtifact,\n (result) => {\n if (result.error) {\n toast.error(result.error);\n return;\n }\n if (result.techDecisions) setTechData(result.techDecisions);\n },\n () => setTechData(null),\n 'Failed to load tech decisions'\n );\n\n const isLoadingTechProduct = useArtifactFetch(\n techFeatureId,\n getFeatureArtifact,\n (result) => {\n if (result.productDecisions) setTechProductData(result.productDecisions);\n },\n () => setTechProductData(undefined)\n );\n\n const mergeFeatureId =\n featureNode?.lifecycle === 'review' &&\n (featureNode?.state === 'action-required' || featureNode?.state === 'error')\n ? featureNode.featureId\n : null;\n const isLoadingMerge = useArtifactFetch(\n mergeFeatureId,\n getMergeReviewData,\n (result) => {\n if ('error' in result) {\n toast.error(result.error);\n return;\n }\n setMergeData(result);\n },\n () => setMergeData(null),\n 'Failed to load merge review data'\n );\n\n // ── Close guard ──────────────────────────────────────────────────────\n const isChatDirty = chatInput.trim().length > 0;\n const isPrdDirty =\n featureNode?.lifecycle === 'requirements' &&\n featureNode?.state === 'action-required' &&\n Object.keys(prdDefaultSelections).some((k) => prdDefaultSelections[k] !== prdSelections[k]);\n const isDirty = isChatDirty || isPrdDirty;\n\n // Keep dirty state in a ref so the SSE handler can read the latest value\n // without re-running the effect on every keystroke.\n const isDirtyRef = useRef(isDirty);\n isDirtyRef.current = isDirty;\n\n const onReset = useCallback(() => {\n setChatInput('');\n setPrdSelections({ ...prdDefaultSelections });\n }, [prdDefaultSelections]);\n\n const { attemptClose } = useGuardedDrawerClose({ open: isOpen, isDirty, onClose, onReset });\n\n // ── Approve / reject handlers ─────────────────────────────────────────\n\n const handleReject = useCallback(\n async (\n feedback: string,\n label: string,\n attachments: RejectAttachment[] = [],\n onDone?: () => void\n ) => {\n if (!featureNode?.featureId) return;\n isRejectingRef.current = true;\n setIsRejecting(true);\n try {\n const attachmentPaths = attachments.map((a) => a.path).filter(Boolean);\n const result = await rejectFeature(featureNode.featureId, feedback, attachmentPaths);\n if (!result.rejected) {\n toast.error(result.error ?? `Failed to reject ${label.toLowerCase()}`);\n return;\n }\n rejectSound.play();\n setChatInput('');\n toast.success(`${label} rejected — agent re-iterating (iteration ${result.iteration})`);\n if (result.iterationWarning) {\n toast.warning(\n `Iteration ${result.iteration} — consider approving or adjusting feedback to avoid excessive iterations`\n );\n }\n onClose();\n onDone?.();\n } finally {\n isRejectingRef.current = false;\n setIsRejecting(false);\n }\n },\n [featureNode, onClose, rejectSound]\n );\n\n const handlePrdReject = useCallback(\n (feedback: string, attachments: RejectAttachment[]) =>\n handleReject(feedback, 'Requirements', attachments, () => setPrdSelections({})),\n [handleReject]\n );\n const handleTechReject = useCallback(\n (feedback: string, attachments: RejectAttachment[]) =>\n handleReject(feedback, 'Plan', attachments),\n [handleReject]\n );\n const handleMergeReject = useCallback(\n (feedback: string, attachments: RejectAttachment[]) =>\n handleReject(feedback, 'Merge', attachments),\n [handleReject]\n );\n\n const handleSimpleApprove = useCallback(\n async (label: string) => {\n if (!featureNode?.featureId) return;\n const result = await approveFeature(featureNode.featureId);\n if (!result.approved) {\n toast.error(result.error ?? `Failed to approve ${label.toLowerCase()}`);\n return;\n }\n setChatInput('');\n toast.success(`${label} approved — agent resuming`);\n // Optimistically update canvas node before SSE arrives (~500ms delay)\n window.dispatchEvent(\n new CustomEvent('shep:feature-approved', {\n detail: { featureId: featureNode.featureId },\n })\n );\n onClose();\n },\n [featureNode, onClose]\n );\n\n const handlePrdApprove = useCallback(\n async (_actionId: string) => {\n if (view.type !== 'feature' || !featureNode) return;\n let payload: PrdApprovalPayload | undefined;\n if (prdData) {\n const changedSelections: QuestionSelectionChange[] = [];\n for (const [questionId, optionId] of Object.entries(prdSelections)) {\n const question = prdData.questions.find((q) => q.id === questionId);\n const option = question?.options.find((o) => o.id === optionId);\n if (question && option) {\n changedSelections.push({ questionId: question.question, selectedOption: option.label });\n }\n }\n payload = { approved: true, changedSelections };\n }\n const result = await approveFeature(featureNode.featureId, payload);\n if (!result.approved) {\n toast.error(result.error ?? 'Failed to approve requirements');\n return;\n }\n setChatInput('');\n toast.success('Requirements approved — agent resuming');\n // Optimistically update canvas node before SSE arrives (~500ms delay)\n window.dispatchEvent(\n new CustomEvent('shep:feature-approved', {\n detail: { featureId: featureNode.featureId },\n })\n );\n setPrdSelections({});\n onClose();\n },\n [view, featureNode, prdData, prdSelections, onClose]\n );\n\n const handleTechApprove = useCallback(() => handleSimpleApprove('Plan'), [handleSimpleApprove]);\n const handleMergeApprove = useCallback(() => handleSimpleApprove('Merge'), [handleSimpleApprove]);\n\n const handleDelete = useCallback(\n async (featureId: string, cleanup?: boolean) => {\n setIsDeleting(true);\n try {\n const result = await deleteFeature(featureId, cleanup);\n if (result.error) {\n toast.error(result.error);\n return;\n }\n deleteSound.play();\n toast.success('Feature deleted successfully');\n router.push('/');\n router.refresh();\n } catch {\n toast.error('Failed to delete feature');\n } finally {\n setIsDeleting(false);\n }\n },\n [router, deleteSound]\n );\n\n // ── Hooks (always called unconditionally per Rules of Hooks) ──────────\n\n const featureActionsInput =\n featureNode?.repositoryPath && featureNode?.branch\n ? {\n repositoryPath: featureNode.repositoryPath,\n branch: featureNode.branch,\n specPath: featureNode.specPath,\n }\n : null;\n const featureActions = useFeatureActions(featureActionsInput);\n\n const featureDeployTarget =\n featureNode?.repositoryPath && featureNode.branch\n ? {\n targetId: featureNode.featureId,\n targetType: 'feature' as const,\n repositoryPath: featureNode.repositoryPath,\n branch: featureNode.branch,\n }\n : null;\n\n const deployAction = useDeployAction(featureDeployTarget);\n const isFeatureDeployActive =\n deployAction.status === 'Booting' || deployAction.status === 'Ready';\n\n // ── Short ID copy ───────────────────────────────────────────────────\n const COPY_FEEDBACK_DELAY = 2000;\n const [idCopied, setIdCopied] = useState(false);\n const handleCopyId = useCallback(() => {\n if (!featureNode?.featureId) return;\n void navigator.clipboard.writeText(featureNode.featureId);\n setIdCopied(true);\n setTimeout(() => setIdCopied(false), COPY_FEEDBACK_DELAY);\n }, [featureNode?.featureId]);\n\n // ── Header ────────────────────────────────────────────────────────────\n\n let header: React.ReactNode = undefined;\n\n if (featureNode) {\n const shortId = featureNode.featureId.slice(0, 8);\n const repoName =\n featureNode.repositoryName ??\n featureNode.repositoryPath.split('/').filter(Boolean).at(-1) ??\n '';\n header = (\n <>\n <div data-testid=\"feature-drawer-header\">\n <DrawerTitle>{featureNode.name}</DrawerTitle>\n {repoName ? (\n <div className=\"flex items-center gap-1.5 pt-0.5\">\n <Code2 className=\"text-muted-foreground size-3.5 shrink-0\" />\n {featureNode.remoteUrl ? (\n <a\n href={featureNode.remoteUrl as string}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs transition-colors\"\n data-testid=\"feature-drawer-repo-link\"\n >\n {repoName}\n <ExternalLink className=\"size-3\" />\n </a>\n ) : (\n <span className=\"text-muted-foreground text-xs\">{repoName}</span>\n )}\n </div>\n ) : null}\n <DrawerDescription className=\"sr-only\">{featureNode.name}</DrawerDescription>\n </div>\n\n {featureActionsInput ? (\n <div className=\"flex items-center gap-2 pt-2\" data-testid=\"feature-drawer-actions\">\n <OpenActionMenu\n actions={featureActions}\n repositoryPath={featureActionsInput.repositoryPath}\n showSpecs={!!featureActionsInput.specPath}\n />\n {featureFlags.envDeploy && featureDeployTarget ? (\n <>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <ActionButton\n label={isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server'}\n onClick={isFeatureDeployActive ? deployAction.stop : deployAction.deploy}\n loading={deployAction.deployLoading || deployAction.stopLoading}\n error={!!deployAction.deployError}\n icon={isFeatureDeployActive ? Square : Play}\n iconOnly\n variant=\"outline\"\n size=\"icon-sm\"\n />\n </span>\n </TooltipTrigger>\n <TooltipContent>\n {isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server'}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n {isFeatureDeployActive ? (\n <DeploymentStatusBadge\n status={deployAction.status}\n url={deployAction.url}\n targetId={featureDeployTarget?.targetId}\n />\n ) : null}\n </>\n ) : null}\n <div className=\"ml-auto flex items-center gap-1.5\">\n <code className=\"bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs\">\n {shortId}\n </code>\n <button\n type=\"button\"\n onClick={handleCopyId}\n className=\"text-muted-foreground hover:text-foreground inline-flex items-center rounded p-0.5 transition-colors\"\n aria-label=\"Copy feature ID\"\n data-testid=\"feature-drawer-copy-id\"\n >\n {idCopied ? (\n <Check className=\"size-3.5 text-green-600\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </button>\n </div>\n {featureNode.featureId ? (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Delete feature\"\n disabled={isDeleting}\n className=\"text-muted-foreground hover:text-destructive\"\n data-testid=\"feature-drawer-delete\"\n onClick={() => setDeleteDialogOpen(true)}\n >\n {isDeleting ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Trash2 className=\"size-4\" />\n )}\n </Button>\n <DeleteFeatureDialog\n open={deleteDialogOpen}\n onOpenChange={setDeleteDialogOpen}\n onConfirm={(cleanup) => handleDelete(featureNode.featureId, cleanup)}\n isDeleting={isDeleting}\n featureName={featureNode.name}\n featureId={featureNode.featureId}\n />\n </>\n ) : null}\n </div>\n ) : null}\n </>\n );\n }\n\n // ── Body ──────────────────────────────────────────────────────────────\n\n let body: React.ReactNode = null;\n\n if (view.type === 'feature' && featureNode) {\n body = (\n <FeatureDrawerTabs\n featureNode={featureNode}\n featureId={featureNode.featureId}\n initialTab={view.initialTab}\n urlTab={urlTab}\n sseEvents={events}\n prdData={prdData}\n prdSelections={prdSelections}\n onPrdSelect={(qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId }))}\n onPrdApprove={handlePrdApprove}\n onPrdReject={handlePrdReject}\n isPrdLoading={isLoadingPrd}\n techData={techData}\n onTechApprove={handleTechApprove}\n onTechReject={handleTechReject}\n isTechLoading={isLoadingTech}\n productData={isLoadingTechProduct ? null : techProductData}\n mergeData={mergeData}\n onMergeApprove={handleMergeApprove}\n onMergeReject={handleMergeReject}\n isMergeLoading={isLoadingMerge}\n isRejecting={isRejecting}\n chatInput={chatInput}\n onChatInputChange={setChatInput}\n />\n );\n }\n\n return (\n <BaseDrawer\n open={isOpen}\n onClose={attemptClose}\n size=\"md\"\n modal={false}\n header={header}\n data-testid={view.type === 'feature' ? 'feature-drawer' : 'repository-drawer'}\n >\n {body}\n </BaseDrawer>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"7058dc441303c1826b9c1b5b1f6f3c2649f68ba8f7\":\"rejectFeature\"},\"src/presentation/web/app/actions/reject-feature.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"7058dc441303c1826b9c1b5b1f6f3c2649f68ba8f7\",callServer,void 0,findSourceMapURL,\"rejectFeature\");export{$$RSC_SERVER_ACTION_0 as rejectFeature};","/* __next_internal_action_entry_do_not_use__ [{\"40c980025b80478071fbf1a3186c40e2617904cb48\":\"getFeatureArtifact\"},\"src/presentation/web/app/actions/get-feature-artifact.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40c980025b80478071fbf1a3186c40e2617904cb48\",callServer,void 0,findSourceMapURL,\"getFeatureArtifact\");export{$$RSC_SERVER_ACTION_0 as getFeatureArtifact};","/* __next_internal_action_entry_do_not_use__ [{\"402e79faba18617f065025f77da5616b83c6e35731\":\"getResearchArtifact\"},\"src/presentation/web/app/actions/get-research-artifact.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"402e79faba18617f065025f77da5616b83c6e35731\",callServer,void 0,findSourceMapURL,\"getResearchArtifact\");export{$$RSC_SERVER_ACTION_0 as getResearchArtifact};","/* __next_internal_action_entry_do_not_use__ [{\"408910c395c221becfb0b9501cd78223d9a11ab64c\":\"getMergeReviewData\"},\"src/presentation/web/app/actions/get-merge-review-data.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"408910c395c221becfb0b9501cd78223d9a11ab64c\",callServer,void 0,findSourceMapURL,\"getMergeReviewData\");export{$$RSC_SERVER_ACTION_0 as getMergeReviewData};","\"use client\";\n\n// src/menu.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs, composeRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive, dispatchDiscreteCustomEvent } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { hideOthers } from \"aria-hidden\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { jsx } from \"react/jsx-runtime\";\nvar SELECTION_KEYS = [\"Enter\", \" \"];\nvar FIRST_KEYS = [\"ArrowDown\", \"PageUp\", \"Home\"];\nvar LAST_KEYS = [\"ArrowUp\", \"PageDown\", \"End\"];\nvar FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS];\nvar SUB_OPEN_KEYS = {\n ltr: [...SELECTION_KEYS, \"ArrowRight\"],\n rtl: [...SELECTION_KEYS, \"ArrowLeft\"]\n};\nvar SUB_CLOSE_KEYS = {\n ltr: [\"ArrowLeft\"],\n rtl: [\"ArrowRight\"]\n};\nvar MENU_NAME = \"Menu\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(MENU_NAME);\nvar [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, [\n createCollectionScope,\n createPopperScope,\n createRovingFocusGroupScope\n]);\nvar usePopperScope = createPopperScope();\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [MenuProvider, useMenuContext] = createMenuContext(MENU_NAME);\nvar [MenuRootProvider, useMenuRootContext] = createMenuContext(MENU_NAME);\nvar Menu = (props) => {\n const { __scopeMenu, open = false, children, dir, onOpenChange, modal = true } = props;\n const popperScope = usePopperScope(__scopeMenu);\n const [content, setContent] = React.useState(null);\n const isUsingKeyboardRef = React.useRef(false);\n const handleOpenChange = useCallbackRef(onOpenChange);\n const direction = useDirection(dir);\n React.useEffect(() => {\n const handleKeyDown = () => {\n isUsingKeyboardRef.current = true;\n document.addEventListener(\"pointerdown\", handlePointer, { capture: true, once: true });\n document.addEventListener(\"pointermove\", handlePointer, { capture: true, once: true });\n };\n const handlePointer = () => isUsingKeyboardRef.current = false;\n document.addEventListener(\"keydown\", handleKeyDown, { capture: true });\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown, { capture: true });\n document.removeEventListener(\"pointerdown\", handlePointer, { capture: true });\n document.removeEventListener(\"pointermove\", handlePointer, { capture: true });\n };\n }, []);\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n MenuProvider,\n {\n scope: __scopeMenu,\n open,\n onOpenChange: handleOpenChange,\n content,\n onContentChange: setContent,\n children: /* @__PURE__ */ jsx(\n MenuRootProvider,\n {\n scope: __scopeMenu,\n onClose: React.useCallback(() => handleOpenChange(false), [handleOpenChange]),\n isUsingKeyboardRef,\n dir: direction,\n modal,\n children\n }\n )\n }\n ) });\n};\nMenu.displayName = MENU_NAME;\nvar ANCHOR_NAME = \"MenuAnchor\";\nvar MenuAnchor = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...anchorProps } = props;\n const popperScope = usePopperScope(__scopeMenu);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });\n }\n);\nMenuAnchor.displayName = ANCHOR_NAME;\nvar PORTAL_NAME = \"MenuPortal\";\nvar [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar MenuPortal = (props) => {\n const { __scopeMenu, forceMount, children, container } = props;\n const context = useMenuContext(PORTAL_NAME, __scopeMenu);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeMenu, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n};\nMenuPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"MenuContent\";\nvar [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME);\nvar MenuContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeMenu, children: rootContext.modal ? /* @__PURE__ */ jsx(MenuRootContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(MenuRootContentNonModal, { ...contentProps, ref: forwardedRef }) }) }) });\n }\n);\nvar MenuRootContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n React.useEffect(() => {\n const content = ref.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(\n MenuContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: context.open,\n disableOutsideScroll: true,\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault(),\n { checkForDefaultPrevented: false }\n ),\n onDismiss: () => context.onOpenChange(false)\n }\n );\n }\n);\nvar MenuRootContentNonModal = React.forwardRef((props, forwardedRef) => {\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n return /* @__PURE__ */ jsx(\n MenuContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n disableOutsideScroll: false,\n onDismiss: () => context.onOpenChange(false)\n }\n );\n});\nvar Slot = createSlot(\"MenuContent.ScrollLock\");\nvar MenuContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeMenu,\n loop = false,\n trapFocus,\n onOpenAutoFocus,\n onCloseAutoFocus,\n disableOutsidePointerEvents,\n onEntryFocus,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n onDismiss,\n disableOutsideScroll,\n ...contentProps\n } = props;\n const context = useMenuContext(CONTENT_NAME, __scopeMenu);\n const rootContext = useMenuRootContext(CONTENT_NAME, __scopeMenu);\n const popperScope = usePopperScope(__scopeMenu);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);\n const getItems = useCollection(__scopeMenu);\n const [currentItemId, setCurrentItemId] = React.useState(null);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef, context.onContentChange);\n const timerRef = React.useRef(0);\n const searchRef = React.useRef(\"\");\n const pointerGraceTimerRef = React.useRef(0);\n const pointerGraceIntentRef = React.useRef(null);\n const pointerDirRef = React.useRef(\"right\");\n const lastPointerXRef = React.useRef(0);\n const ScrollLockWrapper = disableOutsideScroll ? RemoveScroll : React.Fragment;\n const scrollLockWrapperProps = disableOutsideScroll ? { as: Slot, allowPinchZoom: true } : void 0;\n const handleTypeaheadSearch = (key) => {\n const search = searchRef.current + key;\n const items = getItems().filter((item) => !item.disabled);\n const currentItem = document.activeElement;\n const currentMatch = items.find((item) => item.ref.current === currentItem)?.textValue;\n const values = items.map((item) => item.textValue);\n const nextMatch = getNextMatch(values, search, currentMatch);\n const newItem = items.find((item) => item.textValue === nextMatch)?.ref.current;\n (function updateSearch(value) {\n searchRef.current = value;\n window.clearTimeout(timerRef.current);\n if (value !== \"\") timerRef.current = window.setTimeout(() => updateSearch(\"\"), 1e3);\n })(search);\n if (newItem) {\n setTimeout(() => newItem.focus());\n }\n };\n React.useEffect(() => {\n return () => window.clearTimeout(timerRef.current);\n }, []);\n useFocusGuards();\n const isPointerMovingToSubmenu = React.useCallback((event) => {\n const isMovingTowards = pointerDirRef.current === pointerGraceIntentRef.current?.side;\n return isMovingTowards && isPointerInGraceArea(event, pointerGraceIntentRef.current?.area);\n }, []);\n return /* @__PURE__ */ jsx(\n MenuContentProvider,\n {\n scope: __scopeMenu,\n searchRef,\n onItemEnter: React.useCallback(\n (event) => {\n if (isPointerMovingToSubmenu(event)) event.preventDefault();\n },\n [isPointerMovingToSubmenu]\n ),\n onItemLeave: React.useCallback(\n (event) => {\n if (isPointerMovingToSubmenu(event)) return;\n contentRef.current?.focus();\n setCurrentItemId(null);\n },\n [isPointerMovingToSubmenu]\n ),\n onTriggerLeave: React.useCallback(\n (event) => {\n if (isPointerMovingToSubmenu(event)) event.preventDefault();\n },\n [isPointerMovingToSubmenu]\n ),\n pointerGraceTimerRef,\n onPointerGraceIntentChange: React.useCallback((intent) => {\n pointerGraceIntentRef.current = intent;\n }, []),\n children: /* @__PURE__ */ jsx(ScrollLockWrapper, { ...scrollLockWrapperProps, children: /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n trapped: trapFocus,\n onMountAutoFocus: composeEventHandlers(onOpenAutoFocus, (event) => {\n event.preventDefault();\n contentRef.current?.focus({ preventScroll: true });\n }),\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n onDismiss,\n children: /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n dir: rootContext.dir,\n orientation: \"vertical\",\n loop,\n currentTabStopId: currentItemId,\n onCurrentTabStopIdChange: setCurrentItemId,\n onEntryFocus: composeEventHandlers(onEntryFocus, (event) => {\n if (!rootContext.isUsingKeyboardRef.current) event.preventDefault();\n }),\n preventScrollOnEntryFocus: true,\n children: /* @__PURE__ */ jsx(\n PopperPrimitive.Content,\n {\n role: \"menu\",\n \"aria-orientation\": \"vertical\",\n \"data-state\": getOpenState(context.open),\n \"data-radix-menu-content\": \"\",\n dir: rootContext.dir,\n ...popperScope,\n ...contentProps,\n ref: composedRefs,\n style: { outline: \"none\", ...contentProps.style },\n onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {\n const target = event.target;\n const isKeyDownInside = target.closest(\"[data-radix-menu-content]\") === event.currentTarget;\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;\n const isCharacterKey = event.key.length === 1;\n if (isKeyDownInside) {\n if (event.key === \"Tab\") event.preventDefault();\n if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key);\n }\n const content = contentRef.current;\n if (event.target !== content) return;\n if (!FIRST_LAST_KEYS.includes(event.key)) return;\n event.preventDefault();\n const items = getItems().filter((item) => !item.disabled);\n const candidateNodes = items.map((item) => item.ref.current);\n if (LAST_KEYS.includes(event.key)) candidateNodes.reverse();\n focusFirst(candidateNodes);\n }),\n onBlur: composeEventHandlers(props.onBlur, (event) => {\n if (!event.currentTarget.contains(event.target)) {\n window.clearTimeout(timerRef.current);\n searchRef.current = \"\";\n }\n }),\n onPointerMove: composeEventHandlers(\n props.onPointerMove,\n whenMouse((event) => {\n const target = event.target;\n const pointerXHasChanged = lastPointerXRef.current !== event.clientX;\n if (event.currentTarget.contains(target) && pointerXHasChanged) {\n const newDir = event.clientX > lastPointerXRef.current ? \"right\" : \"left\";\n pointerDirRef.current = newDir;\n lastPointerXRef.current = event.clientX;\n }\n })\n )\n }\n )\n }\n )\n }\n )\n }\n ) })\n }\n );\n }\n);\nMenuContent.displayName = CONTENT_NAME;\nvar GROUP_NAME = \"MenuGroup\";\nvar MenuGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...groupProps } = props;\n return /* @__PURE__ */ jsx(Primitive.div, { role: \"group\", ...groupProps, ref: forwardedRef });\n }\n);\nMenuGroup.displayName = GROUP_NAME;\nvar LABEL_NAME = \"MenuLabel\";\nvar MenuLabel = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...labelProps } = props;\n return /* @__PURE__ */ jsx(Primitive.div, { ...labelProps, ref: forwardedRef });\n }\n);\nMenuLabel.displayName = LABEL_NAME;\nvar ITEM_NAME = \"MenuItem\";\nvar ITEM_SELECT = \"menu.itemSelect\";\nvar MenuItem = React.forwardRef(\n (props, forwardedRef) => {\n const { disabled = false, onSelect, ...itemProps } = props;\n const ref = React.useRef(null);\n const rootContext = useMenuRootContext(ITEM_NAME, props.__scopeMenu);\n const contentContext = useMenuContentContext(ITEM_NAME, props.__scopeMenu);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const isPointerDownRef = React.useRef(false);\n const handleSelect = () => {\n const menuItem = ref.current;\n if (!disabled && menuItem) {\n const itemSelectEvent = new CustomEvent(ITEM_SELECT, { bubbles: true, cancelable: true });\n menuItem.addEventListener(ITEM_SELECT, (event) => onSelect?.(event), { once: true });\n dispatchDiscreteCustomEvent(menuItem, itemSelectEvent);\n if (itemSelectEvent.defaultPrevented) {\n isPointerDownRef.current = false;\n } else {\n rootContext.onClose();\n }\n }\n };\n return /* @__PURE__ */ jsx(\n MenuItemImpl,\n {\n ...itemProps,\n ref: composedRefs,\n disabled,\n onClick: composeEventHandlers(props.onClick, handleSelect),\n onPointerDown: (event) => {\n props.onPointerDown?.(event);\n isPointerDownRef.current = true;\n },\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n if (!isPointerDownRef.current) event.currentTarget?.click();\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n const isTypingAhead = contentContext.searchRef.current !== \"\";\n if (disabled || isTypingAhead && event.key === \" \") return;\n if (SELECTION_KEYS.includes(event.key)) {\n event.currentTarget.click();\n event.preventDefault();\n }\n })\n }\n );\n }\n);\nMenuItem.displayName = ITEM_NAME;\nvar MenuItemImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, disabled = false, textValue, ...itemProps } = props;\n const contentContext = useMenuContentContext(ITEM_NAME, __scopeMenu);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const [isFocused, setIsFocused] = React.useState(false);\n const [textContent, setTextContent] = React.useState(\"\");\n React.useEffect(() => {\n const menuItem = ref.current;\n if (menuItem) {\n setTextContent((menuItem.textContent ?? \"\").trim());\n }\n }, [itemProps.children]);\n return /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeMenu,\n disabled,\n textValue: textValue ?? textContent,\n children: /* @__PURE__ */ jsx(RovingFocusGroup.Item, { asChild: true, ...rovingFocusGroupScope, focusable: !disabled, children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"menuitem\",\n \"data-highlighted\": isFocused ? \"\" : void 0,\n \"aria-disabled\": disabled || void 0,\n \"data-disabled\": disabled ? \"\" : void 0,\n ...itemProps,\n ref: composedRefs,\n onPointerMove: composeEventHandlers(\n props.onPointerMove,\n whenMouse((event) => {\n if (disabled) {\n contentContext.onItemLeave(event);\n } else {\n contentContext.onItemEnter(event);\n if (!event.defaultPrevented) {\n const item = event.currentTarget;\n item.focus({ preventScroll: true });\n }\n }\n })\n ),\n onPointerLeave: composeEventHandlers(\n props.onPointerLeave,\n whenMouse((event) => contentContext.onItemLeave(event))\n ),\n onFocus: composeEventHandlers(props.onFocus, () => setIsFocused(true)),\n onBlur: composeEventHandlers(props.onBlur, () => setIsFocused(false))\n }\n ) })\n }\n );\n }\n);\nvar CHECKBOX_ITEM_NAME = \"MenuCheckboxItem\";\nvar MenuCheckboxItem = React.forwardRef(\n (props, forwardedRef) => {\n const { checked = false, onCheckedChange, ...checkboxItemProps } = props;\n return /* @__PURE__ */ jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsx(\n MenuItem,\n {\n role: \"menuitemcheckbox\",\n \"aria-checked\": isIndeterminate(checked) ? \"mixed\" : checked,\n ...checkboxItemProps,\n ref: forwardedRef,\n \"data-state\": getCheckedState(checked),\n onSelect: composeEventHandlers(\n checkboxItemProps.onSelect,\n () => onCheckedChange?.(isIndeterminate(checked) ? true : !checked),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;\nvar RADIO_GROUP_NAME = \"MenuRadioGroup\";\nvar [RadioGroupProvider, useRadioGroupContext] = createMenuContext(\n RADIO_GROUP_NAME,\n { value: void 0, onValueChange: () => {\n } }\n);\nvar MenuRadioGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { value, onValueChange, ...groupProps } = props;\n const handleValueChange = useCallbackRef(onValueChange);\n return /* @__PURE__ */ jsx(RadioGroupProvider, { scope: props.__scopeMenu, value, onValueChange: handleValueChange, children: /* @__PURE__ */ jsx(MenuGroup, { ...groupProps, ref: forwardedRef }) });\n }\n);\nMenuRadioGroup.displayName = RADIO_GROUP_NAME;\nvar RADIO_ITEM_NAME = \"MenuRadioItem\";\nvar MenuRadioItem = React.forwardRef(\n (props, forwardedRef) => {\n const { value, ...radioItemProps } = props;\n const context = useRadioGroupContext(RADIO_ITEM_NAME, props.__scopeMenu);\n const checked = value === context.value;\n return /* @__PURE__ */ jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsx(\n MenuItem,\n {\n role: \"menuitemradio\",\n \"aria-checked\": checked,\n ...radioItemProps,\n ref: forwardedRef,\n \"data-state\": getCheckedState(checked),\n onSelect: composeEventHandlers(\n radioItemProps.onSelect,\n () => context.onValueChange?.(value),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nMenuRadioItem.displayName = RADIO_ITEM_NAME;\nvar ITEM_INDICATOR_NAME = \"MenuItemIndicator\";\nvar [ItemIndicatorProvider, useItemIndicatorContext] = createMenuContext(\n ITEM_INDICATOR_NAME,\n { checked: false }\n);\nvar MenuItemIndicator = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, forceMount, ...itemIndicatorProps } = props;\n const indicatorContext = useItemIndicatorContext(ITEM_INDICATOR_NAME, __scopeMenu);\n return /* @__PURE__ */ jsx(\n Presence,\n {\n present: forceMount || isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true,\n children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n ...itemIndicatorProps,\n ref: forwardedRef,\n \"data-state\": getCheckedState(indicatorContext.checked)\n }\n )\n }\n );\n }\n);\nMenuItemIndicator.displayName = ITEM_INDICATOR_NAME;\nvar SEPARATOR_NAME = \"MenuSeparator\";\nvar MenuSeparator = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...separatorProps } = props;\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"separator\",\n \"aria-orientation\": \"horizontal\",\n ...separatorProps,\n ref: forwardedRef\n }\n );\n }\n);\nMenuSeparator.displayName = SEPARATOR_NAME;\nvar ARROW_NAME = \"MenuArrow\";\nvar MenuArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeMenu);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }\n);\nMenuArrow.displayName = ARROW_NAME;\nvar SUB_NAME = \"MenuSub\";\nvar [MenuSubProvider, useMenuSubContext] = createMenuContext(SUB_NAME);\nvar MenuSub = (props) => {\n const { __scopeMenu, children, open = false, onOpenChange } = props;\n const parentMenuContext = useMenuContext(SUB_NAME, __scopeMenu);\n const popperScope = usePopperScope(__scopeMenu);\n const [trigger, setTrigger] = React.useState(null);\n const [content, setContent] = React.useState(null);\n const handleOpenChange = useCallbackRef(onOpenChange);\n React.useEffect(() => {\n if (parentMenuContext.open === false) handleOpenChange(false);\n return () => handleOpenChange(false);\n }, [parentMenuContext.open, handleOpenChange]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n MenuProvider,\n {\n scope: __scopeMenu,\n open,\n onOpenChange: handleOpenChange,\n content,\n onContentChange: setContent,\n children: /* @__PURE__ */ jsx(\n MenuSubProvider,\n {\n scope: __scopeMenu,\n contentId: useId(),\n triggerId: useId(),\n trigger,\n onTriggerChange: setTrigger,\n children\n }\n )\n }\n ) });\n};\nMenuSub.displayName = SUB_NAME;\nvar SUB_TRIGGER_NAME = \"MenuSubTrigger\";\nvar MenuSubTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const context = useMenuContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const rootContext = useMenuRootContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const subContext = useMenuSubContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const contentContext = useMenuContentContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const openTimerRef = React.useRef(null);\n const { pointerGraceTimerRef, onPointerGraceIntentChange } = contentContext;\n const scope = { __scopeMenu: props.__scopeMenu };\n const clearOpenTimer = React.useCallback(() => {\n if (openTimerRef.current) window.clearTimeout(openTimerRef.current);\n openTimerRef.current = null;\n }, []);\n React.useEffect(() => clearOpenTimer, [clearOpenTimer]);\n React.useEffect(() => {\n const pointerGraceTimer = pointerGraceTimerRef.current;\n return () => {\n window.clearTimeout(pointerGraceTimer);\n onPointerGraceIntentChange(null);\n };\n }, [pointerGraceTimerRef, onPointerGraceIntentChange]);\n return /* @__PURE__ */ jsx(MenuAnchor, { asChild: true, ...scope, children: /* @__PURE__ */ jsx(\n MenuItemImpl,\n {\n id: subContext.triggerId,\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": context.open,\n \"aria-controls\": subContext.contentId,\n \"data-state\": getOpenState(context.open),\n ...props,\n ref: composeRefs(forwardedRef, subContext.onTriggerChange),\n onClick: (event) => {\n props.onClick?.(event);\n if (props.disabled || event.defaultPrevented) return;\n event.currentTarget.focus();\n if (!context.open) context.onOpenChange(true);\n },\n onPointerMove: composeEventHandlers(\n props.onPointerMove,\n whenMouse((event) => {\n contentContext.onItemEnter(event);\n if (event.defaultPrevented) return;\n if (!props.disabled && !context.open && !openTimerRef.current) {\n contentContext.onPointerGraceIntentChange(null);\n openTimerRef.current = window.setTimeout(() => {\n context.onOpenChange(true);\n clearOpenTimer();\n }, 100);\n }\n })\n ),\n onPointerLeave: composeEventHandlers(\n props.onPointerLeave,\n whenMouse((event) => {\n clearOpenTimer();\n const contentRect = context.content?.getBoundingClientRect();\n if (contentRect) {\n const side = context.content?.dataset.side;\n const rightSide = side === \"right\";\n const bleed = rightSide ? -5 : 5;\n const contentNearEdge = contentRect[rightSide ? \"left\" : \"right\"];\n const contentFarEdge = contentRect[rightSide ? \"right\" : \"left\"];\n contentContext.onPointerGraceIntentChange({\n area: [\n // Apply a bleed on clientX to ensure that our exit point is\n // consistently within polygon bounds\n { x: event.clientX + bleed, y: event.clientY },\n { x: contentNearEdge, y: contentRect.top },\n { x: contentFarEdge, y: contentRect.top },\n { x: contentFarEdge, y: contentRect.bottom },\n { x: contentNearEdge, y: contentRect.bottom }\n ],\n side\n });\n window.clearTimeout(pointerGraceTimerRef.current);\n pointerGraceTimerRef.current = window.setTimeout(\n () => contentContext.onPointerGraceIntentChange(null),\n 300\n );\n } else {\n contentContext.onTriggerLeave(event);\n if (event.defaultPrevented) return;\n contentContext.onPointerGraceIntentChange(null);\n }\n })\n ),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n const isTypingAhead = contentContext.searchRef.current !== \"\";\n if (props.disabled || isTypingAhead && event.key === \" \") return;\n if (SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {\n context.onOpenChange(true);\n context.content?.focus();\n event.preventDefault();\n }\n })\n }\n ) });\n }\n);\nMenuSubTrigger.displayName = SUB_TRIGGER_NAME;\nvar SUB_CONTENT_NAME = \"MenuSubContent\";\nvar MenuSubContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);\n const { forceMount = portalContext.forceMount, ...subContentProps } = props;\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);\n const subContext = useMenuSubContext(SUB_CONTENT_NAME, props.__scopeMenu);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(\n MenuContentImpl,\n {\n id: subContext.contentId,\n \"aria-labelledby\": subContext.triggerId,\n ...subContentProps,\n ref: composedRefs,\n align: \"start\",\n side: rootContext.dir === \"rtl\" ? \"left\" : \"right\",\n disableOutsidePointerEvents: false,\n disableOutsideScroll: false,\n trapFocus: false,\n onOpenAutoFocus: (event) => {\n if (rootContext.isUsingKeyboardRef.current) ref.current?.focus();\n event.preventDefault();\n },\n onCloseAutoFocus: (event) => event.preventDefault(),\n onFocusOutside: composeEventHandlers(props.onFocusOutside, (event) => {\n if (event.target !== subContext.trigger) context.onOpenChange(false);\n }),\n onEscapeKeyDown: composeEventHandlers(props.onEscapeKeyDown, (event) => {\n rootContext.onClose();\n event.preventDefault();\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n const isKeyDownInside = event.currentTarget.contains(event.target);\n const isCloseKey = SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);\n if (isKeyDownInside && isCloseKey) {\n context.onOpenChange(false);\n subContext.trigger?.focus();\n event.preventDefault();\n }\n })\n }\n ) }) }) });\n }\n);\nMenuSubContent.displayName = SUB_CONTENT_NAME;\nfunction getOpenState(open) {\n return open ? \"open\" : \"closed\";\n}\nfunction isIndeterminate(checked) {\n return checked === \"indeterminate\";\n}\nfunction getCheckedState(checked) {\n return isIndeterminate(checked) ? \"indeterminate\" : checked ? \"checked\" : \"unchecked\";\n}\nfunction focusFirst(candidates) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus();\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nfunction getNextMatch(values, search, currentMatch) {\n const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);\n const normalizedSearch = isRepeated ? search[0] : search;\n const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1;\n let wrappedValues = wrapArray(values, Math.max(currentMatchIndex, 0));\n const excludeCurrentMatch = normalizedSearch.length === 1;\n if (excludeCurrentMatch) wrappedValues = wrappedValues.filter((v) => v !== currentMatch);\n const nextMatch = wrappedValues.find(\n (value) => value.toLowerCase().startsWith(normalizedSearch.toLowerCase())\n );\n return nextMatch !== currentMatch ? nextMatch : void 0;\n}\nfunction isPointInPolygon(point, polygon) {\n const { x, y } = point;\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const ii = polygon[i];\n const jj = polygon[j];\n const xi = ii.x;\n const yi = ii.y;\n const xj = jj.x;\n const yj = jj.y;\n const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n}\nfunction isPointerInGraceArea(event, area) {\n if (!area) return false;\n const cursorPos = { x: event.clientX, y: event.clientY };\n return isPointInPolygon(cursorPos, area);\n}\nfunction whenMouse(handler) {\n return (event) => event.pointerType === \"mouse\" ? handler(event) : void 0;\n}\nvar Root3 = Menu;\nvar Anchor2 = MenuAnchor;\nvar Portal = MenuPortal;\nvar Content2 = MenuContent;\nvar Group = MenuGroup;\nvar Label = MenuLabel;\nvar Item2 = MenuItem;\nvar CheckboxItem = MenuCheckboxItem;\nvar RadioGroup = MenuRadioGroup;\nvar RadioItem = MenuRadioItem;\nvar ItemIndicator = MenuItemIndicator;\nvar Separator = MenuSeparator;\nvar Arrow2 = MenuArrow;\nvar Sub = MenuSub;\nvar SubTrigger = MenuSubTrigger;\nvar SubContent = MenuSubContent;\nexport {\n Anchor2 as Anchor,\n Arrow2 as Arrow,\n CheckboxItem,\n Content2 as Content,\n Group,\n Item2 as Item,\n ItemIndicator,\n Label,\n Menu,\n MenuAnchor,\n MenuArrow,\n MenuCheckboxItem,\n MenuContent,\n MenuGroup,\n MenuItem,\n MenuItemIndicator,\n MenuLabel,\n MenuPortal,\n MenuRadioGroup,\n MenuRadioItem,\n MenuSeparator,\n MenuSub,\n MenuSubContent,\n MenuSubTrigger,\n Portal,\n RadioGroup,\n RadioItem,\n Root3 as Root,\n Separator,\n Sub,\n SubContent,\n SubTrigger,\n createMenuScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/dropdown-menu.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { composeRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as MenuPrimitive from \"@radix-ui/react-menu\";\nimport { createMenuScope } from \"@radix-ui/react-menu\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar DROPDOWN_MENU_NAME = \"DropdownMenu\";\nvar [createDropdownMenuContext, createDropdownMenuScope] = createContextScope(\n DROPDOWN_MENU_NAME,\n [createMenuScope]\n);\nvar useMenuScope = createMenuScope();\nvar [DropdownMenuProvider, useDropdownMenuContext] = createDropdownMenuContext(DROPDOWN_MENU_NAME);\nvar DropdownMenu = (props) => {\n const {\n __scopeDropdownMenu,\n children,\n dir,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true\n } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const triggerRef = React.useRef(null);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: DROPDOWN_MENU_NAME\n });\n return /* @__PURE__ */ jsx(\n DropdownMenuProvider,\n {\n scope: __scopeDropdownMenu,\n triggerId: useId(),\n triggerRef,\n contentId: useId(),\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n modal,\n children: /* @__PURE__ */ jsx(MenuPrimitive.Root, { ...menuScope, open, onOpenChange: setOpen, dir, modal, children })\n }\n );\n};\nDropdownMenu.displayName = DROPDOWN_MENU_NAME;\nvar TRIGGER_NAME = \"DropdownMenuTrigger\";\nvar DropdownMenuTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, disabled = false, ...triggerProps } = props;\n const context = useDropdownMenuContext(TRIGGER_NAME, __scopeDropdownMenu);\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Anchor, { asChild: true, ...menuScope, children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n id: context.triggerId,\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.open ? context.contentId : void 0,\n \"data-state\": context.open ? \"open\" : \"closed\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n ...triggerProps,\n ref: composeRefs(forwardedRef, context.triggerRef),\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onOpenToggle();\n if (!context.open) event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (disabled) return;\n if ([\"Enter\", \" \"].includes(event.key)) context.onOpenToggle();\n if (event.key === \"ArrowDown\") context.onOpenChange(true);\n if ([\"Enter\", \" \", \"ArrowDown\"].includes(event.key)) event.preventDefault();\n })\n }\n ) });\n }\n);\nDropdownMenuTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"DropdownMenuPortal\";\nvar DropdownMenuPortal = (props) => {\n const { __scopeDropdownMenu, ...portalProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Portal, { ...menuScope, ...portalProps });\n};\nDropdownMenuPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"DropdownMenuContent\";\nvar DropdownMenuContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...contentProps } = props;\n const context = useDropdownMenuContext(CONTENT_NAME, __scopeDropdownMenu);\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const hasInteractedOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n MenuPrimitive.Content,\n {\n id: context.contentId,\n \"aria-labelledby\": context.triggerId,\n ...menuScope,\n ...contentProps,\n ref: forwardedRef,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n hasInteractedOutsideRef.current = false;\n event.preventDefault();\n }),\n onInteractOutside: composeEventHandlers(props.onInteractOutside, (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (!context.modal || isRightClick) hasInteractedOutsideRef.current = true;\n }),\n style: {\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-dropdown-menu-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-dropdown-menu-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-dropdown-menu-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-dropdown-menu-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-dropdown-menu-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n );\n }\n);\nDropdownMenuContent.displayName = CONTENT_NAME;\nvar GROUP_NAME = \"DropdownMenuGroup\";\nvar DropdownMenuGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...groupProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Group, { ...menuScope, ...groupProps, ref: forwardedRef });\n }\n);\nDropdownMenuGroup.displayName = GROUP_NAME;\nvar LABEL_NAME = \"DropdownMenuLabel\";\nvar DropdownMenuLabel = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...labelProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Label, { ...menuScope, ...labelProps, ref: forwardedRef });\n }\n);\nDropdownMenuLabel.displayName = LABEL_NAME;\nvar ITEM_NAME = \"DropdownMenuItem\";\nvar DropdownMenuItem = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...itemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Item, { ...menuScope, ...itemProps, ref: forwardedRef });\n }\n);\nDropdownMenuItem.displayName = ITEM_NAME;\nvar CHECKBOX_ITEM_NAME = \"DropdownMenuCheckboxItem\";\nvar DropdownMenuCheckboxItem = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...checkboxItemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.CheckboxItem, { ...menuScope, ...checkboxItemProps, ref: forwardedRef });\n});\nDropdownMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;\nvar RADIO_GROUP_NAME = \"DropdownMenuRadioGroup\";\nvar DropdownMenuRadioGroup = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...radioGroupProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.RadioGroup, { ...menuScope, ...radioGroupProps, ref: forwardedRef });\n});\nDropdownMenuRadioGroup.displayName = RADIO_GROUP_NAME;\nvar RADIO_ITEM_NAME = \"DropdownMenuRadioItem\";\nvar DropdownMenuRadioItem = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...radioItemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.RadioItem, { ...menuScope, ...radioItemProps, ref: forwardedRef });\n});\nDropdownMenuRadioItem.displayName = RADIO_ITEM_NAME;\nvar INDICATOR_NAME = \"DropdownMenuItemIndicator\";\nvar DropdownMenuItemIndicator = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...itemIndicatorProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.ItemIndicator, { ...menuScope, ...itemIndicatorProps, ref: forwardedRef });\n});\nDropdownMenuItemIndicator.displayName = INDICATOR_NAME;\nvar SEPARATOR_NAME = \"DropdownMenuSeparator\";\nvar DropdownMenuSeparator = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...separatorProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Separator, { ...menuScope, ...separatorProps, ref: forwardedRef });\n});\nDropdownMenuSeparator.displayName = SEPARATOR_NAME;\nvar ARROW_NAME = \"DropdownMenuArrow\";\nvar DropdownMenuArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...arrowProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Arrow, { ...menuScope, ...arrowProps, ref: forwardedRef });\n }\n);\nDropdownMenuArrow.displayName = ARROW_NAME;\nvar DropdownMenuSub = (props) => {\n const { __scopeDropdownMenu, children, open: openProp, onOpenChange, defaultOpen } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: \"DropdownMenuSub\"\n });\n return /* @__PURE__ */ jsx(MenuPrimitive.Sub, { ...menuScope, open, onOpenChange: setOpen, children });\n};\nvar SUB_TRIGGER_NAME = \"DropdownMenuSubTrigger\";\nvar DropdownMenuSubTrigger = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...subTriggerProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.SubTrigger, { ...menuScope, ...subTriggerProps, ref: forwardedRef });\n});\nDropdownMenuSubTrigger.displayName = SUB_TRIGGER_NAME;\nvar SUB_CONTENT_NAME = \"DropdownMenuSubContent\";\nvar DropdownMenuSubContent = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...subContentProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(\n MenuPrimitive.SubContent,\n {\n ...menuScope,\n ...subContentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-dropdown-menu-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-dropdown-menu-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-dropdown-menu-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-dropdown-menu-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-dropdown-menu-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n );\n});\nDropdownMenuSubContent.displayName = SUB_CONTENT_NAME;\nvar Root2 = DropdownMenu;\nvar Trigger = DropdownMenuTrigger;\nvar Portal2 = DropdownMenuPortal;\nvar Content2 = DropdownMenuContent;\nvar Group2 = DropdownMenuGroup;\nvar Label2 = DropdownMenuLabel;\nvar Item2 = DropdownMenuItem;\nvar CheckboxItem2 = DropdownMenuCheckboxItem;\nvar RadioGroup2 = DropdownMenuRadioGroup;\nvar RadioItem2 = DropdownMenuRadioItem;\nvar ItemIndicator2 = DropdownMenuItemIndicator;\nvar Separator2 = DropdownMenuSeparator;\nvar Arrow2 = DropdownMenuArrow;\nvar Sub2 = DropdownMenuSub;\nvar SubTrigger2 = DropdownMenuSubTrigger;\nvar SubContent2 = DropdownMenuSubContent;\nexport {\n Arrow2 as Arrow,\n CheckboxItem2 as CheckboxItem,\n Content2 as Content,\n DropdownMenu,\n DropdownMenuArrow,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuItemIndicator,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n Group2 as Group,\n Item2 as Item,\n ItemIndicator2 as ItemIndicator,\n Label2 as Label,\n Portal2 as Portal,\n RadioGroup2 as RadioGroup,\n RadioItem2 as RadioItem,\n Root2 as Root,\n Separator2 as Separator,\n Sub2 as Sub,\n SubContent2 as SubContent,\n SubTrigger2 as SubTrigger,\n Trigger,\n createDropdownMenuScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as React from 'react';\nimport { DropdownMenu as DropdownMenuPrimitive } from 'radix-ui';\nimport { Check, ChevronRight, Circle } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'focus:bg-accent data-[state=open]:bg-accent flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n inset && 'pl-8',\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg',\n className\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-md',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm transition-colors outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center rounded-sm py-1.5 pr-2 pl-8 text-sm transition-colors outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center rounded-sm py-1.5 pr-2 pl-8 text-sm transition-colors outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('bg-muted -mx-1 my-1 h-px', className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\n );\n};\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n","'use client';\n\nimport { useState } from 'react';\nimport {\n Code2,\n Terminal,\n FolderOpen,\n ChevronDown,\n Copy,\n Check,\n Loader2,\n CircleAlert,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport type { OpenActionMenuProps } from './config';\n\nconst COPY_FEEDBACK_DELAY = 2000;\n\nexport function OpenActionMenu({ actions, repositoryPath, showSpecs }: OpenActionMenuProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopyPath = () => {\n void navigator.clipboard.writeText(repositoryPath);\n setCopied(true);\n setTimeout(() => setCopied(false), COPY_FEEDBACK_DELAY);\n };\n\n const anyLoading = actions.ideLoading || actions.shellLoading || actions.specsLoading;\n const anyError = actions.ideError ?? actions.shellError ?? actions.specsError;\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-1.5\" disabled={anyLoading}>\n {anyLoading ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : anyError ? (\n <CircleAlert className=\"text-destructive size-4\" />\n ) : (\n <FolderOpen className=\"size-4\" />\n )}\n Open\n <ChevronDown className=\"size-3 opacity-60\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-48\">\n <DropdownMenuLabel>Open in</DropdownMenuLabel>\n\n <DropdownMenuItem\n onClick={actions.openInIde}\n disabled={actions.ideLoading}\n className=\"gap-2\"\n >\n {actions.ideLoading ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : actions.ideError ? (\n <CircleAlert className=\"text-destructive size-4\" />\n ) : (\n <Code2 className=\"size-4\" />\n )}\n IDE\n </DropdownMenuItem>\n\n <DropdownMenuItem\n onClick={actions.openInShell}\n disabled={actions.shellLoading}\n className=\"gap-2\"\n >\n {actions.shellLoading ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : actions.shellError ? (\n <CircleAlert className=\"text-destructive size-4\" />\n ) : (\n <Terminal className=\"size-4\" />\n )}\n Terminal\n </DropdownMenuItem>\n\n <DropdownMenuItem\n onClick={actions.openSpecsFolder}\n disabled={actions.specsLoading || !showSpecs}\n className=\"gap-2\"\n >\n {actions.specsLoading ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : actions.specsError ? (\n <CircleAlert className=\"text-destructive size-4\" />\n ) : (\n <FolderOpen className=\"size-4\" />\n )}\n Specs Folder\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n\n <DropdownMenuItem onClick={handleCopyPath} className=\"gap-2\">\n {copied ? <Check className=\"size-4 text-green-600\" /> : <Copy className=\"size-4\" />}\n {copied ? 'Copied!' : 'Copy path'}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40b49dc2c181ebabcdb9b4fdc5e1167a0f40b38043\":\"getFeaturePhaseTimings\"},\"src/presentation/web/app/actions/get-feature-phase-timings.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40b49dc2c181ebabcdb9b4fdc5e1167a0f40b38043\",callServer,void 0,findSourceMapURL,\"getFeaturePhaseTimings\");export{$$RSC_SERVER_ACTION_0 as getFeaturePhaseTimings};","/* __next_internal_action_entry_do_not_use__ [{\"600354d7eab1d8e5402851de743290fb8df9bf8ddf\":\"approveFeature\"},\"src/presentation/web/app/actions/approve-feature.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"600354d7eab1d8e5402851de743290fb8df9bf8ddf\",callServer,void 0,findSourceMapURL,\"approveFeature\");export{$$RSC_SERVER_ACTION_0 as approveFeature};","'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { PaperclipIcon, Send, ChevronLeft, Check, AlertTriangle } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { AttachmentChip } from '@/components/common/attachment-chip';\nimport { pickFiles } from '@/components/common/feature-create-drawer/pick-files';\nimport type { DrawerActionBarProps, RejectAttachment } from './drawer-action-bar-config';\n\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB\n\nconst ALLOWED_EXTENSIONS = new Set([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.webp',\n '.svg',\n '.bmp',\n '.ico',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.txt',\n '.md',\n '.csv',\n '.json',\n '.yaml',\n '.yml',\n '.xml',\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.rb',\n '.go',\n '.rs',\n '.java',\n '.c',\n '.cpp',\n '.h',\n '.hpp',\n '.cs',\n '.swift',\n '.kt',\n '.html',\n '.css',\n '.scss',\n '.less',\n '.sh',\n '.bash',\n '.zsh',\n '.fish',\n '.toml',\n '.ini',\n '.cfg',\n '.conf',\n '.env',\n '.zip',\n '.tar',\n '.gz',\n '.log',\n]);\n\nfunction getExtension(filename: string): string {\n const dot = filename.lastIndexOf('.');\n return dot >= 0 ? filename.slice(dot).toLowerCase() : '';\n}\n\nexport function DrawerActionBar({\n onReject,\n onApprove,\n approveLabel,\n approveVariant = 'default',\n revisionPlaceholder,\n isProcessing = false,\n isRejecting = false,\n children,\n chatInput: controlledChatInput,\n onChatInputChange,\n}: DrawerActionBarProps) {\n const isWarning = approveVariant === 'warning';\n const ApproveIcon = isWarning ? AlertTriangle : Check;\n const accentBg = isWarning ? 'bg-orange-500/85' : 'bg-blue-500/85';\n const accentBorder = isWarning ? 'border-orange-400/60' : 'border-blue-400/60';\n const [internalChatInput, setInternalChatInput] = useState('');\n const chatInput = controlledChatInput ?? internalChatInput;\n const setChatInput = onChatInputChange ?? setInternalChatInput;\n const approveSound = useSoundAction('approve');\n const disabled = isProcessing || isRejecting;\n\n const [attachments, setAttachments] = useState<RejectAttachment[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [hoverExpanded, setHoverExpanded] = useState(false);\n const [ctrlHeld, setCtrlHeld] = useState(false);\n const [shiftHeld, setShiftHeld] = useState(false);\n const hasText = chatInput.trim().length > 0;\n const approveExpanded = hasText ? hoverExpanded || (ctrlHeld && shiftHeld) : !hoverExpanded;\n const rejectHighlighted = hasText ? ctrlHeld && !shiftHeld : false;\n const dragCounterRef = useRef(0);\n const sessionIdRef = useRef(crypto.randomUUID());\n const formRef = useRef<HTMLFormElement>(null);\n\n // Track Ctrl/Meta + Shift keys for button state\n useEffect(() => {\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Control' || e.key === 'Meta') setCtrlHeld(true);\n if (e.key === 'Shift') setShiftHeld(true);\n }\n function onKeyUp(e: KeyboardEvent) {\n if (e.key === 'Control' || e.key === 'Meta') setCtrlHeld(false);\n if (e.key === 'Shift') setShiftHeld(false);\n }\n function onBlur() {\n setCtrlHeld(false);\n setShiftHeld(false);\n }\n window.addEventListener('keydown', onKeyDown);\n window.addEventListener('keyup', onKeyUp);\n window.addEventListener('blur', onBlur);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('keyup', onKeyUp);\n window.removeEventListener('blur', onBlur);\n };\n }, []);\n\n const handleFiles = useCallback(async (fileList: File[]) => {\n setUploadError(null);\n\n for (const file of fileList) {\n if (file.size > MAX_FILE_SIZE) {\n setUploadError(`\"${file.name}\" exceeds 10 MB limit`);\n return;\n }\n const ext = getExtension(file.name);\n if (ext && !ALLOWED_EXTENSIONS.has(ext)) {\n setUploadError(`File type \"${ext}\" is not allowed`);\n return;\n }\n }\n\n for (const file of fileList) {\n const tempId = crypto.randomUUID();\n\n setAttachments((prev) => [\n ...prev,\n {\n id: tempId,\n name: file.name,\n size: file.size,\n mimeType: file.type || 'application/octet-stream',\n path: '',\n loading: true,\n },\n ]);\n\n try {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('sessionId', sessionIdRef.current);\n\n const res = await fetch('/api/attachments/upload', {\n method: 'POST',\n body: formData,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: 'Upload failed' }));\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError(body.error ?? 'Upload failed');\n return;\n }\n\n const uploaded = await res.json();\n setAttachments((prev) => {\n const isDupe = prev.some((a) => a.id !== tempId && a.path === uploaded.path);\n if (isDupe) return prev.filter((a) => a.id !== tempId);\n return prev.map((a) =>\n a.id === tempId ? { ...uploaded, id: tempId, loading: false } : a\n );\n });\n } catch {\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError('Upload failed');\n }\n }\n }, []);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current += 1;\n if (dragCounterRef.current === 1) setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current -= 1;\n if (dragCounterRef.current === 0) setIsDragOver(false);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current = 0;\n setIsDragOver(false);\n const files = Array.from(e.dataTransfer.files);\n if (files.length > 0) handleFiles(files);\n },\n [handleFiles]\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n const files: File[] = [];\n for (const item of Array.from(items)) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) files.push(file);\n }\n }\n if (files.length > 0) {\n e.preventDefault();\n handleFiles(files);\n }\n },\n [handleFiles]\n );\n\n const handleAddFiles = useCallback(async () => {\n try {\n const files = await pickFiles();\n if (files) {\n setAttachments((prev) => {\n const existingPaths = new Set(prev.map((f) => f.path));\n const unique = files\n .filter((f) => !existingPaths.has(f.path))\n .map(\n (f): RejectAttachment => ({\n id: crypto.randomUUID(),\n name: f.name,\n size: f.size,\n mimeType: 'application/octet-stream',\n path: f.path,\n })\n );\n return unique.length > 0 ? [...prev, ...unique] : prev;\n });\n }\n } catch {\n // Native dialog failed — silently ignore\n }\n }, []);\n\n const handleRemoveFile = useCallback((id: string) => {\n setAttachments((prev) => prev.filter((f) => f.id !== id));\n }, []);\n\n const clearForm = useCallback(() => {\n setChatInput('');\n setAttachments([]);\n setUploadError(null);\n }, [setChatInput]);\n\n function handleFormSubmit(e: { preventDefault: () => void }) {\n e.preventDefault();\n const text = chatInput.trim();\n\n if (approveExpanded) {\n // Approve mode\n approveSound.play();\n onApprove();\n clearForm();\n } else {\n // Reject mode — text required\n if (!text || !onReject) return;\n onReject(\n text,\n attachments.filter((a) => !a.loading)\n );\n clearForm();\n }\n }\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault();\n // Ctrl+Shift+Enter = approve, Ctrl+Enter = reject\n formRef.current?.requestSubmit();\n }\n }, []);\n\n const modKey =\n typeof navigator !== 'undefined' && /Mac/i.test(navigator.userAgent) ? '⌘' : 'Ctrl';\n\n return (\n <div className=\"border-border shrink-0 border-t\">\n {children}\n {onReject ? (\n <TooltipProvider delayDuration={400}>\n <form ref={formRef} onSubmit={handleFormSubmit} className=\"p-3\">\n <div\n role=\"region\"\n aria-label=\"File drop zone\"\n data-drag-over={isDragOver ? 'true' : 'false'}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn(\n 'rounded-md border-2 border-transparent transition-colors',\n isDragOver && 'border-primary/50 bg-primary/5'\n )}\n >\n <div className=\"border-input focus-within:ring-ring/50 focus-within:border-ring flex flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] focus-within:ring-[3px]\">\n <Textarea\n placeholder={revisionPlaceholder ?? 'Ask AI to revise...'}\n aria-label={revisionPlaceholder ?? 'Ask AI to revise...'}\n disabled={disabled}\n value={chatInput}\n onChange={(e) => setChatInput(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n rows={3}\n className=\"max-h-[35dvh] min-h-0 flex-1 resize-none overflow-y-auto rounded-none border-0 shadow-none focus-visible:ring-0\"\n data-testid=\"drawer-chat-input\"\n />\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5 px-3 py-2\">\n {attachments.map((file) => (\n <AttachmentChip\n key={file.id}\n name={file.name}\n size={file.size}\n mimeType={file.mimeType}\n path={file.path}\n onRemove={() => handleRemoveFile(file.id)}\n disabled={disabled}\n loading={file.loading}\n />\n ))}\n </div>\n )}\n {uploadError ? (\n <p className=\"text-destructive px-3 pb-2 text-xs\">{uploadError}</p>\n ) : null}\n <div className=\"border-input flex items-center gap-2 border-t px-3 py-1.5\">\n <span className=\"text-muted-foreground flex-1 truncate text-[11px]\">\n <kbd className=\"bg-muted rounded px-1 py-0.5 font-mono text-[10px]\">\n {modKey}+Enter\n </kbd>{' '}\n {hasText ? 'reject' : 'approve'}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={handleAddFiles}\n disabled={disabled}\n aria-label=\"Attach files\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors\"\n >\n <PaperclipIcon className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Attach files</TooltipContent>\n </Tooltip>\n\n {/* Single action button: Approve when empty, Reject when text present */}\n <div onMouseLeave={() => setHoverExpanded(false)}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"submit\"\n disabled={disabled}\n data-testid=\"drawer-action-submit\"\n className={cn(\n 'relative flex h-9 min-w-[12rem] cursor-pointer items-center overflow-hidden rounded-md border pr-10 pl-4 text-sm font-medium whitespace-nowrap transition-colors',\n 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n approveExpanded\n ? `${accentBorder} text-white`\n : rejectHighlighted\n ? 'border-primary bg-muted ring-primary/30 shadow-sm ring-1'\n : 'border-border bg-muted/50 hover:bg-muted shadow-sm'\n )}\n >\n {/* Accent fill — slides in from right */}\n <div\n className={cn(\n 'pointer-events-none absolute inset-0 transition-transform duration-300 ease-in-out',\n accentBg\n )}\n style={{\n transform: approveExpanded ? 'translateX(0)' : 'translateX(100%)',\n }}\n />\n {/* Reject content */}\n <span\n className={cn(\n 'absolute inset-0 z-10 flex items-center justify-center gap-2 pr-8 transition-opacity duration-300',\n approveExpanded ? 'opacity-0' : 'opacity-100'\n )}\n >\n <Send className=\"h-4 w-4 shrink-0\" />\n Reject\n </span>\n {/* Approve content — overlaid, centered */}\n <span\n className={cn(\n 'absolute inset-0 z-10 flex items-center justify-center gap-2 text-white transition-opacity duration-300',\n approveExpanded ? 'opacity-100' : 'opacity-0'\n )}\n >\n <ApproveIcon className=\"h-4 w-4 shrink-0\" />\n {approveLabel}\n </span>\n {/* Arrow indicator — hover trigger to toggle between modes */}\n <span\n className={cn(\n `border-input/60 absolute inset-y-0 right-0 z-20 flex w-8 cursor-pointer items-center justify-center rounded-r-[5px] border-l ${accentBg} transition-opacity duration-300`,\n !hasText && !hoverExpanded && 'pointer-events-none opacity-0'\n )}\n onMouseEnter={() => setHoverExpanded(true)}\n >\n <ChevronLeft className=\"h-4 w-4 text-white\" />\n </span>\n </button>\n </TooltipTrigger>\n {!isWarning ? (\n <TooltipContent side=\"top\">\n {approveExpanded ? approveLabel : 'Send revision feedback'}\n </TooltipContent>\n ) : null}\n </Tooltip>\n </div>\n </div>\n </div>\n </div>\n </form>\n </TooltipProvider>\n ) : (\n <div className=\"flex items-center gap-2 px-4 pb-4\">\n <Button\n type=\"button\"\n className=\"flex-1\"\n disabled={disabled}\n onClick={() => {\n approveSound.play();\n onApprove();\n }}\n >\n {approveLabel}\n </Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useCallback, useMemo, useState } from 'react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Badge } from '@/components/ui/badge';\nimport { DrawerActionBar } from '@/components/common/drawer-action-bar';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport type { PrdQuestionnaireProps } from './prd-questionnaire-config';\n\nexport function PrdQuestionnaire({\n data,\n selections,\n onSelect,\n onApprove,\n onReject,\n isProcessing = false,\n isRejecting = false,\n showHeader = false,\n chatInput,\n onChatInputChange,\n}: PrdQuestionnaireProps) {\n const { question, context, questions, finalAction } = data;\n const [currentStep, setCurrentStep] = useState(0);\n const selectSound = useSoundAction('select');\n const navigateSound = useSoundAction('navigate');\n\n const total = questions.length;\n const isFirstStep = currentStep === 0;\n const isLastStep = currentStep === total - 1;\n const currentQuestion = questions[currentStep];\n\n const answeredCount = useMemo(() => Object.keys(selections).length, [selections]);\n\n const handleSelect = useCallback(\n (questionId: string, optionId: string) => {\n selectSound.play();\n onSelect(questionId, optionId);\n // Auto-advance to the next step after selection (unless last step)\n if (!isLastStep) {\n setTimeout(() => setCurrentStep((s) => s + 1), 250);\n }\n },\n [onSelect, isLastStep, selectSound]\n );\n\n if (total === 0) return null;\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex-1 space-y-4 overflow-y-auto p-4\">\n {/* Header */}\n {showHeader ? (\n <div className=\"border-border flex items-start gap-3 border-b pb-3\">\n <div className=\"mt-1.5 h-2 w-2 shrink-0 rounded-full bg-amber-500\" />\n <div className=\"flex-1\">\n <h3 className=\"text-foreground mb-1.5 text-sm font-bold\">{question}</h3>\n <p className=\"text-muted-foreground text-xs leading-relaxed\">{context}</p>\n </div>\n </div>\n ) : null}\n\n {/* Question + step indicator */}\n <div className=\"space-y-3\">\n <div className=\"flex items-start gap-3\">\n <label className=\"text-foreground min-w-0 flex-1 text-sm font-semibold\">\n {currentQuestion.question}\n </label>\n <div className=\"mt-1.5 flex shrink-0 gap-1\">\n {questions.map((q, idx) => (\n <button\n key={q.id}\n type=\"button\"\n aria-label={`Go to question ${idx + 1}`}\n className={cn(\n 'h-1.5 rounded-full transition-all duration-200',\n idx === currentStep ? 'bg-primary w-4' : 'w-1.5',\n idx !== currentStep && selections[q.id] ? 'bg-primary/50' : '',\n idx !== currentStep && !selections[q.id] ? 'bg-muted-foreground/25' : ''\n )}\n onClick={() => {\n navigateSound.play();\n setCurrentStep(idx);\n }}\n />\n ))}\n </div>\n </div>\n <div className=\"space-y-2\">\n {currentQuestion.options.map((opt, optIdx) => {\n const selected = selections[currentQuestion.id] === opt.id;\n const letter = String.fromCharCode(65 + optIdx);\n return (\n <button\n key={opt.id}\n type=\"button\"\n className={cn(\n 'border-border w-full rounded-md border px-3 py-3 text-left text-xs transition-all',\n 'hover:border-primary/70 hover:bg-primary/5 group',\n selected && 'border-primary bg-primary/5',\n opt.isNew && 'animate-option-highlight'\n )}\n disabled={isProcessing}\n onClick={() => handleSelect(currentQuestion.id, opt.id)}\n >\n <div className=\"flex items-start gap-2\">\n <span className=\"text-muted-foreground mt-0.5 font-mono text-xs\">\n {letter}.\n </span>\n <div className=\"flex-1\">\n <div className=\"mb-0.5 flex items-center gap-2\">\n <span className=\"text-foreground text-xs font-semibold\">{opt.label}</span>\n {opt.recommended ? (\n <Badge className=\"px-1.5 py-0 text-[10px]\">AI Recommended</Badge>\n ) : null}\n {opt.isNew ? (\n <Badge className=\"border-transparent bg-emerald-600 px-1.5 py-0 text-[10px] text-white hover:bg-emerald-600/80\">\n New\n </Badge>\n ) : null}\n </div>\n <div className=\"text-muted-foreground text-xs leading-snug\">\n {opt.rationale}\n </div>\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Step navigation */}\n <div className=\"flex items-center justify-between pt-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={isFirstStep || isProcessing}\n onClick={() => {\n navigateSound.play();\n setCurrentStep((s) => s - 1);\n }}\n >\n <ChevronLeft className=\"mr-1 h-4 w-4\" />\n Previous\n </Button>\n\n {!isLastStep ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={isProcessing}\n onClick={() => {\n navigateSound.play();\n setCurrentStep((s) => s + 1);\n }}\n >\n {selections[currentQuestion.id] ? 'Next' : 'Skip'}\n <ChevronRight className=\"ml-1 h-4 w-4\" />\n </Button>\n ) : null}\n </div>\n </div>\n\n <DrawerActionBar\n onReject={onReject}\n onApprove={() => onApprove(finalAction.id)}\n approveLabel={finalAction.label}\n revisionPlaceholder=\"Ask AI to refine requirements...\"\n isProcessing={isProcessing}\n isRejecting={isRejecting}\n chatInput={chatInput}\n onChatInputChange={onChatInputChange}\n >\n <div\n className={cn(\n 'bg-muted h-1.5 overflow-hidden',\n (answeredCount > 0 && answeredCount < total) || isProcessing\n ? 'opacity-100'\n : 'opacity-0',\n 'transition-opacity duration-200'\n )}\n data-testid=\"progress-bar-container\"\n >\n {isProcessing ? (\n <div className=\"bg-primary animate-indeterminate-progress h-full w-1/3\" />\n ) : (\n <div\n className=\"bg-primary h-full transition-all duration-300\"\n style={{ width: `${total > 0 ? (answeredCount / total) * 100 : 0}%` }}\n data-testid=\"progress-bar\"\n />\n )}\n </div>\n </DrawerActionBar>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { Components } from 'react-markdown';\nimport Markdown from 'react-markdown';\nimport { ChevronRight, GitCompareArrows, Layers } from 'lucide-react';\nimport { Badge } from '@/components/ui/badge';\nimport { DrawerActionBar } from '@/components/common/drawer-action-bar';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport type {\n TechDecisionsReviewProps,\n TechDecisionsReviewData,\n TechDecision,\n} from './tech-decisions-review-config';\n\nconst markdownComponents: Components = {\n p: ({ children }) => (\n <p className=\"text-muted-foreground mb-2 text-xs leading-relaxed last:mb-0\">{children}</p>\n ),\n strong: ({ children }) => <strong className=\"text-foreground font-semibold\">{children}</strong>,\n em: ({ children }) => <em className=\"italic\">{children}</em>,\n code: ({ children, className }) =>\n className ? (\n <code className={`${className} text-[11px]`}>{children}</code>\n ) : (\n <code className=\"bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]\">\n {children}\n </code>\n ),\n pre: ({ children }) => (\n <pre className=\"bg-muted my-2 overflow-x-auto rounded-lg border p-3\">{children}</pre>\n ),\n ul: ({ children }) => (\n <ul className=\"text-muted-foreground mb-2 list-disc space-y-1 pl-4 text-xs\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"text-muted-foreground mb-2 list-decimal space-y-1 pl-4 text-xs\">{children}</ol>\n ),\n li: ({ children }) => <li className=\"leading-relaxed\">{children}</li>,\n a: ({ children, href }) => (\n <a\n href={href}\n className=\"text-primary underline underline-offset-2\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ),\n};\n\nfunction DecisionCard({ decision, index }: { decision: TechDecision; index: number }) {\n const [alternativesOpen, setAlternativesOpen] = useState(false);\n const expandSound = useSoundAction('expand');\n const collapseSound = useSoundAction('collapse');\n\n const handleToggleAlternatives = () => {\n // Play sound based on current state (before toggle)\n if (alternativesOpen) {\n collapseSound.play();\n } else {\n expandSound.play();\n }\n setAlternativesOpen((prev) => !prev);\n };\n\n return (\n <div className=\"border-border rounded-lg border\">\n {/* Header: number + title + chosen badge */}\n <div className=\"space-y-3 px-4 py-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-2.5\">\n <span className=\"bg-primary text-primary-foreground flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-bold\">\n {index + 1}\n </span>\n <div className=\"min-w-0\">\n <h3 className=\"text-foreground text-sm leading-tight font-semibold\">\n {decision.title}\n </h3>\n <p className=\"text-muted-foreground mt-0.5 text-xs\">{decision.chosen}</p>\n </div>\n </div>\n {'decisionName' in decision &&\n (decision as unknown as { decisionName?: string }).decisionName ? (\n <Badge variant=\"secondary\" className=\"bg-primary/10 text-primary shrink-0\">\n {(decision as unknown as { decisionName: string }).decisionName}\n </Badge>\n ) : null}\n </div>\n\n {/* Rationale */}\n {decision.rationale ? (\n <Markdown components={markdownComponents}>{decision.rationale}</Markdown>\n ) : null}\n </div>\n\n {/* Rejected alternatives (collapsed by default) */}\n {decision.rejected.length > 0 ? (\n <div className=\"border-border border-t\">\n <button\n type=\"button\"\n onClick={handleToggleAlternatives}\n className=\"text-muted-foreground hover:bg-muted/50 flex w-full items-center gap-1.5 px-4 py-3 text-xs font-medium transition-colors\"\n >\n <ChevronRight\n className={`h-3.5 w-3.5 transition-transform ${alternativesOpen ? 'rotate-90' : ''}`}\n />\n <Layers className=\"h-3.5 w-3.5\" />\n Other Options Considered ({decision.rejected.length})\n </button>\n {alternativesOpen ? (\n <div className=\"space-y-1.5 px-4 pb-3\">\n {decision.rejected.map((alt) => (\n <div key={alt} className=\"bg-primary/5 rounded-md px-3 py-2\">\n <span className=\"text-foreground text-xs\">{alt}</span>\n </div>\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\n/**\n * Renders the tech decisions content (header + decision cards) without the action bar.\n * Used by TechReviewTabs to compose with a shared DrawerActionBar.\n */\nexport function TechDecisionsContent({ data }: { data: TechDecisionsReviewData }) {\n const { summary, decisions } = data;\n\n if (decisions.length === 0) return null;\n\n return (\n <div className=\"space-y-4 p-4\">\n {/* Header */}\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500\" />\n <div className=\"flex-1\">\n <h2 className=\"text-foreground text-sm font-bold\">\n Technical Implementation Plan Review\n </h2>\n {summary ? (\n <p className=\"text-muted-foreground mt-1 text-xs leading-relaxed\">{summary}</p>\n ) : null}\n </div>\n </div>\n\n {/* Section heading */}\n <div className=\"flex items-center gap-2 pt-1\">\n <GitCompareArrows className=\"text-primary h-4 w-4\" />\n <h3 className=\"text-foreground text-sm font-bold\">Technical Decisions</h3>\n </div>\n\n {/* Decision cards */}\n {decisions.map((decision, i) => (\n <DecisionCard key={decision.title} decision={decision} index={i} />\n ))}\n </div>\n );\n}\n\nexport function TechDecisionsReview({\n data,\n onApprove,\n onReject,\n isProcessing = false,\n isRejecting = false,\n}: TechDecisionsReviewProps) {\n if (data.decisions.length === 0) return null;\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex-1 overflow-y-auto\">\n <TechDecisionsContent data={data} />\n </div>\n\n <DrawerActionBar\n onReject={onReject}\n onApprove={onApprove}\n approveLabel=\"Approve Plan\"\n revisionPlaceholder=\"Ask AI to revise the plan...\"\n isProcessing={isProcessing}\n isRejecting={isRejecting}\n />\n </div>\n );\n}\n","'use client';\n\nimport { ClipboardList } from 'lucide-react';\nimport { Badge } from '@/components/ui/badge';\nimport type {\n ProductDecisionsSummaryProps,\n ProductDecisionItem,\n} from './product-decisions-summary-config';\n\nfunction ProductDecisionCard({ item, index }: { item: ProductDecisionItem; index: number }) {\n return (\n <div className=\"border-border rounded-lg border\">\n <div className=\"space-y-2 px-4 py-3\">\n <div className=\"flex items-start gap-2.5\">\n <span className=\"bg-primary text-primary-foreground flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-bold\">\n {index + 1}\n </span>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-foreground text-sm leading-tight font-semibold\">{item.question}</h3>\n <div className=\"mt-1 flex items-center gap-2\">\n <p className=\"text-muted-foreground text-xs\">{item.selectedOption}</p>\n {item.wasRecommended ? (\n <Badge className=\"px-1.5 py-0 text-[10px]\">AI Recommended</Badge>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ProductDecisionsSummary({ data }: ProductDecisionsSummaryProps) {\n const { questions } = data;\n\n if (questions.length === 0) return null;\n\n return (\n <div className=\"space-y-4 p-4\">\n {/* Section heading */}\n <div className=\"flex items-center gap-2\">\n <ClipboardList className=\"text-primary h-4 w-4\" />\n <h3 className=\"text-foreground text-sm font-bold\">Product Decisions</h3>\n </div>\n\n {/* Decision cards */}\n {questions.map((item, i) => (\n <ProductDecisionCard key={item.question} item={item} index={i} />\n ))}\n </div>\n );\n}\n","import { CheckCircle2, Loader2, XCircle } from 'lucide-react';\nimport { CiStatus } from '@shepai/core/domain/generated/output';\nimport { Badge } from '@/components/ui/badge';\n\nexport function CiStatusBadge({ status }: { status: CiStatus }) {\n switch (status) {\n case CiStatus.Success:\n return (\n <Badge className=\"border-transparent bg-green-50 text-green-700 hover:bg-green-50\">\n <CheckCircle2 className=\"mr-1 h-3.5 w-3.5\" />\n Passing\n </Badge>\n );\n case CiStatus.Pending:\n return (\n <Badge className=\"border-transparent bg-yellow-50 text-yellow-700 hover:bg-yellow-50\">\n <Loader2 className=\"mr-1 h-3.5 w-3.5 animate-spin\" />\n Pending\n </Badge>\n );\n case CiStatus.Failure:\n return (\n <Badge className=\"border-transparent bg-red-50 text-red-700 hover:bg-red-50\">\n <XCircle className=\"mr-1 h-3.5 w-3.5\" />\n Failing\n </Badge>\n );\n }\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { ChevronRight, FileText, FilePlus, FileMinus, FileEdit } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport type { MergeReviewFileDiff, MergeReviewDiffHunk } from './merge-review-config';\n\nconst STATUS_CONFIG = {\n added: { icon: FilePlus, label: 'A', className: 'text-green-600' },\n modified: { icon: FileEdit, label: 'M', className: 'text-amber-600' },\n deleted: { icon: FileMinus, label: 'D', className: 'text-red-600' },\n renamed: { icon: FileEdit, label: 'R', className: 'text-blue-600' },\n} as const;\n\nfunction FileStatusIcon({ status }: { status: MergeReviewFileDiff['status'] }) {\n const config = STATUS_CONFIG[status];\n const Icon = config.icon;\n return <Icon className={cn('h-3.5 w-3.5 shrink-0', config.className)} />;\n}\n\nfunction HunkView({ hunk }: { hunk: MergeReviewDiffHunk }) {\n return (\n <div className=\"border-border border-t first:border-t-0\">\n <div className=\"bg-muted/50 text-muted-foreground px-3 py-1 font-mono text-[10px]\">\n {hunk.header}\n </div>\n <div className=\"font-mono text-[11px] leading-[18px]\">\n {hunk.lines.map((line) => (\n <div\n key={`${line.type}-${line.oldNumber ?? ''}-${line.newNumber ?? ''}`}\n className={cn(\n 'flex',\n line.type === 'added' && 'bg-green-50 dark:bg-green-950/30',\n line.type === 'removed' && 'bg-red-50 dark:bg-red-950/30'\n )}\n >\n <span className=\"text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none\">\n {line.oldNumber ?? ''}\n </span>\n <span className=\"text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none\">\n {line.newNumber ?? ''}\n </span>\n <span\n className={cn(\n 'w-4 shrink-0 text-center select-none',\n line.type === 'added' && 'text-green-700 dark:text-green-400',\n line.type === 'removed' && 'text-red-700 dark:text-red-400'\n )}\n >\n {line.type === 'added' ? '+' : line.type === 'removed' ? '-' : ' '}\n </span>\n <span className=\"min-w-0 flex-1 pr-2 break-all whitespace-pre-wrap\">\n {line.content}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction FileDiffItem({ file }: { file: MergeReviewFileDiff }) {\n const [isOpen, setIsOpen] = useState(false);\n\n const fileName = file.path.split('/').pop() ?? file.path;\n const dirPath = file.path.includes('/') ? file.path.slice(0, file.path.lastIndexOf('/')) : '';\n\n return (\n <div className=\"border-border border-b last:border-b-0\">\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n className=\"hover:bg-muted/50 flex w-full items-center gap-2 px-3 py-2 text-left\"\n >\n <ChevronRight\n className={cn(\n 'text-muted-foreground h-3 w-3 shrink-0 transition-transform duration-150',\n isOpen && 'rotate-90'\n )}\n />\n <FileStatusIcon status={file.status} />\n <span className=\"text-foreground min-w-0 flex-1 truncate text-xs\">\n {dirPath ? (\n <>\n <span className=\"text-muted-foreground\">{dirPath}/</span>\n {fileName}\n </>\n ) : (\n fileName\n )}\n </span>\n {file.oldPath ? (\n <span className=\"text-muted-foreground truncate text-[10px]\">\n ← {file.oldPath.split('/').pop()}\n </span>\n ) : null}\n <span className=\"shrink-0 text-[10px]\">\n {file.additions > 0 ? <span className=\"text-green-600\">+{file.additions}</span> : null}\n {file.additions > 0 && file.deletions > 0 ? ' ' : null}\n {file.deletions > 0 ? <span className=\"text-red-600\">-{file.deletions}</span> : null}\n </span>\n </button>\n {isOpen && file.hunks.length > 0 ? (\n <div className=\"border-border overflow-x-auto border-t\">\n {file.hunks.map((hunk) => (\n <HunkView key={hunk.header} hunk={hunk} />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport interface DiffViewProps {\n fileDiffs: MergeReviewFileDiff[];\n}\n\nexport function DiffView({ fileDiffs }: DiffViewProps) {\n if (fileDiffs.length === 0) return null;\n\n return (\n <div className=\"border-border rounded-lg border\">\n <div className=\"px-4 py-3\">\n <div className=\"mb-2 flex items-center gap-2\">\n <FileText className=\"text-muted-foreground h-4 w-4\" />\n <span className=\"text-foreground text-xs font-semibold\">Changed Files</span>\n <span className=\"text-muted-foreground text-[10px]\">({fileDiffs.length})</span>\n </div>\n </div>\n <div className=\"border-border border-t\">\n {fileDiffs.map((file) => (\n <FileDiffItem key={file.path} file={file} />\n ))}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport {\n ExternalLink,\n AlertTriangle,\n FileDiff,\n GitCommitHorizontal,\n GitBranch,\n ArrowRight,\n Camera,\n FileText,\n MonitorPlay,\n Terminal,\n Download,\n ChevronDown,\n ChevronRight,\n} from 'lucide-react';\nimport { Badge } from '@/components/ui/badge';\nimport { CiStatusBadge } from '@/components/common/ci-status-badge';\nimport { DrawerActionBar } from '@/components/common/drawer-action-bar';\nimport { DiffView } from './diff-view';\nimport type { MergeReviewProps, MergeReviewEvidence } from './merge-review-config';\n\nconst EVIDENCE_ICONS: Record<MergeReviewEvidence['type'], typeof Camera> = {\n Screenshot: Camera,\n Video: MonitorPlay,\n TestOutput: FileText,\n TerminalRecording: Terminal,\n};\n\nconst IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp']);\nconst VIDEO_EXTENSIONS = new Set(['.mp4', '.webm', '.mov']);\n\nfunction getExtension(path: string): string {\n const dot = path.lastIndexOf('.');\n return dot >= 0 ? path.slice(dot).toLowerCase() : '';\n}\n\n/** Build the API URL for serving an evidence file. */\nfunction buildEvidenceUrl(relativePath: string, basePath?: string): string | undefined {\n // If relativePath is already absolute, use it directly\n const filePath = relativePath.startsWith('/')\n ? relativePath\n : basePath\n ? `${basePath}/${relativePath}`\n : undefined;\n if (!filePath) return undefined;\n return `/api/evidence?path=${encodeURIComponent(filePath)}`;\n}\n\nfunction EvidenceItem({\n evidence,\n basePath,\n}: {\n evidence: MergeReviewEvidence;\n basePath?: string;\n}) {\n const [expanded, setExpanded] = useState(true);\n const Icon = EVIDENCE_ICONS[evidence.type] ?? Camera;\n const ext = getExtension(evidence.relativePath);\n const url = buildEvidenceUrl(evidence.relativePath, basePath);\n const isImage = evidence.type === 'Screenshot' || IMAGE_EXTENSIONS.has(ext);\n const isVideo = evidence.type === 'Video' || VIDEO_EXTENSIONS.has(ext);\n const isText = evidence.type === 'TestOutput' || evidence.type === 'TerminalRecording';\n\n return (\n <li className=\"border-border rounded-md border\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex w-full cursor-pointer items-center gap-2.5 px-3 py-2.5 text-left\"\n >\n {expanded ? (\n <ChevronDown className=\"text-muted-foreground h-3 w-3 shrink-0\" />\n ) : (\n <ChevronRight className=\"text-muted-foreground h-3 w-3 shrink-0\" />\n )}\n <Icon className=\"text-muted-foreground h-3.5 w-3.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <span className=\"text-foreground text-xs font-medium\">{evidence.description}</span>\n {evidence.taskRef ? (\n <span className=\"text-muted-foreground ml-1.5 text-[10px]\">({evidence.taskRef})</span>\n ) : null}\n </div>\n {url ? (\n <a\n href={url}\n download\n onClick={(e) => e.stopPropagation()}\n className=\"text-muted-foreground hover:text-foreground shrink-0 rounded p-1 transition-colors\"\n aria-label=\"Download\"\n >\n <Download className=\"h-3 w-3\" />\n </a>\n ) : null}\n </button>\n {expanded && url ? (\n <div className=\"border-border border-t px-3 py-2.5\">\n {isImage ? (\n /* eslint-disable-next-line @next/next/no-img-element */\n <img\n src={url}\n alt={evidence.description}\n className=\"max-h-80 w-full rounded-md border object-contain\"\n loading=\"lazy\"\n />\n ) : isVideo ? (\n <video\n src={url}\n controls\n className=\"max-h-80 w-full rounded-md border\"\n preload=\"metadata\"\n >\n <track kind=\"captions\" />\n </video>\n ) : isText ? (\n <EvidenceTextPreview url={url} />\n ) : (\n <p className=\"text-muted-foreground truncate font-mono text-[10px]\">\n {evidence.relativePath}\n </p>\n )}\n </div>\n ) : null}\n {expanded && !url ? (\n <div className=\"border-border border-t px-3 py-2.5\">\n <p className=\"text-muted-foreground truncate font-mono text-[10px]\">\n {evidence.relativePath}\n </p>\n </div>\n ) : null}\n </li>\n );\n}\n\nfunction EvidenceTextPreview({ url }: { url: string }) {\n const [content, setContent] = useState<string | null>(null);\n const [loaded, setLoaded] = useState(false);\n\n if (!loaded) {\n fetch(url)\n .then((r) => (r.ok ? r.text() : Promise.reject(new Error('Failed'))))\n .then((text) => {\n // Limit to first 100 lines for preview\n const lines = text.split('\\n');\n setContent(lines.length > 100 ? `${lines.slice(0, 100).join('\\n')}\\n...` : text);\n })\n .catch(() => setContent(null))\n .finally(() => setLoaded(true));\n\n return <div className=\"bg-muted/50 h-16 animate-pulse rounded-md\" />;\n }\n\n if (!content) {\n return <p className=\"text-muted-foreground text-[10px]\">Unable to load preview</p>;\n }\n\n return (\n <pre className=\"bg-muted/50 max-h-60 overflow-auto rounded-md p-3 font-mono text-[11px] leading-relaxed\">\n {content}\n </pre>\n );\n}\n\nfunction EvidenceList({\n evidence,\n basePath,\n}: {\n evidence: MergeReviewEvidence[];\n basePath?: string;\n}) {\n return (\n <div className=\"border-border rounded-lg border\">\n <div className=\"px-4 py-3\">\n <div className=\"mb-3 flex items-center gap-2\">\n <Camera className=\"text-muted-foreground h-4 w-4\" />\n <span className=\"text-foreground text-xs font-semibold\">Evidence</span>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {evidence.length}\n </Badge>\n </div>\n <ul className=\"space-y-2\">\n {evidence.map((e) => (\n <EvidenceItem key={`${e.type}-${e.relativePath}`} evidence={e} basePath={basePath} />\n ))}\n </ul>\n </div>\n </div>\n );\n}\n\nexport function MergeReview({\n data,\n onApprove,\n onReject,\n isProcessing = false,\n isRejecting = false,\n chatInput,\n onChatInputChange,\n}: MergeReviewProps) {\n const { pr, diffSummary, fileDiffs, branch, warning, evidence, evidenceBasePath } = data;\n const hasConflicts = pr?.mergeable === false;\n\n const handleApproveOrResolve =\n hasConflicts && onReject ? () => onReject('Resolve merge conflicts', []) : onApprove;\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex-1 space-y-4 overflow-y-auto p-4\">\n {/* Header */}\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-emerald-500\" />\n <div className=\"flex-1\">\n <h2 className=\"text-foreground text-sm font-bold\">Merge Review</h2>\n <p className=\"text-muted-foreground mt-1 text-xs leading-relaxed\">\n {pr\n ? 'Review the pull request details and approve to merge.'\n : 'Review the changes and approve to merge.'}\n </p>\n </div>\n </div>\n\n {/* Branch merge direction (GitHub-like) */}\n {branch ? (\n <div className=\"border-border rounded-lg border\">\n <div className=\"flex items-center gap-2 px-4 py-3\">\n <GitBranch className=\"text-muted-foreground h-4 w-4 shrink-0\" />\n <Badge variant=\"secondary\" className=\"font-mono text-[11px]\">\n {branch.source}\n </Badge>\n <ArrowRight className=\"text-muted-foreground h-3.5 w-3.5 shrink-0\" />\n <Badge variant=\"outline\" className=\"font-mono text-[11px]\">\n {branch.target}\n </Badge>\n </div>\n </div>\n ) : null}\n\n {/* PR metadata card */}\n {pr ? (\n <div className=\"border-border rounded-lg border\">\n <div className=\"space-y-3 px-4 py-3\">\n {/* PR number + link */}\n <div className=\"flex items-center justify-between\">\n <a\n href={pr.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2\"\n >\n PR #{pr.number}\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n <Badge variant=\"outline\" className=\"text-xs\">\n {pr.status}\n </Badge>\n </div>\n\n {/* Merge status */}\n {pr.mergeable === false ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">Merge Status</span>\n <Badge className=\"border-transparent bg-orange-50 text-orange-700 hover:bg-orange-50\">\n <AlertTriangle className=\"mr-1 h-3.5 w-3.5\" />\n Conflicts\n </Badge>\n </div>\n ) : null}\n\n {/* CI status */}\n {pr.ciStatus ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">CI Status</span>\n <CiStatusBadge status={pr.ciStatus} />\n </div>\n ) : null}\n\n {/* Commit hash */}\n {pr.commitHash ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">Commit</span>\n <div className=\"flex items-center gap-1.5\">\n <GitCommitHorizontal className=\"text-muted-foreground h-3.5 w-3.5\" />\n <code className=\"bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]\">\n {pr.commitHash.slice(0, 7)}\n </code>\n </div>\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {/* Diff summary */}\n {diffSummary ? (\n <div className=\"border-border rounded-lg border\">\n <div className=\"px-4 py-3\">\n <div className=\"mb-3 flex items-center gap-2\">\n <FileDiff className=\"text-muted-foreground h-4 w-4\" />\n <span className=\"text-foreground text-xs font-semibold\">Changes</span>\n </div>\n <div className=\"grid grid-cols-4 gap-3\">\n <div className=\"text-center\">\n <div className=\"text-foreground text-sm font-bold\">\n {diffSummary.filesChanged}\n </div>\n <div className=\"text-muted-foreground text-[10px]\">files</div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-sm font-bold text-green-600\">+{diffSummary.additions}</div>\n <div className=\"text-muted-foreground text-[10px]\">additions</div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-sm font-bold text-red-600\">-{diffSummary.deletions}</div>\n <div className=\"text-muted-foreground text-[10px]\">deletions</div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-foreground text-sm font-bold\">{diffSummary.commitCount}</div>\n <div className=\"text-muted-foreground text-[10px]\">commits</div>\n </div>\n </div>\n </div>\n </div>\n ) : warning ? (\n <div className=\"border-border rounded-lg border\">\n <div className=\"flex items-center gap-2 px-4 py-3\">\n <AlertTriangle className=\"text-muted-foreground h-4 w-4 shrink-0\" />\n <span className=\"text-muted-foreground text-xs\">{warning}</span>\n </div>\n </div>\n ) : null}\n\n {/* Evidence */}\n {evidence && evidence.length > 0 ? (\n <EvidenceList evidence={evidence} basePath={evidenceBasePath} />\n ) : null}\n\n {/* File diffs */}\n {fileDiffs && fileDiffs.length > 0 ? <DiffView fileDiffs={fileDiffs} /> : null}\n </div>\n\n <DrawerActionBar\n onReject={onReject}\n onApprove={handleApproveOrResolve}\n approveLabel={hasConflicts ? 'Resolve Conflicts' : 'Approve Merge'}\n approveVariant={hasConflicts ? 'warning' : 'default'}\n revisionPlaceholder=\"Ask AI to revise before merging...\"\n isProcessing={isProcessing}\n isRejecting={isRejecting}\n chatInput={chatInput}\n onChatInputChange={onChatInputChange}\n />\n </div>\n );\n}\n","/* eslint-disable @next/next/no-img-element -- Local file preview requires raw <img>, not next/image */\n'use client';\n\nimport { useState } from 'react';\nimport { Dialog, DialogTrigger, DialogContent, DialogTitle } from '@/components/ui/dialog';\nimport { VisuallyHidden } from 'radix-ui';\nimport { DownloadIcon, ImageOff } from 'lucide-react';\n\nconst IMAGE_EXTS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.bmp']);\n\nfunction isImagePath(path: string): boolean {\n const dot = path.lastIndexOf('.');\n return dot >= 0 && IMAGE_EXTS.has(path.slice(dot).toLowerCase());\n}\n\nfunction previewUrl(path: string): string {\n const ext = path.lastIndexOf('.') >= 0 ? path.slice(path.lastIndexOf('.')) : '';\n const mimeGuess = isImagePath(path) ? `image/${ext.slice(1).replace('jpg', 'jpeg')}` : '';\n const params = new URLSearchParams({ path, ...(mimeGuess && { mimeType: mimeGuess }) });\n return `/api/attachments/preview?${params.toString()}`;\n}\n\nfunction getFilename(path: string): string {\n return path.split('/').pop() ?? path;\n}\n\n/** Regex matching `@/absolute/path` attachment references in text. */\nconst ATTACHMENT_REF_RE = /(?:^|\\s)@(\\/[^\\s]+)/g;\n\nexport interface InlineAttachmentsProps {\n /** Text that may contain `@/path/to/file` attachment references. */\n text: string;\n /** Additional attachment paths to render (e.g. from rejection feedback). */\n attachmentPaths?: string[];\n}\n\ninterface TextSegment {\n type: 'text';\n value: string;\n}\n\ninterface AttachmentSegment {\n type: 'attachment';\n path: string;\n}\n\ntype Segment = TextSegment | AttachmentSegment;\n\n/** Parse text into segments of plain text and attachment references. */\nexport function parseAttachmentRefs(text: string): Segment[] {\n const segments: Segment[] = [];\n let lastIndex = 0;\n\n for (const match of text.matchAll(ATTACHMENT_REF_RE)) {\n const fullMatchStart = match.index;\n // The path capture starts after the optional leading whitespace\n const leadingWs = match[0].length - match[0].trimStart().length;\n const refStart = fullMatchStart + leadingWs;\n\n // Add text before this reference (including leading whitespace)\n if (refStart > lastIndex) {\n segments.push({ type: 'text', value: text.slice(lastIndex, refStart) });\n }\n\n segments.push({ type: 'attachment', path: match[1] });\n lastIndex = fullMatchStart + match[0].length;\n }\n\n if (lastIndex < text.length) {\n segments.push({ type: 'text', value: text.slice(lastIndex) });\n }\n\n return segments;\n}\n\nexport function InlineAttachments({ text, attachmentPaths }: InlineAttachmentsProps) {\n const segments = parseAttachmentRefs(text);\n const hasInlineAttachments = segments.some((s) => s.type === 'attachment');\n const extraPaths = attachmentPaths?.filter(Boolean) ?? [];\n\n if (!hasInlineAttachments && extraPaths.length === 0) {\n return <span className=\"text-sm leading-relaxed\">{text}</span>;\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {segments.map((segment) => {\n if (segment.type === 'text') {\n const trimmed = segment.value.trim();\n if (!trimmed) return null;\n return (\n <span key={`text-${trimmed.slice(0, 40)}`} className=\"text-sm leading-relaxed\">\n {trimmed}\n </span>\n );\n }\n return <AttachmentPreview key={`att-${segment.path}`} path={segment.path} />;\n })}\n {extraPaths.map((path) => (\n <AttachmentPreview key={`extra-${path}`} path={path} />\n ))}\n </div>\n );\n}\n\nfunction AttachmentPreview({ path }: { path: string }) {\n const filename = getFilename(path);\n const [loadError, setLoadError] = useState(false);\n\n if (isImagePath(path)) {\n if (loadError) {\n return (\n <div\n data-testid=\"inline-attachment-image-error\"\n className=\"text-muted-foreground flex items-center gap-2 rounded-md border px-3 py-2 text-sm\"\n >\n <ImageOff className=\"h-4 w-4 shrink-0\" />\n <span className=\"truncate\">{filename}</span>\n </div>\n );\n }\n\n return (\n <Dialog>\n <DialogTrigger asChild>\n <img\n src={previewUrl(path)}\n alt={filename}\n data-testid=\"inline-attachment-image\"\n onError={() => setLoadError(true)}\n className=\"max-h-48 max-w-full cursor-pointer rounded-md border object-contain transition-opacity hover:opacity-80\"\n />\n </DialogTrigger>\n <DialogContent className=\"max-w-3xl gap-0 overflow-hidden border-0 p-0 [&>button:last-child]:!cursor-pointer [&>button:last-child]:!rounded-full [&>button:last-child]:!bg-black/70 [&>button:last-child]:!p-1.5 [&>button:last-child]:!text-white [&>button:last-child]:!opacity-100 [&>button:last-child]:!shadow-lg [&>button:last-child]:!backdrop-blur-md [&>button:last-child]:hover:!bg-black/90\">\n <VisuallyHidden.Root>\n <DialogTitle>Preview: {filename}</DialogTitle>\n </VisuallyHidden.Root>\n <div className=\"relative bg-black/90\">\n <img\n src={previewUrl(path)}\n alt={filename}\n className=\"h-auto max-h-[70vh] w-full object-contain\"\n />\n </div>\n <div className=\"bg-background flex items-center gap-3 px-4 py-3\">\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm font-medium\">{filename}</span>\n </div>\n <a\n href={previewUrl(path)}\n download={filename}\n className=\"text-muted-foreground hover:text-foreground shrink-0 cursor-pointer rounded p-1.5 transition-colors\"\n aria-label={`Download ${filename}`}\n >\n <DownloadIcon className=\"h-4 w-4\" />\n </a>\n </div>\n </DialogContent>\n </Dialog>\n );\n }\n\n return (\n <a\n href={previewUrl(path)}\n download={filename}\n data-testid=\"inline-attachment-file\"\n className=\"text-primary text-sm underline underline-offset-2\"\n >\n {filename}\n </a>\n );\n}\n","'use client';\n\nimport { useState, useEffect, useRef } from 'react';\nimport { AlertTriangle, ExternalLink, GitBranch, GitCommitHorizontal, Zap } from 'lucide-react';\nimport { InlineAttachments } from '@/components/common/inline-attachments';\nimport { PrStatus } from '@shepai/core/domain/generated/output';\nimport { cn } from '@/lib/utils';\nimport { Badge } from '@/components/ui/badge';\nimport { Separator } from '@/components/ui/separator';\nimport { CiStatusBadge } from '@/components/common/ci-status-badge';\nimport { CometSpinner } from '@/components/ui/comet-spinner';\nimport { featureNodeStateConfig, lifecycleDisplayLabels } from '@/components/common/feature-node';\nimport type { FeatureNodeData } from '@/components/common/feature-node';\nimport {\n getAgentTypeIcon,\n agentTypeLabels,\n} from '@/components/common/feature-node/agent-type-icons';\nimport { formatDuration } from '@/lib/format-duration';\n\nexport interface OverviewTabProps {\n data: FeatureNodeData;\n}\n\nexport function OverviewTab({ data }: OverviewTabProps) {\n const isCompleted = data.lifecycle === 'maintain';\n return (\n <>\n <div data-testid=\"feature-drawer-status\" className=\"flex flex-col gap-3 p-4\">\n <div className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {lifecycleDisplayLabels[data.lifecycle]}\n </div>\n <FeatureStateBadge data={data} />\n {!isCompleted && data.progress > 0 ? (\n <div data-testid=\"feature-drawer-progress\" className=\"flex flex-col gap-1\">\n <div className=\"text-muted-foreground flex items-center justify-between text-xs\">\n <span>Progress</span>\n <span>{data.progress}%</span>\n </div>\n <div className=\"bg-muted h-2 w-full overflow-hidden rounded-full\">\n <div\n className={cn(\n 'h-full rounded-full transition-all',\n featureNodeStateConfig[data.state].progressClass\n )}\n style={{ width: `${data.progress}%` }}\n />\n </div>\n </div>\n ) : null}\n {isCompleted && data.pr ? <FeaturePrInfo pr={data.pr} /> : null}\n </div>\n <FeatureInfo data={data} />\n {!isCompleted && data.pr ? (\n <>\n <Separator />\n <div className=\"p-4\">\n <FeaturePrInfo pr={data.pr} />\n </div>\n </>\n ) : null}\n <FeatureDetails data={data} />\n </>\n );\n}\n\nfunction FeatureStateBadge({ data }: { data: FeatureNodeData }) {\n const config = featureNodeStateConfig[data.state];\n const Icon = config.icon;\n return (\n <div\n className={cn(\n 'flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium',\n config.badgeBgClass,\n config.badgeClass\n )}\n >\n {data.state === 'running' ? (\n <CometSpinner size=\"sm\" className=\"shrink-0\" />\n ) : (\n <Icon className=\"h-4 w-4 shrink-0\" />\n )}\n <span>{config.label}</span>\n </div>\n );\n}\n\n// ── Feature Info section ─────────────────────────────────────────────\n\nfunction formatRelativeTime(timestamp: string | number): string {\n const now = Date.now();\n const time = typeof timestamp === 'string' ? new Date(timestamp).getTime() : timestamp;\n const diffMs = now - time;\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHr = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHr / 24);\n\n if (diffDay > 30) {\n return new Date(time).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n }\n if (diffDay > 0) return `${diffDay} day${diffDay === 1 ? '' : 's'} ago`;\n if (diffHr > 0) return `${diffHr} hour${diffHr === 1 ? '' : 's'} ago`;\n if (diffMin > 0) return `${diffMin} minute${diffMin === 1 ? '' : 's'} ago`;\n return 'just now';\n}\n\nfunction FeatureInfo({ data }: { data: FeatureNodeData }) {\n const showSummary =\n Boolean(data.summary) && !(data.userQuery && data.summary?.trim() === data.userQuery.trim());\n\n const hasInfo =\n Boolean(data.branch) ||\n Boolean(data.oneLiner) ||\n showSummary ||\n Boolean(data.userQuery) ||\n Boolean(data.createdAt);\n if (!hasInfo) return null;\n\n return (\n <>\n <Separator />\n <div data-testid=\"feature-drawer-info\" className=\"flex flex-col gap-3 p-4\">\n {data.branch ? (\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-muted-foreground text-xs font-medium\">Branch</span>\n <span className=\"flex items-center gap-1.5 text-sm\">\n <GitBranch className=\"text-muted-foreground h-3.5 w-3.5 shrink-0\" />\n <code className=\"bg-muted rounded px-1 py-0.5 font-mono text-xs\">{data.branch}</code>\n {data.baseBranch ? (\n <span className=\"text-muted-foreground text-xs\">from {data.baseBranch}</span>\n ) : null}\n </span>\n </div>\n ) : null}\n {data.oneLiner ? (\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-muted-foreground text-xs font-medium\">One-Liner</span>\n <span className=\"text-sm leading-relaxed\">{data.oneLiner}</span>\n </div>\n ) : null}\n {data.userQuery ? (\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-muted-foreground text-xs font-medium\">User Query</span>\n <InlineAttachments text={data.userQuery} />\n </div>\n ) : null}\n {showSummary ? (\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-muted-foreground text-xs font-medium\">Summary</span>\n <span className=\"text-sm leading-relaxed\">{data.summary}</span>\n </div>\n ) : null}\n {data.createdAt ? (\n <DetailRow label=\"Created\" value={formatRelativeTime(data.createdAt)} />\n ) : null}\n </div>\n </>\n );\n}\n\n// ── PR Info section ──────────────────────────────────────────────────\n\nconst prStatusStyles: Record<PrStatus, string> = {\n [PrStatus.Open]: 'border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50',\n [PrStatus.Merged]: 'border-transparent bg-purple-50 text-purple-700 hover:bg-purple-50',\n [PrStatus.Closed]: 'border-transparent bg-red-50 text-red-700 hover:bg-red-50',\n};\n\nfunction FeaturePrInfo({ pr }: { pr: NonNullable<FeatureNodeData['pr']> }) {\n return (\n <div data-testid=\"feature-drawer-pr\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <a\n href={pr.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2\"\n >\n PR #{pr.number}\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n <Badge className={prStatusStyles[pr.status]}>{pr.status}</Badge>\n </div>\n {pr.ciStatus ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">CI Status</span>\n <CiStatusBadge status={pr.ciStatus} />\n </div>\n ) : null}\n {pr.mergeable === false ? (\n <div data-testid=\"pr-merge-conflict\" className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">Merge Status</span>\n <Badge className=\"border-transparent bg-orange-50 text-orange-700 hover:bg-orange-50\">\n <AlertTriangle className=\"mr-1 h-3.5 w-3.5\" />\n Conflicts\n </Badge>\n </div>\n ) : null}\n {pr.commitHash ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">Commit</span>\n <div className=\"flex items-center gap-1.5\">\n <GitCommitHorizontal className=\"text-muted-foreground h-3.5 w-3.5\" />\n <code className=\"bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]\">\n {pr.commitHash.slice(0, 7)}\n </code>\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\n// ── Details section ──────────────────────────────────────────────────\n\n/** Hook that returns a live-updating elapsed time string for running features. */\nfunction useElapsedTime(startedAt?: number): string | null {\n const [elapsed, setElapsed] = useState<string | null>(null);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n useEffect(() => {\n if (!startedAt) {\n setElapsed(null);\n return;\n }\n // Compute immediately\n setElapsed(formatDuration(Math.max(0, Date.now() - startedAt)));\n // Tick every second\n intervalRef.current = setInterval(() => {\n setElapsed(formatDuration(Math.max(0, Date.now() - startedAt)));\n }, 1000);\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [startedAt]);\n\n return elapsed;\n}\n\nfunction FeatureDetails({ data }: { data: FeatureNodeData }) {\n const isRunning = data.state === 'running' || data.state === 'action-required';\n const elapsedTime = useElapsedTime(isRunning ? data.startedAt : undefined);\n const hasAnyDetail =\n data.fastMode ??\n data.agentType ??\n data.runtime ??\n elapsedTime ??\n data.blockedBy ??\n data.errorMessage;\n if (!hasAnyDetail) return null;\n return (\n <>\n <Separator />\n <div data-testid=\"feature-drawer-details\" className=\"flex flex-col gap-3 p-4\">\n {data.fastMode ? (\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-muted-foreground text-xs font-medium\">Mode</span>\n <span className=\"flex items-center gap-2 text-sm\">\n <Zap className=\"h-4 w-4 shrink-0 text-amber-500\" />\n Fast Mode\n </span>\n </div>\n ) : null}\n {data.agentType ? <AgentDetailRow agentType={data.agentType} /> : null}\n {data.runtime ? <DetailRow label=\"Runtime\" value={data.runtime} /> : null}\n {!data.runtime && elapsedTime ? (\n <DetailRow label=\"Running for\" value={elapsedTime} />\n ) : null}\n {data.blockedBy ? <DetailRow label=\"Blocked by\" value={data.blockedBy} /> : null}\n {data.errorMessage ? <DetailRow label=\"Error\" value={data.errorMessage} /> : null}\n </div>\n </>\n );\n}\n\nfunction AgentDetailRow({ agentType }: { agentType: string }) {\n const Icon = getAgentTypeIcon(agentType);\n const label = agentTypeLabels[agentType as keyof typeof agentTypeLabels] ?? agentType;\n return (\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-muted-foreground text-xs font-medium\">Agent</span>\n <span className=\"flex items-center gap-2 text-sm\">\n <Icon className=\"h-4 w-4 shrink-0\" />\n {label}\n </span>\n </div>\n );\n}\n\nfunction DetailRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-muted-foreground text-xs font-medium\">{label}</span>\n <span className=\"text-sm\">{value}</span>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useEffect, useRef } from 'react';\nimport { Loader2, AlertCircle, Clock } from 'lucide-react';\nimport type {\n PhaseTimingData,\n RejectionFeedbackData,\n} from '@/app/actions/get-feature-phase-timings';\nimport { InlineAttachments } from '@/components/common/inline-attachments';\nimport { formatDuration } from '@/lib/format-duration';\n\n/**\n * Computes the effective duration for a phase timing entry.\n * For completed phases, uses the server-provided durationMs.\n * For in-progress phases (has startedAt but no completedAt), computes\n * elapsed time client-side so the UI shows a live-updating timer.\n */\nfunction getEffectiveDuration(timing: PhaseTimingData, now: number): number {\n if (timing.durationMs != null && timing.durationMs > 0) return timing.durationMs;\n if (!timing.completedAt && timing.startedAt) {\n const started = new Date(timing.startedAt).getTime();\n if (!Number.isNaN(started)) return Math.max(0, now - started);\n }\n return 0;\n}\n\n/** Returns true if any non-lifecycle phase is still in progress. */\nfunction hasRunningPhase(timings: PhaseTimingData[]): boolean {\n return timings.some((t) => !t.phase.startsWith('run:') && !t.completedAt && t.startedAt);\n}\n\n/** Hook that ticks every second while there are running phases. */\nfunction useTickingNow(timings: PhaseTimingData[] | null): number {\n const [now, setNow] = useState(Date.now);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n useEffect(() => {\n const running = timings ? hasRunningPhase(timings) : false;\n if (running) {\n // Tick every second\n intervalRef.current = setInterval(() => setNow(Date.now()), 1000);\n }\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [timings]);\n\n return now;\n}\n\nexport interface ActivityTabProps {\n timings: PhaseTimingData[] | null;\n loading: boolean;\n error: string | null;\n rejectionFeedback?: RejectionFeedbackData[];\n}\n\nconst NODE_TO_PHASE: Record<string, string> = {\n analyze: 'Analyzing',\n requirements: 'Requirements',\n research: 'Researching',\n plan: 'Planning',\n implement: 'Implementing',\n merge: 'Merging',\n};\n\nconst LIFECYCLE_EVENTS: Record<string, { label: string; colorClass: string }> = {\n 'run:started': { label: 'started', colorClass: 'text-blue-600' },\n 'run:resumed': { label: 'resumed', colorClass: 'text-blue-600' },\n 'run:completed': { label: 'completed', colorClass: 'text-emerald-600' },\n 'run:failed': { label: 'failed', colorClass: 'text-red-600' },\n 'run:stopped': { label: 'stopped', colorClass: 'text-amber-600' },\n 'run:crashed': { label: 'crashed', colorClass: 'text-red-600' },\n 'run:rejected': { label: 'rejected', colorClass: 'text-orange-600' },\n};\n\nfunction isLifecycleEvent(phase: string): boolean {\n return phase.startsWith('run:');\n}\n\n/* ---------------------------------------------------------------------------\n * Lifecycle-aware view model\n * ------------------------------------------------------------------------- */\n\n/**\n * A single iteration in the lifecycle timeline.\n *\n * An iteration represents one cycle of work:\n * started/resumed → phase work → rejected/completed/failed\n *\n * Each rejected iteration has associated rejection feedback.\n */\nexport interface TimelineIteration {\n /** 1-based iteration number */\n number: number;\n /** The timing events in this iteration */\n timings: PhaseTimingData[];\n /** If this iteration ended with rejection, the feedback message */\n rejectionMessage?: string;\n /** If this iteration ended with rejection, any attachments */\n rejectionAttachments?: string[];\n}\n\n/**\n * Build a lifecycle-aware timeline from flat timing events and rejection feedback.\n *\n * Splits the timing stream at run:rejected boundaries to produce iterations.\n * Each rejection feedback entry is matched to its iteration by index.\n *\n * When there are more feedback entries than run:rejected events in the timings,\n * synthetic run:rejected + run:resumed events are appended to ensure every\n * feedback entry is represented.\n */\nexport function buildLifecycleTimeline(\n timings: PhaseTimingData[],\n feedback?: RejectionFeedbackData[]\n): TimelineIteration[] {\n if (!timings.length) return [];\n\n // Count existing run:rejected events\n const existingRejectionCount = timings.filter((t) => t.phase === 'run:rejected').length;\n const feedbackCount = feedback?.length ?? 0;\n\n // Augment timings with synthetic rejection/resumed cycles for unmatched feedback\n let augmented = timings;\n if (feedbackCount > existingRejectionCount) {\n augmented = [...timings];\n\n // Use last timing's agentRunId as template\n const templateRunId = timings[timings.length - 1].agentRunId;\n\n for (let i = existingRejectionCount; i < feedbackCount; i++) {\n const fb = feedback![i];\n // Add run:resumed before work (except for the first synthetic, which continues from existing)\n if (i > existingRejectionCount) {\n augmented.push({\n agentRunId: templateRunId,\n phase: 'run:resumed',\n startedAt: fb.timestamp ?? `synthetic-resumed-${i}`,\n });\n }\n // Add run:rejected\n augmented.push({\n agentRunId: templateRunId,\n phase: 'run:rejected',\n startedAt: fb.timestamp ?? `synthetic-${i}`,\n });\n }\n }\n\n // Split into iterations at run:rejected boundaries\n const iterations: TimelineIteration[] = [];\n let currentEvents: PhaseTimingData[] = [];\n let rejectionIndex = 0;\n\n for (const t of augmented) {\n currentEvents.push(t);\n\n if (t.phase === 'run:rejected') {\n const fb = feedback?.[rejectionIndex];\n iterations.push({\n number: iterations.length + 1,\n timings: currentEvents,\n rejectionMessage: fb?.message,\n rejectionAttachments: fb?.attachments,\n });\n currentEvents = [];\n rejectionIndex++;\n }\n }\n\n // Remaining events after last rejection (or all events if no rejections)\n if (currentEvents.length > 0) {\n iterations.push({\n number: iterations.length + 1,\n timings: currentEvents,\n });\n }\n\n return iterations;\n}\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport function ActivityTab({ timings, loading, error, rejectionFeedback }: ActivityTabProps) {\n const now = useTickingNow(timings);\n\n if (loading) {\n return (\n <div data-testid=\"activity-tab-loading\" className=\"flex items-center justify-center p-8\">\n <Loader2 className=\"text-muted-foreground h-6 w-6 animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex items-center gap-2 p-4 text-sm text-red-600\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n <span>{error}</span>\n </div>\n );\n }\n\n if (!timings || timings.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-2 p-8\">\n <Clock className=\"text-muted-foreground h-8 w-8\" />\n <p className=\"text-muted-foreground text-sm\">No activity recorded yet</p>\n </div>\n );\n }\n\n const nodeTimings = timings.filter((t) => !isLifecycleEvent(t.phase));\n const maxDurationMs = Math.max(\n ...nodeTimings.map((t) => getEffectiveDuration(t, now)),\n ...nodeTimings.map((t) => t.approvalWaitMs ?? 0),\n 0\n );\n\n const iterations = buildLifecycleTimeline(timings, rejectionFeedback);\n const hasMultipleIterations = iterations.length > 1;\n\n const totalExecMs = nodeTimings.reduce((sum, t) => sum + getEffectiveDuration(t, now), 0);\n const totalWaitMs = nodeTimings.reduce((sum, t) => sum + (t.approvalWaitMs ?? 0), 0);\n\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n <div data-testid=\"activity-timings\" className=\"flex flex-col gap-3\">\n {iterations.map((iteration) => (\n <IterationGroup\n key={iteration.number}\n iteration={iteration}\n showHeader={hasMultipleIterations}\n maxDurationMs={maxDurationMs}\n now={now}\n />\n ))}\n </div>\n {totalExecMs > 0 ? (\n <SummaryTotals totalExecMs={totalExecMs} totalWaitMs={totalWaitMs} />\n ) : null}\n </div>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Iteration group — one cycle of work\n * ------------------------------------------------------------------------- */\n\nfunction IterationGroup({\n iteration,\n showHeader,\n maxDurationMs,\n now,\n}: {\n iteration: TimelineIteration;\n showHeader: boolean;\n maxDurationMs: number;\n now: number;\n}) {\n return (\n <div data-testid={`iteration-${iteration.number}`} className=\"flex flex-col gap-1.5\">\n {showHeader ? (\n <div className=\"text-muted-foreground text-xs font-medium\">\n Iteration {iteration.number}\n </div>\n ) : null}\n {iteration.timings.map((t) => {\n if (isLifecycleEvent(t.phase)) {\n // For run:rejected, the message comes from the iteration, not a separate map\n const isRejection = t.phase === 'run:rejected';\n return (\n <LifecycleEventRow\n key={`${t.agentRunId}-${t.phase}-${t.startedAt}`}\n timing={t}\n message={isRejection ? iteration.rejectionMessage : undefined}\n attachments={isRejection ? iteration.rejectionAttachments : undefined}\n />\n );\n }\n return (\n <NodeTimingRow\n key={`${t.agentRunId}-${t.phase}-${t.startedAt}`}\n timing={t}\n maxDurationMs={maxDurationMs}\n now={now}\n />\n );\n })}\n </div>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Row components\n * ------------------------------------------------------------------------- */\n\nfunction LifecycleEventRow({\n timing,\n message,\n attachments,\n}: {\n timing: PhaseTimingData;\n message?: string;\n attachments?: string[];\n}) {\n const event = LIFECYCLE_EVENTS[timing.phase];\n if (!event) return null;\n\n const hasAttachments = attachments && attachments.length > 0;\n\n return (\n <div className={`text-xs ${event.colorClass}`}>\n <span>{event.label}</span>\n {message ? (\n <span\n data-testid=\"rejection-feedback-text\"\n className=\"text-muted-foreground ml-2 font-normal italic\"\n >\n — {message}\n </span>\n ) : null}\n {hasAttachments ? (\n <div data-testid=\"rejection-feedback-attachments\" className=\"mt-1.5 ml-2\">\n <InlineAttachments text=\"\" attachmentPaths={attachments} />\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction NodeTimingRow({\n timing,\n maxDurationMs,\n now,\n}: {\n timing: PhaseTimingData;\n maxDurationMs: number;\n now: number;\n}) {\n const label = timing.phase.includes(':')\n ? `rev ${timing.phase.split(':')[1]}`\n : (NODE_TO_PHASE[timing.phase] ?? timing.phase);\n\n const durationMs = getEffectiveDuration(timing, now);\n const barPercent = maxDurationMs > 0 ? Math.max(2, (durationMs / maxDurationMs) * 100) : 2;\n const isRunning = !timing.completedAt && !!timing.startedAt;\n const barColorClass = timing.completedAt ? 'bg-emerald-500' : 'bg-blue-500';\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div data-testid={`timing-bar-${timing.phase}`} className=\"flex items-center gap-3\">\n <span className=\"text-muted-foreground w-24 shrink-0 text-xs\">{label}</span>\n <div className=\"bg-muted h-3 flex-1 overflow-hidden rounded-full\">\n <div\n className={`h-full rounded-full ${barColorClass}${isRunning ? 'animate-pulse' : ''}`}\n style={{ width: `${Math.min(barPercent, 100)}%` }}\n />\n </div>\n <span className=\"text-muted-foreground w-14 shrink-0 text-right text-xs\">\n {formatDuration(durationMs)}\n </span>\n </div>\n {timing.approvalWaitMs != null && timing.approvalWaitMs > 0 ? (\n <ApprovalWaitRow timing={timing} maxDurationMs={maxDurationMs} />\n ) : null}\n </div>\n );\n}\n\nfunction ApprovalWaitRow({\n timing,\n maxDurationMs,\n}: {\n timing: PhaseTimingData;\n maxDurationMs: number;\n}) {\n const waitMs = timing.approvalWaitMs ?? 0;\n const barPercent = maxDurationMs > 0 ? Math.max(2, (waitMs / maxDurationMs) * 100) : 2;\n\n return (\n <div data-testid={`approval-wait-${timing.phase}`} className=\"flex items-center gap-3 pl-4\">\n <span className=\"text-muted-foreground w-20 shrink-0 text-xs\">approval</span>\n <div className=\"bg-muted h-2.5 flex-1 overflow-hidden rounded-full\">\n <div\n className=\"h-full rounded-full bg-amber-500\"\n style={{ width: `${Math.min(barPercent, 100)}%` }}\n />\n </div>\n <span className=\"text-muted-foreground w-14 shrink-0 text-right text-xs\">\n {formatDuration(waitMs)}\n </span>\n </div>\n );\n}\n\nfunction SummaryTotals({ totalExecMs, totalWaitMs }: { totalExecMs: number; totalWaitMs: number }) {\n return (\n <div\n data-testid=\"activity-summary\"\n className=\"border-border flex flex-col gap-1.5 border-t pt-3\"\n >\n <SummaryRow label=\"Total execution\" value={formatDuration(totalExecMs)} />\n {totalWaitMs > 0 ? (\n <>\n <SummaryRow label=\"Total wait\" value={formatDuration(totalWaitMs)} />\n <SummaryRow label=\"Total wall-clock\" value={formatDuration(totalExecMs + totalWaitMs)} />\n </>\n ) : null}\n </div>\n );\n}\n\nfunction SummaryRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">{label}</span>\n <span className=\"text-xs font-medium\">{value}</span>\n </div>\n );\n}\n","'use client';\n\nimport { useRef, useEffect, useState, useCallback } from 'react';\nimport { AlertCircle, Terminal, ArrowDown } from 'lucide-react';\n\nexport interface LogTabProps {\n content: string;\n isConnected: boolean;\n error: string | null;\n}\n\nexport function LogTab({ content, isConnected, error }: LogTabProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [autoScroll, setAutoScroll] = useState(true);\n\n const handleScroll = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n const isAtBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40;\n setAutoScroll(isAtBottom);\n }, []);\n\n const jumpToBottom = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n el.scrollTop = el.scrollHeight;\n setAutoScroll(true);\n }, []);\n\n // Auto-scroll when new content arrives (only if auto-scroll is active)\n useEffect(() => {\n if (autoScroll && containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n }, [content, autoScroll]);\n\n if (error) {\n return (\n <div className=\"flex items-center gap-2 p-4 text-sm text-red-600\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n <span>{error}</span>\n </div>\n );\n }\n\n if (!content) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-2 p-8\">\n <Terminal className=\"text-muted-foreground h-8 w-8\" />\n <p className=\"text-muted-foreground text-sm\">No log output yet</p>\n {isConnected ? (\n <p className=\"text-muted-foreground text-xs\">Waiting for log data...</p>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full flex-col\" data-testid=\"log-tab\">\n {/* Status bar */}\n <div className=\"flex items-center gap-2 border-b px-3 py-1.5\">\n <span\n className={`h-2 w-2 rounded-full ${isConnected ? 'bg-emerald-500' : 'bg-zinc-400'}`}\n />\n <span className=\"text-muted-foreground text-xs\">\n {isConnected ? 'Live' : 'Disconnected'}\n </span>\n {!autoScroll ? (\n <button\n type=\"button\"\n onClick={jumpToBottom}\n className=\"text-muted-foreground hover:text-foreground ml-auto flex items-center gap-1 text-xs\"\n >\n <ArrowDown className=\"h-3 w-3\" />\n Jump to bottom\n </button>\n ) : null}\n </div>\n {/* Log content */}\n <div\n ref={containerRef}\n onScroll={handleScroll}\n className=\"flex-1 overflow-y-auto bg-zinc-950 p-3 font-mono text-xs leading-relaxed break-all whitespace-pre-wrap text-zinc-300\"\n >\n {content}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback, useMemo } from 'react';\nimport {\n Loader2,\n Circle,\n Check,\n Eye,\n ChevronRight,\n CheckCircle2,\n CircleDashed,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport type { PlanTaskData, ActionItemData } from '@/app/actions/get-feature-plan';\n\nexport interface TaskProgressViewProps {\n tasks: PlanTaskData[];\n}\n\nconst taskStateConfig: Record<\n string,\n {\n icon: typeof Circle;\n colorClass: string;\n borderClass: string;\n spinning?: boolean;\n label: string;\n }\n> = {\n Todo: {\n icon: Circle,\n colorClass: 'text-muted-foreground',\n borderClass: 'border-border',\n label: 'Todo',\n },\n 'Work in Progress': {\n icon: Loader2,\n colorClass: 'text-blue-600',\n borderClass: 'border-blue-200',\n spinning: true,\n label: 'In Progress',\n },\n Done: {\n icon: Check,\n colorClass: 'text-emerald-600',\n borderClass: 'border-emerald-200',\n label: 'Done',\n },\n Review: {\n icon: Eye,\n colorClass: 'text-amber-600',\n borderClass: 'border-amber-200',\n label: 'Review',\n },\n};\n\nconst defaultTaskConfig = {\n icon: Circle,\n colorClass: 'text-muted-foreground',\n borderClass: 'border-border',\n label: 'Unknown',\n};\n\nexport function TaskProgressView({ tasks }: TaskProgressViewProps) {\n if (tasks.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-2 py-4\">\n <p className=\"text-muted-foreground text-sm\">No tasks defined yet</p>\n </div>\n );\n }\n\n return (\n <div data-testid=\"task-progress-view\" className=\"flex flex-col gap-3\">\n <ProgressSummary tasks={tasks} />\n <div data-testid=\"task-progress-list\" className=\"flex flex-col gap-2\">\n {tasks.map((task, index) => (\n <TaskCard key={task.title || `task-${index}`} task={task} index={index} />\n ))}\n </div>\n </div>\n );\n}\n\n// ── Progress Summary ─────────────────────────────────────────────────\n\nfunction ProgressSummary({ tasks }: { tasks: PlanTaskData[] }) {\n const counts = useMemo(() => {\n const done = tasks.filter((t) => t.state === 'Done').length;\n const wip = tasks.filter((t) => t.state === 'Work in Progress').length;\n const review = tasks.filter((t) => t.state === 'Review').length;\n const todo = tasks.filter(\n (t) => t.state !== 'Done' && t.state !== 'Work in Progress' && t.state !== 'Review'\n ).length;\n const total = tasks.length;\n const percent = total > 0 ? Math.round((done / total) * 100) : 0;\n return { done, wip, review, todo, total, percent };\n }, [tasks]);\n\n return (\n <div data-testid=\"task-progress-summary\" className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground text-xs font-medium\">Task Progress</span>\n <span className=\"text-muted-foreground text-xs\">\n {counts.done} of {counts.total} done\n </span>\n </div>\n <div className=\"bg-muted h-2 w-full overflow-hidden rounded-full\">\n <div\n data-testid=\"task-progress-bar\"\n className=\"h-full rounded-full bg-emerald-500 transition-all\"\n style={{ width: `${counts.percent}%` }}\n />\n </div>\n <div className=\"flex flex-wrap gap-3\">\n {counts.done > 0 ? (\n <StatChip icon={Check} label=\"Done\" count={counts.done} className=\"text-emerald-600\" />\n ) : null}\n {counts.wip > 0 ? (\n <StatChip\n icon={Loader2}\n label=\"In Progress\"\n count={counts.wip}\n className=\"text-blue-600\"\n />\n ) : null}\n {counts.review > 0 ? (\n <StatChip icon={Eye} label=\"Review\" count={counts.review} className=\"text-amber-600\" />\n ) : null}\n {counts.todo > 0 ? (\n <StatChip\n icon={Circle}\n label=\"Todo\"\n count={counts.todo}\n className=\"text-muted-foreground\"\n />\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction StatChip({\n icon: Icon,\n label,\n count,\n className,\n}: {\n icon: typeof Circle;\n label: string;\n count: number;\n className?: string;\n}) {\n return (\n <span className={cn('flex items-center gap-1 text-xs', className)}>\n <Icon className=\"h-3 w-3\" />\n {count} {label}\n </span>\n );\n}\n\n// ── Task Card ────────────────────────────────────────────────────────\n\nfunction TaskCard({ task, index }: { task: PlanTaskData; index: number }) {\n const [expanded, setExpanded] = useState(false);\n const config = taskStateConfig[task.state] ?? defaultTaskConfig;\n const Icon = config.icon;\n const hasDetails = task.actionItems.length > 0;\n\n const handleToggle = useCallback(() => {\n if (hasDetails) {\n setExpanded((prev) => !prev);\n }\n }, [hasDetails]);\n\n return (\n <div data-testid={`task-card-${index}`} className={cn('rounded-lg border', config.borderClass)}>\n <button\n type=\"button\"\n onClick={handleToggle}\n disabled={!hasDetails}\n className={cn(\n 'flex w-full items-start gap-2 px-3 py-2.5 text-left',\n hasDetails && 'hover:bg-muted/50 cursor-pointer transition-colors'\n )}\n >\n <Icon\n className={cn(\n 'mt-0.5 h-4 w-4 shrink-0',\n config.colorClass,\n config.spinning && 'animate-spin'\n )}\n />\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className={cn('text-sm font-medium', config.colorClass)}>{task.title}</span>\n {task.description ? (\n <span className=\"text-muted-foreground text-xs\">{task.description}</span>\n ) : null}\n </div>\n {hasDetails ? (\n <ChevronRight\n className={cn(\n 'text-muted-foreground mt-0.5 h-4 w-4 shrink-0 transition-transform',\n expanded && 'rotate-90'\n )}\n />\n ) : null}\n </button>\n\n {expanded && hasDetails ? (\n <div className=\"border-t px-3 py-2.5\">\n <div className=\"flex flex-col gap-2\">\n {task.actionItems.map((item, aiIndex) => (\n <ActionItemRow key={item.name || `ai-${aiIndex}`} item={item} />\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\n// ── Action Item Row ──────────────────────────────────────────────────\n\nfunction ActionItemRow({ item }: { item: ActionItemData }) {\n const totalCriteria = item.acceptanceCriteria.length;\n const verifiedCriteria = item.acceptanceCriteria.filter((ac) => ac.verified).length;\n const allVerified = totalCriteria > 0 && verifiedCriteria === totalCriteria;\n\n return (\n <div data-testid=\"action-item\" className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-start gap-2\">\n {allVerified ? (\n <CheckCircle2 className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-emerald-600\" />\n ) : (\n <CircleDashed className=\"text-muted-foreground mt-0.5 h-3.5 w-3.5 shrink-0\" />\n )}\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-xs font-medium\">{item.name}</span>\n {item.description ? (\n <span className=\"text-muted-foreground text-[11px]\">{item.description}</span>\n ) : null}\n </div>\n {totalCriteria > 0 ? (\n <span className=\"text-muted-foreground ml-auto shrink-0 text-[11px]\">\n {verifiedCriteria}/{totalCriteria}\n </span>\n ) : null}\n </div>\n {totalCriteria > 0 ? (\n <div className=\"ml-5.5 flex flex-col gap-1\">\n {item.acceptanceCriteria.map((ac, acIndex) => (\n <AcceptanceCriterionRow key={ac.description || `ac-${acIndex}`} criterion={ac} />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\n// ── Acceptance Criterion Row ─────────────────────────────────────────\n\nfunction AcceptanceCriterionRow({\n criterion,\n}: {\n criterion: { description: string; verified: boolean };\n}) {\n return (\n <div data-testid=\"acceptance-criterion\" className=\"flex items-start gap-1.5\">\n {criterion.verified ? (\n <Check className=\"mt-0.5 h-3 w-3 shrink-0 text-emerald-600\" />\n ) : (\n <Circle className=\"text-muted-foreground mt-0.5 h-3 w-3 shrink-0\" />\n )}\n <span\n className={cn(\n 'text-[11px]',\n criterion.verified ? 'text-muted-foreground line-through' : 'text-foreground'\n )}\n >\n {criterion.description}\n </span>\n </div>\n );\n}\n","'use client';\n\nimport { Loader2 } from 'lucide-react';\nimport { AlertCircle, ListTodo } from 'lucide-react';\nimport { Badge } from '@/components/ui/badge';\nimport { TaskProgressView } from '@/components/common/task-progress-view';\nimport type { PlanData } from '@/app/actions/get-feature-plan';\n\nexport interface PlanTabProps {\n plan: PlanData | null;\n loading: boolean;\n error: string | null;\n}\n\nconst planStateBadgeStyles: Record<string, string> = {\n Requirements: 'border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50',\n ClarificationRequired: 'border-transparent bg-amber-50 text-amber-700 hover:bg-amber-50',\n Ready: 'border-transparent bg-green-50 text-green-700 hover:bg-green-50',\n};\n\nexport function PlanTab({ plan, loading, error }: PlanTabProps) {\n if (loading) {\n return (\n <div data-testid=\"plan-tab-loading\" className=\"flex items-center justify-center p-8\">\n <Loader2 className=\"text-muted-foreground h-6 w-6 animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex items-center gap-2 p-4 text-sm text-red-600\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n <span>{error}</span>\n </div>\n );\n }\n\n if (!plan) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-2 p-8\">\n <ListTodo className=\"text-muted-foreground h-8 w-8\" />\n <p className=\"text-muted-foreground text-sm\">No plan created yet</p>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-xs font-medium\">Plan State</span>\n <Badge\n className={\n planStateBadgeStyles[plan.state] ?? 'border-transparent bg-gray-50 text-gray-700'\n }\n >\n {plan.state}\n </Badge>\n </div>\n {plan.overview ? (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-muted-foreground text-xs font-medium\">Overview</span>\n <p className=\"text-sm leading-relaxed\">{plan.overview}</p>\n </div>\n ) : null}\n <TaskProgressView tasks={plan.tasks} />\n </div>\n );\n}\n","'use client';\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\n\nexport interface UseFeatureLogsResult {\n content: string;\n isConnected: boolean;\n error: string | null;\n}\n\nexport function useFeatureLogs(featureId: string | null | undefined): UseFeatureLogsResult {\n const [content, setContent] = useState('');\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const eventSourceRef = useRef<EventSource | null>(null);\n\n const cleanup = useCallback(() => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n eventSourceRef.current = null;\n }\n setIsConnected(false);\n }, []);\n\n useEffect(() => {\n if (!featureId) {\n setContent('');\n setIsConnected(false);\n setError(null);\n return;\n }\n\n // Reset state for new featureId\n setContent('');\n setError(null);\n\n // Connect EventSource for live updates\n const es = new EventSource(`/api/feature-logs?featureId=${featureId}`);\n eventSourceRef.current = es;\n\n es.onopen = () => {\n setIsConnected(true);\n };\n\n es.addEventListener('initial', (event: MessageEvent) => {\n const data: { content: string } = JSON.parse(event.data);\n setContent(data.content);\n });\n\n es.addEventListener('log', (event: MessageEvent) => {\n const data: { content: string } = JSON.parse(event.data);\n setContent((prev) => prev + data.content);\n });\n\n es.addEventListener('error', (event: MessageEvent) => {\n const data: { error: string } = JSON.parse(event.data);\n setError(data.error);\n });\n\n es.onerror = () => {\n setIsConnected(false);\n };\n\n return () => {\n es.close();\n eventSourceRef.current = null;\n };\n }, [featureId, cleanup]);\n\n return { content, isConnected, error };\n}\n","'use client';\n\nimport { useState, useRef, useCallback, useEffect } from 'react';\n\n/** State for a single tab's data, loading, and error. */\nexport interface TabState<T = unknown> {\n data: T | null;\n loading: boolean;\n error: string | null;\n}\n\n/** A function that fetches data for a tab given a feature ID. */\nexport type TabFetcher<T = unknown> = (featureId: string) => Promise<T>;\n\n/** Map of tab keys to their fetcher functions. */\nexport type TabFetchers<K extends string> = Record<K, TabFetcher>;\n\n/** Return type of the useTabDataFetch hook. */\nexport interface UseTabDataFetchResult<K extends string> {\n /** Per-tab state (data, loading, error). */\n tabs: Record<K, TabState>;\n /** Fetch data for a tab. Uses cache if already fetched. */\n fetchTab: (tab: K) => Promise<void>;\n /** Force re-fetch for a tab, bypassing cache. */\n refreshTab: (tab: K) => Promise<void>;\n}\n\nfunction createInitialTabState(): TabState {\n return { data: null, loading: false, error: null };\n}\n\n/**\n * Custom hook for lazy-loading tab data with per-tab caching.\n *\n * - Fetches data only when a tab is explicitly activated via fetchTab().\n * - Caches results so revisiting a loaded tab is instant.\n * - Clears all cached data when featureId changes.\n * - Supports force re-fetch via refreshTab() for SSE-driven updates.\n * - Uses ref-based callbacks to avoid stale closures (matches useArtifactFetch pattern).\n */\nexport function useTabDataFetch<K extends string>(\n featureId: string,\n fetchers: TabFetchers<K>\n): UseTabDataFetchResult<K> {\n const tabKeys = Object.keys(fetchers) as K[];\n\n const [tabStates, setTabStates] = useState<Record<K, TabState>>(() => {\n const initial = {} as Record<K, TabState>;\n for (const key of tabKeys) {\n initial[key] = createInitialTabState();\n }\n return initial;\n });\n\n // Ref-based fetchers to avoid stale closures in callbacks.\n const fetchersRef = useRef(fetchers);\n fetchersRef.current = fetchers;\n\n // Ref-based featureId to use current value in callbacks.\n const featureIdRef = useRef(featureId);\n featureIdRef.current = featureId;\n\n // Track mounted state to prevent state updates after unmount.\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Clear all cached data when featureId changes.\n const prevFeatureIdRef = useRef(featureId);\n useEffect(() => {\n if (prevFeatureIdRef.current !== featureId) {\n prevFeatureIdRef.current = featureId;\n setTabStates((prev) => {\n const cleared = {} as Record<K, TabState>;\n for (const key of Object.keys(prev) as K[]) {\n cleared[key] = createInitialTabState();\n }\n return cleared;\n });\n }\n }, [featureId]);\n\n const doFetch = useCallback(async (tab: K) => {\n const fetcher = fetchersRef.current[tab];\n const currentFeatureId = featureIdRef.current;\n\n if (!fetcher) return;\n\n if (mountedRef.current) {\n setTabStates((prev) => ({\n ...prev,\n [tab]: { ...prev[tab], loading: true, error: null },\n }));\n }\n\n try {\n const data = await fetcher(currentFeatureId);\n if (mountedRef.current) {\n setTabStates((prev) => ({\n ...prev,\n [tab]: { data, loading: false, error: null },\n }));\n }\n } catch (error: unknown) {\n if (mountedRef.current) {\n const message = error instanceof Error ? error.message : 'Failed to fetch tab data';\n setTabStates((prev) => ({\n ...prev,\n [tab]: { data: null, loading: false, error: message },\n }));\n }\n }\n }, []);\n\n const fetchTab = useCallback(\n async (tab: K) => {\n // Check if data is already cached (non-null data means already fetched)\n const current = tabStates[tab];\n if (current && current.data !== null) return;\n // Also skip if currently loading\n if (current && current.loading) return;\n await doFetch(tab);\n },\n [tabStates, doFetch]\n );\n\n const refreshTab = useCallback(\n async (tab: K) => {\n await doFetch(tab);\n },\n [doFetch]\n );\n\n return {\n tabs: tabStates,\n fetchTab,\n refreshTab,\n };\n}\n","'use client';\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { usePathname } from 'next/navigation';\nimport { Loader2 } from 'lucide-react';\nimport type { NotificationEvent } from '@shepai/core/domain/generated/output';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs';\nimport { getFeaturePhaseTimings } from '@/app/actions/get-feature-phase-timings';\nimport type {\n PhaseTimingData,\n RejectionFeedbackData,\n} from '@/app/actions/get-feature-phase-timings';\nimport { getFeaturePlan } from '@/app/actions/get-feature-plan';\nimport type { PlanData } from '@/app/actions/get-feature-plan';\nimport type { FeatureNodeData } from '@/components/common/feature-node';\nimport type { PrdQuestionnaireData } from '@/components/common/prd-questionnaire';\nimport type { TechDecisionsReviewData } from '@/components/common/tech-decisions-review';\nimport type { ProductDecisionsSummaryData } from '@/components/common/product-decisions-summary';\nimport type { MergeReviewData } from '@/components/common/merge-review';\nimport { PrdQuestionnaire } from '@/components/common/prd-questionnaire';\nimport { TechDecisionsContent } from '@/components/common/tech-decisions-review';\nimport { ProductDecisionsSummary } from '@/components/common/product-decisions-summary';\nimport { MergeReview } from '@/components/common/merge-review';\nimport { DrawerActionBar } from '@/components/common/drawer-action-bar';\nimport type { RejectAttachment } from '@/components/common/drawer-action-bar';\nimport { OverviewTab } from './overview-tab';\nimport { ActivityTab } from './activity-tab';\nimport { LogTab } from './log-tab';\nimport { PlanTab } from './plan-tab';\nimport { useFeatureLogs } from '@/hooks/use-feature-logs';\nimport { useTabDataFetch } from './use-tab-data-fetch';\nimport type { TabFetchers } from './use-tab-data-fetch';\nimport type { FeatureTabKey } from '@/components/common/control-center-drawer/drawer-view';\n\n/** Lazy-loaded tab keys (tabs that fetch data on activation). */\ntype LazyTabKey = 'activity' | 'plan';\n\n/** Tab definition for rendering the tab list dynamically. */\ninterface TabDef {\n key: FeatureTabKey;\n label: string;\n}\n\n/** All possible tabs in display order. */\nconst ALL_TABS: TabDef[] = [\n { key: 'overview', label: 'Overview' },\n { key: 'activity', label: 'Activity' },\n { key: 'log', label: 'Log' },\n { key: 'plan', label: 'Plan' },\n { key: 'prd-review', label: 'PRD Review' },\n { key: 'tech-decisions', label: 'Tech Decisions' },\n { key: 'product-decisions', label: 'Product' },\n { key: 'merge-review', label: 'Merge Review' },\n];\n\n/** Phases where a plan exists (planning happens at start of implementation). */\nconst PLAN_PHASES = new Set(['implementation', 'review', 'deploy', 'maintain']);\n\n/** Compute which tabs are visible based on feature lifecycle + state. */\nfunction computeVisibleTabs(node: FeatureNodeData): FeatureTabKey[] {\n const tabs: FeatureTabKey[] = ['overview', 'activity', 'log'];\n\n if (\n PLAN_PHASES.has(node.lifecycle) &&\n !(node.lifecycle === 'implementation' && node.state === 'action-required')\n ) {\n tabs.push('plan');\n }\n if (node.lifecycle === 'requirements' && node.state === 'action-required') {\n tabs.push('prd-review');\n }\n if (node.lifecycle === 'implementation' && node.state === 'action-required') {\n tabs.push('tech-decisions', 'product-decisions');\n }\n if (node.lifecycle === 'review' && (node.state === 'action-required' || node.state === 'error')) {\n tabs.push('merge-review');\n }\n\n return tabs;\n}\n\nexport interface FeatureDrawerTabsProps {\n featureNode: FeatureNodeData;\n featureId: string;\n initialTab?: FeatureTabKey;\n /** Tab key from URL path segment (e.g. /feature/[id]/activity → 'activity'). */\n urlTab?: FeatureTabKey;\n /** SSE events from the agent events provider, used to trigger tab data refresh. */\n sseEvents?: readonly NotificationEvent[];\n\n // PRD review\n prdData?: PrdQuestionnaireData | null;\n prdSelections?: Record<string, string>;\n onPrdSelect?: (questionId: string, optionId: string) => void;\n onPrdApprove?: (actionId: string) => void;\n onPrdReject?: (feedback: string, attachments: RejectAttachment[]) => void;\n isPrdLoading?: boolean;\n\n // Tech decisions\n techData?: TechDecisionsReviewData | null;\n onTechApprove?: () => void;\n onTechReject?: (feedback: string, attachments: RejectAttachment[]) => void;\n isTechLoading?: boolean;\n\n // Product decisions\n productData?: ProductDecisionsSummaryData | null;\n\n // Merge review\n mergeData?: MergeReviewData | null;\n onMergeApprove?: () => void;\n onMergeReject?: (feedback: string, attachments: RejectAttachment[]) => void;\n isMergeLoading?: boolean;\n\n // Shared\n isRejecting?: boolean;\n chatInput?: string;\n onChatInputChange?: (value: string) => void;\n}\n\ninterface ActivityData {\n timings: PhaseTimingData[];\n rejectionFeedback: RejectionFeedbackData[];\n}\n\nasync function fetchActivity(featureId: string): Promise<ActivityData> {\n const result = await getFeaturePhaseTimings(featureId);\n if ('error' in result) throw new Error(result.error);\n return { timings: result.timings, rejectionFeedback: result.rejectionFeedback };\n}\n\nasync function fetchPlan(featureId: string): Promise<PlanData | undefined> {\n const result = await getFeaturePlan(featureId);\n if ('error' in result) throw new Error(result.error);\n return result.plan;\n}\n\nconst TAB_FETCHERS: TabFetchers<LazyTabKey> = {\n activity: fetchActivity,\n plan: fetchPlan,\n};\n\nexport function FeatureDrawerTabs({\n featureNode,\n featureId,\n initialTab,\n urlTab,\n prdData,\n prdSelections,\n onPrdSelect,\n onPrdApprove,\n onPrdReject,\n isPrdLoading,\n techData,\n onTechApprove,\n onTechReject,\n isTechLoading,\n productData,\n mergeData,\n onMergeApprove,\n onMergeReject,\n isMergeLoading,\n isRejecting,\n chatInput,\n onChatInputChange,\n sseEvents,\n}: FeatureDrawerTabsProps) {\n const pathname = usePathname();\n const featureLogs = useFeatureLogs(featureId);\n\n const visibleTabs = useMemo(() => computeVisibleTabs(featureNode), [featureNode]);\n const visibleTabDefs = useMemo(\n () => ALL_TABS.filter((t) => visibleTabs.includes(t.key)),\n [visibleTabs]\n );\n\n // Derive the base path (without tab segment) from the current pathname.\n // e.g. /feature/abc123/activity → /feature/abc123\n const basePath = useMemo(() => {\n const match = pathname.match(/^(\\/feature\\/[^/]+)/);\n return match ? match[1] : pathname;\n }, [pathname]);\n\n // Resolve the effective initial tab: URL path tab > initialTab prop > 'overview'\n const effectiveInitial = useMemo(() => {\n if (urlTab && visibleTabs.includes(urlTab)) return urlTab;\n if (initialTab && visibleTabs.includes(initialTab)) return initialTab;\n return 'overview';\n // Only compute on mount — subsequent changes are handled by effects below\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n const [activeTab, setActiveTab] = useState<FeatureTabKey>(effectiveInitial);\n\n const { tabs, fetchTab, refreshTab } = useTabDataFetch<LazyTabKey>(featureId, TAB_FETCHERS);\n\n // Sync URL when active tab changes via user interaction.\n // Use window.history.pushState instead of router.push to avoid triggering a\n // server component re-render (which would remount the drawer).\n const isUserInteraction = useRef(false);\n useEffect(() => {\n if (!isUserInteraction.current) return;\n isUserInteraction.current = false;\n\n // Build the target URL from the base path + tab segment\n const targetUrl = activeTab === 'overview' ? basePath : `${basePath}/${activeTab}`;\n // Only update URL if it actually changed\n if (targetUrl !== pathname) {\n window.history.pushState(null, '', targetUrl);\n }\n }, [activeTab, basePath, pathname]);\n\n // Sync active tab from URL when pathname changes (e.g. browser back/forward).\n // Skip on initial mount — the effectiveInitial handles that via urlTab prop.\n const prevPathnameRef = useRef(pathname);\n useEffect(() => {\n if (prevPathnameRef.current === pathname) return; // Skip initial mount\n prevPathnameRef.current = pathname;\n if (isUserInteraction.current) return; // Skip — this is our own navigation\n const segments = pathname.split('/');\n // pathname is /feature/[id] or /feature/[id]/[tab]\n const pathTab = segments.length >= 4 ? (segments[3] as FeatureTabKey) : undefined;\n const resolved = pathTab && visibleTabs.includes(pathTab) ? pathTab : 'overview';\n if (resolved !== activeTab) {\n setActiveTab(resolved);\n if (resolved === 'activity' || resolved === 'plan') {\n fetchTab(resolved);\n }\n }\n }, [pathname]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // On mount, sync the URL to reflect the effective initial tab when it was\n // derived from feature state (initialTab) rather than from the URL (urlTab).\n // Use replaceState so we don't add a duplicate history entry.\n const initialSyncDone = useRef(false);\n useEffect(() => {\n if (initialSyncDone.current) return;\n initialSyncDone.current = true;\n // Only sync if the effective tab came from initialTab (not from URL)\n if (!urlTab && effectiveInitial !== 'overview') {\n const targetUrl = `${basePath}/${effectiveInitial}`;\n if (targetUrl !== pathname) {\n window.history.replaceState(null, '', targetUrl);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Trigger lazy fetch for URL-driven initial tab\n const initialFetchDone = useRef(false);\n useEffect(() => {\n if (initialFetchDone.current) return;\n initialFetchDone.current = true;\n if (activeTab === 'activity' || activeTab === 'plan') {\n fetchTab(activeTab);\n }\n }, [activeTab, fetchTab]);\n\n // Reset tab when featureId changes\n const prevFeatureIdRef = useRef(featureId);\n useEffect(() => {\n if (prevFeatureIdRef.current !== featureId) {\n prevFeatureIdRef.current = featureId;\n setActiveTab('overview');\n }\n }, [featureId]);\n\n // When initialTab changes (e.g. SSE updates lifecycle), switch to it if visible\n // and sync the URL with replaceState so the address bar reflects the new tab.\n // Also trigger lazy fetch for the new tab so data is ready immediately.\n const prevInitialTabRef = useRef(initialTab);\n useEffect(() => {\n if (\n prevInitialTabRef.current !== initialTab &&\n initialTab &&\n visibleTabs.includes(initialTab)\n ) {\n prevInitialTabRef.current = initialTab;\n setActiveTab(initialTab);\n // Trigger lazy fetch for the new tab if it's a lazy-loaded tab\n if (initialTab === 'activity' || initialTab === 'plan') {\n fetchTab(initialTab as LazyTabKey);\n }\n // Sync URL to match the new tab\n const targetUrl = initialTab === 'overview' ? basePath : `${basePath}/${initialTab}`;\n if (targetUrl !== window.location.pathname) {\n window.history.replaceState(null, '', targetUrl);\n }\n }\n }, [initialTab, visibleTabs, basePath, fetchTab]);\n\n // If the active tab becomes invisible (lifecycle changed), fall back to overview\n // and sync the URL accordingly.\n useEffect(() => {\n if (!visibleTabs.includes(activeTab)) {\n setActiveTab('overview');\n if (window.location.pathname !== basePath) {\n window.history.replaceState(null, '', basePath);\n }\n }\n }, [visibleTabs, activeTab, basePath]);\n\n // SSE refresh: re-fetch lazy tab data when relevant SSE events arrive\n // for this feature (e.g. PhaseCompleted, AgentStarted, AgentCompleted).\n // Always refresh 'activity' data (even if not the active tab) so switching\n // to the activity tab shows up-to-date timings without a loading flash.\n const activeTabRef = useRef(activeTab);\n activeTabRef.current = activeTab;\n const sseProcessedRef = useRef(0);\n\n useEffect(() => {\n if (!sseEvents || sseEvents.length === 0) return;\n // Clamp cursor if events were pruned\n if (sseProcessedRef.current > sseEvents.length) {\n sseProcessedRef.current = 0;\n }\n if (sseEvents.length <= sseProcessedRef.current) return;\n\n const newEvents = sseEvents.slice(sseProcessedRef.current);\n sseProcessedRef.current = sseEvents.length;\n\n const hasRelevantEvent = newEvents.some((e) => e.featureId === featureId);\n if (!hasRelevantEvent) return;\n\n // Always refresh activity data so it stays current for when the user switches tabs\n refreshTab('activity' as LazyTabKey);\n\n const current = activeTabRef.current;\n if (current === 'plan') {\n refreshTab(current);\n }\n }, [sseEvents, featureId, refreshTab]);\n\n const handleTabChange = useCallback(\n (value: string) => {\n const tab = value as FeatureTabKey;\n isUserInteraction.current = true;\n setActiveTab(tab);\n if (tab === 'activity' || tab === 'plan') {\n fetchTab(tab);\n }\n },\n [fetchTab]\n );\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <Tabs\n value={activeTab}\n onValueChange={handleTabChange}\n className=\"flex min-h-0 flex-1 flex-col\"\n >\n <div className=\"shrink-0 overflow-x-auto px-4 pt-4\">\n <TabsList className=\"flex w-full\">\n {visibleTabDefs.map((tab) => (\n <TabsTrigger key={tab.key} value={tab.key} className=\"flex-1\">\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </div>\n\n <TabsContent value=\"overview\" className=\"mt-0 flex-1 overflow-y-auto\">\n <OverviewTab data={featureNode} />\n </TabsContent>\n\n <TabsContent value=\"activity\" className=\"mt-0 flex-1 overflow-y-auto\">\n <ActivityTab\n timings={(tabs.activity.data as ActivityData | null)?.timings ?? null}\n loading={tabs.activity.loading}\n error={tabs.activity.error}\n rejectionFeedback={(tabs.activity.data as ActivityData | null)?.rejectionFeedback}\n />\n </TabsContent>\n\n <TabsContent value=\"log\" className=\"mt-0 flex-1 overflow-hidden\">\n <LogTab\n content={featureLogs.content}\n isConnected={featureLogs.isConnected}\n error={featureLogs.error}\n />\n </TabsContent>\n\n <TabsContent value=\"plan\" className=\"mt-0 flex-1 overflow-y-auto\">\n <PlanTab\n plan={tabs.plan.data as PlanData | null}\n loading={tabs.plan.loading}\n error={tabs.plan.error}\n />\n </TabsContent>\n\n {/* PRD Review tab */}\n {visibleTabs.includes('prd-review') ? (\n <TabsContent value=\"prd-review\" className=\"mt-0 flex min-h-0 flex-1 flex-col\">\n {prdData ? (\n <PrdQuestionnaire\n data={prdData}\n selections={prdSelections ?? {}}\n onSelect={onPrdSelect ?? (() => undefined)}\n onApprove={onPrdApprove ?? (() => undefined)}\n onReject={onPrdReject}\n isProcessing={isPrdLoading}\n isRejecting={isRejecting}\n chatInput={chatInput}\n onChatInputChange={onChatInputChange}\n />\n ) : (\n <div className=\"flex items-center justify-center p-8\">\n <Loader2 className=\"text-muted-foreground h-6 w-6 animate-spin\" />\n </div>\n )}\n </TabsContent>\n ) : null}\n\n {/* Tech Decisions tab */}\n {visibleTabs.includes('tech-decisions') ? (\n <TabsContent value=\"tech-decisions\" className=\"mt-0 flex min-h-0 flex-1 flex-col\">\n {techData ? (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex-1 overflow-y-auto\">\n <TechDecisionsContent data={techData} />\n </div>\n <DrawerActionBarForTech\n onApprove={onTechApprove ?? (() => undefined)}\n onReject={onTechReject}\n isProcessing={isTechLoading}\n isRejecting={isRejecting}\n chatInput={chatInput}\n onChatInputChange={onChatInputChange}\n />\n </div>\n ) : (\n <div className=\"flex items-center justify-center p-8\">\n <Loader2 className=\"text-muted-foreground h-6 w-6 animate-spin\" />\n </div>\n )}\n </TabsContent>\n ) : null}\n\n {/* Product Decisions tab */}\n {visibleTabs.includes('product-decisions') ? (\n <TabsContent value=\"product-decisions\" className=\"mt-0 flex-1 overflow-y-auto\">\n {productData === null ? (\n <div className=\"flex items-center justify-center p-8\">\n <Loader2 className=\"text-muted-foreground h-6 w-6 animate-spin\" />\n </div>\n ) : productData ? (\n <ProductDecisionsSummary data={productData} />\n ) : (\n <p className=\"text-muted-foreground p-4 text-center text-sm\">\n No product decisions available.\n </p>\n )}\n </TabsContent>\n ) : null}\n\n {/* Merge Review tab */}\n {visibleTabs.includes('merge-review') ? (\n <TabsContent value=\"merge-review\" className=\"mt-0 flex min-h-0 flex-1 flex-col\">\n {mergeData ? (\n <MergeReview\n data={mergeData}\n onApprove={onMergeApprove ?? (() => undefined)}\n onReject={onMergeReject}\n isProcessing={isMergeLoading}\n isRejecting={isRejecting}\n chatInput={chatInput}\n onChatInputChange={onChatInputChange}\n />\n ) : (\n <div className=\"flex items-center justify-center p-8\">\n <Loader2 className=\"text-muted-foreground h-6 w-6 animate-spin\" />\n </div>\n )}\n </TabsContent>\n ) : null}\n </Tabs>\n </div>\n );\n}\n\n// ── Private helper ──────────────────────────────────────────────────────\n\nfunction DrawerActionBarForTech({\n onApprove,\n onReject,\n isProcessing,\n isRejecting,\n chatInput,\n onChatInputChange,\n}: {\n onApprove: () => void;\n onReject?: (feedback: string, attachments: RejectAttachment[]) => void;\n isProcessing?: boolean;\n isRejecting?: boolean;\n chatInput?: string;\n onChatInputChange?: (value: string) => void;\n}) {\n return (\n <DrawerActionBar\n onReject={onReject}\n onApprove={onApprove}\n approveLabel=\"Approve Plan\"\n revisionPlaceholder=\"Ask AI to revise the plan...\"\n isProcessing={isProcessing}\n isRejecting={isRejecting}\n chatInput={chatInput}\n onChatInputChange={onChatInputChange}\n />\n );\n}\n","'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { openIde } from '@/app/actions/open-ide';\nimport { openShell } from '@/app/actions/open-shell';\nimport { openFolder } from '@/app/actions/open-folder';\n\nexport interface FeatureActionsInput {\n repositoryPath: string;\n branch: string;\n specPath?: string;\n}\n\nexport interface FeatureActionsState {\n openInIde: () => Promise<void>;\n openInShell: () => Promise<void>;\n openSpecsFolder: () => Promise<void>;\n ideLoading: boolean;\n shellLoading: boolean;\n specsLoading: boolean;\n ideError: string | null;\n shellError: string | null;\n specsError: string | null;\n}\n\nconst ERROR_CLEAR_DELAY = 5000;\n\nexport function useFeatureActions(input: FeatureActionsInput | null): FeatureActionsState {\n const [ideLoading, setIdeLoading] = useState(false);\n const [shellLoading, setShellLoading] = useState(false);\n const [specsLoading, setSpecsLoading] = useState(false);\n const [ideError, setIdeError] = useState<string | null>(null);\n const [shellError, setShellError] = useState<string | null>(null);\n const [specsError, setSpecsError] = useState<string | null>(null);\n\n const ideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const shellTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const specsTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Clear timers on unmount — read .current inside cleanup so we get the\n // actual timer value at teardown time, not the always-null value at mount.\n useEffect(() => {\n const refs = [ideTimerRef, shellTimerRef, specsTimerRef];\n return () => {\n for (const ref of refs) {\n if (ref.current) clearTimeout(ref.current);\n }\n };\n }, []);\n\n const performAction = useCallback(\n async (\n action: (input: { repositoryPath: string; branch?: string }) => Promise<{\n success: boolean;\n error?: string;\n }>,\n setLoading: (v: boolean) => void,\n setError: (v: string | null) => void,\n timerRef: React.RefObject<ReturnType<typeof setTimeout> | null>,\n isLoading: boolean\n ) => {\n if (!input || isLoading) return;\n\n // Clear any existing timer\n if (timerRef.current) clearTimeout(timerRef.current);\n\n setLoading(true);\n setError(null);\n\n try {\n const result = await action({\n repositoryPath: input.repositoryPath,\n branch: input.branch,\n });\n\n if (!result.success) {\n const errorMessage = result.error ?? 'An unexpected error occurred';\n setError(errorMessage);\n timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);\n }\n } catch (err: unknown) {\n const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';\n setError(errorMessage);\n timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);\n } finally {\n setLoading(false);\n }\n },\n [input]\n );\n\n const handleOpenIde = useCallback(\n () => performAction(openIde, setIdeLoading, setIdeError, ideTimerRef, ideLoading),\n [performAction, ideLoading]\n );\n\n const handleOpenShell = useCallback(\n () => performAction(openShell, setShellLoading, setShellError, shellTimerRef, shellLoading),\n [performAction, shellLoading]\n );\n\n const handleOpenSpecsFolder = useCallback(async () => {\n if (!input?.specPath || specsLoading) return;\n\n if (specsTimerRef.current) clearTimeout(specsTimerRef.current);\n\n setSpecsLoading(true);\n setSpecsError(null);\n\n try {\n const result = await openFolder(input.specPath);\n\n if (!result.success) {\n const errorMessage = result.error ?? 'An unexpected error occurred';\n setSpecsError(errorMessage);\n specsTimerRef.current = setTimeout(() => setSpecsError(null), ERROR_CLEAR_DELAY);\n }\n } catch (err: unknown) {\n const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';\n setSpecsError(errorMessage);\n specsTimerRef.current = setTimeout(() => setSpecsError(null), ERROR_CLEAR_DELAY);\n } finally {\n setSpecsLoading(false);\n }\n }, [input, specsLoading]);\n\n return {\n openInIde: handleOpenIde,\n openInShell: handleOpenShell,\n openSpecsFolder: handleOpenSpecsFolder,\n ideLoading,\n shellLoading,\n specsLoading,\n ideError,\n shellError,\n specsError,\n };\n}\n","'use client';\n\nimport { useState, useEffect, useRef } from 'react';\nimport { toast } from 'sonner';\n\n/**\n * Generic hook for fetching drawer artifact data when a feature ID changes.\n * Handles loading state, cancellation on unmount/re-fetch, and error toasting.\n *\n * @param featureId - The feature ID to fetch for, or null to reset.\n * @param fetcher - Async function that fetches the artifact data.\n * @param onSuccess - Called with the fetch result when successful and not cancelled.\n * @param onReset - Called immediately when featureId changes (before fetching).\n * @param errorMessage - Optional toast message shown on fetch failure.\n * @returns Whether the fetch is currently in progress.\n */\nexport function useArtifactFetch<TResult>(\n featureId: string | null,\n fetcher: (id: string) => Promise<TResult>,\n onSuccess: (result: TResult) => void,\n onReset: () => void,\n errorMessage?: string\n): boolean {\n const [isLoading, setIsLoading] = useState(false);\n\n // Use refs to avoid stale callbacks in the effect without triggering re-runs.\n const onSuccessRef = useRef(onSuccess);\n const onResetRef = useRef(onReset);\n onSuccessRef.current = onSuccess;\n onResetRef.current = onReset;\n\n useEffect(() => {\n onResetRef.current();\n if (!featureId) return;\n\n let cancelled = false;\n setIsLoading(true);\n\n fetcher(featureId)\n .then((result) => {\n if (!cancelled) onSuccessRef.current(result);\n })\n .catch(() => {\n if (!cancelled && errorMessage) toast.error(errorMessage);\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [featureId, fetcher, errorMessage]);\n\n return isLoading;\n}\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nconst cometSpinnerVariants = cva('inline-block shrink-0', {\n variants: {\n size: {\n sm: 'size-5',\n md: 'size-8',\n lg: 'size-12',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport interface CometSpinnerProps\n extends React.SVGAttributes<SVGSVGElement>,\n VariantProps<typeof cometSpinnerVariants> {\n /** Duration in seconds for the outer rotation. */\n duration?: number;\n}\n\nconst PARTICLES = [\n { r: 9, spline: '0.12 0 0.04 1', opacity: 1 },\n { r: 8.2, spline: '0.16 0 0.08 1', opacity: 0.95 },\n { r: 7.4, spline: '0.20 0 0.12 1', opacity: 0.9 },\n { r: 6.6, spline: '0.25 0 0.16 1', opacity: 0.84 },\n { r: 5.8, spline: '0.30 0 0.20 1', opacity: 0.76 },\n { r: 5, spline: '0.36 0 0.25 1', opacity: 0.67 },\n { r: 4.2, spline: '0.42 0 0.31 1', opacity: 0.56 },\n { r: 3.4, spline: '0.48 0 0.37 1', opacity: 0.44 },\n { r: 2.6, spline: '0.55 0 0.44 1', opacity: 0.32 },\n { r: 1.8, spline: '0.62 0 0.52 1', opacity: 0.2 },\n { r: 1, spline: '0.70 0 0.60 1', opacity: 0.1 },\n];\n\nfunction CometSpinner({ className, size = 'md', duration = 5, ...props }: CometSpinnerProps) {\n return (\n <svg\n data-slot=\"comet-spinner\"\n role=\"status\"\n aria-label=\"Loading\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\"\n className={cn(cometSpinnerVariants({ size }), className)}\n {...props}\n >\n <defs>\n <filter\n id=\"comet-gooey\"\n x=\"-100%\"\n y=\"-100%\"\n width=\"300%\"\n height=\"300%\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"2.5\" />\n <feColorMatrix\n mode=\"matrix\"\n values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 50 -30\"\n result=\"goo\"\n />\n </filter>\n </defs>\n\n <g filter=\"url(#comet-gooey)\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 50 50\"\n to=\"360 50 50\"\n dur={`${duration}s`}\n repeatCount=\"indefinite\"\n />\n\n {PARTICLES.map((p) => (\n <g key={p.r}>\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n calcMode=\"spline\"\n values=\"0 50 50;360 50 50\"\n keyTimes=\"0;1\"\n keySplines={p.spline}\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n <circle cx=\"50\" cy=\"18\" r={p.r} fill=\"currentColor\" opacity={p.opacity} />\n </g>\n ))}\n\n <circle cx=\"50\" cy=\"50\" r=\"4\" fill=\"currentColor\" opacity=\"0.15\">\n <animate attributeName=\"r\" values=\"3;5;3\" dur=\"2s\" repeatCount=\"indefinite\" />\n <animate\n attributeName=\"opacity\"\n values=\"0.1;0.25;0.1\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </g>\n </svg>\n );\n}\n\nexport { CometSpinner, cometSpinnerVariants };\n","/**\n * Formats a duration in milliseconds to a human-friendly string.\n *\n * - 0ms → \"0s\"\n * - <1s → \"<1s\"\n * - <60s → \"Xs\"\n * - <1h → \"Xm Ys\"\n * - ≥1h → \"Xh Ym\" (seconds omitted)\n */\nexport function formatDuration(ms: number): string {\n if (ms === 0) return '0s';\n\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds === 0) return '<1s';\n\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n if (hours > 0) {\n return `${hours}h ${minutes}m`;\n }\n\n if (minutes > 0) {\n return `${minutes}m ${seconds}s`;\n }\n\n return `${seconds}s`;\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M10.1 2.182a10 10 0 0 1 3.8 0', key: '5ilxe3' }],\n ['path', { d: 'M13.9 21.818a10 10 0 0 1-3.8 0', key: '11zvb9' }],\n ['path', { d: 'M17.609 3.721a10 10 0 0 1 2.69 2.7', key: '1iw5b2' }],\n ['path', { d: 'M2.182 13.9a10 10 0 0 1 0-3.8', key: 'c0bmvh' }],\n ['path', { d: 'M20.279 17.609a10 10 0 0 1-2.7 2.69', key: '1ruxm7' }],\n ['path', { d: 'M21.818 10.1a10 10 0 0 1 0 3.8', key: 'qkgqxc' }],\n ['path', { d: 'M3.721 6.391a10 10 0 0 1 2.7-2.69', key: '1mcia2' }],\n ['path', { d: 'M6.391 20.279a10 10 0 0 1-2.69-2.7', key: '1fvljs' }],\n];\n\n/**\n * @component @name CircleDashed\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/circle-dashed\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleDashed = createLucideIcon('circle-dashed', __iconNode);\n\nexport default CircleDashed;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1', key: 'tgr4d6' }],\n [\n 'path',\n {\n d: 'M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2',\n key: '116196',\n },\n ],\n ['path', { d: 'M12 11h4', key: '1jrz19' }],\n ['path', { d: 'M12 16h4', key: 'n85exb' }],\n ['path', { d: 'M8 11h.01', key: '1dfujw' }],\n ['path', { d: 'M8 16h.01', key: '18s6g9' }],\n];\n\n/**\n * @component @name ClipboardList\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/clipboard-list\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ClipboardList = createLucideIcon('clipboard-list', __iconNode);\n\nexport default ClipboardList;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'm12 5 7 7-7 7', key: 'xquz4c' }],\n];\n\n/**\n * @component @name ArrowRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowRight = createLucideIcon('arrow-right', __iconNode);\n\nexport default ArrowRight;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 6v6l4 2', key: 'mmk7yg' }],\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n];\n\n/**\n * @component @name Clock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/clock\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Clock = createLucideIcon('clock', __iconNode);\n\nexport default Clock;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M13 5h8', key: 'a7qcls' }],\n ['path', { d: 'M13 12h8', key: 'h98zly' }],\n ['path', { d: 'M13 19h8', key: 'c3s6r1' }],\n ['path', { d: 'm3 17 2 2 4-4', key: '1jhpwq' }],\n ['rect', { x: '3', y: '4', width: '6', height: '6', rx: '1', key: 'cif1o7' }],\n];\n\n/**\n * @component @name ListTodo\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/list-todo\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ListTodo = createLucideIcon('list-todo', __iconNode);\n\nexport default ListTodo;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 5v14', key: 's699le' }],\n ['path', { d: 'm19 12-7 7-7-7', key: '1idqje' }],\n];\n\n/**\n * @component @name ArrowDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowDown = createLucideIcon('arrow-down', __iconNode);\n\nexport default ArrowDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['line', { x1: '2', x2: '22', y1: '2', y2: '22', key: 'a6p6uj' }],\n ['path', { d: 'M10.41 10.41a2 2 0 1 1-2.83-2.83', key: '1bzlo9' }],\n ['line', { x1: '13.5', x2: '6', y1: '13.5', y2: '21', key: '1q0aeu' }],\n ['line', { x1: '18', x2: '21', y1: '12', y2: '15', key: '5mozeu' }],\n [\n 'path',\n {\n d: 'M3.59 3.59A1.99 1.99 0 0 0 3 5v14a2 2 0 0 0 2 2h14c.55 0 1.052-.22 1.41-.59',\n key: 'mmje98',\n },\n ],\n ['path', { d: 'M21 15V5a2 2 0 0 0-2-2H9', key: '43el77' }],\n];\n\n/**\n * @component @name ImageOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/image-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ImageOff = createLucideIcon('image-off', __iconNode);\n\nexport default ImageOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '5', cy: '6', r: '3', key: '1qnov2' }],\n ['path', { d: 'M12 6h5a2 2 0 0 1 2 2v7', key: '1yj91y' }],\n ['path', { d: 'm15 9-3-3 3-3', key: '1lwv8l' }],\n ['circle', { cx: '19', cy: '18', r: '3', key: '1qljk2' }],\n ['path', { d: 'M12 18H7a2 2 0 0 1-2-2V9', key: '16sdep' }],\n ['path', { d: 'm9 15 3 3-3 3', key: '1m3kbl' }],\n];\n\n/**\n * @component @name GitCompareArrows\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/git-compare-arrows\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GitCompareArrows = createLucideIcon('git-compare-arrows', __iconNode);\n\nexport default GitCompareArrows;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n ['line', { x1: '3', x2: '9', y1: '12', y2: '12', key: '1dyftd' }],\n ['line', { x1: '15', x2: '21', y1: '12', y2: '12', key: 'oup4p8' }],\n];\n\n/**\n * @component @name GitCommitHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/git-commit-horizontal\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GitCommitHorizontal = createLucideIcon('git-commit-horizontal', __iconNode);\n\nexport default GitCommitHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M15.033 9.44a.647.647 0 0 1 0 1.12l-4.065 2.352a.645.645 0 0 1-.968-.56V7.648a.645.645 0 0 1 .967-.56z',\n key: 'vbtd3f',\n },\n ],\n ['path', { d: 'M12 17v4', key: '1riwvh' }],\n ['path', { d: 'M8 21h8', key: '1ev6f3' }],\n ['rect', { x: '2', y: '3', width: '20', height: '14', rx: '2', key: 'x3v2xh' }],\n];\n\n/**\n * @component @name MonitorPlay\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/monitor-play\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MonitorPlay = createLucideIcon('monitor-play', __iconNode);\n\nexport default MonitorPlay;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n key: '1oefj6',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n ['path', { d: 'M9 15h6', key: 'cctwl0' }],\n];\n\n/**\n * @component @name FileMinus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/file-minus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FileMinus = createLucideIcon('file-minus', __iconNode);\n\nexport default FileMinus;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3',\n key: 'wmoenq',\n },\n ],\n ['path', { d: 'M12 9v4', key: 'juzpu7' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n];\n\n/**\n * @component @name TriangleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/triangle-alert\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst TriangleAlert = createLucideIcon('triangle-alert', __iconNode);\n\nexport default TriangleAlert;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n key: '1oefj6',\n },\n ],\n ['path', { d: 'M9 10h6', key: '9gxzsh' }],\n ['path', { d: 'M12 13V7', key: 'h0r20n' }],\n ['path', { d: 'M9 17h6', key: 'r8uit2' }],\n];\n\n/**\n * @component @name FileDiff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/file-diff\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FileDiff = createLucideIcon('file-diff', __iconNode);\n\nexport default FileDiff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z',\n key: 'zw3jo',\n },\n ],\n [\n 'path',\n {\n d: 'M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12',\n key: '1wduqc',\n },\n ],\n [\n 'path',\n {\n d: 'M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17',\n key: 'kqbvx6',\n },\n ],\n];\n\n/**\n * @component @name Layers\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/layers\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Layers = createLucideIcon('layers', __iconNode);\n\nexport default Layers;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n key: '1oefj6',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n ['path', { d: 'M9 15h6', key: 'cctwl0' }],\n ['path', { d: 'M12 18v-6', key: '17g6i2' }],\n];\n\n/**\n * @component @name FilePlus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/file-plus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FilePlus = createLucideIcon('file-plus', __iconNode);\n\nexport default FilePlus;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v9.34',\n key: 'o6klzx',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n [\n 'path',\n {\n d: 'M10.378 12.622a1 1 0 0 1 3 3.003L8.36 20.637a2 2 0 0 1-.854.506l-2.867.837a.5.5 0 0 1-.62-.62l.836-2.869a2 2 0 0 1 .506-.853z',\n key: 'zhnas1',\n },\n ],\n];\n\n/**\n * @component @name FilePen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/file-pen\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FilePen = createLucideIcon('file-pen', __iconNode);\n\nexport default FilePen;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z',\n key: '18u6gg',\n },\n ],\n ['circle', { cx: '12', cy: '13', r: '3', key: '1vg3eu' }],\n];\n\n/**\n * @component @name Camera\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/camera\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Camera = createLucideIcon('camera', __iconNode);\n\nexport default Camera;\n","import type { FeatureNodeData } from '@/components/common/feature-node';\nimport type { RepositoryNodeData } from '@/components/common/repository-node';\nimport type { ParentFeatureOption } from '@/components/common/feature-create-drawer/feature-create-drawer';\nimport type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';\n\n/** Tab key matching FeatureDrawerTabs */\nexport type FeatureTabKey =\n | 'overview'\n | 'activity'\n | 'log'\n | 'plan'\n | 'prd-review'\n | 'tech-decisions'\n | 'product-decisions'\n | 'merge-review';\n\n/** All valid tab key values — used for URL param validation. */\nexport const VALID_TAB_KEYS: ReadonlySet<string> = new Set<FeatureTabKey>([\n 'overview',\n 'activity',\n 'log',\n 'plan',\n 'prd-review',\n 'tech-decisions',\n 'product-decisions',\n 'merge-review',\n]);\n\n/** Type-guard: returns the value as FeatureTabKey if valid, otherwise undefined. */\nexport function parseTabKey(value: string | null | undefined): FeatureTabKey | undefined {\n if (value && VALID_TAB_KEYS.has(value)) return value as FeatureTabKey;\n return undefined;\n}\n\n/**\n * Discriminated union representing every possible drawer state in the control center.\n * Only one view can be active at a time.\n */\nexport type DrawerView =\n /** All feature views — tabs handle the lifecycle-specific content */\n | { type: 'feature'; node: FeatureNodeData; initialTab: FeatureTabKey }\n /** Feature creation form */\n | {\n type: 'feature-create';\n repositoryPath: string;\n initialParentId?: string;\n features: ParentFeatureOption[];\n workflowDefaults?: WorkflowDefaults;\n }\n /** Repository node actions */\n | { type: 'repository'; data: RepositoryNodeData };\n\n/** Derives the initial tab from node lifecycle + state. */\nexport function deriveInitialTab(node: FeatureNodeData): FeatureTabKey {\n if (node.lifecycle === 'requirements' && node.state === 'action-required') return 'prd-review';\n if (node.lifecycle === 'implementation' && node.state === 'action-required')\n return 'tech-decisions';\n if (node.lifecycle === 'review' && (node.state === 'action-required' || node.state === 'error'))\n return 'merge-review';\n return 'overview';\n}\n\n/**\n * Derives the active DrawerView from control-center state.\n * Priority: feature-create > selected-node > repository\n */\nexport function computeDrawerView({\n selectedNode,\n isCreateDrawerOpen,\n pendingRepositoryPath,\n pendingParentFeatureId,\n selectedRepoNode,\n features,\n workflowDefaults,\n}: {\n selectedNode: FeatureNodeData | null;\n isCreateDrawerOpen: boolean;\n pendingRepositoryPath: string;\n pendingParentFeatureId: string | undefined;\n selectedRepoNode: RepositoryNodeData | null;\n features: ParentFeatureOption[];\n workflowDefaults: WorkflowDefaults | undefined;\n}): DrawerView | null {\n if (isCreateDrawerOpen) {\n return {\n type: 'feature-create',\n repositoryPath: pendingRepositoryPath,\n initialParentId: pendingParentFeatureId,\n features,\n workflowDefaults,\n };\n }\n\n if (selectedNode) {\n return { type: 'feature', node: selectedNode, initialTab: deriveInitialTab(selectedNode) };\n }\n\n if (selectedRepoNode) {\n return { type: 'repository', data: selectedRepoNode };\n }\n\n return null;\n}\n","import * as React from 'react';\nimport { composeEventHandlers } from '@radix-ui/primitive';\nimport { composeRefs } from '@radix-ui/react-compose-refs';\nimport { createContextScope } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport * as MenuPrimitive from '@radix-ui/react-menu';\nimport { createMenuScope } from '@radix-ui/react-menu';\nimport { useId } from '@radix-ui/react-id';\n\nimport type { Scope } from '@radix-ui/react-context';\n\ntype Direction = 'ltr' | 'rtl';\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenu\n * -----------------------------------------------------------------------------------------------*/\n\nconst DROPDOWN_MENU_NAME = 'DropdownMenu';\n\ntype ScopedProps<P> = P & { __scopeDropdownMenu?: Scope };\nconst [createDropdownMenuContext, createDropdownMenuScope] = createContextScope(\n DROPDOWN_MENU_NAME,\n [createMenuScope]\n);\nconst useMenuScope = createMenuScope();\n\ntype DropdownMenuContextValue = {\n triggerId: string;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n contentId: string;\n open: boolean;\n onOpenChange(open: boolean): void;\n onOpenToggle(): void;\n modal: boolean;\n};\n\nconst [DropdownMenuProvider, useDropdownMenuContext] =\n createDropdownMenuContext<DropdownMenuContextValue>(DROPDOWN_MENU_NAME);\n\ninterface DropdownMenuProps {\n children?: React.ReactNode;\n dir?: Direction;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?(open: boolean): void;\n modal?: boolean;\n}\n\nconst DropdownMenu: React.FC<DropdownMenuProps> = (props: ScopedProps<DropdownMenuProps>) => {\n const {\n __scopeDropdownMenu,\n children,\n dir,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true,\n } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: DROPDOWN_MENU_NAME,\n });\n\n return (\n <DropdownMenuProvider\n scope={__scopeDropdownMenu}\n triggerId={useId()}\n triggerRef={triggerRef}\n contentId={useId()}\n open={open}\n onOpenChange={setOpen}\n onOpenToggle={React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen])}\n modal={modal}\n >\n <MenuPrimitive.Root {...menuScope} open={open} onOpenChange={setOpen} dir={dir} modal={modal}>\n {children}\n </MenuPrimitive.Root>\n </DropdownMenuProvider>\n );\n};\n\nDropdownMenu.displayName = DROPDOWN_MENU_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuTrigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst TRIGGER_NAME = 'DropdownMenuTrigger';\n\ntype DropdownMenuTriggerElement = React.ComponentRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = React.ComponentPropsWithoutRef<typeof Primitive.button>;\ninterface DropdownMenuTriggerProps extends PrimitiveButtonProps {}\n\nconst DropdownMenuTrigger = React.forwardRef<DropdownMenuTriggerElement, DropdownMenuTriggerProps>(\n (props: ScopedProps<DropdownMenuTriggerProps>, forwardedRef) => {\n const { __scopeDropdownMenu, disabled = false, ...triggerProps } = props;\n const context = useDropdownMenuContext(TRIGGER_NAME, __scopeDropdownMenu);\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return (\n <MenuPrimitive.Anchor asChild {...menuScope}>\n <Primitive.button\n type=\"button\"\n id={context.triggerId}\n aria-haspopup=\"menu\"\n aria-expanded={context.open}\n aria-controls={context.open ? context.contentId : undefined}\n data-state={context.open ? 'open' : 'closed'}\n data-disabled={disabled ? '' : undefined}\n disabled={disabled}\n {...triggerProps}\n ref={composeRefs(forwardedRef, context.triggerRef)}\n onPointerDown={composeEventHandlers(props.onPointerDown, (event) => {\n // only call handler if it's the left button (mousedown gets triggered by all mouse buttons)\n // but not when the control key is pressed (avoiding MacOS right click)\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onOpenToggle();\n // prevent trigger focusing when opening\n // this allows the content to be given focus without competition\n if (!context.open) event.preventDefault();\n }\n })}\n onKeyDown={composeEventHandlers(props.onKeyDown, (event) => {\n if (disabled) return;\n if (['Enter', ' '].includes(event.key)) context.onOpenToggle();\n if (event.key === 'ArrowDown') context.onOpenChange(true);\n // prevent keydown from scrolling window / first focused item to execute\n // that keydown (inadvertently closing the menu)\n if (['Enter', ' ', 'ArrowDown'].includes(event.key)) event.preventDefault();\n })}\n />\n </MenuPrimitive.Anchor>\n );\n }\n);\n\nDropdownMenuTrigger.displayName = TRIGGER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuPortal\n * -----------------------------------------------------------------------------------------------*/\n\nconst PORTAL_NAME = 'DropdownMenuPortal';\n\ntype MenuPortalProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.Portal>;\ninterface DropdownMenuPortalProps extends MenuPortalProps {}\n\nconst DropdownMenuPortal: React.FC<DropdownMenuPortalProps> = (\n props: ScopedProps<DropdownMenuPortalProps>\n) => {\n const { __scopeDropdownMenu, ...portalProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Portal {...menuScope} {...portalProps} />;\n};\n\nDropdownMenuPortal.displayName = PORTAL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst CONTENT_NAME = 'DropdownMenuContent';\n\ntype DropdownMenuContentElement = React.ComponentRef<typeof MenuPrimitive.Content>;\ntype MenuContentProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.Content>;\ninterface DropdownMenuContentProps extends Omit<MenuContentProps, 'onEntryFocus'> {}\n\nconst DropdownMenuContent = React.forwardRef<DropdownMenuContentElement, DropdownMenuContentProps>(\n (props: ScopedProps<DropdownMenuContentProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...contentProps } = props;\n const context = useDropdownMenuContext(CONTENT_NAME, __scopeDropdownMenu);\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const hasInteractedOutsideRef = React.useRef(false);\n\n return (\n <MenuPrimitive.Content\n id={context.contentId}\n aria-labelledby={context.triggerId}\n {...menuScope}\n {...contentProps}\n ref={forwardedRef}\n onCloseAutoFocus={composeEventHandlers(props.onCloseAutoFocus, (event) => {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n hasInteractedOutsideRef.current = false;\n // Always prevent auto focus because we either focus manually or want user agent focus\n event.preventDefault();\n })}\n onInteractOutside={composeEventHandlers(props.onInteractOutside, (event) => {\n const originalEvent = event.detail.originalEvent as PointerEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (!context.modal || isRightClick) hasInteractedOutsideRef.current = true;\n })}\n style={{\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n '--radix-dropdown-menu-content-transform-origin':\n 'var(--radix-popper-transform-origin)',\n '--radix-dropdown-menu-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-dropdown-menu-content-available-height':\n 'var(--radix-popper-available-height)',\n '--radix-dropdown-menu-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-dropdown-menu-trigger-height': 'var(--radix-popper-anchor-height)',\n },\n }}\n />\n );\n }\n);\n\nDropdownMenuContent.displayName = CONTENT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuGroup\n * -----------------------------------------------------------------------------------------------*/\n\nconst GROUP_NAME = 'DropdownMenuGroup';\n\ntype DropdownMenuGroupElement = React.ComponentRef<typeof MenuPrimitive.Group>;\ntype MenuGroupProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.Group>;\ninterface DropdownMenuGroupProps extends MenuGroupProps {}\n\nconst DropdownMenuGroup = React.forwardRef<DropdownMenuGroupElement, DropdownMenuGroupProps>(\n (props: ScopedProps<DropdownMenuGroupProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...groupProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Group {...menuScope} {...groupProps} ref={forwardedRef} />;\n }\n);\n\nDropdownMenuGroup.displayName = GROUP_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuLabel\n * -----------------------------------------------------------------------------------------------*/\n\nconst LABEL_NAME = 'DropdownMenuLabel';\n\ntype DropdownMenuLabelElement = React.ComponentRef<typeof MenuPrimitive.Label>;\ntype MenuLabelProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.Label>;\ninterface DropdownMenuLabelProps extends MenuLabelProps {}\n\nconst DropdownMenuLabel = React.forwardRef<DropdownMenuLabelElement, DropdownMenuLabelProps>(\n (props: ScopedProps<DropdownMenuLabelProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...labelProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Label {...menuScope} {...labelProps} ref={forwardedRef} />;\n }\n);\n\nDropdownMenuLabel.displayName = LABEL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuItem\n * -----------------------------------------------------------------------------------------------*/\n\nconst ITEM_NAME = 'DropdownMenuItem';\n\ntype DropdownMenuItemElement = React.ComponentRef<typeof MenuPrimitive.Item>;\ntype MenuItemProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.Item>;\ninterface DropdownMenuItemProps extends MenuItemProps {}\n\nconst DropdownMenuItem = React.forwardRef<DropdownMenuItemElement, DropdownMenuItemProps>(\n (props: ScopedProps<DropdownMenuItemProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...itemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Item {...menuScope} {...itemProps} ref={forwardedRef} />;\n }\n);\n\nDropdownMenuItem.displayName = ITEM_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuCheckboxItem\n * -----------------------------------------------------------------------------------------------*/\n\nconst CHECKBOX_ITEM_NAME = 'DropdownMenuCheckboxItem';\n\ntype DropdownMenuCheckboxItemElement = React.ComponentRef<typeof MenuPrimitive.CheckboxItem>;\ntype MenuCheckboxItemProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.CheckboxItem>;\ninterface DropdownMenuCheckboxItemProps extends MenuCheckboxItemProps {}\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n DropdownMenuCheckboxItemElement,\n DropdownMenuCheckboxItemProps\n>((props: ScopedProps<DropdownMenuCheckboxItemProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...checkboxItemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.CheckboxItem {...menuScope} {...checkboxItemProps} ref={forwardedRef} />;\n});\n\nDropdownMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuRadioGroup\n * -----------------------------------------------------------------------------------------------*/\n\nconst RADIO_GROUP_NAME = 'DropdownMenuRadioGroup';\n\ntype DropdownMenuRadioGroupElement = React.ComponentRef<typeof MenuPrimitive.RadioGroup>;\ntype MenuRadioGroupProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.RadioGroup>;\ninterface DropdownMenuRadioGroupProps extends MenuRadioGroupProps {}\n\nconst DropdownMenuRadioGroup = React.forwardRef<\n DropdownMenuRadioGroupElement,\n DropdownMenuRadioGroupProps\n>((props: ScopedProps<DropdownMenuRadioGroupProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...radioGroupProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.RadioGroup {...menuScope} {...radioGroupProps} ref={forwardedRef} />;\n});\n\nDropdownMenuRadioGroup.displayName = RADIO_GROUP_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuRadioItem\n * -----------------------------------------------------------------------------------------------*/\n\nconst RADIO_ITEM_NAME = 'DropdownMenuRadioItem';\n\ntype DropdownMenuRadioItemElement = React.ComponentRef<typeof MenuPrimitive.RadioItem>;\ntype MenuRadioItemProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.RadioItem>;\ninterface DropdownMenuRadioItemProps extends MenuRadioItemProps {}\n\nconst DropdownMenuRadioItem = React.forwardRef<\n DropdownMenuRadioItemElement,\n DropdownMenuRadioItemProps\n>((props: ScopedProps<DropdownMenuRadioItemProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...radioItemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.RadioItem {...menuScope} {...radioItemProps} ref={forwardedRef} />;\n});\n\nDropdownMenuRadioItem.displayName = RADIO_ITEM_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuItemIndicator\n * -----------------------------------------------------------------------------------------------*/\n\nconst INDICATOR_NAME = 'DropdownMenuItemIndicator';\n\ntype DropdownMenuItemIndicatorElement = React.ComponentRef<typeof MenuPrimitive.ItemIndicator>;\ntype MenuItemIndicatorProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.ItemIndicator>;\ninterface DropdownMenuItemIndicatorProps extends MenuItemIndicatorProps {}\n\nconst DropdownMenuItemIndicator = React.forwardRef<\n DropdownMenuItemIndicatorElement,\n DropdownMenuItemIndicatorProps\n>((props: ScopedProps<DropdownMenuItemIndicatorProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...itemIndicatorProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.ItemIndicator {...menuScope} {...itemIndicatorProps} ref={forwardedRef} />;\n});\n\nDropdownMenuItemIndicator.displayName = INDICATOR_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuSeparator\n * -----------------------------------------------------------------------------------------------*/\n\nconst SEPARATOR_NAME = 'DropdownMenuSeparator';\n\ntype DropdownMenuSeparatorElement = React.ComponentRef<typeof MenuPrimitive.Separator>;\ntype MenuSeparatorProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.Separator>;\ninterface DropdownMenuSeparatorProps extends MenuSeparatorProps {}\n\nconst DropdownMenuSeparator = React.forwardRef<\n DropdownMenuSeparatorElement,\n DropdownMenuSeparatorProps\n>((props: ScopedProps<DropdownMenuSeparatorProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...separatorProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Separator {...menuScope} {...separatorProps} ref={forwardedRef} />;\n});\n\nDropdownMenuSeparator.displayName = SEPARATOR_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuArrow\n * -----------------------------------------------------------------------------------------------*/\n\nconst ARROW_NAME = 'DropdownMenuArrow';\n\ntype DropdownMenuArrowElement = React.ComponentRef<typeof MenuPrimitive.Arrow>;\ntype MenuArrowProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.Arrow>;\ninterface DropdownMenuArrowProps extends MenuArrowProps {}\n\nconst DropdownMenuArrow = React.forwardRef<DropdownMenuArrowElement, DropdownMenuArrowProps>(\n (props: ScopedProps<DropdownMenuArrowProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...arrowProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Arrow {...menuScope} {...arrowProps} ref={forwardedRef} />;\n }\n);\n\nDropdownMenuArrow.displayName = ARROW_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuSub\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DropdownMenuSubProps {\n children?: React.ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?(open: boolean): void;\n}\n\nconst DropdownMenuSub: React.FC<DropdownMenuSubProps> = (\n props: ScopedProps<DropdownMenuSubProps>\n) => {\n const { __scopeDropdownMenu, children, open: openProp, onOpenChange, defaultOpen } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: 'DropdownMenuSub',\n });\n\n return (\n <MenuPrimitive.Sub {...menuScope} open={open} onOpenChange={setOpen}>\n {children}\n </MenuPrimitive.Sub>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuSubTrigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst SUB_TRIGGER_NAME = 'DropdownMenuSubTrigger';\n\ntype DropdownMenuSubTriggerElement = React.ComponentRef<typeof MenuPrimitive.SubTrigger>;\ntype MenuSubTriggerProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.SubTrigger>;\ninterface DropdownMenuSubTriggerProps extends MenuSubTriggerProps {}\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n DropdownMenuSubTriggerElement,\n DropdownMenuSubTriggerProps\n>((props: ScopedProps<DropdownMenuSubTriggerProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...subTriggerProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.SubTrigger {...menuScope} {...subTriggerProps} ref={forwardedRef} />;\n});\n\nDropdownMenuSubTrigger.displayName = SUB_TRIGGER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuSubContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst SUB_CONTENT_NAME = 'DropdownMenuSubContent';\n\ntype DropdownMenuSubContentElement = React.ComponentRef<typeof MenuPrimitive.Content>;\ntype MenuSubContentProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.SubContent>;\ninterface DropdownMenuSubContentProps extends MenuSubContentProps {}\n\nconst DropdownMenuSubContent = React.forwardRef<\n DropdownMenuSubContentElement,\n DropdownMenuSubContentProps\n>((props: ScopedProps<DropdownMenuSubContentProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...subContentProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n\n return (\n <MenuPrimitive.SubContent\n {...menuScope}\n {...subContentProps}\n ref={forwardedRef}\n style={{\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n '--radix-dropdown-menu-content-transform-origin': 'var(--radix-popper-transform-origin)',\n '--radix-dropdown-menu-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-dropdown-menu-content-available-height': 'var(--radix-popper-available-height)',\n '--radix-dropdown-menu-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-dropdown-menu-trigger-height': 'var(--radix-popper-anchor-height)',\n },\n }}\n />\n );\n});\n\nDropdownMenuSubContent.displayName = SUB_CONTENT_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\nconst Root = DropdownMenu;\nconst Trigger = DropdownMenuTrigger;\nconst Portal = DropdownMenuPortal;\nconst Content = DropdownMenuContent;\nconst Group = DropdownMenuGroup;\nconst Label = DropdownMenuLabel;\nconst Item = DropdownMenuItem;\nconst CheckboxItem = DropdownMenuCheckboxItem;\nconst RadioGroup = DropdownMenuRadioGroup;\nconst RadioItem = DropdownMenuRadioItem;\nconst ItemIndicator = DropdownMenuItemIndicator;\nconst Separator = DropdownMenuSeparator;\nconst Arrow = DropdownMenuArrow;\nconst Sub = DropdownMenuSub;\nconst SubTrigger = DropdownMenuSubTrigger;\nconst SubContent = DropdownMenuSubContent;\n\nexport {\n createDropdownMenuScope,\n //\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuPortal,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuItemIndicator,\n DropdownMenuSeparator,\n DropdownMenuArrow,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n //\n Root,\n Trigger,\n Portal,\n Content,\n Group,\n Label,\n Item,\n CheckboxItem,\n RadioGroup,\n RadioItem,\n ItemIndicator,\n Separator,\n Arrow,\n Sub,\n SubTrigger,\n SubContent,\n};\nexport type {\n DropdownMenuProps,\n DropdownMenuTriggerProps,\n DropdownMenuPortalProps,\n DropdownMenuContentProps,\n DropdownMenuGroupProps,\n DropdownMenuLabelProps,\n DropdownMenuItemProps,\n DropdownMenuCheckboxItemProps,\n DropdownMenuRadioGroupProps,\n DropdownMenuRadioItemProps,\n DropdownMenuItemIndicatorProps,\n DropdownMenuSeparatorProps,\n DropdownMenuArrowProps,\n DropdownMenuSubProps,\n DropdownMenuSubTriggerProps,\n DropdownMenuSubContentProps,\n};\n"],"names":[],"mappings":"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","ignoreList":[6,7,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,50]}
|