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.
Files changed (136) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/LICENSE +21 -21
  3. package/README.md +187 -43
  4. package/README.zh.md +187 -41
  5. package/cordis.patch.yml +7 -7
  6. package/lib/adapters/lookup.d.ts +4 -2
  7. package/lib/adapters/lookup.js +31 -3
  8. package/lib/adapters/lookup.js.map +1 -1
  9. package/lib/adapters/registry.js +41 -0
  10. package/lib/adapters/registry.js.map +1 -1
  11. package/lib/adapters/safe-file.js +34 -4
  12. package/lib/adapters/safe-file.js.map +1 -1
  13. package/lib/client/WorktreeCreateRow.d.ts +7 -0
  14. package/lib/client/WorktreeCreateRow.js +26 -0
  15. package/lib/client/WorktreeCreateRow.js.map +1 -0
  16. package/lib/client/WorktreeReviewRow.d.ts +11 -0
  17. package/lib/client/WorktreeReviewRow.js +67 -0
  18. package/lib/client/WorktreeReviewRow.js.map +1 -0
  19. package/lib/client/actions.d.ts +86 -0
  20. package/lib/client/actions.js +35 -0
  21. package/lib/client/actions.js.map +1 -0
  22. package/lib/client/console-remote/adapter.d.ts +3 -0
  23. package/lib/client/console-remote/adapter.js +61 -0
  24. package/lib/client/console-remote/adapter.js.map +1 -0
  25. package/lib/client/console-remote/index.d.ts +18 -0
  26. package/lib/client/console-remote/index.js +17 -0
  27. package/lib/client/console-remote/index.js.map +1 -0
  28. package/lib/client/index.d.ts +17 -0
  29. package/lib/client/index.js +44 -0
  30. package/lib/client/index.js.map +1 -0
  31. package/lib/client/model.d.ts +68 -0
  32. package/lib/client/model.js +127 -0
  33. package/lib/client/model.js.map +1 -0
  34. package/lib/client/pre-session/PreSessionWorktreeToggle.d.ts +16 -0
  35. package/lib/client/pre-session/PreSessionWorktreeToggle.js +128 -0
  36. package/lib/client/pre-session/PreSessionWorktreeToggle.js.map +1 -0
  37. package/lib/client/pre-session/controller.d.ts +42 -0
  38. package/lib/client/pre-session/controller.js +149 -0
  39. package/lib/client/pre-session/controller.js.map +1 -0
  40. package/lib/client/pre-session/index.d.ts +15 -0
  41. package/lib/client/pre-session/index.js +16 -0
  42. package/lib/client/pre-session/index.js.map +1 -0
  43. package/lib/client/review-console/ReviewActions.d.ts +15 -0
  44. package/lib/client/review-console/ReviewActions.js +234 -0
  45. package/lib/client/review-console/ReviewActions.js.map +1 -0
  46. package/lib/client/review-console/WorktreeReviewPanel.d.ts +20 -0
  47. package/lib/client/review-console/WorktreeReviewPanel.js +75 -0
  48. package/lib/client/review-console/WorktreeReviewPanel.js.map +1 -0
  49. package/lib/client/review-console/index.d.ts +8 -0
  50. package/lib/client/review-console/index.js +22 -0
  51. package/lib/client/review-console/index.js.map +1 -0
  52. package/lib/client/review-console/review-console.styles.d.ts +1 -0
  53. package/lib/client/review-console/review-console.styles.js +81 -0
  54. package/lib/client/review-console/review-console.styles.js.map +1 -0
  55. package/lib/client/review-console/status-events.d.ts +3 -0
  56. package/lib/client/review-console/status-events.js +6 -0
  57. package/lib/client/review-console/status-events.js.map +1 -0
  58. package/lib/client/styles.d.ts +1 -0
  59. package/lib/client/styles.js +78 -0
  60. package/lib/client/styles.js.map +1 -0
  61. package/lib/client/target-console/TargetStatusAction.d.ts +7 -0
  62. package/lib/client/target-console/TargetStatusAction.js +46 -0
  63. package/lib/client/target-console/TargetStatusAction.js.map +1 -0
  64. package/lib/client/target-console/WorktreeConsoleView.d.ts +9 -0
  65. package/lib/client/target-console/WorktreeConsoleView.js +362 -0
  66. package/lib/client/target-console/WorktreeConsoleView.js.map +1 -0
  67. package/lib/client/target-console/WorktreeReviewStatus.d.ts +9 -0
  68. package/lib/client/target-console/WorktreeReviewStatus.js +125 -0
  69. package/lib/client/target-console/WorktreeReviewStatus.js.map +1 -0
  70. package/lib/client/target-console/index.d.ts +14 -0
  71. package/lib/client/target-console/index.js +23 -0
  72. package/lib/client/target-console/index.js.map +1 -0
  73. package/lib/client/target-console/target-console.styles.d.ts +1 -0
  74. package/lib/client/target-console/target-console.styles.js +130 -0
  75. package/lib/client/target-console/target-console.styles.js.map +1 -0
  76. package/lib/client.js +6902 -0
  77. package/lib/commands.d.ts +2 -4
  78. package/lib/commands.js +69 -28
  79. package/lib/commands.js.map +1 -1
  80. package/lib/console-contract.d.ts +253 -0
  81. package/lib/console-contract.js +86 -0
  82. package/lib/console-contract.js.map +1 -0
  83. package/lib/console-host/control-plane.d.ts +31 -0
  84. package/lib/console-host/control-plane.js +502 -0
  85. package/lib/console-host/control-plane.js.map +1 -0
  86. package/lib/console-host/errors.d.ts +6 -0
  87. package/lib/console-host/errors.js +31 -0
  88. package/lib/console-host/errors.js.map +1 -0
  89. package/lib/console-host/projection.d.ts +12 -0
  90. package/lib/console-host/projection.js +136 -0
  91. package/lib/console-host/projection.js.map +1 -0
  92. package/lib/console-host/review-diff.d.ts +18 -0
  93. package/lib/console-host/review-diff.js +176 -0
  94. package/lib/console-host/review-diff.js.map +1 -0
  95. package/lib/console-host/service.d.ts +26 -0
  96. package/lib/console-host/service.js +143 -0
  97. package/lib/console-host/service.js.map +1 -0
  98. package/lib/console-remote/descriptors.d.ts +3 -0
  99. package/lib/console-remote/descriptors.js +105 -0
  100. package/lib/console-remote/descriptors.js.map +1 -0
  101. package/lib/console-remote/remote.d.ts +29 -0
  102. package/lib/console-remote/remote.js +4 -0
  103. package/lib/console-remote/remote.js.map +1 -0
  104. package/lib/console-remote/schemas.d.ts +29 -0
  105. package/lib/console-remote/schemas.js +145 -0
  106. package/lib/console-remote/schemas.js.map +1 -0
  107. package/lib/console-remote/typert.d.ts +3 -0
  108. package/lib/console-remote/typert.js +14 -0
  109. package/lib/console-remote/typert.js.map +1 -0
  110. package/lib/index.d.ts +26 -8
  111. package/lib/index.js +28 -10
  112. package/lib/index.js.map +1 -1
  113. package/lib/managed-worktree-path.d.ts +14 -13
  114. package/lib/managed-worktree-path.js +32 -22
  115. package/lib/managed-worktree-path.js.map +1 -1
  116. package/lib/ports.d.ts +39 -1
  117. package/lib/session-checkout-apply.d.ts +54 -1
  118. package/lib/session-checkout-apply.js +318 -28
  119. package/lib/session-checkout-apply.js.map +1 -1
  120. package/lib/session-checkout-module.js +1098 -36
  121. package/lib/session-checkout-module.js.map +1 -1
  122. package/lib/session-target-context.d.ts +6 -0
  123. package/lib/session-target-context.js +16 -0
  124. package/lib/session-target-context.js.map +1 -0
  125. package/lib/tools.d.ts +6 -6
  126. package/lib/tools.js +107 -218
  127. package/lib/tools.js.map +1 -1
  128. package/lib/types.d.ts +57 -11
  129. package/lib/types.js +6 -6
  130. package/lib/types.js.map +1 -1
  131. package/package.json +116 -69
  132. package/scripts/check-publish.mjs +193 -0
  133. package/scripts/clean-lib.mjs +7 -0
  134. package/scripts/dev-dsh-lib.mjs +509 -0
  135. package/scripts/dev-dsh.mjs +95 -0
  136. 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;