@cerbur/clutch-dsh-worktree 0.1.2 → 0.1.3
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 +20 -5
- package/lib/client/WorktreeContext.d.ts +15 -0
- package/lib/client/WorktreeContext.d.ts.map +1 -0
- package/lib/client/WorktreeContext.js +19 -0
- package/lib/client/WorktreeContext.js.map +1 -0
- package/lib/client/WorktreeHeroContext.d.ts +10 -0
- package/lib/client/WorktreeHeroContext.d.ts.map +1 -0
- package/lib/client/WorktreeHeroContext.js +128 -0
- package/lib/client/WorktreeHeroContext.js.map +1 -0
- package/lib/client/WorktreeOverlay.d.ts +6 -0
- package/lib/client/WorktreeOverlay.d.ts.map +1 -0
- package/lib/client/WorktreeOverlay.js +8 -0
- package/lib/client/WorktreeOverlay.js.map +1 -0
- package/lib/client/WorktreeSurface.d.ts +3 -1
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +200 -57
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/entry.d.ts +1 -1
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +41 -14
- package/lib/client/entry.js.map +1 -1
- package/lib/client/locales.d.ts +30 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +32 -2
- package/lib/client/locales.js.map +1 -1
- package/lib/client/session-view.d.ts +21 -0
- package/lib/client/session-view.d.ts.map +1 -0
- package/lib/client/session-view.js +26 -0
- package/lib/client/session-view.js.map +1 -0
- package/lib/client/sidebar-overlay-geometry.d.ts +1 -0
- package/lib/client/sidebar-overlay-geometry.d.ts.map +1 -1
- package/lib/client/sidebar-overlay-geometry.js +28 -17
- package/lib/client/sidebar-overlay-geometry.js.map +1 -1
- package/lib/client/virtual-workspace-membership.d.ts.map +1 -1
- package/lib/client/virtual-workspace-membership.js +17 -6
- package/lib/client/virtual-workspace-membership.js.map +1 -1
- package/lib/client/worktree-connection.d.ts +1 -0
- 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-store.d.ts +45 -0
- package/lib/client/worktree-context-store.d.ts.map +1 -0
- package/lib/client/worktree-context-store.js +199 -0
- package/lib/client/worktree-context-store.js.map +1 -0
- package/lib/client/worktree-context.d.ts +32 -0
- package/lib/client/worktree-context.d.ts.map +1 -0
- package/lib/client/worktree-context.js +51 -0
- package/lib/client/worktree-context.js.map +1 -0
- package/lib/client/worktree-error-copy.d.ts.map +1 -1
- package/lib/client/worktree-error-copy.js +14 -0
- package/lib/client/worktree-error-copy.js.map +1 -1
- package/lib/client/worktree-session.d.ts +83 -0
- package/lib/client/worktree-session.d.ts.map +1 -0
- package/lib/client/worktree-session.js +185 -0
- package/lib/client/worktree-session.js.map +1 -0
- package/lib/client/worktree-view.d.ts +37 -3
- package/lib/client/worktree-view.d.ts.map +1 -1
- package/lib/client/worktree-view.js +145 -7
- package/lib/client/worktree-view.js.map +1 -1
- package/lib/client.js +1003 -133
- 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 +17 -2
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +2 -0
- package/lib/contract/index.js.map +1 -1
- package/lib/host/remote.d.ts.map +1 -1
- package/lib/host/remote.js +1 -0
- package/lib/host/remote.js.map +1 -1
- package/lib/host/service.d.ts +6 -1
- package/lib/host/service.d.ts.map +1 -1
- package/lib/host/service.js +6 -0
- package/lib/host/service.js.map +1 -1
- package/lib/manage/manager.d.ts +6 -1
- package/lib/manage/manager.d.ts.map +1 -1
- package/lib/manage/manager.js +12 -1
- package/lib/manage/manager.js.map +1 -1
- package/lib/provider/sidecar.d.ts +2 -1
- package/lib/provider/sidecar.d.ts.map +1 -1
- package/lib/provider/sidecar.js +40 -0
- package/lib/provider/sidecar.js.map +1 -1
- package/lib/provider/types.d.ts +2 -1
- package/lib/provider/types.d.ts.map +1 -1
- package/lib/provider/types.js.map +1 -1
- package/lib/typert.host.js +60 -18
- package/lib/typert.remote-client.d.ts +3 -1
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +60 -18
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -15,7 +15,9 @@ English marketplace description:
|
|
|
15
15
|
- 在 Main 或指定 Worktree 下创建 Session,并直接打开新 Session;
|
|
16
16
|
- 查看 active、detached 和 repair 状态;
|
|
17
17
|
- 通过 active Worktree 的选项菜单移除 Worktree,并在确认弹窗中完成操作;
|
|
18
|
-
- 继续使用 DSH 原生的 Workspace rename/delete/reorder 和 Session
|
|
18
|
+
- 继续使用 DSH 原生的 Workspace rename/delete/reorder 和 Session 菜单、排序能力;Worktree 可在所属 Workspace 内拖动排序,顺序持久化在 plugin sidecar,Main 固定在第一位。
|
|
19
|
+
- 在已有 Session 的 Conversation 标题行显示只读上下文:`Session title → Agent mode → current branch / Worktree branch`。
|
|
20
|
+
- 在新建会话的 Hero 标题后以只读浮层显示 `Workspace (current branch / Worktree branch)`;重新选择 Workspace 后随当前分支上下文更新。
|
|
19
21
|
|
|
20
22
|
Worktree Session 仍属于原始 DSH Project/Workspace,因此切回原生 Project/Session 视角时仍可由 DSH 展示。插件不复制 Session 内容,也不修改消息、prompt、transcript 或历史记录。
|
|
21
23
|
|
|
@@ -24,7 +26,8 @@ Worktree Session 仍属于原始 DSH Project/Workspace,因此切回原生 Proj
|
|
|
24
26
|
- DSH CLI 和目标 Web profile 使用 `dsh-v0.1.0-rc.8`;
|
|
25
27
|
- 已有可启动的 DSH profile,例如 `web` 或 `demo`;
|
|
26
28
|
- plugin 安装在实际启动 Web UI 的同一个 profile;
|
|
27
|
-
-
|
|
29
|
+
- DSH Client 必须提供原生 `@deepseek-ai/dsh-client-ui-conversation` package 的 `conversation.session.header.actions` seat;
|
|
30
|
+
- 要使用 Worktree 功能,目标 Workspace 必须位于 Git repository 中,且至少有一个初始 commit 和本地 branch;如果前置条件不满足,创建弹窗会显示可复制的 Git 命令,但插件不会自动修改 Workspace。
|
|
28
31
|
|
|
29
32
|
package manifest 已声明可安装的 `dsh.bundle`,并随 package 提供 `cordis.patch.yml`;Web UI 使用另行声明的 `dsh.client` browser entry。
|
|
30
33
|
|
|
@@ -103,7 +106,7 @@ pnpm dsh plugin --profile web remove @cerbur/clutch-dsh-worktree
|
|
|
103
106
|
## 使用说明
|
|
104
107
|
|
|
105
108
|
1. 启动 DSH Web UI,在 Sidebar footer 打开 Worktree mode。
|
|
106
|
-
2. 使用 Workspace 的 `+` 选择基线 local branch,填写新的 Worktree name;默认 branch 名为 `dsh/<8
|
|
109
|
+
2. 使用 Workspace 的 `+` 选择基线 local branch,填写新的 Worktree name;默认 branch 名为 `dsh/<8位随机串>`。如果 Workspace 没有 Git、没有首次 commit 或没有本地 branch,弹窗会先显示对应的可复制修复命令。
|
|
107
110
|
3. 使用 Main 旁边的 `+` 创建普通 DSH Session。
|
|
108
111
|
4. 使用 Worktree 旁边的 `+` 创建 cwd 指向该 Worktree 的 Session;插件完成关系绑定后打开它。
|
|
109
112
|
5. 观察 Worktree 的 ready、repair 或 detached 状态;active Worktree 的选项菜单提供 Remove Worktree 入口,Main 和 detached Worktree 不显示该选项。
|
|
@@ -119,15 +122,27 @@ Worktree mode 跟随 DSH 当前界面语言。语言选择和偏好持久化由
|
|
|
119
122
|
Workspace、Session、branch、path 以及 DSH/Host 返回的原始错误信息保持原值,便于
|
|
120
123
|
诊断和继续使用 DSH 原生数据。
|
|
121
124
|
|
|
125
|
+
Worktree mode 的 Main 分组会显示当前 local branch:English 为 `Local (branch)`,中文为
|
|
126
|
+
`本地(branch)`;如果 DSH 没有返回当前分支,则显示 `Local` 或 `本地`。branch 名称保持
|
|
127
|
+
DSH/Git 原值。
|
|
128
|
+
|
|
122
129
|
## 当前限制
|
|
123
130
|
|
|
124
131
|
DSH rc.8 的原生 `session.create` 不能同时接收 `workspaceId` 和独立 `cwd`。Worktree Session 因此先以 `cwd` 创建,再由插件保存关系,并在当前浏览器内投影 Workspace membership;这不会修改 DSH 源码或 Session metadata。需要 DSH 原生持久 attach 时,仍需 DSH 提供同时支持 Workspace 与独立 cwd 的 API。
|
|
125
132
|
|
|
126
|
-
|
|
133
|
+
Worktree `+` 会优先复用当前 active Worktree、相同绝对路径下未归档的 blank Session;已绑定的直接打开,未绑定的先保存 binding 再投影和打开。没有可复用候选时才按 `create → bind → project → open` 创建;同一 Client 内对同一 Worktree 的并发点击会合并为一次流程。binding 失败会保留原 Session ID 供恢复,指向缺失 Session 或错误 cwd 的关系则显示可重试的 repair 状态。
|
|
134
|
+
|
|
135
|
+
未发送第一条 prompt 的 provisional blank Session 遵循 DSH 原生显示规则:仅在当前选中的视角中显示本地化的“新会话”/“New Session”,不显示生成的 Session ID,也不显示重命名、Fork 或归档菜单。首条 prompt 被接受后,原生 Session summary 转为普通会话,Worktree 行恢复显示真实标题和菜单;隐藏 blank 行不会删除 Session 或 Worktree binding。
|
|
136
|
+
|
|
137
|
+
Worktree 顺序按每个 Workspace 独立持久化在 plugin sidecar 的 `worktrees` 数组中,使用与 DSH 原生 `insertBefore` 相同的 source/anchor 语义。Main 是固定的本地视角,不参与 Worktree 拖动;排序不会修改 DSH Workspace、Session 或 Git Worktree 数据。
|
|
138
|
+
|
|
139
|
+
如果 Connection、Gateway 或 Worktree 操作失败,界面会保留可重试的错误,不把失败伪装为空列表。Git 前置条件失败会按 Workspace 独立显示 setup 提示和可复制命令;插件不会自动执行这些命令,也不会写入 README 或 commit。删除 Worktree 不会删除 Session;detached 关系会保留,直到显式解绑。Main 与 Worktree 分组共用一个参数化 split-row;Main 使用相同的 branch/tree icon 和 action rail,但不传入 Worktree remove 菜单。
|
|
140
|
+
|
|
141
|
+
Conversation 上下文显示在已有 Session 的原生标题行;新建会话的空白 Hero 使用 plugin-only `shell.overlay` 在原生标题后显示 `Workspace (branch)`。浮层只在原生 `[data-phase="hero"]` 和标题锚点存在时显示,重新选择 Workspace 后会重新读取对应的 local branch 或 active Worktree branch。它仅供展示,不会写回 DSH Workspace 或 Session;binding 处于 detached、invalid、repair 或 unavailable 状态时,标签会消失。由于 rc.8 没有 Hero 标题的 additive slot,浮层位置依赖原生 Hero 的 DOM 结构,未来应优先迁移到正式 slot。
|
|
127
142
|
|
|
128
143
|
## 版本与发布
|
|
129
144
|
|
|
130
|
-
|
|
145
|
+
本地路径和 Git 依赖安装读取当前 checkout,npm 安装读取 registry;两者不是同一个安装来源。`packages/clutch-dsh-worktree/package.json` 的 `version` 是本地和 npm 的唯一版本源。不要在 README 或市场条目中复制当前版本号;发布修复或新功能时,先递增 package version,再通过 `prepare` 从当前源码生成 `lib/`,然后打包并发布新的 npm version。完整的版本同步、发布、registry 验证和本地/Git/registry 安装流程见 [`docs/RELEASING.md`](docs/RELEASING.md)。
|
|
131
146
|
|
|
132
147
|
## 开发与验证
|
|
133
148
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client';
|
|
2
|
+
import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
3
|
+
import type { WorktreeContextState } from './worktree-context-store.js';
|
|
4
|
+
import { WORKTREE_NS } from './locales.js';
|
|
5
|
+
/** Browser-local context snapshot supplied by the Client entry. */
|
|
6
|
+
export interface WorktreeContextInjected {
|
|
7
|
+
readonly hooks: {
|
|
8
|
+
readonly worktreeContext: SnapshotStore<WorktreeContextState>;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/** Props for the active Session-header context action. */
|
|
12
|
+
export type WorktreeHeaderContextProps = PropsRuntime<'conversation.session.header.actions'> & PropsLocale<typeof WORKTREE_NS> & InjectFace<WorktreeContextInjected>;
|
|
13
|
+
/** Render the current branch or active Worktree branch beside the Session title. */
|
|
14
|
+
export declare function WorktreeHeaderContext({ sessionId, useWorktreeContext, t, }: WorktreeHeaderContextProps): import("react").JSX.Element | null;
|
|
15
|
+
//# sourceMappingURL=WorktreeContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeContext.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,YAAY,EAEb,MAAM,kCAAkC,CAAC;AAI1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,mEAAmE;AACnE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;KAC/D,CAAC;CACH;AAID,0DAA0D;AAC1D,MAAM,MAAM,0BAA0B,GACpC,YAAY,CAAC,qCAAqC,CAAC,GACnD,WAAW,CAAC,OAAO,WAAW,CAAC,GAC/B,UAAU,CAAC,uBAAuB,CAAC,CAAC;AAyBtC,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,kBAAkB,EAClB,CAAC,GACF,EAAE,0BAA0B,sCAI5B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { IconBranchOutline16 } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
3
|
+
import styles from './worktree-context.css';
|
|
4
|
+
function WorktreeContextLabel({ value, t, }) {
|
|
5
|
+
if (value.kind === 'none')
|
|
6
|
+
return null;
|
|
7
|
+
const ariaLabel = value.kind === 'main'
|
|
8
|
+
? t('context.main', { name: value.label })
|
|
9
|
+
: t('context.worktree', { name: value.label });
|
|
10
|
+
return (_jsxs("span", { className: styles.headerContext, title: value.label, "aria-label": ariaLabel, children: [_jsx(IconBranchOutline16, { size: 14, className: styles.contextIcon, "aria-hidden": "true" }), _jsx("span", { className: styles.contextLabel, children: value.label })] }));
|
|
11
|
+
}
|
|
12
|
+
/** Render the current branch or active Worktree branch beside the Session title. */
|
|
13
|
+
export function WorktreeHeaderContext({ sessionId, useWorktreeContext, t, }) {
|
|
14
|
+
const state = useWorktreeContext((snapshot) => snapshot);
|
|
15
|
+
if (state.sessionId !== sessionId)
|
|
16
|
+
return null;
|
|
17
|
+
return _jsx(WorktreeContextLabel, { value: state.value, t: t });
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=WorktreeContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeContext.js","sourceRoot":"","sources":["../../src/client/WorktreeContext.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAK5E,OAAO,MAAM,MAAM,wBAAwB,CAAC;AAiB5C,SAAS,oBAAoB,CAAC,EAC5B,KAAK,EACL,CAAC,GAIF;IACC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM;QACrC,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACjD,OAAO,CACL,gBACE,SAAS,EAAE,MAAM,CAAC,aAAa,EAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,gBACN,SAAS,aAErB,KAAC,mBAAmB,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,iBAAc,MAAM,GAAG,EACnF,eAAM,SAAS,EAAE,MAAM,CAAC,YAAY,YAAG,KAAK,CAAC,KAAK,GAAQ,IACrD,CACR,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,EACpC,SAAS,EACT,kBAAkB,EAClB,CAAC,GAC0B;IAC3B,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,KAAC,oBAAoB,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAI,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
2
|
+
import type { WorktreeContextInjected } from './WorktreeContext.js';
|
|
3
|
+
import { WORKTREE_NS } from './locales.js';
|
|
4
|
+
export type WorktreeHeroContextProps = PropsRuntime<'shell.overlay'> & PropsLocale<typeof WORKTREE_NS> & InjectFace<WorktreeContextInjected>;
|
|
5
|
+
/**
|
|
6
|
+
* Browser-local Hero suffix. It intentionally uses the frame overlay because
|
|
7
|
+
* rc.8 exposes no additive slot beside the native Hero headline.
|
|
8
|
+
*/
|
|
9
|
+
export declare function WorktreeHeroContext({ useWorktreeContext, t, }: WorktreeHeroContextProps): import("react").JSX.Element | null;
|
|
10
|
+
//# sourceMappingURL=WorktreeHeroContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeHeroContext.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeHeroContext.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,YAAY,EAEb,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAK3C,MAAM,MAAM,wBAAwB,GAClC,YAAY,CAAC,eAAe,CAAC,GAC7B,WAAW,CAAC,OAAO,WAAW,CAAC,GAC/B,UAAU,CAAC,uBAAuB,CAAC,CAAC;AA2EtC;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,kBAAkB,EAClB,CAAC,GACF,EAAE,wBAAwB,sCAqE1B"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useLayoutEffect, useState } from 'react';
|
|
3
|
+
import styles from './worktree-context.css';
|
|
4
|
+
function labelFor(state) {
|
|
5
|
+
if (state.status !== 'ready' ||
|
|
6
|
+
state.workspaceTitle === undefined ||
|
|
7
|
+
state.value.kind === 'none') {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
return `${state.workspaceTitle} (${state.value.label})`;
|
|
11
|
+
}
|
|
12
|
+
function elementWithClassSuffix(root, suffix) {
|
|
13
|
+
const candidates = root.querySelectorAll('[class]');
|
|
14
|
+
for (const candidate of candidates) {
|
|
15
|
+
if ([...candidate.classList].some((token) => token === suffix || token.endsWith(`_${suffix}`))) {
|
|
16
|
+
return candidate;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
function headlineElement(root) {
|
|
22
|
+
// Anchor to the visible end of the native title line. The headline wrapper
|
|
23
|
+
// spans the whole content column, so using it would place the suffix at the
|
|
24
|
+
// far edge instead of immediately after the title and preview badge.
|
|
25
|
+
return elementWithClassSuffix(root, 'previewBadge')
|
|
26
|
+
?? elementWithClassSuffix(root, 'headlineText')
|
|
27
|
+
?? elementWithClassSuffix(root, 'headline');
|
|
28
|
+
}
|
|
29
|
+
function positionedAncestor(element) {
|
|
30
|
+
if (element.offsetParent instanceof HTMLElement)
|
|
31
|
+
return element.offsetParent;
|
|
32
|
+
for (let ancestor = element.parentElement; ancestor !== null; ancestor = ancestor.parentElement) {
|
|
33
|
+
if (getComputedStyle(ancestor).position !== 'static')
|
|
34
|
+
return ancestor;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
function measurePlacement(element) {
|
|
39
|
+
const hero = document.querySelector('[data-phase="hero"]');
|
|
40
|
+
// The Slot renderer inserts a display: contents wrapper before the actual
|
|
41
|
+
// shell overlay layer, so the direct parent is not the containing block.
|
|
42
|
+
const overlay = positionedAncestor(element);
|
|
43
|
+
const headline = hero === null ? null : headlineElement(hero);
|
|
44
|
+
if (hero === null || headline === null || overlay === null)
|
|
45
|
+
return null;
|
|
46
|
+
const anchor = headline.getBoundingClientRect();
|
|
47
|
+
const frame = overlay.getBoundingClientRect();
|
|
48
|
+
const width = element.getBoundingClientRect().width;
|
|
49
|
+
const afterHeadlineLeft = anchor.right - frame.left + 8;
|
|
50
|
+
const fitsAfterHeadline = afterHeadlineLeft + width <= frame.width - 8;
|
|
51
|
+
return {
|
|
52
|
+
left: fitsAfterHeadline
|
|
53
|
+
? afterHeadlineLeft
|
|
54
|
+
: Math.max(8, frame.width - width - 8),
|
|
55
|
+
top: fitsAfterHeadline
|
|
56
|
+
? Math.max(8, anchor.top - frame.top + (anchor.height - 22) / 2)
|
|
57
|
+
: Math.max(8, anchor.bottom - frame.top + 8),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function contextAriaLabel(state, t) {
|
|
61
|
+
if (state.value.kind === 'main')
|
|
62
|
+
return t('context.main', { name: state.value.label });
|
|
63
|
+
if (state.value.kind === 'worktree')
|
|
64
|
+
return t('context.worktree', { name: state.value.label });
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Browser-local Hero suffix. It intentionally uses the frame overlay because
|
|
69
|
+
* rc.8 exposes no additive slot beside the native Hero headline.
|
|
70
|
+
*/
|
|
71
|
+
export function WorktreeHeroContext({ useWorktreeContext, t, }) {
|
|
72
|
+
const state = useWorktreeContext((snapshot) => snapshot);
|
|
73
|
+
const label = labelFor(state);
|
|
74
|
+
const [placement, setPlacement] = useState(null);
|
|
75
|
+
const measure = useCallback((element) => {
|
|
76
|
+
if (element === null) {
|
|
77
|
+
setPlacement(null);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
setPlacement(measurePlacement(element));
|
|
81
|
+
}, []);
|
|
82
|
+
useLayoutEffect(() => {
|
|
83
|
+
if (typeof document === 'undefined' || typeof window === 'undefined')
|
|
84
|
+
return undefined;
|
|
85
|
+
const element = document.querySelector('[data-worktree-hero-context]');
|
|
86
|
+
if (element === null)
|
|
87
|
+
return undefined;
|
|
88
|
+
let frameRequest;
|
|
89
|
+
const schedule = () => {
|
|
90
|
+
if (frameRequest !== undefined)
|
|
91
|
+
window.cancelAnimationFrame(frameRequest);
|
|
92
|
+
frameRequest = window.requestAnimationFrame(() => {
|
|
93
|
+
frameRequest = undefined;
|
|
94
|
+
measure(element);
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
const mutationObserver = typeof MutationObserver === 'undefined'
|
|
98
|
+
? undefined
|
|
99
|
+
: new MutationObserver(schedule);
|
|
100
|
+
mutationObserver?.observe(document.body, {
|
|
101
|
+
subtree: true,
|
|
102
|
+
childList: true,
|
|
103
|
+
attributes: true,
|
|
104
|
+
attributeFilter: ['class', 'data-phase'],
|
|
105
|
+
});
|
|
106
|
+
const resizeObserver = typeof ResizeObserver === 'undefined'
|
|
107
|
+
? undefined
|
|
108
|
+
: new ResizeObserver(schedule);
|
|
109
|
+
resizeObserver?.observe(positionedAncestor(element) ?? element);
|
|
110
|
+
window.addEventListener('resize', schedule);
|
|
111
|
+
schedule();
|
|
112
|
+
return () => {
|
|
113
|
+
if (frameRequest !== undefined)
|
|
114
|
+
window.cancelAnimationFrame(frameRequest);
|
|
115
|
+
mutationObserver?.disconnect();
|
|
116
|
+
resizeObserver?.disconnect();
|
|
117
|
+
window.removeEventListener('resize', schedule);
|
|
118
|
+
};
|
|
119
|
+
}, [label, measure]);
|
|
120
|
+
const ariaLabel = contextAriaLabel(state, t);
|
|
121
|
+
if (label === undefined)
|
|
122
|
+
return null;
|
|
123
|
+
return (_jsx("span", { ref: measure, className: styles.heroContext, "data-worktree-hero-context": true, "aria-label": ariaLabel, title: label, style: placement === null ? { visibility: 'hidden' } : {
|
|
124
|
+
left: `${placement.left}px`,
|
|
125
|
+
top: `${placement.top}px`,
|
|
126
|
+
}, children: label }));
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=WorktreeHeroContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeHeroContext.js","sourceRoot":"","sources":["../../src/client/WorktreeHeroContext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { WorktreeHeroContextProps } from './WorktreeHeroContext.js';
|
|
2
|
+
import { type WorktreeSurfaceProps } from './WorktreeSurface.js';
|
|
3
|
+
export type WorktreeOverlayProps = WorktreeSurfaceProps & Pick<WorktreeHeroContextProps, 'useWorktreeContext'>;
|
|
4
|
+
/** Compose the independent Hero context and Worktree navigation overlays. */
|
|
5
|
+
export declare function WorktreeOverlay(props: WorktreeOverlayProps): import("react").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=WorktreeOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeOverlay.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAElF,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,GACrD,IAAI,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,CAAC;AAEvD,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAO1D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { WorktreeHeroContext } from './WorktreeHeroContext.js';
|
|
3
|
+
import { WorktreeSurface } from './WorktreeSurface.js';
|
|
4
|
+
/** Compose the independent Hero context and Worktree navigation overlays. */
|
|
5
|
+
export function WorktreeOverlay(props) {
|
|
6
|
+
return (_jsxs(_Fragment, { children: [_jsx(WorktreeHeroContext, { ...props }), _jsx(WorktreeSurface, { ...props })] }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=WorktreeOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeOverlay.js","sourceRoot":"","sources":["../../src/client/WorktreeOverlay.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAA6B,MAAM,sBAAsB,CAAC;AAKlF,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,OAAO,CACL,8BACE,KAAC,mBAAmB,OAAK,KAAK,GAAI,EAClC,KAAC,eAAe,OAAK,KAAK,GAAI,IAC7B,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -9,11 +9,13 @@ export interface WorktreeSurfaceInjected {
|
|
|
9
9
|
readonly manager?: WorktreeManager;
|
|
10
10
|
readonly createWorkspace?: () => Promise<void>;
|
|
11
11
|
readonly createSessionForWorktree?: (input: CreateSessionForWorktreeInput) => Promise<string>;
|
|
12
|
+
readonly invalidateWorktreeContext?: (workspaceId?: string) => Promise<void>;
|
|
12
13
|
readonly createMainSession?: (workspaceId: string) => void;
|
|
13
14
|
readonly renameWorkspace?: (workspaceId: string, title: string) => Promise<void>;
|
|
14
15
|
readonly deleteWorkspace?: (workspaceId: string) => Promise<void>;
|
|
15
16
|
readonly insertWorkspaceBefore?: (workspaceId: string, beforeWorkspaceId?: string) => Promise<void>;
|
|
16
17
|
readonly insertSessionBefore?: (workspaceId: string, sessionId: string, beforeSessionId?: string) => Promise<void>;
|
|
18
|
+
readonly insertWorktreeBefore?: (workspaceId: string, worktreeId: string, beforeWorktreeId?: string) => Promise<readonly string[]>;
|
|
17
19
|
readonly renameSession?: (sessionId: string, title: string) => Promise<void>;
|
|
18
20
|
readonly forkSession?: (sessionId: string) => void;
|
|
19
21
|
readonly archiveSession?: (sessionId: string) => Promise<void>;
|
|
@@ -30,5 +32,5 @@ export type WorktreeSurfaceProps = PropsRuntime<'shell.overlay'> & PropsStore<Re
|
|
|
30
32
|
* Peer Worktree navigation surface. It keeps the original DSH Workspace mode
|
|
31
33
|
* intact and renders a browser-local Workspace → Worktree → Session projection.
|
|
32
34
|
*/
|
|
33
|
-
export declare function WorktreeSurface({ useStore, actions, useSessions, useWorkspaces, t, available, manager, createWorkspace, createSessionForWorktree: createSessionCallback, createMainSession, renameWorkspace, deleteWorkspace, insertWorkspaceBefore, insertSessionBefore, renameSession, forkSession, archiveSession, ensureSessionWorkspace, syncSessionWorkspaces, openSession, }: WorktreeSurfaceProps): import("react").JSX.Element | null;
|
|
35
|
+
export declare function WorktreeSurface({ useStore, actions, useSessions, useWorkspaces, t, available, manager, invalidateWorktreeContext, createWorkspace, createSessionForWorktree: createSessionCallback, createMainSession, renameWorkspace, deleteWorkspace, insertWorkspaceBefore, insertSessionBefore, insertWorktreeBefore, renameSession, forkSession, archiveSession, ensureSessionWorkspace, syncSessionWorkspaces, openSession, }: WorktreeSurfaceProps): import("react").JSX.Element | null;
|
|
34
36
|
//# sourceMappingURL=WorktreeSurface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreeSurface.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeSurface.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EAEX,MAAM,kCAAkC,CAAC;AAsB1C,OAAO,KAAK,EAAkB,eAAe,EAAkB,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"WorktreeSurface.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeSurface.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EAEX,MAAM,kCAAkC,CAAC;AAsB1C,OAAO,KAAK,EAAkB,eAAe,EAAkB,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAWpE,OAAO,EAaL,KAAK,6BAA6B,EAKnC,MAAM,oBAAoB,CAAC;AAc5B,yEAAyE;AACzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAClC,KAAK,EAAE,6BAA6B,KACjC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAC/B,WAAW,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,MAAM,KACvB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAC9B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,MAAM,KACtB,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnF,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAC/B,QAAQ,EAAE,SAAS;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,KAC5D,IAAI,CAAC;IACV,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,kFAAkF;AAClF,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,eAAe,CAAC,GAC9D,UAAU,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,GACtD,WAAW,CAAC,OAAO,WAAW,CAAC,GAC/B,uBAAuB,CAAC;AA4tB1B;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAO,EACP,WAAW,EACX,aAAa,EACb,CAAC,EACD,SAAS,EACT,OAAO,EACP,yBAAyB,EACzB,eAAe,EACf,wBAAwB,EAAE,qBAAqB,EAC/C,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,WAAW,GACZ,EAAE,oBAAoB,sCAuzCtB"}
|