@shepai/cli 1.160.0 → 1.161.0-pr503.ee26ef9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apis/json-schema/WorkflowConfig.yaml +5 -0
- package/dist/packages/core/src/application/use-cases/features/auto-archive-completed.use-case.d.ts +30 -0
- package/dist/packages/core/src/application/use-cases/features/auto-archive-completed.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/auto-archive-completed.use-case.js +75 -0
- package/dist/packages/core/src/application/use-cases/features/auto-resolve-merged-branches.use-case.d.ts +38 -0
- package/dist/packages/core/src/application/use-cases/features/auto-resolve-merged-branches.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/auto-resolve-merged-branches.use-case.js +190 -0
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +4 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +3 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-auto-archive-delay-minutes.d.ts +15 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-auto-archive-delay-minutes.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-auto-archive-delay-minutes.js +20 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +6 -3
- package/dist/packages/core/src/infrastructure/services/auto-archive/auto-archive-watcher.service.d.ts +48 -0
- package/dist/packages/core/src/infrastructure/services/auto-archive/auto-archive-watcher.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/auto-archive/auto-archive-watcher.service.js +101 -0
- package/dist/src/presentation/cli/commands/_serve.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/_serve.command.js +5 -0
- package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/ui.command.js +5 -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 +10 -0
- 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/features/settings/settings-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +23 -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/dev-server.js +10 -0
- 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 +3 -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/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/[root-of-the-server]__beda892a._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +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/_0dc06d07._.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/{_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/_5119a3df._.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/{_d7406c2b._.js → _b48ca685._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_d7406c2b._.js.map → _b48ca685._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_bcaea66b._.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/_cecef1e1._.js +3 -0
- package/web/.next/server/chunks/ssr/{_bcecbd2d._.js.map → _cecef1e1._.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/{_401aad6a._.js → _ea50f6eb._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_401aad6a._.js.map → _ea50f6eb._.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/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/{a277dde6a33d761a.js → 24ba16ff8e424695.js} +1 -1
- package/web/.next/static/chunks/2cbdd1ede0bb5814.js +7 -0
- package/web/.next/static/chunks/{47101aacecf73db2.js → 40bc5419c0702822.js} +2 -2
- package/web/.next/static/chunks/{970be3f5fd3c241f.js → 4e82c1f4bf6ac760.js} +1 -1
- package/web/.next/static/chunks/{0ee69810b6988211.js → 5482d533353e40e0.js} +1 -1
- package/web/.next/static/chunks/{a4c531d2bd6ee3a1.js → 69ba463074bd2b52.js} +1 -1
- package/web/.next/static/chunks/753f1d49cf5fa1d5.js +1 -0
- package/web/.next/static/chunks/{0c34c75262578118.js → 7d2e24b54a301c8e.js} +1 -1
- package/web/.next/static/chunks/86c476f04ff32e7b.css +1 -0
- package/web/.next/static/chunks/{91c47fe1490ee9d2.js → 9164c1aa71232e81.js} +1 -1
- package/web/.next/static/chunks/b25f22bec608ac5c.js +1 -0
- package/web/.next/static/chunks/{3f3392825baaeccc.js → cb2192ade88cf7c2.js} +1 -1
- package/web/.next/static/chunks/{ec29c15b7610bf44.js → df5a8cac66e17790.js} +2 -2
- 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/server/chunks/ssr/_bcecbd2d._.js +0 -3
- package/web/.next/static/chunks/063fdc7b93122947.js +0 -1
- package/web/.next/static/chunks/2273b81cd7c7d2af.css +0 -1
- package/web/.next/static/chunks/a73b2859b406358e.js +0 -7
- package/web/.next/static/chunks/e7896b32fb180b2b.js +0 -1
- /package/web/.next/static/{ngP4CzWRianvh1cHNq8_I → mx3zWJccB512WDEVXAvLR}/_buildManifest.js +0 -0
- /package/web/.next/static/{ngP4CzWRianvh1cHNq8_I → mx3zWJccB512WDEVXAvLR}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{ngP4CzWRianvh1cHNq8_I → mx3zWJccB512WDEVXAvLR}/_ssgManifest.js +0 -0
|
@@ -69,7 +69,8 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
|
|
|
69
69
|
workflow_enable_evidence, workflow_commit_evidence,
|
|
70
70
|
hide_ci_status, default_fast_mode,
|
|
71
71
|
interactive_agent_enabled, interactive_agent_auto_timeout_minutes,
|
|
72
|
-
interactive_agent_max_concurrent_sessions
|
|
72
|
+
interactive_agent_max_concurrent_sessions,
|
|
73
|
+
auto_archive_delay_minutes
|
|
73
74
|
) VALUES (
|
|
74
75
|
@id, @created_at, @updated_at,
|
|
75
76
|
@model_analyze, @model_requirements, @model_plan, @model_implement, @model_default,
|
|
@@ -97,7 +98,8 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
|
|
|
97
98
|
@workflow_enable_evidence, @workflow_commit_evidence,
|
|
98
99
|
@hide_ci_status, @default_fast_mode,
|
|
99
100
|
@interactive_agent_enabled, @interactive_agent_auto_timeout_minutes,
|
|
100
|
-
@interactive_agent_max_concurrent_sessions
|
|
101
|
+
@interactive_agent_max_concurrent_sessions,
|
|
102
|
+
@auto_archive_delay_minutes
|
|
101
103
|
)
|
|
102
104
|
`);
|
|
103
105
|
// Execute with named parameters (safe from SQL injection)
|
|
@@ -199,7 +201,8 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
|
|
|
199
201
|
default_fast_mode = @default_fast_mode,
|
|
200
202
|
interactive_agent_enabled = @interactive_agent_enabled,
|
|
201
203
|
interactive_agent_auto_timeout_minutes = @interactive_agent_auto_timeout_minutes,
|
|
202
|
-
interactive_agent_max_concurrent_sessions = @interactive_agent_max_concurrent_sessions
|
|
204
|
+
interactive_agent_max_concurrent_sessions = @interactive_agent_max_concurrent_sessions,
|
|
205
|
+
auto_archive_delay_minutes = @auto_archive_delay_minutes
|
|
203
206
|
WHERE id = @id
|
|
204
207
|
`);
|
|
205
208
|
// Execute with named parameters (safe from SQL injection)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Archive Watcher Service
|
|
3
|
+
*
|
|
4
|
+
* Periodically polls for completed features (Maintain lifecycle) that have
|
|
5
|
+
* exceeded the configured auto-archive delay, and archives them automatically.
|
|
6
|
+
*
|
|
7
|
+
* Follows the same singleton + start/stop pattern as NotificationWatcherService.
|
|
8
|
+
*
|
|
9
|
+
* The poll interval is 60 seconds — auto-archiving is not time-critical and
|
|
10
|
+
* a minute-level granularity keeps DB load minimal.
|
|
11
|
+
*/
|
|
12
|
+
import type { IFeatureRepository } from '../../../application/ports/output/repositories/feature-repository.interface.js';
|
|
13
|
+
export declare class AutoArchiveWatcherService {
|
|
14
|
+
private readonly featureRepo;
|
|
15
|
+
private readonly pollIntervalMs;
|
|
16
|
+
private intervalId;
|
|
17
|
+
constructor(featureRepo: IFeatureRepository, pollIntervalMs?: number);
|
|
18
|
+
isRunning(): boolean;
|
|
19
|
+
start(): void;
|
|
20
|
+
stop(): void;
|
|
21
|
+
private poll;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the auto-archive watcher singleton.
|
|
25
|
+
* Must be called once during web server startup.
|
|
26
|
+
*
|
|
27
|
+
* @throws Error if the watcher is already initialized
|
|
28
|
+
*/
|
|
29
|
+
export declare function initializeAutoArchiveWatcher(featureRepo: IFeatureRepository, pollIntervalMs?: number): void;
|
|
30
|
+
/**
|
|
31
|
+
* Get the auto-archive watcher singleton.
|
|
32
|
+
*
|
|
33
|
+
* @returns The auto-archive watcher service
|
|
34
|
+
* @throws Error if the watcher hasn't been initialized yet
|
|
35
|
+
*/
|
|
36
|
+
export declare function getAutoArchiveWatcher(): AutoArchiveWatcherService;
|
|
37
|
+
/**
|
|
38
|
+
* Check if the auto-archive watcher has been initialized.
|
|
39
|
+
*/
|
|
40
|
+
export declare function hasAutoArchiveWatcher(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Reset the auto-archive watcher singleton (for testing purposes only).
|
|
43
|
+
* Stops the watcher if running before resetting.
|
|
44
|
+
*
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
export declare function resetAutoArchiveWatcher(): void;
|
|
48
|
+
//# sourceMappingURL=auto-archive-watcher.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-archive-watcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/auto-archive/auto-archive-watcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gFAAgF,CAAC;AAQzH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,UAAU,CAA+C;gBAErD,WAAW,EAAE,kBAAkB,EAAE,cAAc,GAAE,MAAiC;IAK9F,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;IAWb,IAAI,IAAI,IAAI;YAOE,IAAI;CAcnB;AAMD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,kBAAkB,EAC/B,cAAc,CAAC,EAAE,MAAM,GACtB,IAAI,CAMN;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,yBAAyB,CAQjE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C"}
|
package/dist/packages/core/src/infrastructure/services/auto-archive/auto-archive-watcher.service.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Archive Watcher Service
|
|
3
|
+
*
|
|
4
|
+
* Periodically polls for completed features (Maintain lifecycle) that have
|
|
5
|
+
* exceeded the configured auto-archive delay, and archives them automatically.
|
|
6
|
+
*
|
|
7
|
+
* Follows the same singleton + start/stop pattern as NotificationWatcherService.
|
|
8
|
+
*
|
|
9
|
+
* The poll interval is 60 seconds — auto-archiving is not time-critical and
|
|
10
|
+
* a minute-level granularity keeps DB load minimal.
|
|
11
|
+
*/
|
|
12
|
+
import { AutoArchiveCompletedUseCase } from '../../../application/use-cases/features/auto-archive-completed.use-case.js';
|
|
13
|
+
import { ArchiveFeatureUseCase } from '../../../application/use-cases/features/archive-feature.use-case.js';
|
|
14
|
+
import { getSettings } from '../settings.service.js';
|
|
15
|
+
const DEFAULT_POLL_INTERVAL_MS = 60_000;
|
|
16
|
+
const DEFAULT_DELAY_MINUTES = 10;
|
|
17
|
+
export class AutoArchiveWatcherService {
|
|
18
|
+
featureRepo;
|
|
19
|
+
pollIntervalMs;
|
|
20
|
+
intervalId = null;
|
|
21
|
+
constructor(featureRepo, pollIntervalMs = DEFAULT_POLL_INTERVAL_MS) {
|
|
22
|
+
this.featureRepo = featureRepo;
|
|
23
|
+
this.pollIntervalMs = pollIntervalMs;
|
|
24
|
+
}
|
|
25
|
+
isRunning() {
|
|
26
|
+
return this.intervalId !== null;
|
|
27
|
+
}
|
|
28
|
+
start() {
|
|
29
|
+
if (this.intervalId !== null)
|
|
30
|
+
return;
|
|
31
|
+
// Run first poll immediately
|
|
32
|
+
void this.poll();
|
|
33
|
+
this.intervalId = setInterval(() => {
|
|
34
|
+
void this.poll();
|
|
35
|
+
}, this.pollIntervalMs);
|
|
36
|
+
}
|
|
37
|
+
stop() {
|
|
38
|
+
if (this.intervalId !== null) {
|
|
39
|
+
clearInterval(this.intervalId);
|
|
40
|
+
this.intervalId = null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async poll() {
|
|
44
|
+
try {
|
|
45
|
+
const settings = getSettings();
|
|
46
|
+
const delayMinutes = settings.workflow.autoArchiveDelayMinutes ?? DEFAULT_DELAY_MINUTES;
|
|
47
|
+
if (delayMinutes <= 0)
|
|
48
|
+
return;
|
|
49
|
+
const archiveFeature = new ArchiveFeatureUseCase(this.featureRepo);
|
|
50
|
+
const useCase = new AutoArchiveCompletedUseCase(this.featureRepo, archiveFeature);
|
|
51
|
+
await useCase.execute(delayMinutes);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Settings not initialized or DB not ready — skip this poll cycle
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// --- Singleton accessors (follows NotificationWatcher pattern) ---
|
|
59
|
+
let watcherInstance = null;
|
|
60
|
+
/**
|
|
61
|
+
* Initialize the auto-archive watcher singleton.
|
|
62
|
+
* Must be called once during web server startup.
|
|
63
|
+
*
|
|
64
|
+
* @throws Error if the watcher is already initialized
|
|
65
|
+
*/
|
|
66
|
+
export function initializeAutoArchiveWatcher(featureRepo, pollIntervalMs) {
|
|
67
|
+
if (watcherInstance !== null) {
|
|
68
|
+
throw new Error('Auto-archive watcher already initialized. Cannot re-initialize.');
|
|
69
|
+
}
|
|
70
|
+
watcherInstance = new AutoArchiveWatcherService(featureRepo, pollIntervalMs);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get the auto-archive watcher singleton.
|
|
74
|
+
*
|
|
75
|
+
* @returns The auto-archive watcher service
|
|
76
|
+
* @throws Error if the watcher hasn't been initialized yet
|
|
77
|
+
*/
|
|
78
|
+
export function getAutoArchiveWatcher() {
|
|
79
|
+
if (watcherInstance === null) {
|
|
80
|
+
throw new Error('Auto-archive watcher not initialized. Call initializeAutoArchiveWatcher() during web server startup.');
|
|
81
|
+
}
|
|
82
|
+
return watcherInstance;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if the auto-archive watcher has been initialized.
|
|
86
|
+
*/
|
|
87
|
+
export function hasAutoArchiveWatcher() {
|
|
88
|
+
return watcherInstance !== null;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Reset the auto-archive watcher singleton (for testing purposes only).
|
|
92
|
+
* Stops the watcher if running before resetting.
|
|
93
|
+
*
|
|
94
|
+
* @internal
|
|
95
|
+
*/
|
|
96
|
+
export function resetAutoArchiveWatcher() {
|
|
97
|
+
if (watcherInstance !== null) {
|
|
98
|
+
watcherInstance.stop();
|
|
99
|
+
}
|
|
100
|
+
watcherInstance = null;
|
|
101
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_serve.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/_serve.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"_serve.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/_serve.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AA6B1D;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAgE5C"}
|
|
@@ -29,6 +29,7 @@ import { container } from '../../../../packages/core/src/infrastructure/di/conta
|
|
|
29
29
|
import { setVersionEnvVars } from '../../../../packages/core/src/infrastructure/services/version.service.js';
|
|
30
30
|
import { resolveWebDir } from '../../../../packages/core/src/infrastructure/services/web-server.service.js';
|
|
31
31
|
import { initializeNotificationWatcher, getNotificationWatcher, } from '../../../../packages/core/src/infrastructure/services/notifications/notification-watcher.service.js';
|
|
32
|
+
import { initializeAutoArchiveWatcher, getAutoArchiveWatcher, } from '../../../../packages/core/src/infrastructure/services/auto-archive/auto-archive-watcher.service.js';
|
|
32
33
|
import { getCliI18n } from '../i18n.js';
|
|
33
34
|
function parsePort(value) {
|
|
34
35
|
const port = parseInt(value, 10);
|
|
@@ -64,6 +65,9 @@ export function createServeCommand() {
|
|
|
64
65
|
const notificationService = container.resolve('INotificationService');
|
|
65
66
|
initializeNotificationWatcher(runRepo, phaseTimingRepo, featureRepo, notificationService);
|
|
66
67
|
getNotificationWatcher().start();
|
|
68
|
+
// Start auto-archive watcher
|
|
69
|
+
initializeAutoArchiveWatcher(featureRepo);
|
|
70
|
+
getAutoArchiveWatcher().start();
|
|
67
71
|
// Graceful shutdown handler — identical pattern to ui.command.ts
|
|
68
72
|
let isShuttingDown = false;
|
|
69
73
|
const shutdown = async () => {
|
|
@@ -74,6 +78,7 @@ export function createServeCommand() {
|
|
|
74
78
|
const forceExit = setTimeout(() => process.exit(0), 5000);
|
|
75
79
|
forceExit.unref();
|
|
76
80
|
getNotificationWatcher().stop();
|
|
81
|
+
getAutoArchiveWatcher().stop();
|
|
77
82
|
const deploymentService = container.resolve('IDeploymentService');
|
|
78
83
|
deploymentService.stopAll();
|
|
79
84
|
await service.stop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAsC1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAoGzC"}
|
|
@@ -21,6 +21,7 @@ import { setVersionEnvVars } from '../../../../packages/core/src/infrastructure/
|
|
|
21
21
|
import { resolveWebDir } from '../../../../packages/core/src/infrastructure/services/web-server.service.js';
|
|
22
22
|
import { initializeNotificationWatcher, getNotificationWatcher, } from '../../../../packages/core/src/infrastructure/services/notifications/notification-watcher.service.js';
|
|
23
23
|
import { initializePrSyncWatcher, getPrSyncWatcher, } from '../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js';
|
|
24
|
+
import { initializeAutoArchiveWatcher, getAutoArchiveWatcher, } from '../../../../packages/core/src/infrastructure/services/auto-archive/auto-archive-watcher.service.js';
|
|
24
25
|
import { getExistingConnection } from '../../../../packages/core/src/infrastructure/persistence/sqlite/connection.js';
|
|
25
26
|
import { BrowserOpenerService } from '../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
|
|
26
27
|
import { colors, fmt, messages } from '../ui/index.js';
|
|
@@ -73,6 +74,9 @@ Examples:
|
|
|
73
74
|
const db = getExistingConnection();
|
|
74
75
|
initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db, gitForkService);
|
|
75
76
|
getPrSyncWatcher().start();
|
|
77
|
+
// Start auto-archive watcher for completed features
|
|
78
|
+
initializeAutoArchiveWatcher(featureRepo);
|
|
79
|
+
getAutoArchiveWatcher().start();
|
|
76
80
|
const url = `http://localhost:${port}`;
|
|
77
81
|
messages.success(t('cli:commands.ui.serverReady', { url: fmt.code(url) }));
|
|
78
82
|
messages.info(t('cli:commands.ui.pressCtrlC'));
|
|
@@ -96,6 +100,7 @@ Examples:
|
|
|
96
100
|
forceExit.unref();
|
|
97
101
|
getPrSyncWatcher().stop();
|
|
98
102
|
getNotificationWatcher().stop();
|
|
103
|
+
getAutoArchiveWatcher().stop();
|
|
99
104
|
await service.stop();
|
|
100
105
|
process.exit(0);
|
|
101
106
|
};
|
|
@@ -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":"AAcA,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,CA+ExF"}
|
|
@@ -121,6 +121,16 @@ 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
|
+
}
|
|
124
134
|
const featuresWithRuns = await Promise.all(features.map(async (feature) => {
|
|
125
135
|
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
126
136
|
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 }),
|
package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA6B/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA+QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA6B/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA+QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAm1CzB"}
|
|
@@ -158,6 +158,9 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
158
158
|
const [ciWatchEnabled, setCiWatchEnabled] = useState(settings.workflow.ciWatchEnabled !== false);
|
|
159
159
|
const [hideCiStatus, setHideCiStatus] = useState(settings.workflow.hideCiStatus !== false);
|
|
160
160
|
const [defaultFastMode, setDefaultFastMode] = useState(settings.workflow.defaultFastMode !== false);
|
|
161
|
+
// Auto-archive state
|
|
162
|
+
const [autoArchiveEnabled, setAutoArchiveEnabled] = useState((settings.workflow.autoArchiveDelayMinutes ?? 10) > 0);
|
|
163
|
+
const [autoArchiveDelay, setAutoArchiveDelay] = useState(String(settings.workflow.autoArchiveDelayMinutes ?? 10));
|
|
161
164
|
const [ciMaxFix, setCiMaxFix] = useState(settings.workflow.ciMaxFixAttempts != null ? String(settings.workflow.ciMaxFixAttempts) : '');
|
|
162
165
|
const [ciTimeout, setCiTimeout] = useState(settings.workflow.ciWatchTimeoutMs != null
|
|
163
166
|
? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))
|
|
@@ -237,6 +240,8 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
237
240
|
// Workflow helpers
|
|
238
241
|
function buildWorkflowPayload(overrides = {}) {
|
|
239
242
|
const timeoutSeconds = parseOptionalInt(overrides.ciTimeout ?? ciTimeout);
|
|
243
|
+
const archiveEnabled = overrides.autoArchiveEnabled ?? autoArchiveEnabled;
|
|
244
|
+
const archiveDelay = parseInt(overrides.autoArchiveDelay ?? autoArchiveDelay, 10);
|
|
240
245
|
return {
|
|
241
246
|
workflow: {
|
|
242
247
|
openPrOnImplementationComplete: overrides.openPr ?? openPr,
|
|
@@ -251,6 +256,11 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
251
256
|
ciWatchEnabled: overrides.ciWatchEnabled ?? ciWatchEnabled,
|
|
252
257
|
hideCiStatus: overrides.hideCiStatus ?? hideCiStatus,
|
|
253
258
|
defaultFastMode: overrides.defaultFastMode ?? defaultFastMode,
|
|
259
|
+
autoArchiveDelayMinutes: archiveEnabled
|
|
260
|
+
? Number.isNaN(archiveDelay) || archiveDelay < 1
|
|
261
|
+
? 10
|
|
262
|
+
: archiveDelay
|
|
263
|
+
: 0,
|
|
254
264
|
ciMaxFixAttempts: parseOptionalInt(overrides.ciMaxFix ?? ciMaxFix),
|
|
255
265
|
ciWatchTimeoutMs: timeoutSeconds != null ? timeoutSeconds * 1000 : undefined,
|
|
256
266
|
ciLogMaxChars: parseOptionalInt(overrides.ciLogMax ?? ciLogMax),
|
|
@@ -399,7 +409,19 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
399
409
|
} }), _jsx(SwitchRow, { label: t('settings.workflow.watchCiAfterPush'), description: t('settings.workflow.watchCiAfterPushDescription'), id: "ci-watch-enabled", testId: "switch-ci-watch-enabled", checked: ciWatchEnabled, onChange: (v) => {
|
|
400
410
|
setCiWatchEnabled(v);
|
|
401
411
|
save(buildWorkflowPayload({ ciWatchEnabled: v }));
|
|
402
|
-
} })
|
|
412
|
+
} }), _jsx(SubsectionLabel, { children: "Archive" }), _jsx(SwitchRow, { label: "Auto-archive completed", description: "Automatically archive features after they reach the completed state", id: "auto-archive-enabled", testId: "switch-auto-archive-enabled", checked: autoArchiveEnabled, onChange: (v) => {
|
|
413
|
+
setAutoArchiveEnabled(v);
|
|
414
|
+
save(buildWorkflowPayload({ autoArchiveEnabled: v }));
|
|
415
|
+
} }), _jsx(SettingsRow, { label: "Archive delay", description: "Minutes to wait after completion before archiving (1\u20131440)", htmlFor: "auto-archive-delay", children: _jsx(NumberStepper, { id: "auto-archive-delay", testId: "input-auto-archive-delay", value: autoArchiveDelay, placeholder: "10", min: 1, max: 1440, suffix: "min", onChange: (v) => {
|
|
416
|
+
setAutoArchiveDelay(v);
|
|
417
|
+
}, onBlur: () => {
|
|
418
|
+
if (!autoArchiveEnabled)
|
|
419
|
+
return;
|
|
420
|
+
const n = parseInt(autoArchiveDelay, 10);
|
|
421
|
+
const clamped = Number.isNaN(n) ? 10 : Math.min(1440, Math.max(1, n));
|
|
422
|
+
setAutoArchiveDelay(String(clamped));
|
|
423
|
+
save(buildWorkflowPayload({ autoArchiveDelay: String(clamped) }));
|
|
424
|
+
} }) })] }), _jsx(SectionHint, { links: [
|
|
403
425
|
{
|
|
404
426
|
label: t('settings.workflow.links.approvalGates'),
|
|
405
427
|
href: 'https://github.com/shep-ai/shep/blob/main/specs/016-hitl-approval-gates/spec.yaml',
|
|
@@ -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"}
|