dsh-git-worktree 0.1.1 → 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.
Files changed (133) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/LICENSE +21 -21
  3. package/README.md +115 -37
  4. package/README.zh.md +115 -37
  5. package/cordis.patch.yml +7 -7
  6. package/lib/adapters/registry.js +40 -0
  7. package/lib/adapters/registry.js.map +1 -1
  8. package/lib/adapters/safe-file.js +34 -4
  9. package/lib/adapters/safe-file.js.map +1 -1
  10. package/lib/client/WorktreeCreateRow.d.ts +7 -0
  11. package/lib/client/WorktreeCreateRow.js +26 -0
  12. package/lib/client/WorktreeCreateRow.js.map +1 -0
  13. package/lib/client/WorktreeReviewRow.d.ts +11 -0
  14. package/lib/client/WorktreeReviewRow.js +67 -0
  15. package/lib/client/WorktreeReviewRow.js.map +1 -0
  16. package/lib/client/actions.d.ts +86 -0
  17. package/lib/client/actions.js +35 -0
  18. package/lib/client/actions.js.map +1 -0
  19. package/lib/client/console-remote/adapter.d.ts +3 -0
  20. package/lib/client/console-remote/adapter.js +59 -0
  21. package/lib/client/console-remote/adapter.js.map +1 -0
  22. package/lib/client/console-remote/index.d.ts +18 -0
  23. package/lib/client/console-remote/index.js +17 -0
  24. package/lib/client/console-remote/index.js.map +1 -0
  25. package/lib/client/index.d.ts +17 -0
  26. package/lib/client/index.js +44 -0
  27. package/lib/client/index.js.map +1 -0
  28. package/lib/client/model.d.ts +68 -0
  29. package/lib/client/model.js +127 -0
  30. package/lib/client/model.js.map +1 -0
  31. package/lib/client/pre-session/PreSessionWorktreeToggle.d.ts +16 -0
  32. package/lib/client/pre-session/PreSessionWorktreeToggle.js +128 -0
  33. package/lib/client/pre-session/PreSessionWorktreeToggle.js.map +1 -0
  34. package/lib/client/pre-session/controller.d.ts +42 -0
  35. package/lib/client/pre-session/controller.js +149 -0
  36. package/lib/client/pre-session/controller.js.map +1 -0
  37. package/lib/client/pre-session/index.d.ts +15 -0
  38. package/lib/client/pre-session/index.js +16 -0
  39. package/lib/client/pre-session/index.js.map +1 -0
  40. package/lib/client/review-console/ReviewActions.d.ts +15 -0
  41. package/lib/client/review-console/ReviewActions.js +219 -0
  42. package/lib/client/review-console/ReviewActions.js.map +1 -0
  43. package/lib/client/review-console/WorktreeReviewPanel.d.ts +20 -0
  44. package/lib/client/review-console/WorktreeReviewPanel.js +75 -0
  45. package/lib/client/review-console/WorktreeReviewPanel.js.map +1 -0
  46. package/lib/client/review-console/index.d.ts +8 -0
  47. package/lib/client/review-console/index.js +22 -0
  48. package/lib/client/review-console/index.js.map +1 -0
  49. package/lib/client/review-console/review-console.styles.d.ts +1 -0
  50. package/lib/client/review-console/review-console.styles.js +81 -0
  51. package/lib/client/review-console/review-console.styles.js.map +1 -0
  52. package/lib/client/review-console/status-events.d.ts +3 -0
  53. package/lib/client/review-console/status-events.js +6 -0
  54. package/lib/client/review-console/status-events.js.map +1 -0
  55. package/lib/client/styles.d.ts +1 -0
  56. package/lib/client/styles.js +78 -0
  57. package/lib/client/styles.js.map +1 -0
  58. package/lib/client/target-console/TargetStatusAction.d.ts +7 -0
  59. package/lib/client/target-console/TargetStatusAction.js +46 -0
  60. package/lib/client/target-console/TargetStatusAction.js.map +1 -0
  61. package/lib/client/target-console/WorktreeConsoleView.d.ts +9 -0
  62. package/lib/client/target-console/WorktreeConsoleView.js +362 -0
  63. package/lib/client/target-console/WorktreeConsoleView.js.map +1 -0
  64. package/lib/client/target-console/WorktreeReviewStatus.d.ts +9 -0
  65. package/lib/client/target-console/WorktreeReviewStatus.js +91 -0
  66. package/lib/client/target-console/WorktreeReviewStatus.js.map +1 -0
  67. package/lib/client/target-console/index.d.ts +14 -0
  68. package/lib/client/target-console/index.js +23 -0
  69. package/lib/client/target-console/index.js.map +1 -0
  70. package/lib/client/target-console/target-console.styles.d.ts +1 -0
  71. package/lib/client/target-console/target-console.styles.js +130 -0
  72. package/lib/client/target-console/target-console.styles.js.map +1 -0
  73. package/lib/client.js +6813 -0
  74. package/lib/commands.d.ts +2 -4
  75. package/lib/commands.js +54 -28
  76. package/lib/commands.js.map +1 -1
  77. package/lib/console-contract.d.ts +236 -0
  78. package/lib/console-contract.js +86 -0
  79. package/lib/console-contract.js.map +1 -0
  80. package/lib/console-host/control-plane.d.ts +29 -0
  81. package/lib/console-host/control-plane.js +443 -0
  82. package/lib/console-host/control-plane.js.map +1 -0
  83. package/lib/console-host/errors.d.ts +6 -0
  84. package/lib/console-host/errors.js +31 -0
  85. package/lib/console-host/errors.js.map +1 -0
  86. package/lib/console-host/projection.d.ts +12 -0
  87. package/lib/console-host/projection.js +131 -0
  88. package/lib/console-host/projection.js.map +1 -0
  89. package/lib/console-host/review-diff.d.ts +18 -0
  90. package/lib/console-host/review-diff.js +176 -0
  91. package/lib/console-host/review-diff.js.map +1 -0
  92. package/lib/console-host/service.d.ts +24 -0
  93. package/lib/console-host/service.js +131 -0
  94. package/lib/console-host/service.js.map +1 -0
  95. package/lib/console-remote/descriptors.d.ts +3 -0
  96. package/lib/console-remote/descriptors.js +96 -0
  97. package/lib/console-remote/descriptors.js.map +1 -0
  98. package/lib/console-remote/remote.d.ts +27 -0
  99. package/lib/console-remote/remote.js +4 -0
  100. package/lib/console-remote/remote.js.map +1 -0
  101. package/lib/console-remote/schemas.d.ts +29 -0
  102. package/lib/console-remote/schemas.js +143 -0
  103. package/lib/console-remote/schemas.js.map +1 -0
  104. package/lib/console-remote/typert.d.ts +3 -0
  105. package/lib/console-remote/typert.js +14 -0
  106. package/lib/console-remote/typert.js.map +1 -0
  107. package/lib/index.d.ts +22 -6
  108. package/lib/index.js +28 -10
  109. package/lib/index.js.map +1 -1
  110. package/lib/managed-worktree-path.d.ts +14 -13
  111. package/lib/managed-worktree-path.js +32 -22
  112. package/lib/managed-worktree-path.js.map +1 -1
  113. package/lib/ports.d.ts +37 -1
  114. package/lib/session-checkout-apply.d.ts +54 -1
  115. package/lib/session-checkout-apply.js +318 -28
  116. package/lib/session-checkout-apply.js.map +1 -1
  117. package/lib/session-checkout-module.js +853 -33
  118. package/lib/session-checkout-module.js.map +1 -1
  119. package/lib/session-target-context.d.ts +6 -0
  120. package/lib/session-target-context.js +16 -0
  121. package/lib/session-target-context.js.map +1 -0
  122. package/lib/tools.d.ts +5 -6
  123. package/lib/tools.js +43 -233
  124. package/lib/tools.js.map +1 -1
  125. package/lib/types.d.ts +57 -11
  126. package/lib/types.js +6 -6
  127. package/lib/types.js.map +1 -1
  128. package/package.json +116 -67
  129. package/scripts/check-publish.mjs +193 -0
  130. package/scripts/clean-lib.mjs +7 -0
  131. package/scripts/dev-dsh-lib.mjs +453 -0
  132. package/scripts/dev-dsh.mjs +89 -0
  133. package/scripts/dsh-source-runner.mjs +14 -0
