@shepai/cli 1.149.1-pr469.a02d90d → 1.149.1-pr470.181ab7c
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/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +0 -13
- package/dist/src/presentation/cli/index.d.ts +0 -1
- package/dist/src/presentation/cli/index.d.ts.map +1 -1
- package/dist/src/presentation/cli/index.js +0 -3
- package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.d.ts +15 -0
- package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.js +43 -0
- package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.d.ts +18 -0
- package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.js +125 -0
- package/dist/src/presentation/web/components/common/evidence-lightbox/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/evidence-lightbox/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/evidence-lightbox/index.js +1 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.js +28 -2
- package/dist/src/presentation/web/hooks/useTheme.d.ts +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -3
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
- 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 +8 -8
- 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 +3 -3
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.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]__3ef34e4c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +3 -3
- 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]__c094882b._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
- package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
- package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
- package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
- package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6256a985._.js +1 -1
- package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
- package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_632999e5._.js → _8c1ecf12._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_632999e5._.js.map → _8c1ecf12._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_8fcc39d4._.js +1 -1
- package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
- package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_c0d42db9._.js +3 -0
- package/web/.next/server/chunks/ssr/{_48c27bde._.js.map → _c0d42db9._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_bf0f159f._.js → src_presentation_web_b40daacd._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_bf0f159f._.js.map → src_presentation_web_b40daacd._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +44 -44
- package/web/.next/static/chunks/{bb090d9e36df8327.js → 0541215261be863c.js} +1 -1
- package/web/.next/static/chunks/{22a499ec013f10be.js → 157c9dc13f50a7b0.js} +1 -1
- package/web/.next/static/chunks/{1a8a38f6308de8b4.js → 26bf5bbba13a82e6.js} +1 -1
- package/web/.next/static/chunks/{9f04f42c1705c673.js → 2ec1f596453dd1f2.js} +3 -3
- package/web/.next/static/chunks/{97c21e22559eef75.js → 4d6eda6040df02ce.js} +1 -1
- package/web/.next/static/chunks/52470bcbe2e8198d.css +1 -0
- package/web/.next/static/chunks/68312c4f96aa45cb.js +1 -0
- package/web/.next/static/chunks/{4bde88d697f31229.js → 808b5c407600a5a4.js} +1 -1
- package/web/.next/static/chunks/{9651aaa108eba61c.js → 8b0566bb8abb859c.js} +1 -1
- package/web/.next/static/chunks/{db8e005837f3044b.js → 8b724f9eb703b65f.js} +1 -1
- package/web/.next/static/chunks/{a704525b56425f85.js → 96a2f9ad6146fe70.js} +1 -1
- package/web/.next/static/chunks/{bec96dacaa80110a.js → 9d92dc5a448e4a75.js} +1 -1
- package/web/.next/static/chunks/{5cba475c8264bfff.js → f37fa84c0b1429a4.js} +2 -2
- package/dist/packages/core/src/infrastructure/services/mcp/mcp-server.service.d.ts +0 -25
- package/dist/packages/core/src/infrastructure/services/mcp/mcp-server.service.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/mcp/mcp-server.service.js +0 -38
- package/dist/packages/core/src/infrastructure/services/mcp/tools/agent-tools.d.ts +0 -13
- package/dist/packages/core/src/infrastructure/services/mcp/tools/agent-tools.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/mcp/tools/agent-tools.js +0 -92
- package/dist/packages/core/src/infrastructure/services/mcp/tools/feature-tools.d.ts +0 -13
- package/dist/packages/core/src/infrastructure/services/mcp/tools/feature-tools.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/mcp/tools/feature-tools.js +0 -122
- package/dist/packages/core/src/infrastructure/services/mcp/tools/index.d.ts +0 -12
- package/dist/packages/core/src/infrastructure/services/mcp/tools/index.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/mcp/tools/index.js +0 -18
- package/dist/packages/core/src/infrastructure/services/mcp/tools/repo-tools.d.ts +0 -13
- package/dist/packages/core/src/infrastructure/services/mcp/tools/repo-tools.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/mcp/tools/repo-tools.js +0 -39
- package/dist/packages/core/src/infrastructure/services/mcp/tools/settings-tools.d.ts +0 -13
- package/dist/packages/core/src/infrastructure/services/mcp/tools/settings-tools.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/mcp/tools/settings-tools.js +0 -57
- package/dist/src/presentation/cli/commands/mcp.command.d.ts +0 -20
- package/dist/src/presentation/cli/commands/mcp.command.d.ts.map +0 -1
- package/dist/src/presentation/cli/commands/mcp.command.js +0 -65
- package/web/.next/server/chunks/ssr/_48c27bde._.js +0 -3
- package/web/.next/static/chunks/9b8678597fa1db84.css +0 -1
- package/web/.next/static/chunks/d6579a7c65fdb449.js +0 -1
- /package/web/.next/static/{N1E-vO_BaQtqQQzmIws-E → gB1rARZYoJnVIR28ikzjW}/_buildManifest.js +0 -0
- /package/web/.next/static/{N1E-vO_BaQtqQQzmIws-E → gB1rARZYoJnVIR28ikzjW}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{N1E-vO_BaQtqQQzmIws-E → gB1rARZYoJnVIR28ikzjW}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiIrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiIrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA4WrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -436,19 +436,6 @@ export async function initializeContainer() {
|
|
|
436
436
|
container.register('GetBranchSyncStatusUseCase', {
|
|
437
437
|
useFactory: (c) => c.resolve(GetBranchSyncStatusUseCase),
|
|
438
438
|
});
|
|
439
|
-
// McpServerFactory is registered as a lazy async factory to avoid importing
|
|
440
|
-
// @modelcontextprotocol/sdk for non-MCP commands. The factory uses dynamic
|
|
441
|
-
// import() — the actual SDK import only happens when the factory is called.
|
|
442
|
-
container.register('McpServerFactory', {
|
|
443
|
-
useFactory: (c) => {
|
|
444
|
-
return async () => {
|
|
445
|
-
const { McpServerService } = await import('../services/mcp/mcp-server.service.js');
|
|
446
|
-
const versionService = c.resolve('IVersionService');
|
|
447
|
-
const { version } = versionService.getVersion();
|
|
448
|
-
return new McpServerService(version, c);
|
|
449
|
-
};
|
|
450
|
-
},
|
|
451
|
-
});
|
|
452
439
|
_initialized = true;
|
|
453
440
|
return container;
|
|
454
441
|
}
|
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
* shep repo Manage tracked repositories
|
|
22
22
|
* shep settings Configure Shep settings
|
|
23
23
|
* shep upgrade Upgrade Shep CLI to the latest version
|
|
24
|
-
* shep mcp Start the MCP server for AI agent integration
|
|
25
24
|
* shep --version Display version number only
|
|
26
25
|
*
|
|
27
26
|
* Global Options:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/presentation/cli/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/presentation/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,kBAAkB,CAAC"}
|
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
* shep repo Manage tracked repositories
|
|
22
22
|
* shep settings Configure Shep settings
|
|
23
23
|
* shep upgrade Upgrade Shep CLI to the latest version
|
|
24
|
-
* shep mcp Start the MCP server for AI agent integration
|
|
25
24
|
* shep --version Display version number only
|
|
26
25
|
*
|
|
27
26
|
* Global Options:
|
|
@@ -43,7 +42,6 @@ import { createIdeOpenCommand } from './commands/ide-open.command.js';
|
|
|
43
42
|
import { createInstallCommand } from './commands/install.command.js';
|
|
44
43
|
import { createUpgradeCommand } from './commands/upgrade.command.js';
|
|
45
44
|
import { createToolsCommand } from './commands/tools.command.js';
|
|
46
|
-
import { createMcpCommand } from './commands/mcp.command.js';
|
|
47
45
|
import { messages } from './ui/index.js';
|
|
48
46
|
// Daemon lifecycle commands
|
|
49
47
|
import { createStartCommand } from './commands/start.command.js';
|
|
@@ -112,7 +110,6 @@ async function bootstrap() {
|
|
|
112
110
|
program.addCommand(createInstallCommand());
|
|
113
111
|
program.addCommand(createToolsCommand());
|
|
114
112
|
program.addCommand(createUpgradeCommand());
|
|
115
|
-
program.addCommand(createMcpCommand());
|
|
116
113
|
// Daemon lifecycle commands (task-9)
|
|
117
114
|
program.addCommand(createStartCommand());
|
|
118
115
|
program.addCommand(createStopCommand());
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MergeReviewEvidence } from '../../common/merge-review/merge-review-config.js';
|
|
2
|
+
export interface EvidenceLightboxProps {
|
|
3
|
+
/** Array of image evidence items to display in the lightbox. */
|
|
4
|
+
images: MergeReviewEvidence[];
|
|
5
|
+
/** Whether the lightbox dialog is open. */
|
|
6
|
+
open: boolean;
|
|
7
|
+
/** Callback when the dialog open state changes. */
|
|
8
|
+
onOpenChange: (open: boolean) => void;
|
|
9
|
+
/** Index of the currently selected image. */
|
|
10
|
+
selectedIndex: number;
|
|
11
|
+
/** Callback when the selected image index changes. */
|
|
12
|
+
onSelectedIndexChange: (index: number) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function EvidenceLightbox({ images, open, onOpenChange, selectedIndex, onSelectedIndexChange, }: EvidenceLightboxProps): import("react/jsx-runtime").JSX.Element | null;
|
|
15
|
+
//# sourceMappingURL=evidence-lightbox.d.ts.map
|
package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-lightbox.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAOhG,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,2CAA2C;IAC3C,IAAI,EAAE,OAAO,CAAC;IACd,mDAAmD;IACnD,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAKD,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,qBAAqB,GACtB,EAAE,qBAAqB,kDA6FvB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/* eslint-disable @next/next/no-img-element -- Local evidence files require raw <img>, not next/image */
|
|
2
|
+
'use client';
|
|
3
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
4
|
+
import { useEffect, useCallback } from 'react';
|
|
5
|
+
import { Dialog, DialogContent, DialogTitle } from '../../ui/dialog.js';
|
|
6
|
+
import { VisuallyHidden } from 'radix-ui';
|
|
7
|
+
import { ChevronLeft, ChevronRight, DownloadIcon } from 'lucide-react';
|
|
8
|
+
/** Build the API URL for serving an evidence file (paths are pre-normalized to absolute). */
|
|
9
|
+
function buildEvidenceUrl(absolutePath) {
|
|
10
|
+
return `/api/evidence?path=${encodeURIComponent(absolutePath)}`;
|
|
11
|
+
}
|
|
12
|
+
const DIALOG_CONTENT_CLASS = 'max-w-4xl gap-0 overflow-hidden border-0 p-0 [&>button:last-child]:!cursor-pointer [&>button:last-child]:!rounded-full [&>button:last-child]:!bg-black/70 [&>button:last-child]:!p-1.5 [&>button:last-child]:!text-white [&>button:last-child]:!opacity-100 [&>button:last-child]:!shadow-lg [&>button:last-child]:!backdrop-blur-md [&>button:last-child]:hover:!bg-black/90';
|
|
13
|
+
export function EvidenceLightbox({ images, open, onOpenChange, selectedIndex, onSelectedIndexChange, }) {
|
|
14
|
+
const count = images.length;
|
|
15
|
+
const current = images[selectedIndex];
|
|
16
|
+
const hasMultiple = count > 1;
|
|
17
|
+
const goNext = useCallback(() => {
|
|
18
|
+
onSelectedIndexChange((selectedIndex + 1) % count);
|
|
19
|
+
}, [selectedIndex, count, onSelectedIndexChange]);
|
|
20
|
+
const goPrev = useCallback(() => {
|
|
21
|
+
onSelectedIndexChange((selectedIndex - 1 + count) % count);
|
|
22
|
+
}, [selectedIndex, count, onSelectedIndexChange]);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!open || !hasMultiple)
|
|
25
|
+
return;
|
|
26
|
+
function handleKeyDown(e) {
|
|
27
|
+
if (e.key === 'ArrowRight') {
|
|
28
|
+
e.stopPropagation();
|
|
29
|
+
goNext();
|
|
30
|
+
}
|
|
31
|
+
else if (e.key === 'ArrowLeft') {
|
|
32
|
+
e.stopPropagation();
|
|
33
|
+
goPrev();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
37
|
+
return () => document.removeEventListener('keydown', handleKeyDown);
|
|
38
|
+
}, [open, hasMultiple, goNext, goPrev]);
|
|
39
|
+
if (!current)
|
|
40
|
+
return null;
|
|
41
|
+
const imageUrl = buildEvidenceUrl(current.relativePath);
|
|
42
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: DIALOG_CONTENT_CLASS, "aria-describedby": undefined, children: [_jsx(VisuallyHidden.Root, { children: _jsxs(DialogTitle, { children: ["Evidence: ", current.description] }) }), _jsx("div", { className: "relative bg-black/90", children: _jsx("img", { src: imageUrl, alt: current.description, className: "h-auto max-h-[90vh] w-full object-contain" }) }), _jsxs("div", { className: "bg-background flex items-center gap-3 px-4 py-3", children: [_jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [hasMultiple ? (_jsxs("span", { className: "text-muted-foreground shrink-0 text-xs tabular-nums", children: [selectedIndex + 1, " / ", count] })) : null, _jsx("span", { className: "text-foreground truncate text-sm", children: current.description })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [hasMultiple ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: goPrev, className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1.5 transition-colors", "aria-label": "Previous image", children: _jsx(ChevronLeft, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", onClick: goNext, className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1.5 transition-colors", "aria-label": "Next image", children: _jsx(ChevronRight, { className: "h-4 w-4" }) })] })) : null, _jsx("a", { href: imageUrl, download: true, className: "text-muted-foreground hover:text-foreground shrink-0 cursor-pointer rounded p-1.5 transition-colors", "aria-label": "Download image", children: _jsx(DownloadIcon, { className: "h-4 w-4" }) })] })] })] }) }));
|
|
43
|
+
}
|
package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { EvidenceLightbox } from './evidence-lightbox.js';
|
|
3
|
+
declare const meta: Meta<typeof EvidenceLightbox>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof EvidenceLightbox>;
|
|
6
|
+
/** Default — 3-column thumbnail gallery with 3 image evidence items. Click to open lightbox. */
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
/** Lightbox open — dialog visible with image, counter, nav buttons, description, and download. */
|
|
9
|
+
export declare const LightboxOpen: Story;
|
|
10
|
+
/** Single image — gallery with one thumbnail. Lightbox opens without nav buttons or counter. */
|
|
11
|
+
export declare const SingleImage: Story;
|
|
12
|
+
/** Many images — 8 images in the gallery grid to test multi-row layout. */
|
|
13
|
+
export declare const ManyImages: Story;
|
|
14
|
+
/** Mixed evidence — images in gallery grid + non-images listed below as expandable items. */
|
|
15
|
+
export declare const MixedEvidence: Story;
|
|
16
|
+
/** Lightbox only (controlled) — raw EvidenceLightbox component with args. */
|
|
17
|
+
export declare const LightboxControlled: Story;
|
|
18
|
+
//# sourceMappingURL=evidence-lightbox.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-lightbox.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA+JvD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAYvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAM/C,gGAAgG;AAChG,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,6FAA6F;AAC7F,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,EAAE,KAQhC,CAAC"}
|
package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/* eslint-disable @next/next/no-img-element -- Story thumbnails use raw <img> to match production */
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { fn } from '@storybook/test';
|
|
5
|
+
import { EvidenceLightbox } from './evidence-lightbox.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Mock data — placeholder images via data-URI (1×1 colored pixels)
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
function mockEvidence(index, overrides) {
|
|
10
|
+
return {
|
|
11
|
+
type: 'Screenshot',
|
|
12
|
+
capturedAt: `2026-03-09T12:0${index}:00Z`,
|
|
13
|
+
description: `Screenshot ${index + 1} — evidence capture`,
|
|
14
|
+
relativePath: `/home/user/.shep/repos/abc/evidence/screenshot-${index}.png`,
|
|
15
|
+
taskRef: `task-${index + 1}`,
|
|
16
|
+
...overrides,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const threeImages = [
|
|
20
|
+
mockEvidence(0, { description: 'Homepage after auth banner added' }),
|
|
21
|
+
mockEvidence(1, { description: 'Login form validation error states' }),
|
|
22
|
+
mockEvidence(2, { description: 'Dashboard with new sidebar navigation' }),
|
|
23
|
+
];
|
|
24
|
+
const singleImage = [
|
|
25
|
+
mockEvidence(0, { description: 'Final state of the landing page redesign' }),
|
|
26
|
+
];
|
|
27
|
+
const manyImages = Array.from({ length: 8 }, (_, i) => mockEvidence(i, {
|
|
28
|
+
description: `Evidence capture ${i + 1} — ${['homepage', 'login form', 'dashboard', 'settings page', 'profile view', 'search results', 'notification panel', 'admin console'][i]}`,
|
|
29
|
+
}));
|
|
30
|
+
const mixedEvidence = [
|
|
31
|
+
mockEvidence(0, { description: 'Homepage showing new auth banner' }),
|
|
32
|
+
mockEvidence(1, { description: 'Login form with validation errors' }),
|
|
33
|
+
mockEvidence(2, { description: 'Dashboard after navigation update' }),
|
|
34
|
+
{
|
|
35
|
+
type: 'TestOutput',
|
|
36
|
+
capturedAt: '2026-03-09T12:04:00Z',
|
|
37
|
+
description: 'Unit tests — all 42 passing',
|
|
38
|
+
relativePath: '/home/user/.shep/repos/abc/evidence/unit-test-results.txt',
|
|
39
|
+
taskRef: 'task-4',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: 'Video',
|
|
43
|
+
capturedAt: '2026-03-09T12:05:00Z',
|
|
44
|
+
description: 'Login flow walkthrough recording',
|
|
45
|
+
relativePath: '/home/user/.shep/repos/abc/evidence/login-flow.mp4',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
type: 'TerminalRecording',
|
|
49
|
+
capturedAt: '2026-03-09T12:06:00Z',
|
|
50
|
+
description: 'CLI auth command output',
|
|
51
|
+
relativePath: '/home/user/.shep/repos/abc/evidence/cli-auth.txt',
|
|
52
|
+
taskRef: 'task-5',
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Helper: thumbnail gallery grid + lightbox (mirrors EvidenceList behavior)
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
const IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp']);
|
|
59
|
+
function getExtension(path) {
|
|
60
|
+
const dot = path.lastIndexOf('.');
|
|
61
|
+
return dot >= 0 ? path.slice(dot).toLowerCase() : '';
|
|
62
|
+
}
|
|
63
|
+
function isImageEvidence(e) {
|
|
64
|
+
return e.type === 'Screenshot' || IMAGE_EXTENSIONS.has(getExtension(e.relativePath));
|
|
65
|
+
}
|
|
66
|
+
function buildEvidenceUrl(absolutePath) {
|
|
67
|
+
return `/api/evidence?path=${encodeURIComponent(absolutePath)}`;
|
|
68
|
+
}
|
|
69
|
+
/** Story wrapper that renders a thumbnail grid + lightbox, matching EvidenceList layout. */
|
|
70
|
+
function GalleryWithLightbox({ evidence, initialOpen = false, initialIndex = 0, }) {
|
|
71
|
+
const [open, setOpen] = useState(initialOpen);
|
|
72
|
+
const [selectedIndex, setSelectedIndex] = useState(initialIndex);
|
|
73
|
+
const imageEvidence = evidence.filter(isImageEvidence);
|
|
74
|
+
const nonImageEvidence = evidence.filter((e) => !isImageEvidence(e));
|
|
75
|
+
return (_jsxs("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("span", { className: "text-foreground text-xs font-semibold", children: "Evidence" }), _jsx("span", { className: "bg-secondary text-secondary-foreground rounded-md px-1.5 py-0.5 text-[10px] font-medium", children: evidence.length })] }), imageEvidence.length > 0 ? (_jsx("div", { className: "mb-3 grid grid-cols-3 gap-2", children: imageEvidence.map((e, i) => (_jsx("button", { type: "button", className: "cursor-pointer overflow-hidden rounded-md border", onClick: () => {
|
|
76
|
+
setSelectedIndex(i);
|
|
77
|
+
setOpen(true);
|
|
78
|
+
}, children: _jsx("img", { src: buildEvidenceUrl(e.relativePath), alt: e.description, className: "aspect-square w-full bg-gray-100 object-cover dark:bg-gray-800", loading: "lazy" }) }, e.relativePath))) })) : null, nonImageEvidence.length > 0 ? (_jsx("ul", { className: "space-y-2", children: nonImageEvidence.map((e) => (_jsx("li", { className: "border-border rounded-md border", children: _jsxs("div", { className: "flex items-center gap-2.5 px-3 py-2.5", children: [_jsx("span", { className: "text-foreground text-xs font-medium", children: e.description }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: ["(", e.type, ")"] })] }) }, e.relativePath))) })) : null] }), _jsx(EvidenceLightbox, { images: imageEvidence, open: open, onOpenChange: setOpen, selectedIndex: selectedIndex, onSelectedIndexChange: setSelectedIndex })] }));
|
|
79
|
+
}
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Meta
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
const meta = {
|
|
84
|
+
title: 'Common/EvidenceLightbox',
|
|
85
|
+
component: EvidenceLightbox,
|
|
86
|
+
tags: ['autodocs'],
|
|
87
|
+
parameters: { layout: 'padded' },
|
|
88
|
+
decorators: [
|
|
89
|
+
(Story) => (_jsx("div", { style: { maxWidth: '400px', border: '1px solid var(--color-border)', padding: '16px' }, children: _jsx(Story, {}) })),
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
export default meta;
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Stories
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
/** Default — 3-column thumbnail gallery with 3 image evidence items. Click to open lightbox. */
|
|
97
|
+
export const Default = {
|
|
98
|
+
render: () => _jsx(GalleryWithLightbox, { evidence: threeImages }),
|
|
99
|
+
};
|
|
100
|
+
/** Lightbox open — dialog visible with image, counter, nav buttons, description, and download. */
|
|
101
|
+
export const LightboxOpen = {
|
|
102
|
+
render: () => _jsx(GalleryWithLightbox, { evidence: threeImages, initialOpen: true, initialIndex: 1 }),
|
|
103
|
+
};
|
|
104
|
+
/** Single image — gallery with one thumbnail. Lightbox opens without nav buttons or counter. */
|
|
105
|
+
export const SingleImage = {
|
|
106
|
+
render: () => _jsx(GalleryWithLightbox, { evidence: singleImage, initialOpen: true }),
|
|
107
|
+
};
|
|
108
|
+
/** Many images — 8 images in the gallery grid to test multi-row layout. */
|
|
109
|
+
export const ManyImages = {
|
|
110
|
+
render: () => _jsx(GalleryWithLightbox, { evidence: manyImages }),
|
|
111
|
+
};
|
|
112
|
+
/** Mixed evidence — images in gallery grid + non-images listed below as expandable items. */
|
|
113
|
+
export const MixedEvidence = {
|
|
114
|
+
render: () => _jsx(GalleryWithLightbox, { evidence: mixedEvidence }),
|
|
115
|
+
};
|
|
116
|
+
/** Lightbox only (controlled) — raw EvidenceLightbox component with args. */
|
|
117
|
+
export const LightboxControlled = {
|
|
118
|
+
args: {
|
|
119
|
+
images: threeImages,
|
|
120
|
+
open: true,
|
|
121
|
+
onOpenChange: fn().mockName('onOpenChange'),
|
|
122
|
+
selectedIndex: 0,
|
|
123
|
+
onSelectedIndexChange: fn().mockName('onSelectedIndexChange'),
|
|
124
|
+
},
|
|
125
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/evidence-lightbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { EvidenceLightbox } from './evidence-lightbox.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,uBAAuB,CAAC;AAmNnF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAgB,EAChB,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,EACnB,SAAS,EACT,iBAAiB,GAClB,EAAE,gBAAgB,2CA+JlB"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState } from 'react';
|
|
3
|
+
import { useState, useMemo } from 'react';
|
|
4
4
|
import { ExternalLink, AlertTriangle, FileDiff, GitCommitHorizontal, GitBranch, ArrowRight, Camera, FileText, MonitorPlay, Terminal, Download, ChevronDown, ChevronRight, } from 'lucide-react';
|
|
5
5
|
import { Badge } from '../../ui/badge.js';
|
|
6
6
|
import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
|
|
7
7
|
import { DrawerActionBar } from '../../common/drawer-action-bar/index.js';
|
|
8
|
+
import { EvidenceLightbox } from '../../common/evidence-lightbox/index.js';
|
|
8
9
|
import { DiffView } from './diff-view.js';
|
|
9
10
|
const EVIDENCE_ICONS = {
|
|
10
11
|
Screenshot: Camera,
|
|
@@ -54,8 +55,33 @@ function EvidenceTextPreview({ url }) {
|
|
|
54
55
|
}
|
|
55
56
|
return (_jsx("pre", { className: "bg-muted/50 max-h-60 overflow-auto rounded-md p-3 font-mono text-[11px] leading-relaxed", children: content }));
|
|
56
57
|
}
|
|
58
|
+
function isImageEvidence(evidence) {
|
|
59
|
+
return (evidence.type === 'Screenshot' || IMAGE_EXTENSIONS.has(getExtension(evidence.relativePath)));
|
|
60
|
+
}
|
|
57
61
|
function EvidenceList({ evidence }) {
|
|
58
|
-
|
|
62
|
+
const [lightboxOpen, setLightboxOpen] = useState(false);
|
|
63
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
64
|
+
const { imageEvidence, nonImageEvidence } = useMemo(() => {
|
|
65
|
+
const imgs = [];
|
|
66
|
+
const nonImgs = [];
|
|
67
|
+
for (const e of evidence) {
|
|
68
|
+
if (isImageEvidence(e)) {
|
|
69
|
+
imgs.push(e);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
nonImgs.push(e);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { imageEvidence: imgs, nonImageEvidence: nonImgs };
|
|
76
|
+
}, [evidence]);
|
|
77
|
+
function handleThumbnailClick(index) {
|
|
78
|
+
setSelectedIndex(index);
|
|
79
|
+
setLightboxOpen(true);
|
|
80
|
+
}
|
|
81
|
+
return (_jsxs("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(Camera, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Evidence" }), _jsx(Badge, { variant: "secondary", className: "text-[10px]", children: evidence.length })] }), imageEvidence.length > 0 ? (
|
|
82
|
+
/* eslint-disable @next/next/no-img-element -- Local evidence files require raw <img>, not next/image */
|
|
83
|
+
_jsx("div", { className: "mb-3 grid grid-cols-3 gap-2", children: imageEvidence.map((e, i) => (_jsx("button", { type: "button", className: "cursor-pointer overflow-hidden rounded-md border", onClick: () => handleThumbnailClick(i), children: _jsx("img", { src: buildEvidenceUrl(e.relativePath), alt: e.description, className: "aspect-square w-full object-cover", loading: "lazy" }) }, `thumb-${e.relativePath}`))) })) : /* eslint-enable @next/next/no-img-element */
|
|
84
|
+
null, nonImageEvidence.length > 0 ? (_jsx("ul", { className: "space-y-2", children: nonImageEvidence.map((e) => (_jsx(EvidenceItem, { evidence: e }, `${e.type}-${e.relativePath}`))) })) : null] }), _jsx(EvidenceLightbox, { images: imageEvidence, open: lightboxOpen, onOpenChange: setLightboxOpen, selectedIndex: selectedIndex, onSelectedIndexChange: setSelectedIndex })] }));
|
|
59
85
|
}
|
|
60
86
|
export function MergeReview({ data, readOnly = false, onApprove, onReject, isProcessing = false, isRejecting = false, chatInput, onChatInputChange, }) {
|
|
61
87
|
const { pr, diffSummary, fileDiffs, branch, warning, evidence, hideCiStatus } = data;
|