dsh-git-worktree 0.1.2 → 0.2.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 +59 -0
- package/LICENSE +21 -21
- package/README.md +115 -43
- package/README.zh.md +115 -41
- package/cordis.patch.yml +7 -7
- package/lib/adapters/registry.js +40 -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 +59 -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 +219 -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 +91 -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 +6813 -0
- package/lib/commands.d.ts +2 -4
- package/lib/commands.js +54 -28
- package/lib/commands.js.map +1 -1
- package/lib/console-contract.d.ts +236 -0
- package/lib/console-contract.js +86 -0
- package/lib/console-contract.js.map +1 -0
- package/lib/console-host/control-plane.d.ts +29 -0
- package/lib/console-host/control-plane.js +443 -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 +131 -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 +24 -0
- package/lib/console-host/service.js +131 -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 +96 -0
- package/lib/console-remote/descriptors.js.map +1 -0
- package/lib/console-remote/remote.d.ts +27 -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 +143 -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 +22 -6
- 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 +37 -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 +853 -33
- 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 +5 -6
- package/lib/tools.js +43 -233
- 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 +453 -0
- package/scripts/dev-dsh.mjs +89 -0
- package/scripts/dsh-source-runner.mjs +14 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { consoleFailure, domainError, failure, outcome } from './errors.js';
|
|
3
|
+
import { projectDetails, projectLocal, projectRecord } from './projection.js';
|
|
4
|
+
import { ReviewDiffStaleError } from './review-diff.js';
|
|
5
|
+
function recordOf(registry, checkoutId) {
|
|
6
|
+
const record = registry.read().managedCheckouts[checkoutId];
|
|
7
|
+
if (record === undefined)
|
|
8
|
+
throw domainError('checkout_missing', 'Worktree 记录不存在');
|
|
9
|
+
return record;
|
|
10
|
+
}
|
|
11
|
+
function readyReview(record) {
|
|
12
|
+
if (record.phase !== 'ready' || record.delivery.state !== 'ready_for_review') {
|
|
13
|
+
throw domainError('operation_not_allowed', '当前 Worktree 尚未处于可验收状态');
|
|
14
|
+
}
|
|
15
|
+
return record.delivery.review;
|
|
16
|
+
}
|
|
17
|
+
function previewReview(record) {
|
|
18
|
+
if (record.phase !== 'ready' || record.delivery.state !== 'preview_active') {
|
|
19
|
+
throw domainError('preview_not_active', '当前没有等待验收的 Local Preview');
|
|
20
|
+
}
|
|
21
|
+
return record.delivery.review;
|
|
22
|
+
}
|
|
23
|
+
function preflightFailure(view) {
|
|
24
|
+
if (view === undefined)
|
|
25
|
+
return failure('git_error', '当前 SessionCheckoutModule 不支持验收预检');
|
|
26
|
+
if (view.status !== 'blocked')
|
|
27
|
+
return undefined;
|
|
28
|
+
const code = view.reason === 'stale_isolated' ? 'stale_isolated'
|
|
29
|
+
: view.reason === 'stale_target' ? 'stale_target'
|
|
30
|
+
: view.reason === 'project_acceptance_busy' ? 'project_acceptance_busy'
|
|
31
|
+
: view.reason === 'not_owner' ? 'not_owner'
|
|
32
|
+
: view.reason === 'not_ready_for_review' ? 'operation_not_allowed'
|
|
33
|
+
: view.reason === 'checkout_unavailable' ? 'checkout_mismatch'
|
|
34
|
+
: 'git_error';
|
|
35
|
+
return failure(code, view.message);
|
|
36
|
+
}
|
|
37
|
+
export function createWorktreeConsoleControlPlane(options) {
|
|
38
|
+
const createTargetSessionId = options.createTargetSessionId ?? randomUUID;
|
|
39
|
+
async function unboundLocalTarget(sessionId) {
|
|
40
|
+
const session = options.lookup.getSession(sessionId);
|
|
41
|
+
if (session === undefined)
|
|
42
|
+
throw domainError('session_not_found', '当前 Session 不存在');
|
|
43
|
+
if (session.projectId === undefined)
|
|
44
|
+
throw domainError('project_not_found', '当前 Session 尚未关联项目');
|
|
45
|
+
const project = options.lookup.getProject(session.projectId);
|
|
46
|
+
if (project === undefined)
|
|
47
|
+
throw domainError('project_not_found', '当前 Session 项目不存在');
|
|
48
|
+
if (!options.files.exists(project.root))
|
|
49
|
+
throw domainError('project_root_missing', '当前 Session 项目目录不存在');
|
|
50
|
+
const snapshot = await options.git.inspect(project.root);
|
|
51
|
+
if (snapshot === null)
|
|
52
|
+
throw domainError('not_git_repository', '当前 Session 项目不是可用的 Git Worktree');
|
|
53
|
+
const status = await options.git.status(project.root);
|
|
54
|
+
return {
|
|
55
|
+
project: { id: project.id, name: project.name },
|
|
56
|
+
checkout: { id: 'local', kind: 'local', label: 'Local', phase: 'ready' },
|
|
57
|
+
source: { ref: snapshot.headRef, oid: snapshot.headOid },
|
|
58
|
+
current: { branch: snapshot.branch, oid: snapshot.headOid },
|
|
59
|
+
ownership: 'owner',
|
|
60
|
+
dirty: status.dirty,
|
|
61
|
+
revision: 0,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async function callerTarget(sessionId) {
|
|
65
|
+
try {
|
|
66
|
+
return await options.module.inspect(sessionId);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (error instanceof Error && 'code' in error && error.code === 'target_unselected') {
|
|
70
|
+
return unboundLocalTarget(sessionId);
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function authorize(sessionId, checkoutId) {
|
|
76
|
+
const caller = await options.module.inspect(sessionId);
|
|
77
|
+
const record = recordOf(options.registry, checkoutId);
|
|
78
|
+
if (record.ownerSessionId !== sessionId && record.sourceSessionId !== sessionId) {
|
|
79
|
+
throw domainError('not_owner', '当前 Session 无权访问该 Worktree');
|
|
80
|
+
}
|
|
81
|
+
if (record.projectId !== caller.project.id) {
|
|
82
|
+
throw domainError('project_mismatch', 'Worktree 与当前 Session 项目不一致');
|
|
83
|
+
}
|
|
84
|
+
const session = options.lookup.getSession(sessionId);
|
|
85
|
+
const project = session?.projectId === undefined ? undefined : options.lookup.getProject(session.projectId);
|
|
86
|
+
if (project === undefined || !options.files.exists(project.root)) {
|
|
87
|
+
throw domainError('project_mismatch', '当前 Session Workspace 无法证明属于该 Worktree 的原始项目');
|
|
88
|
+
}
|
|
89
|
+
const workspaceRoot = await options.files.canonicalize(project.root);
|
|
90
|
+
const expectedRoot = record.ownerSessionId === sessionId ? record.managedRoot : record.localRoot;
|
|
91
|
+
const normalizedWorkspace = process.platform === 'win32' ? workspaceRoot.toLowerCase() : workspaceRoot;
|
|
92
|
+
const normalizedExpected = process.platform === 'win32' ? expectedRoot.toLowerCase() : expectedRoot;
|
|
93
|
+
if (normalizedWorkspace !== normalizedExpected) {
|
|
94
|
+
throw domainError('project_mismatch', '当前 Session cwd 与 Worktree 授权边界不一致');
|
|
95
|
+
}
|
|
96
|
+
if (record.phase !== 'discarded') {
|
|
97
|
+
const visible = await options.module.listManagedWorktreesForSession(sessionId, { checkoutId });
|
|
98
|
+
if (!visible.some(item => item.checkoutId === checkoutId)) {
|
|
99
|
+
throw domainError('not_owner', '当前 Session 无权访问该 Worktree');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return record;
|
|
103
|
+
}
|
|
104
|
+
async function observe(record) {
|
|
105
|
+
if (record.phase === 'discarded')
|
|
106
|
+
return { managedRoot: null };
|
|
107
|
+
const managedRoot = await options.module.resolveManagedRoot(record.checkoutId);
|
|
108
|
+
const snapshot = await options.git.inspect(managedRoot);
|
|
109
|
+
if (snapshot === null)
|
|
110
|
+
throw domainError('checkout_mismatch', 'Worktree Git 身份无法验证');
|
|
111
|
+
const status = await options.git.status(managedRoot);
|
|
112
|
+
return { managedRoot, snapshot, dirty: status.dirty };
|
|
113
|
+
}
|
|
114
|
+
function ownerSessionAvailable(record) {
|
|
115
|
+
return options.lookup.getSession(record.ownerSessionId) !== undefined;
|
|
116
|
+
}
|
|
117
|
+
function sameLocalRoot(left, right) {
|
|
118
|
+
return process.platform === 'win32' ? left.toLowerCase() === right.toLowerCase() : left === right;
|
|
119
|
+
}
|
|
120
|
+
function acceptanceHolder(record) {
|
|
121
|
+
return Object.values(options.registry.read().managedCheckouts).find(candidate => (candidate.checkoutId !== record.checkoutId
|
|
122
|
+
&& candidate.phase !== 'discarded'
|
|
123
|
+
&& sameLocalRoot(candidate.localRoot, record.localRoot)
|
|
124
|
+
&& (candidate.delivery.state === 'preview_active'
|
|
125
|
+
|| candidate.journal?.operation === 'preview'
|
|
126
|
+
|| candidate.journal?.operation === 'rollback_preview'
|
|
127
|
+
|| candidate.journal?.operation === 'finalize_preview'
|
|
128
|
+
|| candidate.journal?.operation === 'finish')));
|
|
129
|
+
}
|
|
130
|
+
function projectReviewSlot(record, target) {
|
|
131
|
+
if (record.delivery.state !== 'ready_for_review')
|
|
132
|
+
return target;
|
|
133
|
+
const holder = acceptanceHolder(record);
|
|
134
|
+
return {
|
|
135
|
+
...target,
|
|
136
|
+
reviewSlot: holder ? 'waiting' : 'available',
|
|
137
|
+
...(holder ? {
|
|
138
|
+
reviewSlotOwnerSessionId: holder.ownerSessionId,
|
|
139
|
+
capabilities: { ...target.capabilities, preflight: false, preview: false },
|
|
140
|
+
} : {}),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async function details(sessionId, checkoutId) {
|
|
144
|
+
const record = await authorize(sessionId, checkoutId);
|
|
145
|
+
const observed = await observe(record);
|
|
146
|
+
return projectReviewSlot(record, projectDetails(record, sessionId, observed.managedRoot, observed.snapshot, observed.dirty, ownerSessionAvailable(record)));
|
|
147
|
+
}
|
|
148
|
+
async function mutationResponse(sessionId, checkoutId) {
|
|
149
|
+
const record = recordOf(options.registry, checkoutId);
|
|
150
|
+
if (record.phase === 'discarded') {
|
|
151
|
+
return { target: projectReviewSlot(record, projectRecord(record, sessionId, { ownerSessionAvailable: ownerSessionAvailable(record) })) };
|
|
152
|
+
}
|
|
153
|
+
const observed = await observe(record);
|
|
154
|
+
return { target: projectReviewSlot(record, projectRecord(record, sessionId, { ...observed, ownerSessionAvailable: ownerSessionAvailable(record) })) };
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
current: sessionId => outcome(async () => {
|
|
158
|
+
const target = await callerTarget(sessionId);
|
|
159
|
+
if (target.checkout.kind === 'local')
|
|
160
|
+
return { target: projectLocal(target, sessionId) };
|
|
161
|
+
return { target: await details(sessionId, target.checkout.id) };
|
|
162
|
+
}),
|
|
163
|
+
list: request => outcome(async () => {
|
|
164
|
+
const caller = await callerTarget(request.sessionId);
|
|
165
|
+
const active = await options.module.listManagedWorktreesForSession(request.sessionId, {
|
|
166
|
+
needsAttention: request.needsAttention,
|
|
167
|
+
});
|
|
168
|
+
const activeById = new Map(active.map(summary => [summary.checkoutId, summary]));
|
|
169
|
+
const records = Object.values(options.registry.read().managedCheckouts)
|
|
170
|
+
.filter(record => record.projectId === caller.project.id)
|
|
171
|
+
.filter(record => record.ownerSessionId === request.sessionId || record.sourceSessionId === request.sessionId)
|
|
172
|
+
.filter(record => request.includeDelivered === true || record.phase !== 'discarded')
|
|
173
|
+
.filter(record => record.phase === 'discarded' || activeById.has(record.checkoutId));
|
|
174
|
+
const worktrees = [];
|
|
175
|
+
for (const record of records) {
|
|
176
|
+
const observed = record.phase === 'discarded' ? undefined : await observe(record);
|
|
177
|
+
const projected = projectReviewSlot(record, projectRecord(record, request.sessionId, {
|
|
178
|
+
...observed,
|
|
179
|
+
summary: activeById.get(record.checkoutId),
|
|
180
|
+
ownerSessionAvailable: ownerSessionAvailable(record),
|
|
181
|
+
}));
|
|
182
|
+
if (request.needsAttention !== true || projected.state === 'cleanup_pending' || projected.state === 'recovery_required') {
|
|
183
|
+
worktrees.push(projected);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return { project: { ...caller.project }, worktrees };
|
|
187
|
+
}),
|
|
188
|
+
create: sourceSessionId => outcome(async () => {
|
|
189
|
+
const targetSessionId = createTargetSessionId();
|
|
190
|
+
const launch = await options.module.createIsolatedTarget(sourceSessionId, targetSessionId);
|
|
191
|
+
const record = recordOf(options.registry, launch.target.checkout.id);
|
|
192
|
+
const observed = await observe(record);
|
|
193
|
+
if (record.sourceSessionId !== sourceSessionId
|
|
194
|
+
|| record.ownerSessionId !== targetSessionId
|
|
195
|
+
|| observed.managedRoot !== launch.managedRoot)
|
|
196
|
+
throw domainError('checkout_mismatch', '新建 Worktree 的 Host 身份校验失败');
|
|
197
|
+
return {
|
|
198
|
+
target: projectDetails(record, sourceSessionId, observed.managedRoot, observed.snapshot, observed.dirty, ownerSessionAvailable(record)),
|
|
199
|
+
targetSessionId,
|
|
200
|
+
managedRoot: launch.managedRoot,
|
|
201
|
+
};
|
|
202
|
+
}),
|
|
203
|
+
inspect: (sessionId, checkoutId) => outcome(async () => ({ target: await details(sessionId, checkoutId) })),
|
|
204
|
+
reviewDiff: async (request) => {
|
|
205
|
+
try {
|
|
206
|
+
const record = await authorize(request.sessionId, request.checkoutId);
|
|
207
|
+
if (record.ownerSessionId !== request.sessionId)
|
|
208
|
+
return failure('not_owner', '只有 owner Isolated Session 可以读取验收 Diff');
|
|
209
|
+
if (record.revision !== request.expectedRevision)
|
|
210
|
+
return failure('stale_target', 'Session Target 已变化,请刷新');
|
|
211
|
+
const review = readyReview(record);
|
|
212
|
+
if (review.reviewId !== request.expectedReviewId)
|
|
213
|
+
return failure('stale_target', 'Review 身份已变化,请刷新');
|
|
214
|
+
const before = await options.module.preflight?.(request.sessionId, request.expectedRevision);
|
|
215
|
+
if (before === undefined || before.status === 'blocked')
|
|
216
|
+
return preflightFailure(before);
|
|
217
|
+
if (before.reviewId !== review.reviewId || before.isolatedHeadOid !== review.isolatedHeadOid) {
|
|
218
|
+
return failure('stale_isolated', 'Ready 后 Isolated HEAD 已变化');
|
|
219
|
+
}
|
|
220
|
+
const observed = await observe(record);
|
|
221
|
+
const diff = await options.reviewDiff.read({
|
|
222
|
+
managedRoot: observed.managedRoot,
|
|
223
|
+
baseOid: record.applyBaseOid ?? record.baseOid,
|
|
224
|
+
reviewId: review.reviewId,
|
|
225
|
+
revision: record.revision,
|
|
226
|
+
changedFiles: review.changedFiles,
|
|
227
|
+
});
|
|
228
|
+
const after = await options.module.preflight?.(request.sessionId, request.expectedRevision);
|
|
229
|
+
if (after === undefined || after.status === 'blocked') {
|
|
230
|
+
return failure('stale_isolated', 'Ready 后 Isolated 内容已变化,Diff bytes 已丢弃');
|
|
231
|
+
}
|
|
232
|
+
const current = recordOf(options.registry, request.checkoutId);
|
|
233
|
+
if (after.reviewId !== review.reviewId
|
|
234
|
+
|| after.isolatedHeadOid !== review.isolatedHeadOid
|
|
235
|
+
|| current.revision !== request.expectedRevision
|
|
236
|
+
|| current.delivery.state !== 'ready_for_review'
|
|
237
|
+
|| current.delivery.review.reviewId !== review.reviewId
|
|
238
|
+
|| current.delivery.review.isolatedFingerprint !== review.isolatedFingerprint)
|
|
239
|
+
return failure('stale_isolated', 'Ready 后 Isolated 内容已变化,Diff bytes 已丢弃');
|
|
240
|
+
return { ok: true, value: diff };
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
if (error instanceof ReviewDiffStaleError)
|
|
244
|
+
return failure('stale_isolated', error.message);
|
|
245
|
+
return consoleFailure(error);
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
preflight: request => outcome(async () => {
|
|
249
|
+
const record = await authorize(request.sessionId, request.checkoutId);
|
|
250
|
+
if (record.ownerSessionId !== request.sessionId)
|
|
251
|
+
throw domainError('not_owner', '只有 owner Isolated Session 可以执行同步预检');
|
|
252
|
+
if (record.revision !== request.expectedRevision)
|
|
253
|
+
throw domainError('stale_target', 'Session Target 已变化,请刷新');
|
|
254
|
+
const review = readyReview(record);
|
|
255
|
+
if (review.reviewId !== request.expectedReviewId)
|
|
256
|
+
throw domainError('stale_target', 'Review 身份已变化,请刷新');
|
|
257
|
+
const preflight = await options.module.preflight?.(request.sessionId, request.expectedRevision);
|
|
258
|
+
if (preflight === undefined)
|
|
259
|
+
throw domainError('git_error', '当前 SessionCheckoutModule 不支持验收预检');
|
|
260
|
+
return { preflight };
|
|
261
|
+
}),
|
|
262
|
+
preview: request => outcome(async () => {
|
|
263
|
+
const record = await authorize(request.sessionId, request.checkoutId);
|
|
264
|
+
if (record.ownerSessionId !== request.sessionId)
|
|
265
|
+
throw domainError('not_owner', '只有 owner Isolated Session 可以同步到 Local 验收');
|
|
266
|
+
if (record.revision !== request.expectedRevision)
|
|
267
|
+
throw domainError('stale_target', 'Session Target 已变化,请刷新');
|
|
268
|
+
const review = readyReview(record);
|
|
269
|
+
if (review.reviewId !== request.expectedReviewId)
|
|
270
|
+
throw domainError('stale_target', 'Review 身份已变化,请刷新');
|
|
271
|
+
const result = await options.module.operate({
|
|
272
|
+
action: 'preview', sessionId: request.sessionId, expectedRevision: request.expectedRevision,
|
|
273
|
+
});
|
|
274
|
+
if (result.status === 'error')
|
|
275
|
+
throw domainError(result.code, result.message);
|
|
276
|
+
if (result.status === 'conflict')
|
|
277
|
+
throw domainError('apply_conflict', 'Local Preview 预检发现内容冲突');
|
|
278
|
+
if (result.status !== 'previewed')
|
|
279
|
+
throw domainError('operation_not_allowed', 'Preview 返回了非预期状态');
|
|
280
|
+
return {
|
|
281
|
+
...(await mutationResponse(request.sessionId, request.checkoutId)),
|
|
282
|
+
changedFiles: [...result.changedFiles],
|
|
283
|
+
};
|
|
284
|
+
}),
|
|
285
|
+
rollbackPreview: request => outcome(async () => {
|
|
286
|
+
const record = await authorize(request.sessionId, request.checkoutId);
|
|
287
|
+
if (record.ownerSessionId !== request.sessionId)
|
|
288
|
+
throw domainError('not_owner', '只有 owner Isolated Session 可以撤回 Local Preview');
|
|
289
|
+
const result = await options.module.operate({
|
|
290
|
+
action: 'rollback_preview',
|
|
291
|
+
sessionId: request.sessionId,
|
|
292
|
+
expectedRevision: request.expectedRevision,
|
|
293
|
+
...(request.resumeRevision === undefined ? {} : { resumeRevision: request.resumeRevision }),
|
|
294
|
+
});
|
|
295
|
+
if (result.status === 'error')
|
|
296
|
+
throw domainError(result.code, result.message);
|
|
297
|
+
if (result.status !== 'preview_rolled_back' && result.status !== 'preview_detached') {
|
|
298
|
+
throw domainError('operation_not_allowed', 'Rollback Preview 返回了非预期状态');
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
...(await mutationResponse(request.sessionId, request.checkoutId)),
|
|
302
|
+
changedFiles: [...result.changedFiles],
|
|
303
|
+
};
|
|
304
|
+
}),
|
|
305
|
+
discard: request => outcome(async () => {
|
|
306
|
+
const record = await authorize(request.sessionId, request.checkoutId);
|
|
307
|
+
if (record.ownerSessionId !== request.sessionId && ownerSessionAvailable(record)) {
|
|
308
|
+
throw domainError('not_owner', 'Owner Session 已接管该 Worktree,只有 owner 可以 Discard');
|
|
309
|
+
}
|
|
310
|
+
if (record.ownerSessionId === request.sessionId) {
|
|
311
|
+
const result = await options.module.operate({
|
|
312
|
+
action: 'discard',
|
|
313
|
+
sessionId: request.sessionId,
|
|
314
|
+
expectedRevision: request.expectedRevision,
|
|
315
|
+
confirmDirty: request.confirmDirty,
|
|
316
|
+
...(request.rollbackPreview === undefined ? {} : { rollbackPreview: request.rollbackPreview }),
|
|
317
|
+
});
|
|
318
|
+
if (result.status === 'error')
|
|
319
|
+
throw domainError(result.code, result.message);
|
|
320
|
+
if (result.status === 'preview_detached') {
|
|
321
|
+
return { ...(await mutationResponse(request.sessionId, request.checkoutId)), changedFiles: [...result.changedFiles] };
|
|
322
|
+
}
|
|
323
|
+
if (result.status !== 'discarded')
|
|
324
|
+
throw domainError('operation_not_allowed', 'Discard 返回了非预期状态');
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
await options.module.manageManagedWorktreeForSession(request.sessionId, {
|
|
328
|
+
checkoutId: request.checkoutId,
|
|
329
|
+
expectedRevision: request.expectedRevision,
|
|
330
|
+
action: 'discard',
|
|
331
|
+
confirmDirty: request.confirmDirty,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
return mutationResponse(request.sessionId, request.checkoutId);
|
|
335
|
+
}),
|
|
336
|
+
finalize: async (request) => {
|
|
337
|
+
try {
|
|
338
|
+
const record = await authorize(request.sessionId, request.checkoutId);
|
|
339
|
+
if (record.ownerSessionId !== request.sessionId)
|
|
340
|
+
return failure('not_owner', '只有 owner Isolated Session 可以提交验收');
|
|
341
|
+
if (record.revision !== request.expectedRevision)
|
|
342
|
+
return failure('stale_target', 'Session Target 已变化,请刷新');
|
|
343
|
+
const review = readyReview(record);
|
|
344
|
+
if (review.reviewId !== request.expectedReviewId)
|
|
345
|
+
return failure('stale_target', 'Review 身份已变化,请刷新');
|
|
346
|
+
const commitMessage = request.commitMessage.trim();
|
|
347
|
+
if (!commitMessage || commitMessage.length > 500)
|
|
348
|
+
return failure('invalid_input', 'Commit Message 必须为 1–500 个字符');
|
|
349
|
+
const result = await options.module.operate({
|
|
350
|
+
sessionId: request.sessionId,
|
|
351
|
+
expectedRevision: request.expectedRevision,
|
|
352
|
+
action: 'finish',
|
|
353
|
+
expectedReviewId: request.expectedReviewId,
|
|
354
|
+
commitMessage,
|
|
355
|
+
retention: request.retention,
|
|
356
|
+
});
|
|
357
|
+
if (result.status === 'error')
|
|
358
|
+
return failure(result.code, result.message);
|
|
359
|
+
if (result.status === 'conflict')
|
|
360
|
+
return failure('apply_conflict', 'Local 应用发生冲突');
|
|
361
|
+
if (result.status !== 'finished')
|
|
362
|
+
return failure('operation_not_allowed', 'Finalize 返回了非预期状态');
|
|
363
|
+
return {
|
|
364
|
+
ok: true,
|
|
365
|
+
value: {
|
|
366
|
+
...(await mutationResponse(request.sessionId, request.checkoutId)),
|
|
367
|
+
changedFiles: [...result.changedFiles],
|
|
368
|
+
commitOid: result.commitOid,
|
|
369
|
+
},
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
return consoleFailure(error);
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
finalizePreview: async (request) => {
|
|
377
|
+
try {
|
|
378
|
+
const record = await authorize(request.sessionId, request.checkoutId);
|
|
379
|
+
if (record.ownerSessionId !== request.sessionId)
|
|
380
|
+
return failure('not_owner', '只有 owner Isolated Session 可以完成 Local Preview 验收');
|
|
381
|
+
if (record.revision !== request.expectedRevision)
|
|
382
|
+
return failure('stale_target', 'Session Target 已变化,请刷新');
|
|
383
|
+
const review = previewReview(record);
|
|
384
|
+
if (review.reviewId !== request.expectedReviewId)
|
|
385
|
+
return failure('stale_target', 'Review 身份已变化,请刷新');
|
|
386
|
+
const commitMessage = request.commitMessage.trim();
|
|
387
|
+
if (!commitMessage || commitMessage.length > 500)
|
|
388
|
+
return failure('invalid_input', 'Commit Message 必须为 1–500 个字符');
|
|
389
|
+
const result = await options.module.operate({
|
|
390
|
+
action: 'finalize_preview',
|
|
391
|
+
sessionId: request.sessionId,
|
|
392
|
+
expectedRevision: request.expectedRevision,
|
|
393
|
+
commitMessage,
|
|
394
|
+
retention: request.retention,
|
|
395
|
+
});
|
|
396
|
+
if (result.status === 'error')
|
|
397
|
+
return failure(result.code, result.message);
|
|
398
|
+
if (result.status === 'preview_detached') {
|
|
399
|
+
return {
|
|
400
|
+
ok: true,
|
|
401
|
+
value: {
|
|
402
|
+
...(await mutationResponse(request.sessionId, request.checkoutId)),
|
|
403
|
+
changedFiles: [...result.changedFiles],
|
|
404
|
+
},
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
if (result.status !== 'finished')
|
|
408
|
+
return failure('operation_not_allowed', 'Finalize Preview 返回了非预期状态');
|
|
409
|
+
return {
|
|
410
|
+
ok: true,
|
|
411
|
+
value: {
|
|
412
|
+
...(await mutationResponse(request.sessionId, request.checkoutId)),
|
|
413
|
+
changedFiles: [...result.changedFiles],
|
|
414
|
+
commitOid: result.commitOid,
|
|
415
|
+
},
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
return consoleFailure(error);
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
setRetention: request => outcome(async () => {
|
|
423
|
+
await authorize(request.sessionId, request.checkoutId);
|
|
424
|
+
await options.module.manageManagedWorktreeForSession(request.sessionId, {
|
|
425
|
+
checkoutId: request.checkoutId,
|
|
426
|
+
expectedRevision: request.expectedRevision,
|
|
427
|
+
action: 'set_retention',
|
|
428
|
+
retention: request.retention,
|
|
429
|
+
});
|
|
430
|
+
return mutationResponse(request.sessionId, request.checkoutId);
|
|
431
|
+
}),
|
|
432
|
+
retryCleanup: request => outcome(async () => {
|
|
433
|
+
await authorize(request.sessionId, request.checkoutId);
|
|
434
|
+
await options.module.manageManagedWorktreeForSession(request.sessionId, {
|
|
435
|
+
checkoutId: request.checkoutId,
|
|
436
|
+
expectedRevision: request.expectedRevision,
|
|
437
|
+
action: 'retry_cleanup',
|
|
438
|
+
});
|
|
439
|
+
return mutationResponse(request.sessionId, request.checkoutId);
|
|
440
|
+
}),
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
//# sourceMappingURL=control-plane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane.js","sourceRoot":"","sources":["../../src/console-host/control-plane.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type SessionCheckoutErrorCode } from '../types.js';
|
|
2
|
+
import type { WorktreeConsoleError, WorktreeConsoleOutcome } from '../console-contract.js';
|
|
3
|
+
export declare function domainError(code: SessionCheckoutErrorCode, message: string): Error;
|
|
4
|
+
export declare function consoleFailure(error: unknown): WorktreeConsoleOutcome<never>;
|
|
5
|
+
export declare function failure<T>(code: WorktreeConsoleError['code'], message: string, details?: WorktreeConsoleError['details']): WorktreeConsoleOutcome<T>;
|
|
6
|
+
export declare function outcome<T>(operation: () => Promise<T>): Promise<WorktreeConsoleOutcome<T>>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SESSION_CHECKOUT_ERROR_CODES } from '../types.js';
|
|
2
|
+
export function domainError(code, message) {
|
|
3
|
+
return Object.assign(new Error(message), { code });
|
|
4
|
+
}
|
|
5
|
+
export function consoleFailure(error) {
|
|
6
|
+
if (error instanceof Error
|
|
7
|
+
&& 'code' in error
|
|
8
|
+
&& typeof error.code === 'string'
|
|
9
|
+
&& SESSION_CHECKOUT_ERROR_CODES.includes(error.code)) {
|
|
10
|
+
return { ok: false, error: { code: error.code, message: error.message } };
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
ok: false,
|
|
14
|
+
error: {
|
|
15
|
+
code: 'git_error',
|
|
16
|
+
message: error instanceof Error ? error.message : 'Worktree Console 操作失败',
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function failure(code, message, details) {
|
|
21
|
+
return { ok: false, error: { code, message, ...(details === undefined ? {} : { details }) } };
|
|
22
|
+
}
|
|
23
|
+
export async function outcome(operation) {
|
|
24
|
+
try {
|
|
25
|
+
return { ok: true, value: await operation() };
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return consoleFailure(error);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/console-host/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAiC,MAAM,aAAa,CAAA;AAGzF,MAAM,UAAU,WAAW,CAAC,IAA8B,EAAE,OAAe;IACzE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IACE,KAAK,YAAY,KAAK;WACnB,MAAM,IAAI,KAAK;WACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;WAC7B,4BAAkD,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAC3E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAgC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAA;IACvG,CAAC;IACD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB;SAC1E;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,IAAkC,EAAE,OAAe,EAAE,OAAyC;IACvH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAA;AAC/F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,SAA2B;IAC1D,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,SAAS,EAAE,EAAE,CAAA;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,cAAc,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type WorktreeConsoleCapabilities, type WorktreeConsoleTargetDetails, type WorktreeConsoleTargetSummary } from '../console-contract.js';
|
|
2
|
+
import type { GitCheckoutSnapshot, ManagedCheckoutRecord } from '../ports.js';
|
|
3
|
+
import type { ManagedWorktreeSummaryView, SessionTargetView } from '../types.js';
|
|
4
|
+
export declare function capabilities(record: ManagedCheckoutRecord, callerSessionId: string, ownerSessionAvailable?: boolean): WorktreeConsoleCapabilities;
|
|
5
|
+
export declare function projectRecord(record: ManagedCheckoutRecord, callerSessionId: string, observed?: {
|
|
6
|
+
snapshot?: GitCheckoutSnapshot;
|
|
7
|
+
dirty?: boolean;
|
|
8
|
+
summary?: ManagedWorktreeSummaryView;
|
|
9
|
+
ownerSessionAvailable?: boolean;
|
|
10
|
+
}): WorktreeConsoleTargetSummary;
|
|
11
|
+
export declare function projectDetails(record: ManagedCheckoutRecord, callerSessionId: string, managedRoot: string | null, snapshot?: GitCheckoutSnapshot, dirty?: boolean, ownerSessionAvailable?: boolean): WorktreeConsoleTargetDetails;
|
|
12
|
+
export declare function projectLocal(target: SessionTargetView, sessionId: string): WorktreeConsoleTargetDetails;
|