@shepai/cli 1.78.1 → 1.79.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/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 +14 -1
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +17 -0
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +25 -0
- package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts +18 -0
- package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-feature-plan.js +31 -0
- package/dist/src/presentation/web/app/api/feature-logs/route.d.ts +16 -0
- package/dist/src/presentation/web/app/api/feature-logs/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/feature-logs/route.js +184 -0
- package/dist/src/presentation/web/app/build-feature-node-data.d.ts +7 -1
- 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 +7 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +7 -3
- package/dist/src/presentation/web/app/settings/page.js +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +7 -19
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +6 -6
- 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 +48 -85
- package/dist/src/presentation/web/components/common/feature-drawer/index.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/index.js +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts +8 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +90 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts +20 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js +252 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +31 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +123 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts +20 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.js +315 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.js +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.d.ts +7 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.js +35 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.d.ts +18 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.js +89 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +6 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +78 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +28 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +157 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts +8 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.js +40 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts +22 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.js +188 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts +30 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.js +100 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +12 -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/index.d.ts +3 -4
- package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/index.js +3 -4
- package/dist/src/presentation/web/components/common/merge-review/index.d.ts +1 -2
- package/dist/src/presentation/web/components/common/merge-review/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/index.js +0 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +0 -8
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +1 -33
- package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts +1 -2
- package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/index.js +0 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +0 -10
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -38
- package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts +1 -2
- package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/index.js +0 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +0 -8
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -29
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +2 -2
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +9 -9
- package/dist/src/presentation/web/hooks/use-feature-logs.d.ts +7 -0
- package/dist/src/presentation/web/hooks/use-feature-logs.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-feature-logs.js +52 -0
- 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 +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/routes-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
- 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]/page/server-reference-manifest.json +68 -38
- 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 +14 -14
- 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 +18 -18
- 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]/page/server-reference-manifest.json +68 -38
- 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 +14 -14
- 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 +14 -14
- 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/feature-logs/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/feature-logs/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/feature-logs/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/feature-logs/route.js +6 -0
- package/web/.next/server/app/api/feature-logs/route.js.map +5 -0
- package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -0
- package/web/.next/server/app/api/feature-logs/route_client-reference-manifest.js +2 -0
- 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/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_feature-logs_route_actions_177445e7.js +3 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_feature-logs_route_actions_177445e7.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__91d44424._.js +12 -0
- package/web/.next/server/chunks/[root-of-the-server]__91d44424._.js.map +1 -0
- 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_da7eef33.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
- 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]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.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]__6eb2a2b0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- 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]__a337ca5c._.js → [root-of-the-server]__ae824a5b._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ae824a5b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
- 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/_1e3cf73b._.js +1 -1
- package/web/.next/server/chunks/ssr/_1e3cf73b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_34fbed18._.js +1 -1
- package/web/.next/server/chunks/ssr/_34fbed18._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_06db7efd._.js → _3e88ce9d._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_06db7efd._.js.map → _3e88ce9d._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_5d4e7151._.js +3 -0
- package/web/.next/server/chunks/ssr/{_5c4ce700._.js.map → _5d4e7151._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_63868199._.js +1 -1
- package/web/.next/server/chunks/ssr/_63868199._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_b0924a46._.js → _83cf28a3._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_b0924a46._.js.map → _83cf28a3._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_4031d614._.js → _887258d0._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_4031d614._.js.map → _887258d0._.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/_acb6a73d._.js +3 -0
- package/web/.next/server/chunks/ssr/{_a38f282a._.js.map → _acb6a73d._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_5dab501b._.js → _ba97cfd3._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_5dab501b._.js.map → _ba97cfd3._.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/node_modules__pnpm_d80c1060._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_d80c1060._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_7efa14ca._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_7efa14ca._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b59d79db._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_b59d79db._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.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 +108 -64
- package/web/.next/static/chunks/{87152e918f80ea8b.js → 297458261f67218c.js} +1 -1
- package/web/.next/static/chunks/{1f57d0c949dbb44d.js → 2a24ac257fc1c10b.js} +1 -1
- package/web/.next/static/chunks/352e25e1bb2b9edb.js +1 -0
- package/web/.next/static/chunks/{8fe834f8a3c36e2f.js → 47ecde22e9663419.js} +2 -2
- package/web/.next/static/chunks/{27c4a8493483e6f3.js → 49743c83c9bced40.js} +1 -1
- package/web/.next/static/chunks/4b20d522b4f5ca7e.js +1 -0
- package/web/.next/static/chunks/{9d8c6c874071efb2.js → 5688494bf052915d.js} +1 -1
- package/web/.next/static/chunks/77a956d5dd063fef.js +1 -0
- package/web/.next/static/chunks/{78455afb0164395c.js → 8eff15a7f35164f9.js} +2 -2
- package/web/.next/static/chunks/96bab6d3820504f3.css +2 -0
- package/web/.next/static/chunks/a1c2ecb710b44081.js +1 -0
- package/web/.next/static/chunks/{6f7ba7846dcc8b21.js → d8d464c156573994.js} +1 -1
- package/web/.next/static/chunks/e29d1e26c2694f78.js +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts +0 -9
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +0 -60
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +0 -47
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +0 -307
- package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts +0 -3
- package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.js +0 -8
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts +0 -3
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.js +0 -8
- package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts +0 -3
- package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/index.js +0 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts +0 -26
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.js +0 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts +0 -3
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +0 -29
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts +0 -14
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +0 -33
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts +0 -3
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.js +0 -8
- package/dist/src/presentation/web/components/common/tech-review-tabs/index.d.ts +0 -3
- package/dist/src/presentation/web/components/common/tech-review-tabs/index.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/tech-review-tabs/index.js +0 -1
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.d.ts +0 -21
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.js +0 -1
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.d.ts +0 -3
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.js +0 -12
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.d.ts +0 -16
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.js +0 -110
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a337ca5c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_5c4ce700._.js +0 -3
- package/web/.next/server/chunks/ssr/_a38f282a._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_5412e589._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_5412e589._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +0 -1
- package/web/.next/static/chunks/08c0a9667c05866c.css +0 -2
- package/web/.next/static/chunks/0fb8038f7ad4d2cf.js +0 -1
- package/web/.next/static/chunks/1211dcaac5963f92.js +0 -1
- package/web/.next/static/chunks/6a3e8ea6e1fd2113.js +0 -1
- package/web/.next/static/chunks/7336f9ec160c7bd8.js +0 -1
- package/web/.next/static/chunks/ba8b2aaa356a5487.js +0 -1
- /package/web/.next/static/{M0oz1_1InoSyr7OMLAKf7 → hVGa8-vd4pFs9splpgq-k}/_buildManifest.js +0 -0
- /package/web/.next/static/{M0oz1_1InoSyr7OMLAKf7 → hVGa8-vd4pFs9splpgq-k}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{M0oz1_1InoSyr7OMLAKf7 → hVGa8-vd4pFs9splpgq-k}/_ssgManifest.js +0 -0
|
@@ -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":"AAUA,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,2DA6CjF"}
|
|
@@ -10,11 +10,24 @@ export default async function FeatureDrawerPage({ params }) {
|
|
|
10
10
|
try {
|
|
11
11
|
const featureRepo = resolve('IFeatureRepository');
|
|
12
12
|
const agentRunRepo = resolve('IAgentRunRepository');
|
|
13
|
+
const repoRepo = resolve('IRepositoryRepository');
|
|
14
|
+
const gitPrService = resolve('IGitPrService');
|
|
13
15
|
const feature = await featureRepo.findById(featureId);
|
|
14
16
|
if (!feature)
|
|
15
17
|
return null;
|
|
16
18
|
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
17
|
-
|
|
19
|
+
// Resolve repository name, base branch, and one-liner for the overview tab
|
|
20
|
+
const getArtifact = resolve('GetFeatureArtifactUseCase');
|
|
21
|
+
const [repo, baseBranch, artifact] = await Promise.all([
|
|
22
|
+
repoRepo.findByPath(feature.repositoryPath).catch(() => null),
|
|
23
|
+
gitPrService.getDefaultBranch(feature.repositoryPath).catch(() => 'main'),
|
|
24
|
+
getArtifact.execute(featureId).catch(() => null),
|
|
25
|
+
]);
|
|
26
|
+
const nodeData = buildFeatureNodeData(feature, run, {
|
|
27
|
+
repositoryName: repo?.name,
|
|
28
|
+
baseBranch,
|
|
29
|
+
oneLiner: artifact?.oneLiner,
|
|
30
|
+
});
|
|
18
31
|
const view = computeDrawerView({
|
|
19
32
|
selectedNode: nodeData,
|
|
20
33
|
isCreateDrawerOpen: false,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface PhaseTimingData {
|
|
2
|
+
agentRunId: string;
|
|
3
|
+
phase: string;
|
|
4
|
+
startedAt: string;
|
|
5
|
+
completedAt?: string;
|
|
6
|
+
durationMs?: number;
|
|
7
|
+
waitingApprovalAt?: string;
|
|
8
|
+
approvalWaitMs?: number;
|
|
9
|
+
}
|
|
10
|
+
type GetPhaseTimingsResult = {
|
|
11
|
+
timings: PhaseTimingData[];
|
|
12
|
+
} | {
|
|
13
|
+
error: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function getFeaturePhaseTimings(featureId: string): Promise<GetPhaseTimingsResult>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=get-feature-phase-timings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-feature-phase-timings.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-phase-timings.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,qBAAqB,GAAG;IAAE,OAAO,EAAE,eAAe,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAwB9F"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function getFeaturePhaseTimings(featureId) {
|
|
4
|
+
if (!featureId.trim()) {
|
|
5
|
+
return { error: 'Feature id is required' };
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const repo = resolve('IPhaseTimingRepository');
|
|
9
|
+
const phaseTimings = await repo.findByFeatureId(featureId);
|
|
10
|
+
const timings = phaseTimings.map((t) => ({
|
|
11
|
+
agentRunId: t.agentRunId,
|
|
12
|
+
phase: t.phase,
|
|
13
|
+
startedAt: t.startedAt,
|
|
14
|
+
completedAt: t.completedAt,
|
|
15
|
+
durationMs: t.durationMs != null ? Number(t.durationMs) : undefined,
|
|
16
|
+
waitingApprovalAt: t.waitingApprovalAt,
|
|
17
|
+
approvalWaitMs: t.approvalWaitMs != null ? Number(t.approvalWaitMs) : undefined,
|
|
18
|
+
}));
|
|
19
|
+
return { timings };
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const message = error instanceof Error ? error.message : 'Failed to load phase timings';
|
|
23
|
+
return { error: message };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface PlanTaskData {
|
|
2
|
+
title: string;
|
|
3
|
+
description: string;
|
|
4
|
+
state: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PlanData {
|
|
7
|
+
state: string;
|
|
8
|
+
overview: string;
|
|
9
|
+
tasks: PlanTaskData[];
|
|
10
|
+
}
|
|
11
|
+
type GetPlanResult = {
|
|
12
|
+
plan: PlanData | undefined;
|
|
13
|
+
} | {
|
|
14
|
+
error: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function getFeaturePlan(featureId: string): Promise<GetPlanResult>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=get-feature-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-feature-plan.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-plan.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,KAAK,aAAa,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgC9E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function getFeaturePlan(featureId) {
|
|
4
|
+
if (!featureId.trim()) {
|
|
5
|
+
return { error: 'Feature id is required' };
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const repo = resolve('IFeatureRepository');
|
|
9
|
+
const feature = await repo.findById(featureId);
|
|
10
|
+
if (!feature) {
|
|
11
|
+
return { error: 'Feature not found' };
|
|
12
|
+
}
|
|
13
|
+
if (!feature.plan) {
|
|
14
|
+
return { plan: undefined };
|
|
15
|
+
}
|
|
16
|
+
const plan = {
|
|
17
|
+
state: feature.plan.state,
|
|
18
|
+
overview: feature.plan.overview,
|
|
19
|
+
tasks: feature.plan.tasks.map((t) => ({
|
|
20
|
+
title: t.title ?? '',
|
|
21
|
+
description: t.description ?? '',
|
|
22
|
+
state: t.state,
|
|
23
|
+
})),
|
|
24
|
+
};
|
|
25
|
+
return { plan };
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
const message = error instanceof Error ? error.message : 'Failed to load feature plan';
|
|
29
|
+
return { error: message };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE API Route: GET /api/feature-logs
|
|
3
|
+
*
|
|
4
|
+
* Streams feature agent log output to the client via Server-Sent Events.
|
|
5
|
+
* Resolves the feature to find its agentRunId, reads the corresponding
|
|
6
|
+
* worker log file, and watches for new content.
|
|
7
|
+
*
|
|
8
|
+
* - Accepts ?featureId query parameter (required)
|
|
9
|
+
* - Sends existing log content as SSE "initial" event
|
|
10
|
+
* - Sends new log content as SSE "log" events
|
|
11
|
+
* - Sends heartbeat comments every 30 seconds to keep connection alive
|
|
12
|
+
* - Cleans up watchers/intervals on client disconnect
|
|
13
|
+
*/
|
|
14
|
+
export declare const dynamic = "force-dynamic";
|
|
15
|
+
export declare function GET(request: Request): Promise<Response>;
|
|
16
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/feature-logs/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AA0BvC,wBAAsB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsJ7D"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE API Route: GET /api/feature-logs
|
|
3
|
+
*
|
|
4
|
+
* Streams feature agent log output to the client via Server-Sent Events.
|
|
5
|
+
* Resolves the feature to find its agentRunId, reads the corresponding
|
|
6
|
+
* worker log file, and watches for new content.
|
|
7
|
+
*
|
|
8
|
+
* - Accepts ?featureId query parameter (required)
|
|
9
|
+
* - Sends existing log content as SSE "initial" event
|
|
10
|
+
* - Sends new log content as SSE "log" events
|
|
11
|
+
* - Sends heartbeat comments every 30 seconds to keep connection alive
|
|
12
|
+
* - Cleans up watchers/intervals on client disconnect
|
|
13
|
+
*/
|
|
14
|
+
import { resolve } from '../../../lib/server-container.js';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
18
|
+
import { watch } from 'node:fs';
|
|
19
|
+
// Force dynamic — SSE streams must never be statically optimized or cached
|
|
20
|
+
export const dynamic = 'force-dynamic';
|
|
21
|
+
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
22
|
+
const POLL_INTERVAL_MS = 2_000;
|
|
23
|
+
/**
|
|
24
|
+
* Create a short-lived SSE error response.
|
|
25
|
+
*/
|
|
26
|
+
function sseError(error) {
|
|
27
|
+
const stream = new ReadableStream({
|
|
28
|
+
start(controller) {
|
|
29
|
+
const encoder = new TextEncoder();
|
|
30
|
+
controller.enqueue(encoder.encode(`event: error\ndata: ${JSON.stringify({ error })}\n\n`));
|
|
31
|
+
controller.close();
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
return new Response(stream, {
|
|
35
|
+
headers: {
|
|
36
|
+
'Content-Type': 'text/event-stream',
|
|
37
|
+
'Cache-Control': 'no-cache',
|
|
38
|
+
Connection: 'keep-alive',
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
export async function GET(request) {
|
|
43
|
+
try {
|
|
44
|
+
const url = new URL(request.url);
|
|
45
|
+
const featureId = url.searchParams.get('featureId');
|
|
46
|
+
if (!featureId?.trim()) {
|
|
47
|
+
return sseError('featureId is required');
|
|
48
|
+
}
|
|
49
|
+
const featureRepo = resolve('IFeatureRepository');
|
|
50
|
+
const feature = await featureRepo.findById(featureId);
|
|
51
|
+
if (!feature) {
|
|
52
|
+
return sseError(`Feature not found: ${featureId}`);
|
|
53
|
+
}
|
|
54
|
+
if (!feature.agentRunId) {
|
|
55
|
+
return sseError(`Feature "${feature.name}" has no agent run`);
|
|
56
|
+
}
|
|
57
|
+
const logPath = join(homedir(), '.shep', 'logs', `worker-${feature.agentRunId}.log`);
|
|
58
|
+
const stream = new ReadableStream({
|
|
59
|
+
start(controller) {
|
|
60
|
+
const encoder = new TextEncoder();
|
|
61
|
+
let stopped = false;
|
|
62
|
+
let bytesRead = 0;
|
|
63
|
+
let watcher = null;
|
|
64
|
+
let pollInterval = null;
|
|
65
|
+
function enqueue(text) {
|
|
66
|
+
if (stopped)
|
|
67
|
+
return;
|
|
68
|
+
try {
|
|
69
|
+
controller.enqueue(encoder.encode(text));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Stream may be closed
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Read any new content from the log file starting at `bytesRead`.
|
|
77
|
+
* Returns the content read, or null if the file doesn't exist yet.
|
|
78
|
+
*/
|
|
79
|
+
async function readNewContent() {
|
|
80
|
+
try {
|
|
81
|
+
const fileStat = await stat(logPath);
|
|
82
|
+
if (fileStat.size <= bytesRead)
|
|
83
|
+
return null;
|
|
84
|
+
const content = await readFile(logPath, 'utf-8');
|
|
85
|
+
const newContent = content.slice(bytesRead);
|
|
86
|
+
bytesRead = content.length;
|
|
87
|
+
return newContent || null;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// File doesn't exist yet — agent may have just started
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check for new content and send it as a log event.
|
|
96
|
+
*/
|
|
97
|
+
async function checkForUpdates() {
|
|
98
|
+
if (stopped)
|
|
99
|
+
return;
|
|
100
|
+
try {
|
|
101
|
+
const content = await readNewContent();
|
|
102
|
+
if (content) {
|
|
103
|
+
enqueue(`event: log\ndata: ${JSON.stringify({ content })}\n\n`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Ignore read errors during polling
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Initialize: read existing content and set up watchers
|
|
111
|
+
(async () => {
|
|
112
|
+
try {
|
|
113
|
+
// Send existing content as initial event
|
|
114
|
+
const initialContent = await readNewContent();
|
|
115
|
+
if (initialContent) {
|
|
116
|
+
enqueue(`event: initial\ndata: ${JSON.stringify({ content: initialContent })}\n\n`);
|
|
117
|
+
}
|
|
118
|
+
if (stopped)
|
|
119
|
+
return;
|
|
120
|
+
// Watch for file changes with fs.watch
|
|
121
|
+
try {
|
|
122
|
+
watcher = watch(logPath, { persistent: false }, () => {
|
|
123
|
+
void checkForUpdates();
|
|
124
|
+
});
|
|
125
|
+
watcher.on('error', () => {
|
|
126
|
+
// Watcher error — fallback poll will handle it
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// File may not exist yet — poll will handle it
|
|
131
|
+
}
|
|
132
|
+
// Fallback poll every 2s (handles cases where fs.watch misses events
|
|
133
|
+
// or the file doesn't exist yet)
|
|
134
|
+
pollInterval = setInterval(() => {
|
|
135
|
+
void checkForUpdates();
|
|
136
|
+
}, POLL_INTERVAL_MS);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Initialization error — stream will still stay open for heartbeats
|
|
140
|
+
}
|
|
141
|
+
})();
|
|
142
|
+
// Heartbeat to keep connection alive
|
|
143
|
+
const heartbeatInterval = setInterval(() => {
|
|
144
|
+
enqueue(': heartbeat\n\n');
|
|
145
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
146
|
+
// Cleanup on client disconnect
|
|
147
|
+
const cleanup = () => {
|
|
148
|
+
stopped = true;
|
|
149
|
+
if (watcher) {
|
|
150
|
+
watcher.close();
|
|
151
|
+
watcher = null;
|
|
152
|
+
}
|
|
153
|
+
if (pollInterval) {
|
|
154
|
+
clearInterval(pollInterval);
|
|
155
|
+
pollInterval = null;
|
|
156
|
+
}
|
|
157
|
+
clearInterval(heartbeatInterval);
|
|
158
|
+
try {
|
|
159
|
+
controller.close();
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Stream may already be closed
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
request.signal.addEventListener('abort', cleanup, { once: true });
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
return new Response(stream, {
|
|
169
|
+
headers: {
|
|
170
|
+
'Content-Type': 'text/event-stream',
|
|
171
|
+
'Cache-Control': 'no-cache',
|
|
172
|
+
Connection: 'keep-alive',
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
// eslint-disable-next-line no-console
|
|
178
|
+
console.error('[SSE route] GET /api/feature-logs error:', error);
|
|
179
|
+
return new Response(JSON.stringify({ error: String(error) }), {
|
|
180
|
+
status: 500,
|
|
181
|
+
headers: { 'Content-Type': 'application/json' },
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import type { Feature, AgentRun } from '../../../../packages/core/src/domain/generated/output.js';
|
|
2
2
|
import type { FeatureNodeData } from '../components/common/feature-node/index.js';
|
|
3
|
+
export interface BuildFeatureNodeDataOptions {
|
|
4
|
+
baseBranch?: string;
|
|
5
|
+
repositoryName?: string;
|
|
6
|
+
/** AI-generated one-liner from FeatureArtifact */
|
|
7
|
+
oneLiner?: string;
|
|
8
|
+
}
|
|
3
9
|
/**
|
|
4
10
|
* Builds a FeatureNodeData object from a Feature entity and optional AgentRun.
|
|
5
11
|
* This is the single-feature version of the logic in `buildGraphNodes`.
|
|
6
12
|
*/
|
|
7
|
-
export declare function buildFeatureNodeData(feature: Feature, run: AgentRun | null): FeatureNodeData;
|
|
13
|
+
export declare function buildFeatureNodeData(feature: Feature, run: AgentRun | null, options?: BuildFeatureNodeDataOptions): FeatureNodeData;
|
|
8
14
|
//# sourceMappingURL=build-feature-node-data.d.ts.map
|
|
@@ -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;AAM9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE;;;GAGG;AACH,wBAAgB,oBAAoB,
|
|
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;AAM9E,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;CACnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CA8BjB"}
|
|
@@ -3,7 +3,7 @@ import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components
|
|
|
3
3
|
* Builds a FeatureNodeData object from a Feature entity and optional AgentRun.
|
|
4
4
|
* This is the single-feature version of the logic in `buildGraphNodes`.
|
|
5
5
|
*/
|
|
6
|
-
export function buildFeatureNodeData(feature, run) {
|
|
6
|
+
export function buildFeatureNodeData(feature, run, options) {
|
|
7
7
|
return {
|
|
8
8
|
name: feature.name,
|
|
9
9
|
description: feature.description ?? feature.slug,
|
|
@@ -14,6 +14,12 @@ export function buildFeatureNodeData(feature, run) {
|
|
|
14
14
|
specPath: feature.specPath,
|
|
15
15
|
state: deriveNodeState(feature, run),
|
|
16
16
|
progress: deriveProgress(feature),
|
|
17
|
+
summary: feature.description,
|
|
18
|
+
userQuery: feature.userQuery,
|
|
19
|
+
createdAt: feature.createdAt instanceof Date ? feature.createdAt.getTime() : feature.createdAt,
|
|
20
|
+
...(options?.repositoryName && { repositoryName: options.repositoryName }),
|
|
21
|
+
...(options?.baseBranch && { baseBranch: options.baseBranch }),
|
|
22
|
+
...(options?.oneLiner && { oneLiner: options.oneLiner }),
|
|
17
23
|
...(run?.agentType && { agentType: run.agentType }),
|
|
18
24
|
...(run?.modelId && { modelId: run.modelId }),
|
|
19
25
|
...(run?.error && { errorMessage: run.error }),
|
|
@@ -32,7 +32,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
|
32
32
|
data: { name: repo.name, repositoryPath: repo.path, id: repo.id },
|
|
33
33
|
});
|
|
34
34
|
const repoFeatures = featuresByRepo[repo.path] ?? [];
|
|
35
|
-
appendFeatureNodes(repoFeatures, repoNodeId, featuresWithRuns, nodes, edges);
|
|
35
|
+
appendFeatureNodes(repoFeatures, repoNodeId, featuresWithRuns, nodes, edges, repo.name);
|
|
36
36
|
}
|
|
37
37
|
// Second pass: group orphaned features under virtual repository nodes
|
|
38
38
|
for (const [repoPath, orphanFeatures] of Object.entries(featuresByRepo)) {
|
|
@@ -46,7 +46,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
|
46
46
|
position: { x: 0, y: 0 },
|
|
47
47
|
data: { name: repoName, repositoryPath: repoPath },
|
|
48
48
|
});
|
|
49
|
-
appendFeatureNodes(orphanFeatures, virtualRepoNodeId, featuresWithRuns, nodes, edges);
|
|
49
|
+
appendFeatureNodes(orphanFeatures, virtualRepoNodeId, featuresWithRuns, nodes, edges, repoName);
|
|
50
50
|
}
|
|
51
51
|
// Add parent→child dependency edges
|
|
52
52
|
for (const { feature } of featuresWithRuns) {
|
|
@@ -65,7 +65,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
|
65
65
|
}
|
|
66
66
|
return { nodes, edges };
|
|
67
67
|
}
|
|
68
|
-
function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes, edges) {
|
|
68
|
+
function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes, edges, repoName) {
|
|
69
69
|
// Sort by createdAt so newest features appear last (bottom) in the layout
|
|
70
70
|
const sorted = [...repoFeatures].sort((a, b) => {
|
|
71
71
|
const aTime = a.feature.createdAt instanceof Date
|
|
@@ -95,6 +95,10 @@ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes
|
|
|
95
95
|
specPath: feature.specPath,
|
|
96
96
|
state: deriveNodeState(feature, run),
|
|
97
97
|
progress: deriveProgress(feature),
|
|
98
|
+
summary: feature.description,
|
|
99
|
+
userQuery: feature.userQuery,
|
|
100
|
+
createdAt: feature.createdAt instanceof Date ? feature.createdAt.getTime() : feature.createdAt,
|
|
101
|
+
...(repoName && { repositoryName: repoName }),
|
|
98
102
|
...(run?.agentType && { agentType: run.agentType }),
|
|
99
103
|
...(run?.modelId && { modelId: run.modelId }),
|
|
100
104
|
...(run?.error && { errorMessage: run.error }),
|
|
@@ -8,5 +8,5 @@ export default async function SettingsPage() {
|
|
|
8
8
|
if (error || !settings) {
|
|
9
9
|
return (_jsx("div", { className: "flex h-full flex-col p-6", children: _jsxs("p", { className: "text-destructive text-sm", children: ["Failed to load settings: ", error] }) }));
|
|
10
10
|
}
|
|
11
|
-
return (_jsx("div", { className: "flex h-full flex-col
|
|
11
|
+
return (_jsx("div", { className: "flex h-full flex-col px-6 pb-6", children: _jsx(SettingsPageClient, { settings: settings, shepHome: shepHome ?? '', dbFileSize: dbFileSize ?? 'Unknown' }) }));
|
|
12
12
|
}
|
|
@@ -2,30 +2,18 @@ import type { FeatureNodeData } from '../../common/feature-node/index.js';
|
|
|
2
2
|
import type { RepositoryNodeData } from '../../common/repository-node/index.js';
|
|
3
3
|
import type { ParentFeatureOption } from '../../common/feature-create-drawer/feature-create-drawer.js';
|
|
4
4
|
import type { WorkflowDefaults } from '../../../app/actions/get-workflow-defaults.js';
|
|
5
|
+
/** Tab key matching FeatureDrawerTabs */
|
|
6
|
+
export type FeatureTabKey = 'overview' | 'activity' | 'log' | 'plan' | 'prd-review' | 'tech-decisions' | 'product-decisions' | 'merge-review';
|
|
5
7
|
/**
|
|
6
8
|
* Discriminated union representing every possible drawer state in the control center.
|
|
7
9
|
* Only one view can be active at a time.
|
|
8
10
|
*/
|
|
9
11
|
export type DrawerView =
|
|
10
|
-
/**
|
|
12
|
+
/** All feature views — tabs handle the lifecycle-specific content */
|
|
11
13
|
{
|
|
12
14
|
type: 'feature';
|
|
13
15
|
node: FeatureNodeData;
|
|
14
|
-
|
|
15
|
-
/** requirements lifecycle + action-required → PRD questionnaire */
|
|
16
|
-
| {
|
|
17
|
-
type: 'prd-review';
|
|
18
|
-
node: FeatureNodeData;
|
|
19
|
-
}
|
|
20
|
-
/** implementation lifecycle + action-required → tech decisions review */
|
|
21
|
-
| {
|
|
22
|
-
type: 'tech-review';
|
|
23
|
-
node: FeatureNodeData;
|
|
24
|
-
}
|
|
25
|
-
/** review lifecycle + action-required|error → merge review */
|
|
26
|
-
| {
|
|
27
|
-
type: 'merge-review';
|
|
28
|
-
node: FeatureNodeData;
|
|
16
|
+
initialTab: FeatureTabKey;
|
|
29
17
|
}
|
|
30
18
|
/** Feature creation form */
|
|
31
19
|
| {
|
|
@@ -40,11 +28,11 @@ export type DrawerView =
|
|
|
40
28
|
type: 'repository';
|
|
41
29
|
data: RepositoryNodeData;
|
|
42
30
|
};
|
|
43
|
-
/** Derives the
|
|
44
|
-
export declare function
|
|
31
|
+
/** Derives the initial tab from node lifecycle + state. */
|
|
32
|
+
export declare function deriveInitialTab(node: FeatureNodeData): FeatureTabKey;
|
|
45
33
|
/**
|
|
46
34
|
* Derives the active DrawerView from control-center state.
|
|
47
|
-
* Priority: feature-create > selected-node
|
|
35
|
+
* Priority: feature-create > selected-node > repository
|
|
48
36
|
*/
|
|
49
37
|
export declare function computeDrawerView({ selectedNode, isCreateDrawerOpen, pendingRepositoryPath, pendingParentFeatureId, selectedRepoNode, features, workflowDefaults, }: {
|
|
50
38
|
selectedNode: FeatureNodeData | null;
|
package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawer-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/drawer-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E
|
|
1
|
+
{"version":3,"file":"drawer-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/drawer-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,yCAAyC;AACzC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,KAAK,GACL,MAAM,GACN,YAAY,GACZ,gBAAgB,GAChB,mBAAmB,GACnB,cAAc,CAAC;AAEnB;;;GAGG;AACH,MAAM,MAAM,UAAU;AACpB,qEAAqE;AACnE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,aAAa,CAAA;CAAE;AACvE,4BAA4B;GAC1B;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AACH,8BAA8B;GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAErD,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAOrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GACjB,EAAE;IACD,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,GAAG,UAAU,GAAG,IAAI,CAoBpB"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
/** Derives the
|
|
2
|
-
export function
|
|
1
|
+
/** Derives the initial tab from node lifecycle + state. */
|
|
2
|
+
export function deriveInitialTab(node) {
|
|
3
3
|
if (node.lifecycle === 'requirements' && node.state === 'action-required')
|
|
4
4
|
return 'prd-review';
|
|
5
5
|
if (node.lifecycle === 'implementation' && node.state === 'action-required')
|
|
6
|
-
return 'tech-
|
|
6
|
+
return 'tech-decisions';
|
|
7
7
|
if (node.lifecycle === 'review' && (node.state === 'action-required' || node.state === 'error'))
|
|
8
8
|
return 'merge-review';
|
|
9
|
-
return '
|
|
9
|
+
return 'overview';
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
12
|
* Derives the active DrawerView from control-center state.
|
|
13
|
-
* Priority: feature-create > selected-node
|
|
13
|
+
* Priority: feature-create > selected-node > repository
|
|
14
14
|
*/
|
|
15
15
|
export function computeDrawerView({ selectedNode, isCreateDrawerOpen, pendingRepositoryPath, pendingParentFeatureId, selectedRepoNode, features, workflowDefaults, }) {
|
|
16
16
|
if (isCreateDrawerOpen) {
|
|
@@ -23,7 +23,7 @@ export function computeDrawerView({ selectedNode, isCreateDrawerOpen, pendingRep
|
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
if (selectedNode) {
|
|
26
|
-
return { type:
|
|
26
|
+
return { type: 'feature', node: selectedNode, initialTab: deriveInitialTab(selectedNode) };
|
|
27
27
|
}
|
|
28
28
|
if (selectedRepoNode) {
|
|
29
29
|
return { type: 'repository', data: selectedRepoNode };
|
|
@@ -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":"AA+CA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CAmiBlF"}
|