@shepai/cli 1.106.4 → 1.107.0-pr330.e164f47
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/(dashboard)/@drawer/feature/[featureId]/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.js +5 -48
- package/dist/src/presentation/web/app/actions/get-feature-drawer-data.d.ts +8 -0
- package/dist/src/presentation/web/app/actions/get-feature-drawer-data.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-feature-drawer-data.js +67 -0
- 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/api/graph-data/route.d.ts +14 -0
- package/dist/src/presentation/web/app/api/graph-data/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/graph-data/route.js +14 -0
- package/dist/src/presentation/web/app/api/version/route.d.ts +3 -6
- package/dist/src/presentation/web/app/api/version/route.d.ts.map +1 -1
- package/dist/src/presentation/web/app/api/version/route.js +29 -15
- 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 +30 -26
- package/dist/src/presentation/web/components/common/control-center-drawer/use-drawer-sync.d.ts +12 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/use-drawer-sync.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/use-drawer-sync.js +75 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +3 -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 +27 -2
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-graph-state.js +27 -0
- package/dist/src/presentation/web/hooks/use-sound.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-sound.js +13 -3
- 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/src/presentation/web/lib/version.d.ts +5 -5
- package/dist/src/presentation/web/lib/version.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/version.js +26 -12
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/routes-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +53 -53
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
- 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 +78 -63
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -4
- 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 +78 -63
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
- 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 -49
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
- 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 -53
- package/web/.next/server/app/(dashboard)/create/page.js +3 -3
- 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 +78 -63
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -4
- 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 +78 -63
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
- 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 -49
- package/web/.next/server/app/(dashboard)/page.js +3 -3
- 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 -49
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
- 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 +1 -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/attachments/upload-from-path/route.js +1 -1
- package/web/.next/server/app/api/attachments/upload-from-path/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/feature-logs/route.js +1 -1
- package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/graph-data/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/graph-data/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/graph-data/route.js +8 -0
- package/web/.next/server/app/api/graph-data/route.js.map +5 -0
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -0
- package/web/.next/server/app/api/graph-data/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/api/version/route.js +1 -1
- package/web/.next/server/app/api/version/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.js +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +3 -0
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -0
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_graph-data_route_actions_26df8a4e.js +3 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_graph-data_route_actions_26df8a4e.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js.map +1 -0
- package/web/.next/server/chunks/{[root-of-the-server]__db04ed44._.js → [root-of-the-server]__a5879003._.js} +2 -2
- 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]__91d44424._.js → [root-of-the-server]__d8037e14._.js} +2 -2
- 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]__07a39ff2._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.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]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js.map +1 -0
- 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]__c16bf5de._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js.map +1 -0
- 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/{_a8d9cc2f._.js → _0f2b39f5._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_a8d9cc2f._.js.map → _0f2b39f5._.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 +3 -0
- package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_4059434a._.js → _7cb5afad._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_4059434a._.js.map → _7cb5afad._.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/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_e6f2da4f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0619c65b._.js → _e8deff2b._.js} +2 -2
- package/web/.next/server/chunks/ssr/_e8deff2b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_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 +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_758dfa10._.js → src_presentation_web_ce7cbc3c._.js} +3 -3
- package/web/.next/server/chunks/ssr/{src_presentation_web_758dfa10._.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_7275ce5d._.js → src_presentation_web_e2604413._.js} +3 -3
- package/web/.next/server/chunks/ssr/{src_presentation_web_7275ce5d._.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 +321 -285
- package/web/.next/static/chunks/{15e6c83214978e2a.js → 0822ebbebff2718d.js} +1 -1
- package/web/.next/static/chunks/{8a2e6fabcbb6720d.js → 14a2cef371a9f42d.js} +1 -1
- package/web/.next/static/chunks/{abb2cdec13050512.js → 262f024806123251.js} +1 -1
- package/web/.next/static/chunks/505ff1e0712e80f9.js +2 -0
- package/web/.next/static/chunks/5558a658fa82a01f.css +1 -0
- package/web/.next/static/chunks/{7f3823482bd3f594.js → 606cf866494330d2.js} +1 -1
- package/web/.next/static/chunks/{524307fe3f73c1cf.js → 7e2854d3352f7f50.js} +2 -2
- package/web/.next/static/chunks/{71733e636d34974a.js → bc638bb542a3718b.js} +1 -1
- package/web/.next/static/chunks/{9144d63a39898da5.js → e7cd8862950038a6.js} +1 -1
- package/web/.next/static/chunks/{229caf9bd06f0c45.js → ee097d181dc97a5d.js} +2 -2
- package/web/.next/static/chunks/{cacd384748cf0bd2.js → f20192b3d50908b7.js} +1 -1
- package/dist/src/presentation/web/app/actions/get-graph-data.d.ts +0 -10
- package/dist/src/presentation/web/app/actions/get-graph-data.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/get-graph-data.js +0 -10
- package/web/.next/server/chunks/[root-of-the-server]__3b22a1eb._.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__3b22a1eb._.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0619c65b._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_6e08ce21._.js +0 -3
- package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +0 -1
- package/web/.next/static/chunks/a5bcb76c9dcfaee6.js +0 -2
- package/web/.next/static/chunks/db122a6247f69104.css +0 -1
- /package/web/.next/server/chunks/{[root-of-the-server]__db04ed44._.js.map → [root-of-the-server]__a5879003._.js.map} +0 -0
- /package/web/.next/server/chunks/{[root-of-the-server]__91d44424._.js.map → [root-of-the-server]__d8037e14._.js.map} +0 -0
- /package/web/.next/static/{ORc-CcNcyS9ide_AZZ8ay → cQ78pXvGiKF4oj7-Lefwt}/_buildManifest.js +0 -0
- /package/web/.next/static/{ORc-CcNcyS9ide_AZZ8ay → cQ78pXvGiKF4oj7-Lefwt}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{ORc-CcNcyS9ide_AZZ8ay → cQ78pXvGiKF4oj7-Lefwt}/_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
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.tsx"],"names":[],"mappings":"AAOA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxC;AAED,wBAA8B,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,2DAmCjF"}
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { resolve } from '../../../../../lib/server-container.js';
|
|
3
|
-
import { CiStatus } from '../../../../../../../../packages/core/src/domain/generated/output.js';
|
|
4
3
|
import { buildFeatureNodeData } from '../../../../build-feature-node-data.js';
|
|
5
4
|
import { computeDrawerView } from '../../../../../components/common/control-center-drawer/drawer-view.js';
|
|
6
5
|
import { FeatureDrawerClient } from '../../../../../components/common/control-center-drawer/feature-drawer-client.js';
|
|
7
|
-
const CI_STATUS_MAP = {
|
|
8
|
-
success: CiStatus.Success,
|
|
9
|
-
failure: CiStatus.Failure,
|
|
10
|
-
pending: CiStatus.Pending,
|
|
11
|
-
};
|
|
12
6
|
/** Skip static pre-rendering since we need runtime DI container. */
|
|
13
7
|
export const dynamic = 'force-dynamic';
|
|
14
8
|
export default async function FeatureDrawerPage({ params }) {
|
|
@@ -16,52 +10,15 @@ export default async function FeatureDrawerPage({ params }) {
|
|
|
16
10
|
try {
|
|
17
11
|
const featureRepo = resolve('IFeatureRepository');
|
|
18
12
|
const agentRunRepo = resolve('IAgentRunRepository');
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
// Critical path only: feature + agent run (fast DB lookups).
|
|
14
|
+
// Expensive operations (git remote URL, GitHub CI/mergeable status,
|
|
15
|
+
// artifact, repo name, base branch) are deferred to useDrawerSync
|
|
16
|
+
// which runs client-side after the drawer is already visible.
|
|
21
17
|
const feature = await featureRepo.findById(featureId);
|
|
22
18
|
if (!feature)
|
|
23
19
|
return null;
|
|
24
20
|
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
25
|
-
|
|
26
|
-
const getArtifact = resolve('GetFeatureArtifactUseCase');
|
|
27
|
-
const [repo, baseBranch, artifact, remoteUrl, liveMergeable, liveCiResult] = await Promise.all([
|
|
28
|
-
repoRepo.findByPath(feature.repositoryPath).catch(() => null),
|
|
29
|
-
gitPrService.getDefaultBranch(feature.repositoryPath).catch(() => 'main'),
|
|
30
|
-
getArtifact.execute(featureId).catch(() => null),
|
|
31
|
-
gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
|
|
32
|
-
feature.pr?.number
|
|
33
|
-
? gitPrService
|
|
34
|
-
.getMergeableStatus(feature.repositoryPath, feature.pr.number)
|
|
35
|
-
.catch(() => undefined)
|
|
36
|
-
: Promise.resolve(undefined),
|
|
37
|
-
feature.branch
|
|
38
|
-
? gitPrService.getCiStatus(feature.repositoryPath, feature.branch).catch(() => undefined)
|
|
39
|
-
: Promise.resolve(undefined),
|
|
40
|
-
]);
|
|
41
|
-
// Merge live PR status into feature data so the UI always reflects
|
|
42
|
-
// the current GitHub state, even if the background watcher hasn't polled yet.
|
|
43
|
-
if (feature.pr) {
|
|
44
|
-
const liveCiStatus = liveCiResult
|
|
45
|
-
? (CI_STATUS_MAP[liveCiResult.status] ?? CiStatus.Pending)
|
|
46
|
-
: undefined;
|
|
47
|
-
const updates = {};
|
|
48
|
-
if (liveMergeable !== undefined)
|
|
49
|
-
updates.mergeable = liveMergeable;
|
|
50
|
-
if (liveCiStatus !== undefined)
|
|
51
|
-
updates.ciStatus = liveCiStatus;
|
|
52
|
-
if (Object.keys(updates).length > 0) {
|
|
53
|
-
feature.pr = { ...feature.pr, ...updates };
|
|
54
|
-
featureRepo.update(feature).catch(() => {
|
|
55
|
-
/* best-effort persist */
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
const nodeData = buildFeatureNodeData(feature, run, {
|
|
60
|
-
repositoryName: repo?.name,
|
|
61
|
-
baseBranch,
|
|
62
|
-
oneLiner: artifact?.oneLiner,
|
|
63
|
-
remoteUrl: remoteUrl ?? undefined,
|
|
64
|
-
});
|
|
21
|
+
const nodeData = buildFeatureNodeData(feature, run);
|
|
65
22
|
const view = computeDrawerView({
|
|
66
23
|
selectedNode: nodeData,
|
|
67
24
|
isCreateDrawerOpen: false,
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FeatureNodeData } from '../../components/common/feature-node/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Fetches full FeatureNodeData for a given feature ID.
|
|
4
|
+
* Used by the drawer for targeted data syncing without triggering
|
|
5
|
+
* a full router.refresh() / server component re-render.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getFeatureDrawerData(featureId: string): Promise<FeatureNodeData | null>;
|
|
8
|
+
//# sourceMappingURL=get-feature-drawer-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-feature-drawer-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-drawer-data.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAQxE;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAsD7F"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
import { CiStatus } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
4
|
+
import { buildFeatureNodeData } from '../build-feature-node-data.js';
|
|
5
|
+
const CI_STATUS_MAP = {
|
|
6
|
+
success: CiStatus.Success,
|
|
7
|
+
failure: CiStatus.Failure,
|
|
8
|
+
pending: CiStatus.Pending,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Fetches full FeatureNodeData for a given feature ID.
|
|
12
|
+
* Used by the drawer for targeted data syncing without triggering
|
|
13
|
+
* a full router.refresh() / server component re-render.
|
|
14
|
+
*/
|
|
15
|
+
export async function getFeatureDrawerData(featureId) {
|
|
16
|
+
try {
|
|
17
|
+
const featureRepo = resolve('IFeatureRepository');
|
|
18
|
+
const agentRunRepo = resolve('IAgentRunRepository');
|
|
19
|
+
const repoRepo = resolve('IRepositoryRepository');
|
|
20
|
+
const gitPrService = resolve('IGitPrService');
|
|
21
|
+
const getArtifact = resolve('GetFeatureArtifactUseCase');
|
|
22
|
+
const feature = await featureRepo.findById(featureId);
|
|
23
|
+
if (!feature)
|
|
24
|
+
return null;
|
|
25
|
+
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
26
|
+
const [repo, baseBranch, artifact, remoteUrl, liveMergeable, liveCiResult] = await Promise.all([
|
|
27
|
+
repoRepo.findByPath(feature.repositoryPath).catch(() => null),
|
|
28
|
+
gitPrService.getDefaultBranch(feature.repositoryPath).catch(() => 'main'),
|
|
29
|
+
getArtifact.execute(featureId).catch(() => null),
|
|
30
|
+
gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
|
|
31
|
+
feature.pr?.number
|
|
32
|
+
? gitPrService
|
|
33
|
+
.getMergeableStatus(feature.repositoryPath, feature.pr.number)
|
|
34
|
+
.catch(() => undefined)
|
|
35
|
+
: Promise.resolve(undefined),
|
|
36
|
+
feature.branch
|
|
37
|
+
? gitPrService.getCiStatus(feature.repositoryPath, feature.branch).catch(() => undefined)
|
|
38
|
+
: Promise.resolve(undefined),
|
|
39
|
+
]);
|
|
40
|
+
// Merge live PR status into feature data
|
|
41
|
+
if (feature.pr) {
|
|
42
|
+
const liveCiStatus = liveCiResult
|
|
43
|
+
? (CI_STATUS_MAP[liveCiResult.status] ?? CiStatus.Pending)
|
|
44
|
+
: undefined;
|
|
45
|
+
const updates = {};
|
|
46
|
+
if (liveMergeable !== undefined)
|
|
47
|
+
updates.mergeable = liveMergeable;
|
|
48
|
+
if (liveCiStatus !== undefined)
|
|
49
|
+
updates.ciStatus = liveCiStatus;
|
|
50
|
+
if (Object.keys(updates).length > 0) {
|
|
51
|
+
feature.pr = { ...feature.pr, ...updates };
|
|
52
|
+
featureRepo.update(feature).catch(() => {
|
|
53
|
+
/* best-effort persist */
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return buildFeatureNodeData(feature, run, {
|
|
58
|
+
repositoryName: repo?.name,
|
|
59
|
+
baseBranch,
|
|
60
|
+
oneLiner: artifact?.oneLiner,
|
|
61
|
+
remoteUrl: remoteUrl ?? undefined,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -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;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
/** Prevent Next.js from statically prerendering this route at build time. */
|
|
3
|
+
export declare const dynamic = "force-dynamic";
|
|
4
|
+
/**
|
|
5
|
+
* Returns fresh graph nodes and edges for the control-center canvas.
|
|
6
|
+
*
|
|
7
|
+
* Used by the client-side polling fallback instead of a server action
|
|
8
|
+
* so that periodic syncs don't trigger the Next.js "Rendering…" indicator.
|
|
9
|
+
*/
|
|
10
|
+
export declare function GET(): Promise<NextResponse<{
|
|
11
|
+
nodes: import("../../../components/features/features-canvas/index.js").CanvasNodeType[];
|
|
12
|
+
edges: import("@xyflow/react").Edge[];
|
|
13
|
+
}>>;
|
|
14
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/graph-data/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,6EAA6E;AAC7E,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC;;;;;GAKG;AACH,wBAAsB,GAAG;;;IAGxB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { getGraphData } from '../../(dashboard)/get-graph-data.js';
|
|
3
|
+
/** Prevent Next.js from statically prerendering this route at build time. */
|
|
4
|
+
export const dynamic = 'force-dynamic';
|
|
5
|
+
/**
|
|
6
|
+
* Returns fresh graph nodes and edges for the control-center canvas.
|
|
7
|
+
*
|
|
8
|
+
* Used by the client-side polling fallback instead of a server action
|
|
9
|
+
* so that periodic syncs don't trigger the Next.js "Rendering…" indicator.
|
|
10
|
+
*/
|
|
11
|
+
export async function GET() {
|
|
12
|
+
const data = await getGraphData();
|
|
13
|
+
return NextResponse.json(data);
|
|
14
|
+
}
|
|
@@ -4,12 +4,9 @@ export declare const dynamic = "force-dynamic";
|
|
|
4
4
|
/**
|
|
5
5
|
* Returns runtime version info.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* This API route reads the env vars at runtime on the server, ensuring
|
|
12
|
-
* the client always gets the correct version.
|
|
7
|
+
* Reads the version from the DI container's VersionService — the same source
|
|
8
|
+
* used by `shep --version`. This avoids stale values from NEXT_PUBLIC_* env
|
|
9
|
+
* vars which Next.js inlines at build time.
|
|
13
10
|
*/
|
|
14
11
|
export declare function GET(): NextResponse;
|
|
15
12
|
//# sourceMappingURL=route.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/version/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/version/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,6EAA6E;AAC7E,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC;;;;;;GAMG;AACH,wBAAgB,GAAG,IAAI,YAAY,CA0BlC"}
|
|
@@ -1,24 +1,38 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
|
+
import { resolve } from '../../../lib/server-container.js';
|
|
2
3
|
/** Prevent Next.js from statically prerendering this route at build time. */
|
|
3
4
|
export const dynamic = 'force-dynamic';
|
|
4
5
|
/**
|
|
5
6
|
* Returns runtime version info.
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* This API route reads the env vars at runtime on the server, ensuring
|
|
12
|
-
* the client always gets the correct version.
|
|
8
|
+
* Reads the version from the DI container's VersionService — the same source
|
|
9
|
+
* used by `shep --version`. This avoids stale values from NEXT_PUBLIC_* env
|
|
10
|
+
* vars which Next.js inlines at build time.
|
|
13
11
|
*/
|
|
14
12
|
export function GET() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
try {
|
|
14
|
+
const versionService = resolve('IVersionService');
|
|
15
|
+
const { version, name, description } = versionService.getVersion();
|
|
16
|
+
return NextResponse.json({
|
|
17
|
+
version,
|
|
18
|
+
packageName: name,
|
|
19
|
+
description,
|
|
20
|
+
branch: process.env.NEXT_PUBLIC_SHEP_BRANCH ?? '',
|
|
21
|
+
commitHash: process.env.NEXT_PUBLIC_SHEP_COMMIT ?? '',
|
|
22
|
+
instancePath: process.env.NEXT_PUBLIC_SHEP_INSTANCE_PATH ?? '',
|
|
23
|
+
isDev: process.env.NODE_ENV === 'development',
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// DI container not available (e.g. during build) — fall back to env vars
|
|
28
|
+
return NextResponse.json({
|
|
29
|
+
version: process.env.NEXT_PUBLIC_SHEP_VERSION ?? 'unknown',
|
|
30
|
+
packageName: process.env.NEXT_PUBLIC_SHEP_PACKAGE_NAME ?? '@shepai/cli',
|
|
31
|
+
description: process.env.NEXT_PUBLIC_SHEP_DESCRIPTION ?? 'Autonomous AI Native SDLC Platform',
|
|
32
|
+
branch: process.env.NEXT_PUBLIC_SHEP_BRANCH ?? '',
|
|
33
|
+
commitHash: process.env.NEXT_PUBLIC_SHEP_COMMIT ?? '',
|
|
34
|
+
instancePath: process.env.NEXT_PUBLIC_SHEP_INSTANCE_PATH ?? '',
|
|
35
|
+
isDev: process.env.NODE_ENV === 'development',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
24
38
|
}
|
|
@@ -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"}
|