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,127 @@
|
|
|
1
|
+
/** Pure replay-stable ToolView models derived only from logged call/result slices. */
|
|
2
|
+
function textContent(block) {
|
|
3
|
+
if (!block.kind)
|
|
4
|
+
return null;
|
|
5
|
+
const parts = (block.content ?? []).map((item) => item.type === 'text'
|
|
6
|
+
? String(item.text ?? '')
|
|
7
|
+
: JSON.stringify(item));
|
|
8
|
+
if (parts.length === 0 && block.error)
|
|
9
|
+
parts.push(`${block.error.name ?? 'Error'}: ${block.error.code ?? 'unknown'}`);
|
|
10
|
+
return parts.join('\n') || null;
|
|
11
|
+
}
|
|
12
|
+
function parseJson(value) {
|
|
13
|
+
if (!value)
|
|
14
|
+
return null;
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(value);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function lifecycle(block) {
|
|
23
|
+
if (!block.kind)
|
|
24
|
+
return 'running';
|
|
25
|
+
if (block.error?.code === 'interrupted')
|
|
26
|
+
return 'stopped';
|
|
27
|
+
return block.isError ? 'error' : 'ok';
|
|
28
|
+
}
|
|
29
|
+
function isRecord(value) {
|
|
30
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
31
|
+
}
|
|
32
|
+
function stringField(record, key) {
|
|
33
|
+
return typeof record[key] === 'string' && record[key] !== '' ? record[key] : null;
|
|
34
|
+
}
|
|
35
|
+
export function parseCreateTool(block) {
|
|
36
|
+
const state = lifecycle(block);
|
|
37
|
+
const raw = textContent(block);
|
|
38
|
+
const parsed = parseJson(raw ?? undefined);
|
|
39
|
+
if (state === 'running')
|
|
40
|
+
return { lifecycle: state, payload: null, args: null, error: null };
|
|
41
|
+
if (state !== 'ok')
|
|
42
|
+
return { lifecycle: state, payload: null, args: null, error: raw ?? 'Worktree creation failed.' };
|
|
43
|
+
if (!isRecord(parsed)
|
|
44
|
+
|| parsed.kind !== 'worktree_target_created'
|
|
45
|
+
|| !stringField(parsed, 'checkoutId')
|
|
46
|
+
|| !stringField(parsed, 'targetSessionId')
|
|
47
|
+
|| !stringField(parsed, 'managedRoot')
|
|
48
|
+
|| !stringField(parsed, 'phase')
|
|
49
|
+
|| !stringField(parsed, 'currentOid')
|
|
50
|
+
|| !stringField(parsed, 'sourceSessionId')) {
|
|
51
|
+
return { lifecycle: 'error', payload: null, args: null, error: 'Malformed Worktree create result.' };
|
|
52
|
+
}
|
|
53
|
+
return { lifecycle: state, payload: parsed, args: null, error: null };
|
|
54
|
+
}
|
|
55
|
+
function reviewArgs(value) {
|
|
56
|
+
if (!isRecord(value))
|
|
57
|
+
return null;
|
|
58
|
+
const summary = stringField(value, 'summary');
|
|
59
|
+
const validationStatus = value.validationStatus;
|
|
60
|
+
const suggestedCommitMessage = stringField(value, 'suggestedCommitMessage');
|
|
61
|
+
if (!summary
|
|
62
|
+
|| (validationStatus !== 'passed' && validationStatus !== 'failed' && validationStatus !== 'partial' && validationStatus !== 'not_run')
|
|
63
|
+
|| !suggestedCommitMessage
|
|
64
|
+
|| !Array.isArray(value.tests))
|
|
65
|
+
return null;
|
|
66
|
+
const tests = [];
|
|
67
|
+
for (const item of value.tests) {
|
|
68
|
+
if (!isRecord(item)
|
|
69
|
+
|| !stringField(item, 'command')
|
|
70
|
+
|| (item.status !== 'passed' && item.status !== 'failed' && item.status !== 'not_run')
|
|
71
|
+
|| (item.summary !== undefined && typeof item.summary !== 'string'))
|
|
72
|
+
return null;
|
|
73
|
+
tests.push({
|
|
74
|
+
command: item.command,
|
|
75
|
+
status: item.status,
|
|
76
|
+
...(typeof item.summary === 'string' && item.summary !== '' ? { summary: item.summary } : {}),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if ((value.details !== undefined && typeof value.details !== 'string')
|
|
80
|
+
|| (value.validationSummary !== undefined && typeof value.validationSummary !== 'string'))
|
|
81
|
+
return null;
|
|
82
|
+
return {
|
|
83
|
+
summary,
|
|
84
|
+
validationStatus,
|
|
85
|
+
tests,
|
|
86
|
+
suggestedCommitMessage,
|
|
87
|
+
...(typeof value.details === 'string' && value.details !== '' ? { details: value.details } : {}),
|
|
88
|
+
...(typeof value.validationSummary === 'string' && value.validationSummary !== '' ? { validationSummary: value.validationSummary } : {}),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function parseReviewTool(block) {
|
|
92
|
+
const state = lifecycle(block);
|
|
93
|
+
const raw = textContent(block);
|
|
94
|
+
const parsed = parseJson(raw ?? undefined);
|
|
95
|
+
const argsRaw = block.kind ? block.call?.argsRaw : block.argsRaw;
|
|
96
|
+
const parsedArgs = reviewArgs(parseJson(argsRaw));
|
|
97
|
+
if (state === 'running')
|
|
98
|
+
return { lifecycle: state, payload: null, args: parsedArgs, error: null };
|
|
99
|
+
if (state !== 'ok')
|
|
100
|
+
return { lifecycle: state, payload: null, args: parsedArgs, error: raw ?? 'Ready for Review failed.' };
|
|
101
|
+
if (!isRecord(parsed)
|
|
102
|
+
|| parsed.kind !== 'worktree_ready_for_review'
|
|
103
|
+
|| parsed.state !== 'ready_for_review'
|
|
104
|
+
|| !stringField(parsed, 'reviewId')
|
|
105
|
+
|| typeof parsed.revision !== 'number'
|
|
106
|
+
|| !Array.isArray(parsed.changedFiles)
|
|
107
|
+
|| parsed.changedFiles.some((item) => typeof item !== 'string')) {
|
|
108
|
+
return { lifecycle: 'error', payload: null, args: null, error: 'Malformed Ready for Review result.' };
|
|
109
|
+
}
|
|
110
|
+
if (!parsedArgs) {
|
|
111
|
+
return { lifecycle: 'error', payload: null, args: null, error: 'Malformed Ready for Review arguments.' };
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
lifecycle: state,
|
|
115
|
+
payload: {
|
|
116
|
+
kind: 'worktree_ready_for_review',
|
|
117
|
+
state: 'ready_for_review',
|
|
118
|
+
reviewId: parsed.reviewId,
|
|
119
|
+
revision: parsed.revision,
|
|
120
|
+
iteration: typeof parsed.iteration === 'number' && Number.isInteger(parsed.iteration) && parsed.iteration >= 0 ? parsed.iteration : 0,
|
|
121
|
+
changedFiles: [...parsed.changedFiles],
|
|
122
|
+
},
|
|
123
|
+
args: parsedArgs,
|
|
124
|
+
error: null,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/client/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { WorktreeConsoleAdapter, WorktreeConsoleTargetDetails } from '../../console-contract.js';
|
|
2
|
+
import type { PreSessionDraftActions, PreSessionDraftState, PreparePreSessionWorktreeRequest } from './controller.js';
|
|
3
|
+
export interface PreSessionWorktreeToggleProps {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
session: {
|
|
6
|
+
composerPhase: string;
|
|
7
|
+
};
|
|
8
|
+
input: PreSessionDraftState;
|
|
9
|
+
inputActions: PreSessionDraftActions;
|
|
10
|
+
adapter: WorktreeConsoleAdapter;
|
|
11
|
+
controller: {
|
|
12
|
+
prepare(request: PreparePreSessionWorktreeRequest): Promise<WorktreeConsoleTargetDetails>;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** Blank-session Worktree switch mounted in Harness's public composer tool row. */
|
|
16
|
+
export declare function PreSessionWorktreeToggle({ sessionId, session, input, inputActions, adapter, controller, }: PreSessionWorktreeToggleProps): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { Modal } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
4
|
+
function errorMessage(value) {
|
|
5
|
+
return value instanceof Error ? value.message : String(value);
|
|
6
|
+
}
|
|
7
|
+
function snapshotInput(input) {
|
|
8
|
+
return {
|
|
9
|
+
...input,
|
|
10
|
+
imageIds: [...input.imageIds],
|
|
11
|
+
occurrences: [...input.occurrences],
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function confirmationDescription(input) {
|
|
15
|
+
const attachmentText = input.imageIds.length === 1
|
|
16
|
+
? '1 个附件'
|
|
17
|
+
: `${input.imageIds.length} 个附件`;
|
|
18
|
+
if (input.draft.trim() !== '' && input.imageIds.length > 0) {
|
|
19
|
+
return `当前输入内容和 ${attachmentText}将移动到新的 Worktree 会话。`;
|
|
20
|
+
}
|
|
21
|
+
if (input.imageIds.length > 0)
|
|
22
|
+
return `${attachmentText}将移动到新的 Worktree 会话。`;
|
|
23
|
+
if (input.draft.trim() !== '')
|
|
24
|
+
return '当前输入内容将移动到新的 Worktree 会话。';
|
|
25
|
+
return '将创建新的 Worktree 会话;当前 Local 会话不会收到消息。';
|
|
26
|
+
}
|
|
27
|
+
/** Blank-session Worktree switch mounted in Harness's public composer tool row. */
|
|
28
|
+
export function PreSessionWorktreeToggle({ sessionId, session, input, inputActions, adapter, controller, }) {
|
|
29
|
+
const [target, setTarget] = useState(null);
|
|
30
|
+
const [state, setState] = useState('loading');
|
|
31
|
+
const [error, setError] = useState(null);
|
|
32
|
+
const [pendingInput, setPendingInput] = useState(null);
|
|
33
|
+
const latestInput = useRef(input);
|
|
34
|
+
latestInput.current = input;
|
|
35
|
+
const blank = session.composerPhase === 'blank';
|
|
36
|
+
const refreshCurrent = useCallback(async () => {
|
|
37
|
+
setState('loading');
|
|
38
|
+
setError(null);
|
|
39
|
+
const outcome = await adapter.current({ sessionId });
|
|
40
|
+
if (!outcome.ok) {
|
|
41
|
+
setTarget(null);
|
|
42
|
+
setState('error');
|
|
43
|
+
setError(`${outcome.error.code}: ${outcome.error.message}`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
setTarget(outcome.value.target);
|
|
47
|
+
setState('idle');
|
|
48
|
+
}, [adapter, sessionId]);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (!blank)
|
|
51
|
+
return;
|
|
52
|
+
let active = true;
|
|
53
|
+
void adapter.current({ sessionId }).then((outcome) => {
|
|
54
|
+
if (!active)
|
|
55
|
+
return;
|
|
56
|
+
if (!outcome.ok) {
|
|
57
|
+
setTarget(null);
|
|
58
|
+
setState('error');
|
|
59
|
+
setError(`${outcome.error.code}: ${outcome.error.message}`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
setTarget(outcome.value.target);
|
|
63
|
+
setState('idle');
|
|
64
|
+
setError(null);
|
|
65
|
+
});
|
|
66
|
+
return () => { active = false; };
|
|
67
|
+
}, [adapter, blank, sessionId]);
|
|
68
|
+
if (!blank)
|
|
69
|
+
return null;
|
|
70
|
+
const selected = target?.state !== undefined && target.state !== 'local';
|
|
71
|
+
const canCreate = target?.state === 'local' && target.capabilities.create;
|
|
72
|
+
const busy = state === 'loading' || state === 'preparing';
|
|
73
|
+
const retryingLookup = state === 'error' && target === null;
|
|
74
|
+
const disabled = busy || selected || (!canCreate && !retryingLookup) || input.phase !== 'plain';
|
|
75
|
+
const checked = selected || pendingInput !== null || state === 'preparing';
|
|
76
|
+
const status = state === 'preparing'
|
|
77
|
+
? '正在创建…'
|
|
78
|
+
: selected
|
|
79
|
+
? '已创建'
|
|
80
|
+
: pendingInput !== null
|
|
81
|
+
? '待确认'
|
|
82
|
+
: state === 'loading'
|
|
83
|
+
? '检查中…'
|
|
84
|
+
: state === 'error'
|
|
85
|
+
? '重试'
|
|
86
|
+
: 'Local';
|
|
87
|
+
const beginConfirmation = async () => {
|
|
88
|
+
if (disabled)
|
|
89
|
+
return;
|
|
90
|
+
if (retryingLookup) {
|
|
91
|
+
await refreshCurrent();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
setError(null);
|
|
95
|
+
setPendingInput(snapshotInput(input));
|
|
96
|
+
};
|
|
97
|
+
const cancelConfirmation = () => {
|
|
98
|
+
if (state === 'preparing')
|
|
99
|
+
return;
|
|
100
|
+
setPendingInput(null);
|
|
101
|
+
setError(null);
|
|
102
|
+
setState('idle');
|
|
103
|
+
};
|
|
104
|
+
const confirm = async () => {
|
|
105
|
+
const captured = pendingInput;
|
|
106
|
+
if (captured === null || state === 'preparing')
|
|
107
|
+
return;
|
|
108
|
+
setState('preparing');
|
|
109
|
+
setError(null);
|
|
110
|
+
try {
|
|
111
|
+
const prepared = await controller.prepare({
|
|
112
|
+
sessionId,
|
|
113
|
+
input: captured,
|
|
114
|
+
currentInput: () => latestInput.current,
|
|
115
|
+
inputActions,
|
|
116
|
+
});
|
|
117
|
+
setTarget(prepared);
|
|
118
|
+
setPendingInput(null);
|
|
119
|
+
setState('idle');
|
|
120
|
+
}
|
|
121
|
+
catch (cause) {
|
|
122
|
+
setState('error');
|
|
123
|
+
setError(errorMessage(cause));
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
return (_jsxs("span", { className: "dsh-wt-pre-session", "data-state": state, children: [_jsxs("button", { type: "button", role: "switch", "aria-label": "Worktree", "aria-checked": checked, "aria-describedby": error && pendingInput === null ? `dsh-wt-pre-session-error-${sessionId}` : undefined, className: "dsh-wt-pre-session-switch", disabled: disabled, onClick: () => { void beginConfirmation(); }, children: [_jsx("span", { className: "dsh-wt-pre-session-check", "aria-hidden": true, children: checked ? '✓' : '' }), _jsx("span", { children: "Worktree" }), _jsx("span", { className: "dsh-wt-pre-session-state", "aria-live": "polite", children: status })] }), error && pendingInput === null ? (_jsx("span", { id: `dsh-wt-pre-session-error-${sessionId}`, className: "dsh-wt-pre-session-error", role: "alert", children: error })) : null, _jsxs(Modal, { open: pendingInput !== null, onClose: cancelConfirmation, title: "\u5728 Worktree \u4E2D\u5F00\u59CB\uFF1F", closeLabel: "\u5173\u95ED", description: pendingInput === null ? '' : confirmationDescription(pendingInput), footer: (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "dsh-wt-button", disabled: state === 'preparing', onClick: cancelConfirmation, children: "\u53D6\u6D88" }), _jsx("button", { type: "button", className: "dsh-wt-button dsh-wt-primary", disabled: state === 'preparing', onClick: () => { void confirm(); }, children: state === 'preparing' ? '正在创建…' : '创建并切换' })] })), children: [_jsx("p", { className: "dsh-wt-pre-session-note", children: "Local \u4F1A\u8BDD\u4E0D\u4F1A\u6536\u5230\u8FD9\u6761\u6D88\u606F\uFF1B\u5207\u6362\u540E\u8BF7\u5728\u65B0\u4F1A\u8BDD\u4E2D\u4F7F\u7528\u539F\u751F\u53D1\u9001\u6309\u94AE\u3002" }), error ? _jsx("p", { className: "dsh-wt-error", role: "alert", children: error }) : null] })] }));
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=PreSessionWorktreeToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreSessionWorktreeToggle.js","sourceRoot":"","sources":["../../../src/client/pre-session/PreSessionWorktreeToggle.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { WorktreeConsoleAdapter, WorktreeConsoleTargetDetails } from '../../console-contract.js';
|
|
2
|
+
import type { PreSessionWorktreeServices } from '../actions.js';
|
|
3
|
+
export interface PreSessionDraftState {
|
|
4
|
+
readonly draft: string;
|
|
5
|
+
readonly imageIds: readonly string[];
|
|
6
|
+
readonly occurrences: readonly unknown[];
|
|
7
|
+
readonly phase: string;
|
|
8
|
+
/** Monotonic Harness input revision captured when the confirmation opened. */
|
|
9
|
+
readonly draftRev?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface PreSessionDraftActions {
|
|
12
|
+
setDraft(text: string): void;
|
|
13
|
+
addImages(ids: readonly string[]): boolean;
|
|
14
|
+
removeImage(id: string): void;
|
|
15
|
+
}
|
|
16
|
+
export interface PreparePreSessionWorktreeRequest {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
/** Immutable confirmation-time snapshot moved into the target. */
|
|
19
|
+
input: PreSessionDraftState;
|
|
20
|
+
/** Live source state used for the final compare-and-clear boundary. */
|
|
21
|
+
currentInput?: () => PreSessionDraftState;
|
|
22
|
+
inputActions: PreSessionDraftActions;
|
|
23
|
+
}
|
|
24
|
+
export declare class PreSessionWorktreeError extends Error {
|
|
25
|
+
readonly recoveryRequired: boolean;
|
|
26
|
+
constructor(message: string, recoveryRequired?: boolean);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Prepares an isolated blank Session before the normal Harness composer sends.
|
|
30
|
+
* The controller never sends a prompt; after it opens the target, the resident
|
|
31
|
+
* composer remains the sole submission path.
|
|
32
|
+
*/
|
|
33
|
+
export declare class PreSessionWorktreeController {
|
|
34
|
+
private readonly adapter;
|
|
35
|
+
private readonly services;
|
|
36
|
+
private readonly inflight;
|
|
37
|
+
constructor(adapter: WorktreeConsoleAdapter, services: PreSessionWorktreeServices);
|
|
38
|
+
prepare(request: PreparePreSessionWorktreeRequest): Promise<WorktreeConsoleTargetDetails>;
|
|
39
|
+
private run;
|
|
40
|
+
private rollback;
|
|
41
|
+
}
|
|
42
|
+
export declare function createPreSessionWorktreeController(adapter: WorktreeConsoleAdapter, services: PreSessionWorktreeServices): PreSessionWorktreeController;
|
|
@@ -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 {};
|