dsh-git-worktree 0.1.2 → 0.3.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/CHANGELOG.md +93 -0
- package/LICENSE +21 -21
- package/README.md +187 -43
- package/README.zh.md +187 -41
- package/cordis.patch.yml +7 -7
- package/lib/adapters/lookup.d.ts +4 -2
- package/lib/adapters/lookup.js +31 -3
- package/lib/adapters/lookup.js.map +1 -1
- package/lib/adapters/registry.js +41 -0
- package/lib/adapters/registry.js.map +1 -1
- package/lib/adapters/safe-file.js +34 -4
- package/lib/adapters/safe-file.js.map +1 -1
- package/lib/client/WorktreeCreateRow.d.ts +7 -0
- package/lib/client/WorktreeCreateRow.js +26 -0
- package/lib/client/WorktreeCreateRow.js.map +1 -0
- package/lib/client/WorktreeReviewRow.d.ts +11 -0
- package/lib/client/WorktreeReviewRow.js +67 -0
- package/lib/client/WorktreeReviewRow.js.map +1 -0
- package/lib/client/actions.d.ts +86 -0
- package/lib/client/actions.js +35 -0
- package/lib/client/actions.js.map +1 -0
- package/lib/client/console-remote/adapter.d.ts +3 -0
- package/lib/client/console-remote/adapter.js +61 -0
- package/lib/client/console-remote/adapter.js.map +1 -0
- package/lib/client/console-remote/index.d.ts +18 -0
- package/lib/client/console-remote/index.js +17 -0
- package/lib/client/console-remote/index.js.map +1 -0
- package/lib/client/index.d.ts +17 -0
- package/lib/client/index.js +44 -0
- package/lib/client/index.js.map +1 -0
- package/lib/client/model.d.ts +68 -0
- package/lib/client/model.js +127 -0
- package/lib/client/model.js.map +1 -0
- package/lib/client/pre-session/PreSessionWorktreeToggle.d.ts +16 -0
- package/lib/client/pre-session/PreSessionWorktreeToggle.js +128 -0
- package/lib/client/pre-session/PreSessionWorktreeToggle.js.map +1 -0
- package/lib/client/pre-session/controller.d.ts +42 -0
- package/lib/client/pre-session/controller.js +149 -0
- package/lib/client/pre-session/controller.js.map +1 -0
- package/lib/client/pre-session/index.d.ts +15 -0
- package/lib/client/pre-session/index.js +16 -0
- package/lib/client/pre-session/index.js.map +1 -0
- package/lib/client/review-console/ReviewActions.d.ts +15 -0
- package/lib/client/review-console/ReviewActions.js +234 -0
- package/lib/client/review-console/ReviewActions.js.map +1 -0
- package/lib/client/review-console/WorktreeReviewPanel.d.ts +20 -0
- package/lib/client/review-console/WorktreeReviewPanel.js +75 -0
- package/lib/client/review-console/WorktreeReviewPanel.js.map +1 -0
- package/lib/client/review-console/index.d.ts +8 -0
- package/lib/client/review-console/index.js +22 -0
- package/lib/client/review-console/index.js.map +1 -0
- package/lib/client/review-console/review-console.styles.d.ts +1 -0
- package/lib/client/review-console/review-console.styles.js +81 -0
- package/lib/client/review-console/review-console.styles.js.map +1 -0
- package/lib/client/review-console/status-events.d.ts +3 -0
- package/lib/client/review-console/status-events.js +6 -0
- package/lib/client/review-console/status-events.js.map +1 -0
- package/lib/client/styles.d.ts +1 -0
- package/lib/client/styles.js +78 -0
- package/lib/client/styles.js.map +1 -0
- package/lib/client/target-console/TargetStatusAction.d.ts +7 -0
- package/lib/client/target-console/TargetStatusAction.js +46 -0
- package/lib/client/target-console/TargetStatusAction.js.map +1 -0
- package/lib/client/target-console/WorktreeConsoleView.d.ts +9 -0
- package/lib/client/target-console/WorktreeConsoleView.js +362 -0
- package/lib/client/target-console/WorktreeConsoleView.js.map +1 -0
- package/lib/client/target-console/WorktreeReviewStatus.d.ts +9 -0
- package/lib/client/target-console/WorktreeReviewStatus.js +125 -0
- package/lib/client/target-console/WorktreeReviewStatus.js.map +1 -0
- package/lib/client/target-console/index.d.ts +14 -0
- package/lib/client/target-console/index.js +23 -0
- package/lib/client/target-console/index.js.map +1 -0
- package/lib/client/target-console/target-console.styles.d.ts +1 -0
- package/lib/client/target-console/target-console.styles.js +130 -0
- package/lib/client/target-console/target-console.styles.js.map +1 -0
- package/lib/client.js +6902 -0
- package/lib/commands.d.ts +2 -4
- package/lib/commands.js +69 -28
- package/lib/commands.js.map +1 -1
- package/lib/console-contract.d.ts +253 -0
- package/lib/console-contract.js +86 -0
- package/lib/console-contract.js.map +1 -0
- package/lib/console-host/control-plane.d.ts +31 -0
- package/lib/console-host/control-plane.js +502 -0
- package/lib/console-host/control-plane.js.map +1 -0
- package/lib/console-host/errors.d.ts +6 -0
- package/lib/console-host/errors.js +31 -0
- package/lib/console-host/errors.js.map +1 -0
- package/lib/console-host/projection.d.ts +12 -0
- package/lib/console-host/projection.js +136 -0
- package/lib/console-host/projection.js.map +1 -0
- package/lib/console-host/review-diff.d.ts +18 -0
- package/lib/console-host/review-diff.js +176 -0
- package/lib/console-host/review-diff.js.map +1 -0
- package/lib/console-host/service.d.ts +26 -0
- package/lib/console-host/service.js +143 -0
- package/lib/console-host/service.js.map +1 -0
- package/lib/console-remote/descriptors.d.ts +3 -0
- package/lib/console-remote/descriptors.js +105 -0
- package/lib/console-remote/descriptors.js.map +1 -0
- package/lib/console-remote/remote.d.ts +29 -0
- package/lib/console-remote/remote.js +4 -0
- package/lib/console-remote/remote.js.map +1 -0
- package/lib/console-remote/schemas.d.ts +29 -0
- package/lib/console-remote/schemas.js +145 -0
- package/lib/console-remote/schemas.js.map +1 -0
- package/lib/console-remote/typert.d.ts +3 -0
- package/lib/console-remote/typert.js +14 -0
- package/lib/console-remote/typert.js.map +1 -0
- package/lib/index.d.ts +26 -8
- package/lib/index.js +28 -10
- package/lib/index.js.map +1 -1
- package/lib/managed-worktree-path.d.ts +14 -13
- package/lib/managed-worktree-path.js +32 -22
- package/lib/managed-worktree-path.js.map +1 -1
- package/lib/ports.d.ts +39 -1
- package/lib/session-checkout-apply.d.ts +54 -1
- package/lib/session-checkout-apply.js +318 -28
- package/lib/session-checkout-apply.js.map +1 -1
- package/lib/session-checkout-module.js +1098 -36
- package/lib/session-checkout-module.js.map +1 -1
- package/lib/session-target-context.d.ts +6 -0
- package/lib/session-target-context.js +16 -0
- package/lib/session-target-context.js.map +1 -0
- package/lib/tools.d.ts +6 -6
- package/lib/tools.js +107 -218
- package/lib/tools.js.map +1 -1
- package/lib/types.d.ts +57 -11
- package/lib/types.js +6 -6
- package/lib/types.js.map +1 -1
- package/package.json +116 -69
- package/scripts/check-publish.mjs +193 -0
- package/scripts/clean-lib.mjs +7 -0
- package/scripts/dev-dsh-lib.mjs +509 -0
- package/scripts/dev-dsh.mjs +95 -0
- package/scripts/dsh-source-runner.mjs +14 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
export class PreSessionWorktreeError extends Error {
|
|
2
|
+
recoveryRequired;
|
|
3
|
+
constructor(message, recoveryRequired = false) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.recoveryRequired = recoveryRequired;
|
|
6
|
+
this.name = 'PreSessionWorktreeError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function messageOf(value) {
|
|
10
|
+
return value instanceof Error ? value.message : String(value);
|
|
11
|
+
}
|
|
12
|
+
function sameStrings(left, right) {
|
|
13
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
14
|
+
}
|
|
15
|
+
function sourceStillMatches(request) {
|
|
16
|
+
const current = request.currentInput?.() ?? request.input;
|
|
17
|
+
return current.phase === 'plain'
|
|
18
|
+
&& current.draft === request.input.draft
|
|
19
|
+
&& sameStrings(current.imageIds, request.input.imageIds)
|
|
20
|
+
&& current.occurrences.length === request.input.occurrences.length
|
|
21
|
+
&& (request.input.draftRev === undefined || current.draftRev === request.input.draftRev);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Prepares an isolated blank Session before the normal Harness composer sends.
|
|
25
|
+
* The controller never sends a prompt; after it opens the target, the resident
|
|
26
|
+
* composer remains the sole submission path.
|
|
27
|
+
*/
|
|
28
|
+
export class PreSessionWorktreeController {
|
|
29
|
+
adapter;
|
|
30
|
+
services;
|
|
31
|
+
inflight = new Map();
|
|
32
|
+
constructor(adapter, services) {
|
|
33
|
+
this.adapter = adapter;
|
|
34
|
+
this.services = services;
|
|
35
|
+
}
|
|
36
|
+
prepare(request) {
|
|
37
|
+
const existing = this.inflight.get(request.sessionId);
|
|
38
|
+
if (existing !== undefined)
|
|
39
|
+
return existing;
|
|
40
|
+
const attempt = this.run(request).finally(() => {
|
|
41
|
+
if (this.inflight.get(request.sessionId) === attempt)
|
|
42
|
+
this.inflight.delete(request.sessionId);
|
|
43
|
+
});
|
|
44
|
+
this.inflight.set(request.sessionId, attempt);
|
|
45
|
+
return attempt;
|
|
46
|
+
}
|
|
47
|
+
async run(request) {
|
|
48
|
+
if (request.input.phase !== 'plain') {
|
|
49
|
+
throw new PreSessionWorktreeError('当前草稿正在提交或解析,请等待输入恢复后再创建 Worktree。');
|
|
50
|
+
}
|
|
51
|
+
if (request.input.occurrences.length > 0) {
|
|
52
|
+
throw new PreSessionWorktreeError('草稿包含尚未序列化的引用,请先移除引用芯片或发送后再创建 Worktree。');
|
|
53
|
+
}
|
|
54
|
+
const previousBlock = this.services.conversation.blocks.storeFor(request.sessionId).getSnapshot();
|
|
55
|
+
this.services.conversation.blocks.set(request.sessionId, { reason: '正在创建隔离 Worktree…' });
|
|
56
|
+
let created;
|
|
57
|
+
let workspaceId;
|
|
58
|
+
let actualSessionId;
|
|
59
|
+
try {
|
|
60
|
+
const outcome = await this.adapter.create({ sourceSessionId: request.sessionId });
|
|
61
|
+
if (!outcome.ok)
|
|
62
|
+
throw new PreSessionWorktreeError(`${outcome.error.code}: ${outcome.error.message}`);
|
|
63
|
+
created = outcome.value;
|
|
64
|
+
const workspace = await this.services.workspaces.create({ path: created.managedRoot });
|
|
65
|
+
if (workspace.path !== created.managedRoot) {
|
|
66
|
+
throw new PreSessionWorktreeError(`Harness 将 managed root 注册到了不同路径:${workspace.path}`);
|
|
67
|
+
}
|
|
68
|
+
workspaceId = workspace.workspaceId;
|
|
69
|
+
actualSessionId = await this.services.sessions.create({
|
|
70
|
+
workspaceId: workspace.workspaceId,
|
|
71
|
+
sessionId: created.targetSessionId,
|
|
72
|
+
});
|
|
73
|
+
if (actualSessionId !== created.targetSessionId) {
|
|
74
|
+
throw new PreSessionWorktreeError(`Harness 创建了意外的 Session ${actualSessionId};预期 ${created.targetSessionId}。`);
|
|
75
|
+
}
|
|
76
|
+
const targetBinding = this.services.sessions.binding(created.targetSessionId);
|
|
77
|
+
if (targetBinding?.ctx === undefined) {
|
|
78
|
+
throw new PreSessionWorktreeError('目标 Session 已创建,但 Harness 尚未提供可迁移草稿的 Session binding。');
|
|
79
|
+
}
|
|
80
|
+
const targetInput = this.services.conversation.input.for(targetBinding.ctx);
|
|
81
|
+
if (!sourceStillMatches(request)) {
|
|
82
|
+
throw new PreSessionWorktreeError('确认后 Local 草稿或附件发生了变化,已取消迁移以避免覆盖新的输入。');
|
|
83
|
+
}
|
|
84
|
+
// From the final source CAS through target writes, navigation and source
|
|
85
|
+
// clear there is no await. This ordering matters for image IDs: a failed
|
|
86
|
+
// target archived after accepting them would release browser-owned bytes
|
|
87
|
+
// that the preserved source still references.
|
|
88
|
+
targetInput.setDraft(request.input.draft);
|
|
89
|
+
if (!targetInput.addImages(request.input.imageIds)) {
|
|
90
|
+
throw new PreSessionWorktreeError('目标 Session 暂时拒绝接收草稿附件。');
|
|
91
|
+
}
|
|
92
|
+
this.services.sessions.open(created.targetSessionId);
|
|
93
|
+
request.inputActions.setDraft('');
|
|
94
|
+
for (const imageId of request.input.imageIds)
|
|
95
|
+
request.inputActions.removeImage(imageId);
|
|
96
|
+
return created.target;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (created !== undefined) {
|
|
100
|
+
const cleaned = await this.rollback(request.sessionId, created.targetSessionId, created.target, workspaceId, actualSessionId);
|
|
101
|
+
if (!cleaned) {
|
|
102
|
+
throw new PreSessionWorktreeError(`${messageOf(error)} Worktree 已持久化但自动回滚失败,请从 Worktree Console 打开 owner Session 继续恢复。`, true);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
this.services.conversation.blocks.set(request.sessionId, previousBlock);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async rollback(sourceSessionId, targetSessionId, target, workspaceId, actualSessionId) {
|
|
112
|
+
if (target.checkoutId === null)
|
|
113
|
+
return false;
|
|
114
|
+
let discarded = false;
|
|
115
|
+
for (const caller of [targetSessionId, sourceSessionId]) {
|
|
116
|
+
const result = await this.adapter.discard({
|
|
117
|
+
sessionId: caller,
|
|
118
|
+
checkoutId: target.checkoutId,
|
|
119
|
+
expectedRevision: target.revision,
|
|
120
|
+
confirmDirty: false,
|
|
121
|
+
});
|
|
122
|
+
if (result.ok) {
|
|
123
|
+
discarded = true;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (!discarded)
|
|
128
|
+
return false;
|
|
129
|
+
const sessionToArchive = actualSessionId ?? targetSessionId;
|
|
130
|
+
// A dropped create response can publish the Host Session without leaving a
|
|
131
|
+
// Client binding. Always attempt the idempotent archive after Discard;
|
|
132
|
+
// binding absence is not proof that no Session exists.
|
|
133
|
+
try {
|
|
134
|
+
await this.services.workspaces.archiveSession(sessionToArchive);
|
|
135
|
+
}
|
|
136
|
+
catch { /* checkout is already discarded */ }
|
|
137
|
+
if (workspaceId !== undefined) {
|
|
138
|
+
try {
|
|
139
|
+
await this.services.workspaces.delete(workspaceId);
|
|
140
|
+
}
|
|
141
|
+
catch { /* stale Workspace stays user-visible, never hidden */ }
|
|
142
|
+
}
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export function createPreSessionWorktreeController(adapter, services) {
|
|
147
|
+
return new PreSessionWorktreeController(adapter, services);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/client/pre-session/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ComponentType } from 'react';
|
|
2
|
+
import type { WorktreeConsoleAdapter } from '../../console-contract.js';
|
|
3
|
+
import type { PreSessionWorktreeServices } from '../actions.js';
|
|
4
|
+
import { type PreSessionWorktreeToggleProps } from './PreSessionWorktreeToggle.js';
|
|
5
|
+
export type PreSessionSlotProps = Omit<PreSessionWorktreeToggleProps, 'adapter' | 'controller'>;
|
|
6
|
+
export interface PreSessionSlotContextLike {
|
|
7
|
+
slots: {
|
|
8
|
+
inject(name: 'conversation.input.left', callback: () => unknown): void;
|
|
9
|
+
register(descriptor: Record<string, unknown>, component: ComponentType<PreSessionSlotProps>): unknown;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Register the blank-session switch in Harness's public composer tool row. */
|
|
13
|
+
export declare function registerPreSessionWorktree(ctx: PreSessionSlotContextLike, adapter: WorktreeConsoleAdapter, services: PreSessionWorktreeServices): void;
|
|
14
|
+
export { PreSessionWorktreeController, PreSessionWorktreeError, createPreSessionWorktreeController } from './controller.js';
|
|
15
|
+
export { PreSessionWorktreeToggle } from './PreSessionWorktreeToggle.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createPreSessionWorktreeController } from './controller.js';
|
|
3
|
+
import { PreSessionWorktreeToggle, } from './PreSessionWorktreeToggle.js';
|
|
4
|
+
/** Register the blank-session switch in Harness's public composer tool row. */
|
|
5
|
+
export function registerPreSessionWorktree(ctx, adapter, services) {
|
|
6
|
+
const controller = createPreSessionWorktreeController(adapter, services);
|
|
7
|
+
const Entry = (props) => (_jsx(PreSessionWorktreeToggle, { ...props, adapter: adapter, controller: controller }));
|
|
8
|
+
ctx.slots.inject('conversation.input.left', () => ctx.slots.register({
|
|
9
|
+
name: 'conversation.input.left',
|
|
10
|
+
id: 'worktree-pre-session',
|
|
11
|
+
order: 40,
|
|
12
|
+
}, Entry));
|
|
13
|
+
}
|
|
14
|
+
export { PreSessionWorktreeController, PreSessionWorktreeError, createPreSessionWorktreeController } from './controller.js';
|
|
15
|
+
export { PreSessionWorktreeToggle } from './PreSessionWorktreeToggle.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/pre-session/index.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,EACL,wBAAwB,GAEzB,MAAM,+BAA+B,CAAA;AActC,+EAA+E;AAC/E,MAAM,UAAU,0BAA0B,CACxC,GAA8B,EAC9B,OAA+B,EAC/B,QAAoC;IAEpC,MAAM,UAAU,GAAG,kCAAkC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACxE,MAAM,KAAK,GAAG,CAAC,KAA0B,EAAE,EAAE,CAAC,CAC5C,KAAC,wBAAwB,OACnB,KAAK,EACT,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACtB,CACH,CAAA;IACD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAClE;QACE,IAAI,EAAE,yBAAyB;QAC/B,EAAE,EAAE,sBAAsB;QAC1B,KAAK,EAAE,EAAE;KACV,EACD,KAAK,CACN,CAAC,CAAA;AACJ,CAAC;AAED,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAA;AAC3H,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { WorktreeConsoleAdapter, WorktreeConsoleError, WorktreeConsoleTargetSummary } from '../../console-contract.js';
|
|
2
|
+
import type { WorktreeReviewEvidence, WorktreeReviewIdentity } from './WorktreeReviewPanel.js';
|
|
3
|
+
interface ReviewActionsProps {
|
|
4
|
+
review: WorktreeReviewEvidence;
|
|
5
|
+
adapter?: WorktreeConsoleAdapter | null;
|
|
6
|
+
identity?: WorktreeReviewIdentity;
|
|
7
|
+
target?: WorktreeConsoleTargetSummary;
|
|
8
|
+
disabled: boolean;
|
|
9
|
+
unavailableMessage: string;
|
|
10
|
+
focusReview?: () => void;
|
|
11
|
+
onStale: (error: WorktreeConsoleError) => void;
|
|
12
|
+
onTargetChange: (target: WorktreeConsoleTargetSummary) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function ReviewActions({ review, adapter, identity, target, disabled, unavailableMessage, focusReview, onStale, onTargetChange, }: ReviewActionsProps): import("react").JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useId, useRef, useState } from 'react';
|
|
3
|
+
import { Modal } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
4
|
+
import { worktreeConsoleErrorMeta } from '../../console-contract.js';
|
|
5
|
+
import { requestWorktreeReviewRefresh } from './status-events.js';
|
|
6
|
+
function isStale(error) {
|
|
7
|
+
return error.code === 'stale_target' || error.code === 'stale_isolated' || error.code === 'stale_local';
|
|
8
|
+
}
|
|
9
|
+
function preflightMessage(preflight) {
|
|
10
|
+
if (preflight.status === 'ready')
|
|
11
|
+
return '同步预检通过,正在创建可撤回的 Local Preview。';
|
|
12
|
+
if (preflight.status === 'local_advanced')
|
|
13
|
+
return 'Local 已前进,但预检确认可以安全合并。';
|
|
14
|
+
if (preflight.status === 'already_in_local')
|
|
15
|
+
return '本轮内容已在 Local 中;同步将是安全空操作。';
|
|
16
|
+
if (preflight.status === 'conflict')
|
|
17
|
+
return `同步预检发现 ${preflight.conflictingFiles.length} 个冲突文件;Local 未修改。`;
|
|
18
|
+
if (preflight.status === 'blocked')
|
|
19
|
+
return `同步暂时阻塞:${preflight.message}`;
|
|
20
|
+
return '同步预检完成;Local 未修改。';
|
|
21
|
+
}
|
|
22
|
+
export function ReviewActions({ review, adapter, identity, target, disabled, unavailableMessage, focusReview, onStale, onTargetChange, }) {
|
|
23
|
+
const formId = useId();
|
|
24
|
+
const [submitting, setSubmitting] = useState(null);
|
|
25
|
+
const [commitMode, setCommitMode] = useState(null);
|
|
26
|
+
const [discardOpen, setDiscardOpen] = useState(false);
|
|
27
|
+
const [commitMessage, setCommitMessage] = useState(review.suggestedCommitMessage);
|
|
28
|
+
const [retainEnvironment, setRetainEnvironment] = useState(false);
|
|
29
|
+
const [retention, setRetention] = useState('retain_24h');
|
|
30
|
+
const [message, setMessage] = useState(null);
|
|
31
|
+
const [error, setError] = useState(null);
|
|
32
|
+
const [preflight, setPreflight] = useState(null);
|
|
33
|
+
const mutationLock = useRef(false);
|
|
34
|
+
const observedTargetRevision = useRef(target?.revision);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
setCommitMessage(review.suggestedCommitMessage);
|
|
37
|
+
setRetainEnvironment(false);
|
|
38
|
+
setRetention('retain_24h');
|
|
39
|
+
setPreflight(null);
|
|
40
|
+
}, [review.reviewId, review.suggestedCommitMessage]);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
const revision = target?.revision;
|
|
43
|
+
if (revision === undefined || revision === observedTargetRevision.current)
|
|
44
|
+
return;
|
|
45
|
+
observedTargetRevision.current = revision;
|
|
46
|
+
if (submitting !== null)
|
|
47
|
+
return;
|
|
48
|
+
setMessage(null);
|
|
49
|
+
setError(null);
|
|
50
|
+
setPreflight(null);
|
|
51
|
+
}, [submitting, target?.revision]);
|
|
52
|
+
const begin = (mutation) => {
|
|
53
|
+
if (disabled || !adapter || !identity || !target || mutationLock.current)
|
|
54
|
+
return false;
|
|
55
|
+
mutationLock.current = true;
|
|
56
|
+
setSubmitting(mutation);
|
|
57
|
+
setMessage(null);
|
|
58
|
+
setError(null);
|
|
59
|
+
return true;
|
|
60
|
+
};
|
|
61
|
+
const finish = () => {
|
|
62
|
+
mutationLock.current = false;
|
|
63
|
+
setSubmitting(null);
|
|
64
|
+
};
|
|
65
|
+
const finishError = (nextError) => {
|
|
66
|
+
setError(nextError);
|
|
67
|
+
if (isStale(nextError))
|
|
68
|
+
onStale(nextError);
|
|
69
|
+
finish();
|
|
70
|
+
};
|
|
71
|
+
const applyTarget = (nextTarget) => {
|
|
72
|
+
observedTargetRevision.current = nextTarget.revision;
|
|
73
|
+
onTargetChange(nextTarget);
|
|
74
|
+
if (identity)
|
|
75
|
+
requestWorktreeReviewRefresh(identity.sessionId);
|
|
76
|
+
};
|
|
77
|
+
const previewLocal = async () => {
|
|
78
|
+
if (!begin('preview') || !adapter || !identity)
|
|
79
|
+
return;
|
|
80
|
+
const inspected = await adapter.preflight(identity);
|
|
81
|
+
if (!inspected.ok) {
|
|
82
|
+
finishError(inspected.error);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
setPreflight(inspected.value.preflight);
|
|
86
|
+
setMessage(preflightMessage(inspected.value.preflight));
|
|
87
|
+
if (inspected.value.preflight.status === 'conflict' || inspected.value.preflight.status === 'blocked') {
|
|
88
|
+
finish();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const outcome = await adapter.preview(identity);
|
|
92
|
+
if (!outcome.ok) {
|
|
93
|
+
finishError(outcome.error);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
applyTarget(outcome.value.target);
|
|
97
|
+
setMessage('已同步为可撤回的 Local Preview;请在 Local 中验收。');
|
|
98
|
+
finish();
|
|
99
|
+
};
|
|
100
|
+
const resumeRevision = async () => {
|
|
101
|
+
if (!begin('resume_revision') || !adapter || !identity)
|
|
102
|
+
return;
|
|
103
|
+
const outcome = await adapter.resumeRevision(identity);
|
|
104
|
+
if (!outcome.ok) {
|
|
105
|
+
finishError(outcome.error);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
applyTarget(outcome.value.target);
|
|
109
|
+
setMessage('已恢复编辑;继续发送修改要求即可。Local 未受影响。');
|
|
110
|
+
finish();
|
|
111
|
+
};
|
|
112
|
+
const rollbackPreview = async (resumeRevision = false) => {
|
|
113
|
+
if (!begin('rollback') || !adapter || !identity)
|
|
114
|
+
return;
|
|
115
|
+
const outcome = await adapter.rollbackPreview({ ...identity, resumeRevision });
|
|
116
|
+
if (!outcome.ok) {
|
|
117
|
+
finishError(outcome.error);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
applyTarget(outcome.value.target);
|
|
121
|
+
setMessage(outcome.value.target.state === 'preview_detached'
|
|
122
|
+
? outcome.value.target.previewRecovery?.reason === 'stale_local'
|
|
123
|
+
? 'Local branch/HEAD 已变化;同分支安全快进可重试撤回,其他历史变化不会被覆盖。'
|
|
124
|
+
: 'Preview 与 Local 存在冲突;恢复证据和 Worktree 已保留。'
|
|
125
|
+
: resumeRevision ? '已撤回 Local Preview,可以继续修改 Worktree。' : '已撤回 Local Preview,验收卡仍可再次同步。');
|
|
126
|
+
finish();
|
|
127
|
+
};
|
|
128
|
+
const submitCommit = async () => {
|
|
129
|
+
const value = commitMessage.trim();
|
|
130
|
+
const mode = commitMode;
|
|
131
|
+
if (!mode || !value || value.length > 500 || !begin(mode) || !adapter || !identity)
|
|
132
|
+
return;
|
|
133
|
+
const selectedRetention = retainEnvironment ? retention : 'cleanup';
|
|
134
|
+
const request = { ...identity, commitMessage: value, retention: selectedRetention };
|
|
135
|
+
const outcome = mode === 'finalize_preview'
|
|
136
|
+
? await adapter.finalizePreview(request)
|
|
137
|
+
: await adapter.finalize(request);
|
|
138
|
+
if (!outcome.ok) {
|
|
139
|
+
finishError(outcome.error);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
applyTarget(outcome.value.target);
|
|
143
|
+
if (outcome.value.target.state === 'preview_detached') {
|
|
144
|
+
setMessage('Local 已变化,无法可靠提交;Preview 恢复证据和 Worktree 已保留。');
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
setMessage(selectedRetention === 'cleanup' ? '已提交到 Local,并开始清理 Worktree。' : '已提交到 Local,并保留当前运行环境。');
|
|
148
|
+
}
|
|
149
|
+
setCommitMode(null);
|
|
150
|
+
finish();
|
|
151
|
+
};
|
|
152
|
+
const discard = async () => {
|
|
153
|
+
if (!begin('discard') || !adapter || !identity || !target)
|
|
154
|
+
return;
|
|
155
|
+
const outcome = await adapter.discard({
|
|
156
|
+
sessionId: identity.sessionId,
|
|
157
|
+
checkoutId: identity.checkoutId,
|
|
158
|
+
expectedRevision: identity.expectedRevision,
|
|
159
|
+
confirmDirty: true,
|
|
160
|
+
...(target.state === 'preview_active' || target.capabilities.rollbackPreview ? { rollbackPreview: true } : {}),
|
|
161
|
+
});
|
|
162
|
+
if (!outcome.ok) {
|
|
163
|
+
finishError(outcome.error);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
applyTarget(outcome.value.target);
|
|
167
|
+
setMessage(outcome.value.target.state === 'preview_detached'
|
|
168
|
+
? 'Local 已变化,无法无损撤回;未删除 Worktree。'
|
|
169
|
+
: '已放弃本轮 Worktree 修改,Local 未受影响。');
|
|
170
|
+
setDiscardOpen(false);
|
|
171
|
+
finish();
|
|
172
|
+
};
|
|
173
|
+
const retryCleanup = async () => {
|
|
174
|
+
if (!begin('retry_cleanup') || !adapter || !identity)
|
|
175
|
+
return;
|
|
176
|
+
const outcome = await adapter.retryCleanup({
|
|
177
|
+
sessionId: identity.sessionId,
|
|
178
|
+
checkoutId: identity.checkoutId,
|
|
179
|
+
expectedRevision: identity.expectedRevision,
|
|
180
|
+
});
|
|
181
|
+
if (!outcome.ok) {
|
|
182
|
+
finishError(outcome.error);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
applyTarget(outcome.value.target);
|
|
186
|
+
setMessage(outcome.value.target.state === 'delivered' ? 'Worktree 环境已清理。' : '清理仍未完成,已保留恢复信息。');
|
|
187
|
+
finish();
|
|
188
|
+
};
|
|
189
|
+
const live = Boolean(adapter && identity && target);
|
|
190
|
+
const allDisabled = disabled || submitting !== null || !live;
|
|
191
|
+
const ready = target?.state === 'ready_for_review';
|
|
192
|
+
const previewActive = target?.state === 'preview_active';
|
|
193
|
+
const previewRecovery = target?.state === 'preview_detached'
|
|
194
|
+
|| target?.state === 'recovery_required' && target.capabilities.rollbackPreview;
|
|
195
|
+
const safeFastForwardRecovery = target?.state === 'preview_detached'
|
|
196
|
+
&& target.previewRecovery?.reason === 'stale_local';
|
|
197
|
+
const cleanupPending = target?.state === 'cleanup_pending';
|
|
198
|
+
const terminal = target?.state === 'retained' || target?.state === 'delivered';
|
|
199
|
+
const canDiscard = Boolean(target?.capabilities.discard);
|
|
200
|
+
const closeCommit = () => {
|
|
201
|
+
if (submitting === null)
|
|
202
|
+
setCommitMode(null);
|
|
203
|
+
};
|
|
204
|
+
const closeDiscard = () => {
|
|
205
|
+
if (submitting === null)
|
|
206
|
+
setDiscardOpen(false);
|
|
207
|
+
};
|
|
208
|
+
const primary = ready ? (_jsx("button", { type: "button", className: "dsh-wt-button dsh-wt-primary", disabled: allDisabled || !target.capabilities.preview, onClick: () => { void previewLocal(); }, children: submitting === 'preview' ? '同步中…' : '同步到 Local 验收' })) : previewActive ? (_jsx("button", { type: "button", className: "dsh-wt-button dsh-wt-primary", disabled: allDisabled || !target.capabilities.finalizePreview, onClick: () => setCommitMode('finalize_preview'), children: "\u9A8C\u6536\u901A\u8FC7\u5E76\u63D0\u4EA4" })) : previewRecovery ? (_jsx("button", { type: "button", className: "dsh-wt-button", disabled: allDisabled || !target?.capabilities.rollbackPreview, onClick: () => { void rollbackPreview(true); }, children: submitting === 'rollback' ? '处理中…' : safeFastForwardRecovery ? '安全重试撤回' : target?.state === 'preview_detached' ? '重新检查撤回' : '重新尝试撤回' })) : cleanupPending ? (_jsx("button", { type: "button", className: "dsh-wt-button", disabled: allDisabled || !target?.capabilities.retryCleanup, onClick: () => { void retryCleanup(); }, children: submitting === 'retry_cleanup' ? '清理中…' : '重试清理环境' })) : null;
|
|
209
|
+
return (_jsxs("section", { className: "dsh-wt-review-actions", "aria-label": "\u9A8C\u6536\u64CD\u4F5C", children: [!live ? _jsx("p", { className: "dsh-wt-status", children: unavailableMessage }) : null, terminal ? (_jsx("p", { className: "dsh-wt-status", children: target.state === 'retained'
|
|
210
|
+
? `本轮已提交,运行环境暂时保留${target.commitOid ? ` · ${target.commitOid.slice(0, 8)}` : ''}`
|
|
211
|
+
: `本轮已交付${target.commitOid ? ` · ${target.commitOid.slice(0, 8)}` : ''}` })) : (_jsxs("div", { className: "dsh-wt-actions", children: [primary, _jsxs("details", { className: "dsh-wt-more-menu", children: [_jsx("summary", { className: "dsh-wt-more-trigger", "aria-label": "\u66F4\u591A\u4EA4\u4ED8\u64CD\u4F5C", children: "\u2022\u2022\u2022" }), _jsxs("div", { className: "dsh-wt-more-content", role: "menu", children: [focusReview ? (_jsx("button", { type: "button", role: "menuitem", className: "dsh-wt-more-item", onClick: (event) => {
|
|
212
|
+
focusReview();
|
|
213
|
+
event.currentTarget.closest('details')?.removeAttribute('open');
|
|
214
|
+
}, children: "\u67E5\u770B\u9A8C\u6536\u5361" })) : null, ready ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", role: "menuitem", className: "dsh-wt-more-item", disabled: allDisabled || !target.capabilities.resumeRevision, onClick: (event) => {
|
|
215
|
+
void resumeRevision();
|
|
216
|
+
event.currentTarget.closest('details')?.removeAttribute('open');
|
|
217
|
+
}, children: submitting === 'resume_revision' ? '恢复中…' : '继续修改' }), _jsx("button", { type: "button", role: "menuitem", className: "dsh-wt-more-item", disabled: allDisabled || !target.capabilities.finalize, onClick: (event) => {
|
|
218
|
+
setCommitMode('finish');
|
|
219
|
+
event.currentTarget.closest('details')?.removeAttribute('open');
|
|
220
|
+
}, children: "\u8DF3\u8FC7\u9A8C\u6536\uFF0C\u76F4\u63A5\u63D0\u4EA4" })] })) : null, previewActive || previewRecovery ? (_jsx("button", { type: "button", role: "menuitem", className: "dsh-wt-more-item", disabled: allDisabled || !target.capabilities.rollbackPreview, onClick: (event) => {
|
|
221
|
+
void rollbackPreview(true);
|
|
222
|
+
event.currentTarget.closest('details')?.removeAttribute('open');
|
|
223
|
+
}, children: "\u64A4\u56DE\u672C\u6B21\u9884\u89C8" })) : null, canDiscard ? (_jsx("button", { type: "button", role: "menuitem", className: "dsh-wt-more-item dsh-wt-danger-text", disabled: allDisabled, onClick: (event) => {
|
|
224
|
+
setDiscardOpen(true);
|
|
225
|
+
event.currentTarget.closest('details')?.removeAttribute('open');
|
|
226
|
+
}, children: "\u653E\u5F03\u4EFB\u52A1" })) : null] })] })] })), _jsx(Modal, { open: commitMode !== null, onClose: closeCommit, title: commitMode === 'finalize_preview' ? '验收通过并提交?' : '跳过 Local 验收,直接提交?', closeLabel: "\u5173\u95ED\u63D0\u4EA4\u786E\u8BA4", description: commitMode === 'finalize_preview'
|
|
227
|
+
? '只会提交当前可撤回 Preview 对应的任务增量;Local 中无关修改不会进入该 Commit。'
|
|
228
|
+
: '将跳过 Local Preview 验收并直接提交本轮 Worktree 增量。', footer: (_jsxs("div", { className: "dsh-wt-modal-footer", children: [_jsx("button", { type: "button", className: "dsh-wt-button", disabled: submitting !== null, onClick: closeCommit, children: "\u53D6\u6D88" }), _jsx("button", { type: "button", className: "dsh-wt-button dsh-wt-primary", disabled: submitting !== null || !commitMessage.trim() || commitMessage.trim().length > 500, onClick: () => { void submitCommit(); }, children: submitting === 'finish' || submitting === 'finalize_preview'
|
|
229
|
+
? '正在提交…'
|
|
230
|
+
: retainEnvironment ? '确认提交并保留环境' : '确认提交并清理' })] })), children: _jsxs("div", { className: "dsh-wt-commit-dialog", children: [_jsx("label", { htmlFor: `${formId}-message`, children: "Commit Message" }), _jsx("textarea", { id: `${formId}-message`, "aria-label": "Commit Message", rows: 6, maxLength: 500, value: commitMessage, onChange: event => setCommitMessage(event.target.value) }), _jsxs("div", { className: "dsh-wt-character-count", children: [commitMessage.length, "/500"] }), _jsxs("label", { className: "dsh-wt-retention-check", children: [_jsx("input", { type: "checkbox", checked: retainEnvironment, onChange: event => setRetainEnvironment(event.target.checked) }), _jsx("span", { children: "\u63D0\u4EA4\u540E\u6682\u65F6\u4FDD\u7559\u5F53\u524D\u8FD0\u884C\u73AF\u5883" })] }), retainEnvironment ? (_jsxs("label", { className: "dsh-wt-retention-select", children: [_jsx("span", { children: "\u4FDD\u7559\u65F6\u957F" }), _jsxs("select", { "aria-label": "\u4FDD\u7559\u65F6\u957F", value: retention, onChange: event => setRetention(event.target.value), children: [_jsx("option", { value: "retain_24h", children: "\u4FDD\u7559 24 \u5C0F\u65F6" }), _jsx("option", { value: "retain_3d", children: "\u4FDD\u7559 3 \u5929" }), _jsx("option", { value: "retain_manual", children: "\u624B\u52A8\u6E05\u7406" })] })] })) : null] }) }), _jsx(Modal, { open: discardOpen, onClose: closeDiscard, title: "\u653E\u5F03\u672C\u8F6E\u4EFB\u52A1\uFF1F", closeLabel: "\u5173\u95ED\u653E\u5F03\u786E\u8BA4", description: previewActive
|
|
231
|
+
? '会先安全撤回本次 Local Preview,再清理 Worktree;无法无损撤回时会停止,不会覆盖 Local 修改。'
|
|
232
|
+
: 'Worktree 中尚未交付的修改将被永久丢弃,Local 不受影响。', footer: (_jsxs("div", { className: "dsh-wt-modal-footer", children: [_jsx("button", { type: "button", className: "dsh-wt-button", disabled: submitting !== null, onClick: closeDiscard, children: "\u53D6\u6D88" }), _jsx("button", { type: "button", className: "dsh-wt-button dsh-wt-danger", disabled: submitting !== null, onClick: () => { void discard(); }, children: submitting === 'discard' ? '正在放弃…' : '确认放弃任务' })] })) }), preflight ? _jsx("div", { className: "dsh-wt-preflight", "data-preflight": preflight.status, children: preflightMessage(preflight) }) : null, _jsx("div", { className: "dsh-wt-action-status", "aria-live": "polite", children: submitting ? '正在处理 Worktree,请稍候…' : message }), error && !isStale(error) ? (_jsxs("div", { className: "dsh-wt-error", role: "alert", children: [error.message, "\uFF08", worktreeConsoleErrorMeta(error.code).category, "\uFF1B\u6062\u590D\u65B9\u5F0F\uFF1A", worktreeConsoleErrorMeta(error.code).recovery, "\uFF09"] })) : null] }));
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=ReviewActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewActions.js","sourceRoot":"","sources":["../../../src/client/review-console/ReviewActions.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { WorktreeConsoleAdapter, WorktreeConsoleReviewSummary, WorktreeConsoleTargetSummary } from '../../console-contract.js';
|
|
2
|
+
export interface WorktreeReviewEvidence extends WorktreeConsoleReviewSummary {
|
|
3
|
+
detailsMarkdown?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface WorktreeReviewIdentity {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
checkoutId: string;
|
|
8
|
+
expectedRevision: number;
|
|
9
|
+
expectedReviewId: string;
|
|
10
|
+
}
|
|
11
|
+
export interface WorktreeReviewPanelProps {
|
|
12
|
+
review: WorktreeReviewEvidence;
|
|
13
|
+
identity?: WorktreeReviewIdentity;
|
|
14
|
+
adapter?: WorktreeConsoleAdapter | null;
|
|
15
|
+
target?: WorktreeConsoleTargetSummary;
|
|
16
|
+
onRefresh?: () => void | Promise<void>;
|
|
17
|
+
onTargetChange?: (target: WorktreeConsoleTargetSummary) => void;
|
|
18
|
+
unavailableMessage?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function WorktreeReviewPanel({ review, adapter, identity, target, onRefresh, onTargetChange, unavailableMessage, }: WorktreeReviewPanelProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useId, useLayoutEffect, useRef, useState } from 'react';
|
|
3
|
+
import { ReviewActions } from './ReviewActions.js';
|
|
4
|
+
function validationLabel(status) {
|
|
5
|
+
if (status === 'passed')
|
|
6
|
+
return '自动验证通过';
|
|
7
|
+
if (status === 'failed')
|
|
8
|
+
return '自动验证失败,仍可继续验收';
|
|
9
|
+
if (status === 'partial')
|
|
10
|
+
return '部分验证通过';
|
|
11
|
+
return '未运行自动验证';
|
|
12
|
+
}
|
|
13
|
+
function testStatusLabel(status) {
|
|
14
|
+
if (status === 'passed')
|
|
15
|
+
return '通过';
|
|
16
|
+
if (status === 'failed')
|
|
17
|
+
return '失败';
|
|
18
|
+
return '未运行';
|
|
19
|
+
}
|
|
20
|
+
function reviewIsStale(target, identity, review) {
|
|
21
|
+
if (!target)
|
|
22
|
+
return false;
|
|
23
|
+
if (target.state === 'working')
|
|
24
|
+
return true;
|
|
25
|
+
if (!['ready_for_review', 'preview_active', 'preview_detached', 'cleanup_pending', 'recovery_required', 'retained'].includes(target.state))
|
|
26
|
+
return false;
|
|
27
|
+
const expectedRevision = identity?.expectedRevision ?? review.revision;
|
|
28
|
+
return !target.review
|
|
29
|
+
|| target.revision !== expectedRevision
|
|
30
|
+
|| target.review.reviewId !== review.reviewId;
|
|
31
|
+
}
|
|
32
|
+
export function WorktreeReviewPanel({ review, adapter, identity, target, onRefresh, onTargetChange, unavailableMessage = '实时 Worktree Console 未连接;连接后即可执行验收操作。', }) {
|
|
33
|
+
const panelId = useId();
|
|
34
|
+
const targetKey = target ? [
|
|
35
|
+
target.checkoutId,
|
|
36
|
+
target.revision,
|
|
37
|
+
target.state,
|
|
38
|
+
target.review?.reviewId,
|
|
39
|
+
target.commitOid,
|
|
40
|
+
target.retention,
|
|
41
|
+
target.cleanupMessage,
|
|
42
|
+
target.capabilities.finalize,
|
|
43
|
+
target.capabilities.discard,
|
|
44
|
+
].join('\u0000') : '';
|
|
45
|
+
const [currentTarget, setCurrentTarget] = useState(target);
|
|
46
|
+
const [detailsExpanded, setDetailsExpanded] = useState(false);
|
|
47
|
+
const [invalidReason, setInvalidReason] = useState(reviewIsStale(target, identity, review) ? '验收结果已过期,请刷新。' : null);
|
|
48
|
+
const refreshRequested = useRef(false);
|
|
49
|
+
useLayoutEffect(() => {
|
|
50
|
+
setCurrentTarget(target);
|
|
51
|
+
refreshRequested.current = false;
|
|
52
|
+
setInvalidReason(reviewIsStale(target, identity, review) ? '验收结果已过期,请刷新。' : null);
|
|
53
|
+
}, [identity?.expectedReviewId, identity?.expectedRevision, review.reviewId, review.revision, targetKey]);
|
|
54
|
+
const handleStale = useCallback((_error) => {
|
|
55
|
+
setInvalidReason('验收结果已过期,请刷新。');
|
|
56
|
+
if (!refreshRequested.current) {
|
|
57
|
+
refreshRequested.current = true;
|
|
58
|
+
void onRefresh?.();
|
|
59
|
+
}
|
|
60
|
+
}, [onRefresh]);
|
|
61
|
+
const handleTargetChange = useCallback((nextTarget) => {
|
|
62
|
+
setCurrentTarget(nextTarget);
|
|
63
|
+
onTargetChange?.(nextTarget);
|
|
64
|
+
}, [onTargetChange]);
|
|
65
|
+
const liveReady = Boolean(adapter
|
|
66
|
+
&& identity
|
|
67
|
+
&& currentTarget
|
|
68
|
+
&& ['ready_for_review', 'preview_active', 'preview_detached', 'cleanup_pending', 'recovery_required', 'retained'].includes(currentTarget.state)
|
|
69
|
+
&& !invalidReason);
|
|
70
|
+
const hasValidationDetails = Boolean(review.validationSummary || review.tests.length > 0);
|
|
71
|
+
return (_jsxs("section", { className: "dsh-wt-review-panel", "aria-label": "Worktree \u9A8C\u6536", "data-worktree-review-id": review.reviewId, children: [_jsxs("header", { className: "dsh-wt-review-compact-head", children: [_jsx("span", { className: "dsh-wt-review-status-icon", "data-validation": review.validationStatus, "aria-hidden": true, children: "\u2713" }), _jsxs("div", { className: "dsh-wt-review-compact-copy", children: [_jsxs("h2", { className: "dsh-wt-review-title", children: ["\u7B2C ", review.iteration, " \u8F6E\u4FEE\u6539\u5DF2\u51C6\u5907\u9A8C\u6536"] }), _jsx("p", { className: "dsh-wt-review-summary", children: review.summary })] }), _jsxs("span", { className: "dsh-wt-review-identity dsh-wt-code", title: `Review ${review.reviewId} · r${review.revision}`, children: [review.reviewId.slice(0, 8), " \u00B7 r", review.revision] })] }), _jsxs("div", { className: "dsh-wt-review-meta", children: [_jsx("span", { "data-validation": review.validationStatus, children: validationLabel(review.validationStatus) }), _jsxs("span", { children: [review.changedFiles.length, " \u4E2A\u6587\u4EF6"] }), hasValidationDetails ? (_jsx("button", { type: "button", className: "dsh-wt-review-details-toggle", "aria-expanded": detailsExpanded, "aria-controls": `${panelId}-validation`, onClick: () => setDetailsExpanded(value => !value), children: detailsExpanded
|
|
72
|
+
? '收起验证详情'
|
|
73
|
+
: `查看验证详情${review.tests.length > 0 ? `(${review.tests.length} 项测试)` : ''}` })) : null] }), detailsExpanded ? (_jsxs("div", { id: `${panelId}-validation`, className: "dsh-wt-review-validation-details", children: [review.validationSummary ? _jsx("p", { children: review.validationSummary }) : null, review.tests.length > 0 ? (_jsx("ul", { className: "dsh-wt-test-list", "aria-label": "\u9A8C\u8BC1\u547D\u4EE4", children: review.tests.map((item, index) => (_jsxs("li", { className: "dsh-wt-test", children: [_jsx("span", { className: "dsh-wt-test-state", "data-test-status": item.status, children: testStatusLabel(item.status) }), _jsxs("span", { className: "dsh-wt-test-command", children: [_jsx("code", { className: "dsh-wt-code", children: item.command }), item.summary ? _jsx("span", { className: "dsh-wt-test-summary", children: item.summary }) : null] })] }, `${item.command}-${index}`))) })) : null] })) : null, invalidReason ? _jsx("div", { className: "dsh-wt-error", role: "alert", children: invalidReason }) : null, _jsx(ReviewActions, { review: review, adapter: adapter, identity: identity, target: currentTarget, disabled: !liveReady, unavailableMessage: unavailableMessage, onStale: handleStale, onTargetChange: handleTargetChange })] }));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=WorktreeReviewPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeReviewPanel.js","sourceRoot":"","sources":["../../../src/client/review-console/WorktreeReviewPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { WorktreeConsoleTargetSummary } from '../../console-contract.js';
|
|
2
|
+
import type { WorktreeReviewEvidence, WorktreeReviewIdentity } from './WorktreeReviewPanel.js';
|
|
3
|
+
export { WorktreeReviewPanel } from './WorktreeReviewPanel.js';
|
|
4
|
+
export type { WorktreeReviewEvidence, WorktreeReviewIdentity, WorktreeReviewPanelProps, } from './WorktreeReviewPanel.js';
|
|
5
|
+
/** Project one persisted review into the shared compact card/dock evidence shape. */
|
|
6
|
+
export declare function reviewEvidenceFromTarget(target: WorktreeConsoleTargetSummary, detailsMarkdown?: string): WorktreeReviewEvidence | null;
|
|
7
|
+
/** Build the exact CAS identity required by Finalize and advanced review reads. */
|
|
8
|
+
export declare function reviewIdentityFromTarget(sessionId: string, target: WorktreeConsoleTargetSummary): WorktreeReviewIdentity | null;
|