@shepai/cli 1.106.5 → 1.107.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +1 -0
- package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +12 -1
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +2 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +3 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +5 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +17 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +3 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +8 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts +5 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +4 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +7 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +23 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +5 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +22 -3
- package/dist/packages/core/src/infrastructure/services/process/is-process-alive.d.ts +8 -0
- package/dist/packages/core/src/infrastructure/services/process/is-process-alive.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/process/is-process-alive.js +15 -0
- package/dist/src/presentation/cli/commands/status.command.d.ts +1 -1
- package/dist/src/presentation/cli/commands/status.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/status.command.js +2 -38
- package/dist/src/presentation/web/app/actions/resume-feature.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/resume-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/resume-feature.js +16 -0
- package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
- package/dist/src/presentation/web/app/api/agent-events/route.js +17 -0
- package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-feature-node-data.js +6 -1
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +6 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +21 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +2 -2
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +9 -0
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts +4 -2
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +5 -3
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +11 -8
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +13 -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 +3 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +21 -0
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-graph-state.js +1 -0
- package/dist/src/presentation/web/lib/derive-graph.d.ts +2 -0
- package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/derive-graph.js +5 -0
- 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 +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +53 -38
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +65 -50
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
- 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 +65 -50
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +49 -34
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +53 -38
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +65 -50
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
- 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 +65 -50
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
- 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 +49 -34
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +49 -34
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/agent-events/route.js +2 -1
- package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +6 -0
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_250a63ae._.js +1 -1
- package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_4a13fd24._.js → _2f98781f._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_4a13fd24._.js.map → _2f98781f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_3bae8e09._.js → _966a446d._.js} +2 -2
- package/web/.next/server/chunks/ssr/_966a446d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_c98e033f._.js → _fa69c532._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_c98e033f._.js.map → _fa69c532._.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__next-internal_server_app_(dashboard)_page_actions_888633e1.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_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_9f444130._.js → src_presentation_web_ce7cbc3c._.js} +3 -3
- package/web/.next/server/chunks/ssr/{src_presentation_web_d7392251._.js.map → src_presentation_web_ce7cbc3c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_d7392251._.js → src_presentation_web_e2604413._.js} +3 -3
- package/web/.next/server/chunks/ssr/{src_presentation_web_9f444130._.js.map → src_presentation_web_e2604413._.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 +290 -219
- package/web/.next/static/chunks/{772fe887bd3200e4.js → 249bc4f5cd8521ea.js} +2 -2
- package/web/.next/static/chunks/5558a658fa82a01f.css +1 -0
- package/web/.next/static/chunks/{78f37724b73daecc.js → 5899695755eaa473.js} +1 -1
- package/web/.next/static/chunks/{7f53af94820dd254.js → 69aab1a047573cb4.js} +1 -1
- package/web/.next/static/chunks/{dcaecc4f31b2a9cf.js → 742a6e0450bd20f3.js} +1 -1
- package/web/.next/static/chunks/7c026a8c682b1a16.js +2 -0
- package/web/.next/static/chunks/{26d9daaa8e7ae994.js → 81c04fca969aebf0.js} +1 -1
- package/web/.next/static/chunks/{6fc75f45a90afaca.js → a1e6e3b5f8d5f78e.js} +1 -1
- package/web/.next/static/chunks/{8f29c6159bf2ace9.js → a9a3c672ca96cd12.js} +1 -1
- package/web/.next/static/chunks/{a941aad50e999afb.js → ab5b6ec6eeacc9bf.js} +1 -1
- package/web/.next/static/chunks/{9294c44a23259725.js → f6fafa215c01d77c.js} +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__aae14de3._.js +0 -6
- package/web/.next/server/chunks/[root-of-the-server]__aae14de3._.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_7fc19e0a.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_7fc19e0a.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_c3aca900.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_c3aca900.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13dc8e37._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__13dc8e37._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3a2d3067._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3a2d3067._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5f776c10._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5f776c10._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c03a4370._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c03a4370._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_3bae8e09._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_85d37ebe.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_85d37ebe.js.map +0 -1
- package/web/.next/static/chunks/abe8df9f7d2e0ea2.js +0 -2
- package/web/.next/static/chunks/db122a6247f69104.css +0 -1
- /package/web/.next/static/{znGgra8ySC0iYcFiYbyxv → KzXiolX5g91WF6b-Yje6b}/_buildManifest.js +0 -0
- /package/web/.next/static/{znGgra8ySC0iYcFiYbyxv → KzXiolX5g91WF6b-Yje6b}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{znGgra8ySC0iYcFiYbyxv → KzXiolX5g91WF6b-Yje6b}/_ssgManifest.js +0 -0
|
@@ -122,6 +122,10 @@ let GitPrService = class GitPrService {
|
|
|
122
122
|
throw new Error(`Unable to determine default branch for repository at ${cwd}. ` +
|
|
123
123
|
`No remote HEAD, no main/master branch, and no init.defaultBranch configured.`);
|
|
124
124
|
}
|
|
125
|
+
async revParse(cwd, ref) {
|
|
126
|
+
const { stdout } = await this.execFile('git', ['rev-parse', ref], { cwd });
|
|
127
|
+
return stdout.trim();
|
|
128
|
+
}
|
|
125
129
|
async hasUncommittedChanges(cwd) {
|
|
126
130
|
const { stdout } = await this.execFile('git', ['status', '--porcelain'], { cwd });
|
|
127
131
|
return stdout.trim().length > 0;
|
|
@@ -413,7 +417,7 @@ let GitPrService = class GitPrService {
|
|
|
413
417
|
throw this.parseGhError(error);
|
|
414
418
|
}
|
|
415
419
|
}
|
|
416
|
-
async verifyMerge(cwd, featureBranch, baseBranch) {
|
|
420
|
+
async verifyMerge(cwd, featureBranch, baseBranch, premergeBaseSha) {
|
|
417
421
|
// Resolve the feature branch ref — the local branch may have been deleted
|
|
418
422
|
// after a squash merge (git branch -d succeeds when pushed to remote).
|
|
419
423
|
// Fall back to the remote tracking branch if the local ref is gone.
|
|
@@ -438,9 +442,24 @@ let GitPrService = class GitPrService {
|
|
|
438
442
|
return true;
|
|
439
443
|
}
|
|
440
444
|
catch {
|
|
441
|
-
// Exit code 1 = diff exists (not merged), other errors also mean unverified
|
|
442
|
-
|
|
445
|
+
// Exit code 1 = diff exists (not merged), other errors also mean unverified.
|
|
446
|
+
// Fall through to premergeBaseSha check if available.
|
|
447
|
+
}
|
|
448
|
+
// Third fallback: if the caller recorded the base branch HEAD before the merge
|
|
449
|
+
// agent ran, check whether it advanced. This handles agents that legitimately
|
|
450
|
+
// modify the tree during squash merge (e.g. adding .gitignore, removing
|
|
451
|
+
// node_modules). If baseBranch HEAD moved forward, the agent committed something.
|
|
452
|
+
if (premergeBaseSha) {
|
|
453
|
+
try {
|
|
454
|
+
const { stdout } = await this.execFile('git', ['rev-parse', baseBranch], { cwd });
|
|
455
|
+
const currentSha = stdout.trim();
|
|
456
|
+
return currentSha !== premergeBaseSha;
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
return false;
|
|
460
|
+
}
|
|
443
461
|
}
|
|
462
|
+
return false;
|
|
444
463
|
}
|
|
445
464
|
/**
|
|
446
465
|
* Resolve a branch name to a valid git ref, falling back to the remote
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check whether a process with the given PID is still running.
|
|
3
|
+
*
|
|
4
|
+
* Uses `process.kill(pid, 0)` which sends signal 0 (no-op) to test existence.
|
|
5
|
+
* Returns false when the PID does not exist or belongs to a zombie.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isProcessAlive(pid: number): boolean;
|
|
8
|
+
//# sourceMappingURL=is-process-alive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-process-alive.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/process/is-process-alive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check whether a process with the given PID is still running.
|
|
3
|
+
*
|
|
4
|
+
* Uses `process.kill(pid, 0)` which sends signal 0 (no-op) to test existence.
|
|
5
|
+
* Returns false when the PID does not exist or belongs to a zombie.
|
|
6
|
+
*/
|
|
7
|
+
export function isProcessAlive(pid) {
|
|
8
|
+
try {
|
|
9
|
+
process.kill(pid, 0);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - PID, port, URL (from daemon.json)
|
|
8
8
|
* - Uptime (computed from startedAt)
|
|
9
9
|
* - CPU%, RSS memory (from ps shell-out via execFile — injection-safe)
|
|
10
|
-
* - Environment: paths, versions
|
|
10
|
+
* - Environment: paths, versions
|
|
11
11
|
*
|
|
12
12
|
* Flags:
|
|
13
13
|
* --logs [N] Show last N lines of daemon.log (default 50)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/status.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"status.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/status.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkKpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAoG7C"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - PID, port, URL (from daemon.json)
|
|
8
8
|
* - Uptime (computed from startedAt)
|
|
9
9
|
* - CPU%, RSS memory (from ps shell-out via execFile — injection-safe)
|
|
10
|
-
* - Environment: paths, versions
|
|
10
|
+
* - Environment: paths, versions
|
|
11
11
|
*
|
|
12
12
|
* Flags:
|
|
13
13
|
* --logs [N] Show last N lines of daemon.log (default 50)
|
|
@@ -28,7 +28,6 @@ import { container } from '../../../../packages/core/src/infrastructure/di/conta
|
|
|
28
28
|
import { getShepHomeDir, getShepDbPath, getDaemonStatePath, getDaemonLogPath, } from '../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
|
|
29
29
|
import { renderDetailView, messages, colors } from '../ui/index.js';
|
|
30
30
|
const PS_TIMEOUT_MS = 2000;
|
|
31
|
-
const VERSION_CMD_TIMEOUT_MS = 3000;
|
|
32
31
|
const DEFAULT_LOG_LINES = 50;
|
|
33
32
|
/**
|
|
34
33
|
* Parse ps output: "pid cpu% rss_kb\n"
|
|
@@ -88,26 +87,6 @@ function fetchPsMetrics(pid) {
|
|
|
88
87
|
});
|
|
89
88
|
});
|
|
90
89
|
}
|
|
91
|
-
/**
|
|
92
|
-
* Detect the version of an agent executor CLI.
|
|
93
|
-
* Returns version string or 'not installed'.
|
|
94
|
-
*/
|
|
95
|
-
function detectAgentVersion(cmd, args) {
|
|
96
|
-
return new Promise((resolve) => {
|
|
97
|
-
execFile(cmd, args, { timeout: VERSION_CMD_TIMEOUT_MS }, (err, stdout) => {
|
|
98
|
-
if (err) {
|
|
99
|
-
resolve('not installed');
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
// Extract first line, strip leading labels like "claude-code v1.2.3" → "v1.2.3"
|
|
103
|
-
const line = stdout.trim().split('\n')[0] ?? '';
|
|
104
|
-
// Try to extract version-like string
|
|
105
|
-
const match = line.match(/v?\d+\.\d+[\w.-]*/);
|
|
106
|
-
resolve(match ? match[0] : line || 'unknown');
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
90
|
/**
|
|
112
91
|
* Read the last N lines of a file.
|
|
113
92
|
*/
|
|
@@ -224,15 +203,7 @@ export function createStatusCommand() {
|
|
|
224
203
|
const url = `http://localhost:${port}`;
|
|
225
204
|
const uptimeMs = Date.now() - Date.parse(startedAt);
|
|
226
205
|
const uptime = humanizeUptime(uptimeMs);
|
|
227
|
-
|
|
228
|
-
const factory = container.resolve('IAgentExecutorFactory');
|
|
229
|
-
const agentClis = factory.getCliInfo();
|
|
230
|
-
// Fetch ps metrics and agent versions in parallel
|
|
231
|
-
const [psMetrics, ...agentVersions] = await Promise.all([
|
|
232
|
-
fetchPsMetrics(pid),
|
|
233
|
-
...agentClis.map((a) => detectAgentVersion(a.cmd, a.versionArgs)),
|
|
234
|
-
]);
|
|
235
|
-
const { cpu, rssMb } = psMetrics;
|
|
206
|
+
const { cpu, rssMb } = await fetchPsMetrics(pid);
|
|
236
207
|
// Get CLI version
|
|
237
208
|
let cliVersion = 'unknown';
|
|
238
209
|
try {
|
|
@@ -270,13 +241,6 @@ export function createStatusCommand() {
|
|
|
270
241
|
{ label: 'Daemon Config', value: getDaemonStatePath() },
|
|
271
242
|
],
|
|
272
243
|
},
|
|
273
|
-
{
|
|
274
|
-
title: 'Agent Executors',
|
|
275
|
-
fields: agentClis.map((agent, i) => ({
|
|
276
|
-
label: agent.agentType,
|
|
277
|
-
value: agentVersions[i],
|
|
278
|
-
})),
|
|
279
|
-
},
|
|
280
244
|
],
|
|
281
245
|
});
|
|
282
246
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/resume-feature.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function resumeFeature(featureId) {
|
|
4
|
+
if (!featureId.trim()) {
|
|
5
|
+
return { resumed: false, error: 'Feature id is required' };
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const useCase = resolve('ResumeFeatureUseCase');
|
|
9
|
+
await useCase.execute(featureId);
|
|
10
|
+
return { resumed: true };
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : 'Failed to resume feature';
|
|
14
|
+
return { resumed: false, error: message };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAqEvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAuQ9C"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { resolve } from '../../../lib/server-container.js';
|
|
17
17
|
import { AgentRunStatus, SdlcLifecycle, NotificationEventType, NotificationSeverity, } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
18
|
+
import { isProcessAlive } from '../../../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
|
|
18
19
|
// Force dynamic — SSE streams must never be statically optimized or cached
|
|
19
20
|
export const dynamic = 'force-dynamic';
|
|
20
21
|
const POLL_INTERVAL_MS = 500;
|
|
@@ -157,6 +158,22 @@ export function GET(request) {
|
|
|
157
158
|
});
|
|
158
159
|
}
|
|
159
160
|
}
|
|
161
|
+
// Check for crashed agent: status is running/pending but PID is dead
|
|
162
|
+
const isActive = run.status === AgentRunStatus.running || run.status === AgentRunStatus.pending;
|
|
163
|
+
if (isActive && run.pid && !prev.crashEmitted && !isProcessAlive(run.pid)) {
|
|
164
|
+
prev.crashEmitted = true;
|
|
165
|
+
const phase = resultToPhase(run.result);
|
|
166
|
+
emitEvent({
|
|
167
|
+
eventType: NotificationEventType.AgentFailed,
|
|
168
|
+
agentRunId: run.id,
|
|
169
|
+
featureId: feature.id,
|
|
170
|
+
featureName: feature.name,
|
|
171
|
+
...(phase && { phaseName: phase }),
|
|
172
|
+
message: `Agent crashed (PID ${run.pid} dead)`,
|
|
173
|
+
severity: NotificationSeverity.Error,
|
|
174
|
+
timestamp: new Date().toISOString(),
|
|
175
|
+
});
|
|
176
|
+
}
|
|
160
177
|
// Check for feature name change (AI metadata generation updates name)
|
|
161
178
|
if (prev.featureName !== feature.name) {
|
|
162
179
|
prev.featureName = feature.name;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAQ9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CAyCjB"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
import { AgentRunStatus } from '../../../../packages/core/src/domain/generated/output.js';
|
|
1
2
|
import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components/common/feature-node/derive-feature-state.js';
|
|
3
|
+
import { isProcessAlive } from '../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
|
|
2
4
|
/**
|
|
3
5
|
* Builds a FeatureNodeData object from a Feature entity and optional AgentRun.
|
|
4
6
|
* This is the single-feature version of the logic in `buildGraphNodes`.
|
|
5
7
|
*/
|
|
6
8
|
export function buildFeatureNodeData(feature, run, options) {
|
|
9
|
+
// Detect crashed agents: DB says running/pending but PID is dead
|
|
10
|
+
const isActive = run?.status === AgentRunStatus.running || run?.status === AgentRunStatus.pending;
|
|
11
|
+
const pidAlive = isActive && run?.pid ? isProcessAlive(run.pid) : undefined;
|
|
7
12
|
return {
|
|
8
13
|
name: feature.name,
|
|
9
14
|
description: feature.description ?? feature.slug,
|
|
@@ -12,7 +17,7 @@ export function buildFeatureNodeData(feature, run, options) {
|
|
|
12
17
|
repositoryPath: feature.repositoryPath,
|
|
13
18
|
branch: feature.branch,
|
|
14
19
|
specPath: feature.specPath,
|
|
15
|
-
state: deriveNodeState(feature, run),
|
|
20
|
+
state: deriveNodeState(feature, run, pidAlive !== undefined ? { isPidAlive: pidAlive } : undefined),
|
|
16
21
|
progress: deriveProgress(feature),
|
|
17
22
|
summary: feature.description,
|
|
18
23
|
userQuery: feature.userQuery,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAQ1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,GACjC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAuE5C"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { AgentRunStatus } from '../../../../packages/core/src/domain/generated/output.js';
|
|
1
2
|
import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components/common/feature-node/derive-feature-state.js';
|
|
3
|
+
import { isProcessAlive } from '../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
|
|
2
4
|
/**
|
|
3
5
|
* Builds React Flow nodes and edges from persisted repositories and features.
|
|
4
6
|
*
|
|
@@ -90,6 +92,9 @@ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes
|
|
|
90
92
|
blockedBy = parentEntry.feature.name;
|
|
91
93
|
}
|
|
92
94
|
}
|
|
95
|
+
// Detect crashed agents: DB says running/pending but PID is dead
|
|
96
|
+
const isActive = run?.status === AgentRunStatus.running || run?.status === AgentRunStatus.pending;
|
|
97
|
+
const pidAlive = isActive && run?.pid ? isProcessAlive(run.pid) : undefined;
|
|
93
98
|
const nodeData = {
|
|
94
99
|
name: feature.name,
|
|
95
100
|
description: feature.description ?? feature.slug,
|
|
@@ -98,7 +103,7 @@ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes
|
|
|
98
103
|
repositoryPath: feature.repositoryPath,
|
|
99
104
|
branch: feature.branch,
|
|
100
105
|
specPath: feature.specPath,
|
|
101
|
-
state: deriveNodeState(feature, run),
|
|
106
|
+
state: deriveNodeState(feature, run, pidAlive !== undefined ? { isPidAlive: pidAlive } : undefined),
|
|
102
107
|
progress: deriveProgress(feature),
|
|
103
108
|
summary: feature.description,
|
|
104
109
|
userQuery: feature.userQuery,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAgjB1F"}
|
package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js
CHANGED
|
@@ -5,6 +5,7 @@ import { useRouter, usePathname } from 'next/navigation';
|
|
|
5
5
|
import { toast } from 'sonner';
|
|
6
6
|
import { Loader2, Trash2, Play, Square, Copy, Check, Code2, ExternalLink } from 'lucide-react';
|
|
7
7
|
import { approveFeature } from '../../../app/actions/approve-feature.js';
|
|
8
|
+
import { resumeFeature } from '../../../app/actions/resume-feature.js';
|
|
8
9
|
import { rejectFeature } from '../../../app/actions/reject-feature.js';
|
|
9
10
|
import { getFeatureArtifact } from '../../../app/actions/get-feature-artifact.js';
|
|
10
11
|
import { getResearchArtifact } from '../../../app/actions/get-research-artifact.js';
|
|
@@ -272,6 +273,24 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
|
|
|
272
273
|
setIsDeleting(false);
|
|
273
274
|
}
|
|
274
275
|
}, [router, deleteSound]);
|
|
276
|
+
const handleRetry = useCallback(async (featureId) => {
|
|
277
|
+
const result = await resumeFeature(featureId);
|
|
278
|
+
if (result.error) {
|
|
279
|
+
toast.error(result.error);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
toast.success('Feature resumed — agent restarting');
|
|
283
|
+
// Optimistically update canvas node
|
|
284
|
+
window.dispatchEvent(new CustomEvent('shep:feature-approved', {
|
|
285
|
+
detail: { featureId },
|
|
286
|
+
}));
|
|
287
|
+
// Optimistically update the drawer view
|
|
288
|
+
setView((prev) => {
|
|
289
|
+
if (prev.type !== 'feature')
|
|
290
|
+
return prev;
|
|
291
|
+
return { ...prev, node: { ...prev.node, state: 'running' } };
|
|
292
|
+
});
|
|
293
|
+
}, []);
|
|
275
294
|
// ── Hooks (always called unconditionally per Rules of Hooks) ──────────
|
|
276
295
|
const featureActionsInput = featureNode?.repositoryPath && featureNode?.branch
|
|
277
296
|
? {
|
|
@@ -313,7 +332,8 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
|
|
|
313
332
|
// ── Body ──────────────────────────────────────────────────────────────
|
|
314
333
|
let body = null;
|
|
315
334
|
if (view.type === 'feature' && featureNode) {
|
|
316
|
-
|
|
335
|
+
const enrichedNode = featureNode.state === 'error' ? { ...featureNode, onRetry: handleRetry } : featureNode;
|
|
336
|
+
body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
|
|
317
337
|
}
|
|
318
338
|
return (_jsx(BaseDrawer, { open: isOpen, onClose: attemptClose, size: "md", modal: false, header: header, "data-testid": view.type === 'feature' ? 'feature-drawer' : 'repository-drawer', children: body }));
|
|
319
339
|
}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAOxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CAoDrD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect, useRef } from 'react';
|
|
4
|
-
import { AlertTriangle, ExternalLink, GitBranch, GitCommitHorizontal, Zap } from 'lucide-react';
|
|
4
|
+
import { AlertTriangle, ExternalLink, GitBranch, GitCommitHorizontal, RotateCcw, Zap, } from 'lucide-react';
|
|
5
5
|
import { InlineAttachments } from '../../common/inline-attachments/index.js';
|
|
6
6
|
import { PrStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
7
7
|
import { cn } from '../../../lib/utils.js';
|
|
@@ -14,7 +14,7 @@ import { getAgentTypeIcon, agentTypeLabels, } from '../../common/feature-node/ag
|
|
|
14
14
|
import { formatDuration } from '../../../lib/format-duration.js';
|
|
15
15
|
export function OverviewTab({ data }) {
|
|
16
16
|
const isCompleted = data.lifecycle === 'maintain';
|
|
17
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsx(FeatureStateBadge, { data: data }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data })] }));
|
|
17
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FeatureStateBadge, { data: data }), data.state === 'error' && data.onRetry ? (_jsxs("button", { "data-testid": "feature-drawer-retry-button", onClick: () => data.onRetry(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(RotateCcw, { className: "h-3.5 w-3.5" }), "Retry"] })) : null] }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data })] }));
|
|
18
18
|
}
|
|
19
19
|
function FeatureStateBadge({ data }) {
|
|
20
20
|
const config = featureNodeStateConfig[data.state];
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts
CHANGED
|
@@ -15,6 +15,8 @@ export declare const DoneWithMergedPr: Story;
|
|
|
15
15
|
export declare const Blocked: Story;
|
|
16
16
|
/** Error state showing error message detail. */
|
|
17
17
|
export declare const Error: Story;
|
|
18
|
+
/** Error state with retry button visible. */
|
|
19
|
+
export declare const ErrorWithRetry: Story;
|
|
18
20
|
/** Minimal data — only required fields, no optional details or PR. */
|
|
19
21
|
export declare const Minimal: Story;
|
|
20
22
|
/** Fast mode feature — shows lightning icon in details section. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAOF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC"}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
2
3
|
import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
3
4
|
import { OverviewTab } from './overview-tab.js';
|
|
4
5
|
const meta = {
|
|
@@ -132,6 +133,14 @@ export const Blocked = {
|
|
|
132
133
|
export const Error = {
|
|
133
134
|
args: { data: errorData },
|
|
134
135
|
};
|
|
136
|
+
const errorWithRetryData = {
|
|
137
|
+
...errorData,
|
|
138
|
+
onRetry: fn(),
|
|
139
|
+
};
|
|
140
|
+
/** Error state with retry button visible. */
|
|
141
|
+
export const ErrorWithRetry = {
|
|
142
|
+
args: { data: errorWithRetryData },
|
|
143
|
+
};
|
|
135
144
|
/** Minimal data — only required fields, no optional details or PR. */
|
|
136
145
|
export const Minimal = {
|
|
137
146
|
args: { data: minimalData },
|
|
@@ -13,12 +13,14 @@ import type { FeatureNodeState, FeatureLifecyclePhase } from './feature-node-sta
|
|
|
13
13
|
* Priority (mirrors CLI formatStatus):
|
|
14
14
|
* 1. Agent waiting_approval → action-required
|
|
15
15
|
* 2. Agent failed → error
|
|
16
|
-
* 3. Agent interrupted/cancelled →
|
|
16
|
+
* 3. Agent interrupted/cancelled → error
|
|
17
17
|
* 4. Agent completed + Maintain lifecycle → done
|
|
18
18
|
* 5. Agent running/pending → running
|
|
19
19
|
* 6. No agent run → fall back to plan tasks / lifecycle
|
|
20
20
|
*/
|
|
21
|
-
export declare function deriveNodeState(feature: Feature, agentRun?: AgentRun | null
|
|
21
|
+
export declare function deriveNodeState(feature: Feature, agentRun?: AgentRun | null, options?: {
|
|
22
|
+
isPidAlive?: boolean;
|
|
23
|
+
}): FeatureNodeState;
|
|
22
24
|
/**
|
|
23
25
|
* Derives progress percentage from Feature.plan.tasks.
|
|
24
26
|
*
|
package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,
|
|
1
|
+
{"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,gBAAgB,CAkDlB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAoBtF;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAOlE,CAAC;AAcF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,qBAAqB,CAQ7F;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,cAAc,EAAE,CAmBlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
|
|
@@ -11,12 +11,12 @@ import { SdlcLifecycle, AgentRunStatus, TaskState, NotificationEventType, } from
|
|
|
11
11
|
* Priority (mirrors CLI formatStatus):
|
|
12
12
|
* 1. Agent waiting_approval → action-required
|
|
13
13
|
* 2. Agent failed → error
|
|
14
|
-
* 3. Agent interrupted/cancelled →
|
|
14
|
+
* 3. Agent interrupted/cancelled → error
|
|
15
15
|
* 4. Agent completed + Maintain lifecycle → done
|
|
16
16
|
* 5. Agent running/pending → running
|
|
17
17
|
* 6. No agent run → fall back to plan tasks / lifecycle
|
|
18
18
|
*/
|
|
19
|
-
export function deriveNodeState(feature, agentRun) {
|
|
19
|
+
export function deriveNodeState(feature, agentRun, options) {
|
|
20
20
|
// Deleting lifecycle takes top priority — feature is being removed
|
|
21
21
|
if (feature.lifecycle === SdlcLifecycle.Deleting) {
|
|
22
22
|
return 'deleting';
|
|
@@ -33,11 +33,13 @@ export function deriveNodeState(feature, agentRun) {
|
|
|
33
33
|
return 'error';
|
|
34
34
|
case AgentRunStatus.interrupted:
|
|
35
35
|
case AgentRunStatus.cancelled:
|
|
36
|
-
return '
|
|
36
|
+
return 'error';
|
|
37
37
|
case AgentRunStatus.completed:
|
|
38
38
|
return 'done';
|
|
39
39
|
case AgentRunStatus.running:
|
|
40
40
|
case AgentRunStatus.pending:
|
|
41
|
+
if (options?.isPidAlive === false)
|
|
42
|
+
return 'error';
|
|
41
43
|
return 'running';
|
|
42
44
|
}
|
|
43
45
|
}
|
package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts
CHANGED
|
@@ -67,6 +67,7 @@ export interface FeatureNodeData {
|
|
|
67
67
|
onAction?: () => void;
|
|
68
68
|
onSettings?: () => void;
|
|
69
69
|
onDelete?: (featureId: string, cleanup?: boolean) => void;
|
|
70
|
+
onRetry?: (featureId: string) => void;
|
|
70
71
|
showHandles?: boolean;
|
|
71
72
|
}
|
|
72
73
|
export type FeatureNodeType = Node<FeatureNodeData, 'featureNode'>;
|
package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA0DnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAqTA"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { Handle, Position } from '@xyflow/react';
|
|
5
|
-
import { Plus, FileText, Wrench, GitMerge, Trash2, Zap, Loader2, Globe, } from 'lucide-react';
|
|
5
|
+
import { Plus, FileText, Wrench, GitMerge, Trash2, Zap, Loader2, Globe, RotateCcw, } from 'lucide-react';
|
|
6
6
|
import { cn } from '../../../lib/utils.js';
|
|
7
7
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
|
|
8
8
|
import { DeleteFeatureDialog } from '../../common/delete-feature-dialog/index.js';
|
|
@@ -82,13 +82,16 @@ export function FeatureNode({ data, selected, }) {
|
|
|
82
82
|
? 'bg-blue-50 text-blue-700'
|
|
83
83
|
: 'bg-green-50 text-green-700'), children: [data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin" })) : (_jsx(Globe, { className: "h-3 w-3" })), _jsx("span", { className: "truncate", children: data.deployment.status === DeploymentState.Booting
|
|
84
84
|
? 'Deploying...'
|
|
85
|
-
: (data.deployment.url ?? 'Live') })] })) : null, _jsx("div", { className: "mt-auto pt-2", children: data.state === 'deleting' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(Trash2, { className: "h-3.5 w-3.5 shrink-0 text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "motion-safe:animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : data.state === 'creating' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "motion-safe:animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : data.state === 'running' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(AgentIcon, { agentType: data.agentType, className: "h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground text-[10px]", children: _jsx("span", { children: data.featureId }) }), _jsxs("div", { "data-testid": "feature-node-badge", className: (() => {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
85
|
+
: (data.deployment.url ?? 'Live') })] })) : null, _jsx("div", { className: "mt-auto pt-2", children: data.state === 'deleting' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(Trash2, { className: "h-3.5 w-3.5 shrink-0 text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "motion-safe:animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : data.state === 'creating' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "motion-safe:animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : data.state === 'running' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(AgentIcon, { agentType: data.agentType, className: "h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground text-[10px]", children: _jsx("span", { children: data.featureId }) }), _jsxs("div", { className: "mt-1.5 flex items-center gap-1.5", children: [_jsxs("div", { "data-testid": "feature-node-badge", className: (() => {
|
|
86
|
+
const override = getActionRequiredBadgeClasses(data);
|
|
87
|
+
return cn('flex min-w-0 flex-1 items-center justify-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium', override?.badgeBgClass ?? config.badgeBgClass, override?.badgeClass ?? config.badgeClass);
|
|
88
|
+
})(), children: [(() => {
|
|
89
|
+
const BadgeIcon = getBadgeIcon(data);
|
|
90
|
+
return _jsx(BadgeIcon, { className: "h-3.5 w-3.5 shrink-0" });
|
|
91
|
+
})(), _jsx("span", { className: "truncate", children: getBadgeText(data) })] }), data.state === 'error' && data.onRetry ? (_jsxs("button", { type: "button", "aria-label": "Retry feature", "data-testid": "feature-node-retry-button", onClick: (e) => {
|
|
92
|
+
e.stopPropagation();
|
|
93
|
+
data.onRetry(data.featureId);
|
|
94
|
+
}, className: "nodrag flex shrink-0 cursor-pointer items-center gap-1 rounded-full bg-red-100 px-2.5 py-1 text-[11px] font-medium text-red-700 transition-colors hover:bg-red-200", children: [_jsx(RotateCcw, { className: "h-3 w-3" }), "Retry"] })) : null] })] })) })] }), data.onAction && data.state !== 'deleting' ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
|
|
92
95
|
e.stopPropagation();
|
|
93
96
|
data.onAction?.();
|
|
94
97
|
}, className: "nodrag absolute top-1/2 left-1/2 flex h-6 w-6 -translate-x-1/2 -translate-y-1/2 cursor-pointer items-center justify-center rounded-full bg-blue-500 text-white opacity-0 shadow-md transition-opacity group-hover:opacity-100 hover:bg-blue-600", children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) })) : data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: false, className: "opacity-0!" })) : null] }));
|
|
@@ -15,6 +15,7 @@ export declare const Creating: Story;
|
|
|
15
15
|
export declare const MergeReviewActionRequired: Story;
|
|
16
16
|
export declare const Deleting: Story;
|
|
17
17
|
export declare const ErrorWithMessage: Story;
|
|
18
|
+
export declare const ErrorWithRetry: Story;
|
|
18
19
|
export declare const WithDeleteButton: Story;
|
|
19
20
|
export declare const FastMode: Story;
|
|
20
21
|
export declare const FastModeDone: Story;
|
package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAiCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAc/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAgHF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAWF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAiCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAc/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAgHF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAWF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAY5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC"}
|
|
@@ -319,6 +319,19 @@ export const ErrorWithMessage = {
|
|
|
319
319
|
},
|
|
320
320
|
render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
|
|
321
321
|
};
|
|
322
|
+
export const ErrorWithRetry = {
|
|
323
|
+
args: {
|
|
324
|
+
name: 'Email Service',
|
|
325
|
+
description: 'Transactional email with SendGrid',
|
|
326
|
+
featureId: '#f5',
|
|
327
|
+
lifecycle: 'review',
|
|
328
|
+
state: 'error',
|
|
329
|
+
progress: 30,
|
|
330
|
+
errorMessage: 'Build failed: type mismatch',
|
|
331
|
+
onRetry: fn(),
|
|
332
|
+
},
|
|
333
|
+
render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
|
|
334
|
+
};
|
|
322
335
|
export const WithDeleteButton = {
|
|
323
336
|
args: {
|
|
324
337
|
name: 'Auth Module',
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAsB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAsB5E,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,2CAuTzF"}
|