@cerbur/clutch-dsh-worktree 0.1.6 → 0.1.8
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/README.md +135 -23
- package/README.zh.md +107 -13
- package/cordis.patch.yml +21 -0
- package/lib/client/WorktreeContext.d.ts.map +1 -1
- package/lib/client/WorktreeContext.js +2 -2
- package/lib/client/WorktreeContext.js.map +1 -1
- package/lib/client/WorktreeSurface.d.ts +2 -2
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +291 -70
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +84 -2
- package/lib/client/entry.js.map +1 -1
- package/lib/client/index.d.ts +3 -0
- package/lib/client/index.d.ts.map +1 -1
- package/lib/client/index.js +2 -0
- package/lib/client/index.js.map +1 -1
- package/lib/client/locales.d.ts +70 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +70 -0
- package/lib/client/locales.js.map +1 -1
- package/lib/client/session-view.d.ts +34 -0
- package/lib/client/session-view.d.ts.map +1 -1
- package/lib/client/session-view.js +119 -1
- package/lib/client/session-view.js.map +1 -1
- package/lib/client/worktree-connection.d.ts +4 -2
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +4 -0
- package/lib/client/worktree-connection.js.map +1 -1
- package/lib/client/worktree-context.js +1 -1
- package/lib/client/worktree-context.js.map +1 -1
- package/lib/client/worktree-error-copy.d.ts +2 -0
- package/lib/client/worktree-error-copy.d.ts.map +1 -1
- package/lib/client/worktree-error-copy.js +24 -0
- package/lib/client/worktree-error-copy.js.map +1 -1
- package/lib/client/worktree-permission-icon.d.ts +7 -0
- package/lib/client/worktree-permission-icon.d.ts.map +1 -0
- package/lib/client/worktree-permission-icon.js +119 -0
- package/lib/client/worktree-permission-icon.js.map +1 -0
- package/lib/client/worktree-permission.d.ts +21 -0
- package/lib/client/worktree-permission.d.ts.map +1 -0
- package/lib/client/worktree-permission.js +70 -0
- package/lib/client/worktree-permission.js.map +1 -0
- package/lib/client/worktree-session-fork.d.ts +65 -0
- package/lib/client/worktree-session-fork.d.ts.map +1 -0
- package/lib/client/worktree-session-fork.js +174 -0
- package/lib/client/worktree-session-fork.js.map +1 -0
- package/lib/client/worktree-session-order.d.ts +36 -0
- package/lib/client/worktree-session-order.d.ts.map +1 -0
- package/lib/client/worktree-session-order.js +215 -0
- package/lib/client/worktree-session-order.js.map +1 -0
- package/lib/client/worktree-session.d.ts +34 -1
- package/lib/client/worktree-session.d.ts.map +1 -1
- package/lib/client/worktree-session.js +101 -3
- package/lib/client/worktree-session.js.map +1 -1
- package/lib/client/worktree-surface-rows.d.ts +4 -4
- package/lib/client/worktree-surface-rows.d.ts.map +1 -1
- package/lib/client/worktree-surface-rows.js +139 -47
- package/lib/client/worktree-surface-rows.js.map +1 -1
- package/lib/client/worktree-surface-selectors.d.ts +2 -0
- package/lib/client/worktree-surface-selectors.d.ts.map +1 -1
- package/lib/client/worktree-surface-selectors.js +8 -0
- package/lib/client/worktree-surface-selectors.js.map +1 -1
- package/lib/client/worktree-surface-types.d.ts +46 -3
- package/lib/client/worktree-surface-types.d.ts.map +1 -1
- package/lib/client/worktree-view-actions.d.ts +8 -3
- package/lib/client/worktree-view-actions.d.ts.map +1 -1
- package/lib/client/worktree-view-actions.js +28 -2
- package/lib/client/worktree-view-actions.js.map +1 -1
- package/lib/client/worktree-view-errors.d.ts +10 -0
- package/lib/client/worktree-view-errors.d.ts.map +1 -1
- package/lib/client/worktree-view-errors.js +22 -1
- package/lib/client/worktree-view-errors.js.map +1 -1
- package/lib/client.js +1515 -207
- package/lib/client.js.map +1 -1
- package/lib/contract/index.contract.js +2 -0
- package/lib/contract/index.contract.js.map +1 -1
- package/lib/contract/index.d.ts +11 -3
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +8 -0
- package/lib/contract/index.js.map +1 -1
- package/lib/contract/worktree-permission.d.ts +73 -0
- package/lib/contract/worktree-permission.d.ts.map +1 -0
- package/lib/contract/worktree-permission.js +32 -0
- package/lib/contract/worktree-permission.js.map +1 -0
- package/lib/host/dsh-read-adapter.d.ts +1 -0
- package/lib/host/dsh-read-adapter.d.ts.map +1 -1
- package/lib/host/dsh-read-adapter.js +6 -0
- package/lib/host/dsh-read-adapter.js.map +1 -1
- package/lib/host/index.d.ts +4 -0
- package/lib/host/index.d.ts.map +1 -1
- package/lib/host/index.js +2 -0
- package/lib/host/index.js.map +1 -1
- package/lib/host/remote.d.ts +2 -2
- package/lib/host/remote.d.ts.map +1 -1
- package/lib/host/remote.js +7 -1
- package/lib/host/remote.js.map +1 -1
- package/lib/host/service.d.ts +5 -1
- package/lib/host/service.d.ts.map +1 -1
- package/lib/host/service.js +42 -3
- package/lib/host/service.js.map +1 -1
- package/lib/host/worktree-permission-manager.d.ts +14 -0
- package/lib/host/worktree-permission-manager.d.ts.map +1 -0
- package/lib/host/worktree-permission-manager.js +113 -0
- package/lib/host/worktree-permission-manager.js.map +1 -0
- package/lib/host/worktree-permission.d.ts +38 -0
- package/lib/host/worktree-permission.d.ts.map +1 -0
- package/lib/host/worktree-permission.js +156 -0
- package/lib/host/worktree-permission.js.map +1 -0
- package/lib/index.d.ts +6 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/manage/manager-context.d.ts +2 -0
- package/lib/manage/manager-context.d.ts.map +1 -1
- package/lib/manage/manager-worktrees.d.ts +5 -0
- package/lib/manage/manager-worktrees.d.ts.map +1 -1
- package/lib/manage/manager-worktrees.js +125 -37
- package/lib/manage/manager-worktrees.js.map +1 -1
- package/lib/manage/manager.d.ts +20 -0
- package/lib/manage/manager.d.ts.map +1 -1
- package/lib/manage/manager.js +91 -13
- package/lib/manage/manager.js.map +1 -1
- package/lib/manage/types.d.ts +9 -1
- package/lib/manage/types.d.ts.map +1 -1
- package/lib/manage/worktree-permission.d.ts +3 -0
- package/lib/manage/worktree-permission.d.ts.map +1 -0
- package/lib/manage/worktree-permission.js +3 -0
- package/lib/manage/worktree-permission.js.map +1 -0
- package/lib/provider/git.d.ts +37 -9
- package/lib/provider/git.d.ts.map +1 -1
- package/lib/provider/git.js +162 -61
- package/lib/provider/git.js.map +1 -1
- package/lib/provider/index.d.ts +5 -1
- package/lib/provider/index.d.ts.map +1 -1
- package/lib/provider/index.js +4 -0
- package/lib/provider/index.js.map +1 -1
- package/lib/provider/mutation-lock.d.ts +37 -0
- package/lib/provider/mutation-lock.d.ts.map +1 -0
- package/lib/provider/mutation-lock.js +270 -0
- package/lib/provider/mutation-lock.js.map +1 -0
- package/lib/provider/mutation-token.d.ts +8 -0
- package/lib/provider/mutation-token.d.ts.map +1 -0
- package/lib/provider/mutation-token.js +20 -0
- package/lib/provider/mutation-token.js.map +1 -0
- package/lib/provider/repository-fingerprint.d.ts +8 -0
- package/lib/provider/repository-fingerprint.d.ts.map +1 -0
- package/lib/provider/repository-fingerprint.js +13 -0
- package/lib/provider/repository-fingerprint.js.map +1 -0
- package/lib/provider/sidecar-persistence.d.ts +7 -3
- package/lib/provider/sidecar-persistence.d.ts.map +1 -1
- package/lib/provider/sidecar-persistence.js +118 -44
- package/lib/provider/sidecar-persistence.js.map +1 -1
- package/lib/provider/sidecar-schema.d.ts +1 -1
- package/lib/provider/sidecar-schema.d.ts.map +1 -1
- package/lib/provider/sidecar-schema.js +140 -8
- package/lib/provider/sidecar-schema.js.map +1 -1
- package/lib/provider/sidecar.d.ts +3 -1
- package/lib/provider/sidecar.d.ts.map +1 -1
- package/lib/provider/sidecar.js +6 -1
- package/lib/provider/sidecar.js.map +1 -1
- package/lib/provider/subprocess.d.ts +37 -0
- package/lib/provider/subprocess.d.ts.map +1 -0
- package/lib/provider/subprocess.js +319 -0
- package/lib/provider/subprocess.js.map +1 -0
- package/lib/provider/transaction.d.ts +65 -0
- package/lib/provider/transaction.d.ts.map +1 -0
- package/lib/provider/transaction.js +1011 -0
- package/lib/provider/transaction.js.map +1 -0
- package/lib/provider/types.d.ts +98 -7
- package/lib/provider/types.d.ts.map +1 -1
- package/lib/provider/types.js +1 -1
- package/lib/provider/types.js.map +1 -1
- package/lib/typert.host.js +133 -30
- package/lib/typert.remote-client.d.ts +7 -3
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +133 -30
- package/package.json +3 -1
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
const PLUGIN_ID = '@cerbur/clutch-dsh-worktree';
|
|
2
|
+
const STYLE_ID = `${PLUGIN_ID}/permission-icon`;
|
|
3
|
+
const WORKTREE_PERMISSION_LABEL = 'Worktree Full Access';
|
|
4
|
+
/** DOM marker owned only by this plugin's permission icon decorator. */
|
|
5
|
+
export const WORKTREE_PERMISSION_ICON_ATTRIBUTE = 'data-clutch-dsh-worktree-permission-icon';
|
|
6
|
+
// The native DSH menu has no icon extension point for host-configured values.
|
|
7
|
+
// A branch glyph keeps the custom option visually distinct while preserving
|
|
8
|
+
// the same 16px geometry as the built-in permission glyphs.
|
|
9
|
+
const ICON_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M13.0762 1.37207C14.0846 1.37228 14.9021 2.19077 14.9023 3.19922C14.9022 4.20772 14.0847 5.02518 13.0762 5.02539C12.2967 5.02539 11.6325 4.53691 11.3701 3.84961H4.35547C4.79397 4.26458 5.15861 4.7644 5.41699 5.33496L7.10645 9.06738C7.88526 10.7875 9.55104 11.9228 11.4189 12.0371C11.7085 11.4109 12.3411 10.9756 13.0762 10.9756C14.0843 10.9759 14.9023 11.7936 14.9023 12.8018C14.9023 13.81 14.0843 14.6277 13.0762 14.6279C12.2534 14.6279 11.5574 14.0832 11.3291 13.335C8.9868 13.1879 6.89981 11.7612 5.92285 9.60352L4.23242 5.87109C3.67503 4.64033 2.44878 3.84961 1.09766 3.84961V2.54883C1.10665 2.54883 1.11601 2.54975 1.125 2.5498L11.3701 2.54883C11.6326 1.86151 12.2969 1.37207 13.0762 1.37207ZM13.0762 12.2764C12.7858 12.2764 12.5508 12.5114 12.5508 12.8018C12.5508 13.0921 12.7858 13.3281 13.0762 13.3281C13.3664 13.3279 13.6025 13.092 13.6025 12.8018C13.6025 12.5115 13.3664 12.2766 13.0762 12.2764ZM13.0762 2.67285C12.7855 2.67285 12.55 2.90861 12.5498 3.19922C12.5499 3.48987 12.7855 3.72559 13.0762 3.72559C13.3667 3.72538 13.6024 3.48975 13.6025 3.19922C13.6023 2.90874 13.3666 2.67306 13.0762 2.67285Z" fill="black"/></svg>';
|
|
10
|
+
function iconStyles() {
|
|
11
|
+
const mask = `url("data:image/svg+xml,${encodeURIComponent(ICON_SVG)}")`;
|
|
12
|
+
return `
|
|
13
|
+
[${WORKTREE_PERMISSION_ICON_ATTRIBUTE}]::before {
|
|
14
|
+
content: "";
|
|
15
|
+
display: inline-block;
|
|
16
|
+
flex: 0 0 auto;
|
|
17
|
+
width: 16px;
|
|
18
|
+
height: 16px;
|
|
19
|
+
background-color: var(--dsw-alias-label-tertiary, currentColor);
|
|
20
|
+
-webkit-mask-image: ${mask};
|
|
21
|
+
mask-image: ${mask};
|
|
22
|
+
-webkit-mask-position: center;
|
|
23
|
+
mask-position: center;
|
|
24
|
+
-webkit-mask-repeat: no-repeat;
|
|
25
|
+
mask-repeat: no-repeat;
|
|
26
|
+
-webkit-mask-size: contain;
|
|
27
|
+
mask-size: contain;
|
|
28
|
+
}
|
|
29
|
+
[${WORKTREE_PERMISSION_ICON_ATTRIBUTE}="trigger"]::before {
|
|
30
|
+
width: 14px;
|
|
31
|
+
height: 14px;
|
|
32
|
+
}
|
|
33
|
+
@container (max-width: 460px) {
|
|
34
|
+
[${WORKTREE_PERMISSION_ICON_ATTRIBUTE}="trigger"] > span:first-of-type {
|
|
35
|
+
display: none;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
`;
|
|
39
|
+
}
|
|
40
|
+
function normalizedText(element) {
|
|
41
|
+
return (element.textContent ?? '').replace(/\s+/g, ' ').trim();
|
|
42
|
+
}
|
|
43
|
+
function isWorktreeMenuItem(element) {
|
|
44
|
+
return element.matches('button[role="menuitem"]') &&
|
|
45
|
+
normalizedText(element) === WORKTREE_PERMISSION_LABEL &&
|
|
46
|
+
element.closest('[role="menu"]') !== null;
|
|
47
|
+
}
|
|
48
|
+
function isWorktreeTrigger(element) {
|
|
49
|
+
if (!element.matches('button[aria-label]'))
|
|
50
|
+
return false;
|
|
51
|
+
const label = element.getAttribute('aria-label') ?? '';
|
|
52
|
+
return /^(?:access mode,\s*current:\s*|访问模式,当前:\s*)worktree full access$/iu.test(label.trim());
|
|
53
|
+
}
|
|
54
|
+
/** Mark the native custom permission row and trigger for CSS decoration. */
|
|
55
|
+
export function decorateWorktreePermissionIcons(document) {
|
|
56
|
+
for (const marked of document.querySelectorAll(`[${WORKTREE_PERMISSION_ICON_ATTRIBUTE}]`)) {
|
|
57
|
+
const kind = marked.getAttribute(WORKTREE_PERMISSION_ICON_ATTRIBUTE);
|
|
58
|
+
if ((kind === 'menu' && !isWorktreeMenuItem(marked)) ||
|
|
59
|
+
(kind === 'trigger' && !isWorktreeTrigger(marked))) {
|
|
60
|
+
marked.removeAttribute(WORKTREE_PERMISSION_ICON_ATTRIBUTE);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const item of document.querySelectorAll('button[role="menuitem"]')) {
|
|
64
|
+
if (isWorktreeMenuItem(item)) {
|
|
65
|
+
item.setAttribute(WORKTREE_PERMISSION_ICON_ATTRIBUTE, 'menu');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const button of document.querySelectorAll('button[aria-label]')) {
|
|
69
|
+
if (isWorktreeTrigger(button)) {
|
|
70
|
+
button.setAttribute(WORKTREE_PERMISSION_ICON_ATTRIBUTE, 'trigger');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Install the Worktree permission icon and return a plugin-local disposer. */
|
|
75
|
+
export function installWorktreePermissionIcon(document) {
|
|
76
|
+
for (const existing of document.querySelectorAll('style[data-plugin-css]')) {
|
|
77
|
+
if (existing.getAttribute('data-plugin-css') === STYLE_ID)
|
|
78
|
+
existing.remove();
|
|
79
|
+
}
|
|
80
|
+
const style = document.createElement('style');
|
|
81
|
+
style.setAttribute('data-plugin', PLUGIN_ID);
|
|
82
|
+
style.setAttribute('data-plugin-css', STYLE_ID);
|
|
83
|
+
style.textContent = iconStyles();
|
|
84
|
+
document.head.appendChild(style);
|
|
85
|
+
let active = true;
|
|
86
|
+
let queued = false;
|
|
87
|
+
const scan = () => {
|
|
88
|
+
if (!active || queued)
|
|
89
|
+
return;
|
|
90
|
+
queued = true;
|
|
91
|
+
queueMicrotask(() => {
|
|
92
|
+
queued = false;
|
|
93
|
+
if (active)
|
|
94
|
+
decorateWorktreePermissionIcons(document);
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
decorateWorktreePermissionIcons(document);
|
|
98
|
+
const observer = typeof MutationObserver === 'function'
|
|
99
|
+
? new MutationObserver(scan)
|
|
100
|
+
: undefined;
|
|
101
|
+
observer?.observe(document.documentElement, {
|
|
102
|
+
attributes: true,
|
|
103
|
+
attributeFilter: ['aria-label'],
|
|
104
|
+
characterData: true,
|
|
105
|
+
childList: true,
|
|
106
|
+
subtree: true,
|
|
107
|
+
});
|
|
108
|
+
return () => {
|
|
109
|
+
if (!active)
|
|
110
|
+
return;
|
|
111
|
+
active = false;
|
|
112
|
+
observer?.disconnect();
|
|
113
|
+
style.remove();
|
|
114
|
+
for (const marked of document.querySelectorAll(`[${WORKTREE_PERMISSION_ICON_ATTRIBUTE}]`)) {
|
|
115
|
+
marked.removeAttribute(WORKTREE_PERMISSION_ICON_ATTRIBUTE);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=worktree-permission-icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-permission-icon.js","sourceRoot":"","sources":["../../src/client/worktree-permission-icon.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,6BAA6B,CAAC;AAChD,MAAM,QAAQ,GAAG,GAAG,SAAS,kBAAkB,CAAC;AAChD,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAEzD,wEAAwE;AACxE,MAAM,CAAC,MAAM,kCAAkC,GAC7C,0CAA0C,CAAC;AAE7C,8EAA8E;AAC9E,4EAA4E;AAC5E,4DAA4D;AAC5D,MAAM,QAAQ,GAAG,qrCAAqrC,CAAC;AAEvsC,SAAS,UAAU;IACjB,MAAM,IAAI,GAAG,2BAA2B,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC;IACzE,OAAO;GACN,kCAAkC;;;;;;;wBAOb,IAAI;gBACZ,IAAI;;;;;;;;GAQjB,kCAAkC;;;;;KAKhC,kCAAkC;;;;CAItC,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,OAAgB;IACtC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgB;IAC1C,OAAO,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC;QAC/C,cAAc,CAAC,OAAO,CAAC,KAAK,yBAAyB;QACrD,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;AAC9C,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAgB;IACzC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACvD,OAAO,oEAAoE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,+BAA+B,CAAC,QAAkB;IAChE,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,gBAAgB,CAAC,IAAI,kCAAkC,GAAG,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,kCAAkC,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAClD,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,eAAe,CAAC,kCAAkC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,EAAE,CAAC;QACxE,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACrE,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,YAAY,CAAC,kCAAkC,EAAE,SAAS,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,6BAA6B,CAAC,QAAkB;IAC9D,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC3E,IAAI,QAAQ,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,QAAQ;YAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC/E,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC7C,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAChD,KAAK,CAAC,WAAW,GAAG,UAAU,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAEjC,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,CAAC,MAAM,IAAI,MAAM;YAAE,OAAO;QAC9B,MAAM,GAAG,IAAI,CAAC;QACd,cAAc,CAAC,GAAG,EAAE;YAClB,MAAM,GAAG,KAAK,CAAC;YACf,IAAI,MAAM;gBAAE,+BAA+B,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,+BAA+B,CAAC,QAAQ,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,OAAO,gBAAgB,KAAK,UAAU;QACrD,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC;QAC5B,CAAC,CAAC,SAAS,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;QAC1C,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,CAAC,YAAY,CAAC;QAC/B,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE;QACV,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,GAAG,KAAK,CAAC;QACf,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,gBAAgB,CAAC,IAAI,kCAAkC,GAAG,CAAC,EAAE,CAAC;YAC1F,MAAM,CAAC,eAAe,CAAC,kCAAkC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface WorktreeFullAccessConfirmationInput {
|
|
2
|
+
readonly workspaceId: string;
|
|
3
|
+
readonly worktreeId: string;
|
|
4
|
+
readonly sessionId: string;
|
|
5
|
+
readonly cwd: string;
|
|
6
|
+
}
|
|
7
|
+
export interface WorktreeFullAccessConfirmationController {
|
|
8
|
+
readonly getSnapshot: () => WorktreeFullAccessConfirmationInput | undefined;
|
|
9
|
+
readonly subscribe: (listener: () => void) => () => void;
|
|
10
|
+
readonly request: (input: WorktreeFullAccessConfirmationInput) => Promise<boolean>;
|
|
11
|
+
readonly resolve: (confirmed: boolean) => void;
|
|
12
|
+
readonly dispose: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function worktreeFullAccessConfirmationMessage(input: WorktreeFullAccessConfirmationInput, locale?: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Coordinate async permission requests with the one in-page confirmation
|
|
17
|
+
* rendered by the Worktree surface. Requests are serialized so concurrent
|
|
18
|
+
* Worktree Session creations cannot replace one another's dialog.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createWorktreeFullAccessConfirmationController(): WorktreeFullAccessConfirmationController;
|
|
21
|
+
//# sourceMappingURL=worktree-permission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-permission.d.ts","sourceRoot":"","sources":["../../src/client/worktree-permission.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wCAAwC;IACvD,QAAQ,CAAC,WAAW,EAAE,MAAM,mCAAmC,GAAG,SAAS,CAAC;IAC5E,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IACzD,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,mCAAmC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnF,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAWD,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,mCAAmC,EAC1C,MAAM,SAAiC,GACtC,MAAM,CAKR;AAED;;;;GAIG;AACH,wBAAgB,8CAA8C,IAC5D,wCAAwC,CAqDzC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const englishReason = 'This Worktree Session may need Git metadata and linked Worktree files outside the Session directory. '
|
|
2
|
+
+ 'Full Access disables filesystem confinement for this Session; approval prompts remain enabled, '
|
|
3
|
+
+ 'and network and process policy is unchanged. Continue?';
|
|
4
|
+
const chineseReason = '这个 Worktree Session 可能需要访问 Session 目录之外的 Git 元数据和关联 Worktree 文件。'
|
|
5
|
+
+ '完全访问会关闭此 Session 的文件系统沙箱,但会保留审批提示,网络和进程策略不变。'
|
|
6
|
+
+ '是否继续?';
|
|
7
|
+
export function worktreeFullAccessConfirmationMessage(input, locale = globalThis.navigator?.language) {
|
|
8
|
+
const reason = locale?.toLocaleLowerCase().startsWith('zh') === true
|
|
9
|
+
? chineseReason
|
|
10
|
+
: englishReason;
|
|
11
|
+
return `${reason}\n\nWorktree: ${input.cwd}`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Coordinate async permission requests with the one in-page confirmation
|
|
15
|
+
* rendered by the Worktree surface. Requests are serialized so concurrent
|
|
16
|
+
* Worktree Session creations cannot replace one another's dialog.
|
|
17
|
+
*/
|
|
18
|
+
export function createWorktreeFullAccessConfirmationController() {
|
|
19
|
+
let active;
|
|
20
|
+
const queue = [];
|
|
21
|
+
const listeners = new Set();
|
|
22
|
+
let disposed = false;
|
|
23
|
+
const notify = () => {
|
|
24
|
+
for (const listener of listeners)
|
|
25
|
+
listener();
|
|
26
|
+
};
|
|
27
|
+
const showNext = () => {
|
|
28
|
+
if (active !== undefined)
|
|
29
|
+
return;
|
|
30
|
+
active = queue.shift();
|
|
31
|
+
notify();
|
|
32
|
+
};
|
|
33
|
+
const controller = {
|
|
34
|
+
getSnapshot: () => active?.input,
|
|
35
|
+
subscribe: (listener) => {
|
|
36
|
+
listeners.add(listener);
|
|
37
|
+
return () => {
|
|
38
|
+
listeners.delete(listener);
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
request: (input) => {
|
|
42
|
+
if (disposed)
|
|
43
|
+
return Promise.resolve(false);
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
queue.push({ input, resolve });
|
|
46
|
+
showNext();
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
resolve: (confirmed) => {
|
|
50
|
+
if (active === undefined)
|
|
51
|
+
return;
|
|
52
|
+
const current = active;
|
|
53
|
+
active = undefined;
|
|
54
|
+
current.resolve(confirmed);
|
|
55
|
+
showNext();
|
|
56
|
+
},
|
|
57
|
+
dispose: () => {
|
|
58
|
+
if (disposed)
|
|
59
|
+
return;
|
|
60
|
+
disposed = true;
|
|
61
|
+
active?.resolve(false);
|
|
62
|
+
active = undefined;
|
|
63
|
+
for (const pending of queue.splice(0))
|
|
64
|
+
pending.resolve(false);
|
|
65
|
+
notify();
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
return controller;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=worktree-permission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-permission.js","sourceRoot":"","sources":["../../src/client/worktree-permission.ts"],"names":[],"mappings":"AAeA,MAAM,aAAa,GACjB,uGAAuG;MACrG,iGAAiG;MACjG,wDAAwD,CAAC;AAC7D,MAAM,aAAa,GACjB,kEAAkE;MAChE,8CAA8C;MAC9C,OAAO,CAAC;AAEZ,MAAM,UAAU,qCAAqC,CACnD,KAA0C,EAC1C,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,QAAQ;IAEvC,MAAM,MAAM,GAAG,MAAM,EAAE,iBAAiB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI;QAClE,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,aAAa,CAAC;IAClB,OAAO,GAAG,MAAM,iBAAiB,KAAK,CAAC,GAAG,EAAE,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8CAA8C;IAO5D,IAAI,MAAkC,CAAC;IACvC,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,KAAK,MAAM,QAAQ,IAAI,SAAS;YAAE,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,UAAU,GAA6C;QAC3D,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK;QAChC,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE;YACtB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,QAAQ;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;gBACtC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/B,QAAQ,EAAE,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE;YACrB,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC;YACvB,MAAM,GAAG,SAAS,CAAC;YACnB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3B,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACvB,MAAM,GAAG,SAAS,CAAC;YACnB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9D,MAAM,EAAE,CAAC;QACX,CAAC;KACF,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { SessionBinding } from '../contract/index.js';
|
|
2
|
+
/** The public options accepted by the native DSH Session fork service. */
|
|
3
|
+
export interface WorktreeForkInput {
|
|
4
|
+
readonly sessionId: string;
|
|
5
|
+
readonly atSeq?: number;
|
|
6
|
+
readonly increaseTitle?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** The lineage facts exposed by DSH's browser Session list. */
|
|
9
|
+
export interface WorktreeForkSessionSummary {
|
|
10
|
+
readonly blank?: boolean;
|
|
11
|
+
readonly parentId?: string;
|
|
12
|
+
readonly origin?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface WorktreeForkSessionListSnapshot {
|
|
15
|
+
readonly phase?: 'pending' | 'ready';
|
|
16
|
+
readonly ids: readonly string[];
|
|
17
|
+
readonly byId: Readonly<Record<string, WorktreeForkSessionSummary | undefined>>;
|
|
18
|
+
}
|
|
19
|
+
export interface WorktreeForkSessionListReader {
|
|
20
|
+
getSnapshot(): WorktreeForkSessionListSnapshot;
|
|
21
|
+
}
|
|
22
|
+
export interface WorktreeForkRecovery {
|
|
23
|
+
readonly key: string;
|
|
24
|
+
readonly sourceSessionId: string;
|
|
25
|
+
readonly childSessionId: string;
|
|
26
|
+
readonly binding?: SessionBinding;
|
|
27
|
+
readonly error: unknown;
|
|
28
|
+
}
|
|
29
|
+
export interface WorktreeForkRecoverySnapshot {
|
|
30
|
+
readonly revision: number;
|
|
31
|
+
readonly pending: readonly WorktreeForkRecovery[];
|
|
32
|
+
}
|
|
33
|
+
export interface WorktreeForkRecoveryStore {
|
|
34
|
+
getSnapshot(): WorktreeForkRecoverySnapshot;
|
|
35
|
+
subscribe(listener: () => void): () => void;
|
|
36
|
+
}
|
|
37
|
+
export interface WorktreeForkCoordinatorOptions {
|
|
38
|
+
/** The unwrapped DSH fork method. */
|
|
39
|
+
readonly fork: (input: WorktreeForkInput) => Promise<string>;
|
|
40
|
+
/** Find the parent's active sidecar binding across all native Workspaces. */
|
|
41
|
+
readonly findBinding: (sessionId: string) => Promise<SessionBinding | undefined>;
|
|
42
|
+
/** Existing Worktree sidecar mutation; it remains the only binding writer. */
|
|
43
|
+
readonly bindSession: (input: {
|
|
44
|
+
workspaceId: string;
|
|
45
|
+
worktreeId: string;
|
|
46
|
+
sessionId: string;
|
|
47
|
+
}) => Promise<unknown>;
|
|
48
|
+
readonly sessions?: WorktreeForkSessionListReader;
|
|
49
|
+
/** Called after a child binding has been committed and before the view refresh. */
|
|
50
|
+
readonly onBound?: (binding: SessionBinding) => void;
|
|
51
|
+
}
|
|
52
|
+
export interface WorktreeForkCoordinator {
|
|
53
|
+
readonly recovery: WorktreeForkRecoveryStore;
|
|
54
|
+
fork(input: WorktreeForkInput): Promise<string>;
|
|
55
|
+
reconcile(): Promise<void>;
|
|
56
|
+
retry(key: string): Promise<boolean>;
|
|
57
|
+
dispose(): void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Coordinate native Session fork with the plugin-owned Worktree relation.
|
|
61
|
+
* Native Session creation always wins: plugin lookup/bind failures are kept as
|
|
62
|
+
* recovery state and never turn an already-created child into a failed fork.
|
|
63
|
+
*/
|
|
64
|
+
export declare function createWorktreeSessionForkCoordinator(options: WorktreeForkCoordinatorOptions): WorktreeForkCoordinator;
|
|
65
|
+
//# sourceMappingURL=worktree-session-fork.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-session-fork.d.ts","sourceRoot":"","sources":["../../src/client/worktree-session-fork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,+DAA+D;AAC/D,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,0BAA0B,GAAG,SAAS,CAAC,CAAC,CAAC;CACjF;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,IAAI,+BAA+B,CAAC;CAChD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,IAAI,4BAA4B,CAAC;IAC5C,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,8BAA8B;IAC7C,qCAAqC;IACrC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7D,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IACjF,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE;QAC5B,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,6BAA6B,CAAC;IAClD,mFAAmF;IACnF,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAUD;;;;GAIG;AACH,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,8BAA8B,GACtC,uBAAuB,CAgLzB"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
function recoveryKey(sourceSessionId, childSessionId) {
|
|
2
|
+
return `${sourceSessionId}\u0000${childSessionId}`;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Coordinate native Session fork with the plugin-owned Worktree relation.
|
|
6
|
+
* Native Session creation always wins: plugin lookup/bind failures are kept as
|
|
7
|
+
* recovery state and never turn an already-created child into a failed fork.
|
|
8
|
+
*/
|
|
9
|
+
export function createWorktreeSessionForkCoordinator(options) {
|
|
10
|
+
let disposed = false;
|
|
11
|
+
let revision = 0;
|
|
12
|
+
let pending = new Map();
|
|
13
|
+
let recoverySnapshot = { revision: 0, pending: [] };
|
|
14
|
+
const subscribers = new Set();
|
|
15
|
+
const boundChildren = new Set();
|
|
16
|
+
const bindingInFlight = new Map();
|
|
17
|
+
let reconciliationInFlight;
|
|
18
|
+
let reconciliationAgain = false;
|
|
19
|
+
const publish = () => {
|
|
20
|
+
revision += 1;
|
|
21
|
+
recoverySnapshot = { revision, pending: [...pending.values()] };
|
|
22
|
+
for (const subscriber of subscribers)
|
|
23
|
+
subscriber();
|
|
24
|
+
};
|
|
25
|
+
const setRecovery = (sourceSessionId, childSessionId, error, target) => {
|
|
26
|
+
if (disposed)
|
|
27
|
+
return;
|
|
28
|
+
const key = recoveryKey(sourceSessionId, childSessionId);
|
|
29
|
+
pending = new Map(pending).set(key, {
|
|
30
|
+
key,
|
|
31
|
+
sourceSessionId,
|
|
32
|
+
childSessionId,
|
|
33
|
+
...(target === undefined ? {} : { binding: target }),
|
|
34
|
+
error,
|
|
35
|
+
});
|
|
36
|
+
publish();
|
|
37
|
+
};
|
|
38
|
+
const clearRecovery = (sourceSessionId, childSessionId) => {
|
|
39
|
+
const key = recoveryKey(sourceSessionId, childSessionId);
|
|
40
|
+
if (!pending.has(key))
|
|
41
|
+
return;
|
|
42
|
+
const next = new Map(pending);
|
|
43
|
+
next.delete(key);
|
|
44
|
+
pending = next;
|
|
45
|
+
publish();
|
|
46
|
+
};
|
|
47
|
+
const attemptBinding = async (sourceSessionId, childSessionId) => {
|
|
48
|
+
if (disposed || boundChildren.has(childSessionId))
|
|
49
|
+
return { bound: false };
|
|
50
|
+
let target;
|
|
51
|
+
try {
|
|
52
|
+
target = await options.findBinding(sourceSessionId);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
setRecovery(sourceSessionId, childSessionId, error);
|
|
56
|
+
return { bound: false };
|
|
57
|
+
}
|
|
58
|
+
if (disposed)
|
|
59
|
+
return { bound: false };
|
|
60
|
+
if (target === undefined || target.status !== 'active') {
|
|
61
|
+
clearRecovery(sourceSessionId, childSessionId);
|
|
62
|
+
return { bound: false };
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
await options.bindSession({
|
|
66
|
+
workspaceId: target.workspaceId,
|
|
67
|
+
worktreeId: target.worktreeId,
|
|
68
|
+
sessionId: childSessionId,
|
|
69
|
+
});
|
|
70
|
+
if (disposed)
|
|
71
|
+
return { bound: false };
|
|
72
|
+
const childBinding = {
|
|
73
|
+
workspaceId: target.workspaceId,
|
|
74
|
+
worktreeId: target.worktreeId,
|
|
75
|
+
sessionId: childSessionId,
|
|
76
|
+
status: 'active',
|
|
77
|
+
};
|
|
78
|
+
boundChildren.add(childSessionId);
|
|
79
|
+
clearRecovery(sourceSessionId, childSessionId);
|
|
80
|
+
options.onBound?.(childBinding);
|
|
81
|
+
publish();
|
|
82
|
+
return { bound: true };
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
setRecovery(sourceSessionId, childSessionId, error, target);
|
|
86
|
+
return { bound: false };
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const bindChild = (sourceSessionId, childSessionId) => {
|
|
90
|
+
if (disposed || boundChildren.has(childSessionId)) {
|
|
91
|
+
return Promise.resolve({ bound: false });
|
|
92
|
+
}
|
|
93
|
+
const key = recoveryKey(sourceSessionId, childSessionId);
|
|
94
|
+
const current = bindingInFlight.get(key);
|
|
95
|
+
if (current !== undefined)
|
|
96
|
+
return current;
|
|
97
|
+
const promise = attemptBinding(sourceSessionId, childSessionId).finally(() => {
|
|
98
|
+
if (bindingInFlight.get(key) === promise)
|
|
99
|
+
bindingInFlight.delete(key);
|
|
100
|
+
});
|
|
101
|
+
bindingInFlight.set(key, promise);
|
|
102
|
+
return promise;
|
|
103
|
+
};
|
|
104
|
+
const reconcileNow = async () => {
|
|
105
|
+
if (disposed || options.sessions === undefined)
|
|
106
|
+
return;
|
|
107
|
+
const snapshot = options.sessions.getSnapshot();
|
|
108
|
+
if (snapshot.phase === 'pending')
|
|
109
|
+
return;
|
|
110
|
+
if (!Array.isArray(snapshot.ids) || typeof snapshot.byId !== 'object' || snapshot.byId === null) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const candidates = snapshot.ids.flatMap((childSessionId) => {
|
|
114
|
+
const summary = snapshot.byId[childSessionId];
|
|
115
|
+
if (summary?.parentId === undefined ||
|
|
116
|
+
summary.parentId === childSessionId ||
|
|
117
|
+
summary.blank === true ||
|
|
118
|
+
summary.origin === 'subagent' ||
|
|
119
|
+
snapshot.byId[summary.parentId] === undefined) {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
return [{ childSessionId, sourceSessionId: summary.parentId }];
|
|
123
|
+
});
|
|
124
|
+
await Promise.all(candidates.map(({ childSessionId, sourceSessionId }) => bindChild(sourceSessionId, childSessionId).then(() => undefined)));
|
|
125
|
+
};
|
|
126
|
+
const reconcile = () => {
|
|
127
|
+
if (reconciliationInFlight !== undefined) {
|
|
128
|
+
reconciliationAgain = true;
|
|
129
|
+
return reconciliationInFlight;
|
|
130
|
+
}
|
|
131
|
+
const run = async () => {
|
|
132
|
+
do {
|
|
133
|
+
reconciliationAgain = false;
|
|
134
|
+
await reconcileNow();
|
|
135
|
+
} while (!disposed && reconciliationAgain);
|
|
136
|
+
};
|
|
137
|
+
const promise = run().finally(() => {
|
|
138
|
+
if (reconciliationInFlight === promise)
|
|
139
|
+
reconciliationInFlight = undefined;
|
|
140
|
+
});
|
|
141
|
+
reconciliationInFlight = promise;
|
|
142
|
+
return promise;
|
|
143
|
+
};
|
|
144
|
+
return {
|
|
145
|
+
recovery: {
|
|
146
|
+
getSnapshot() {
|
|
147
|
+
return recoverySnapshot;
|
|
148
|
+
},
|
|
149
|
+
subscribe(listener) {
|
|
150
|
+
subscribers.add(listener);
|
|
151
|
+
return () => subscribers.delete(listener);
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
async fork(input) {
|
|
155
|
+
const childSessionId = await options.fork(input);
|
|
156
|
+
if (!disposed)
|
|
157
|
+
await bindChild(input.sessionId, childSessionId);
|
|
158
|
+
return childSessionId;
|
|
159
|
+
},
|
|
160
|
+
reconcile,
|
|
161
|
+
async retry(key) {
|
|
162
|
+
const item = pending.get(key);
|
|
163
|
+
if (item === undefined || disposed)
|
|
164
|
+
return false;
|
|
165
|
+
return (await bindChild(item.sourceSessionId, item.childSessionId)).bound;
|
|
166
|
+
},
|
|
167
|
+
dispose() {
|
|
168
|
+
disposed = true;
|
|
169
|
+
bindingInFlight.clear();
|
|
170
|
+
subscribers.clear();
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=worktree-session-fork.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-session-fork.js","sourceRoot":"","sources":["../../src/client/worktree-session-fork.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { createSnapshotStore as runtimeCreateSnapshotStore, SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client';
|
|
2
|
+
/** Browser-only persistence key; this state never crosses the DSH or sidecar boundary. */
|
|
3
|
+
export declare const WORKTREE_SESSION_ORDER_STORAGE_KEY = "clutch-dsh-worktree.session-order";
|
|
4
|
+
export interface SessionOrderAccountState {
|
|
5
|
+
order: string[];
|
|
6
|
+
observedUpdatedAt: Record<string, number>;
|
|
7
|
+
}
|
|
8
|
+
export interface WorktreeSessionOrderState {
|
|
9
|
+
accounts: Record<string, SessionOrderAccountState>;
|
|
10
|
+
}
|
|
11
|
+
export interface WorktreeSessionOrderActions {
|
|
12
|
+
reconcile: (accountKey: string, baseIds: readonly string[], updatedAtById: Readonly<Record<string, number | undefined>>) => void;
|
|
13
|
+
setOrder: (accountKey: string, order: readonly string[]) => void;
|
|
14
|
+
retain: (accountKeys: readonly string[]) => void;
|
|
15
|
+
}
|
|
16
|
+
export interface WorktreeSessionOrderStore extends SnapshotStore<WorktreeSessionOrderState> {
|
|
17
|
+
readonly actions: WorktreeSessionOrderActions;
|
|
18
|
+
readonly dispose: () => void;
|
|
19
|
+
}
|
|
20
|
+
export type SnapshotStoreFactory = typeof runtimeCreateSnapshotStore;
|
|
21
|
+
/** Normalize persisted state without trusting any browser-local JSON shape. */
|
|
22
|
+
export declare function normalizeWorktreeSessionOrderState(value: unknown): WorktreeSessionOrderState;
|
|
23
|
+
/**
|
|
24
|
+
* Native-style activity order transition. The first observation records timestamps
|
|
25
|
+
* without turning an existing list into a recency sort.
|
|
26
|
+
*/
|
|
27
|
+
export declare function nextSessionOrderAccount(input: {
|
|
28
|
+
readonly baseIds: readonly string[];
|
|
29
|
+
readonly updatedAtById: Readonly<Record<string, number | undefined>>;
|
|
30
|
+
readonly previous?: Readonly<SessionOrderAccountState>;
|
|
31
|
+
}): SessionOrderAccountState;
|
|
32
|
+
/** Apply a successful manual drag without dropping IDs hidden by search. */
|
|
33
|
+
export declare function reorderSessionIds(order: readonly string[], sessionId: string, overSessionId: string, half: 'before' | 'after'): string[];
|
|
34
|
+
/** Create one apply-scoped, browser-local Session ordering store. */
|
|
35
|
+
export declare function createWorktreeSessionOrderStore(snapshotStoreFactory: SnapshotStoreFactory): WorktreeSessionOrderStore;
|
|
36
|
+
//# sourceMappingURL=worktree-session-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-session-order.d.ts","sourceRoot":"","sources":["../../src/client/worktree-session-order.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,IAAI,0BAA0B,EACjD,aAAa,EACd,MAAM,wCAAwC,CAAC;AAEhD,0FAA0F;AAC1F,eAAO,MAAM,kCAAkC,sCAAsC,CAAC;AAEtF,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,CACT,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KACxD,IAAI,CAAC;IACV,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;IACjE,MAAM,EAAE,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,yBAA0B,SAAQ,aAAa,CAAC,yBAAyB,CAAC;IACzF,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,oBAAoB,GAAG,OAAO,0BAA0B,CAAC;AAuCrE,+EAA+E;AAC/E,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,OAAO,GAAG,yBAAyB,CAS5F;AA6BD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,wBAAwB,CAAC,CAAC;CACxD,GAAG,wBAAwB,CA4D3B;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,QAAQ,GAAG,OAAO,GACvB,MAAM,EAAE,CAMV;AASD,qEAAqE;AACrE,wBAAgB,+BAA+B,CAC7C,oBAAoB,EAAE,oBAAoB,GACzC,yBAAyB,CAyD3B"}
|