@shepai/cli 1.160.0-pr500.67ee3ce → 1.160.0-pr501.ddca420
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/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +0 -5
- 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 +0 -10
- package/dist/src/presentation/web/components/common/index.d.ts +1 -0
- package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/index.js +1 -0
- package/dist/src/presentation/web/components/common/repo-group/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/repo-group/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/repo-group/index.js +1 -0
- package/dist/src/presentation/web/components/common/repo-group/repo-group.d.ts +12 -0
- package/dist/src/presentation/web/components/common/repo-group/repo-group.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/repo-group/repo-group.js +9 -0
- package/dist/src/presentation/web/components/common/repo-group/repo-group.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/common/repo-group/repo-group.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/repo-group/repo-group.stories.js +42 -0
- 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 +4 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts +2 -0
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +31 -6
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +108 -3
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts +4 -0
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +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 +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
- 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 +36 -36
- 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 +36 -36
- 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]/[tab]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
- 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)/chat/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
- 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 +36 -36
- 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 +36 -36
- 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 +26 -26
- 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]/[tab]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
- 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 +5 -5
- 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/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- 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 +10 -10
- 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 +10 -10
- 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 +5 -5
- 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/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/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.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]__56b70465._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ee0eaaf9._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ee0eaaf9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_65fb854a._.js → _17066a99._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_65fb854a._.js.map → _17066a99._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_bcfa8457._.js → _1c309165._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_bcfa8457._.js.map → _1c309165._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
- package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_5f69c13f._.js +1 -1
- package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
- package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
- package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
- package/web/.next/server/chunks/ssr/_bcaea66b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_ab5dc7e0._.js → _c6670dc4._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_ab5dc7e0._.js.map → _c6670dc4._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cb5a021e._.js +1 -1
- package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d86175ae._.js +1 -1
- package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d8bedf13._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
- package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_72faebb8._.js → _fef309e0._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_72faebb8._.js.map → _fef309e0._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +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_895e5bfa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.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 +45 -45
- package/web/.next/static/chunks/1bd2ba8a19d079aa.js +7 -0
- package/web/.next/static/chunks/{c6c9c0be8aaa18b7.js → 2132c13f17d12462.js} +2 -2
- package/web/.next/static/chunks/{a43abe35b5b6124d.js → 23b9eb93920d2ff9.js} +2 -2
- package/web/.next/static/chunks/295fdc5e64c8733c.js +1 -0
- package/web/.next/static/chunks/{52cdd5621ed980f1.js → 303c0952da094261.js} +1 -1
- package/web/.next/static/chunks/{773fefcf239e6504.js → 3deefc76ea55047c.js} +1 -1
- package/web/.next/static/chunks/477846404f442a7e.js +1 -0
- package/web/.next/static/chunks/{30b778da30c19ef1.js → 548c3788e8b0e92d.js} +1 -1
- package/web/.next/static/chunks/86c476f04ff32e7b.css +1 -0
- package/web/.next/static/chunks/{69b4ef82fec5858e.js → 9a4178dc39dcd688.js} +2 -2
- package/web/.next/static/chunks/{678d2453aaa1d7eb.js → a5782487c8a1ccbf.js} +1 -1
- package/web/.next/static/chunks/{cd88a339e731b6a5.js → c6b20cc5ee4ef34d.js} +1 -1
- package/web/.next/static/chunks/e8987f3bc065cff8.js +1 -0
- package/web/.next/static/chunks/ef2562bc1dc46399.js +1 -0
- package/dist/packages/core/src/application/use-cases/features/auto-resolve-merged-branches.use-case.d.ts +0 -38
- package/dist/packages/core/src/application/use-cases/features/auto-resolve-merged-branches.use-case.d.ts.map +0 -1
- package/dist/packages/core/src/application/use-cases/features/auto-resolve-merged-branches.use-case.js +0 -190
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +0 -1
- package/web/.next/static/chunks/2273b81cd7c7d2af.css +0 -1
- package/web/.next/static/chunks/29efafd1fa14b67d.js +0 -1
- package/web/.next/static/chunks/2b171fc7662d486c.js +0 -1
- package/web/.next/static/chunks/6bef74c3a2b5a495.js +0 -1
- package/web/.next/static/chunks/73534eb180a781dc.js +0 -7
- package/web/.next/static/chunks/c3ed8600047625a0.js +0 -1
- /package/web/.next/static/{knlnFPs2XAlRGMlbTC7iS → 9dkRcoZpYzBI-UmJ3hw5-}/_buildManifest.js +0 -0
- /package/web/.next/static/{knlnFPs2XAlRGMlbTC7iS → 9dkRcoZpYzBI-UmJ3hw5-}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{knlnFPs2XAlRGMlbTC7iS → 9dkRcoZpYzBI-UmJ3hw5-}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiJrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAwarE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -91,7 +91,6 @@ import { SyncRepositoryMainUseCase } from '../../application/use-cases/repositor
|
|
|
91
91
|
import { RebaseFeatureOnMainUseCase } from '../../application/use-cases/features/rebase-feature-on-main.use-case.js';
|
|
92
92
|
import { GetBranchSyncStatusUseCase } from '../../application/use-cases/features/get-branch-sync-status.use-case.js';
|
|
93
93
|
import { ConflictResolutionService } from '../services/agents/conflict-resolution/conflict-resolution.service.js';
|
|
94
|
-
import { AutoResolveMergedBranchesUseCase } from '../../application/use-cases/features/auto-resolve-merged-branches.use-case.js';
|
|
95
94
|
// Interactive session use cases
|
|
96
95
|
import { StartInteractiveSessionUseCase } from '../../application/use-cases/interactive/start-interactive-session.use-case.js';
|
|
97
96
|
import { SendInteractiveMessageUseCase } from '../../application/use-cases/interactive/send-interactive-message.use-case.js';
|
|
@@ -333,7 +332,6 @@ export async function initializeContainer() {
|
|
|
333
332
|
container.registerSingleton(SyncRepositoryMainUseCase);
|
|
334
333
|
container.registerSingleton(RebaseFeatureOnMainUseCase);
|
|
335
334
|
container.registerSingleton(GetBranchSyncStatusUseCase);
|
|
336
|
-
container.registerSingleton(AutoResolveMergedBranchesUseCase);
|
|
337
335
|
// Session repositories (per-AgentType string tokens)
|
|
338
336
|
container.register(`IAgentSessionRepository:${AgentType.ClaudeCode}`, {
|
|
339
337
|
useFactory: () => new ClaudeCodeSessionRepository(),
|
|
@@ -451,9 +449,6 @@ export async function initializeContainer() {
|
|
|
451
449
|
container.register('GetBranchSyncStatusUseCase', {
|
|
452
450
|
useFactory: (c) => c.resolve(GetBranchSyncStatusUseCase),
|
|
453
451
|
});
|
|
454
|
-
container.register('AutoResolveMergedBranchesUseCase', {
|
|
455
|
-
useFactory: (c) => c.resolve(AutoResolveMergedBranchesUseCase),
|
|
456
|
-
});
|
|
457
452
|
// Register interactive session infrastructure
|
|
458
453
|
container.register('IInteractiveSessionRepository', {
|
|
459
454
|
useFactory: (c) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAiFD,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AA6B7B,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CAmExF"}
|
|
@@ -121,16 +121,6 @@ export async function getGraphData() {
|
|
|
121
121
|
}
|
|
122
122
|
// PR/CI status is kept fresh by PrSyncWatcher (30s background poll).
|
|
123
123
|
// No live GitHub calls here — use cached DB values for fast response.
|
|
124
|
-
// Fire-and-forget: resolve features whose branches have been merged.
|
|
125
|
-
// This corrects stale "action needed" states without blocking page load.
|
|
126
|
-
// Resolved features surface on the next SSE poll cycle (~500ms).
|
|
127
|
-
try {
|
|
128
|
-
const autoResolve = resolve('AutoResolveMergedBranchesUseCase');
|
|
129
|
-
void autoResolve.execute(features);
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
// Use case not registered — skip silently (e.g. test environments)
|
|
133
|
-
}
|
|
134
124
|
const featuresWithRuns = await Promise.all(features.map(async (feature) => {
|
|
135
125
|
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
136
126
|
return { feature, run };
|
|
@@ -10,6 +10,7 @@ export { FeatureListItem, type FeatureListItemProps } from './feature-list-item/
|
|
|
10
10
|
export { FeatureNode, featureNodeStateConfig, type FeatureNodeState, type FeatureLifecyclePhase, type FeatureNodeData, type FeatureNodeType, type FeatureNodeStateConfig, } from './feature-node/index.js';
|
|
11
11
|
export { FeatureStatusBadges, type FeatureStatusBadgesProps } from './feature-status-badges/index.js';
|
|
12
12
|
export { FeatureStatusGroup, type FeatureStatusGroupProps } from './feature-status-group/index.js';
|
|
13
|
+
export { RepoGroup, type RepoGroupProps } from './repo-group/index.js';
|
|
13
14
|
export { LoadingSkeleton } from './loading-skeleton/index.js';
|
|
14
15
|
export { RepositoryNode, type RepositoryNodeData, type RepositoryNodeType, } from './repository-node/index.js';
|
|
15
16
|
export { PageHeader } from './page-header/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,KAAK,2BAA2B,GACjC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,KAAK,2BAA2B,GACjC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -10,6 +10,7 @@ export { FeatureListItem } from './feature-list-item/index.js';
|
|
|
10
10
|
export { FeatureNode, featureNodeStateConfig, } from './feature-node/index.js';
|
|
11
11
|
export { FeatureStatusBadges } from './feature-status-badges/index.js';
|
|
12
12
|
export { FeatureStatusGroup } from './feature-status-group/index.js';
|
|
13
|
+
export { RepoGroup } from './repo-group/index.js';
|
|
13
14
|
export { LoadingSkeleton } from './loading-skeleton/index.js';
|
|
14
15
|
export { RepositoryNode, } from './repository-node/index.js';
|
|
15
16
|
export { PageHeader } from './page-header/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repo-group/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { RepoGroup } from './repo-group.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface RepoGroupProps {
|
|
3
|
+
/** Display name for the repository */
|
|
4
|
+
repoName: string;
|
|
5
|
+
/** Total number of features in this repo */
|
|
6
|
+
featureCount: number;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
/** Whether the group starts expanded (default: true) */
|
|
9
|
+
defaultOpen?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function RepoGroup({ repoName, featureCount, children, defaultOpen, }: RepoGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=repo-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-group.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repo-group/repo-group.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,WAAkB,GACnB,EAAE,cAAc,2CAiChB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { ChevronDown, GitFork } from 'lucide-react';
|
|
5
|
+
import { cn } from '../../../lib/utils.js';
|
|
6
|
+
export function RepoGroup({ repoName, featureCount, children, defaultOpen = true, }) {
|
|
7
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
8
|
+
return (_jsxs("div", { "data-testid": "repo-group", className: "mb-1", children: [_jsxs("button", { type: "button", onClick: () => setOpen(!open), className: cn('text-sidebar-foreground hover:bg-sidebar-accent flex w-full items-center gap-1.5 rounded-md px-2 py-1.5 text-left text-xs font-semibold', 'transition-colors duration-100'), "aria-expanded": open, children: [_jsx(ChevronDown, { className: cn('text-muted-foreground h-3.5 w-3.5 shrink-0 transition-transform duration-200', !open && '-rotate-90') }), _jsx(GitFork, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: repoName }), _jsx("span", { "aria-label": `${featureCount} features`, className: "bg-sidebar-accent text-sidebar-accent-foreground ml-auto inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full px-1 text-[0.6rem] font-medium tabular-nums", role: "img", children: featureCount })] }), open ? _jsx("div", { className: "pl-2", children: children }) : null] }));
|
|
9
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { RepoGroup } from './repo-group.js';
|
|
3
|
+
declare const meta: Meta<typeof RepoGroup>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof meta>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const SingleFeature: Story;
|
|
8
|
+
export declare const Collapsed: Story;
|
|
9
|
+
export declare const MultipleRepos: Story;
|
|
10
|
+
//# sourceMappingURL=repo-group.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-group.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repo-group/repo-group.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,SAAS,CAgBhC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAgBrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAU3B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAevB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAyB3B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { SidebarProvider } from '../../ui/sidebar.js';
|
|
3
|
+
import { FeatureListItem } from '../../common/feature-list-item/index.js';
|
|
4
|
+
import { FeatureStatusGroup } from '../../common/feature-status-group/index.js';
|
|
5
|
+
import { RepoGroup } from './repo-group.js';
|
|
6
|
+
const meta = {
|
|
7
|
+
title: 'Composed/RepoGroup',
|
|
8
|
+
component: RepoGroup,
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: 'padded',
|
|
11
|
+
},
|
|
12
|
+
tags: ['autodocs'],
|
|
13
|
+
decorators: [
|
|
14
|
+
(Story) => (_jsx(SidebarProvider, { children: _jsx("div", { className: "w-64", children: _jsx(Story, {}) }) })),
|
|
15
|
+
],
|
|
16
|
+
};
|
|
17
|
+
export default meta;
|
|
18
|
+
export const Default = {
|
|
19
|
+
args: {
|
|
20
|
+
repoName: 'my-project',
|
|
21
|
+
featureCount: 3,
|
|
22
|
+
children: (_jsxs(_Fragment, { children: [_jsx(FeatureStatusGroup, { label: "In Progress", count: 1, children: _jsx(FeatureListItem, { name: "Dashboard", status: "in-progress", startedAt: Date.now() - 330_000 }) }), _jsxs(FeatureStatusGroup, { label: "Done", count: 2, children: [_jsx(FeatureListItem, { name: "Settings Page", status: "done", duration: "2h" }), _jsx(FeatureListItem, { name: "User Profile", status: "done", duration: "1h" })] })] })),
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
export const SingleFeature = {
|
|
26
|
+
args: {
|
|
27
|
+
repoName: 'backend-api',
|
|
28
|
+
featureCount: 1,
|
|
29
|
+
children: (_jsx(FeatureStatusGroup, { label: "Action Needed", count: 1, children: _jsx(FeatureListItem, { name: "Auth Module", status: "action-needed" }) })),
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export const Collapsed = {
|
|
33
|
+
args: {
|
|
34
|
+
repoName: 'my-project',
|
|
35
|
+
featureCount: 5,
|
|
36
|
+
defaultOpen: false,
|
|
37
|
+
children: (_jsxs(FeatureStatusGroup, { label: "In Progress", count: 5, children: [_jsx(FeatureListItem, { name: "Feature A", status: "in-progress", startedAt: Date.now() - 60_000 }), _jsx(FeatureListItem, { name: "Feature B", status: "in-progress", startedAt: Date.now() - 120_000 }), _jsx(FeatureListItem, { name: "Feature C", status: "in-progress", startedAt: Date.now() - 180_000 }), _jsx(FeatureListItem, { name: "Feature D", status: "in-progress", startedAt: Date.now() - 240_000 }), _jsx(FeatureListItem, { name: "Feature E", status: "in-progress", startedAt: Date.now() - 300_000 })] })),
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
export const MultipleRepos = {
|
|
41
|
+
render: () => (_jsxs(_Fragment, { children: [_jsxs(RepoGroup, { repoName: "frontend", featureCount: 2, children: [_jsx(FeatureStatusGroup, { label: "In Progress", count: 1, children: _jsx(FeatureListItem, { name: "Dashboard", status: "in-progress", startedAt: Date.now() - 330_000 }) }), _jsx(FeatureStatusGroup, { label: "Done", count: 1, children: _jsx(FeatureListItem, { name: "Settings Page", status: "done", duration: "2h" }) })] }), _jsxs(RepoGroup, { repoName: "backend-api", featureCount: 2, children: [_jsx(FeatureStatusGroup, { label: "Action Needed", count: 1, children: _jsx(FeatureListItem, { name: "Auth Module", status: "action-needed" }) }), _jsx(FeatureStatusGroup, { label: "In Progress", count: 1, children: _jsx(FeatureListItem, { name: "API Gateway", status: "in-progress", startedAt: Date.now() - 60_000 }) })] })] })),
|
|
42
|
+
};
|
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":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAIpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AA+B5E,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":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAIpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AA+B5E,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,2CA+czF"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.js
CHANGED
|
@@ -43,7 +43,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
43
43
|
return featureNodes
|
|
44
44
|
.map((n) => {
|
|
45
45
|
const d = n.data;
|
|
46
|
-
return `${d.featureId}:${d.state}:${d.name}`;
|
|
46
|
+
return `${d.featureId}:${d.state}:${d.name}:${d.repositoryPath}`;
|
|
47
47
|
})
|
|
48
48
|
.sort()
|
|
49
49
|
.join(',');
|
|
@@ -55,10 +55,13 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
55
55
|
const status = mapNodeStateToSidebarStatus(d.state);
|
|
56
56
|
if (!status)
|
|
57
57
|
return null;
|
|
58
|
+
const repoPath = d.repositoryPath ?? '';
|
|
58
59
|
return {
|
|
59
60
|
featureId: d.featureId,
|
|
60
61
|
name: d.name,
|
|
61
62
|
status,
|
|
63
|
+
repositoryPath: repoPath,
|
|
64
|
+
repositoryName: d.repositoryName ?? repoPath.split('/').filter(Boolean).pop() ?? repoPath,
|
|
62
65
|
...(d.startedAt != null && { startedAt: d.startedAt }),
|
|
63
66
|
...(d.runtime != null && { duration: d.runtime }),
|
|
64
67
|
...(d.agentType && { agentType: d.agentType }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAEhC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EAEZ,cAAc,GACf,EAAE,eAAe,2CAoQjB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo } from 'react';
|
|
3
4
|
import { usePathname } from 'next/navigation';
|
|
4
5
|
import { Home, Moon, Sun, Volume2, VolumeOff, Wrench, Puzzle, Settings } from 'lucide-react';
|
|
5
6
|
import { useTranslation } from 'react-i18next';
|
|
@@ -14,6 +15,7 @@ import { useSoundEnabled } from '../../../hooks/use-sound-enabled.js';
|
|
|
14
15
|
import { useTheme } from '../../../hooks/useTheme.js';
|
|
15
16
|
import { useSoundAction } from '../../../hooks/use-sound-action.js';
|
|
16
17
|
import { FeatureStatusGroup } from '../../common/feature-status-group/index.js';
|
|
18
|
+
import { RepoGroup } from '../../common/repo-group/index.js';
|
|
17
19
|
import { SidebarSectionHeader } from '../../common/sidebar-section-header/index.js';
|
|
18
20
|
import { featureStatusConfig, featureStatusOrder } from '../../common/feature-status-config.js';
|
|
19
21
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
|
|
@@ -31,11 +33,32 @@ export function AppSidebar({ features, featureFlags, onFeatureClick, }) {
|
|
|
31
33
|
const toggleOnSound = useSoundAction('toggle-on');
|
|
32
34
|
const toggleOffSound = useSoundAction('toggle-off');
|
|
33
35
|
const clickSound = useSoundAction('navigate');
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
// Group features by repository, then by status within each repo
|
|
37
|
+
const repoGroups = useMemo(() => {
|
|
38
|
+
const byRepo = new Map();
|
|
39
|
+
for (const feature of features) {
|
|
40
|
+
const key = feature.repositoryPath;
|
|
41
|
+
let group = byRepo.get(key);
|
|
42
|
+
if (!group) {
|
|
43
|
+
group = { repoName: feature.repositoryName, features: [] };
|
|
44
|
+
byRepo.set(key, group);
|
|
45
|
+
}
|
|
46
|
+
group.features.push(feature);
|
|
47
|
+
}
|
|
48
|
+
return Array.from(byRepo.entries()).map(([repoPath, { repoName, features: repoFeatures }]) => ({
|
|
49
|
+
repoPath,
|
|
50
|
+
repoName,
|
|
51
|
+
featureCount: repoFeatures.length,
|
|
52
|
+
statusGroups: featureStatusOrder
|
|
53
|
+
.map((statusKey) => ({
|
|
54
|
+
statusKey,
|
|
55
|
+
label: t(featureStatusConfig[statusKey].labelKey),
|
|
56
|
+
items: repoFeatures.filter((f) => f.status === statusKey),
|
|
57
|
+
}))
|
|
58
|
+
.filter((g) => g.items.length > 0),
|
|
59
|
+
}));
|
|
60
|
+
}, [features, t]);
|
|
61
|
+
const hasMultipleRepos = repoGroups.length > 1;
|
|
39
62
|
return (_jsxs(Sidebar, { "data-testid": "app-sidebar", "data-no-drawer-close": true, collapsible: "icon", side: i18n.dir() === 'rtl' ? 'right' : 'left', children: [_jsx(SidebarHeader, { children: _jsxs(SidebarMenu, { children: [_jsx(SidebarMenuItem, { children: _jsxs("div", { className: "flex h-8 items-center group-data-[collapsible=icon]:justify-center", children: [showExpanded ? (_jsxs("div", { className: [
|
|
40
63
|
'flex min-w-0 flex-1 items-center gap-2 overflow-hidden px-2',
|
|
41
64
|
'transition-opacity duration-200 ease-out',
|
|
@@ -44,7 +67,9 @@ export function AppSidebar({ features, featureFlags, onFeatureClick, }) {
|
|
|
44
67
|
'flex min-h-0 flex-1 flex-col overflow-hidden transition-opacity duration-200 ease-out',
|
|
45
68
|
'[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',
|
|
46
69
|
expandedVisible ? 'opacity-100' : 'opacity-0',
|
|
47
|
-
].join(' '), children: [_jsx(SidebarSectionHeader, { label: t('sidebar.features') }), _jsx(ScrollArea, { className: "min-h-0 flex-1", children:
|
|
70
|
+
].join(' '), children: [_jsx(SidebarSectionHeader, { label: t('sidebar.features') }), _jsx(ScrollArea, { className: "min-h-0 flex-1", children: hasMultipleRepos
|
|
71
|
+
? repoGroups.map(({ repoPath, repoName, featureCount, statusGroups }) => (_jsx(RepoGroup, { repoName: repoName, featureCount: featureCount, children: statusGroups.map(({ statusKey, label, items }) => (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, agentType: feature.agentType, modelId: feature.modelId, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, statusKey))) }, repoPath)))
|
|
72
|
+
: repoGroups.flatMap(({ statusGroups }) => statusGroups.map(({ statusKey, label, items }) => (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, agentType: feature.agentType, modelId: feature.modelId, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, statusKey)))) })] })) : null }), _jsx(SidebarFooter, { className: "border-t p-2", children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx("div", { className: "flex items-center gap-1", children: _jsxs(TooltipProvider, { children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { className: "w-auto flex-none", onClick: (e) => {
|
|
48
73
|
const currentResolved = theme === 'system' ? resolvedTheme : theme;
|
|
49
74
|
const goingToDark = currentResolved !== 'dark';
|
|
50
75
|
const newTheme = theme === 'system'
|
package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAgB3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAyBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAgB3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAyBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA+DnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAIlC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAOvB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KA6BrB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAmElC,CAAC"}
|
|
@@ -35,6 +35,8 @@ const mockFeatures = [
|
|
|
35
35
|
status: 'action-needed',
|
|
36
36
|
agentType: 'claude-code',
|
|
37
37
|
modelId: 'claude-sonnet-4-6',
|
|
38
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
39
|
+
repositoryName: 'my-app',
|
|
38
40
|
},
|
|
39
41
|
{
|
|
40
42
|
featureId: 'feat-payment-002',
|
|
@@ -42,6 +44,8 @@ const mockFeatures = [
|
|
|
42
44
|
status: 'action-needed',
|
|
43
45
|
agentType: 'cursor',
|
|
44
46
|
modelId: 'claude-opus-4-6',
|
|
47
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
48
|
+
repositoryName: 'my-app',
|
|
45
49
|
},
|
|
46
50
|
{
|
|
47
51
|
featureId: 'feat-dashboard-003',
|
|
@@ -50,6 +54,8 @@ const mockFeatures = [
|
|
|
50
54
|
startedAt: Date.now() - 330_000,
|
|
51
55
|
agentType: 'gemini-cli',
|
|
52
56
|
modelId: 'gemini-2.5-pro',
|
|
57
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
58
|
+
repositoryName: 'my-app',
|
|
53
59
|
},
|
|
54
60
|
{
|
|
55
61
|
featureId: 'feat-api-004',
|
|
@@ -58,6 +64,8 @@ const mockFeatures = [
|
|
|
58
64
|
startedAt: Date.now() - 60_000,
|
|
59
65
|
agentType: 'claude-code',
|
|
60
66
|
modelId: 'claude-haiku-4-5',
|
|
67
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
68
|
+
repositoryName: 'my-app',
|
|
61
69
|
},
|
|
62
70
|
{
|
|
63
71
|
featureId: 'feat-settings-005',
|
|
@@ -66,6 +74,8 @@ const mockFeatures = [
|
|
|
66
74
|
duration: '2h',
|
|
67
75
|
agentType: 'claude-code',
|
|
68
76
|
modelId: 'claude-sonnet-4-6',
|
|
77
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
78
|
+
repositoryName: 'my-app',
|
|
69
79
|
},
|
|
70
80
|
{
|
|
71
81
|
featureId: 'feat-profile-006',
|
|
@@ -74,6 +84,8 @@ const mockFeatures = [
|
|
|
74
84
|
duration: '1h',
|
|
75
85
|
agentType: 'dev',
|
|
76
86
|
modelId: 'gpt-8',
|
|
87
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
88
|
+
repositoryName: 'my-app',
|
|
77
89
|
},
|
|
78
90
|
];
|
|
79
91
|
export const Default = {
|
|
@@ -107,12 +119,16 @@ export const AllInProgress = {
|
|
|
107
119
|
name: 'Feature A',
|
|
108
120
|
status: 'in-progress',
|
|
109
121
|
startedAt: Date.now() - 120_000,
|
|
122
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
123
|
+
repositoryName: 'my-app',
|
|
110
124
|
},
|
|
111
125
|
{
|
|
112
126
|
featureId: 'feat-b-002',
|
|
113
127
|
name: 'Feature B',
|
|
114
128
|
status: 'in-progress',
|
|
115
129
|
startedAt: Date.now() - 600_000,
|
|
130
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
131
|
+
repositoryName: 'my-app',
|
|
116
132
|
},
|
|
117
133
|
],
|
|
118
134
|
},
|
|
@@ -120,9 +136,98 @@ export const AllInProgress = {
|
|
|
120
136
|
export const AllDone = {
|
|
121
137
|
args: {
|
|
122
138
|
features: [
|
|
123
|
-
{
|
|
124
|
-
|
|
125
|
-
|
|
139
|
+
{
|
|
140
|
+
featureId: 'feat-a-001',
|
|
141
|
+
name: 'Feature A',
|
|
142
|
+
status: 'done',
|
|
143
|
+
duration: '30m',
|
|
144
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
145
|
+
repositoryName: 'my-app',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
featureId: 'feat-b-002',
|
|
149
|
+
name: 'Feature B',
|
|
150
|
+
status: 'done',
|
|
151
|
+
duration: '1h',
|
|
152
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
153
|
+
repositoryName: 'my-app',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
featureId: 'feat-c-003',
|
|
157
|
+
name: 'Feature C',
|
|
158
|
+
status: 'done',
|
|
159
|
+
duration: '3h',
|
|
160
|
+
repositoryPath: '/home/user/projects/my-app',
|
|
161
|
+
repositoryName: 'my-app',
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
export const MultipleRepositories = {
|
|
167
|
+
args: {
|
|
168
|
+
features: [
|
|
169
|
+
{
|
|
170
|
+
featureId: 'feat-auth-001',
|
|
171
|
+
name: 'Auth Module',
|
|
172
|
+
status: 'action-needed',
|
|
173
|
+
agentType: 'claude-code',
|
|
174
|
+
modelId: 'claude-sonnet-4-6',
|
|
175
|
+
repositoryPath: '/home/user/projects/frontend',
|
|
176
|
+
repositoryName: 'frontend',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
featureId: 'feat-dashboard-002',
|
|
180
|
+
name: 'Dashboard',
|
|
181
|
+
status: 'in-progress',
|
|
182
|
+
startedAt: Date.now() - 330_000,
|
|
183
|
+
agentType: 'gemini-cli',
|
|
184
|
+
modelId: 'gemini-2.5-pro',
|
|
185
|
+
repositoryPath: '/home/user/projects/frontend',
|
|
186
|
+
repositoryName: 'frontend',
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
featureId: 'feat-settings-003',
|
|
190
|
+
name: 'Settings Page',
|
|
191
|
+
status: 'done',
|
|
192
|
+
duration: '2h',
|
|
193
|
+
repositoryPath: '/home/user/projects/frontend',
|
|
194
|
+
repositoryName: 'frontend',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
featureId: 'feat-api-004',
|
|
198
|
+
name: 'API Gateway',
|
|
199
|
+
status: 'in-progress',
|
|
200
|
+
startedAt: Date.now() - 60_000,
|
|
201
|
+
agentType: 'claude-code',
|
|
202
|
+
modelId: 'claude-haiku-4-5',
|
|
203
|
+
repositoryPath: '/home/user/projects/backend',
|
|
204
|
+
repositoryName: 'backend',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
featureId: 'feat-payment-005',
|
|
208
|
+
name: 'Payment Service',
|
|
209
|
+
status: 'action-needed',
|
|
210
|
+
agentType: 'cursor',
|
|
211
|
+
modelId: 'claude-opus-4-6',
|
|
212
|
+
repositoryPath: '/home/user/projects/backend',
|
|
213
|
+
repositoryName: 'backend',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
featureId: 'feat-deploy-006',
|
|
217
|
+
name: 'CI/CD Pipeline',
|
|
218
|
+
status: 'done',
|
|
219
|
+
duration: '45m',
|
|
220
|
+
repositoryPath: '/home/user/projects/infra',
|
|
221
|
+
repositoryName: 'infra',
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
featureId: 'feat-monitor-007',
|
|
225
|
+
name: 'Monitoring Setup',
|
|
226
|
+
status: 'in-progress',
|
|
227
|
+
startedAt: Date.now() - 180_000,
|
|
228
|
+
repositoryPath: '/home/user/projects/infra',
|
|
229
|
+
repositoryName: 'infra',
|
|
230
|
+
},
|
|
126
231
|
],
|
|
127
232
|
},
|
|
128
233
|
};
|
|
@@ -9,6 +9,10 @@ export interface SidebarFeatureItem {
|
|
|
9
9
|
duration?: string;
|
|
10
10
|
agentType?: string;
|
|
11
11
|
modelId?: string;
|
|
12
|
+
/** Absolute path to the repository this feature belongs to */
|
|
13
|
+
repositoryPath: string;
|
|
14
|
+
/** Human-readable repository name (last path segment) */
|
|
15
|
+
repositoryName: string;
|
|
12
16
|
}
|
|
13
17
|
/**
|
|
14
18
|
* Maps a canvas FeatureNodeState to the sidebar's 5-state FeatureStatus.
|
|
@@ -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;
|
|
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;IACjB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;CACxB;AAkBD;;;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"}
|