@shepai/cli 1.122.2 → 1.123.0-pr396.ac74a97
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/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +68 -5
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.js +6 -4
- package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts +28 -0
- package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.js +81 -0
- package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts +16 -0
- package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.js +43 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +15 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts +35 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.js +66 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts +42 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js +169 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +6 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +125 -0
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts +6 -0
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +60 -0
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +2 -0
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +2 -0
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts +7 -0
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +7 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +20 -9
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +130 -31
- 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 +13 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.js +18 -9
- package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts +8 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.js +6 -6
- package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.js +107 -17
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +18 -18
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +31 -17
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +29 -22
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +2 -2
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts +2 -0
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/sidebar-features-context.js +2 -1
- package/dist/src/presentation/web/lib/layout-with-dagre.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/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 +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
- 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/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
- 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/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
- 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 +20 -20
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
- 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 +22 -22
- package/web/.next/server/app/(dashboard)/create/page.js +2 -2
- 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/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
- 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/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
- 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 +20 -20
- package/web/.next/server/app/(dashboard)/page.js +2 -2
- 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 +20 -20
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
- 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.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_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/graph-data/route.js +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
- 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_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.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_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__dcd4f847._.js +3 -0
- package/web/.next/server/chunks/{[root-of-the-server]__42b7ab55._.js.map → [root-of-the-server]__dcd4f847._.js.map} +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/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__a022445f._.js → [root-of-the-server]__14664e9b._.js} +3 -3
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__a022445f._.js.map → [root-of-the-server]__14664e9b._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4993a47c._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4993a47c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6677a82c._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__b724df9e._.js.map → [root-of-the-server]__6677a82c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__8e3bf5d7._.js → [root-of-the-server]__7cbda1ea._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7cbda1ea._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__2698e9f4._.js → [root-of-the-server]__9e8b25ad._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9e8b25ad._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__c07f9f79._.js → [root-of-the-server]__aed1d6f8._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aed1d6f8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__c605a375._.js → [root-of-the-server]__ce6057f6._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ce6057f6._.js.map +1 -0
- 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/{_42caff2c._.js → _2c12de0e._.js} +2 -2
- package/web/.next/server/chunks/ssr/_2c12de0e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
- package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_3a4c94e3._.js +1 -1
- package/web/.next/server/chunks/ssr/_453aab7f._.js +3 -0
- package/web/.next/server/chunks/ssr/_453aab7f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_b56e7571._.js +3 -0
- package/web/.next/server/chunks/ssr/_b56e7571._.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/_e9703421._.js +3 -0
- package/web/.next/server/chunks/ssr/_e9703421._.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/node_modules__pnpm_bc66dcc6._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_3bdae61e._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_3bdae61e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.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_c4337169._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.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/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +34 -34
- package/web/.next/static/chunks/18d48be836aa52c7.js +1 -0
- package/web/.next/static/chunks/{0110425f3a60fc18.js → 1c8720120b410d97.js} +2 -2
- package/web/.next/static/chunks/2a7a88568c0b333c.js +1 -0
- package/web/.next/static/chunks/3925626b99dcd57a.css +1 -0
- package/web/.next/static/chunks/4443ee9c7733399b.js +1 -0
- package/web/.next/static/chunks/{ff81a9dd7b7bc56f.js → 71bbee1068681c20.js} +1 -1
- package/web/.next/static/chunks/{17d618a2fb4e9a11.js → 79130e383fd42bd3.js} +1 -1
- package/web/.next/static/chunks/{6339d1c357e7fea3.js → 81991ab1194e5add.js} +2 -2
- package/web/.next/static/chunks/ac7251026c1e2cdf.js +1 -0
- package/web/.next/static/chunks/be7f6f6f348b8a7b.js +1 -0
- package/web/.next/static/chunks/{f464a486bd88502d.js → cccafcc6f11a334d.js} +1 -1
- package/web/.next/static/chunks/dad42b7aec1260a8.js +1 -0
- package/web/.next/static/chunks/{96eeeb28e06de78c.js → dbbb446493f21874.js} +1 -1
- package/web/.next/static/chunks/de901251b6aedd83.js +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0dc2cfd3._.js +0 -3
- package/web/.next/server/chunks/ssr/_0dc2cfd3._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_42caff2c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_75f4ccb3._.js +0 -3
- package/web/.next/server/chunks/ssr/_75f4ccb3._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_9b7b1c2b._.js +0 -3
- package/web/.next/server/chunks/ssr/_9b7b1c2b._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_ecfef26e._.js +0 -3
- package/web/.next/server/chunks/ssr/_ecfef26e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js.map +0 -1
- package/web/.next/static/chunks/0d2af96e64960ef5.css +0 -1
- package/web/.next/static/chunks/12f3ae6b693c8baf.js +0 -1
- package/web/.next/static/chunks/4562ee849ea13c3a.js +0 -1
- package/web/.next/static/chunks/83fed73369b40eaf.js +0 -1
- package/web/.next/static/chunks/845d8e58a91014e6.js +0 -1
- package/web/.next/static/chunks/8e5bdf9fb945ae6a.js +0 -1
- package/web/.next/static/chunks/be0d245d0e672d44.js +0 -1
- package/web/.next/static/chunks/e6c0bf49bcd5d0fb.js +0 -1
- /package/web/.next/static/{DIjy_LTLHBNoz5RRTRhBy → qG2ZylwG6wDwdBv8fcdAw}/_buildManifest.js +0 -0
- /package/web/.next/static/{DIjy_LTLHBNoz5RRTRhBy → qG2ZylwG6wDwdBv8fcdAw}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{DIjy_LTLHBNoz5RRTRhBy → qG2ZylwG6wDwdBv8fcdAw}/_ssgManifest.js +0 -0
package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.js
CHANGED
|
@@ -3,7 +3,7 @@ import { useMemo } from 'react';
|
|
|
3
3
|
import { ReactFlowProvider, ReactFlow } from '@xyflow/react';
|
|
4
4
|
import { RepositoryNode } from './repository-node.js';
|
|
5
5
|
const nodeTypes = { repositoryNode: RepositoryNode };
|
|
6
|
-
function RepositoryNodeCanvas({ data, style = { width:
|
|
6
|
+
function RepositoryNodeCanvas({ data, style = { width: 550, height: 300 }, }) {
|
|
7
7
|
const nodes = useMemo(() => [{ id: 'node-1', type: 'repositoryNode', position: { x: 0, y: 0 }, data }], [data]);
|
|
8
8
|
return (_jsx("div", { style: style, children: _jsx(ReactFlowProvider, { children: _jsx(ReactFlow, { nodes: nodes, nodeTypes: nodeTypes, nodesDraggable: false, nodesConnectable: false, proOptions: { hideAttribution: true }, fitView: true }) }) }));
|
|
9
9
|
}
|
|
@@ -15,6 +15,9 @@ const meta = {
|
|
|
15
15
|
},
|
|
16
16
|
args: {
|
|
17
17
|
name: 'shep-ai/cli',
|
|
18
|
+
branch: 'main',
|
|
19
|
+
commitMessage: 'feat: add dark mode toggle',
|
|
20
|
+
committer: 'Jane Doe',
|
|
18
21
|
},
|
|
19
22
|
};
|
|
20
23
|
export default meta;
|
|
@@ -41,37 +44,84 @@ export const LongName = {
|
|
|
41
44
|
};
|
|
42
45
|
const onAdd = () => undefined;
|
|
43
46
|
const multipleRepos = [
|
|
44
|
-
{
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
{
|
|
48
|
+
name: 'shep-ai/cli',
|
|
49
|
+
branch: 'main',
|
|
50
|
+
commitMessage: 'feat: add dark mode toggle',
|
|
51
|
+
committer: 'Jane Doe',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'vercel/edge-runtime',
|
|
55
|
+
branch: 'feat/streaming',
|
|
56
|
+
commitMessage: 'fix: handle edge cases in streaming',
|
|
57
|
+
committer: 'John Smith',
|
|
58
|
+
behindCount: 3,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'acme-corp/web-dashboard-v2',
|
|
62
|
+
branch: 'develop',
|
|
63
|
+
commitMessage: 'chore: update dependencies',
|
|
64
|
+
committer: 'Bot',
|
|
65
|
+
behindCount: 12,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'openai/tiktoken',
|
|
69
|
+
branch: 'main',
|
|
70
|
+
commitMessage: 'perf: optimize token encoding',
|
|
71
|
+
committer: 'Alice Chen',
|
|
72
|
+
},
|
|
48
73
|
];
|
|
49
74
|
export const Multiple = {
|
|
50
75
|
render: () => {
|
|
51
76
|
const nodes = multipleRepos.map((data, i) => ({
|
|
52
77
|
id: `repo-${i}`,
|
|
53
78
|
type: 'repositoryNode',
|
|
54
|
-
position: { x: 0, y: i *
|
|
79
|
+
position: { x: 0, y: i * 140 },
|
|
55
80
|
data,
|
|
56
81
|
}));
|
|
57
|
-
return (_jsx("div", { style: { width:
|
|
82
|
+
return (_jsx("div", { style: { width: 600, height: 750 }, children: _jsx(ReactFlowProvider, { children: _jsx(ReactFlow, { nodes: nodes, nodeTypes: nodeTypes, nodesDraggable: false, nodesConnectable: false, proOptions: { hideAttribution: true }, fitView: true }) }) }));
|
|
58
83
|
},
|
|
59
84
|
};
|
|
60
85
|
const multipleReposWithButton = [
|
|
61
|
-
{
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
86
|
+
{
|
|
87
|
+
name: 'shep-ai/cli',
|
|
88
|
+
onAdd,
|
|
89
|
+
branch: 'main',
|
|
90
|
+
commitMessage: 'feat: add dark mode toggle',
|
|
91
|
+
committer: 'Jane Doe',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'vercel/edge-runtime',
|
|
95
|
+
onAdd,
|
|
96
|
+
branch: 'feat/streaming',
|
|
97
|
+
commitMessage: 'fix: handle edge cases in streaming',
|
|
98
|
+
committer: 'John Smith',
|
|
99
|
+
behindCount: 3,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: 'acme-corp/web-dashboard-v2',
|
|
103
|
+
onAdd,
|
|
104
|
+
branch: 'develop',
|
|
105
|
+
commitMessage: 'chore: update dependencies',
|
|
106
|
+
committer: 'Bot',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'openai/tiktoken',
|
|
110
|
+
onAdd,
|
|
111
|
+
branch: 'main',
|
|
112
|
+
commitMessage: 'perf: optimize token encoding',
|
|
113
|
+
committer: 'Alice Chen',
|
|
114
|
+
},
|
|
65
115
|
];
|
|
66
116
|
export const MultipleWithButton = {
|
|
67
117
|
render: () => {
|
|
68
118
|
const nodes = multipleReposWithButton.map((data, i) => ({
|
|
69
119
|
id: `repo-${i}`,
|
|
70
120
|
type: 'repositoryNode',
|
|
71
|
-
position: { x: 0, y: i *
|
|
121
|
+
position: { x: 0, y: i * 140 },
|
|
72
122
|
data,
|
|
73
123
|
}));
|
|
74
|
-
return (_jsx("div", { style: { width:
|
|
124
|
+
return (_jsx("div", { style: { width: 600, height: 750 }, children: _jsx(ReactFlowProvider, { children: _jsx(ReactFlow, { nodes: nodes, nodeTypes: nodeTypes, nodesDraggable: false, nodesConnectable: false, proOptions: { hideAttribution: true }, fitView: true }) }) }));
|
|
75
125
|
},
|
|
76
126
|
};
|
|
77
127
|
export const WithPulseAdd = {
|
|
@@ -108,16 +158,29 @@ export const WithDeleteButton = {
|
|
|
108
158
|
argTypes: {
|
|
109
159
|
onDelete: { action: 'onDelete' },
|
|
110
160
|
},
|
|
111
|
-
render: (args) => _jsx(RepositoryNodeCanvas, { data: args, style: { width:
|
|
161
|
+
render: (args) => _jsx(RepositoryNodeCanvas, { data: args, style: { width: 600, height: 300 } }),
|
|
112
162
|
};
|
|
113
163
|
const multipleReposWithActions = [
|
|
114
|
-
{
|
|
164
|
+
{
|
|
165
|
+
id: 'r1',
|
|
166
|
+
name: 'shep-ai/cli',
|
|
167
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
168
|
+
onAdd,
|
|
169
|
+
onDelete,
|
|
170
|
+
branch: 'main',
|
|
171
|
+
commitMessage: 'feat(web): enrich repository node with branch and commit info',
|
|
172
|
+
committer: 'Ariel Shadkhan',
|
|
173
|
+
},
|
|
115
174
|
{
|
|
116
175
|
id: 'r2',
|
|
117
176
|
name: 'vercel/edge-runtime',
|
|
118
177
|
repositoryPath: '/home/user/vercel/edge-runtime',
|
|
119
178
|
onAdd,
|
|
120
179
|
onDelete,
|
|
180
|
+
branch: 'feat/streaming-v2',
|
|
181
|
+
commitMessage: 'fix: handle edge cases in streaming response',
|
|
182
|
+
committer: 'John Smith',
|
|
183
|
+
behindCount: 5,
|
|
121
184
|
},
|
|
122
185
|
{
|
|
123
186
|
id: 'r3',
|
|
@@ -125,6 +188,10 @@ const multipleReposWithActions = [
|
|
|
125
188
|
repositoryPath: '/home/user/acme-corp/web-dashboard-v2',
|
|
126
189
|
onAdd,
|
|
127
190
|
onDelete,
|
|
191
|
+
branch: 'develop',
|
|
192
|
+
commitMessage: 'chore(deps): update all dependencies to latest',
|
|
193
|
+
committer: 'Renovate Bot',
|
|
194
|
+
behindCount: 23,
|
|
128
195
|
},
|
|
129
196
|
{
|
|
130
197
|
id: 'r4',
|
|
@@ -132,6 +199,9 @@ const multipleReposWithActions = [
|
|
|
132
199
|
repositoryPath: '/home/user/openai/tiktoken',
|
|
133
200
|
onAdd,
|
|
134
201
|
onDelete,
|
|
202
|
+
branch: 'main',
|
|
203
|
+
commitMessage: 'perf: optimize token encoding for large inputs',
|
|
204
|
+
committer: 'Alice Chen',
|
|
135
205
|
},
|
|
136
206
|
];
|
|
137
207
|
export const MultipleWithActions = {
|
|
@@ -139,9 +209,29 @@ export const MultipleWithActions = {
|
|
|
139
209
|
const nodes = multipleReposWithActions.map((data, i) => ({
|
|
140
210
|
id: `repo-${i}`,
|
|
141
211
|
type: 'repositoryNode',
|
|
142
|
-
position: { x: 0, y: i *
|
|
212
|
+
position: { x: 0, y: i * 140 },
|
|
143
213
|
data,
|
|
144
214
|
}));
|
|
145
|
-
return (_jsx("div", { style: { width:
|
|
215
|
+
return (_jsx("div", { style: { width: 600, height: 800 }, children: _jsx(ReactFlowProvider, { children: _jsx(ReactFlow, { nodes: nodes, nodeTypes: nodeTypes, nodesDraggable: false, nodesConnectable: false, proOptions: { hideAttribution: true }, fitView: true }) }) }));
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
export const WithGitInfo = {
|
|
219
|
+
args: {
|
|
220
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
221
|
+
branch: 'feat/repo-node-enrichment',
|
|
222
|
+
commitMessage: 'feat(web): enrich repository node with branch and commit info',
|
|
223
|
+
committer: 'Ariel Shadkhan',
|
|
224
|
+
behindCount: 0,
|
|
146
225
|
},
|
|
226
|
+
render: (args) => _jsx(RepositoryNodeCanvas, { data: args }),
|
|
227
|
+
};
|
|
228
|
+
export const WithGitInfoBehind = {
|
|
229
|
+
args: {
|
|
230
|
+
repositoryPath: '/home/user/shep-ai/cli',
|
|
231
|
+
branch: 'feat/old-feature-branch',
|
|
232
|
+
commitMessage: 'fix: resolve merge conflict in auth module',
|
|
233
|
+
committer: 'Jane Doe',
|
|
234
|
+
behindCount: 7,
|
|
235
|
+
},
|
|
236
|
+
render: (args) => _jsx(RepositoryNodeCanvas, { data: args }),
|
|
147
237
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-center-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"control-center-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx"],"names":[],"mappings":"AAoBA,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,uBAAuB,CAAC,EACtC,kBAAkB,EAClB,SAAS,GACV,EAAE,4BAA4B,kDA8J9B"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useCallback, useEffect } from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { FolderOpen, Copy, Check, Loader2, CheckCircle2, AlertCircle, Terminal, ChevronDown, } from 'lucide-react';
|
|
5
5
|
import { cn } from '../../../lib/utils.js';
|
|
6
6
|
import { pickFolder } from '../../common/add-repository-button/pick-folder.js';
|
|
7
7
|
import { isAgentSetupComplete } from '../../../app/actions/agent-setup-flag.js';
|
|
@@ -13,12 +13,12 @@ export function ControlCenterEmptyState({ onRepositorySelect, className, }) {
|
|
|
13
13
|
const [loading, setLoading] = useState(false);
|
|
14
14
|
const [agentReady, setAgentReady] = useState(null);
|
|
15
15
|
const [authStatus, setAuthStatus] = useState(null);
|
|
16
|
+
const [cliExpanded, setCliExpanded] = useState(false);
|
|
16
17
|
useEffect(() => {
|
|
17
18
|
isAgentSetupComplete().then((done) => {
|
|
18
19
|
setAgentReady(done);
|
|
19
20
|
});
|
|
20
21
|
}, []);
|
|
21
|
-
// Background auth check — runs after agent setup is complete
|
|
22
22
|
useEffect(() => {
|
|
23
23
|
if (!agentReady)
|
|
24
24
|
return;
|
|
@@ -52,28 +52,28 @@ export function ControlCenterEmptyState({ onRepositorySelect, className, }) {
|
|
|
52
52
|
}, []);
|
|
53
53
|
if (agentReady === null)
|
|
54
54
|
return null;
|
|
55
|
-
return (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
return (_jsxs("div", { "data-testid": "control-center-empty-state", className: cn('relative flex h-full w-full flex-col items-center justify-center px-8', className), children: [!agentReady ? (
|
|
56
|
+
/* Agent setup wizard — owns its own hero */
|
|
57
|
+
_jsx(WelcomeAgentSetup, { onComplete: handleAgentSetupComplete })) : (
|
|
58
|
+
/* Repository step — fade in to match wizard transitions */
|
|
59
|
+
_jsxs("div", { className: "animate-in fade-in flex w-full max-w-md flex-col items-center duration-300", children: [_jsx("h1", { className: "text-foreground/90 text-center text-5xl font-extralight tracking-tight", children: "Add a project" }), _jsxs("p", { className: "text-muted-foreground mt-3 text-center text-lg leading-relaxed font-light", children: ["Add your project folder to unlock feature creation.", _jsx("br", {}), "Describe what you need \u2014 Shep handles the rest."] }), _jsx("div", { className: "mt-8", children: _jsx(AgentAuthBanner, { status: authStatus, onRetry: handleRetryAuth }) }), _jsxs("button", { type: "button", "data-testid": "empty-state-add-repository", onClick: handlePickerClick, disabled: loading, className: "bg-foreground text-background hover:bg-foreground/90 mt-10 flex w-full cursor-pointer items-center justify-center gap-2.5 rounded-xl px-6 py-4 text-base font-medium shadow-lg transition-all duration-200 hover:shadow-xl active:scale-[0.98] disabled:cursor-wait disabled:opacity-50", children: [loading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(FolderOpen, { className: "h-5 w-5" })), loading ? 'Opening…' : 'Choose a Folder'] }), _jsx("p", { className: "text-muted-foreground/60 mt-3 text-center text-sm", children: "Any folder works \u2014 git will be initialized automatically if needed." })] })), agentReady ? (_jsxs("div", { className: "absolute bottom-8 flex flex-col items-center", style: {
|
|
60
|
+
animationDelay: '400ms',
|
|
61
|
+
animationDuration: '600ms',
|
|
62
|
+
animationFillMode: 'both',
|
|
63
|
+
}, children: [_jsxs("button", { type: "button", onClick: () => setCliExpanded(!cliExpanded), className: "text-muted-foreground hover:text-foreground flex cursor-pointer items-center gap-1.5 transition-colors duration-200", children: [_jsx(Terminal, { className: "h-3.5 w-3.5" }), _jsx("span", { className: "text-sm", children: "or use the CLI" }), _jsx(ChevronDown, { className: cn('h-3.5 w-3.5 transition-transform duration-200', cliExpanded ? '' : 'rotate-180') })] }), cliExpanded ? (_jsx("div", { className: "animate-in fade-in slide-in-from-top-1 mt-3 w-80 duration-200", children: _jsxs("div", { "data-testid": "cli-code-block", className: "relative rounded-xl bg-zinc-900 px-5 py-4 font-mono text-[13px] leading-relaxed text-zinc-400", children: [_jsx("button", { type: "button", "data-testid": "cli-code-block-copy", onClick: handleCopy, className: "absolute top-3 right-3 cursor-pointer rounded-md p-1.5 text-zinc-600 transition-colors hover:bg-zinc-800 hover:text-zinc-300", "aria-label": "Copy commands", children: copied ? (_jsx(Check, { className: "h-3.5 w-3.5 text-emerald-400" })) : (_jsx(Copy, { className: "h-3.5 w-3.5" })) }), _jsx("div", { className: "space-y-1", children: commands.map((cmd) => (_jsxs("div", { className: "whitespace-nowrap", children: [_jsx("span", { className: "text-zinc-600 select-none", children: "$ " }), _jsx("span", { className: "text-zinc-300", children: cmd })] }, cmd))) })] }) })) : null] })) : null] }));
|
|
60
64
|
}
|
|
61
|
-
/**
|
|
65
|
+
/** Inline status pill — minimal, no background box */
|
|
62
66
|
function AgentAuthBanner({ status, onRetry, }) {
|
|
63
|
-
// Still checking — show subtle spinner
|
|
64
67
|
if (!status) {
|
|
65
|
-
return (_jsxs("div", { className: "
|
|
68
|
+
return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "text-muted-foreground/50 h-3.5 w-3.5 animate-spin" }), _jsx("span", { className: "text-muted-foreground/50 text-sm", children: "Checking setup\u2026" })] }));
|
|
66
69
|
}
|
|
67
|
-
// All good — compact success, auto-fades
|
|
68
70
|
if (status.installed && status.authenticated) {
|
|
69
|
-
return (_jsxs("div", { className: "animate-in fade-in flex
|
|
71
|
+
return (_jsxs("div", { className: "animate-in fade-in flex items-center gap-2", children: [_jsx(CheckCircle2, { className: "h-4 w-4 text-emerald-500" }), _jsxs("span", { className: "text-sm text-emerald-600 dark:text-emerald-400", children: [status.label, " ready"] })] }));
|
|
70
72
|
}
|
|
71
|
-
// Not installed
|
|
72
73
|
if (!status.installed) {
|
|
73
|
-
return (_jsxs("div", { className: "flex
|
|
74
|
+
return (_jsxs("div", { className: "flex flex-col items-center gap-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(AlertCircle, { className: "h-4 w-4 text-amber-500" }), _jsxs("span", { className: "text-sm font-medium text-amber-600 dark:text-amber-400", children: [status.label, " not installed"] })] }), status.binaryName ? (_jsxs("code", { className: "rounded-lg bg-zinc-100 px-3 py-1.5 text-xs text-zinc-600 dark:bg-zinc-800 dark:text-zinc-400", children: ["npm install -g ", status.binaryName] })) : null, _jsx("button", { type: "button", onClick: onRetry, className: "text-xs text-amber-600 underline underline-offset-2 hover:text-amber-800 dark:text-amber-400", children: "Re-check" })] }));
|
|
74
75
|
}
|
|
75
|
-
|
|
76
|
-
return (_jsxs("div", { className: "flex w-full flex-col gap-2 rounded-md bg-amber-500/10 px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(AlertCircle, { className: "h-3 w-3 text-amber-600 dark:text-amber-400" }), _jsxs("span", { className: "text-[10px] font-medium text-amber-700 dark:text-amber-300", children: [status.label, " needs authentication"] })] }), status.authCommand ? (_jsxs("div", { className: "rounded bg-zinc-900 px-2 py-1 font-mono text-[10px] text-zinc-300", children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), status.authCommand] })) : null, _jsxs("div", { className: "flex items-center gap-2", children: [status.binaryName ? (_jsxs("button", { type: "button", "data-testid": "auth-banner-open-terminal", onClick: async () => {
|
|
76
|
+
return (_jsxs("div", { className: "flex flex-col items-center gap-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(AlertCircle, { className: "h-4 w-4 text-amber-500" }), _jsxs("span", { className: "text-sm font-medium text-amber-600 dark:text-amber-400", children: [status.label, " needs authentication"] })] }), status.authCommand ? (_jsx("code", { className: "rounded-lg bg-zinc-100 px-3 py-1.5 text-xs text-zinc-600 dark:bg-zinc-800 dark:text-zinc-400", children: status.authCommand })) : null, _jsxs("div", { className: "flex items-center gap-3", children: [status.binaryName ? (_jsxs("button", { type: "button", "data-testid": "auth-banner-open-terminal", onClick: async () => {
|
|
77
77
|
try {
|
|
78
78
|
const toolId = status.agentType === 'claude-code' ? 'claude-code' : status.agentType;
|
|
79
79
|
await fetch(`/api/tools/${toolId}/launch`, { method: 'POST' });
|
|
@@ -81,5 +81,5 @@ function AgentAuthBanner({ status, onRetry, }) {
|
|
|
81
81
|
catch {
|
|
82
82
|
// best effort
|
|
83
83
|
}
|
|
84
|
-
}, className: "flex items-center gap-1
|
|
84
|
+
}, className: "flex items-center gap-1.5 text-xs font-medium text-amber-600 underline underline-offset-2 hover:text-amber-800 dark:text-amber-400", children: [_jsx(Terminal, { className: "h-3 w-3" }), "Open ", status.label] })) : null, _jsx("button", { type: "button", onClick: onRetry, className: "text-xs text-amber-600 underline underline-offset-2 hover:text-amber-800 dark:text-amber-400", children: "Re-check" })] })] }));
|
|
85
85
|
}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAkWzF"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.js
CHANGED
|
@@ -27,8 +27,8 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
27
27
|
const drawerTimerRef = useRef(null);
|
|
28
28
|
const { defaultViewport, onMoveEnd: handleViewportChange, resetViewport, } = useViewportPersistence();
|
|
29
29
|
const { nodes, edges, onNodesChange, handleConnect, handleAddRepository, handleDeleteFeature, handleRetryFeature, handleStartFeature, handleStopFeature, handleDeleteRepository, createFeatureNode, setCallbacks, } = useControlCenterState(initialNodes, initialEdges);
|
|
30
|
-
// Publish sidebar features
|
|
31
|
-
const { setFeatures: setSidebarFeatures } = useSidebarFeaturesContext();
|
|
30
|
+
// Publish sidebar features + repo state to context
|
|
31
|
+
const { setFeatures: setSidebarFeatures, setHasRepositories: setSidebarHasRepos } = useSidebarFeaturesContext();
|
|
32
32
|
const featureNodes = useMemo(() => nodes.filter((n) => n.type === 'featureNode'), [nodes]);
|
|
33
33
|
const sidebarKey = useMemo(() => {
|
|
34
34
|
return featureNodes
|
|
@@ -119,21 +119,29 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
119
119
|
guardedNavigate(() => router.push('/'));
|
|
120
120
|
}
|
|
121
121
|
}, [router, pathname, guardedNavigate]);
|
|
122
|
+
// Shared: after adding first repo, center canvas and open create drawer
|
|
123
|
+
const focusAndOpenDrawer = useCallback((repoPath) => {
|
|
124
|
+
// Wait for next render so the repo node exists in the DOM
|
|
125
|
+
setTimeout(() => {
|
|
126
|
+
fitView(AUTO_FOCUS_OPTIONS);
|
|
127
|
+
// Open the create-feature drawer after the fitView animation completes
|
|
128
|
+
drawerTimerRef.current = setTimeout(() => {
|
|
129
|
+
guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repoPath)}`));
|
|
130
|
+
}, AUTO_FOCUS_DRAWER_DELAY_MS);
|
|
131
|
+
}, 0);
|
|
132
|
+
}, [fitView, guardedNavigate, router]);
|
|
133
|
+
// Wrapper: add repo + auto-focus if canvas was empty
|
|
134
|
+
const addRepoAndFocus = useCallback((path) => {
|
|
135
|
+
const { wasEmpty, repoPath } = handleAddRepository(path);
|
|
136
|
+
if (wasEmpty) {
|
|
137
|
+
focusAndOpenDrawer(repoPath);
|
|
138
|
+
}
|
|
139
|
+
}, [handleAddRepository, focusAndOpenDrawer]);
|
|
122
140
|
// Listen for global "add repository" events from the top bar button
|
|
123
141
|
useEffect(() => {
|
|
124
142
|
const handler = (e) => {
|
|
125
143
|
const path = e.detail.path;
|
|
126
|
-
|
|
127
|
-
if (wasEmpty) {
|
|
128
|
-
// Wait for next render so the repo node exists in the DOM, then auto-focus
|
|
129
|
-
setTimeout(() => {
|
|
130
|
-
fitView(AUTO_FOCUS_OPTIONS);
|
|
131
|
-
// Open the create-feature drawer after the fitView animation completes
|
|
132
|
-
drawerTimerRef.current = setTimeout(() => {
|
|
133
|
-
guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repoPath)}`));
|
|
134
|
-
}, AUTO_FOCUS_DRAWER_DELAY_MS);
|
|
135
|
-
}, 0);
|
|
136
|
-
}
|
|
144
|
+
addRepoAndFocus(path);
|
|
137
145
|
};
|
|
138
146
|
window.addEventListener('shep:add-repository', handler);
|
|
139
147
|
return () => {
|
|
@@ -142,7 +150,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
142
150
|
clearTimeout(drawerTimerRef.current);
|
|
143
151
|
}
|
|
144
152
|
};
|
|
145
|
-
}, [
|
|
153
|
+
}, [addRepoAndFocus]);
|
|
146
154
|
// Listen for create events from the create drawer (with real feature ID from server)
|
|
147
155
|
useEffect(() => {
|
|
148
156
|
const handler = (e) => {
|
|
@@ -212,6 +220,10 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
212
220
|
handleViewportChange(viewport);
|
|
213
221
|
}, [handleViewportChange]);
|
|
214
222
|
const hasRepositories = nodes.some((n) => n.type === 'repositoryNode');
|
|
223
|
+
// Publish repo state to sidebar context so AppShell can hide FAB during onboarding
|
|
224
|
+
useEffect(() => {
|
|
225
|
+
setSidebarHasRepos(hasRepositories);
|
|
226
|
+
}, [hasRepositories, setSidebarHasRepos]);
|
|
215
227
|
// Debounced latch: prevent empty-state flicker during brief reconcile gaps
|
|
216
228
|
// (e.g. stale poll momentarily drops repos), but allow the empty state to
|
|
217
229
|
// return after a real delete once repos stay gone past the debounce window.
|
|
@@ -227,7 +239,9 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
227
239
|
setShowCanvas(true);
|
|
228
240
|
}
|
|
229
241
|
else if (showCanvas) {
|
|
230
|
-
// Repos gone —
|
|
242
|
+
// Repos gone — clear saved viewport so next add starts centered,
|
|
243
|
+
// then wait before showing empty state (debounce stale polls)
|
|
244
|
+
resetViewport();
|
|
231
245
|
latchTimerRef.current = setTimeout(() => {
|
|
232
246
|
setShowCanvas(false);
|
|
233
247
|
latchTimerRef.current = null;
|
|
@@ -237,7 +251,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
237
251
|
if (latchTimerRef.current)
|
|
238
252
|
clearTimeout(latchTimerRef.current);
|
|
239
253
|
};
|
|
240
|
-
}, [hasRepositories, showCanvas]);
|
|
254
|
+
}, [hasRepositories, showCanvas, resetViewport]);
|
|
241
255
|
// Pulse the "+" button when there's a single repo with no features and the
|
|
242
256
|
// create-feature drawer is not open — draws attention to the next action.
|
|
243
257
|
const isCreateDrawerOpen = pathname.startsWith('/create');
|
|
@@ -249,5 +263,5 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
249
263
|
return nodes;
|
|
250
264
|
return nodes.map((n) => n.type === 'repositoryNode' ? { ...n, data: { ...n.data, pulseAdd: true } } : n);
|
|
251
265
|
}, [nodes, isCreateDrawerOpen]);
|
|
252
|
-
return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect:
|
|
266
|
+
return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }));
|
|
253
267
|
}
|
package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome-agent-setup.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/welcome-agent-setup.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"welcome-agent-setup.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/welcome-agent-setup.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CA4NlF"}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { ChevronLeft, Loader2 } from 'lucide-react';
|
|
5
5
|
import { getAllAgentModels } from '../../../app/actions/get-all-agent-models.js';
|
|
6
6
|
import { updateAgentAndModel } from '../../../app/actions/update-agent-and-model.js';
|
|
7
7
|
import { getAgentTypeIcon } from '../../common/feature-node/agent-type-icons.js';
|
|
8
8
|
import { getModelMeta } from '../../../lib/model-metadata.js';
|
|
9
9
|
import { cn } from '../../../lib/utils.js';
|
|
10
10
|
const STEPS = ['select-agent', 'select-model'];
|
|
11
|
-
/** Fixed width for the wizard content area to prevent layout jumps */
|
|
12
|
-
const WIZARD_WIDTH = 'w-72';
|
|
13
11
|
export function WelcomeAgentSetup({ onComplete, className }) {
|
|
14
12
|
const [groups, setGroups] = useState([]);
|
|
15
13
|
const [loading, setLoading] = useState(true);
|
|
@@ -25,7 +23,6 @@ export function WelcomeAgentSetup({ onComplete, className }) {
|
|
|
25
23
|
.finally(() => setLoading(false));
|
|
26
24
|
}, []);
|
|
27
25
|
const activeGroup = selectedAgent ? groups.find((g) => g.agentType === selectedAgent) : null;
|
|
28
|
-
/** Animate step transition: fade out → change step → fade in */
|
|
29
26
|
const transitionTo = useCallback((nextStep, setup) => {
|
|
30
27
|
setTransitioning(true);
|
|
31
28
|
setVisible(false);
|
|
@@ -46,14 +43,19 @@ export function WelcomeAgentSetup({ onComplete, className }) {
|
|
|
46
43
|
clearTimeout(timeoutRef.current);
|
|
47
44
|
};
|
|
48
45
|
}, []);
|
|
49
|
-
/** Save agent+model selection and complete the wizard */
|
|
50
46
|
const saveAndComplete = useCallback(async (agentType, model) => {
|
|
51
47
|
setSaving(true);
|
|
52
48
|
try {
|
|
53
49
|
await updateAgentAndModel(agentType, model);
|
|
54
|
-
|
|
50
|
+
// Fade out the entire wizard before handing off to the next view
|
|
51
|
+
setVisible(false);
|
|
52
|
+
if (timeoutRef.current)
|
|
53
|
+
clearTimeout(timeoutRef.current);
|
|
54
|
+
timeoutRef.current = setTimeout(() => {
|
|
55
|
+
onComplete();
|
|
56
|
+
}, 200);
|
|
55
57
|
}
|
|
56
|
-
|
|
58
|
+
catch {
|
|
57
59
|
setSaving(false);
|
|
58
60
|
}
|
|
59
61
|
}, [onComplete]);
|
|
@@ -65,7 +67,6 @@ export function WelcomeAgentSetup({ onComplete, className }) {
|
|
|
65
67
|
});
|
|
66
68
|
}
|
|
67
69
|
else {
|
|
68
|
-
// No models — save immediately
|
|
69
70
|
saveAndComplete(agentType, null);
|
|
70
71
|
}
|
|
71
72
|
}, [groups, transitionTo, saveAndComplete]);
|
|
@@ -82,19 +83,25 @@ export function WelcomeAgentSetup({ onComplete, className }) {
|
|
|
82
83
|
}
|
|
83
84
|
}, [step, transitionTo]);
|
|
84
85
|
if (loading) {
|
|
85
|
-
return (_jsxs("div", { "data-testid": "welcome-agent-setup", className: cn('flex flex-col items-center justify-center gap-
|
|
86
|
+
return (_jsxs("div", { "data-testid": "welcome-agent-setup", className: cn('flex flex-col items-center justify-center gap-4', className), children: [_jsx(Loader2, { className: "text-muted-foreground h-5 w-5 animate-spin" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Loading agents\u2026" })] }));
|
|
86
87
|
}
|
|
87
88
|
const stepIndex = STEPS.indexOf(step);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
89
|
+
// Dynamic hero text per step
|
|
90
|
+
const heroTitle = step === 'select-agent' ? 'Choose your agent' : activeGroup ? `Pick a model` : 'Pick a model';
|
|
91
|
+
const heroSubtitle = step === 'select-agent'
|
|
92
|
+
? 'Select the AI coding agent you want Shep to use.'
|
|
93
|
+
: activeGroup
|
|
94
|
+
? `Choose which ${activeGroup.label} model to run.`
|
|
95
|
+
: '';
|
|
96
|
+
return (_jsxs("div", { "data-testid": "welcome-agent-setup", className: cn('flex w-full flex-col items-center', className), children: [_jsx("div", { className: "mb-8 flex w-full max-w-xs items-center gap-1.5", children: STEPS.map((s, i) => (_jsx("div", { className: cn('h-[3px] flex-1 rounded-full transition-colors duration-300', i <= stepIndex ? 'bg-foreground/60' : 'bg-muted') }, s))) }), _jsxs("div", { className: cn('flex w-full flex-col items-center transition-opacity duration-200', visible && !transitioning ? 'opacity-100' : 'opacity-0'), children: [_jsx("h1", { className: "text-foreground/90 text-center text-5xl font-extralight tracking-tight", children: heroTitle }), _jsx("p", { className: "text-muted-foreground mt-3 text-center text-lg leading-relaxed font-light", children: heroSubtitle }), _jsxs("div", { className: "mt-8 flex w-full flex-col items-center", children: [step === 'select-agent' && (_jsx("div", { "data-testid": "agent-list", className: "grid w-full max-w-lg gap-3", style: {
|
|
97
|
+
gridTemplateColumns: `repeat(${Math.min(groups.length, 4)}, minmax(0, 1fr))`,
|
|
98
|
+
}, children: groups.map((group) => {
|
|
99
|
+
const GroupIcon = getAgentTypeIcon(group.agentType);
|
|
100
|
+
return (_jsxs("button", { type: "button", disabled: saving, "data-testid": `agent-option-${group.agentType}`, className: "border-border hover:bg-accent hover:border-foreground/20 flex cursor-pointer flex-col items-center gap-3 rounded-2xl border px-4 py-5 transition-all duration-150 active:scale-[0.97] disabled:opacity-50", onClick: () => handleAgentSelect(group.agentType), children: [_jsx(GroupIcon, { className: "text-foreground/70 h-7 w-7" }), _jsx("span", { className: "text-sm font-medium", children: group.label })] }, group.agentType));
|
|
101
|
+
}) })), step === 'select-model' && activeGroup ? (_jsxs("div", { "data-testid": "model-list", className: "flex w-full max-w-lg flex-col items-center gap-4", children: [_jsxs("button", { type: "button", disabled: saving, className: "text-muted-foreground hover:text-foreground flex cursor-pointer items-center gap-1.5 self-start text-sm transition-colors", onClick: handleBack, children: [_jsx(ChevronLeft, { className: "h-4 w-4" }), "Back"] }), _jsx("div", { className: "grid w-full gap-3", style: {
|
|
102
|
+
gridTemplateColumns: `repeat(${Math.min(activeGroup.models.length, 3)}, minmax(0, 1fr))`,
|
|
103
|
+
}, children: activeGroup.models.map((m) => {
|
|
104
|
+
const meta = getModelMeta(m.id);
|
|
105
|
+
return (_jsxs("button", { type: "button", disabled: saving, "data-testid": `model-option-${m.id}`, className: "border-border hover:bg-accent hover:border-foreground/20 flex cursor-pointer flex-col items-center gap-2 rounded-2xl border px-4 py-5 text-center transition-all duration-150 active:scale-[0.97] disabled:opacity-50", onClick: () => handleModelSelect(m.id), children: [_jsx("span", { className: "text-sm font-medium", children: meta.displayName || m.displayName }), _jsx("span", { className: "text-muted-foreground text-xs leading-tight", children: meta.description || m.description })] }, m.id));
|
|
106
|
+
}) })] })) : null] })] })] }));
|
|
100
107
|
}
|
|
@@ -60,5 +60,5 @@ export function FeaturesCanvas({ nodes, edges, selectedFeatureId, defaultViewpor
|
|
|
60
60
|
}, [isEmpty]);
|
|
61
61
|
const fallbackEmptyState = isEmpty && !emptyState ? (_jsx(EmptyState, { title: "No features yet", description: "Get started by creating your first feature.", action: _jsxs(Button, { onClick: onAddFeature, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), "New Feature"] }) })) : null;
|
|
62
62
|
const overlayContent = emptyState ?? fallbackEmptyState;
|
|
63
|
-
return (_jsxs("div", { "data-testid": isEmpty ? 'features-canvas-empty' : 'features-canvas', "data-no-drawer-close": true, className: "dark:bg-background pointer-events-auto relative h-full w-full bg-[#f6f7f8]", children: [_jsxs(ReactFlow, { nodes: enrichedNodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onConnect: onConnect, onNodesChange: onNodesChange, onNodeClick: onNodeClick, onPaneClick: onPaneClick, onMoveStart: onCanvasDrag, onMoveEnd: onMoveEnd, defaultViewport: defaultViewport ?? FALLBACK_VIEWPORT, nodesDraggable: false, nodesConnectable: false, elementsSelectable: false, proOptions: { hideAttribution: true }, children: [_jsx(Background, { variant: BackgroundVariant.Dots, gap: 24, size: 1, color: "#b8bcc4", className: "dark:[&_circle]:!fill-white/[0.1]" }), !isEmpty && (_jsx(Controls, { showInteractive: false, children: onResetViewport ? _jsx(ResetButton, { onResetViewport: onResetViewport }) : null })), toolbar] }), showOverlay && overlayContent ? (_jsx("div", { className: cn('pointer-events-none absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-300', overlayExiting ? 'opacity-0' : 'animate-in fade-in opacity-100 duration-200'), children: _jsx("div", { className: "pointer-events-auto", children: overlayContent }) })) : null] }));
|
|
63
|
+
return (_jsxs("div", { "data-testid": isEmpty ? 'features-canvas-empty' : 'features-canvas', "data-no-drawer-close": true, className: "dark:bg-background pointer-events-auto relative h-full w-full bg-[#f6f7f8]", children: [_jsxs(ReactFlow, { nodes: enrichedNodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onConnect: onConnect, onNodesChange: onNodesChange, onNodeClick: onNodeClick, onPaneClick: onPaneClick, onMoveStart: onCanvasDrag, onMoveEnd: onMoveEnd, defaultViewport: defaultViewport ?? FALLBACK_VIEWPORT, nodesDraggable: false, nodesConnectable: false, elementsSelectable: false, proOptions: { hideAttribution: true }, children: [_jsx(Background, { variant: BackgroundVariant.Dots, gap: 24, size: 1, color: "#b8bcc4", className: "dark:[&_circle]:!fill-white/[0.1]" }), !isEmpty && (_jsx(Controls, { showInteractive: false, children: onResetViewport ? _jsx(ResetButton, { onResetViewport: onResetViewport }) : null })), toolbar] }), showOverlay && overlayContent ? (_jsx("div", { className: cn('pointer-events-none absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-300', overlayExiting ? 'opacity-0' : 'animate-in fade-in opacity-100 duration-200'), children: _jsx("div", { className: "pointer-events-auto h-full w-full", children: overlayContent }) })) : null] }));
|
|
64
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAsBvE,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAsBvE,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AA4FD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAUnD"}
|
|
@@ -26,7 +26,7 @@ function AppShellInner({ children }) {
|
|
|
26
26
|
const featureFlags = useFeatureFlags();
|
|
27
27
|
// Subscribe to agent lifecycle events and dispatch toast/browser notifications
|
|
28
28
|
useNotifications();
|
|
29
|
-
const { features } = useSidebarFeaturesContext();
|
|
29
|
+
const { features, hasRepositories } = useSidebarFeaturesContext();
|
|
30
30
|
const handleNewFeature = useCallback(() => {
|
|
31
31
|
guardedNavigate(() => router.push('/create'));
|
|
32
32
|
}, [router, guardedNavigate]);
|
|
@@ -63,7 +63,7 @@ function AppShellInner({ children }) {
|
|
|
63
63
|
loading: addingRepo,
|
|
64
64
|
},
|
|
65
65
|
], [handleNewFeature, handleAddRepository, addingRepo]);
|
|
66
|
-
return (_jsxs(SidebarProvider, { defaultOpen: false, children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsxs("div", { className: "absolute top-3 right-3 z-50 flex gap-1", "data-test-id": "canvas-actions-toolbar", children: [_jsx(SoundToggle, {}), _jsx(ThemeToggle, {})] }), _jsx("main", { className: "h-full", children: children }), isControlCenterRoute(pathname) && _jsx(FloatingActionButton, { actions: fabActions })] }) })] }));
|
|
66
|
+
return (_jsxs(SidebarProvider, { defaultOpen: false, children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsxs("div", { className: "absolute top-3 right-3 z-50 flex gap-1", "data-test-id": "canvas-actions-toolbar", children: [_jsx(SoundToggle, {}), _jsx(ThemeToggle, {})] }), _jsx("main", { className: "h-full", children: children }), isControlCenterRoute(pathname) && hasRepositories ? (_jsx(FloatingActionButton, { actions: fabActions })) : null] }) })] }));
|
|
67
67
|
}
|
|
68
68
|
export function AppShell({ children }) {
|
|
69
69
|
return (_jsx(AgentEventsProvider, { children: _jsx(DrawerCloseGuardProvider, { children: _jsx(SidebarFeaturesProvider, { children: _jsx(AppShellInner, { children: children }) }) }) }));
|
|
@@ -18,6 +18,8 @@ export declare function mapNodeStateToSidebarStatus(state: FeatureNodeState): Fe
|
|
|
18
18
|
interface SidebarFeaturesContextValue {
|
|
19
19
|
features: SidebarFeatureItem[];
|
|
20
20
|
setFeatures: (features: SidebarFeatureItem[]) => void;
|
|
21
|
+
hasRepositories: boolean;
|
|
22
|
+
setHasRepositories: (value: boolean) => void;
|
|
21
23
|
}
|
|
22
24
|
interface SidebarFeaturesProviderProps {
|
|
23
25
|
children: ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar-features-context.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/sidebar-features-context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4DAA4D,CAAC;AACnG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiBD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,gBAAgB,GAAG,aAAa,GAAG,IAAI,CAEzF;AAMD,UAAU,2BAA2B;IACnC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"sidebar-features-context.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/sidebar-features-context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4DAA4D,CAAC;AACnG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiBD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,gBAAgB,GAAG,aAAa,GAAG,IAAI,CAEzF;AAMD,UAAU,2BAA2B;IACnC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;IACtD,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AAID,UAAU,4BAA4B;IACpC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAE,EAAE,4BAA4B,2CAYjF;AAED,wBAAgB,yBAAyB,IAAI,2BAA2B,CAMvE"}
|
|
@@ -24,7 +24,8 @@ export function mapNodeStateToSidebarStatus(state) {
|
|
|
24
24
|
const SidebarFeaturesContext = createContext(null);
|
|
25
25
|
export function SidebarFeaturesProvider({ children }) {
|
|
26
26
|
const [features, setFeatures] = useState([]);
|
|
27
|
-
const
|
|
27
|
+
const [hasRepositories, setHasRepositories] = useState(false);
|
|
28
|
+
const value = useMemo(() => ({ features, setFeatures, hasRepositories, setHasRepositories }), [features, hasRepositories]);
|
|
28
29
|
return (_jsx(SidebarFeaturesContext.Provider, { value: value, children: children }));
|
|
29
30
|
}
|
|
30
31
|
export function useSidebarFeaturesContext() {
|
|
@@ -8,7 +8,7 @@ export const CANVAS_LAYOUT_DEFAULTS = {
|
|
|
8
8
|
/** Known node-type dimensions for the canvas node types */
|
|
9
9
|
const NODE_DIMENSIONS = {
|
|
10
10
|
featureNode: { width: 288, height: 140 },
|
|
11
|
-
repositoryNode: { width:
|
|
11
|
+
repositoryNode: { width: 400, height: 110 },
|
|
12
12
|
};
|
|
13
13
|
function getNodeSize(node, defaultSize) {
|
|
14
14
|
// Prefer per-node size from data, then type-based lookup, then default
|