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,362 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
3
|
+
import { worktreeConsoleErrorMeta, } from '../../console-contract.js';
|
|
4
|
+
import { openIsolatedTarget } from '../actions.js';
|
|
5
|
+
import { reviewEvidenceFromTarget, reviewIdentityFromTarget, WorktreeReviewPanel, } from '../review-console/index.js';
|
|
6
|
+
const STATE_LABELS = {
|
|
7
|
+
local: 'Local',
|
|
8
|
+
creating: '创建中…',
|
|
9
|
+
working: '修改中',
|
|
10
|
+
ready_for_review: '待验收',
|
|
11
|
+
preview_active: 'Local 验收中',
|
|
12
|
+
preview_detached: '预览待恢复',
|
|
13
|
+
retained: '已保留',
|
|
14
|
+
cleanup_pending: '清理中',
|
|
15
|
+
recovery_required: '需要恢复',
|
|
16
|
+
delivered: '已交付',
|
|
17
|
+
};
|
|
18
|
+
function errorText(error) {
|
|
19
|
+
const meta = worktreeConsoleErrorMeta(error.code);
|
|
20
|
+
const next = {
|
|
21
|
+
refresh: '请刷新以读取最新 Host 状态。',
|
|
22
|
+
confirm_dirty: '请明确确认脏 Worktree 后重试。',
|
|
23
|
+
open_recovery: '再次操作前请先查看恢复信息。',
|
|
24
|
+
retry: '临时故障消失后可以重试。',
|
|
25
|
+
none: '当前 Session 无权完成此操作。',
|
|
26
|
+
}[meta.recovery];
|
|
27
|
+
return `${error.code}: ${error.message} ${next}`;
|
|
28
|
+
}
|
|
29
|
+
function retentionLabel(retention) {
|
|
30
|
+
if (retention === 'retain_24h')
|
|
31
|
+
return '保留 24 小时';
|
|
32
|
+
if (retention === 'retain_3d')
|
|
33
|
+
return '保留 3 天';
|
|
34
|
+
return '手动清理';
|
|
35
|
+
}
|
|
36
|
+
function TargetState({ target }) {
|
|
37
|
+
return (_jsxs("span", { className: "dsh-wtc-state", "data-target-state": target.state, children: [_jsx("span", { className: "dsh-wtc-state-dot", "aria-hidden": true }), STATE_LABELS[target.state]] }));
|
|
38
|
+
}
|
|
39
|
+
/** Project-scoped Worktree management surface backed only by WorktreeConsoleAdapter. */
|
|
40
|
+
export function WorktreeConsoleView({ sessionId, adapter, services }) {
|
|
41
|
+
const mounted = useRef(true);
|
|
42
|
+
const request = useRef(0);
|
|
43
|
+
const sessionGeneration = useRef(0);
|
|
44
|
+
const [snapshot, setSnapshot] = useState(null);
|
|
45
|
+
const [loading, setLoading] = useState(true);
|
|
46
|
+
const [error, setError] = useState(null);
|
|
47
|
+
const [pendingAction, setPendingAction] = useState(null);
|
|
48
|
+
const [confirmTarget, setConfirmTarget] = useState(null);
|
|
49
|
+
const [inspected, setInspected] = useState({});
|
|
50
|
+
const [selectedReviewCheckoutId, setSelectedReviewCheckoutId] = useState(null);
|
|
51
|
+
const confirmButton = useRef(null);
|
|
52
|
+
const visibleSnapshot = snapshot?.sessionId === sessionId ? snapshot : null;
|
|
53
|
+
useLayoutEffect(() => {
|
|
54
|
+
mounted.current = true;
|
|
55
|
+
return () => { mounted.current = false; };
|
|
56
|
+
}, []);
|
|
57
|
+
useLayoutEffect(() => {
|
|
58
|
+
sessionGeneration.current += 1;
|
|
59
|
+
request.current += 1;
|
|
60
|
+
setSnapshot(null);
|
|
61
|
+
setInspected({});
|
|
62
|
+
setConfirmTarget(null);
|
|
63
|
+
setSelectedReviewCheckoutId(null);
|
|
64
|
+
setPendingAction(null);
|
|
65
|
+
setError(null);
|
|
66
|
+
setLoading(true);
|
|
67
|
+
}, [sessionId]);
|
|
68
|
+
const isActive = (generation) => mounted.current && sessionGeneration.current === generation;
|
|
69
|
+
const refresh = useCallback(async (clearError = true) => {
|
|
70
|
+
const generation = sessionGeneration.current;
|
|
71
|
+
const token = ++request.current;
|
|
72
|
+
setLoading(true);
|
|
73
|
+
if (clearError)
|
|
74
|
+
setError(null);
|
|
75
|
+
try {
|
|
76
|
+
const [current, list] = await Promise.all([
|
|
77
|
+
adapter.current({ sessionId }),
|
|
78
|
+
adapter.list({ sessionId }),
|
|
79
|
+
]);
|
|
80
|
+
if (!isActive(generation) || token !== request.current)
|
|
81
|
+
return;
|
|
82
|
+
if (!current.ok) {
|
|
83
|
+
setError(errorText(current.error));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!list.ok) {
|
|
87
|
+
setError(errorText(list.error));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
setSnapshot({ sessionId, current: current.value.target, list: list.value });
|
|
91
|
+
}
|
|
92
|
+
catch (reason) {
|
|
93
|
+
if (isActive(generation) && token === request.current) {
|
|
94
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
if (isActive(generation) && token === request.current)
|
|
99
|
+
setLoading(false);
|
|
100
|
+
}
|
|
101
|
+
}, [adapter, sessionId]);
|
|
102
|
+
useEffect(() => { void refresh(); }, [refresh]);
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
if (confirmTarget !== null)
|
|
105
|
+
confirmButton.current?.focus();
|
|
106
|
+
}, [confirmTarget]);
|
|
107
|
+
const applyMutation = (response, generation) => {
|
|
108
|
+
if (!isActive(generation))
|
|
109
|
+
return;
|
|
110
|
+
setSnapshot(current => {
|
|
111
|
+
if (current === null || current.sessionId !== sessionId)
|
|
112
|
+
return current;
|
|
113
|
+
const target = response.target;
|
|
114
|
+
const nextCurrent = current.current.checkoutId === target.checkoutId
|
|
115
|
+
? { ...current.current, ...target }
|
|
116
|
+
: current.current;
|
|
117
|
+
return {
|
|
118
|
+
sessionId,
|
|
119
|
+
current: nextCurrent,
|
|
120
|
+
list: {
|
|
121
|
+
...current.list,
|
|
122
|
+
worktrees: current.list.worktrees.map(row => row.checkoutId === target.checkoutId ? target : row),
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
const mutationError = (code, message, generation) => {
|
|
128
|
+
if (!isActive(generation))
|
|
129
|
+
return;
|
|
130
|
+
setError(errorText({ code, message }));
|
|
131
|
+
if (code === 'stale_target' || code === 'stale_local' || code === 'stale_isolated') {
|
|
132
|
+
void refresh(false);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
const createTarget = async () => {
|
|
136
|
+
if (pendingAction !== null || visibleSnapshot?.current.capabilities.create !== true)
|
|
137
|
+
return;
|
|
138
|
+
const generation = sessionGeneration.current;
|
|
139
|
+
const sourceProjectId = visibleSnapshot.current.project.id;
|
|
140
|
+
setPendingAction('create');
|
|
141
|
+
setError(null);
|
|
142
|
+
try {
|
|
143
|
+
const outcome = await adapter.create({ sourceSessionId: sessionId });
|
|
144
|
+
if (!isActive(generation))
|
|
145
|
+
return;
|
|
146
|
+
if (!outcome.ok) {
|
|
147
|
+
setError(errorText(outcome.error));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const { target, targetSessionId, managedRoot } = outcome.value;
|
|
151
|
+
if (target.sourceSessionId !== sessionId) {
|
|
152
|
+
throw new Error('Host 返回了属于其他 source Session 的目标。');
|
|
153
|
+
}
|
|
154
|
+
if (targetSessionId === sessionId) {
|
|
155
|
+
throw new Error('Host 错误地把 source Session 作为 isolated target Session 返回。');
|
|
156
|
+
}
|
|
157
|
+
if (target.checkoutId === null
|
|
158
|
+
|| target.targetSessionId !== targetSessionId
|
|
159
|
+
|| target.ownerSessionId !== targetSessionId
|
|
160
|
+
|| target.managedRoot !== managedRoot
|
|
161
|
+
|| target.project.id !== sourceProjectId
|
|
162
|
+
|| !target.capabilities.open) {
|
|
163
|
+
throw new Error('Host 返回的 target Session 身份不一致。');
|
|
164
|
+
}
|
|
165
|
+
await openIsolatedTarget(services, { targetSessionId, managedRoot }, () => isActive(generation));
|
|
166
|
+
if (!isActive(generation))
|
|
167
|
+
return;
|
|
168
|
+
setSnapshot(current => current === null || current.sessionId !== sessionId ? current : {
|
|
169
|
+
sessionId,
|
|
170
|
+
current: target,
|
|
171
|
+
list: {
|
|
172
|
+
...current.list,
|
|
173
|
+
worktrees: [
|
|
174
|
+
...current.list.worktrees.filter(row => row.checkoutId !== target.checkoutId),
|
|
175
|
+
(() => {
|
|
176
|
+
const { managedRoot: _root, sourceOid: _source, currentBranch: _branch, ...summary } = target;
|
|
177
|
+
return summary;
|
|
178
|
+
})(),
|
|
179
|
+
],
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
void refresh();
|
|
183
|
+
}
|
|
184
|
+
catch (reason) {
|
|
185
|
+
if (isActive(generation)) {
|
|
186
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
187
|
+
void refresh(false);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
if (isActive(generation))
|
|
192
|
+
setPendingAction(null);
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
const discardTarget = async (target, confirmDirty) => {
|
|
196
|
+
if (pendingAction !== null || target.checkoutId === null || !target.capabilities.discard)
|
|
197
|
+
return;
|
|
198
|
+
const generation = sessionGeneration.current;
|
|
199
|
+
setConfirmTarget(null);
|
|
200
|
+
setPendingAction(`discard:${target.checkoutId}`);
|
|
201
|
+
setError(null);
|
|
202
|
+
try {
|
|
203
|
+
const outcome = await adapter.discard({
|
|
204
|
+
sessionId,
|
|
205
|
+
checkoutId: target.checkoutId,
|
|
206
|
+
expectedRevision: target.revision,
|
|
207
|
+
confirmDirty,
|
|
208
|
+
...(target.state === 'preview_active' || target.capabilities.rollbackPreview ? { rollbackPreview: true } : {}),
|
|
209
|
+
});
|
|
210
|
+
if (!isActive(generation))
|
|
211
|
+
return;
|
|
212
|
+
if (!outcome.ok) {
|
|
213
|
+
mutationError(outcome.error.code, outcome.error.message, generation);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
applyMutation(outcome.value, generation);
|
|
217
|
+
void refresh();
|
|
218
|
+
}
|
|
219
|
+
catch (reason) {
|
|
220
|
+
if (isActive(generation))
|
|
221
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
if (isActive(generation))
|
|
225
|
+
setPendingAction(null);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
const retryCleanup = async (target) => {
|
|
229
|
+
if (pendingAction !== null || target.checkoutId === null || !target.capabilities.retryCleanup)
|
|
230
|
+
return;
|
|
231
|
+
const generation = sessionGeneration.current;
|
|
232
|
+
setPendingAction(`cleanup:${target.checkoutId}`);
|
|
233
|
+
setError(null);
|
|
234
|
+
try {
|
|
235
|
+
const outcome = await adapter.retryCleanup({
|
|
236
|
+
sessionId,
|
|
237
|
+
checkoutId: target.checkoutId,
|
|
238
|
+
expectedRevision: target.revision,
|
|
239
|
+
});
|
|
240
|
+
if (!isActive(generation))
|
|
241
|
+
return;
|
|
242
|
+
if (!outcome.ok) {
|
|
243
|
+
mutationError(outcome.error.code, outcome.error.message, generation);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
applyMutation(outcome.value, generation);
|
|
247
|
+
void refresh();
|
|
248
|
+
}
|
|
249
|
+
catch (reason) {
|
|
250
|
+
if (isActive(generation))
|
|
251
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
252
|
+
}
|
|
253
|
+
finally {
|
|
254
|
+
if (isActive(generation))
|
|
255
|
+
setPendingAction(null);
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
const inspectTarget = async (target) => {
|
|
259
|
+
if (pendingAction !== null || target.checkoutId === null || !target.capabilities.inspect)
|
|
260
|
+
return;
|
|
261
|
+
const generation = sessionGeneration.current;
|
|
262
|
+
setPendingAction(`inspect:${target.checkoutId}`);
|
|
263
|
+
setError(null);
|
|
264
|
+
try {
|
|
265
|
+
const outcome = await adapter.inspect({ sessionId, checkoutId: target.checkoutId });
|
|
266
|
+
if (!isActive(generation))
|
|
267
|
+
return;
|
|
268
|
+
if (!outcome.ok) {
|
|
269
|
+
mutationError(outcome.error.code, outcome.error.message, generation);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (outcome.value.target.checkoutId !== target.checkoutId) {
|
|
273
|
+
throw new Error('检查结果返回了不同的 Checkout 身份。');
|
|
274
|
+
}
|
|
275
|
+
setInspected(current => ({ ...current, [target.checkoutId]: outcome.value.target }));
|
|
276
|
+
}
|
|
277
|
+
catch (reason) {
|
|
278
|
+
if (isActive(generation))
|
|
279
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
if (isActive(generation))
|
|
283
|
+
setPendingAction(null);
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
const openListedTarget = async (target) => {
|
|
287
|
+
if (pendingAction !== null
|
|
288
|
+
|| target.checkoutId === null
|
|
289
|
+
|| !target.capabilities.open
|
|
290
|
+
|| !target.capabilities.inspect)
|
|
291
|
+
return;
|
|
292
|
+
const generation = sessionGeneration.current;
|
|
293
|
+
setPendingAction(`open:${target.checkoutId}`);
|
|
294
|
+
setError(null);
|
|
295
|
+
try {
|
|
296
|
+
const outcome = await adapter.inspect({ sessionId, checkoutId: target.checkoutId });
|
|
297
|
+
if (!isActive(generation))
|
|
298
|
+
return;
|
|
299
|
+
if (!outcome.ok) {
|
|
300
|
+
mutationError(outcome.error.code, outcome.error.message, generation);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const detail = outcome.value.target;
|
|
304
|
+
if (!detail.capabilities.open) {
|
|
305
|
+
throw new Error('最新 Host 状态已不允许打开该 Worktree。');
|
|
306
|
+
}
|
|
307
|
+
if (detail.checkoutId !== target.checkoutId
|
|
308
|
+
|| detail.project.id !== target.project.id
|
|
309
|
+
|| detail.sourceSessionId !== target.sourceSessionId
|
|
310
|
+
|| detail.ownerSessionId !== target.ownerSessionId
|
|
311
|
+
|| detail.targetSessionId !== target.targetSessionId
|
|
312
|
+
|| detail.targetSessionId !== detail.ownerSessionId) {
|
|
313
|
+
throw new Error('检查结果中的 target 身份不一致。');
|
|
314
|
+
}
|
|
315
|
+
if (detail.managedRoot === null || detail.targetSessionId === null) {
|
|
316
|
+
throw new Error('已授权的 target 路径或 Session 身份不可用。');
|
|
317
|
+
}
|
|
318
|
+
await openIsolatedTarget(services, {
|
|
319
|
+
managedRoot: detail.managedRoot,
|
|
320
|
+
targetSessionId: detail.targetSessionId,
|
|
321
|
+
}, () => isActive(generation));
|
|
322
|
+
}
|
|
323
|
+
catch (reason) {
|
|
324
|
+
if (isActive(generation)) {
|
|
325
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
326
|
+
void refresh(false);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
if (isActive(generation))
|
|
331
|
+
setPendingAction(null);
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
const selectedReviewTarget = selectedReviewCheckoutId === null
|
|
335
|
+
? null
|
|
336
|
+
: visibleSnapshot?.list.worktrees.find(target => target.checkoutId === selectedReviewCheckoutId) ?? null;
|
|
337
|
+
const selectedReviewEvidence = selectedReviewTarget === null
|
|
338
|
+
? null
|
|
339
|
+
: reviewEvidenceFromTarget(selectedReviewTarget);
|
|
340
|
+
const selectedReviewIdentity = selectedReviewTarget === null
|
|
341
|
+
? null
|
|
342
|
+
: reviewIdentityFromTarget(sessionId, selectedReviewTarget);
|
|
343
|
+
if (loading && visibleSnapshot === null) {
|
|
344
|
+
return _jsx("div", { className: "dsh-wtc-loading", role: "status", "aria-live": "polite", children: "\u6B63\u5728\u52A0\u8F7D Worktree \u63A7\u5236\u53F0\u2026" });
|
|
345
|
+
}
|
|
346
|
+
return (_jsxs("section", { className: "dsh-wtc-console", "aria-label": "Worktree \u63A7\u5236\u53F0", children: [_jsxs("header", { className: "dsh-wtc-console-head", children: [_jsxs("div", { children: [_jsx("span", { className: "dsh-wtc-kicker", children: "SESSION TARGET" }), _jsx("h2", { children: "Worktree \u63A7\u5236\u53F0" })] }), _jsx("button", { type: "button", className: "dsh-wtc-button", disabled: loading, onClick: () => { void refresh(); }, children: loading ? '刷新中…' : '刷新' })] }), error ? _jsx("div", { className: "dsh-wtc-error", role: "alert", children: error }) : null, visibleSnapshot ? (_jsxs(_Fragment, { children: [_jsxs("section", { className: "dsh-wtc-current", "aria-label": "\u5F53\u524D\u76EE\u6807", children: [_jsxs("div", { children: [_jsx("span", { className: "dsh-wtc-label", children: "\u5F53\u524D\u76EE\u6807" }), _jsx("strong", { children: visibleSnapshot.current.project.name })] }), _jsxs("div", { className: "dsh-wtc-current-actions", children: [_jsx(TargetState, { target: visibleSnapshot.current }), visibleSnapshot.current.state !== 'recovery_required' && visibleSnapshot.current.capabilities.create ? (_jsx("button", { type: "button", className: "dsh-wtc-button dsh-wtc-primary", disabled: pendingAction !== null, onClick: () => { void createTarget(); }, children: pendingAction === 'create' ? '创建中…' : '创建 Worktree' })) : null] })] }), _jsxs("section", { className: "dsh-wtc-list-section", "aria-label": "\u9879\u76EE Worktree", children: [_jsxs("div", { className: "dsh-wtc-section-head", children: [_jsxs("div", { children: [_jsx("span", { className: "dsh-wtc-label", children: "\u9879\u76EE" }), _jsx("h3", { children: visibleSnapshot.list.project.name })] }), _jsx("span", { className: "dsh-wtc-count", children: visibleSnapshot.list.worktrees.length })] }), visibleSnapshot.list.worktrees.length === 0 ? (_jsx("div", { className: "dsh-wtc-empty", children: "\u8FD9\u4E2A\u9879\u76EE\u8FD8\u6CA1\u6709\u53D7\u7BA1 Worktree\u3002" })) : (_jsx("ul", { className: "dsh-wtc-list", children: visibleSnapshot.list.worktrees.map(target => (_jsxs("li", { className: "dsh-wtc-row", children: [_jsxs("div", { className: "dsh-wtc-row-main", children: [_jsxs("div", { className: "dsh-wtc-row-title", children: [_jsx(TargetState, { target: target }), _jsx("span", { className: "dsh-wtc-row-id", children: target.checkoutId ?? 'Local source' })] }), _jsxs("div", { className: "dsh-wtc-facts", children: [_jsxs("span", { children: ["\u7B2C ", target.iteration, " \u8F6E"] }), target.dirty ? _jsx("span", { children: "\u6709\u672A\u63D0\u4EA4\u4FEE\u6539" }) : _jsx("span", { children: "\u5E72\u51C0" }), target.retention ? _jsxs("span", { children: ["\u4FDD\u7559\u65B9\u5F0F\uFF1A", retentionLabel(target.retention)] }) : null, target.expiresAt ? _jsxs("span", { children: ["\u5230\u671F\u65F6\u95F4\uFF1A", new Date(target.expiresAt).toLocaleString()] }) : null, target.cleanupMessage ? _jsx("span", { className: "dsh-wtc-recovery-message", children: target.cleanupMessage }) : null] })] }), _jsxs("div", { className: "dsh-wtc-row-actions", children: [_jsxs("span", { className: "dsh-wtc-revision", children: ["r", target.revision] }), target.review && target.checkoutId !== null ? (_jsx("button", { type: "button", className: "dsh-wtc-button", "aria-label": `验收 ${target.checkoutId}`, "aria-pressed": selectedReviewCheckoutId === target.checkoutId, disabled: pendingAction !== null, onClick: () => setSelectedReviewCheckoutId(current => current === target.checkoutId ? null : target.checkoutId), children: "\u9A8C\u6536" })) : null, target.capabilities.inspect && target.checkoutId !== null ? (_jsx("button", { type: "button", className: "dsh-wtc-button", "aria-label": `检查 ${target.checkoutId}`, disabled: pendingAction !== null, onClick: () => { void inspectTarget(target); }, children: pendingAction === `inspect:${target.checkoutId}` ? '检查中…' : '检查' })) : null, target.capabilities.open && target.capabilities.inspect && target.checkoutId !== null ? (_jsx("button", { type: "button", className: "dsh-wtc-button", "aria-label": `打开 ${target.checkoutId}`, disabled: pendingAction !== null, onClick: () => { void openListedTarget(target); }, children: pendingAction === `open:${target.checkoutId}` ? '打开中…' : '打开' })) : null, target.capabilities.discard && target.checkoutId !== null ? (_jsx("button", { type: "button", className: "dsh-wtc-button dsh-wtc-danger", "aria-label": `放弃 ${target.checkoutId}`, disabled: pendingAction !== null, onClick: () => {
|
|
347
|
+
if (target.dirty)
|
|
348
|
+
setConfirmTarget(target);
|
|
349
|
+
else
|
|
350
|
+
void discardTarget(target, false);
|
|
351
|
+
}, children: pendingAction === `discard:${target.checkoutId}` ? '放弃中…' : '放弃' })) : null, target.capabilities.retryCleanup && target.checkoutId !== null ? (_jsx("button", { type: "button", className: "dsh-wtc-button", "aria-label": `重试清理 ${target.checkoutId}`, disabled: pendingAction !== null, onClick: () => { void retryCleanup(target); }, children: pendingAction === `cleanup:${target.checkoutId}` ? '重试中…' : '重试清理' })) : null] }), target.checkoutId !== null && inspected[target.checkoutId] ? (_jsxs("div", { className: "dsh-wtc-inspect", "aria-label": `检查结果 ${target.checkoutId}`, children: [_jsx("span", { className: "dsh-wtc-label", children: "\u5DF2\u6388\u6743\u5DE5\u4F5C\u76EE\u5F55" }), _jsx("code", { children: inspected[target.checkoutId].managedRoot ?? 'Unavailable' }), _jsx("span", { className: "dsh-wtc-label", children: "\u5206\u652F" }), _jsx("code", { children: inspected[target.checkoutId].currentBranch ?? 'detached' })] })) : null] }, target.checkoutId ?? `local:${target.sourceSessionId}`))) }))] }), selectedReviewTarget && selectedReviewEvidence && selectedReviewIdentity ? (_jsx("div", { className: "dsh-wt-card", children: _jsx(WorktreeReviewPanel, { review: selectedReviewEvidence, identity: selectedReviewIdentity, adapter: adapter, target: selectedReviewTarget, onRefresh: () => refresh(false), onTargetChange: target => applyMutation({ target }, sessionGeneration.current) }) })) : null] })) : null, confirmTarget !== null ? (_jsxs("div", { className: "dsh-wtc-confirm", role: "alertdialog", "aria-modal": "true", "aria-label": "\u653E\u5F03\u6709\u4FEE\u6539\u7684 Worktree\uFF1F", onKeyDown: (event) => {
|
|
352
|
+
if (event.key !== 'Escape')
|
|
353
|
+
return;
|
|
354
|
+
event.preventDefault();
|
|
355
|
+
setConfirmTarget(null);
|
|
356
|
+
}, children: [_jsx("strong", { children: "\u653E\u5F03\u6709\u4FEE\u6539\u7684 Worktree\uFF1F" }), _jsx("p", { children: sessionId === confirmTarget.sourceSessionId && sessionId !== confirmTarget.ownerSessionId
|
|
357
|
+
? `Local source 将放弃预留目标 ${confirmTarget.checkoutId} 及其全部未提交修改。`
|
|
358
|
+
: confirmTarget.state === 'preview_active' || confirmTarget.capabilities.rollbackPreview
|
|
359
|
+
? `将先安全撤回 ${confirmTarget.checkoutId} 的 Local Preview;只有撤回成功后才会删除 Worktree。`
|
|
360
|
+
: `当前 Session 将放弃 Worktree ${confirmTarget.checkoutId} 及其全部未提交修改。` }), _jsxs("div", { className: "dsh-wtc-confirm-actions", children: [_jsx("button", { type: "button", className: "dsh-wtc-button", onClick: () => { setConfirmTarget(null); }, children: "\u53D6\u6D88" }), _jsx("button", { ref: confirmButton, type: "button", className: "dsh-wtc-button dsh-wtc-danger", onClick: () => { void discardTarget(confirmTarget, true); }, children: "\u786E\u8BA4\u653E\u5F03\u4FEE\u6539" })] })] })) : null] }));
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=WorktreeConsoleView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeConsoleView.js","sourceRoot":"","sources":["../../../src/client/target-console/WorktreeConsoleView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WorktreeConsoleAdapter } from '../../console-contract.js';
|
|
2
|
+
export interface WorktreeReviewStatusProps {
|
|
3
|
+
session: {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
};
|
|
6
|
+
adapter: WorktreeConsoleAdapter;
|
|
7
|
+
}
|
|
8
|
+
/** Domi-style compact delivery status above the native Harness composer. */
|
|
9
|
+
export declare function WorktreeReviewStatus({ session, adapter }: WorktreeReviewStatusProps): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { ReviewActions } from '../review-console/ReviewActions.js';
|
|
4
|
+
import { reviewEvidenceFromTarget, reviewIdentityFromTarget } from '../review-console/index.js';
|
|
5
|
+
import { WORKTREE_REVIEW_REFRESH_EVENT } from '../review-console/status-events.js';
|
|
6
|
+
/** Domi-style compact delivery status above the native Harness composer. */
|
|
7
|
+
export function WorktreeReviewStatus({ session, adapter }) {
|
|
8
|
+
const sessionId = session.sessionId;
|
|
9
|
+
const [target, setTarget] = useState(null);
|
|
10
|
+
const [error, setError] = useState(null);
|
|
11
|
+
const [startingIteration, setStartingIteration] = useState(false);
|
|
12
|
+
const mounted = useRef(true);
|
|
13
|
+
const refreshing = useRef(false);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
mounted.current = true;
|
|
16
|
+
return () => { mounted.current = false; };
|
|
17
|
+
}, []);
|
|
18
|
+
const refresh = useCallback(async () => {
|
|
19
|
+
if (refreshing.current)
|
|
20
|
+
return;
|
|
21
|
+
refreshing.current = true;
|
|
22
|
+
try {
|
|
23
|
+
const outcome = await adapter.current({ sessionId });
|
|
24
|
+
if (!mounted.current)
|
|
25
|
+
return;
|
|
26
|
+
if (outcome.ok) {
|
|
27
|
+
setTarget(outcome.value.target);
|
|
28
|
+
setError(null);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
setError(outcome.error.message);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (reason) {
|
|
35
|
+
if (mounted.current)
|
|
36
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
refreshing.current = false;
|
|
40
|
+
}
|
|
41
|
+
}, [adapter, sessionId]);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
void refresh();
|
|
44
|
+
const listener = (event) => {
|
|
45
|
+
const detail = event.detail;
|
|
46
|
+
if (detail?.sessionId === sessionId)
|
|
47
|
+
void refresh();
|
|
48
|
+
};
|
|
49
|
+
const timer = window.setInterval(() => { void refresh(); }, 5_000);
|
|
50
|
+
window.addEventListener(WORKTREE_REVIEW_REFRESH_EVENT, listener);
|
|
51
|
+
return () => {
|
|
52
|
+
window.clearInterval(timer);
|
|
53
|
+
window.removeEventListener(WORKTREE_REVIEW_REFRESH_EVENT, listener);
|
|
54
|
+
};
|
|
55
|
+
}, [refresh, sessionId]);
|
|
56
|
+
if (target?.state === 'delivered' && target.checkoutId !== null && target.capabilities.beginNextIteration) {
|
|
57
|
+
const beginNextIteration = async () => {
|
|
58
|
+
if (startingIteration)
|
|
59
|
+
return;
|
|
60
|
+
setStartingIteration(true);
|
|
61
|
+
setError(null);
|
|
62
|
+
try {
|
|
63
|
+
const outcome = await adapter.beginNextIteration({
|
|
64
|
+
sessionId,
|
|
65
|
+
checkoutId: target.checkoutId,
|
|
66
|
+
expectedRevision: target.revision,
|
|
67
|
+
});
|
|
68
|
+
if (!mounted.current)
|
|
69
|
+
return;
|
|
70
|
+
if (!outcome.ok) {
|
|
71
|
+
setError(outcome.error.message);
|
|
72
|
+
if (outcome.error.code === 'stale_target')
|
|
73
|
+
void refresh();
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
setTarget(current => current ? { ...current, ...outcome.value.target } : current);
|
|
77
|
+
}
|
|
78
|
+
catch (reason) {
|
|
79
|
+
if (mounted.current)
|
|
80
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
if (mounted.current)
|
|
84
|
+
setStartingIteration(false);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
return (_jsxs("section", { className: "dsh-wt-review-dock", "aria-label": "Worktree \u4E0B\u4E00\u8F6E", "data-review-state": "delivered", children: [_jsx("span", { className: "dsh-wt-review-dock-icon", "aria-hidden": true, children: "\u2713" }), _jsxs("span", { className: "dsh-wt-review-dock-copy", children: [_jsx("strong", { children: "\u672C\u8F6E\u5DF2\u4EA4\u4ED8\uFF0C\u53EF\u5728\u539F\u4F1A\u8BDD\u7EE7\u7EED\u4E0B\u4E00\u8F6E\u4FEE\u6539" }), _jsx("span", { children: "\u5C06\u5B89\u5168\u91CD\u5EFA\u5DF2\u6E05\u7406\u7684 Worktree \u8DEF\u5F84\uFF0C\u5E76\u4FDD\u7559\u5F53\u524D\u5BF9\u8BDD\u3002" })] }), error ? _jsx("span", { className: "dsh-wt-error", children: error }) : null, _jsx("button", { type: "button", className: "dsh-wt-button dsh-wt-primary", disabled: startingIteration, onClick: () => { void beginNextIteration(); }, children: startingIteration ? '正在创建…' : '开始下一轮修改' })] }));
|
|
88
|
+
}
|
|
89
|
+
if (!target
|
|
90
|
+
|| !target.review
|
|
91
|
+
|| target.checkoutId === null
|
|
92
|
+
|| !['ready_for_review', 'preview_active', 'preview_detached', 'cleanup_pending', 'recovery_required', 'retained'].includes(target.state))
|
|
93
|
+
return null;
|
|
94
|
+
const review = reviewEvidenceFromTarget(target);
|
|
95
|
+
const identity = reviewIdentityFromTarget(sessionId, target);
|
|
96
|
+
if (!review || !identity)
|
|
97
|
+
return null;
|
|
98
|
+
const focusReview = () => {
|
|
99
|
+
document.querySelector(`[data-worktree-review-id="${CSS.escape(review.reviewId)}"]`)
|
|
100
|
+
?.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
101
|
+
};
|
|
102
|
+
const applyTarget = (nextTarget) => {
|
|
103
|
+
setTarget(current => current ? { ...current, ...nextTarget } : current);
|
|
104
|
+
};
|
|
105
|
+
const detachedFromHeadDrift = target.state === 'preview_detached'
|
|
106
|
+
&& target.previewRecovery?.reason === 'stale_local';
|
|
107
|
+
const label = target.state === 'ready_for_review'
|
|
108
|
+
? target.reviewSlot === 'waiting' ? '另一个任务正在占用 Local 验收槽位' : 'Worktree 已准备好同步到 Local 验收'
|
|
109
|
+
: target.state === 'preview_active'
|
|
110
|
+
? '本轮修改正在 Local 等待验收'
|
|
111
|
+
: target.state === 'preview_detached'
|
|
112
|
+
? detachedFromHeadDrift ? 'Local branch/HEAD 已变化,Preview 等待安全撤回' : 'Preview 与 Local 发生冲突,已保留恢复现场'
|
|
113
|
+
: target.state === 'recovery_required'
|
|
114
|
+
? '验收操作中断,需要恢复 Preview'
|
|
115
|
+
: target.state === 'cleanup_pending'
|
|
116
|
+
? 'Commit 已创建,Worktree 清理待重试'
|
|
117
|
+
: '本轮已提交,运行环境暂时保留';
|
|
118
|
+
const detail = target.state === 'preview_detached'
|
|
119
|
+
? detachedFromHeadDrift
|
|
120
|
+
? '同分支快进可安全重试;切分支或改写历史时不会写入。'
|
|
121
|
+
: '自动撤回会重新检查冲突;无法证明安全时不会写入。'
|
|
122
|
+
: `${review.changedFiles.length} 个文件 · ${review.validationStatus === 'passed' ? '自动验证通过' : '请检查验证结果'}`;
|
|
123
|
+
return (_jsxs("section", { className: "dsh-wt-review-dock", "aria-label": "Worktree \u5F85\u9A8C\u6536", "data-review-state": target.state, children: [_jsx("span", { className: "dsh-wt-review-dock-icon", "aria-hidden": true, children: target.state === 'preview_detached' || target.state === 'recovery_required' ? '!' : '✓' }), _jsxs("span", { className: "dsh-wt-review-dock-copy", children: [_jsx("strong", { children: label }), _jsx("span", { children: detail })] }), error ? _jsx("span", { className: "dsh-wt-error", children: error }) : null, _jsx(ReviewActions, { review: review, adapter: adapter, identity: identity, target: target, disabled: false, unavailableMessage: "\u5B9E\u65F6 Worktree Console \u672A\u8FDE\u63A5\u3002", focusReview: focusReview, onStale: () => { void refresh(); }, onTargetChange: applyTarget })] }));
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=WorktreeReviewStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeReviewStatus.js","sourceRoot":"","sources":["../../../src/client/target-console/WorktreeReviewStatus.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ComponentType } from 'react';
|
|
2
|
+
import type { WorktreeConsoleAdapter } from '../../console-contract.js';
|
|
3
|
+
import type { WorktreeClientServices } from '../actions.js';
|
|
4
|
+
export interface TargetConsoleContextLike {
|
|
5
|
+
slots: {
|
|
6
|
+
inject(name: 'conversation.session.header.actions' | 'conversation.input.dock', callback: () => unknown): void;
|
|
7
|
+
register(descriptor: Record<string, unknown>, component: ComponentType<any>): unknown;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/** Register the Harness-native Session Target contributions against an injected adapter seam. */
|
|
11
|
+
export declare function registerTargetConsole(ctx: TargetConsoleContextLike, adapter: WorktreeConsoleAdapter, _services: WorktreeClientServices): void;
|
|
12
|
+
export { TargetStatusAction } from './TargetStatusAction.js';
|
|
13
|
+
export { WorktreeConsoleView } from './WorktreeConsoleView.js';
|
|
14
|
+
export { WorktreeReviewStatus } from './WorktreeReviewStatus.js';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createElement } from 'react';
|
|
2
|
+
import { TargetStatusAction } from './TargetStatusAction.js';
|
|
3
|
+
import { WorktreeReviewStatus } from './WorktreeReviewStatus.js';
|
|
4
|
+
/** Register the Harness-native Session Target contributions against an injected adapter seam. */
|
|
5
|
+
export function registerTargetConsole(ctx, adapter, _services) {
|
|
6
|
+
const HeaderAction = ({ sessionId }) => createElement(TargetStatusAction, { sessionId, adapter });
|
|
7
|
+
const ReviewStatus = ({ session }) => createElement(WorktreeReviewStatus, { session, adapter });
|
|
8
|
+
ctx.slots.inject('conversation.session.header.actions', () => ctx.slots.register({
|
|
9
|
+
name: 'conversation.session.header.actions',
|
|
10
|
+
id: 'worktree-target',
|
|
11
|
+
order: 30,
|
|
12
|
+
label: 'Worktree Target',
|
|
13
|
+
}, HeaderAction));
|
|
14
|
+
ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({
|
|
15
|
+
name: 'conversation.input.dock',
|
|
16
|
+
id: 'worktree-review-status',
|
|
17
|
+
order: 10,
|
|
18
|
+
}, ReviewStatus));
|
|
19
|
+
}
|
|
20
|
+
export { TargetStatusAction } from './TargetStatusAction.js';
|
|
21
|
+
export { WorktreeConsoleView } from './WorktreeConsoleView.js';
|
|
22
|
+
export { WorktreeReviewStatus } from './WorktreeReviewStatus.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/target-console/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAsB,MAAM,OAAO,CAAA;AAGzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAYhE,iGAAiG;AACjG,MAAM,UAAU,qBAAqB,CACnC,GAA6B,EAC7B,OAA+B,EAC/B,SAAiC;IAEjC,MAAM,YAAY,GAAG,CAAC,EAAE,SAAS,EAAyB,EAAE,EAAE,CAC5D,aAAa,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;IAC3D,MAAM,YAAY,GAAG,CAAC,EAAE,OAAO,EAAsC,EAAE,EAAE,CACvE,aAAa,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IAC3D,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC/E,IAAI,EAAE,qCAAqC;QAC3C,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,iBAAiB;KACzB,EAAE,YAAY,CAAC,CAAC,CAAA;IACjB,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACnE,IAAI,EAAE,yBAAyB;QAC/B,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,EAAE;KACV,EAAE,YAAY,CAAC,CAAC,CAAA;AACnB,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const TARGET_CONSOLE_STYLES: string;
|