@@ -6,6 +6,36 @@
6
6
  * - 读取:主文件 → .tmp 残留 → .bak 回退,多层容错
7
7
  */
8
8
  import { writeFileSync, renameSync, existsSync, copyFileSync, readFileSync, unlinkSync } from 'node:fs';
9
+ const RETRYABLE_RENAME_CODES = new Set(process.platform === 'win32'
10
+ ? ['EBUSY', 'EPERM', 'EACCES', 'ENOTEMPTY']
11
+ : ['EBUSY', 'ENOTEMPTY']);
12
+ function sleepSync(milliseconds) {
13
+ try {
14
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);
15
+ }
16
+ catch {
17
+ const startedAt = Date.now();
18
+ while (Date.now() - startedAt < milliseconds) { /* fallback for runtimes without SharedArrayBuffer */ }
19
+ }
20
+ }
21
+ /** Preserve atomic rename semantics while tolerating transient Windows file-handle races. */
22
+ function renameAtomicWithRetry(source, target, maxAttempts = 5) {
23
+ let lastError;
24
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
25
+ try {
26
+ renameSync(source, target);
27
+ return;
28
+ }
29
+ catch (error) {
30
+ lastError = error;
31
+ const code = error.code;
32
+ if (!code || !RETRYABLE_RENAME_CODES.has(code) || attempt === maxAttempts)
33
+ break;
34
+ sleepSync(20 * 2 ** (attempt - 1));
35
+ }
36
+ }
37
+ throw lastError;
38
+ }
9
39
  /**
10
40
  * 原子写入 JSON 文件:write-to-temp → rename
11
41
  * 写入前自动保留 .bak 备份
@@ -24,14 +54,14 @@ export function writeJsonFileAtomic(filePath, data, skipBackup = false) {
24
54
  }
25
55
  // 写入临时文件
26
56
  writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf-8');
27
- // 原子重命名(POSIX rename 是原子操作)
28
- renameSync(tmpPath, filePath);
57
+ // 原子重命名;Windows 短暂文件句柄占用时保持原子语义并有限重试。
58
+ renameAtomicWithRetry(tmpPath, filePath);
29
59
  }
30
60
  /** 原子重写文本文件(用于 JSONL 会话等非单个 JSON 文档)。 */
