@shepai/cli 1.70.1 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.d.ts +32 -0
- package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts +16 -2
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +46 -9
- package/dist/packages/core/src/infrastructure/services/deployment/log-ring-buffer.d.ts +23 -0
- package/dist/packages/core/src/infrastructure/services/deployment/log-ring-buffer.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/deployment/log-ring-buffer.js +46 -0
- package/dist/src/presentation/web/app/actions/get-deployment-logs.d.ts +3 -0
- package/dist/src/presentation/web/app/actions/get-deployment-logs.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-deployment-logs.js +9 -0
- package/dist/src/presentation/web/app/actions/get-feature-artifact.d.ts +2 -0
- package/dist/src/presentation/web/app/actions/get-feature-artifact.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-feature-artifact.js +23 -1
- package/dist/src/presentation/web/app/api/deployment-logs/route.d.ts +15 -0
- package/dist/src/presentation/web/app/api/deployment-logs/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/deployment-logs/route.js +94 -0
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +2 -2
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.js +34 -4
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.d.ts +2 -1
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.js +16 -5
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.d.ts +4 -0
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.js +8 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.js +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +1 -1
- package/dist/src/presentation/web/components/common/product-decisions-summary/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/index.js +1 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary-config.d.ts +23 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary-config.js +1 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.d.ts +3 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.js +13 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.stories.d.ts +14 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.stories.js +74 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.js +1 -1
- package/dist/src/presentation/web/components/common/server-log-viewer/index.d.ts +2 -0
- package/dist/src/presentation/web/components/common/server-log-viewer/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/server-log-viewer/index.js +1 -0
- package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.d.ts +15 -0
- package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.js +31 -0
- package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.stories.d.ts +18 -0
- package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.stories.js +113 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts +1 -1
- 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 +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts +8 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +11 -2
- package/dist/src/presentation/web/components/common/tech-review-tabs/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/index.js +1 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.d.ts +17 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.js +1 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.d.ts +3 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.js +12 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.d.ts +16 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.js +110 -0
- package/dist/src/presentation/web/hooks/use-deployment-logs.d.ts +7 -0
- package/dist/src/presentation/web/hooks/use-deployment-logs.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-deployment-logs.js +50 -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/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- 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/_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.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/deployment-logs/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/deployment-logs/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/deployment-logs/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/deployment-logs/route.js +6 -0
- package/web/.next/server/app/api/deployment-logs/route.js.map +5 -0
- package/web/.next/server/app/api/deployment-logs/route.js.nft.json +1 -0
- package/web/.next/server/app/api/deployment-logs/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
- package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +51 -36
- package/web/.next/server/app/page.js +1 -1
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +25 -10
- package/web/.next/server/app/skills/page.js +1 -1
- 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 +1 -1
- 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/744ca_web__next-internal_server_app_api_deployment-logs_route_actions_b785cd3a.js +3 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_deployment-logs_route_actions_b785cd3a.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__9a136c79._.js +9 -0
- package/web/.next/server/chunks/[root-of-the-server]__9a136c79._.js.map +1 -0
- package/web/.next/server/chunks/{[root-of-the-server]__09413611._.js → [root-of-the-server]__e926de65._.js} +2 -2
- package/web/.next/server/chunks/{[root-of-the-server]__09413611._.js.map → [root-of-the-server]__e926de65._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5f968713._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5f968713._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__249c74f6._.js → [root-of-the-server]__6e8b5181._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__970ba1be._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__970ba1be._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__97a1f9c2._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__97a1f9c2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ad7c18fa._.js +9 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ad7c18fa._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b22d8535._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b22d8535._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_25e0eb34._.js +3 -0
- package/web/.next/server/chunks/ssr/_25e0eb34._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
- package/web/.next/server/chunks/ssr/_49bf495c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_68b5e0de._.js +1 -1
- package/web/.next/server/chunks/ssr/_68b5e0de._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
- package/web/.next/server/chunks/ssr/_725584e5._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_72ce07df._.js +3 -0
- package/web/.next/server/chunks/ssr/_72ce07df._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{node_modules__pnpm_febcbea6._.js → node_modules__pnpm_3288606c._.js} +2 -2
- package/web/.next/server/chunks/ssr/{node_modules__pnpm_febcbea6._.js.map → node_modules__pnpm_3288606c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_5124369c._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_5124369c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_tabs_tsx_b226ea9b._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_tabs_tsx_b226ea9b._.js.map +1 -0
- 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 +64 -42
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/deployment-logs/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/deployment-logs/route/build-manifest.json +11 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/deployment-logs/route/server-reference-manifest.json +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/deployment-logs/route.js +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/deployment-logs/route.js.map +5 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/deployment-logs/route.js.nft.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/deployment-logs/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +51 -36
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +25 -10
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_deployment-logs_route_actions_b785cd3a.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__9a136c79._.js +9 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/{[root-of-the-server]__09413611._.js → [root-of-the-server]__e926de65._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__5f968713._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__249c74f6._.js → [root-of-the-server]__6e8b5181._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__970ba1be._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__97a1f9c2._.js +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ad7c18fa._.js +9 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b22d8535._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_25e0eb34._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_68b5e0de._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_72ce07df._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{node_modules__pnpm_febcbea6._.js → node_modules__pnpm_3288606c._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_5124369c._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_ui_tabs_tsx_b226ea9b._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +64 -42
- package/web/.next/standalone/src/presentation/web/app/actions/get-deployment-logs.ts +16 -0
- package/web/.next/standalone/src/presentation/web/app/actions/get-feature-artifact.ts +26 -1
- package/web/.next/standalone/src/presentation/web/app/api/deployment-logs/route.ts +112 -0
- package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +6 -2
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.tsx +44 -6
- package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.tsx +10 -0
- package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.tsx +76 -23
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/product-decisions-summary/index.ts +6 -0
- package/web/.next/standalone/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary-config.ts +24 -0
- package/web/.next/standalone/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.stories.tsx +87 -0
- package/web/.next/standalone/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.tsx +52 -0
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +5 -1
- package/web/.next/standalone/src/presentation/web/components/common/server-log-viewer/index.ts +6 -0
- package/web/.next/standalone/src/presentation/web/components/common/server-log-viewer/server-log-viewer.stories.tsx +168 -0
- package/web/.next/standalone/src/presentation/web/components/common/server-log-viewer/server-log-viewer.tsx +110 -0
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/index.ts +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +47 -29
- package/web/.next/standalone/src/presentation/web/components/common/tech-review-tabs/index.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.ts +17 -0
- package/web/.next/standalone/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.tsx +129 -0
- package/web/.next/standalone/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.tsx +60 -0
- package/web/.next/standalone/src/presentation/web/hooks/use-deployment-logs.ts +67 -0
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/01ae2241bd4b44b6.js +1 -0
- package/web/.next/static/chunks/20f7876f292cfd82.js +1 -0
- package/web/.next/static/chunks/224ed5f5dbd33154.css +2 -0
- package/web/.next/static/chunks/{87421ab1062a39b7.js → 3e1227e02ef8bcc6.js} +2 -2
- package/web/.next/static/chunks/{1ed0df845a1625f6.js → 62c8ebbd9c7bb287.js} +1 -1
- package/web/.next/static/chunks/673e0c1000a91948.js +1 -0
- package/web/.next/static/chunks/8b6df4f8e194d0ce.js +1 -0
- package/web/.next/static/chunks/b025563d959150a1.js +1 -0
- package/web/.next/static/chunks/{9db5c06001f3e664.js → c7fb052190a02a9c.js} +2 -2
- package/web/.next/static/chunks/d450d8db6be36b8d.js +1 -0
- package/web/.next/static/chunks/d9e3cf214ac2f386.js +1 -0
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/types/link.d.ts +1 -0
- package/web/.next/types/routes.d.ts +2 -1
- package/web/.next/types/validator.ts +9 -0
- package/web/.next/server/chunks/ssr/6769f_@radix-ui_react-roving-focus_dist_index_mjs_b3be3d8e._.js +0 -3
- package/web/.next/server/chunks/ssr/6769f_@radix-ui_react-roving-focus_dist_index_mjs_b3be3d8e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2ffb27f1._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2ffb27f1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +0 -9
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_28993370._.js +0 -3
- package/web/.next/server/chunks/ssr/_28993370._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_690ea95f._.js +0 -3
- package/web/.next/server/chunks/ssr/_690ea95f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/6769f_@radix-ui_react-roving-focus_dist_index_mjs_b3be3d8e._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2ffb27f1._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +0 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +0 -9
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_28993370._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_690ea95f._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js +0 -3
- package/web/.next/static/chunks/16e380b8dd9d11bc.js +0 -1
- package/web/.next/static/chunks/24e1d97cab8bad6d.js +0 -1
- package/web/.next/static/chunks/505c6a9e4c5d0808.js +0 -1
- package/web/.next/static/chunks/a186bbb822ccb655.css +0 -2
- package/web/.next/static/chunks/a5c59952485e875e.js +0 -1
- package/web/.next/static/chunks/a9626385607910b3.js +0 -1
- package/web/.next/static/chunks/d4379644a6145352.js +0 -1
- package/web/.next/static/chunks/fb703cf73aba2eb8.js +0 -1
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__249c74f6._.js.map → [root-of-the-server]__6e8b5181._.js.map} +0 -0
- /package/web/.next/static/{8xZoRkWykApYNlvamCGUe → F3mdpVVEgR5m2xHY_SnYx}/_buildManifest.js +0 -0
- /package/web/.next/static/{8xZoRkWykApYNlvamCGUe → F3mdpVVEgR5m2xHY_SnYx}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{8xZoRkWykApYNlvamCGUe → F3mdpVVEgR5m2xHY_SnYx}/_ssgManifest.js +0 -0
|
@@ -1,13 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Loader2, ExternalLink, Terminal } from 'lucide-react';
|
|
3
5
|
import { DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
4
6
|
import { Badge } from '../../ui/badge.js';
|
|
5
|
-
|
|
7
|
+
import { ServerLogViewer } from '../../common/server-log-viewer/index.js';
|
|
8
|
+
export function DeploymentStatusBadge({ status, url, targetId }) {
|
|
9
|
+
const [logViewerOpen, setLogViewerOpen] = useState(false);
|
|
10
|
+
const showLogButton = targetId && (status === DeploymentState.Booting || status === DeploymentState.Ready);
|
|
6
11
|
switch (status) {
|
|
7
12
|
case DeploymentState.Booting:
|
|
8
|
-
return (_jsxs(Badge, { className: "border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50", children: [_jsx(Loader2, { className: "mr-1 h-3.5 w-3.5 animate-spin" }), "Starting..."
|
|
13
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Badge, { className: "border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50", children: [_jsx(Loader2, { className: "mr-1 h-3.5 w-3.5 animate-spin" }), "Starting...", showLogButton ? (_jsx("button", { type: "button", "aria-label": "View server logs", className: "ml-1.5 inline-flex items-center rounded-sm p-0.5 hover:bg-blue-100", onClick: (e) => {
|
|
14
|
+
e.stopPropagation();
|
|
15
|
+
setLogViewerOpen(true);
|
|
16
|
+
}, children: _jsx(Terminal, { className: "h-3 w-3" }) })) : null] }), showLogButton ? (_jsx(ServerLogViewer, { open: logViewerOpen, onOpenChange: setLogViewerOpen, targetId: targetId })) : null] }));
|
|
9
17
|
case DeploymentState.Ready:
|
|
10
|
-
return (_jsxs(Badge, { className: "border-transparent bg-green-50 text-green-700 hover:bg-green-50", children: [_jsx("span", { className: "mr-1 inline-block h-2 w-2 rounded-full bg-green-500" }), url ? (_jsxs("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 hover:underline", onClick: (e) => e.stopPropagation(), children: [url, _jsx(ExternalLink, { className: "h-3 w-3" })] })) : ('Ready')
|
|
18
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Badge, { className: "border-transparent bg-green-50 text-green-700 hover:bg-green-50", children: [_jsx("span", { className: "mr-1 inline-block h-2 w-2 rounded-full bg-green-500" }), url ? (_jsxs("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 hover:underline", onClick: (e) => e.stopPropagation(), children: [url, _jsx(ExternalLink, { className: "h-3 w-3" })] })) : ('Ready'), showLogButton ? (_jsx("button", { type: "button", "aria-label": "View server logs", className: "ml-1.5 inline-flex items-center rounded-sm p-0.5 hover:bg-green-100", onClick: (e) => {
|
|
19
|
+
e.stopPropagation();
|
|
20
|
+
setLogViewerOpen(true);
|
|
21
|
+
}, children: _jsx(Terminal, { className: "h-3 w-3" }) })) : null] }), showLogButton ? (_jsx(ServerLogViewer, { open: logViewerOpen, onOpenChange: setLogViewerOpen, targetId: targetId })) : null] }));
|
|
11
22
|
default:
|
|
12
23
|
return null;
|
|
13
24
|
}
|
|
@@ -11,4 +11,8 @@ export declare const Ready: Story;
|
|
|
11
11
|
export declare const Stopped: Story;
|
|
12
12
|
/** No deployment — renders nothing. */
|
|
13
13
|
export declare const NoDeployment: Story;
|
|
14
|
+
/** Booting with View Logs button — shows log button next to spinner. */
|
|
15
|
+
export declare const BootingWithLogs: Story;
|
|
16
|
+
/** Ready with View Logs button — shows URL and log button. */
|
|
17
|
+
export declare const ReadyWithLogs: Story;
|
|
14
18
|
//# sourceMappingURL=deployment-status-badge.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment-status-badge.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,qBAAqB,CAO5C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpD,kDAAkD;AAClD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"deployment-status-badge.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,qBAAqB,CAO5C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpD,kDAAkD;AAClD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC"}
|
|
@@ -25,3 +25,11 @@ export const Stopped = {
|
|
|
25
25
|
export const NoDeployment = {
|
|
26
26
|
args: { status: null },
|
|
27
27
|
};
|
|
28
|
+
/** Booting with View Logs button — shows log button next to spinner. */
|
|
29
|
+
export const BootingWithLogs = {
|
|
30
|
+
args: { status: DeploymentState.Booting, targetId: 'demo-target' },
|
|
31
|
+
};
|
|
32
|
+
/** Ready with View Logs button — shows URL and log button. */
|
|
33
|
+
export const ReadyWithLogs = {
|
|
34
|
+
args: { status: DeploymentState.Ready, url: 'http://localhost:3000', targetId: 'demo-target' },
|
|
35
|
+
};
|
|
@@ -9,7 +9,7 @@ function PhaseList({ phases }) {
|
|
|
9
9
|
}
|
|
10
10
|
export function MergeReview({ data, onApprove, onReject, isProcessing = false, isRejecting = false, }) {
|
|
11
11
|
const { pr, diffSummary, phases, branch, warning } = data;
|
|
12
|
-
return (_jsxs("div", { className: "flex flex-1 flex-col", children: [_jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto p-4", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-emerald-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h2", { className: "text-foreground text-sm font-bold", children: "Merge Review" }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs leading-relaxed", children: pr
|
|
12
|
+
return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto p-4", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-emerald-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h2", { className: "text-foreground text-sm font-bold", children: "Merge Review" }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs leading-relaxed", children: pr
|
|
13
13
|
? 'Review the pull request details and approve to merge.'
|
|
14
14
|
: 'Review the changes and approve to merge.' })] })] }), branch ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx(Badge, { variant: "secondary", className: "font-mono text-[11px]", children: branch.source }), _jsx(ArrowRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx(Badge, { variant: "outline", className: "font-mono text-[11px]", children: branch.target })] }) })) : null, pr ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { variant: "outline", className: "text-xs", children: pr.status })] }), pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) })) : null, diffSummary ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(FileDiff, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changes" })] }), _jsxs("div", { className: "grid grid-cols-4 gap-3", children: [_jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.filesChanged }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "files" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-green-600", children: ["+", diffSummary.additions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "additions" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-red-600", children: ["-", diffSummary.deletions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "deletions" })] }), _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.commitCount }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "commits" })] })] })] }) })) : warning ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(AlertTriangle, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx("span", { className: "text-muted-foreground text-xs", children: warning })] }) })) : null, phases && phases.length > 0 ? _jsx(PhaseList, { phases: phases }) : null] }), _jsx(DrawerActionBar, { onReject: onReject, onApprove: onApprove, approveLabel: "Approve Merge", approveIcon: isProcessing ? (_jsx(Loader2, { className: "mr-1.5 h-4 w-4 animate-spin" })) : (_jsx(GitMerge, { className: "mr-1.5 h-4 w-4" })), revisionPlaceholder: "Ask AI to revise before merging...", isProcessing: isProcessing, isRejecting: isRejecting })] }));
|
|
15
15
|
}
|
|
@@ -27,7 +27,7 @@ export function PrdQuestionnaire({ data, selections, onSelect, onApprove, onReje
|
|
|
27
27
|
}, [onSelect, isLastStep, selectSound]);
|
|
28
28
|
if (total === 0)
|
|
29
29
|
return null;
|
|
30
|
-
return (_jsxs("div", { className: "flex flex-1 flex-col", children: [_jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto p-4", children: [showHeader ? (_jsxs("div", { className: "border-border flex items-start gap-3 border-b pb-3", children: [_jsx("div", { className: "mt-1.5 h-2 w-2 shrink-0 rounded-full bg-amber-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-foreground mb-1.5 text-sm font-bold", children: question }), _jsx("p", { className: "text-muted-foreground text-xs leading-relaxed", children: context })] })] })) : null, _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("label", { className: "text-foreground min-w-0 flex-1 text-sm font-semibold", children: currentQuestion.question }), _jsx("div", { className: "mt-1.5 flex shrink-0 gap-1", children: questions.map((q, idx) => (_jsx("button", { type: "button", "aria-label": `Go to question ${idx + 1}`, className: cn('h-1.5 rounded-full transition-all duration-200', idx === currentStep ? 'bg-primary w-4' : 'w-1.5', idx !== currentStep && selections[q.id] ? 'bg-primary/50' : '', idx !== currentStep && !selections[q.id] ? 'bg-muted-foreground/25' : ''), onClick: () => {
|
|
30
|
+
return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto p-4", children: [showHeader ? (_jsxs("div", { className: "border-border flex items-start gap-3 border-b pb-3", children: [_jsx("div", { className: "mt-1.5 h-2 w-2 shrink-0 rounded-full bg-amber-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-foreground mb-1.5 text-sm font-bold", children: question }), _jsx("p", { className: "text-muted-foreground text-xs leading-relaxed", children: context })] })] })) : null, _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("label", { className: "text-foreground min-w-0 flex-1 text-sm font-semibold", children: currentQuestion.question }), _jsx("div", { className: "mt-1.5 flex shrink-0 gap-1", children: questions.map((q, idx) => (_jsx("button", { type: "button", "aria-label": `Go to question ${idx + 1}`, className: cn('h-1.5 rounded-full transition-all duration-200', idx === currentStep ? 'bg-primary w-4' : 'w-1.5', idx !== currentStep && selections[q.id] ? 'bg-primary/50' : '', idx !== currentStep && !selections[q.id] ? 'bg-muted-foreground/25' : ''), onClick: () => {
|
|
31
31
|
navigateSound.play();
|
|
32
32
|
setCurrentStep(idx);
|
|
33
33
|
} }, q.id))) })] }), _jsx("div", { className: "space-y-2", children: currentQuestion.options.map((opt, optIdx) => {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/product-decisions-summary/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,YAAY,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ProductDecisionsSummary } from './product-decisions-summary.js';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ProductDecisionItem {
|
|
2
|
+
/** Question text */
|
|
3
|
+
question: string;
|
|
4
|
+
/** The selected option label */
|
|
5
|
+
selectedOption: string;
|
|
6
|
+
/** Rationale for the selected option */
|
|
7
|
+
rationale: string;
|
|
8
|
+
/** Whether it was the AI-recommended option */
|
|
9
|
+
wasRecommended: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ProductDecisionsSummaryData {
|
|
12
|
+
/** Goal/title from the PRD */
|
|
13
|
+
question: string;
|
|
14
|
+
/** Context description (one-liner) */
|
|
15
|
+
context: string;
|
|
16
|
+
/** Resolved questions with selected options */
|
|
17
|
+
questions: ProductDecisionItem[];
|
|
18
|
+
}
|
|
19
|
+
export interface ProductDecisionsSummaryProps {
|
|
20
|
+
/** Product decisions data from the feature artifact */
|
|
21
|
+
data: ProductDecisionsSummaryData;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=product-decisions-summary-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-decisions-summary-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/product-decisions-summary/product-decisions-summary-config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,4BAA4B;IAC3C,uDAAuD;IACvD,IAAI,EAAE,2BAA2B,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ProductDecisionsSummaryProps } from './product-decisions-summary-config.js';
|
|
2
|
+
export declare function ProductDecisionsSummary({ data }: ProductDecisionsSummaryProps): import("react/jsx-runtime").JSX.Element | null;
|
|
3
|
+
//# sourceMappingURL=product-decisions-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-decisions-summary.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,4BAA4B,EAE7B,MAAM,oCAAoC,CAAC;AAyB5C,wBAAgB,uBAAuB,CAAC,EAAE,IAAI,EAAE,EAAE,4BAA4B,kDAmB7E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ClipboardList } from 'lucide-react';
|
|
4
|
+
import { Badge } from '../../ui/badge.js';
|
|
5
|
+
function ProductDecisionCard({ item, index }) {
|
|
6
|
+
return (_jsx("div", { className: "border-border rounded-lg border", children: _jsx("div", { className: "space-y-2 px-4 py-3", children: _jsxs("div", { className: "flex items-start gap-2.5", children: [_jsx("span", { className: "bg-primary text-primary-foreground flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-bold", children: index + 1 }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("h3", { className: "text-foreground text-sm leading-tight font-semibold", children: item.question }), _jsxs("div", { className: "mt-1 flex items-center gap-2", children: [_jsx("p", { className: "text-muted-foreground text-xs", children: item.selectedOption }), item.wasRecommended ? (_jsx(Badge, { className: "px-1.5 py-0 text-[10px]", children: "AI Recommended" })) : null] })] })] }) }) }));
|
|
7
|
+
}
|
|
8
|
+
export function ProductDecisionsSummary({ data }) {
|
|
9
|
+
const { questions } = data;
|
|
10
|
+
if (questions.length === 0)
|
|
11
|
+
return null;
|
|
12
|
+
return (_jsxs("div", { className: "space-y-4 p-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(ClipboardList, { className: "text-primary h-4 w-4" }), _jsx("h3", { className: "text-foreground text-sm font-bold", children: "Product Decisions" })] }), questions.map((item, i) => (_jsx(ProductDecisionCard, { item: item, index: i }, item.question)))] }));
|
|
13
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { ProductDecisionsSummary } from './product-decisions-summary.js';
|
|
3
|
+
declare const meta: Meta<typeof ProductDecisionsSummary>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof ProductDecisionsSummary>;
|
|
6
|
+
/** Default — multiple product decisions with a mix of recommended and non-recommended. */
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
/** Single question. */
|
|
9
|
+
export declare const SingleQuestion: Story;
|
|
10
|
+
/** All recommended — every option was the AI-recommended choice. */
|
|
11
|
+
export declare const AllRecommended: Story;
|
|
12
|
+
/** No recommended badges — none of the selected options were AI-recommended. */
|
|
13
|
+
export declare const NoneRecommended: Story;
|
|
14
|
+
//# sourceMappingURL=product-decisions-summary.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-decisions-summary.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAkCtE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,uBAAuB,CAc9C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEtD,0FAA0F;AAC1F,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,uBAAuB;AACvB,eAAO,MAAM,cAAc,EAAE,KAI5B,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,cAAc,EAAE,KAO5B,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,eAAe,EAAE,KAO7B,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ProductDecisionsSummary } from './product-decisions-summary.js';
|
|
3
|
+
const mockData = {
|
|
4
|
+
question: 'Goal',
|
|
5
|
+
context: 'Add user authentication to the application',
|
|
6
|
+
questions: [
|
|
7
|
+
{
|
|
8
|
+
question: 'Which authentication strategy should we use?',
|
|
9
|
+
selectedOption: 'OAuth 2.0',
|
|
10
|
+
rationale: 'Industry standard with broad provider support and well-maintained libraries.',
|
|
11
|
+
wasRecommended: true,
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: 'How should we handle session management?',
|
|
15
|
+
selectedOption: 'JWT tokens',
|
|
16
|
+
rationale: 'Stateless and scalable across services without shared session storage.',
|
|
17
|
+
wasRecommended: false,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'What level of MFA should we support?',
|
|
21
|
+
selectedOption: 'Optional TOTP',
|
|
22
|
+
rationale: 'Balances security with user convenience. Power users can opt in.',
|
|
23
|
+
wasRecommended: true,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
question: 'Where should we store user profiles?',
|
|
27
|
+
selectedOption: 'PostgreSQL',
|
|
28
|
+
rationale: 'Relational data model fits well for user attributes and relationships.',
|
|
29
|
+
wasRecommended: false,
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
const meta = {
|
|
34
|
+
title: 'Drawers/Review/ProductDecisionsSummary',
|
|
35
|
+
component: ProductDecisionsSummary,
|
|
36
|
+
tags: ['autodocs'],
|
|
37
|
+
parameters: {
|
|
38
|
+
layout: 'fullscreen',
|
|
39
|
+
},
|
|
40
|
+
decorators: [
|
|
41
|
+
(Story) => (_jsx("div", { style: { height: '600px', width: '400px', border: '1px solid var(--color-border)' }, children: _jsx(Story, {}) })),
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
export default meta;
|
|
45
|
+
/** Default — multiple product decisions with a mix of recommended and non-recommended. */
|
|
46
|
+
export const Default = {
|
|
47
|
+
args: {
|
|
48
|
+
data: mockData,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
/** Single question. */
|
|
52
|
+
export const SingleQuestion = {
|
|
53
|
+
args: {
|
|
54
|
+
data: { ...mockData, questions: [mockData.questions[0]] },
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
/** All recommended — every option was the AI-recommended choice. */
|
|
58
|
+
export const AllRecommended = {
|
|
59
|
+
args: {
|
|
60
|
+
data: {
|
|
61
|
+
...mockData,
|
|
62
|
+
questions: mockData.questions.map((q) => ({ ...q, wasRecommended: true })),
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
/** No recommended badges — none of the selected options were AI-recommended. */
|
|
67
|
+
export const NoneRecommended = {
|
|
68
|
+
args: {
|
|
69
|
+
data: {
|
|
70
|
+
...mockData,
|
|
71
|
+
questions: mockData.questions.map((q) => ({ ...q, wasRecommended: false })),
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
};
|
package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CAqO5F"}
|
|
@@ -34,7 +34,7 @@ export function RepositoryNode({ data }) {
|
|
|
34
34
|
e.stopPropagation();
|
|
35
35
|
data.onClick?.();
|
|
36
36
|
}
|
|
37
|
-
}, className: "nodrag bg-card flex min-w-[18rem] cursor-default items-center gap-3 rounded-full border px-4 py-3 shadow-sm", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), featureFlags.envDeploy ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url })) : null] })) : null] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
|
|
37
|
+
}, className: "nodrag bg-card flex min-w-[18rem] cursor-default items-center gap-3 rounded-full border px-4 py-3 shadow-sm", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), featureFlags.envDeploy ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
|
|
38
38
|
e.stopPropagation();
|
|
39
39
|
data.onAdd?.();
|
|
40
40
|
}, className: "text-muted-foreground hover:bg-accent dark:hover:bg-accent/50 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-full transition-colors hover:text-blue-500", children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.onAdd || data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: !data.showHandles, className: "opacity-0!" })) : null] }));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/server-log-viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,GACjC,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ServerLogViewer, ServerLogViewerContent, } from './server-log-viewer.js';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { LogEntry } from '../../../../../../packages/core/src/application/ports/output/services/deployment-service.interface.js';
|
|
2
|
+
export interface ServerLogViewerProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onOpenChange: (open: boolean) => void;
|
|
5
|
+
targetId: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ServerLogViewerContentProps {
|
|
8
|
+
open: boolean;
|
|
9
|
+
onOpenChange: (open: boolean) => void;
|
|
10
|
+
logs: LogEntry[];
|
|
11
|
+
isConnected: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function ServerLogViewer({ open, onOpenChange, targetId }: ServerLogViewerProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export declare function ServerLogViewerContent({ open, onOpenChange, logs, isConnected, }: ServerLogViewerContentProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=server-log-viewer.d.ts.map
|
package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-log-viewer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/server-log-viewer/server-log-viewer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6EAA6E,CAAC;AAI5G,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAID,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAWrF;AAED,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,YAAY,EACZ,IAAI,EACJ,WAAW,GACZ,EAAE,2BAA2B,2CAyD7B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useRef, useEffect, useCallback } from 'react';
|
|
4
|
+
import { Terminal } from 'lucide-react';
|
|
5
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/dialog.js';
|
|
6
|
+
import { useDeploymentLogs } from '../../../hooks/use-deployment-logs.js';
|
|
7
|
+
const AUTO_SCROLL_THRESHOLD = 50;
|
|
8
|
+
export function ServerLogViewer({ open, onOpenChange, targetId }) {
|
|
9
|
+
const { logs, isConnected } = useDeploymentLogs(open ? targetId : null);
|
|
10
|
+
return (_jsx(ServerLogViewerContent, { open: open, onOpenChange: onOpenChange, logs: logs, isConnected: isConnected }));
|
|
11
|
+
}
|
|
12
|
+
export function ServerLogViewerContent({ open, onOpenChange, logs, isConnected, }) {
|
|
13
|
+
const scrollRef = useRef(null);
|
|
14
|
+
const isAtBottomRef = useRef(true);
|
|
15
|
+
const handleScroll = useCallback(() => {
|
|
16
|
+
const el = scrollRef.current;
|
|
17
|
+
if (!el)
|
|
18
|
+
return;
|
|
19
|
+
isAtBottomRef.current =
|
|
20
|
+
el.scrollTop + el.clientHeight >= el.scrollHeight - AUTO_SCROLL_THRESHOLD;
|
|
21
|
+
}, []);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (isAtBottomRef.current && scrollRef.current) {
|
|
24
|
+
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
|
25
|
+
}
|
|
26
|
+
}, [logs]);
|
|
27
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "flex h-[calc(100vh-48px)] max-h-[calc(100vh-48px)] w-full max-w-[calc(100vw-48px)] flex-col gap-0 bg-zinc-950 p-0 text-zinc-100 sm:rounded-lg", "aria-describedby": undefined, children: [_jsxs(DialogHeader, { className: "flex flex-row items-center justify-between border-b border-zinc-800 px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Terminal, { className: "h-4 w-4 text-zinc-400" }), _jsx(DialogTitle, { className: "text-sm font-medium text-zinc-100", children: "Server Logs" })] }), _jsxs("div", { className: "flex items-center gap-2 pr-8", children: [_jsx("span", { className: `inline-block h-2 w-2 rounded-full ${isConnected ? 'bg-green-500' : 'bg-zinc-500'}` }), _jsx("span", { className: "text-xs text-zinc-400", children: isConnected ? 'Connected' : 'Disconnected' })] })] }), _jsxs("div", { ref: scrollRef, onScroll: handleScroll, className: "flex-1 overflow-auto p-4 font-mono text-sm leading-relaxed", children: [logs.length === 0 ? (_jsx("p", { className: "text-zinc-500", children: "Waiting for log output..." })) : (logs.map((entry) => (_jsx(LogLine, { entry: entry }, `${entry.timestamp}-${entry.stream}-${entry.line}`)))), !isConnected && logs.length > 0 && (_jsx("div", { className: "mt-2 border-t border-zinc-800 pt-2 text-zinc-500", children: "[Server stopped]" }))] })] }) }));
|
|
28
|
+
}
|
|
29
|
+
function LogLine({ entry }) {
|
|
30
|
+
return (_jsx("div", { "data-stream": entry.stream, className: entry.stream === 'stderr' ? 'text-red-400' : 'text-zinc-200', children: _jsx("span", { className: "break-all whitespace-pre-wrap", children: entry.line }) }));
|
|
31
|
+
}
|
package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.stories.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { ServerLogViewerContent } from './server-log-viewer.js';
|
|
3
|
+
declare const meta: Meta<typeof ServerLogViewerContent>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof ServerLogViewerContent>;
|
|
6
|
+
/** Empty state — no log output yet. */
|
|
7
|
+
export declare const Empty: Story;
|
|
8
|
+
/** A few stdout-only lines. */
|
|
9
|
+
export declare const FewLines: Story;
|
|
10
|
+
/** Interleaved stdout and stderr showing color differentiation. */
|
|
11
|
+
export declare const MixedOutput: Story;
|
|
12
|
+
/** 100+ lines demonstrating scrollable content. */
|
|
13
|
+
export declare const ManyLines: Story;
|
|
14
|
+
/** Lines exceeding viewport width showing wrap behavior. */
|
|
15
|
+
export declare const LongLines: Story;
|
|
16
|
+
/** Disconnected state — shows server stopped message. */
|
|
17
|
+
export declare const Disconnected: Story;
|
|
18
|
+
//# sourceMappingURL=server-log-viewer.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-log-viewer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/server-log-viewer/server-log-viewer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,sBAAsB,CAO7C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAuBrD,uCAAuC;AACvC,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAEF,+BAA+B;AAC/B,eAAO,MAAM,QAAQ,EAAE,KAkBtB,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,WAAW,EAAE,KA2BzB,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,SAAS,EAAE,KAgBvB,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,SAAS,EAAE,KAoCvB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC"}
|
package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.stories.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { ServerLogViewerContent } from './server-log-viewer.js';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'Common/ServerLogViewer',
|
|
6
|
+
component: ServerLogViewerContent,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'fullscreen',
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
export default meta;
|
|
13
|
+
function makeLog(line, stream = 'stdout', offsetMs = 0) {
|
|
14
|
+
return {
|
|
15
|
+
targetId: 'story-target',
|
|
16
|
+
stream,
|
|
17
|
+
line,
|
|
18
|
+
timestamp: Date.now() + offsetMs,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function InteractiveWrapper({ logs, isConnected }) {
|
|
22
|
+
const [open, setOpen] = useState(true);
|
|
23
|
+
return (_jsx(ServerLogViewerContent, { open: open, onOpenChange: setOpen, logs: logs, isConnected: isConnected }));
|
|
24
|
+
}
|
|
25
|
+
/** Empty state — no log output yet. */
|
|
26
|
+
export const Empty = {
|
|
27
|
+
render: () => _jsx(InteractiveWrapper, { logs: [], isConnected: true }),
|
|
28
|
+
};
|
|
29
|
+
/** A few stdout-only lines. */
|
|
30
|
+
export const FewLines = {
|
|
31
|
+
render: () => (_jsx(InteractiveWrapper, { logs: [
|
|
32
|
+
makeLog('$ npm run dev', 'stdout', 0),
|
|
33
|
+
makeLog('', 'stdout', 10),
|
|
34
|
+
makeLog('> my-app@1.0.0 dev', 'stdout', 20),
|
|
35
|
+
makeLog('> next dev', 'stdout', 30),
|
|
36
|
+
makeLog('', 'stdout', 40),
|
|
37
|
+
makeLog(' ▲ Next.js 14.2.3', 'stdout', 50),
|
|
38
|
+
makeLog(' - Local: http://localhost:3000', 'stdout', 60),
|
|
39
|
+
makeLog(' - Environments: .env.local', 'stdout', 70),
|
|
40
|
+
makeLog('', 'stdout', 80),
|
|
41
|
+
makeLog(' ✓ Ready in 1.2s', 'stdout', 90),
|
|
42
|
+
], isConnected: true })),
|
|
43
|
+
};
|
|
44
|
+
/** Interleaved stdout and stderr showing color differentiation. */
|
|
45
|
+
export const MixedOutput = {
|
|
46
|
+
render: () => (_jsx(InteractiveWrapper, { logs: [
|
|
47
|
+
makeLog('$ npm run dev', 'stdout', 0),
|
|
48
|
+
makeLog('> next dev', 'stdout', 10),
|
|
49
|
+
makeLog(' ▲ Next.js 14.2.3', 'stdout', 20),
|
|
50
|
+
makeLog('(node:12345) [DEP0040] DeprecationWarning: The punycode module is deprecated.', 'stderr', 30),
|
|
51
|
+
makeLog('Use `node:punycode` instead.', 'stderr', 31),
|
|
52
|
+
makeLog(' - Local: http://localhost:3000', 'stdout', 40),
|
|
53
|
+
makeLog(' ✓ Ready in 1.8s', 'stdout', 50),
|
|
54
|
+
makeLog(' ○ Compiling /page ...', 'stdout', 100),
|
|
55
|
+
makeLog(' ✓ Compiled /page in 342ms', 'stdout', 200),
|
|
56
|
+
makeLog('GET / 200 in 412ms', 'stdout', 300),
|
|
57
|
+
makeLog('Warning: Each child in a list should have a unique "key" prop.', 'stderr', 310),
|
|
58
|
+
makeLog('GET /api/data 200 in 23ms', 'stdout', 400),
|
|
59
|
+
makeLog('GET /favicon.ico 304 in 2ms', 'stdout', 410),
|
|
60
|
+
makeLog("Error: ENOENT: no such file or directory, open '/tmp/cache.json'", 'stderr', 500),
|
|
61
|
+
makeLog('GET /api/users 500 in 156ms', 'stdout', 510),
|
|
62
|
+
], isConnected: true })),
|
|
63
|
+
};
|
|
64
|
+
/** 100+ lines demonstrating scrollable content. */
|
|
65
|
+
export const ManyLines = {
|
|
66
|
+
render: () => {
|
|
67
|
+
const logs = [];
|
|
68
|
+
logs.push(makeLog('$ npm run dev', 'stdout', 0));
|
|
69
|
+
logs.push(makeLog('> next dev', 'stdout', 10));
|
|
70
|
+
logs.push(makeLog(' ✓ Ready in 1.2s', 'stdout', 20));
|
|
71
|
+
for (let i = 0; i < 120; i++) {
|
|
72
|
+
const method = ['GET', 'POST', 'PUT', 'DELETE'][i % 4];
|
|
73
|
+
const path = ['/api/users', '/api/features', '/api/repos', '/api/deploy'][i % 4];
|
|
74
|
+
const status = i % 15 === 0 ? 500 : i % 7 === 0 ? 404 : 200;
|
|
75
|
+
const ms = Math.floor(Math.random() * 500) + 5;
|
|
76
|
+
const stream = status >= 500 ? 'stderr' : 'stdout';
|
|
77
|
+
logs.push(makeLog(`${method} ${path}/${i} ${status} in ${ms}ms`, stream, 100 + i * 10));
|
|
78
|
+
}
|
|
79
|
+
return _jsx(InteractiveWrapper, { logs: logs, isConnected: true });
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
/** Lines exceeding viewport width showing wrap behavior. */
|
|
83
|
+
export const LongLines = {
|
|
84
|
+
render: () => (_jsx(InteractiveWrapper, { logs: [
|
|
85
|
+
makeLog('Short line', 'stdout', 0),
|
|
86
|
+
makeLog("Error: Module not found: Can't resolve '@/components/features/really-long-component-name/that-goes-on-and-on/sub-component/deeply-nested-module/index.tsx' in '/Users/developer/projects/my-very-long-project-name/src/presentation/web/components/features'", 'stderr', 10),
|
|
87
|
+
makeLog('at Object.resolve (webpack://my-app/node_modules/enhanced-resolve/lib/Resolver.js?:331:11) at Object.resolve (webpack://my-app/node_modules/enhanced-resolve/lib/Resolver.js?:331:11) at Object.resolve (webpack://my-app/node_modules/enhanced-resolve/lib/Resolver.js?:331:11)', 'stderr', 20),
|
|
88
|
+
makeLog('Normal log line here', 'stdout', 30),
|
|
89
|
+
makeLog(JSON.stringify({
|
|
90
|
+
level: 'info',
|
|
91
|
+
message: 'Request processed',
|
|
92
|
+
metadata: {
|
|
93
|
+
userId: 'usr_abc123',
|
|
94
|
+
path: '/api/features',
|
|
95
|
+
method: 'POST',
|
|
96
|
+
duration: 234,
|
|
97
|
+
headers: { 'content-type': 'application/json', authorization: 'Bearer xxx...xxx' },
|
|
98
|
+
},
|
|
99
|
+
}), 'stdout', 40),
|
|
100
|
+
makeLog('Another normal line', 'stdout', 50),
|
|
101
|
+
], isConnected: true })),
|
|
102
|
+
};
|
|
103
|
+
/** Disconnected state — shows server stopped message. */
|
|
104
|
+
export const Disconnected = {
|
|
105
|
+
render: () => (_jsx(InteractiveWrapper, { logs: [
|
|
106
|
+
makeLog('$ npm run dev', 'stdout', 0),
|
|
107
|
+
makeLog('> next dev', 'stdout', 10),
|
|
108
|
+
makeLog(' ✓ Ready in 1.2s', 'stdout', 20),
|
|
109
|
+
makeLog('GET / 200 in 412ms', 'stdout', 100),
|
|
110
|
+
makeLog('GET /api/data 200 in 23ms', 'stdout', 200),
|
|
111
|
+
makeLog('SIGTERM received, shutting down...', 'stderr', 300),
|
|
112
|
+
], isConnected: false })),
|
|
113
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { TechDecisionsReview } from './tech-decisions-review.js';
|
|
1
|
+
export { TechDecisionsReview, TechDecisionsContent } from './tech-decisions-review.js';
|
|
2
2
|
export { TechDecisionsDrawer } from './tech-decisions-drawer.js';
|
|
3
3
|
export type { TechDecisionsReviewProps, TechDecisionsDrawerProps, TechDecisionsReviewData, TechDecision, } from './tech-decisions-review-config.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/tech-decisions-review/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/tech-decisions-review/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EACV,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,YAAY,GACb,MAAM,gCAAgC,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { TechDecisionsReview } from './tech-decisions-review.js';
|
|
1
|
+
export { TechDecisionsReview, TechDecisionsContent } from './tech-decisions-review.js';
|
|
2
2
|
export { TechDecisionsDrawer } from './tech-decisions-drawer.js';
|
package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
import type { TechDecisionsReviewProps } from './tech-decisions-review-config.js';
|
|
1
|
+
import type { TechDecisionsReviewProps, TechDecisionsReviewData } from './tech-decisions-review-config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Renders the tech decisions content (header + decision cards) without the action bar.
|
|
4
|
+
* Used by TechReviewTabs to compose with a shared DrawerActionBar.
|
|
5
|
+
*/
|
|
6
|
+
export declare function TechDecisionsContent({ data }: {
|
|
7
|
+
data: TechDecisionsReviewData;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
2
9
|
export declare function TechDecisionsReview({ data, onApprove, onReject, isProcessing, isRejecting, }: TechDecisionsReviewProps): import("react/jsx-runtime").JSX.Element | null;
|
|
3
10
|
//# sourceMappingURL=tech-decisions-review.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tech-decisions-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"tech-decisions-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EAExB,MAAM,gCAAgC,CAAC;AAgHxC;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,kDAgC/E;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,GACpB,EAAE,wBAAwB,kDAoB1B"}
|
package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js
CHANGED
|
@@ -34,9 +34,18 @@ function DecisionCard({ decision, index }) {
|
|
|
34
34
|
return (_jsxs("div", { className: "border-border rounded-lg border", children: [_jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "flex items-start gap-2.5", children: [_jsx("span", { className: "bg-primary text-primary-foreground flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-bold", children: index + 1 }), _jsxs("div", { className: "min-w-0", children: [_jsx("h3", { className: "text-foreground text-sm leading-tight font-semibold", children: decision.title }), _jsx("p", { className: "text-muted-foreground mt-0.5 text-xs", children: decision.chosen })] })] }), 'decisionName' in decision &&
|
|
35
35
|
decision.decisionName ? (_jsx(Badge, { variant: "secondary", className: "bg-primary/10 text-primary shrink-0", children: decision.decisionName })) : null] }), decision.rationale ? (_jsx(Markdown, { components: markdownComponents, children: decision.rationale })) : null] }), decision.rejected.length > 0 ? (_jsxs("div", { className: "border-border border-t", children: [_jsxs("button", { type: "button", onClick: handleToggleAlternatives, className: "text-muted-foreground hover:bg-muted/50 flex w-full items-center gap-1.5 px-4 py-3 text-xs font-medium transition-colors", children: [_jsx(ChevronRight, { className: `h-3.5 w-3.5 transition-transform ${alternativesOpen ? 'rotate-90' : ''}` }), _jsx(Layers, { className: "h-3.5 w-3.5" }), "Other Options Considered (", decision.rejected.length, ")"] }), alternativesOpen ? (_jsx("div", { className: "space-y-1.5 px-4 pb-3", children: decision.rejected.map((alt) => (_jsx("div", { className: "bg-primary/5 rounded-md px-3 py-2", children: _jsx("span", { className: "text-foreground text-xs", children: alt }) }, alt))) })) : null] })) : null] }));
|
|
36
36
|
}
|
|
37
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Renders the tech decisions content (header + decision cards) without the action bar.
|
|
39
|
+
* Used by TechReviewTabs to compose with a shared DrawerActionBar.
|
|
40
|
+
*/
|
|
41
|
+
export function TechDecisionsContent({ data }) {
|
|
38
42
|
const { summary, decisions } = data;
|
|
39
43
|
if (decisions.length === 0)
|
|
40
44
|
return null;
|
|
41
|
-
return (_jsxs("div", { className: "
|
|
45
|
+
return (_jsxs("div", { className: "space-y-4 p-4", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h2", { className: "text-foreground text-sm font-bold", children: "Technical Implementation Plan Review" }), summary ? (_jsx("p", { className: "text-muted-foreground mt-1 text-xs leading-relaxed", children: summary })) : null] })] }), _jsxs("div", { className: "flex items-center gap-2 pt-1", children: [_jsx(GitCompareArrows, { className: "text-primary h-4 w-4" }), _jsx("h3", { className: "text-foreground text-sm font-bold", children: "Technical Decisions" })] }), decisions.map((decision, i) => (_jsx(DecisionCard, { decision: decision, index: i }, decision.title)))] }));
|
|
46
|
+
}
|
|
47
|
+
export function TechDecisionsReview({ data, onApprove, onReject, isProcessing = false, isRejecting = false, }) {
|
|
48
|
+
if (data.decisions.length === 0)
|
|
49
|
+
return null;
|
|
50
|
+
return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(TechDecisionsContent, { data: data }) }), _jsx(DrawerActionBar, { onReject: onReject, onApprove: onApprove, approveLabel: "Approve Plan", approveIcon: _jsx(Check, { className: "mr-1.5 h-4 w-4" }), revisionPlaceholder: "Ask AI to revise the plan...", isProcessing: isProcessing, isRejecting: isRejecting })] }));
|
|
42
51
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/tech-review-tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TechReviewTabs } from './tech-review-tabs.js';
|
package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TechDecisionsReviewData } from '../../common/tech-decisions-review/index.js';
|
|
2
|
+
import type { ProductDecisionsSummaryData } from '../../common/product-decisions-summary/index.js';
|
|
3
|
+
export interface TechReviewTabsProps {
|
|
4
|
+
/** Tech decisions data from the research artifact */
|
|
5
|
+
techData: TechDecisionsReviewData;
|
|
6
|
+
/** Product decisions data — null while loading, undefined if unavailable */
|
|
7
|
+
productData?: ProductDecisionsSummaryData | null;
|
|
8
|
+
/** Approve plan callback */
|
|
9
|
+
onApprove: () => void;
|
|
10
|
+
/** Reject plan callback */
|
|
11
|
+
onReject?: (feedback: string) => void;
|
|
12
|
+
/** Controls disabled state during loading */
|
|
13
|
+
isProcessing?: boolean;
|
|
14
|
+
/** Whether a reject operation is in flight */
|
|
15
|
+
isRejecting?: boolean;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=tech-review-tabs-config.d.ts.map
|