@shepai/cli 1.91.0 → 1.91.1-pr275.78740ba
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/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts +11 -0
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +49 -0
- package/dist/src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.d.ts +3 -0
- package/dist/src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +4 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +17 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts +4 -2
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +2 -2
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +3 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +94 -5
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +1 -1
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.js +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.js +1 -1
- package/dist/src/presentation/web/hooks/use-selected-feature-id.js +1 -1
- 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 +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/routes-manifest.json +9 -0
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- 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/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +18 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/next-font-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +320 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +20 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.map +5 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +2 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
- 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/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
- 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/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- 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/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +18 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/next-font-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +320 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +20 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.map +5 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +2 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
- 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/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- 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/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
- 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.js +1 -1
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- 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 +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js +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/attachments/preview/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/settings/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/settings/page.js +1 -1
- 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/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js +2 -2
- 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/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js +2 -2
- 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/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page.js +1 -1
- 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/{[root-of-the-server]__d8037e14._.js → [root-of-the-server]__52c318d1._.js} +2 -2
- package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_c29a2302.js +4 -0
- package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_c29a2302.js.map +1 -0
- package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_d1fd387b.js +4 -0
- package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_d1fd387b.js.map +1 -0
- 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/{7f428_lucide-react_dist_esm_icons_9027d30a._.js → 7f428_lucide-react_dist_esm_icons_81a06555._.js} +2 -2
- package/web/.next/server/chunks/ssr/{7f428_lucide-react_dist_esm_icons_9027d30a._.js.map → 7f428_lucide-react_dist_esm_icons_81a06555._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js +3 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.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]__17143953._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45aad79d._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45aad79d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5cc4752a._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5cc4752a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__f0d8d054._.js → [root-of-the-server]__89e8a5cc._.js} +3 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__248ee887._.js → [root-of-the-server]__8d9536c4._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9dc40036._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9dc40036._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b65f78cf._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__b3a4cef4._.js → [root-of-the-server]__e630cc47._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__b062b383._.js → [root-of-the-server]__f1a05100._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js → [root-of-the-server]__f8210f45._.js} +2 -2
- 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/{_05b3aacb._.js → _0bf8585a._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_05b3aacb._.js.map → _0bf8585a._.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/{_752e01fd._.js → _21c75883._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_752e01fd._.js.map → _21c75883._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_3533fed7._.js +3 -0
- package/web/.next/server/chunks/ssr/_3533fed7._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_6887cba3._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_922aa39f._.js +3 -0
- package/web/.next/server/chunks/ssr/_922aa39f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_a5c23e45._.js +3 -0
- package/web/.next/server/chunks/ssr/_a5c23e45._.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/_f50485a5._.js +3 -0
- package/web/.next/server/chunks/ssr/_f50485a5._.js.map +1 -0
- 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/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.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_app_(dashboard)_feature_[featureId]_[tab]_page_tsx_40a5d287._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_feature_[featureId]_[tab]_page_tsx_40a5d287._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +1 -0
- 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_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_e4510d10._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
- 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 +322 -28
- package/web/.next/static/chunks/1814aa172a5f82ff.js +1 -0
- package/web/.next/static/chunks/{c0233da545286fe1.js → 1d8549bc08ba019c.js} +1 -1
- package/web/.next/static/chunks/30a344bb33a015e4.js +1 -0
- package/web/.next/static/chunks/{dcc6eeb6b6e4c578.js → 39692eeaa586ca60.js} +1 -1
- package/web/.next/static/chunks/{d5c051b708c9eafd.js → 47ee127bbf4b97d3.js} +2 -2
- package/web/.next/static/chunks/{7fb81216c7dd303e.js → 52018a5adf696008.js} +1 -1
- package/web/.next/static/chunks/{2ea28eba896e489b.js → 6db7a019fc59f048.js} +1 -1
- package/web/.next/static/chunks/7663455dda11bf56.js +11 -0
- package/web/.next/static/chunks/82c6e440b3abffcf.js +1 -0
- package/web/.next/static/chunks/{fb39605881b728b1.js → 9a4af5485ece00d2.js} +1 -1
- package/web/.next/static/chunks/{205b12234277ba2f.js → ad85c9640ecadbf6.js} +1 -1
- package/web/.next/static/chunks/bc3c5d792355b152.css +2 -0
- package/web/.next/static/chunks/d9247a52ae260218.js +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c2173b6d._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c2173b6d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_411648c4._.js +0 -3
- package/web/.next/server/chunks/ssr/_411648c4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_903aed47._.js +0 -3
- package/web/.next/server/chunks/ssr/_903aed47._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_cc46119f._.js +0 -3
- package/web/.next/server/chunks/ssr/_cc46119f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f38b49fe._.js +0 -3
- package/web/.next/server/chunks/ssr/_f38b49fe._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_c931457d._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_c931457d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_5124369c._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_5124369c._.js.map +0 -1
- package/web/.next/static/chunks/0414e6b21f189456.js +0 -1
- package/web/.next/static/chunks/1e0cfdcb44a16493.js +0 -1
- package/web/.next/static/chunks/24744618941b8239.js +0 -11
- package/web/.next/static/chunks/2a09571d38368a18.css +0 -2
- package/web/.next/static/chunks/55e7ff9b53257d70.js +0 -1
- package/web/.next/static/chunks/fbdf11fbbe42fcff.js +0 -1
- /package/web/.next/server/chunks/{[root-of-the-server]__d8037e14._.js.map → [root-of-the-server]__52c318d1._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__248ee887._.js.map → [root-of-the-server]__8d9536c4._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js.map → [root-of-the-server]__b65f78cf._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__b062b383._.js.map → [root-of-the-server]__f1a05100._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js.map → [root-of-the-server]__f8210f45._.js.map} +0 -0
- /package/web/.next/static/{yZWy0Cxn_PmaNJkxer58a → WKip2Rfl7Dg7huHlheUV0}/_buildManifest.js +0 -0
- /package/web/.next/static/{yZWy0Cxn_PmaNJkxer58a → WKip2Rfl7Dg7huHlheUV0}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{yZWy0Cxn_PmaNJkxer58a → WKip2Rfl7Dg7huHlheUV0}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Skip static pre-rendering since we need runtime DI container. */
|
|
2
|
+
export declare const dynamic = "force-dynamic";
|
|
3
|
+
interface FeatureDrawerTabPageProps {
|
|
4
|
+
params: Promise<{
|
|
5
|
+
featureId: string;
|
|
6
|
+
tab: string;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
export default function FeatureDrawerTabPage({ params }: FeatureDrawerTabPageProps): Promise<import("react/jsx-runtime").JSX.Element | null>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=page.d.ts.map
|
package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.tsx"],"names":[],"mappings":"AAaA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,yBAAyB;IACjC,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,wBAA8B,oBAAoB,CAAC,EAAE,MAAM,EAAE,EAAE,yBAAyB,2DA8CvF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { resolve } from '../../../../../../lib/server-container.js';
|
|
3
|
+
import { buildFeatureNodeData } from '../../../../../build-feature-node-data.js';
|
|
4
|
+
import { computeDrawerView, parseTabKey, } from '../../../../../../components/common/control-center-drawer/drawer-view.js';
|
|
5
|
+
import { FeatureDrawerClient } from '../../../../../../components/common/control-center-drawer/feature-drawer-client.js';
|
|
6
|
+
/** Skip static pre-rendering since we need runtime DI container. */
|
|
7
|
+
export const dynamic = 'force-dynamic';
|
|
8
|
+
export default async function FeatureDrawerTabPage({ params }) {
|
|
9
|
+
const { featureId, tab } = await params;
|
|
10
|
+
const urlTab = parseTabKey(tab);
|
|
11
|
+
try {
|
|
12
|
+
const featureRepo = resolve('IFeatureRepository');
|
|
13
|
+
const agentRunRepo = resolve('IAgentRunRepository');
|
|
14
|
+
const repoRepo = resolve('IRepositoryRepository');
|
|
15
|
+
const gitPrService = resolve('IGitPrService');
|
|
16
|
+
const feature = await featureRepo.findById(featureId);
|
|
17
|
+
if (!feature)
|
|
18
|
+
return null;
|
|
19
|
+
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
20
|
+
const getArtifact = resolve('GetFeatureArtifactUseCase');
|
|
21
|
+
const [repo, baseBranch, artifact, remoteUrl] = await Promise.all([
|
|
22
|
+
repoRepo.findByPath(feature.repositoryPath).catch(() => null),
|
|
23
|
+
gitPrService.getDefaultBranch(feature.repositoryPath).catch(() => 'main'),
|
|
24
|
+
getArtifact.execute(featureId).catch(() => null),
|
|
25
|
+
gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
|
|
26
|
+
]);
|
|
27
|
+
const nodeData = buildFeatureNodeData(feature, run, {
|
|
28
|
+
repositoryName: repo?.name,
|
|
29
|
+
baseBranch,
|
|
30
|
+
oneLiner: artifact?.oneLiner,
|
|
31
|
+
remoteUrl: remoteUrl ?? undefined,
|
|
32
|
+
});
|
|
33
|
+
const view = computeDrawerView({
|
|
34
|
+
selectedNode: nodeData,
|
|
35
|
+
isCreateDrawerOpen: false,
|
|
36
|
+
pendingRepositoryPath: '',
|
|
37
|
+
pendingParentFeatureId: undefined,
|
|
38
|
+
selectedRepoNode: null,
|
|
39
|
+
features: [],
|
|
40
|
+
workflowDefaults: undefined,
|
|
41
|
+
});
|
|
42
|
+
if (!view)
|
|
43
|
+
return null;
|
|
44
|
+
return _jsx(FeatureDrawerClient, { view: view, urlTab: urlTab });
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.tsx"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,OAAO,UAAU,cAAc,SAErC"}
|
|
@@ -4,6 +4,10 @@ import type { ParentFeatureOption } from '../../common/feature-create-drawer/fea
|
|
|
4
4
|
import type { WorkflowDefaults } from '../../../app/actions/get-workflow-defaults.js';
|
|
5
5
|
/** Tab key matching FeatureDrawerTabs */
|
|
6
6
|
export type FeatureTabKey = 'overview' | 'activity' | 'log' | 'plan' | 'prd-review' | 'tech-decisions' | 'product-decisions' | 'merge-review';
|
|
7
|
+
/** All valid tab key values — used for URL param validation. */
|
|
8
|
+
export declare const VALID_TAB_KEYS: ReadonlySet<string>;
|
|
9
|
+
/** Type-guard: returns the value as FeatureTabKey if valid, otherwise undefined. */
|
|
10
|
+
export declare function parseTabKey(value: string | null | undefined): FeatureTabKey | undefined;
|
|
7
11
|
/**
|
|
8
12
|
* Discriminated union representing every possible drawer state in the control center.
|
|
9
13
|
* Only one view can be active at a time.
|
package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawer-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/drawer-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,yCAAyC;AACzC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,KAAK,GACL,MAAM,GACN,YAAY,GACZ,gBAAgB,GAChB,mBAAmB,GACnB,cAAc,CAAC;AAEnB;;;GAGG;AACH,MAAM,MAAM,UAAU;AACpB,qEAAqE;AACnE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,aAAa,CAAA;CAAE;AACvE,4BAA4B;GAC1B;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AACH,8BAA8B;GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAErD,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAOrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GACjB,EAAE;IACD,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,GAAG,UAAU,GAAG,IAAI,CAoBpB"}
|
|
1
|
+
{"version":3,"file":"drawer-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/drawer-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,yCAAyC;AACzC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,KAAK,GACL,MAAM,GACN,YAAY,GACZ,gBAAgB,GAChB,mBAAmB,GACnB,cAAc,CAAC;AAEnB,gEAAgE;AAChE,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAS7C,CAAC;AAEH,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAGvF;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU;AACpB,qEAAqE;AACnE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,aAAa,CAAA;CAAE;AACvE,4BAA4B;GAC1B;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AACH,8BAA8B;GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAErD,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAOrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GACjB,EAAE;IACD,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,GAAG,UAAU,GAAG,IAAI,CAoBpB"}
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/** All valid tab key values — used for URL param validation. */
|
|
2
|
+
export const VALID_TAB_KEYS = new Set([
|
|
3
|
+
'overview',
|
|
4
|
+
'activity',
|
|
5
|
+
'log',
|
|
6
|
+
'plan',
|
|
7
|
+
'prd-review',
|
|
8
|
+
'tech-decisions',
|
|
9
|
+
'product-decisions',
|
|
10
|
+
'merge-review',
|
|
11
|
+
]);
|
|
12
|
+
/** Type-guard: returns the value as FeatureTabKey if valid, otherwise undefined. */
|
|
13
|
+
export function parseTabKey(value) {
|
|
14
|
+
if (value && VALID_TAB_KEYS.has(value))
|
|
15
|
+
return value;
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
1
18
|
/** Derives the initial tab from node lifecycle + state. */
|
|
2
19
|
export function deriveInitialTab(node) {
|
|
3
20
|
if (node.lifecycle === 'requirements' && node.state === 'action-required')
|
package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import type { DrawerView } from './drawer-view.js';
|
|
1
|
+
import type { DrawerView, FeatureTabKey } from './drawer-view.js';
|
|
2
2
|
export interface FeatureDrawerClientProps {
|
|
3
3
|
view: DrawerView;
|
|
4
|
+
/** Tab key extracted from the URL path segment (e.g. /feature/[id]/activity → 'activity'). */
|
|
5
|
+
urlTab?: FeatureTabKey;
|
|
4
6
|
}
|
|
5
|
-
export declare function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function FeatureDrawerClient({ view: initialView, urlTab }: FeatureDrawerClientProps): import("react/jsx-runtime").JSX.Element;
|
|
6
8
|
//# sourceMappingURL=feature-drawer-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAuiB1F"}
|
package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js
CHANGED
|
@@ -28,7 +28,7 @@ import { useFeatureActions } from '../../common/feature-drawer/use-feature-actio
|
|
|
28
28
|
import { resolveSseEventUpdates } from '../../common/feature-node/derive-feature-state.js';
|
|
29
29
|
import { deriveInitialTab } from './drawer-view.js';
|
|
30
30
|
import { useArtifactFetch } from './use-artifact-fetch.js';
|
|
31
|
-
export function FeatureDrawerClient({ view: initialView }) {
|
|
31
|
+
export function FeatureDrawerClient({ view: initialView, urlTab }) {
|
|
32
32
|
const featureFlags = useFeatureFlags();
|
|
33
33
|
const router = useRouter();
|
|
34
34
|
const deleteSound = useSoundAction('delete');
|
|
@@ -324,7 +324,7 @@ export function FeatureDrawerClient({ view: initialView }) {
|
|
|
324
324
|
// ── Body ──────────────────────────────────────────────────────────────
|
|
325
325
|
let body = null;
|
|
326
326
|
if (view.type === 'feature' && featureNode) {
|
|
327
|
-
body = (_jsx(FeatureDrawerTabs, { featureNode: featureNode, featureId: featureNode.featureId, initialTab: view.initialTab, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
|
|
327
|
+
body = (_jsx(FeatureDrawerTabs, { featureNode: featureNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
|
|
328
328
|
}
|
|
329
329
|
return (_jsx(BaseDrawer, { open: isOpen, onClose: attemptClose, size: "md", modal: false, header: header, "data-testid": view.type === 'feature' ? 'feature-drawer' : 'repository-drawer', children: body }));
|
|
330
330
|
}
|
|
@@ -269,7 +269,7 @@ export function DrawerActionBar({ onReject, onApprove, approveLabel, revisionPla
|
|
|
269
269
|
}
|
|
270
270
|
}, []);
|
|
271
271
|
const modKey = typeof navigator !== 'undefined' && /Mac/i.test(navigator.userAgent) ? '⌘' : 'Ctrl';
|
|
272
|
-
return (_jsxs("div", { className: "border-border shrink-0 border-t", children: [children, onReject ? (_jsx(TooltipProvider, { delayDuration: 400, children: _jsx("form", { ref: formRef, onSubmit: handleFormSubmit, className: "p-3", children: _jsx("div", { role: "region", "aria-label": "File drop zone", "data-drag-over": isDragOver ? 'true' : 'false', onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, className: cn('rounded-md border-2 border-transparent transition-colors', isDragOver && 'border-primary/50 bg-primary/5'), children: _jsxs("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]", children: [_jsx(Textarea, { placeholder: revisionPlaceholder ?? 'Ask AI to revise...', "aria-label": revisionPlaceholder ?? 'Ask AI to revise...', disabled: disabled, value: chatInput, onChange: (e) => setChatInput(e.target.value), onKeyDown: handleKeyDown, onPaste: handlePaste, rows: 3, className: "min-h-0 flex-1 resize-none rounded-none border-0 shadow-none focus-visible:ring-0", "data-testid": "drawer-chat-input" }), attachments.length > 0 && (_jsx("div", { className: "flex flex-wrap items-center gap-1.5 px-3 py-2", children: attachments.map((file) => (_jsx(AttachmentChip, { name: file.name, size: file.size, mimeType: file.mimeType, path: file.path, onRemove: () => handleRemoveFile(file.id), disabled: disabled, loading: file.loading }, file.id))) })), uploadError ? (_jsx("p", { className: "text-destructive px-3 pb-2 text-xs", children: uploadError })) : null, _jsxs("div", { className: "border-input flex items-center gap-2 border-t px-3 py-1.5", children: [_jsxs("span", { className: "text-muted-foreground flex-1 truncate text-[11px]", children: [_jsxs("kbd", { className: "bg-muted rounded px-1 py-0.5 font-mono text-[10px]", children: [modKey, "+Enter"] }), ' ', "reject", _jsx("span", { className: "mx-1 opacity-40", children: "|" }), _jsxs("kbd", { className: "bg-muted rounded px-1 py-0.5 font-mono text-[10px]", children: [modKey, "+Shift+Enter"] }), ' ', "approve"] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: handleAddFiles, disabled: disabled, "aria-label": "Attach files", className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors", children: _jsx(PaperclipIcon, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { side: "top", children: "Attach files" })] }), _jsx("div", { onMouseLeave: () => setHoverExpanded(false), children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { type: "submit", disabled: disabled, "data-testid": "drawer-action-submit", className: cn('relative flex h-8 min-w-[10rem] cursor-pointer items-center overflow-hidden rounded-md border pr-10 pl-4 text-sm font-medium whitespace-nowrap transition-colors', 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50', approveExpanded
|
|
272
|
+
return (_jsxs("div", { className: "border-border shrink-0 border-t", children: [children, onReject ? (_jsx(TooltipProvider, { delayDuration: 400, children: _jsx("form", { ref: formRef, onSubmit: handleFormSubmit, className: "p-3", children: _jsx("div", { role: "region", "aria-label": "File drop zone", "data-drag-over": isDragOver ? 'true' : 'false', onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, className: cn('rounded-md border-2 border-transparent transition-colors', isDragOver && 'border-primary/50 bg-primary/5'), children: _jsxs("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]", children: [_jsx(Textarea, { placeholder: revisionPlaceholder ?? 'Ask AI to revise...', "aria-label": revisionPlaceholder ?? 'Ask AI to revise...', disabled: disabled, value: chatInput, onChange: (e) => setChatInput(e.target.value), onKeyDown: handleKeyDown, onPaste: handlePaste, rows: 3, className: "max-h-[35dvh] min-h-0 flex-1 resize-none overflow-y-auto rounded-none border-0 shadow-none focus-visible:ring-0", "data-testid": "drawer-chat-input" }), attachments.length > 0 && (_jsx("div", { className: "flex flex-wrap items-center gap-1.5 px-3 py-2", children: attachments.map((file) => (_jsx(AttachmentChip, { name: file.name, size: file.size, mimeType: file.mimeType, path: file.path, onRemove: () => handleRemoveFile(file.id), disabled: disabled, loading: file.loading }, file.id))) })), uploadError ? (_jsx("p", { className: "text-destructive px-3 pb-2 text-xs", children: uploadError })) : null, _jsxs("div", { className: "border-input flex items-center gap-2 border-t px-3 py-1.5", children: [_jsxs("span", { className: "text-muted-foreground flex-1 truncate text-[11px]", children: [_jsxs("kbd", { className: "bg-muted rounded px-1 py-0.5 font-mono text-[10px]", children: [modKey, "+Enter"] }), ' ', "reject", _jsx("span", { className: "mx-1 opacity-40", children: "|" }), _jsxs("kbd", { className: "bg-muted rounded px-1 py-0.5 font-mono text-[10px]", children: [modKey, "+Shift+Enter"] }), ' ', "approve"] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: handleAddFiles, disabled: disabled, "aria-label": "Attach files", className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors", children: _jsx(PaperclipIcon, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { side: "top", children: "Attach files" })] }), _jsx("div", { onMouseLeave: () => setHoverExpanded(false), children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { type: "submit", disabled: disabled, "data-testid": "drawer-action-submit", className: cn('relative flex h-8 min-w-[10rem] cursor-pointer items-center overflow-hidden rounded-md border pr-10 pl-4 text-sm font-medium whitespace-nowrap transition-colors', 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50', approveExpanded
|
|
273
273
|
? 'border-blue-400/60 text-white'
|
|
274
274
|
: rejectHighlighted
|
|
275
275
|
? 'border-primary bg-muted ring-primary/30 shadow-sm ring-1'
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export interface FeatureDrawerTabsProps {
|
|
|
9
9
|
featureNode: FeatureNodeData;
|
|
10
10
|
featureId: string;
|
|
11
11
|
initialTab?: FeatureTabKey;
|
|
12
|
+
/** Tab key from URL path segment (e.g. /feature/[id]/activity → 'activity'). */
|
|
13
|
+
urlTab?: FeatureTabKey;
|
|
12
14
|
prdData?: PrdQuestionnaireData | null;
|
|
13
15
|
prdSelections?: Record<string, string>;
|
|
14
16
|
onPrdSelect?: (questionId: string, optionId: string) => void;
|
|
@@ -28,5 +30,5 @@ export interface FeatureDrawerTabsProps {
|
|
|
28
30
|
chatInput?: string;
|
|
29
31
|
onChatInputChange?: (value: string) => void;
|
|
30
32
|
}
|
|
31
|
-
export declare function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }: FeatureDrawerTabsProps): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
export declare function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }: FeatureDrawerTabsProps): import("react/jsx-runtime").JSX.Element;
|
|
32
34
|
//# sourceMappingURL=feature-drawer-tabs.d.ts.map
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAiD3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,CAAC;IAGvB,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,GAClB,EAAE,sBAAsB,2CAmSxB"}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect, useCallback, useRef, useMemo } from 'react';
|
|
4
|
+
import { usePathname } from 'next/navigation';
|
|
4
5
|
import { Loader2 } from 'lucide-react';
|
|
5
6
|
import { Tabs, TabsList, TabsTrigger, TabsContent } from '../../ui/tabs.js';
|
|
6
7
|
import { getFeaturePhaseTimings } from '../../../app/actions/get-feature-phase-timings.js';
|
|
@@ -63,14 +64,91 @@ const TAB_FETCHERS = {
|
|
|
63
64
|
activity: fetchActivity,
|
|
64
65
|
plan: fetchPlan,
|
|
65
66
|
};
|
|
66
|
-
export function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }) {
|
|
67
|
+
export function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }) {
|
|
68
|
+
const pathname = usePathname();
|
|
67
69
|
const featureLogs = useFeatureLogs(featureId);
|
|
68
70
|
const visibleTabs = useMemo(() => computeVisibleTabs(featureNode), [featureNode]);
|
|
69
71
|
const visibleTabDefs = useMemo(() => ALL_TABS.filter((t) => visibleTabs.includes(t.key)), [visibleTabs]);
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
+
// Derive the base path (without tab segment) from the current pathname.
|
|
73
|
+
// e.g. /feature/abc123/activity → /feature/abc123
|
|
74
|
+
const basePath = useMemo(() => {
|
|
75
|
+
const match = pathname.match(/^(\/feature\/[^/]+)/);
|
|
76
|
+
return match ? match[1] : pathname;
|
|
77
|
+
}, [pathname]);
|
|
78
|
+
// Resolve the effective initial tab: URL path tab > initialTab prop > 'overview'
|
|
79
|
+
const effectiveInitial = useMemo(() => {
|
|
80
|
+
if (urlTab && visibleTabs.includes(urlTab))
|
|
81
|
+
return urlTab;
|
|
82
|
+
if (initialTab && visibleTabs.includes(initialTab))
|
|
83
|
+
return initialTab;
|
|
84
|
+
return 'overview';
|
|
85
|
+
// Only compute on mount — subsequent changes are handled by effects below
|
|
86
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
87
|
+
}, []);
|
|
72
88
|
const [activeTab, setActiveTab] = useState(effectiveInitial);
|
|
73
89
|
const { tabs, fetchTab, refreshTab } = useTabDataFetch(featureId, TAB_FETCHERS);
|
|
90
|
+
// Sync URL when active tab changes via user interaction.
|
|
91
|
+
// Use window.history.pushState instead of router.push to avoid triggering a
|
|
92
|
+
// server component re-render (which would remount the drawer).
|
|
93
|
+
const isUserInteraction = useRef(false);
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
if (!isUserInteraction.current)
|
|
96
|
+
return;
|
|
97
|
+
isUserInteraction.current = false;
|
|
98
|
+
// Build the target URL from the base path + tab segment
|
|
99
|
+
const targetUrl = activeTab === 'overview' ? basePath : `${basePath}/${activeTab}`;
|
|
100
|
+
// Only update URL if it actually changed
|
|
101
|
+
if (targetUrl !== pathname) {
|
|
102
|
+
window.history.pushState(null, '', targetUrl);
|
|
103
|
+
}
|
|
104
|
+
}, [activeTab, basePath, pathname]);
|
|
105
|
+
// Sync active tab from URL when pathname changes (e.g. browser back/forward).
|
|
106
|
+
// Skip on initial mount — the effectiveInitial handles that via urlTab prop.
|
|
107
|
+
const prevPathnameRef = useRef(pathname);
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (prevPathnameRef.current === pathname)
|
|
110
|
+
return; // Skip initial mount
|
|
111
|
+
prevPathnameRef.current = pathname;
|
|
112
|
+
if (isUserInteraction.current)
|
|
113
|
+
return; // Skip — this is our own navigation
|
|
114
|
+
const segments = pathname.split('/');
|
|
115
|
+
// pathname is /feature/[id] or /feature/[id]/[tab]
|
|
116
|
+
const pathTab = segments.length >= 4 ? segments[3] : undefined;
|
|
117
|
+
const resolved = pathTab && visibleTabs.includes(pathTab) ? pathTab : 'overview';
|
|
118
|
+
if (resolved !== activeTab) {
|
|
119
|
+
setActiveTab(resolved);
|
|
120
|
+
if (resolved === 'activity' || resolved === 'plan') {
|
|
121
|
+
fetchTab(resolved);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}, [pathname]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
125
|
+
// On mount, sync the URL to reflect the effective initial tab when it was
|
|
126
|
+
// derived from feature state (initialTab) rather than from the URL (urlTab).
|
|
127
|
+
// Use replaceState so we don't add a duplicate history entry.
|
|
128
|
+
const initialSyncDone = useRef(false);
|
|
129
|
+
useEffect(() => {
|
|
130
|
+
if (initialSyncDone.current)
|
|
131
|
+
return;
|
|
132
|
+
initialSyncDone.current = true;
|
|
133
|
+
// Only sync if the effective tab came from initialTab (not from URL)
|
|
134
|
+
if (!urlTab && effectiveInitial !== 'overview') {
|
|
135
|
+
const targetUrl = `${basePath}/${effectiveInitial}`;
|
|
136
|
+
if (targetUrl !== pathname) {
|
|
137
|
+
window.history.replaceState(null, '', targetUrl);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
141
|
+
}, []);
|
|
142
|
+
// Trigger lazy fetch for URL-driven initial tab
|
|
143
|
+
const initialFetchDone = useRef(false);
|
|
144
|
+
useEffect(() => {
|
|
145
|
+
if (initialFetchDone.current)
|
|
146
|
+
return;
|
|
147
|
+
initialFetchDone.current = true;
|
|
148
|
+
if (activeTab === 'activity' || activeTab === 'plan') {
|
|
149
|
+
fetchTab(activeTab);
|
|
150
|
+
}
|
|
151
|
+
}, [activeTab, fetchTab]);
|
|
74
152
|
// Reset tab when featureId changes
|
|
75
153
|
const prevFeatureIdRef = useRef(featureId);
|
|
76
154
|
useEffect(() => {
|
|
@@ -80,6 +158,7 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData,
|
|
|
80
158
|
}
|
|
81
159
|
}, [featureId]);
|
|
82
160
|
// When initialTab changes (e.g. SSE updates lifecycle), switch to it if visible
|
|
161
|
+
// and sync the URL with replaceState so the address bar reflects the new tab.
|
|
83
162
|
const prevInitialTabRef = useRef(initialTab);
|
|
84
163
|
useEffect(() => {
|
|
85
164
|
if (prevInitialTabRef.current !== initialTab &&
|
|
@@ -87,14 +166,23 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData,
|
|
|
87
166
|
visibleTabs.includes(initialTab)) {
|
|
88
167
|
prevInitialTabRef.current = initialTab;
|
|
89
168
|
setActiveTab(initialTab);
|
|
169
|
+
// Sync URL to match the new tab
|
|
170
|
+
const targetUrl = initialTab === 'overview' ? basePath : `${basePath}/${initialTab}`;
|
|
171
|
+
if (targetUrl !== window.location.pathname) {
|
|
172
|
+
window.history.replaceState(null, '', targetUrl);
|
|
173
|
+
}
|
|
90
174
|
}
|
|
91
|
-
}, [initialTab, visibleTabs]);
|
|
175
|
+
}, [initialTab, visibleTabs, basePath]);
|
|
92
176
|
// If the active tab becomes invisible (lifecycle changed), fall back to overview
|
|
177
|
+
// and sync the URL accordingly.
|
|
93
178
|
useEffect(() => {
|
|
94
179
|
if (!visibleTabs.includes(activeTab)) {
|
|
95
180
|
setActiveTab('overview');
|
|
181
|
+
if (window.location.pathname !== basePath) {
|
|
182
|
+
window.history.replaceState(null, '', basePath);
|
|
183
|
+
}
|
|
96
184
|
}
|
|
97
|
-
}, [visibleTabs, activeTab]);
|
|
185
|
+
}, [visibleTabs, activeTab, basePath]);
|
|
98
186
|
// SSE refresh: re-fetch active lazy tab when featureNode reference changes
|
|
99
187
|
const featureNodeRef = useRef(featureNode);
|
|
100
188
|
const activeTabRef = useRef(activeTab);
|
|
@@ -110,6 +198,7 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData,
|
|
|
110
198
|
}, [featureNode, refreshTab]);
|
|
111
199
|
const handleTabChange = useCallback((value) => {
|
|
112
200
|
const tab = value;
|
|
201
|
+
isUserInteraction.current = true;
|
|
113
202
|
setActiveTab(tab);
|
|
114
203
|
if (tab === 'activity' || tab === 'plan') {
|
|
115
204
|
fetchTab(tab);
|
|
@@ -73,7 +73,7 @@ export function FeatureNode({ data, selected, }) {
|
|
|
73
73
|
}, className: "bg-card text-muted-foreground hover:border-destructive hover:text-destructive flex h-7 w-7 cursor-pointer items-center justify-center rounded-full border shadow-sm transition-colors", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Delete feature" })] }) }) }), _jsx(DeleteFeatureDialog, { open: confirmOpen, onOpenChange: setConfirmOpen, onConfirm: (cleanup) => {
|
|
74
74
|
setConfirmOpen(false);
|
|
75
75
|
data.onDelete?.(data.featureId, cleanup);
|
|
76
|
-
}, isDeleting: false, featureName: data.name ?? 'this feature', featureId: data.featureId })] })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-72 flex-col rounded-lg border p-3 shadow-sm', selected && 'ring-primary ring-2'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { "data-testid": "feature-node-lifecycle-label", className: cn('text-[10px] font-semibold tracking-wider'), children: data.state === 'blocked' ? 'BLOCKED' : lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-0.5", children: [data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", className: "-mt-1 p-1", children: _jsx(Zap, { className: "h-3.5 w-3.5 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "bottom", children: "Fast Mode" })] }) })) : null, data.agentType ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": agentTypeLabels[data.agentType] ?? data.agentType, "data-testid": "feature-node-agent-badge", onClick: (e) => {
|
|
76
|
+
}, isDeleting: false, featureName: data.name ?? 'this feature', featureId: data.featureId })] })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-72 cursor-pointer flex-col rounded-lg border p-3 shadow-sm', selected && 'ring-primary ring-2'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { "data-testid": "feature-node-lifecycle-label", className: cn('text-[10px] font-semibold tracking-wider'), children: data.state === 'blocked' ? 'BLOCKED' : lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-0.5", children: [data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", className: "-mt-1 p-1", children: _jsx(Zap, { className: "h-3.5 w-3.5 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "bottom", children: "Fast Mode" })] }) })) : null, data.agentType ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": agentTypeLabels[data.agentType] ?? data.agentType, "data-testid": "feature-node-agent-badge", onClick: (e) => {
|
|
77
77
|
e.stopPropagation();
|
|
78
78
|
data.onSettings?.();
|
|
79
79
|
}, className: cn('nodrag -mt-1 -mr-1 p-1', data.onSettings
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reject-feedback-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAMjF,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,KAAqB,EACrB,WAAiC,GAClC,EAAE,yBAAyB,
|
|
1
|
+
{"version":3,"file":"reject-feedback-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAMjF,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,KAAqB,EACrB,WAAiC,GAClC,EAAE,yBAAyB,2CAkD3B"}
|
package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.js
CHANGED
|
@@ -15,5 +15,5 @@ export function RejectFeedbackDialog({ open, onOpenChange, onConfirm, isSubmitti
|
|
|
15
15
|
}
|
|
16
16
|
}, [open]);
|
|
17
17
|
const isFeedbackEmpty = feedback.trim().length === 0;
|
|
18
|
-
return (_jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: title }), _jsx(AlertDialogDescription, { children: description })] }), _jsx(Textarea, { "aria-label": "Rejection feedback", placeholder: "Describe what needs to change...", value: feedback, onChange: (e) => setFeedback(e.target.value), disabled: isSubmitting, rows: 4 }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isSubmitting, onClick: () => onOpenChange(false), children: "Cancel" }), _jsx(AlertDialogAction, { variant: "destructive", disabled: isFeedbackEmpty || isSubmitting, onClick: () => onConfirm(feedback.trim()), children: isSubmitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Rejecting\u2026"] })) : ('Confirm Reject') })] })] }) }));
|
|
18
|
+
return (_jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: title }), _jsx(AlertDialogDescription, { children: description })] }), _jsx(Textarea, { "aria-label": "Rejection feedback", placeholder: "Describe what needs to change...", value: feedback, onChange: (e) => setFeedback(e.target.value), disabled: isSubmitting, rows: 4, className: "max-h-[35dvh] overflow-y-auto" }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isSubmitting, onClick: () => onOpenChange(false), children: "Cancel" }), _jsx(AlertDialogAction, { variant: "destructive", disabled: isFeedbackEmpty || isSubmitting, onClick: () => onConfirm(feedback.trim()), children: isSubmitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Rejecting\u2026"] })) : ('Confirm Reject') })] })] }) }));
|
|
19
19
|
}
|
|
@@ -39,7 +39,7 @@ export function RepositoryNode({ data }) {
|
|
|
39
39
|
e.stopPropagation();
|
|
40
40
|
data.onClick?.();
|
|
41
41
|
}
|
|
42
|
-
}, className: "nodrag bg-card flex min-w-[18rem] cursor-
|
|
42
|
+
}, className: "nodrag bg-card flex min-w-[18rem] cursor-pointer items-center gap-3 rounded-full border px-4 py-3 shadow-sm", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), featureFlags.envDeploy ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
|
|
43
43
|
e.stopPropagation();
|
|
44
44
|
data.onAdd?.();
|
|
45
45
|
}, className: "text-muted-foreground hover:bg-accent dark:hover:bg-accent/50 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-full transition-colors hover:text-blue-500", children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.onAdd || data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: !data.showHandles, className: "opacity-0!" })) : null] }));
|
|
@@ -6,6 +6,6 @@ import { usePathname } from 'next/navigation';
|
|
|
6
6
|
*/
|
|
7
7
|
export function useSelectedFeatureId() {
|
|
8
8
|
const pathname = usePathname();
|
|
9
|
-
const match = pathname.match(/^\/feature\/(
|
|
9
|
+
const match = pathname.match(/^\/feature\/([^/]+)/);
|
|
10
10
|
return match?.[1] ?? null;
|
|
11
11
|
}
|