31
61
  export function writeTextFileAtomic(filePath, content) {
32
62
  const tmpPath = filePath + '.tmp';
33
63
  writeFileSync(tmpPath, content, 'utf-8');
34
- renameSync(tmpPath, filePath);
64
+ renameAtomicWithRetry(tmpPath, filePath);
35
65
  }
36
66
  /**
37
67
  * 安全读取 JSON 索引文件
@@ -59,7 +89,7 @@ export function readJsonFileSafe(filePath) {
59
89
  if (raw.trim().length > 0) {
60
90
  const parsed = JSON.parse(raw);
61
91
  // .tmp 有效 → 提升为主文件
62
- renameSync(tmpPath, filePath);
92
+ renameAtomicWithRetry(tmpPath, filePath);
63
93
  console.log(`[数据恢复] 从 .tmp 文件恢复: ${filePath}`);
64
94
  return parsed;
65
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"safe-file.js","sourceRoot":"","sources":["../../src/adapters/safe-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"safe-file.js","sourceRoot":"","sources":["../../src/adapters/safe-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type WorktreeClientServices } from './actions.js';
2
+ import { type ToolCallViewPropsLike } from './model.js';
3
+ interface Props extends ToolCallViewPropsLike {
4
+ services: WorktreeClientServices;
5
+ }
6
+ export declare function WorktreeCreateRow({ block, services }: Props): import("react").JSX.Element;
7
+ export {};
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { openIsolatedTarget } from './actions.js';
4
+ import { parseCreateTool } from './model.js';
5
+ export function WorktreeCreateRow({ block, services }) {
6
+ const model = parseCreateTool(block);
7
+ const [openState, setOpenState] = useState('idle');
8
+ const [openError, setOpenError] = useState(null);
9
+ const payload = model.payload;
10
+ const state = model.lifecycle === 'running' ? 'running' : model.lifecycle === 'ok' ? 'ok' : 'error';
11
+ const openTarget = async () => {
12
+ if (!payload || openState === 'opening')
13
+ return;
14
+ setOpenState('opening');
15
+ setOpenError(null);
16
+ try {
17
+ await openIsolatedTarget(services, payload);
18
+ }
19
+ catch (error) {
20
+ setOpenState('error');
21
+ setOpenError(error instanceof Error ? error.message : String(error));
22
+ }
23
+ };
24
+ return (_jsxs("section", { className: "dsh-wt-card", "data-tool": "worktree_create", "data-state": state, "aria-label": "\u9694\u79BB Session Target", children: [_jsxs("header", { className: "dsh-wt-head", children: [_jsx("span", { className: "dsh-wt-mark", "aria-hidden": true }), _jsx("strong", { className: "dsh-wt-title", children: "\u9694\u79BB Session Target" }), _jsx("span", { className: "dsh-wt-subtitle", children: model.lifecycle === 'running' ? '正在创建唯一 Worktree…' : payload ? '已就绪,等待打开' : '创建失败' })] }), payload ? (_jsxs("div", { className: "dsh-wt-body", children: [_jsxs("div", { className: "dsh-wt-grid", children: [_jsx("span", { className: "dsh-wt-label", children: "Checkout" }), _jsx("span", { className: "dsh-wt-value dsh-wt-code", children: payload.checkoutId }), _jsx("span", { className: "dsh-wt-label", children: "\u57FA\u7EBF" }), _jsx("span", { className: "dsh-wt-value dsh-wt-code", children: payload.currentOid.slice(0, 12) }), _jsx("span", { className: "dsh-wt-label", children: "\u5DE5\u4F5C\u533A" }), _jsx("button", { type: "button", className: "dsh-wt-value dsh-wt-code dsh-wt-path", onClick: () => void services.workspaces.openPath(payload.managedRoot), children: payload.managedRoot })] }), _jsxs("div", { className: "dsh-wt-actions", children: [_jsx("button", { type: "button", className: "dsh-wt-button dsh-wt-primary", disabled: openState === 'opening', onClick: () => void openTarget(), children: openState === 'opening' ? '正在打开…' : openState === 'error' ? '重试打开隔离会话' : '打开隔离会话' }), _jsx("span", { className: "dsh-wt-status", children: "\u5F53\u524D Local Session \u4E0D\u4F1A\u6539\u7ED1 cwd\u3002" })] }), openError ? _jsx("div", { className: "dsh-wt-error", role: "alert", children: openError }) : null] })) : model.error ? (_jsx("div", { className: "dsh-wt-body", children: _jsx("div", { className: "dsh-wt-error", role: "alert", children: model.error }) })) : null] }));
25
+ }
26
+ //# sourceMappingURL=WorktreeCreateRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorktreeCreateRow.js","sourceRoot":"","sources":["../../src/client/WorktreeCreateRow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { WorktreeConsoleAdapter } from '../console-contract.js';
2
+ import type { WorktreeClientServices } from './actions.js';
3
+ import { type ToolCallViewPropsLike } from './model.js';
4
+ interface Props extends ToolCallViewPropsLike {
5
+ /** Kept for the current Client registrar and historical ToolView compatibility. */
6
+ services: WorktreeClientServices;
7
+ /** Optional live Remote seam; logged evidence remains replayable without it. */
8
+ adapter?: WorktreeConsoleAdapter;
9
+ }
10
+ export declare function WorktreeReviewRow({ block, sessionId, adapter }: Props): import("react").JSX.Element;
11
+ export {};
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { parseReviewTool } from './model.js';
4
+ import { requestWorktreeReviewRefresh } from './review-console/status-events.js';
5
+ import { WorktreeReviewPanel, } from './review-console/WorktreeReviewPanel.js';
6
+ export function WorktreeReviewRow({ block, sessionId, adapter }) {
7
+ const model = parseReviewTool(block);
8
+ const payload = model.payload;
9
+ const args = model.args;
10
+ const state = model.lifecycle === 'running' ? 'running' : model.lifecycle === 'ok' ? 'ok' : 'error';
11
+ const [liveTarget, setLiveTarget] = useState();
12
+ const [liveError, setLiveError] = useState(null);
13
+ const [refreshNonce, setRefreshNonce] = useState(0);
14
+ const review = payload && args ? {
15
+ reviewId: payload.reviewId,
16
+ revision: payload.revision,
17
+ iteration: payload.iteration,
18
+ preparedAt: 0,
19
+ summary: args.summary,
20
+ validationStatus: args.validationStatus,
21
+ ...(args.validationSummary ? { validationSummary: args.validationSummary } : {}),
22
+ tests: args.tests,
23
+ changedFiles: payload.changedFiles,
24
+ suggestedCommitMessage: args.suggestedCommitMessage,
25
+ ...(args.details ? { detailsMarkdown: args.details } : {}),
26
+ } : null;
27
+ useEffect(() => {
28
+ if (payload && sessionId)
29
+ requestWorktreeReviewRefresh(sessionId);
30
+ }, [payload?.reviewId, payload?.revision, sessionId]);
31
+ useEffect(() => {
32
+ setLiveTarget(undefined);
33
+ setLiveError(null);
34
+ if (!adapter || !sessionId || !payload)
35
+ return;
36
+ let active = true;
37
+ void adapter.current({ sessionId }).then(outcome => {
38
+ if (!active)
39
+ return;
40
+ if (outcome.ok)
41
+ setLiveTarget(outcome.value.target);
42
+ else
43
+ setLiveError(`${outcome.error.code}: ${outcome.error.message}`);
44
+ }, reason => {
45
+ if (active)
46
+ setLiveError(reason instanceof Error ? reason.message : String(reason));
47
+ });
48
+ return () => { active = false; };
49
+ }, [adapter, payload?.reviewId, payload?.revision, refreshNonce, sessionId]);
50
+ const identity = payload
51
+ && sessionId
52
+ && liveTarget?.checkoutId
53
+ ? {
54
+ sessionId,
55
+ checkoutId: liveTarget.checkoutId,
56
+ expectedRevision: liveTarget.review?.reviewId === payload.reviewId ? liveTarget.revision : payload.revision,
57
+ expectedReviewId: payload.reviewId,
58
+ }
59
+ : undefined;
60
+ const unavailableMessage = liveError
61
+ ? `实时 Worktree Console 不可用:${liveError}`
62
+ : adapter && sessionId
63
+ ? '正在连接实时 Worktree Console;历史验收证据仍可查看。'
64
+ : '实时 Worktree Console 未连接;连接后即可执行验收操作。';
65
+ return (_jsxs("section", { className: "dsh-wt-card", "data-tool": "worktree_ready_for_review", "data-state": state, "aria-label": "Worktree \u5F85\u9A8C\u6536", children: [review ? (_jsx(WorktreeReviewPanel, { review: review, adapter: adapter, identity: identity, target: liveTarget, unavailableMessage: unavailableMessage, onRefresh: () => setRefreshNonce(value => value + 1), onTargetChange: setLiveTarget })) : (_jsxs("header", { className: "dsh-wt-head", children: [_jsx("span", { className: "dsh-wt-mark", "aria-hidden": true }), _jsx("strong", { className: "dsh-wt-title", children: "Worktree \u5F85\u9A8C\u6536" }), _jsx("span", { className: "dsh-wt-subtitle", children: model.lifecycle === 'running' ? '正在冻结验收快照…' : '验收信息不可用' })] })), model.error ? _jsx("div", { className: "dsh-wt-body", children: _jsx("div", { className: "dsh-wt-error", role: "alert", children: model.error }) }) : null] }));
66
+ }
67
+ //# sourceMappingURL=WorktreeReviewRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorktreeReviewRow.js","sourceRoot":"","sources":["../../src/client/WorktreeReviewRow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /** Browser-side orchestration over Harness Workspace and Session runtime faces. */
2
+ export interface IsolatedTargetLocation {
3
+ managedRoot: string;
4
+ targetSessionId: string;
5
+ }
6
+ export interface SnapshotStore<T> {
7
+ getSnapshot(): T;
8
+ subscribe(listener: () => void): () => void;
9
+ }
10
+ export interface ClientSessionBinding {
11
+ /** Agent-scoped Client Context; present on real Harness bindings. */
12
+ ctx?: unknown;
13
+ session: {
14
+ command(line: string): Promise<{
15
+ ok: true;
16
+ value: {
17
+ matched: boolean;
18
+ };
19
+ } | {
20
+ ok: false;
21
+ error: {
22
+ code: string;
23
+ message: string;
24
+ };
25
+ }>;
26
+ };
27
+ }
28
+ export interface ClientSessions {
29
+ list: SnapshotStore<{
30
+ current?: string;
31
+ ids: string[];
32
+ byId: Record<string, unknown>;
33
+ }>;
34
+ /** Harness resolves only after the new Session is projected into list/binding. */
35
+ create(input: {
36
+ workspaceId: string;
37
+ sessionId: string;
38
+ }): Promise<string>;
39
+ open(sessionId: string): void;
40
+ binding(sessionId: string): ClientSessionBinding | undefined;
41
+ }
42
+ export interface ClientWorkspaces {
43
+ create(input: {
44
+ path: string;
45
+ }): Promise<{
46
+ workspaceId: string;
47
+ path: string;
48
+ }>;
49
+ openPath(path: string): Promise<void>;
50
+ }
51
+ export interface WorktreeClientServices {
52
+ sessions: ClientSessions;
53
+ workspaces: ClientWorkspaces;
54
+ }
55
+ export interface PreSessionInput {
56
+ setDraft(text: string): void;
57
+ addImages(ids: readonly string[]): boolean;
58
+ removeImage(id: string): void;
59
+ }
60
+ /** Additional public Harness faces used only by the blank-session preparation flow. */
61
+ export interface PreSessionWorktreeServices extends WorktreeClientServices {
62
+ sessions: ClientSessions;
63
+ workspaces: ClientWorkspaces & {
64
+ archiveSession(sessionId: string): Promise<void>;
65
+ delete(workspaceId: string): Promise<void>;
66
+ };
67
+ conversation: {
68
+ blocks: {
69
+ set(sessionId: string, block: {
70
+ reason: string;
71
+ } | undefined): void;
72
+ storeFor(sessionId: string): {
73
+ getSnapshot(): {
74
+ reason: string;
75
+ } | undefined;
76
+ };
77
+ };
78
+ input: {
79
+ for(ctx: unknown): PreSessionInput;
80
+ };
81
+ };
82
+ }
83
+ /** Idempotently register the managed root, create the preallocated Session, and navigate. */
84
+ export declare function openIsolatedTarget(services: WorktreeClientServices, payload: IsolatedTargetLocation, isActive?: () => boolean): Promise<void>;
85
+ /** Submit an exact review-card acceptance as an explicit user command. */
86
+ export declare function finalizeCurrentSession(services: Pick<WorktreeClientServices, 'sessions'>, reviewId: string, revision: number, retention: 'cleanup' | 'retain_24h' | 'retain_3d' | 'retain_manual'): Promise<void>;
@@ -0,0 +1,35 @@
1
+ /** Browser-side orchestration over Harness Workspace and Session runtime faces. */
2
+ /** Idempotently register the managed root, create the preallocated Session, and navigate. */
3
+ export async function openIsolatedTarget(services, payload, isActive = () => true) {
4
+ const workspace = await services.workspaces.create({ path: payload.managedRoot });
5
+ if (!isActive())
6
+ return;
7
+ if (workspace.path !== payload.managedRoot) {
8
+ throw new Error(`Harness 注册的工作目录与 Host 记录不一致:${workspace.path}`);
9
+ }
10
+ const sessionId = await services.sessions.create({
11
+ workspaceId: workspace.workspaceId,
12
+ sessionId: payload.targetSessionId,
13
+ });
14
+ if (sessionId !== payload.targetSessionId) {
15
+ throw new Error(`Harness 创建了非预期 Session ${sessionId};应为 ${payload.targetSessionId}`);
16
+ }
17
+ if (!isActive())
18
+ return;
19
+ services.sessions.open(sessionId);
20
+ }
21
+ /** Submit an exact review-card acceptance as an explicit user command. */
22
+ export async function finalizeCurrentSession(services, reviewId, revision, retention) {
23
+ const sessionId = services.sessions.list.getSnapshot().current;
24
+ if (!sessionId)
25
+ throw new Error('当前没有选中的 Session。');
26
+ const binding = services.sessions.binding(sessionId);
27
+ if (!binding)
28
+ throw new Error('当前 Session 尚未就绪。');
29
+ const result = await binding.session.command(`/worktree finalize ${reviewId} ${revision} ${retention}`);
30
+ if (!result.ok)
31
+ throw new Error(`Finalize command failed: ${result.error.code}: ${result.error.message}`);
32
+ if (!result.value.matched)
33
+ throw new Error('Host 未识别 /worktree 命令。');
34
+ }
35
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/client/actions.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAqEnF,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgC,EAChC,OAA+B,EAC/B,WAA0B,GAAG,EAAE,CAAC,IAAI;IAEpC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IACjF,IAAI,CAAC,QAAQ,EAAE;QAAE,OAAM;IACvB,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;IAClE,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/C,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,SAAS,EAAE,OAAO,CAAC,eAAe;KACnC,CAAC,CAAA;IACF,IAAI,SAAS,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,OAAO,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IACtF,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE;QAAE,OAAM;IACvB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACnC,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAkD,EAClD,QAAgB,EAChB,QAAgB,EAChB,SAAmE;IAEnE,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAA;IAC9D,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACpD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,QAAQ,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAA;IACvG,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IACzG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;AACtE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { WorktreeConsoleAdapter } from '../../console-contract.js';
2
+ import type { GitWorktreeRemote } from '../../console-remote/remote.js';
3
+ export declare function createWorktreeConsoleRemoteAdapter(remote: GitWorktreeRemote): WorktreeConsoleAdapter;
@@ -0,0 +1,59 @@
1
+ import { WORKTREE_CONSOLE_DESCRIPTORS } from '../../console-remote/descriptors.js';
2
+ function transport(message) {
3
+ return { ok: false, error: { code: 'transport_unavailable', message } };
4
+ }
5
+ function malformed(method) {
6
+ return { ok: false, error: { code: 'malformed_response', message: `Remote ${method} 返回了不符合 strict contract 的 payload` } };
7
+ }
8
+ function messageOf(value) {
9
+ if (value instanceof Error)
10
+ return value.message;
11
+ if (typeof value === 'object' && value !== null && 'message' in value)
12
+ return String(value.message);
13
+ return String(value);
14
+ }
15
+ function isCodecRejection(value) {
16
+ const message = messageOf(value);
17
+ return message.includes('rejected "') || message.includes('返回了不符合 strict contract');
18
+ }
19
+ export function createWorktreeConsoleRemoteAdapter(remote) {
20
+ const descriptors = new Map(WORKTREE_CONSOLE_DESCRIPTORS.map(descriptor => [descriptor.method, descriptor]));
21
+ async function invoke(method, call) {
22
+ let carrier;
23
+ try {
24
+ carrier = await call();
25
+ }
26
+ catch (error) {
27
+ return isCodecRejection(error) ? malformed(method) : transport(messageOf(error));
28
+ }
29
+ if (typeof carrier !== 'object' || carrier === null || typeof carrier.ok !== 'boolean')
30
+ return malformed(method);
31
+ if (!carrier.ok)
32
+ return isCodecRejection(carrier.error) ? malformed(method) : transport(carrier.error.message);
33
+ const descriptor = descriptors.get(method);
34
+ if (descriptor?.result.mode !== 'strict')
35
+ return malformed(method);
36
+ try {
37
+ return descriptor.result.schema.parse(carrier.value);
38
+ }
39
+ catch {
40
+ return malformed(method);
41
+ }
42
+ }
43
+ return {
44
+ current: request => invoke('current', () => remote.current(request.sessionId)),
45
+ list: request => invoke('list', () => remote.list(request.sessionId, request.needsAttention, request.includeDelivered)),
46
+ create: request => invoke('create', () => remote.create(request.sourceSessionId)),
47
+ inspect: request => invoke('inspect', () => remote.inspect(request.sessionId, request.checkoutId)),
48
+ reviewDiff: request => invoke('reviewDiff', () => remote.reviewDiff(request.sessionId, request.checkoutId, request.expectedRevision, request.expectedReviewId)),
49
+ preflight: request => invoke('preflight', () => remote.preflight(request.sessionId, request.checkoutId, request.expectedRevision, request.expectedReviewId)),
50
+ preview: request => invoke('preview', () => remote.preview(request.sessionId, request.checkoutId, request.expectedRevision, request.expectedReviewId)),
51
+ rollbackPreview: request => invoke('rollbackPreview', () => remote.rollbackPreview(request.sessionId, request.checkoutId, request.expectedRevision, request.resumeRevision)),
52
+ discard: request => invoke('discard', () => remote.discard(request.sessionId, request.checkoutId, request.expectedRevision, request.confirmDirty, request.rollbackPreview)),
53
+ finalize: request => invoke('finalize', () => remote.finalize(request.sessionId, request.checkoutId, request.expectedRevision, request.expectedReviewId, request.commitMessage, request.retention)),
54
+ finalizePreview: request => invoke('finalizePreview', () => remote.finalizePreview(request.sessionId, request.checkoutId, request.expectedRevision, request.expectedReviewId, request.commitMessage, request.retention)),
55
+ setRetention: request => invoke('setRetention', () => remote.setRetention(request.sessionId, request.checkoutId, request.expectedRevision, request.retention)),
56
+ retryCleanup: request => invoke('retryCleanup', () => remote.retryCleanup(request.sessionId, request.checkoutId, request.expectedRevision)),
57
+ };
58
+ }
59
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/client/console-remote/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { TypertClientRemote } from '@deepseek-ai/dsh-typert-protocol';
3
+ import type { WorktreeConsoleAdapter } from '../../console-contract.js';
4
+ import { type GitWorktreeRemote } from '../../console-remote/remote.js';
5
+ export { createWorktreeConsoleRemoteAdapter } from './adapter.js';
6
+ export declare const inject: string[];
7
+ interface ConsoleClientContext extends Context {
8
+ remote: TypertClientRemote & {
9
+ gitWorktree: GitWorktreeRemote;
10
+ };
11
+ }
12
+ declare module '@deepseek-ai/cordis' {
13
+ interface Context {
14
+ worktreeConsole: WorktreeConsoleAdapter;
15
+ }
16
+ }
17
+ /** Mount the package-owned strict Remote contribution in this Client fiber. */
18
+ export declare function apply(ctx: ConsoleClientContext): Promise<void>;
@@ -0,0 +1,17 @@
1
+ import contribution from '../../console-remote/remote.js';
2
+ import { apply as applyToolViews, inject as toolViewInject } from '../index.js';
3
+ import { createWorktreeConsoleRemoteAdapter } from './adapter.js';
4
+ export { createWorktreeConsoleRemoteAdapter } from './adapter.js';
5
+ export const inject = [...toolViewInject, 'remote'];
6
+ /** Mount the package-owned strict Remote contribution in this Client fiber. */
7
+ export async function apply(ctx) {
8
+ const disposeRemote = await ctx.remote.$mount(contribution);
9
+ ctx.effect(() => disposeRemote);
10
+ const remote = ctx.get('remote.gitWorktree');
11
+ if (remote === undefined)
12
+ throw new Error('Worktree Console Remote namespace 挂载失败');
13
+ const adapter = createWorktreeConsoleRemoteAdapter(remote);
14
+ ctx.provide('worktreeConsole', adapter);
15
+ applyToolViews(ctx, adapter);
16
+ }
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/console-remote/index.ts"],"names":[],"mappings":"AAGA,OAAO,YAAwC,MAAM,gCAAgC,CAAA;AACrF,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,aAAa,CAAA;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAA;AAEjE,OAAO,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAA;AAEjE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAG,cAAc,EAAE,QAAQ,CAAC,CAAA;AAYnD,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAyB;IACnD,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IAC3D,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAkC,CAAA;IAC7E,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IACnF,MAAM,OAAO,GAAG,kCAAkC,CAAC,MAAM,CAAC,CAAA;IAC1D,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;IACvC,cAAc,CAAC,GAAsD,EAAE,OAAO,CAAC,CAAA;AACjF,CAAC"}
@@ -0,0 +1,17 @@
1
+ /** Browser entry: dedicated ToolViews for Worktree target handoff and review. */
2
+ import type { ComponentType } from 'react';
3
+ import type { WorktreeConsoleAdapter } from '../console-contract.js';
4
+ export { registerTargetConsole } from './target-console/index.js';
5
+ export declare const WORKTREE_CONSOLE_ADAPTER_SERVICE = "worktreeConsole";
6
+ interface ClientContextLike {
7
+ get(name: string): unknown;
8
+ effect(setup: () => void | (() => void), label?: string): void;
9
+ slots: {
10
+ inject(name: 'tool.call.toolview' | 'conversation.session.header.actions' | 'conversation.input.dock' | 'conversation.input.left', callback: () => unknown): void;
11
+ register(descriptor: Record<string, unknown>, component: ComponentType<any>): unknown;
12
+ };
13
+ }
14
+ /** Required client services. */
15
+ export declare const inject: string[];
16
+ /** Register replay-stable keyed rows and one scoped stylesheet. */
17
+ export declare function apply(ctx: ClientContextLike, adapterOverride?: WorktreeConsoleAdapter): void;
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { WorktreeCreateRow } from './WorktreeCreateRow.js';
3
+ import { WorktreeReviewRow } from './WorktreeReviewRow.js';
4
+ import { WORKTREE_STYLES } from './styles.js';
5
+ import { registerPreSessionWorktree } from './pre-session/index.js';
6
+ import { registerTargetConsole } from './target-console/index.js';
7
+ import { TARGET_CONSOLE_STYLES } from './target-console/target-console.styles.js';
8
+ export { registerTargetConsole } from './target-console/index.js';
9
+ export const WORKTREE_CONSOLE_ADAPTER_SERVICE = 'worktreeConsole';
10
+ /** Required client services. */
11
+ export const inject = ['slots', 'workspaces', 'sessions', 'conversation'];
12
+ function servicesOf(ctx) {
13
+ return {
14
+ workspaces: ctx.get('workspaces'),
15
+ sessions: ctx.get('sessions'),
16
+ conversation: ctx.get('conversation'),
17
+ };
18
+ }
19
+ /** Register replay-stable keyed rows and one scoped stylesheet. */
20
+ export function apply(ctx, adapterOverride) {
21
+ const services = servicesOf(ctx);
22
+ // A service provided by this same plugin fiber is not visible through ctx.get
23
+ // until the provider effect settles. The package-owned Remote entry passes
24
+ // the just-created adapter explicitly; direct consumers may still inject it.
25
+ const adapter = adapterOverride
26
+ ?? ctx.get(WORKTREE_CONSOLE_ADAPTER_SERVICE);
27
+ ctx.effect(() => {
28
+ const style = document.createElement('style');
29
+ style.dataset.dshGitWorktree = 'true';
30
+ style.textContent = `${WORKTREE_STYLES}\n${TARGET_CONSOLE_STYLES}`;
31
+ document.head.append(style);
32
+ return () => { style.remove(); };
33
+ }, 'dsh-git-worktree: styles');
34
+ const CreateRow = (props) => _jsx(WorktreeCreateRow, { ...props, services: services });
35
+ const ReviewRow = (props) => _jsx(WorktreeReviewRow, { ...props, services: services, adapter: adapter });
36
+ ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({ name: 'tool.call.toolview', key: 'worktree_create' }, CreateRow));
37
+ ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({ name: 'tool.call.toolview', key: 'worktree_ready_for_review' }, ReviewRow));
38
+ // Backend integration provides this optional normalized adapter service.
39
+ if (adapter !== undefined) {
40
+ registerTargetConsole({ slots: ctx.slots }, adapter, services);
41
+ registerPreSessionWorktree({ slots: ctx.slots }, adapter, services);
42
+ }
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /** Pure replay-stable ToolView models derived only from logged call/result slices. */
2
+ export interface ToolContentBlock {
3
+ type: string;
4
+ text?: string;
5
+ [key: string]: unknown;
6
+ }
7
+ export interface ToolCallBlockLike {
8
+ callId: string;
9
+ argsRaw?: string;
10
+ call?: {
11
+ argsRaw?: string;
12
+ };
13
+ content?: ToolContentBlock[];
14
+ kind?: string;
15
+ isError?: boolean;
16
+ error?: {
17
+ name?: string;
18
+ code?: string;
19
+ };
20
+ }
21
+ export interface ToolCallViewPropsLike {
22
+ callId: string;
23
+ /** Supplied by Harness for every session-scoped ToolView. */
24
+ sessionId?: string;
25
+ toolName: string;
26
+ block: ToolCallBlockLike;
27
+ cwd?: string;
28
+ openFile?: (path: string) => void;
29
+ inspect?: () => void;
30
+ }
31
+ export interface WorktreeCreatePayload {
32
+ kind: 'worktree_target_created';
33
+ checkoutId: string;
34
+ targetSessionId: string;
35
+ managedRoot: string;
36
+ phase: string;
37
+ currentOid: string;
38
+ sourceSessionId: string;
39
+ }
40
+ export interface WorktreeReviewPayload {
41
+ kind: 'worktree_ready_for_review';
42
+ state: 'ready_for_review';
43
+ reviewId: string;
44
+ revision: number;
45
+ iteration: number;
46
+ changedFiles: string[];
47
+ }
48
+ export interface ReviewArgs {
49
+ summary: string;
50
+ details?: string;
51
+ validationStatus: 'passed' | 'failed' | 'partial' | 'not_run';
52
+ validationSummary?: string;
53
+ tests: Array<{
54
+ command: string;
55
+ status: 'passed' | 'failed' | 'not_run';
56
+ summary?: string;
57
+ }>;
58
+ suggestedCommitMessage: string;
59
+ }
60
+ export type ToolLifecycle = 'running' | 'ok' | 'error' | 'stopped';
61
+ export interface ParsedTool<TPayload, TArgs = Record<string, never>> {
62
+ lifecycle: ToolLifecycle;
63
+ payload: TPayload | null;
64
+ args: TArgs | null;
65
+ error: string | null;
66
+ }
67
+ export declare function parseCreateTool(block: ToolCallBlockLike): ParsedTool<WorktreeCreatePayload>;
68
+ export declare function parseReviewTool(block: ToolCallBlockLike): ParsedTool<WorktreeReviewPayload, ReviewArgs>;