@alpacachen/dsh-simple-worktree 1.0.2

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 alpacachen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # dsh-simple-worktree
2
+
3
+ A lightweight Git worktree plugin for DeepSeek Harness.
4
+
5
+ [简体中文](README.zh.md) · **English**
6
+
7
+ ## Features
8
+
9
+ - Create a Git worktree from any Git Workspace.
10
+ - Choose the current branch or the repository's main branch.
11
+ - Register and open the new worktree as a DSH Workspace.
12
+ - Create task branches as `task/<name>`.
13
+ - No additional service or project configuration.
14
+ - Supports DSH themes, Chinese, and English.
15
+
16
+ ## Usage
17
+
18
+ ### Install
19
+
20
+ ```sh
21
+ dsh plugin --profile web add @alpacachen/dsh-simple-worktree
22
+ ```
23
+
24
+ Restart `dsh web` after installation.
25
+
26
+ You can also install from GitHub with `dsh plugin --profile web add github:alpacachen/dsh-worktree`.
27
+
28
+ ### Create a worktree
29
+
30
+ 1. Open a Git Workspace.
31
+ 2. Open the Workspace menu and choose **Create worktree**.
32
+ 3. Enter a task name, such as `login-fix`.
33
+ 4. Choose **Current branch** or **Main branch**.
34
+ 5. Click **Create and open**.
35
+
36
+ The worktree is created at:
37
+
38
+ ```text
39
+ project.worktrees/login-fix/
40
+ └── branch: task/login-fix
41
+ ```
42
+
43
+ The new Workspace is named `<parent>/<task>`.
package/README.zh.md ADDED
@@ -0,0 +1,43 @@
1
+ # dsh-simple-worktree
2
+
3
+ 一个轻量的 Git Worktree 插件,用于 DeepSeek Harness。
4
+
5
+ **简体中文** · [English](README.md)
6
+
7
+ ## 功能
8
+
9
+ - 从任意 Git Workspace 创建 Worktree。
10
+ - 支持当前分支和仓库主分支。
11
+ - 将新 Worktree 注册并打开为 DSH Workspace。
12
+ - 自动创建 `task/<name>` 格式的任务分支。
13
+ - 不需要额外服务或项目配置。
14
+ - 支持 DSH 主题、中文和英文界面。
15
+
16
+ ## 使用
17
+
18
+ ### 安装
19
+
20
+ ```sh
21
+ dsh plugin --profile web add @alpacachen/dsh-simple-worktree
22
+ ```
23
+
24
+ 安装后重启 `dsh web`。
25
+
26
+ 也可以通过 GitHub 安装:`dsh plugin --profile web add github:alpacachen/dsh-worktree`。
27
+
28
+ ### 创建 Worktree
29
+
30
+ 1. 打开一个 Git Workspace。
31
+ 2. 打开 Workspace 菜单,选择 **创建 Worktree**。
32
+ 3. 输入任务名称,例如 `login-fix`。
33
+ 4. 选择 **当前分支** 或 **主分支**。
34
+ 5. 点击 **创建并打开**。
35
+
36
+ Worktree 会创建在:
37
+
38
+ ```text
39
+ project.worktrees/login-fix/
40
+ └── branch: task/login-fix
41
+ ```
42
+
43
+ 新 Workspace 的名称为 `<父 Workspace>/<任务名称>`。
@@ -0,0 +1,169 @@
1
+ window.__ModuleLoader__.load({
2
+ id: "@alpacachen/dsh-simple-worktree",
3
+ factory: function (require) {
4
+ var module = { exports: {} }
5
+ var exports = module.exports
6
+ "use strict";var ro=Object.create;var ge=Object.defineProperty;var uo=Object.getOwnPropertyDescriptor;var lo=Object.getOwnPropertyNames;var so=Object.getPrototypeOf,fo=Object.prototype.hasOwnProperty;var no=(e,a)=>{for(var t in a)ge(e,t,{get:a[t],enumerable:!0})},ga=(e,a,t,o)=>{if(a&&typeof a=="object"||typeof a=="function")for(let r of lo(a))!fo.call(e,r)&&r!==t&&ge(e,r,{get:()=>a[r],enumerable:!(o=uo(a,r))||o.enumerable});return e};var v=(e,a,t)=>(t=e!=null?ro(so(e)):{},ga(a||!e||!e.__esModule?ge(t,"default",{value:e,enumerable:!0}):t,e)),io=e=>ga(ge({},"__esModule",{value:!0}),e);var Rr={};no(Rr,{default:()=>br});module.exports=io(Rr);var We=require("react");var Sa=`@layer dsh-simple-worktree {
7
+ .dswt-dialog-overlay {
8
+ position: fixed;
9
+ inset: 0;
10
+ z-index: 1000;
11
+ background: color-mix(in srgb, #000 80%, transparent);
12
+ }
13
+
14
+ .dswt-dialog-content {
15
+ position: fixed;
16
+ z-index: 1001;
17
+ top: 50%;
18
+ left: 50%;
19
+ box-sizing: border-box;
20
+ width: min(420px, calc(100vw - 32px));
21
+ transform: translate(-50%, -50%);
22
+ outline: none;
23
+ border: 1px solid var(--dsw-alias-border-inverted, var(--dsw-alias-border-l2, #ddd));
24
+ border-radius: 14px;
25
+ padding: 20px;
26
+ color: var(--dsw-alias-label-primary, #111);
27
+ background: var(--dsw-specific-menu, var(--dsw-alias-bg-overlay, #fff));
28
+ box-shadow: var(--dsw-shadow-lv3, 0 16px 48px rgb(0 0 0 / .2));
29
+ font-family: inherit;
30
+ font-size: 13px;
31
+ line-height: 20px;
32
+ }
33
+
34
+ .dswt-dialog-close {
35
+ position: absolute;
36
+ top: 12px;
37
+ right: 12px;
38
+ display: inline-flex;
39
+ align-items: center;
40
+ justify-content: center;
41
+ width: 28px;
42
+ height: 28px;
43
+ border: 0;
44
+ border-radius: 8px;
45
+ padding: 0;
46
+ color: var(--dsw-alias-label-tertiary, #777);
47
+ background: transparent;
48
+ cursor: pointer;
49
+ }
50
+
51
+ .dswt-dialog-close:hover { color: var(--dsw-alias-label-primary, #111); background: var(--dsw-alias-interactive-bg-hover, rgb(0 0 0 / .06)); }
52
+ .dswt-dialog-title { margin: 0; padding: 0 28px 0 0; color: var(--dsw-alias-label-primary, #111); font-size: 16px; font-weight: 500; line-height: 24px; }
53
+ .dswt-visually-hidden { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
54
+ .dswt-field { display: block; box-sizing: border-box; min-width: 0; margin: 18px 0 0; border: 0; padding: 0; color: var(--dsw-alias-label-secondary, #666); font-size: 12px; line-height: 18px; }
55
+ .dswt-field-label { display: block; margin: 0 0 7px; color: var(--dsw-alias-label-secondary, #666); font-size: 12px; line-height: 18px; }
56
+ .dswt-base-fieldset { margin-top: 20px; }
57
+
58
+ .dswt-input {
59
+ display: block;
60
+ box-sizing: border-box;
61
+ width: 100%;
62
+ min-height: 36px;
63
+ margin: 0;
64
+ border: 1px solid var(--dsw-alias-border-l2, #ccc);
65
+ border-radius: 8px;
66
+ padding: 7px 10px;
67
+ color: var(--dsw-alias-label-primary, #111);
68
+ background: var(--dsw-alias-bg-layer-1, #fff);
69
+ font: inherit;
70
+ font-size: 13px;
71
+ line-height: 20px;
72
+ outline: none;
73
+ }
74
+
75
+ .dswt-input::placeholder { color: var(--dsw-alias-label-tertiary, #888); }
76
+ .dswt-input:hover:not(:disabled) { border-color: var(--dsw-alias-border-l1, #bbb); }
77
+ .dswt-input:focus-visible { border-color: var(--dsw-alias-brand-primary, #2563eb); box-shadow: 0 0 0 2px color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 20%, transparent); }
78
+
79
+ .dswt-radio-group { display: grid; gap: 8px; }
80
+ .dswt-radio-option { display: flex; align-items: center; gap: 10px; box-sizing: border-box; min-height: 54px; border: 1px solid var(--dsw-alias-border-l2, #ccc); border-radius: 10px; padding: 9px 11px; color: var(--dsw-alias-label-primary, #111); background: var(--dsw-alias-bg-layer-1, #fff); cursor: pointer; transition: border-color .15s var(--ds-ease-in-out), background .15s var(--ds-ease-in-out), box-shadow .15s var(--ds-ease-in-out); }
81
+ .dswt-radio-option:hover { border-color: var(--dsw-alias-border-l1, #bbb); background: var(--dsw-alias-interactive-bg-hover, rgb(0 0 0 / .04)); }
82
+ .dswt-radio-option[data-selected="true"] { border-color: var(--dsw-alias-brand-primary, #2563eb); background: var(--dsw-alias-bg-layer-1, #fff); box-shadow: inset 0 0 0 1px var(--dsw-alias-brand-primary, #2563eb); }
83
+ .dswt-radio-option:has(.dswt-radio-input:focus-visible) { outline: 2px solid color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 36%, transparent); outline-offset: 2px; }
84
+ .dswt-radio-input { flex: none; width: 16px; height: 16px; margin: 0; accent-color: var(--dsw-alias-brand-primary, #2563eb); cursor: pointer; }
85
+ .dswt-radio-copy { display: flex; min-width: 0; flex-direction: column; gap: 1px; }
86
+ .dswt-radio-label { color: var(--dsw-alias-label-primary, #111); font-size: 13px; line-height: 19px; }
87
+ .dswt-radio-branch { overflow: hidden; color: var(--dsw-alias-label-tertiary, #777); text-overflow: ellipsis; white-space: nowrap; font-size: 12px; line-height: 17px; }
88
+
89
+ .dswt-button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; box-sizing: border-box; min-height: 32px; padding: 6px 12px; border: 1px solid var(--dsw-alias-border-l2, #ccc); border-radius: 8px; color: var(--dsw-alias-label-primary, #111); background: var(--dsw-alias-bg-layer-1, #fff); cursor: pointer; font: inherit; font-size: 13px; line-height: 18px; }
90
+ .dswt-button:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover, rgb(0 0 0 / .06)); }
91
+ .dswt-button:focus-visible { outline: 2px solid var(--dsw-alias-brand-primary, #2563eb); outline-offset: 2px; }
92
+ .dswt-button-primary { min-width: 96px; border-color: var(--dsw-alias-button-primary-fill, var(--dsw-alias-brand-primary, #2563eb)); color: var(--dsw-alias-label-primary-foreground, #fff); background: var(--dsw-alias-button-primary-fill, var(--dsw-alias-brand-primary, #2563eb)); }
93
+ .dswt-button-primary:hover:not(:disabled) { background: var(--dsw-alias-button-primary-hover, var(--dsw-alias-brand-primary, #2563eb)); }
94
+ .dswt-button:disabled { cursor: not-allowed; opacity: .5; }
95
+ .dswt-spin { animation: dswt-spin 1s linear infinite; }
96
+ @keyframes dswt-spin { to { transform: rotate(360deg); } }
97
+ .dswt-error { display: flex; align-items: flex-start; gap: 6px; margin-top: 14px; border-radius: 8px; padding: 8px 10px; color: var(--dsw-alias-state-error-primary, #b42318); background: var(--dsw-alias-state-error-secondary, #fff1f0); font-size: 12px; line-height: 18px; }
98
+ .dswt-dialog-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 22px; }
99
+ }
100
+
101
+ @media (prefers-reduced-motion: reduce) {
102
+ .dswt-dialog-overlay, .dswt-dialog-overlay *, .dswt-dialog-content, .dswt-dialog-content * { animation-duration: .01ms !important; transition-duration: .01ms !important; }
103
+ }
104
+ `;var Q=require("react");var we=require("react");var wa=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Se=(...e)=>e.filter((a,t,o)=>!!a&&a.trim()!==""&&o.indexOf(a)===t).join(" ").trim();var ce=require("react");var va={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var Pa=(0,ce.forwardRef)(({color:e="currentColor",size:a=24,strokeWidth:t=2,absoluteStrokeWidth:o,className:r="",children:u,iconNode:d,...l},i)=>(0,ce.createElement)("svg",{ref:i,...va,width:a,height:a,stroke:e,strokeWidth:o?Number(t)*24/Number(a):t,className:Se("lucide",r),...l},[...d.map(([f,c])=>(0,ce.createElement)(f,c)),...Array.isArray(u)?u:[u]]));var ue=(e,a)=>{let t=(0,we.forwardRef)(({className:o,...r},u)=>(0,we.createElement)(Pa,{ref:u,iconNode:a,className:Se(`lucide-${wa(e)}`,o),...r}));return t.displayName=`${e}`,t};var po=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],j=ue("CircleAlert",po);var mo=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],Z=ue("LoaderCircle",mo);var Lo=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],pe=ue("X",Lo);var ka=require("react"),ve="dsh-simple-worktree",ba={createWorktree:"\u521B\u5EFA worktree",dialogTitle:"{name} worktree",basedOn:"\u57FA\u4E8E",currentBranch:"\u5F53\u524D\u5206\u652F",mainBranch:"\u4E3B\u5206\u652F",taskName:"\u540D\u79F0",taskNamePlaceholder:"\u4F8B\u5982 login-fix",cancel:"\u53D6\u6D88",createAndOpen:"\u521B\u5EFA\u5E76\u6253\u5F00",creating:"\u521B\u5EFA\u4E2D\u2026",fillTaskName:"\u8BF7\u586B\u5199\u540D\u79F0\u3002",operationFailed:"worktree \u64CD\u4F5C\u5931\u8D25\uFF1A",close:"\u5173\u95ED",notGitWorkspace:"\u5F53\u524D Workspace \u4E0D\u662F Git \u4ED3\u5E93\u3002"},xo={createWorktree:"Create worktree",dialogTitle:"{name} worktree",basedOn:"Base",currentBranch:"Current branch",mainBranch:"Main branch",taskName:"Name",taskNamePlaceholder:"e.g. login-fix",cancel:"Cancel",createAndOpen:"Create and open",creating:"Creating\u2026",fillTaskName:"Enter a name.",operationFailed:"worktree operation failed: ",close:"Close",notGitWorkspace:"The current Workspace is not a Git repository."},K=null,Pe=null;function Ra(e){let a=e?.get?.("locale");if(!a||typeof a.register!="function"||typeof a.bind!="function")return()=>{};K=a;let t;try{t=a.register(ve,{zh:ba,en:xo})}catch{}return Pe=a.bind(ve),()=>{t?.(),K===a&&(K=null,Pe=null)}}function ye(e){return Pe?Pe(e):ba[e]??e}var Io=e=>K&&typeof K.subscribe=="function"?K.subscribe(e):()=>{},ya=()=>K&&typeof K.getSnapshot=="function"?K.getSnapshot():null;function ke(){return(0,ka.useSyncExternalStore)(Io,ya,ya),ye}function Aa(e,a){return e.replace(/\{(\w+)\}/g,(t,o)=>a[o]??`{${o}}`)}function E(e){let a=String(e??"");return a.length>1?a.replace(/[\\/]+$/,""):a}function Da(e){return String(e||"task").trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"task"}function Ba(e,a){let t=e.includes("\\")?"\\":"/";return`${E(e)}.worktrees${t}${a}`}var w=v(require("react"),1);function _(e,a,{checkForDefaultPrevented:t=!0}={}){return function(r){if(e?.(r),t===!1||!r.defaultPrevented)return a?.(r)}}var Fa=v(require("react"),1);function Ma(e,a){if(typeof e=="function")return e(a);e!=null&&(e.current=a)}function Ge(...e){return a=>{let t=!1,o=e.map(r=>{let u=Ma(r,a);return!t&&typeof u=="function"&&(t=!0),u});if(t)return()=>{for(let r=0;r<o.length;r++){let u=o[r];typeof u=="function"?u():Ma(e[r],null)}}}}function G(...e){return Fa.useCallback(Ge(...e),e)}var U=v(require("react"),1),Ve=require("react/jsx-runtime");function Ta(e,a){let t=U.createContext(a),o=u=>{let{children:d,...l}=u,i=U.useMemo(()=>l,Object.values(l));return(0,Ve.jsx)(t.Provider,{value:i,children:d})};o.displayName=e+"Provider";function r(u){let d=U.useContext(t);if(d)return d;if(a!==void 0)return a;throw new Error(`\`${u}\` must be used within \`${e}\``)}return[o,r]}function Oa(e,a=[]){let t=[];function o(u,d){let l=U.createContext(d),i=t.length;t=[...t,d];let f=n=>{let{scope:m,children:L,...x}=n,s=m?.[e]?.[i]||l,p=U.useMemo(()=>x,Object.values(x));return(0,Ve.jsx)(s.Provider,{value:p,children:L})};f.displayName=u+"Provider";function c(n,m){let L=m?.[e]?.[i]||l,x=U.useContext(L);if(x)return x;if(d!==void 0)return d;throw new Error(`\`${n}\` must be used within \`${u}\``)}return[f,c]}let r=()=>{let u=t.map(d=>U.createContext(d));return function(l){let i=l?.[e]||u;return U.useMemo(()=>({[`__scope${e}`]:{...l,[e]:i}}),[l,i])}};return r.scopeName=e,[o,ho(r,...a)]}function ho(...e){let a=e[0];if(e.length===1)return a;let t=()=>{let o=e.map(r=>({useScope:r(),scopeName:r.scopeName}));return function(u){let d=o.reduce((l,{useScope:i,scopeName:f})=>{let n=i(u)[`__scope${f}`];return{...l,...n}},{});return U.useMemo(()=>({[`__scope${a.scopeName}`]:d}),[d])}};return t.scopeName=a.scopeName,t}var be=v(require("react"),1);var qa=v(require("react"),1),Y=globalThis?.document?qa.useLayoutEffect:()=>{};var Co=be.useId||(()=>{}),go=0;function Re(e){let[a,t]=be.useState(Co());return Y(()=>{e||t(o=>o??String(go++))},[e]),e||(a?`radix-${a}`:"")}var J=v(require("react"),1);var le=v(require("react"),1);function V(e){let a=le.useRef(e);return le.useEffect(()=>{a.current=e}),le.useMemo(()=>(...t)=>a.current?.(...t),[])}function Ea({prop:e,defaultProp:a,onChange:t=()=>{}}){let[o,r]=So({defaultProp:a,onChange:t}),u=e!==void 0,d=u?e:o,l=V(t),i=J.useCallback(f=>{if(u){let n=typeof f=="function"?f(e):f;n!==e&&l(n)}else r(f)},[u,e,r,l]);return[d,i]}function So({defaultProp:e,onChange:a}){let t=J.useState(e),[o]=t,r=J.useRef(o),u=V(a);return J.useEffect(()=>{r.current!==o&&(u(o),r.current=o)},[o,r,u]),t}var b=v(require("react"),1);var Ua=v(require("react"),1),Ha=v(require("react-dom"),1);var B=v(require("react"),1);var de=require("react/jsx-runtime"),me=B.forwardRef((e,a)=>{let{children:t,...o}=e,r=B.Children.toArray(t),u=r.find(vo);if(u){let d=u.props.children,l=r.map(i=>i===u?B.Children.count(d)>1?B.Children.only(null):B.isValidElement(d)?d.props.children:null:i);return(0,de.jsx)(ze,{...o,ref:a,children:B.isValidElement(d)?B.cloneElement(d,void 0,l):null})}return(0,de.jsx)(ze,{...o,ref:a,children:t})});me.displayName="Slot";var ze=B.forwardRef((e,a)=>{let{children:t,...o}=e;if(B.isValidElement(t)){let r=yo(t),u=Po(o,t.props);return t.type!==B.Fragment&&(u.ref=a?Ge(a,r):r),B.cloneElement(t,u)}return B.Children.count(t)>1?B.Children.only(null):null});ze.displayName="SlotClone";var wo=({children:e})=>(0,de.jsx)(de.Fragment,{children:e});function vo(e){return B.isValidElement(e)&&e.type===wo}function Po(e,a){let t={...a};for(let o in a){let r=e[o],u=a[o];/^on[A-Z]/.test(o)?r&&u?t[o]=(...l)=>{u(...l),r(...l)}:r&&(t[o]=r):o==="style"?t[o]={...r,...u}:o==="className"&&(t[o]=[r,u].filter(Boolean).join(" "))}return{...e,...t}}function yo(e){let a=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,t=a&&"isReactWarning"in a&&a.isReactWarning;return t?e.ref:(a=Object.getOwnPropertyDescriptor(e,"ref")?.get,t=a&&"isReactWarning"in a&&a.isReactWarning,t?e.props.ref:e.props.ref||e.ref)}var Na=require("react/jsx-runtime"),ko=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","span","svg","ul"],q=ko.reduce((e,a)=>{let t=Ua.forwardRef((o,r)=>{let{asChild:u,...d}=o,l=u?me:a;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),(0,Na.jsx)(l,{...d,ref:r})});return t.displayName=`Primitive.${a}`,{...e,[a]:t}},{});function Wa(e,a){e&&Ha.flushSync(()=>e.dispatchEvent(a))}var Ga=v(require("react"),1);function Va(e,a=globalThis?.document){let t=V(e);Ga.useEffect(()=>{let o=r=>{r.key==="Escape"&&t(r)};return a.addEventListener("keydown",o,{capture:!0}),()=>a.removeEventListener("keydown",o,{capture:!0})},[t,a])}var Xe=require("react/jsx-runtime"),bo="DismissableLayer",_e="dismissableLayer.update",Ro="dismissableLayer.pointerDownOutside",Ao="dismissableLayer.focusOutside",za,Xa=b.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Ke=b.forwardRef((e,a)=>{let{disableOutsidePointerEvents:t=!1,onEscapeKeyDown:o,onPointerDownOutside:r,onFocusOutside:u,onInteractOutside:d,onDismiss:l,...i}=e,f=b.useContext(Xa),[c,n]=b.useState(null),m=c?.ownerDocument??globalThis?.document,[,L]=b.useState({}),x=G(a,I=>n(I)),s=Array.from(f.layers),[p]=[...f.layersWithOutsidePointerEventsDisabled].slice(-1),h=s.indexOf(p),C=c?s.indexOf(c):-1,k=f.layersWithOutsidePointerEventsDisabled.size>0,A=C>=h,y=Mo(I=>{let N=I.target,R=[...f.branches].some(M=>M.contains(N));!A||R||(r?.(I),d?.(I),I.defaultPrevented||l?.())},m),D=Fo(I=>{let N=I.target;[...f.branches].some(M=>M.contains(N))||(u?.(I),d?.(I),I.defaultPrevented||l?.())},m);return Va(I=>{C===f.layers.size-1&&(o?.(I),!I.defaultPrevented&&l&&(I.preventDefault(),l()))},m),b.useEffect(()=>{if(c)return t&&(f.layersWithOutsidePointerEventsDisabled.size===0&&(za=m.body.style.pointerEvents,m.body.style.pointerEvents="none"),f.layersWithOutsidePointerEventsDisabled.add(c)),f.layers.add(c),_a(),()=>{t&&f.layersWithOutsidePointerEventsDisabled.size===1&&(m.body.style.pointerEvents=za)}},[c,m,t,f]),b.useEffect(()=>()=>{c&&(f.layers.delete(c),f.layersWithOutsidePointerEventsDisabled.delete(c),_a())},[c,f]),b.useEffect(()=>{let I=()=>L({});return document.addEventListener(_e,I),()=>document.removeEventListener(_e,I)},[]),(0,Xe.jsx)(q.div,{...i,ref:x,style:{pointerEvents:k?A?"auto":"none":void 0,...e.style},onFocusCapture:_(e.onFocusCapture,D.onFocusCapture),onBlurCapture:_(e.onBlurCapture,D.onBlurCapture),onPointerDownCapture:_(e.onPointerDownCapture,y.onPointerDownCapture)})});Ke.displayName=bo;var Do="DismissableLayerBranch",Bo=b.forwardRef((e,a)=>{let t=b.useContext(Xa),o=b.useRef(null),r=G(a,o);return b.useEffect(()=>{let u=o.current;if(u)return t.branches.add(u),()=>{t.branches.delete(u)}},[t.branches]),(0,Xe.jsx)(q.div,{...e,ref:r})});Bo.displayName=Do;function Mo(e,a=globalThis?.document){let t=V(e),o=b.useRef(!1),r=b.useRef(()=>{});return b.useEffect(()=>{let u=l=>{if(l.target&&!o.current){let f=function(){Ka(Ro,t,c,{discrete:!0})};var i=f;let c={originalEvent:l};l.pointerType==="touch"?(a.removeEventListener("click",r.current),r.current=f,a.addEventListener("click",r.current,{once:!0})):f()}else a.removeEventListener("click",r.current);o.current=!1},d=window.setTimeout(()=>{a.addEventListener("pointerdown",u)},0);return()=>{window.clearTimeout(d),a.removeEventListener("pointerdown",u),a.removeEventListener("click",r.current)}},[a,t]),{onPointerDownCapture:()=>o.current=!0}}function Fo(e,a=globalThis?.document){let t=V(e),o=b.useRef(!1);return b.useEffect(()=>{let r=u=>{u.target&&!o.current&&Ka(Ao,t,{originalEvent:u},{discrete:!1})};return a.addEventListener("focusin",r),()=>a.removeEventListener("focusin",r)},[a,t]),{onFocusCapture:()=>o.current=!0,onBlurCapture:()=>o.current=!1}}function _a(){let e=new CustomEvent(_e);document.dispatchEvent(e)}function Ka(e,a,t,{discrete:o}){let r=t.originalEvent.target,u=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:t});a&&r.addEventListener(e,a,{once:!0}),o?Wa(r,u):r.dispatchEvent(u)}var H=v(require("react"),1);var Qa=require("react/jsx-runtime"),je="focusScope.autoFocusOnMount",Ze="focusScope.autoFocusOnUnmount",ja={bubbles:!1,cancelable:!0},To="FocusScope",Je=H.forwardRef((e,a)=>{let{loop:t=!1,trapped:o=!1,onMountAutoFocus:r,onUnmountAutoFocus:u,...d}=e,[l,i]=H.useState(null),f=V(r),c=V(u),n=H.useRef(null),m=G(a,s=>i(s)),L=H.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;H.useEffect(()=>{if(o){let C=function(D){if(L.paused||!l)return;let I=D.target;l.contains(I)?n.current=I:$(n.current,{select:!0})},k=function(D){if(L.paused||!l)return;let I=D.relatedTarget;I!==null&&(l.contains(I)||$(n.current,{select:!0}))},A=function(D){if(document.activeElement===document.body)for(let N of D)N.removedNodes.length>0&&$(l)};var s=C,p=k,h=A;document.addEventListener("focusin",C),document.addEventListener("focusout",k);let y=new MutationObserver(A);return l&&y.observe(l,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",C),document.removeEventListener("focusout",k),y.disconnect()}}},[o,l,L.paused]),H.useEffect(()=>{if(l){Ja.add(L);let s=document.activeElement;if(!l.contains(s)){let h=new CustomEvent(je,ja);l.addEventListener(je,f),l.dispatchEvent(h),h.defaultPrevented||(Oo(No(Ya(l)),{select:!0}),document.activeElement===s&&$(l))}return()=>{l.removeEventListener(je,f),setTimeout(()=>{let h=new CustomEvent(Ze,ja);l.addEventListener(Ze,c),l.dispatchEvent(h),h.defaultPrevented||$(s??document.body,{select:!0}),l.removeEventListener(Ze,c),Ja.remove(L)},0)}}},[l,f,c,L]);let x=H.useCallback(s=>{if(!t&&!o||L.paused)return;let p=s.key==="Tab"&&!s.altKey&&!s.ctrlKey&&!s.metaKey,h=document.activeElement;if(p&&h){let C=s.currentTarget,[k,A]=qo(C);k&&A?!s.shiftKey&&h===A?(s.preventDefault(),t&&$(k,{select:!0})):s.shiftKey&&h===k&&(s.preventDefault(),t&&$(A,{select:!0})):h===C&&s.preventDefault()}},[t,o,L.paused]);return(0,Qa.jsx)(q.div,{tabIndex:-1,...d,ref:m,onKeyDown:x})});Je.displayName=To;function Oo(e,{select:a=!1}={}){let t=document.activeElement;for(let o of e)if($(o,{select:a}),document.activeElement!==t)return}function qo(e){let a=Ya(e),t=Za(a,e),o=Za(a.reverse(),e);return[t,o]}function Ya(e){let a=[],t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:o=>{let r=o.tagName==="INPUT"&&o.type==="hidden";return o.disabled||o.hidden||r?NodeFilter.FILTER_SKIP:o.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;t.nextNode();)a.push(t.currentNode);return a}function Za(e,a){for(let t of e)if(!Eo(t,{upTo:a}))return t}function Eo(e,{upTo:a}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(a!==void 0&&e===a)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function Uo(e){return e instanceof HTMLInputElement&&"select"in e}function $(e,{select:a=!1}={}){if(e&&e.focus){let t=document.activeElement;e.focus({preventScroll:!0}),e!==t&&Uo(e)&&a&&e.select()}}var Ja=Ho();function Ho(){let e=[];return{add(a){let t=e[0];a!==t&&t?.pause(),e=$a(e,a),e.unshift(a)},remove(a){e=$a(e,a),e[0]?.resume()}}}function $a(e,a){let t=[...e],o=t.indexOf(a);return o!==-1&&t.splice(o,1),t}function No(e){return e.filter(a=>a.tagName!=="A")}var Ae=v(require("react"),1),et=v(require("react-dom"),1);var at=require("react/jsx-runtime"),Wo="Portal",$e=Ae.forwardRef((e,a)=>{let{container:t,...o}=e,[r,u]=Ae.useState(!1);Y(()=>u(!0),[]);let d=t||r&&globalThis?.document?.body;return d?et.default.createPortal((0,at.jsx)(q.div,{...o,ref:a}),d):null});$e.displayName=Wo;var T=v(require("react"),1);var tt=v(require("react"),1);function Go(e,a){return tt.useReducer((t,o)=>a[t][o]??t,e)}var Le=e=>{let{present:a,children:t}=e,o=Vo(a),r=typeof t=="function"?t({present:o.isPresent}):T.Children.only(t),u=G(o.ref,zo(r));return typeof t=="function"||o.isPresent?T.cloneElement(r,{ref:u}):null};Le.displayName="Presence";function Vo(e){let[a,t]=T.useState(),o=T.useRef({}),r=T.useRef(e),u=T.useRef("none"),d=e?"mounted":"unmounted",[l,i]=Go(d,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return T.useEffect(()=>{let f=De(o.current);u.current=l==="mounted"?f:"none"},[l]),Y(()=>{let f=o.current,c=r.current;if(c!==e){let m=u.current,L=De(f);e?i("MOUNT"):L==="none"||f?.display==="none"?i("UNMOUNT"):i(c&&m!==L?"ANIMATION_OUT":"UNMOUNT"),r.current=e}},[e,i]),Y(()=>{if(a){let f,c=a.ownerDocument.defaultView??window,n=L=>{let s=De(o.current).includes(L.animationName);if(L.target===a&&s&&(i("ANIMATION_END"),!r.current)){let p=a.style.animationFillMode;a.style.animationFillMode="forwards",f=c.setTimeout(()=>{a.style.animationFillMode==="forwards"&&(a.style.animationFillMode=p)})}},m=L=>{L.target===a&&(u.current=De(o.current))};return a.addEventListener("animationstart",m),a.addEventListener("animationcancel",n),a.addEventListener("animationend",n),()=>{c.clearTimeout(f),a.removeEventListener("animationstart",m),a.removeEventListener("animationcancel",n),a.removeEventListener("animationend",n)}}else i("ANIMATION_END")},[a,i]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:T.useCallback(f=>{f&&(o.current=getComputedStyle(f)),t(f)},[])}}function De(e){return e?.animationName||"none"}function zo(e){let a=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,t=a&&"isReactWarning"in a&&a.isReactWarning;return t?e.ref:(a=Object.getOwnPropertyDescriptor(e,"ref")?.get,t=a&&"isReactWarning"in a&&a.isReactWarning,t?e.props.ref:e.props.ref||e.ref)}var rt=v(require("react"),1),Qe=0;function ut(){rt.useEffect(()=>{let e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??ot()),document.body.insertAdjacentElement("beforeend",e[1]??ot()),Qe++,()=>{Qe===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(a=>a.remove()),Qe--}},[])}function ot(){let e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var O=function(){return O=Object.assign||function(a){for(var t,o=1,r=arguments.length;o<r;o++){t=arguments[o];for(var u in t)Object.prototype.hasOwnProperty.call(t,u)&&(a[u]=t[u])}return a},O.apply(this,arguments)};function Be(e,a){var t={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&a.indexOf(o)<0&&(t[o]=e[o]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,o=Object.getOwnPropertySymbols(e);r<o.length;r++)a.indexOf(o[r])<0&&Object.prototype.propertyIsEnumerable.call(e,o[r])&&(t[o[r]]=e[o[r]]);return t}function lt(e,a,t){if(t||arguments.length===2)for(var o=0,r=a.length,u;o<r;o++)(u||!(o in a))&&(u||(u=Array.prototype.slice.call(a,0,o)),u[o]=a[o]);return e.concat(u||Array.prototype.slice.call(a))}var qe=v(require("react"));var F=v(require("react"));var ee="right-scroll-bar-position",ae="width-before-scroll-bar",Ye="with-scroll-bars-hidden",ea="--removed-body-scroll-bar-size";function Me(e,a){return typeof e=="function"?e(a):e&&(e.current=a),e}var dt=require("react");function st(e,a){var t=(0,dt.useState)(function(){return{value:e,callback:a,facade:{get current(){return t.value},set current(o){var r=t.value;r!==o&&(t.value=o,t.callback(o,r))}}}})[0];return t.callback=a,t.facade}var Fe=v(require("react"));var _o=typeof window<"u"?Fe.useLayoutEffect:Fe.useEffect,ft=new WeakMap;function aa(e,a){var t=st(a||null,function(o){return e.forEach(function(r){return Me(r,o)})});return _o(function(){var o=ft.get(t);if(o){var r=new Set(o),u=new Set(e),d=t.current;r.forEach(function(l){u.has(l)||Me(l,null)}),u.forEach(function(l){r.has(l)||Me(l,d)})}ft.set(t,e)},[e]),t}function Xo(e){return e}function Ko(e,a){a===void 0&&(a=Xo);var t=[],o=!1,r={read:function(){if(o)throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return t.length?t[t.length-1]:e},useMedium:function(u){var d=a(u,o);return t.push(d),function(){t=t.filter(function(l){return l!==d})}},assignSyncMedium:function(u){for(o=!0;t.length;){var d=t;t=[],d.forEach(u)}t={push:function(l){return u(l)},filter:function(){return t}}},assignMedium:function(u){o=!0;var d=[];if(t.length){var l=t;t=[],l.forEach(u),d=t}var i=function(){var c=d;d=[],c.forEach(u)},f=function(){return Promise.resolve().then(i)};f(),t={push:function(c){d.push(c),f()},filter:function(c){return d=d.filter(c),t}}}};return r}function ta(e){e===void 0&&(e={});var a=Ko(null);return a.options=O({async:!0,ssr:!1},e),a}var nt=v(require("react")),it=function(e){var a=e.sideCar,t=Be(e,["sideCar"]);if(!a)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var o=a.read();if(!o)throw new Error("Sidecar medium not found");return nt.createElement(o,O({},t))};it.isSideCarExport=!0;function oa(e,a){return e.useMedium(a),it}var Te=ta();var ra=function(){},xe=F.forwardRef(function(e,a){var t=F.useRef(null),o=F.useState({onScrollCapture:ra,onWheelCapture:ra,onTouchMoveCapture:ra}),r=o[0],u=o[1],d=e.forwardProps,l=e.children,i=e.className,f=e.removeScrollBar,c=e.enabled,n=e.shards,m=e.sideCar,L=e.noRelative,x=e.noIsolation,s=e.inert,p=e.allowPinchZoom,h=e.as,C=h===void 0?"div":h,k=e.gapMode,A=Be(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),y=m,D=aa([t,a]),I=O(O({},A),r);return F.createElement(F.Fragment,null,c&&F.createElement(y,{sideCar:Te,removeScrollBar:f,shards:n,noRelative:L,noIsolation:x,inert:s,setCallbacks:u,allowPinchZoom:!!p,lockRef:t,gapMode:k}),d?F.cloneElement(F.Children.only(l),O(O({},I),{ref:D})):F.createElement(C,O({},I,{className:i,ref:D}),l))});xe.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};xe.classNames={fullWidth:ae,zeroRight:ee};var P=v(require("react"));var fe=v(require("react"));var mt=v(require("react"));var ct;var pt=function(){if(ct)return ct;if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function jo(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var a=pt();return a&&e.setAttribute("nonce",a),e}function Zo(e,a){e.styleSheet?e.styleSheet.cssText=a:e.appendChild(document.createTextNode(a))}function Jo(e){var a=document.head||document.getElementsByTagName("head")[0];a.appendChild(e)}var ua=function(){var e=0,a=null;return{add:function(t){e==0&&(a=jo())&&(Zo(a,t),Jo(a)),e++},remove:function(){e--,!e&&a&&(a.parentNode&&a.parentNode.removeChild(a),a=null)}}};var la=function(){var e=ua();return function(a,t){mt.useEffect(function(){return e.add(a),function(){e.remove()}},[a&&t])}};var Ie=function(){var e=la(),a=function(t){var o=t.styles,r=t.dynamic;return e(o,r),null};return a};var $o={left:0,top:0,right:0,gap:0},da=function(e){return parseInt(e||"",10)||0},Qo=function(e){var a=window.getComputedStyle(document.body),t=a[e==="padding"?"paddingLeft":"marginLeft"],o=a[e==="padding"?"paddingTop":"marginTop"],r=a[e==="padding"?"paddingRight":"marginRight"];return[da(t),da(o),da(r)]},sa=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return $o;var a=Qo(e),t=document.documentElement.clientWidth,o=window.innerWidth;return{left:a[0],top:a[1],right:a[2],gap:Math.max(0,o-t+a[2]-a[0])}};var Yo=Ie(),se="data-scroll-locked",er=function(e,a,t,o){var r=e.left,u=e.top,d=e.right,l=e.gap;return t===void 0&&(t="margin"),`
105
+ .`.concat(Ye,` {
106
+ overflow: hidden `).concat(o,`;
107
+ padding-right: `).concat(l,"px ").concat(o,`;
108
+ }
109
+ body[`).concat(se,`] {
110
+ overflow: hidden `).concat(o,`;
111
+ overscroll-behavior: contain;
112
+ `).concat([a&&"position: relative ".concat(o,";"),t==="margin"&&`
113
+ padding-left: `.concat(r,`px;
114
+ padding-top: `).concat(u,`px;
115
+ padding-right: `).concat(d,`px;
116
+ margin-left:0;
117
+ margin-top:0;
118
+ margin-right: `).concat(l,"px ").concat(o,`;
119
+ `),t==="padding"&&"padding-right: ".concat(l,"px ").concat(o,";")].filter(Boolean).join(""),`
120
+ }
121
+
122
+ .`).concat(ee,` {
123
+ right: `).concat(l,"px ").concat(o,`;
124
+ }
125
+
126
+ .`).concat(ae,` {
127
+ margin-right: `).concat(l,"px ").concat(o,`;
128
+ }
129
+
130
+ .`).concat(ee," .").concat(ee,` {
131
+ right: 0 `).concat(o,`;
132
+ }
133
+
134
+ .`).concat(ae," .").concat(ae,` {
135
+ margin-right: 0 `).concat(o,`;
136
+ }
137
+
138
+ body[`).concat(se,`] {
139
+ `).concat(ea,": ").concat(l,`px;
140
+ }
141
+ `)},Lt=function(){var e=parseInt(document.body.getAttribute(se)||"0",10);return isFinite(e)?e:0},ar=function(){fe.useEffect(function(){return document.body.setAttribute(se,(Lt()+1).toString()),function(){var e=Lt()-1;e<=0?document.body.removeAttribute(se):document.body.setAttribute(se,e.toString())}},[])},fa=function(e){var a=e.noRelative,t=e.noImportant,o=e.gapMode,r=o===void 0?"margin":o;ar();var u=fe.useMemo(function(){return sa(r)},[r]);return fe.createElement(Yo,{styles:er(u,!a,r,t?"":"!important")})};var na=!1;if(typeof window<"u")try{he=Object.defineProperty({},"passive",{get:function(){return na=!0,!0}}),window.addEventListener("test",he,he),window.removeEventListener("test",he,he)}catch{na=!1}var he,te=na?{passive:!1}:!1;var tr=function(e){return e.tagName==="TEXTAREA"},xt=function(e,a){if(!(e instanceof Element))return!1;var t=window.getComputedStyle(e);return t[a]!=="hidden"&&!(t.overflowY===t.overflowX&&!tr(e)&&t[a]==="visible")},or=function(e){return xt(e,"overflowY")},rr=function(e){return xt(e,"overflowX")},ia=function(e,a){var t=a.ownerDocument,o=a;do{typeof ShadowRoot<"u"&&o instanceof ShadowRoot&&(o=o.host);var r=It(e,o);if(r){var u=ht(e,o),d=u[1],l=u[2];if(d>l)return!0}o=o.parentNode}while(o&&o!==t.body);return!1},ur=function(e){var a=e.scrollTop,t=e.scrollHeight,o=e.clientHeight;return[a,t,o]},lr=function(e){var a=e.scrollLeft,t=e.scrollWidth,o=e.clientWidth;return[a,t,o]},It=function(e,a){return e==="v"?or(a):rr(a)},ht=function(e,a){return e==="v"?ur(a):lr(a)},dr=function(e,a){return e==="h"&&a==="rtl"?-1:1},Ct=function(e,a,t,o,r){var u=dr(e,window.getComputedStyle(a).direction),d=u*o,l=t.target,i=a.contains(l),f=!1,c=d>0,n=0,m=0;do{if(!l)break;var L=ht(e,l),x=L[0],s=L[1],p=L[2],h=s-p-u*x;(x||h)&&It(e,l)&&(n+=h,m+=x);var C=l.parentNode;l=C&&C.nodeType===Node.DOCUMENT_FRAGMENT_NODE?C.host:C}while(!i&&l!==document.body||i&&(a.contains(l)||a===l));return(c&&(r&&Math.abs(n)<1||!r&&d>n)||!c&&(r&&Math.abs(m)<1||!r&&-d>m))&&(f=!0),f};var Oe=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},gt=function(e){return[e.deltaX,e.deltaY]},St=function(e){return e&&"current"in e?e.current:e},sr=function(e,a){return e[0]===a[0]&&e[1]===a[1]},fr=function(e){return`
142
+ .block-interactivity-`.concat(e,` {pointer-events: none;}
143
+ .allow-interactivity-`).concat(e,` {pointer-events: all;}
144
+ `)},nr=0,ne=[];function wt(e){var a=P.useRef([]),t=P.useRef([0,0]),o=P.useRef(),r=P.useState(nr++)[0],u=P.useState(Ie)[0],d=P.useRef(e);P.useEffect(function(){d.current=e},[e]),P.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(r));var s=lt([e.lockRef.current],(e.shards||[]).map(St),!0).filter(Boolean);return s.forEach(function(p){return p.classList.add("allow-interactivity-".concat(r))}),function(){document.body.classList.remove("block-interactivity-".concat(r)),s.forEach(function(p){return p.classList.remove("allow-interactivity-".concat(r))})}}},[e.inert,e.lockRef.current,e.shards]);var l=P.useCallback(function(s,p){if("touches"in s&&s.touches.length===2||s.type==="wheel"&&s.ctrlKey)return!d.current.allowPinchZoom;var h=Oe(s),C=t.current,k="deltaX"in s?s.deltaX:C[0]-h[0],A="deltaY"in s?s.deltaY:C[1]-h[1],y,D=s.target,I=Math.abs(k)>Math.abs(A)?"h":"v";if("touches"in s&&I==="h"&&D.type==="range")return!1;var N=window.getSelection(),R=N&&N.anchorNode,M=R?R===D||R.contains(D):!1;if(M)return!1;var W=ia(I,D);if(!W)return!0;if(W?y=I:(y=I==="v"?"h":"v",W=ia(I,D)),!W)return!1;if(!o.current&&"changedTouches"in s&&(k||A)&&(o.current=y),!y)return!0;var Ce=o.current||y;return Ct(Ce,p,s,Ce==="h"?k:A,!0)},[]),i=P.useCallback(function(s){var p=s;if(!(!ne.length||ne[ne.length-1]!==u)){var h="deltaY"in p?gt(p):Oe(p),C=a.current.filter(function(y){return y.name===p.type&&(y.target===p.target||p.target===y.shadowParent)&&sr(y.delta,h)})[0];if(C&&C.should){p.cancelable&&p.preventDefault();return}if(!C){var k=(d.current.shards||[]).map(St).filter(Boolean).filter(function(y){return y.contains(p.target)}),A=k.length>0?l(p,k[0]):!d.current.noIsolation;A&&p.cancelable&&p.preventDefault()}}},[]),f=P.useCallback(function(s,p,h,C){var k={name:s,delta:p,target:h,should:C,shadowParent:ir(h)};a.current.push(k),setTimeout(function(){a.current=a.current.filter(function(A){return A!==k})},1)},[]),c=P.useCallback(function(s){t.current=Oe(s),o.current=void 0},[]),n=P.useCallback(function(s){f(s.type,gt(s),s.target,l(s,e.lockRef.current))},[]),m=P.useCallback(function(s){f(s.type,Oe(s),s.target,l(s,e.lockRef.current))},[]);P.useEffect(function(){return ne.push(u),e.setCallbacks({onScrollCapture:n,onWheelCapture:n,onTouchMoveCapture:m}),document.addEventListener("wheel",i,te),document.addEventListener("touchmove",i,te),document.addEventListener("touchstart",c,te),function(){ne=ne.filter(function(s){return s!==u}),document.removeEventListener("wheel",i,te),document.removeEventListener("touchmove",i,te),document.removeEventListener("touchstart",c,te)}},[]);var L=e.removeScrollBar,x=e.inert;return P.createElement(P.Fragment,null,x?P.createElement(u,{styles:fr(r)}):null,L?P.createElement(fa,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function ir(e){for(var a=null;e!==null;)e instanceof ShadowRoot&&(a=e.host,e=e.host),e=e.parentNode;return a}var vt=oa(Te,wt);var Pt=qe.forwardRef(function(e,a){return qe.createElement(xe,O({},e,{ref:a,sideCar:vt}))});Pt.classNames=xe.classNames;var ca=Pt;var cr=function(e){if(typeof document>"u")return null;var a=Array.isArray(e)?e[0]:e;return a.ownerDocument.body},ie=new WeakMap,Ee=new WeakMap,Ue={},pa=0,yt=function(e){return e&&(e.host||yt(e.parentNode))},pr=function(e,a){return a.map(function(t){if(e.contains(t))return t;var o=yt(t);return o&&e.contains(o)?o:(console.error("aria-hidden",t,"in not contained inside",e,". Doing nothing"),null)}).filter(function(t){return!!t})},mr=function(e,a,t,o){var r=pr(a,Array.isArray(e)?e:[e]);Ue[t]||(Ue[t]=new WeakMap);var u=Ue[t],d=[],l=new Set,i=new Set(r),f=function(n){!n||l.has(n)||(l.add(n),f(n.parentNode))};r.forEach(f);var c=function(n){!n||i.has(n)||Array.prototype.forEach.call(n.children,function(m){if(l.has(m))c(m);else try{var L=m.getAttribute(o),x=L!==null&&L!=="false",s=(ie.get(m)||0)+1,p=(u.get(m)||0)+1;ie.set(m,s),u.set(m,p),d.push(m),s===1&&x&&Ee.set(m,!0),p===1&&m.setAttribute(t,"true"),x||m.setAttribute(o,"true")}catch(h){console.error("aria-hidden: cannot operate on ",m,h)}})};return c(a),l.clear(),pa++,function(){d.forEach(function(n){var m=ie.get(n)-1,L=u.get(n)-1;ie.set(n,m),u.set(n,L),m||(Ee.has(n)||n.removeAttribute(o),Ee.delete(n)),L||n.removeAttribute(t)}),pa--,pa||(ie=new WeakMap,ie=new WeakMap,Ee=new WeakMap,Ue={})}},kt=function(e,a,t){t===void 0&&(t="data-aria-hidden");var o=Array.from(Array.isArray(e)?e:[e]),r=a||cr(e);return r?(o.push.apply(o,Array.from(r.querySelectorAll("[aria-live], script"))),mr(o,r,t,"aria-hidden")):function(){return null}};var g=require("react/jsx-runtime"),ma="Dialog",[bt,Ql]=Oa(ma),[Lr,z]=bt(ma),Rt=e=>{let{__scopeDialog:a,children:t,open:o,defaultOpen:r,onOpenChange:u,modal:d=!0}=e,l=w.useRef(null),i=w.useRef(null),[f=!1,c]=Ea({prop:o,defaultProp:r,onChange:u});return(0,g.jsx)(Lr,{scope:a,triggerRef:l,contentRef:i,contentId:Re(),titleId:Re(),descriptionId:Re(),open:f,onOpenChange:c,onOpenToggle:w.useCallback(()=>c(n=>!n),[c]),modal:d,children:t})};Rt.displayName=ma;var At="DialogTrigger",xr=w.forwardRef((e,a)=>{let{__scopeDialog:t,...o}=e,r=z(At,t),u=G(a,r.triggerRef);return(0,g.jsx)(q.button,{type:"button","aria-haspopup":"dialog","aria-expanded":r.open,"aria-controls":r.contentId,"data-state":Ia(r.open),...o,ref:u,onClick:_(e.onClick,r.onOpenToggle)})});xr.displayName=At;var La="DialogPortal",[Ir,Dt]=bt(La,{forceMount:void 0}),Bt=e=>{let{__scopeDialog:a,forceMount:t,children:o,container:r}=e,u=z(La,a);return(0,g.jsx)(Ir,{scope:a,forceMount:t,children:w.Children.map(o,d=>(0,g.jsx)(Le,{present:t||u.open,children:(0,g.jsx)($e,{asChild:!0,container:r,children:d})}))})};Bt.displayName=La;var He="DialogOverlay",Mt=w.forwardRef((e,a)=>{let t=Dt(He,e.__scopeDialog),{forceMount:o=t.forceMount,...r}=e,u=z(He,e.__scopeDialog);return u.modal?(0,g.jsx)(Le,{present:o||u.open,children:(0,g.jsx)(hr,{...r,ref:a})}):null});Mt.displayName=He;var hr=w.forwardRef((e,a)=>{let{__scopeDialog:t,...o}=e,r=z(He,t);return(0,g.jsx)(ca,{as:me,allowPinchZoom:!0,shards:[r.contentRef],children:(0,g.jsx)(q.div,{"data-state":Ia(r.open),...o,ref:a,style:{pointerEvents:"auto",...o.style}})})}),oe="DialogContent",Ft=w.forwardRef((e,a)=>{let t=Dt(oe,e.__scopeDialog),{forceMount:o=t.forceMount,...r}=e,u=z(oe,e.__scopeDialog);return(0,g.jsx)(Le,{present:o||u.open,children:u.modal?(0,g.jsx)(Cr,{...r,ref:a}):(0,g.jsx)(gr,{...r,ref:a})})});Ft.displayName=oe;var Cr=w.forwardRef((e,a)=>{let t=z(oe,e.__scopeDialog),o=w.useRef(null),r=G(a,t.contentRef,o);return w.useEffect(()=>{let u=o.current;if(u)return kt(u)},[]),(0,g.jsx)(Tt,{...e,ref:r,trapFocus:t.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:_(e.onCloseAutoFocus,u=>{u.preventDefault(),t.triggerRef.current?.focus()}),onPointerDownOutside:_(e.onPointerDownOutside,u=>{let d=u.detail.originalEvent,l=d.button===0&&d.ctrlKey===!0;(d.button===2||l)&&u.preventDefault()}),onFocusOutside:_(e.onFocusOutside,u=>u.preventDefault())})}),gr=w.forwardRef((e,a)=>{let t=z(oe,e.__scopeDialog),o=w.useRef(!1),r=w.useRef(!1);return(0,g.jsx)(Tt,{...e,ref:a,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:u=>{e.onCloseAutoFocus?.(u),u.defaultPrevented||(o.current||t.triggerRef.current?.focus(),u.preventDefault()),o.current=!1,r.current=!1},onInteractOutside:u=>{e.onInteractOutside?.(u),u.defaultPrevented||(o.current=!0,u.detail.originalEvent.type==="pointerdown"&&(r.current=!0));let d=u.target;t.triggerRef.current?.contains(d)&&u.preventDefault(),u.detail.originalEvent.type==="focusin"&&r.current&&u.preventDefault()}})}),Tt=w.forwardRef((e,a)=>{let{__scopeDialog:t,trapFocus:o,onOpenAutoFocus:r,onCloseAutoFocus:u,...d}=e,l=z(oe,t),i=w.useRef(null),f=G(a,i);return ut(),(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(Je,{asChild:!0,loop:!0,trapped:o,onMountAutoFocus:r,onUnmountAutoFocus:u,children:(0,g.jsx)(Ke,{role:"dialog",id:l.contentId,"aria-describedby":l.descriptionId,"aria-labelledby":l.titleId,"data-state":Ia(l.open),...d,ref:f,onDismiss:()=>l.onOpenChange(!1)})}),(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(Sr,{titleId:l.titleId}),(0,g.jsx)(vr,{contentRef:i,descriptionId:l.descriptionId})]})]})}),xa="DialogTitle",Ot=w.forwardRef((e,a)=>{let{__scopeDialog:t,...o}=e,r=z(xa,t);return(0,g.jsx)(q.h2,{id:r.titleId,...o,ref:a})});Ot.displayName=xa;var qt="DialogDescription",Et=w.forwardRef((e,a)=>{let{__scopeDialog:t,...o}=e,r=z(qt,t);return(0,g.jsx)(q.p,{id:r.descriptionId,...o,ref:a})});Et.displayName=qt;var Ut="DialogClose",Ht=w.forwardRef((e,a)=>{let{__scopeDialog:t,...o}=e,r=z(Ut,t);return(0,g.jsx)(q.button,{type:"button",...o,ref:a,onClick:_(e.onClick,()=>r.onOpenChange(!1))})});Ht.displayName=Ut;function Ia(e){return e?"open":"closed"}var Nt="DialogTitleWarning",[Yl,Wt]=Ta(Nt,{contentName:oe,titleName:xa,docsSlug:"dialog"}),Sr=({titleId:e})=>{let a=Wt(Nt),t=`\`${a.contentName}\` requires a \`${a.titleName}\` for the component to be accessible for screen reader users.
145
+
146
+ If you want to hide the \`${a.titleName}\`, you can wrap it with our VisuallyHidden component.
147
+
148
+ For more information, see https://radix-ui.com/primitives/docs/components/${a.docsSlug}`;return w.useEffect(()=>{e&&(document.getElementById(e)||console.error(t))},[t,e]),null},wr="DialogDescriptionWarning",vr=({contentRef:e,descriptionId:a})=>{let o=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${Wt(wr).contentName}}.`;return w.useEffect(()=>{let r=e.current?.getAttribute("aria-describedby");a&&r&&(document.getElementById(a)||console.warn(o))},[o,e,a]),null},Gt=Rt;var Vt=Bt,zt=Mt,_t=Ft,Xt=Ot,Kt=Et,jt=Ht;var X=require("react/jsx-runtime");function ha({className:e="",...a}){return(0,X.jsx)("button",{className:`dswt-button ${e}`,...a})}function Zt({className:e="",...a}){return(0,X.jsx)("input",{className:`dswt-input ${e}`,...a})}function Jt({children:e,...a}){return(0,X.jsx)(Gt,{...a,children:e})}function $t({children:e}){let a=ke();return(0,X.jsxs)(Vt,{children:[(0,X.jsx)(zt,{className:"dswt-dialog-overlay"}),(0,X.jsxs)(_t,{className:"dswt-dialog-content",children:[e,(0,X.jsx)(jt,{className:"dswt-dialog-close","aria-label":a("close"),children:(0,X.jsx)(pe,{size:16})})]})]})}var Qt=Xt,Yt=Kt;var S=require("react/jsx-runtime");function eo({target:e,api:a,workspaces:t,sessions:o,onCreated:r,onClose:u}){let d=ke(),[l,i]=(0,Q.useState)(null),[f,c]=(0,Q.useState)(""),[n,m]=(0,Q.useState)("current"),[L,x]=(0,Q.useState)(""),[s,p]=(0,Q.useState)(!1);(0,Q.useEffect)(()=>{let R=!0;return i(null),x(""),c(""),m("current"),a.list(e.path).then(M=>{R&&i(M)}).catch(M=>{R&&x(String(M?.message??M))}),()=>{R=!1}},[a,e.path]);let h=l?.repoPath,C=Da(f),k=`task/${C}`,A=h?Ba(h,C):"",y=l?.worktrees.find(R=>E(R.path)===E(e.path))?.branch??"HEAD",D=l?.defaultBranch??l?.worktrees.find(R=>R.isMain)?.branch??y,I=n==="main"?D:y,N=async()=>{if(!h||!f.trim()){x(d("fillTaskName"));return}p(!0),x("");let R,M;try{let W=await a.create({repoPath:h,path:A,branch:k,baseRef:I});R=W.path,M=await t.create({path:W.path}),await t.rename(M.workspaceId,`${e.title}/${C}`);let Ce=await t.connectWorkspace(M.workspaceId);r(W.path),o.open(Ce),u()}catch(W){M?.workspaceId&&t.delete(M.workspaceId).catch(()=>{}),R&&a.remove({repoPath:h,path:R}).catch(()=>{}),x(`${d("operationFailed")}${String(W?.message??W)}`)}finally{p(!1)}};return(0,S.jsx)(Jt,{open:!0,onOpenChange:R=>{!R&&!s&&u()},children:(0,S.jsxs)($t,{children:[(0,S.jsx)(Qt,{className:"dswt-dialog-title",children:Aa(d("dialogTitle"),{name:e.title})}),(0,S.jsx)(Yt,{className:"dswt-visually-hidden",children:e.title}),L?(0,S.jsxs)("div",{className:"dswt-error",role:"alert",children:[(0,S.jsx)(j,{size:14})," ",L]}):null,(0,S.jsxs)("label",{className:"dswt-field",children:[(0,S.jsx)("span",{className:"dswt-field-label",children:d("taskName")}),(0,S.jsx)(Zt,{"aria-label":d("taskName"),value:f,disabled:s,onChange:R=>c(R.target.value),placeholder:d("taskNamePlaceholder"),autoFocus:!0})]}),(0,S.jsxs)("fieldset",{className:"dswt-field dswt-base-fieldset",disabled:s||!l,children:[(0,S.jsx)("legend",{className:"dswt-field-label",children:d("basedOn")}),(0,S.jsxs)("div",{className:"dswt-radio-group",role:"radiogroup","aria-label":d("basedOn"),children:[(0,S.jsxs)("label",{className:"dswt-radio-option","data-selected":n==="current"?"true":void 0,children:[(0,S.jsx)("input",{className:"dswt-radio-input",type:"radio",name:"dswt-base-branch",value:"current",checked:n==="current",onChange:()=>m("current")}),(0,S.jsxs)("span",{className:"dswt-radio-copy",children:[(0,S.jsx)("span",{className:"dswt-radio-label",children:d("currentBranch")}),(0,S.jsx)("span",{className:"dswt-radio-branch",children:y})]})]}),(0,S.jsxs)("label",{className:"dswt-radio-option","data-selected":n==="main"?"true":void 0,children:[(0,S.jsx)("input",{className:"dswt-radio-input",type:"radio",name:"dswt-base-branch",value:"main",checked:n==="main",onChange:()=>m("main")}),(0,S.jsxs)("span",{className:"dswt-radio-copy",children:[(0,S.jsx)("span",{className:"dswt-radio-label",children:d("mainBranch")}),(0,S.jsx)("span",{className:"dswt-radio-branch",children:D})]})]})]})]}),(0,S.jsxs)("div",{className:"dswt-dialog-actions",children:[(0,S.jsx)(ha,{type:"button",disabled:s,onClick:u,children:d("cancel")}),(0,S.jsxs)(ha,{type:"button",className:"dswt-button-primary",disabled:s||!f.trim()||!l,onClick:N,children:[s?(0,S.jsx)(Z,{size:14,className:"dswt-spin"}):null,d(s?"creating":"createAndOpen")]})]})]})})}var re=require("react/jsx-runtime");function Ca(){return(0,re.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:[(0,re.jsx)("path",{d:"M4 2.25v8.5a2.25 2.25 0 1 0 1.5 0V7.75h4v3a2.25 2.25 0 1 0 1.5 0V6.25H5.5v-4H4Z",fill:"currentColor"}),(0,re.jsx)("circle",{cx:"4.75",cy:"12.75",r:"1.5",fill:"currentColor"}),(0,re.jsx)("circle",{cx:"10.25",cy:"12.75",r:"1.5",fill:"currentColor"}),(0,re.jsx)("circle",{cx:"4.75",cy:"2.25",r:"1.5",fill:"currentColor"})]})}var yr="/dsh-simple-worktree";function ao(e){async function a(t,o){let r=await e.rpc.call(yr,t,o);if(!r?.ok){let u=new Error(r?.error?.message??"worktree operation failed");throw u.code=r?.error?.code,u}return r.value}return{list:t=>a("worktree.list",{path:t}),classify:t=>a("worktree.classify",{path:t}),create:t=>a("worktree.create",t),remove:t=>a("worktree.remove",t)}}var Ne=require("react/jsx-runtime"),to="data-dsh-simple-worktree-style";function kr(){if(typeof document>"u"||document.querySelector(`style[${to}]`))return;let e=document.createElement("style");e.setAttribute(to,""),e.textContent=Sa,document.head.appendChild(e)}var oo={name:"@alpacachen/dsh-simple-worktree",inject:["slots","connection","locale","workspaces","sessions","workspaceExtensions"],apply(e){kr(),e.effect(()=>Ra(e),"dsh-simple-worktree locale");let a=ao(e.connection),t=e.workspaces,o=e.sessions,r=e.get("locale"),u=e.workspaceExtensions,d=new Set;e.effect(()=>{if(!(!r||typeof r.subscribe!="function"))return r.subscribe(()=>u.invalidate())},"dsh-simple-worktree locale refresh");let l=new Set,i=!0,f=()=>{},c=0,n=async()=>{let L=++c,x=t.list.getSnapshot().items,s=await Promise.all(x.map(async p=>{try{return await a.classify(p.path)}catch{return}}));if(!(!i||L!==c)){d.clear(),l.clear();for(let p of s)p?.isGit&&p.path&&d.add(E(p.path)),p?.isWorktree&&p.path&&l.add(E(p.path));u.invalidate()}};e.effect(()=>u.register({id:"dsh-simple-worktree",menuItem(x){let s=E(x.path);if(!(!d.has(s)||l.has(s)))return{id:"dsh-simple-worktree.create",label:ye("createWorktree"),icon:(0,Ne.jsx)(Ca,{}),order:30,onSelect:()=>f(x)}},deleteWorkspace(x){let s=E(x.path);if(l.has(s))return(async()=>{let p=await a.classify(x.path);!p.isWorktree||!p.repoPath||(await a.remove({repoPath:p.repoPath,path:x.path}),await t.delete(x.workspaceId),d.delete(s),l.delete(s),u.invalidate())})()},icon(x){return l.has(E(x.path))?(0,Ne.jsx)(Ca,{}):void 0}}),"dsh-simple-worktree workspace extensions"),e.effect(()=>{i=!0;let L=t.list.subscribe(()=>{n()});return n(),()=>{i=!1,c+=1,L()}},"dsh-simple-worktree workspace classification");function m(){let[L,x]=(0,We.useState)(null);return(0,We.useEffect)(()=>(f=s=>x(s),()=>{f=()=>{}}),[]),L?(0,Ne.jsx)(eo,{target:L,api:a,workspaces:t,sessions:o,onCreated:s=>{d.add(E(s)),l.add(E(s)),u.invalidate()},onClose:()=>x(null)}):null}e.slots.inject("shell.overlay",()=>e.slots.register({name:"shell.overlay",id:"dsh-simple-worktree-create",order:30,locale:ve,label:()=>ye("createWorktree")},m))}};var br=oo;
149
+ /*! Bundled license information:
150
+
151
+ lucide-react/dist/esm/shared/src/utils.js:
152
+ lucide-react/dist/esm/defaultAttributes.js:
153
+ lucide-react/dist/esm/Icon.js:
154
+ lucide-react/dist/esm/createLucideIcon.js:
155
+ lucide-react/dist/esm/icons/circle-alert.js:
156
+ lucide-react/dist/esm/icons/loader-circle.js:
157
+ lucide-react/dist/esm/icons/x.js:
158
+ lucide-react/dist/esm/lucide-react.js:
159
+ (**
160
+ * @license lucide-react v0.474.0 - ISC
161
+ *
162
+ * This source code is licensed under the ISC license.
163
+ * See the LICENSE file in the root directory of this source tree.
164
+ *)
165
+ */
166
+
167
+ return (module.exports && module.exports.default) || module.exports
168
+ },
169
+ })
@@ -0,0 +1,3 @@
1
+ - insert:
2
+ - id: dsh-simple-worktree
3
+ name: "@alpacachen/dsh-simple-worktree"
package/lib/index.js ADDED
@@ -0,0 +1,195 @@
1
+ const CHANNEL = '/dsh-simple-worktree'
2
+
3
+ export const ok = (value) => ({ ok: true, value })
4
+ export const fail = (code, message, details = {}) => ({
5
+ ok: false,
6
+ error: { code, message, details: { issues: [], ...details } },
7
+ })
8
+
9
+ export const cleanPath = (value) => {
10
+ const text = String(value ?? '')
11
+ return text.length > 1 ? text.replace(/[\\/]+$/, '') : text
12
+ }
13
+
14
+ export const samePath = (left, right) => cleanPath(left) === cleanPath(right)
15
+
16
+ export async function runGit(subprocess, cwd, args) {
17
+ const handle = subprocess.spawn({
18
+ argv: ['git', '-C', cwd, ...args],
19
+ cwd,
20
+ stdio: {
21
+ stdin: 'ignore',
22
+ stdout: { maxBytes: 2 * 1024 * 1024 },
23
+ stderr: { maxBytes: 512 * 1024 },
24
+ },
25
+ graceMs: 1000,
26
+ })
27
+ const outcome = await handle.done
28
+ const stdout = handle.collected.stdout?.readFrom(0).text ?? ''
29
+ const stderr = handle.collected.stderr?.readFrom(0).text ?? ''
30
+ if (outcome.exitCode !== 0 || outcome.signal !== null) {
31
+ throw new Error(`git ${args.join(' ')} failed${outcome.signal ? ` (${outcome.signal})` : ` (exit ${outcome.exitCode})`}: ${stderr.trim() || stdout.trim()}`)
32
+ }
33
+ return stdout.trim()
34
+ }
35
+
36
+ async function tryRunGit(subprocess, cwd, args) {
37
+ try {
38
+ return await runGit(subprocess, cwd, args)
39
+ } catch {
40
+ return ''
41
+ }
42
+ }
43
+
44
+ export async function detectDefaultBranch(subprocess, repoPath, worktrees) {
45
+ const remoteHead = await tryRunGit(subprocess, repoPath, ['symbolic-ref', '--quiet', '--short', 'refs/remotes/origin/HEAD'])
46
+ if (remoteHead) {
47
+ const separator = remoteHead.indexOf('/')
48
+ if (separator >= 0 && remoteHead.slice(separator + 1)) return remoteHead.slice(separator + 1)
49
+ }
50
+
51
+ const refs = await tryRunGit(subprocess, repoPath, ['for-each-ref', '--format=%(refname:short)', 'refs/heads', 'refs/remotes/origin'])
52
+ const branches = refs.split(/\r?\n/).filter(Boolean).map((ref) => ref.startsWith('origin/') ? ref.slice('origin/'.length) : ref)
53
+ for (const preferred of ['main', 'master', 'trunk', 'develop']) {
54
+ if (branches.includes(preferred)) return preferred
55
+ }
56
+ return worktrees.find((worktree) => worktree.isMain)?.branch ?? worktrees.find((worktree) => worktree.branch)?.branch ?? 'HEAD'
57
+ }
58
+
59
+ export function parseWorktrees(text) {
60
+ const rows = []
61
+ let current
62
+ const push = () => {
63
+ if (current?.path) rows.push(current)
64
+ current = undefined
65
+ }
66
+ for (const line of text.split(/\r?\n/)) {
67
+ if (line.startsWith('worktree ')) {
68
+ push()
69
+ current = { path: line.slice(9).trim() }
70
+ } else if (current && line.startsWith('HEAD ')) {
71
+ current.head = line.slice(5).trim()
72
+ } else if (current && line.startsWith('branch ')) {
73
+ const ref = line.slice(7).trim()
74
+ current.branch = ref.startsWith('refs/heads/') ? ref.slice(11) : ref
75
+ } else if (current && line === 'detached') {
76
+ current.detached = true
77
+ } else if (current && line.startsWith('locked')) {
78
+ current.locked = true
79
+ } else if (current && line.startsWith('prunable')) {
80
+ current.prunable = true
81
+ }
82
+ }
83
+ push()
84
+ return rows.map((row, index) => ({
85
+ path: row.path,
86
+ branch: row.branch,
87
+ head: row.head,
88
+ isMain: index === 0,
89
+ detached: row.detached === true,
90
+ locked: row.locked === true,
91
+ prunable: row.prunable === true,
92
+ }))
93
+ }
94
+
95
+ export async function recover(operation, classify) {
96
+ try {
97
+ return ok(await operation())
98
+ } catch (error) {
99
+ const message = String(error?.message ?? error)
100
+ return fail(classify?.(message) ?? 'bad-request', message)
101
+ }
102
+ }
103
+
104
+ export const classifyGitError = (message) => message.includes('not a git repository')
105
+ ? 'bad-request'
106
+ : undefined
107
+
108
+ export const name = '@alpacachen/dsh-simple-worktree'
109
+ export const inject = ['connection', 'subprocess']
110
+
111
+ export function apply(ctx) {
112
+ ctx.effect(() => ctx.connection.rpc.handle(CHANNEL, async (endpoint, payload = {}, signal) => {
113
+ if (signal?.aborted) return fail('cancelled', 'The request was cancelled.')
114
+
115
+ if (endpoint === 'worktree.list') return recover(async () => {
116
+ const path = typeof payload.path === 'string' ? payload.path.trim() : ''
117
+ if (!path) throw new Error('请选择一个 DSH Workspace。')
118
+ const [topLevel, commonDir, porcelain] = await Promise.all([
119
+ runGit(ctx.subprocess, path, ['rev-parse', '--show-toplevel']),
120
+ runGit(ctx.subprocess, path, ['rev-parse', '--git-common-dir']),
121
+ runGit(ctx.subprocess, path, ['worktree', 'list', '--porcelain']),
122
+ ])
123
+ const worktrees = parseWorktrees(porcelain)
124
+ const repoPath = worktrees.find((worktree) => worktree.isMain)?.path ?? topLevel
125
+ const defaultBranch = await detectDefaultBranch(ctx.subprocess, repoPath, worktrees)
126
+ return { repoPath, commonDir, defaultBranch, worktrees }
127
+ }, classifyGitError)
128
+
129
+ if (endpoint === 'worktree.classify') return recover(async () => {
130
+ const path = typeof payload.path === 'string' ? payload.path.trim() : ''
131
+ if (!path) throw new Error('缺少 Workspace 路径。')
132
+ const porcelain = await runGit(ctx.subprocess, path, ['worktree', 'list', '--porcelain'])
133
+ const worktrees = parseWorktrees(porcelain)
134
+ const current = worktrees.find((worktree) => samePath(worktree.path, path))
135
+ return {
136
+ path,
137
+ isGit: worktrees.length > 0,
138
+ isWorktree: Boolean(current && !current.isMain),
139
+ repoPath: worktrees.find((worktree) => worktree.isMain)?.path,
140
+ }
141
+ }, classifyGitError)
142
+
143
+ if (endpoint === 'worktree.create') return recover(async () => {
144
+ const repoPath = typeof payload.repoPath === 'string' ? payload.repoPath.trim() : ''
145
+ const path = typeof payload.path === 'string' ? payload.path.trim() : ''
146
+ const branch = typeof payload.branch === 'string' ? payload.branch.trim() : ''
147
+ const baseRef = typeof payload.baseRef === 'string' && payload.baseRef.trim() ? payload.baseRef.trim() : 'HEAD'
148
+ if (!repoPath || !path || !branch) throw new Error('任务名称、工作目录和分支不能为空。')
149
+ await runGit(ctx.subprocess, repoPath, ['worktree', 'add', '-b', branch, path, baseRef])
150
+ return { path, branch, baseRef }
151
+ })
152
+
153
+ if (endpoint === 'worktree.remove') return recover(async () => {
154
+ const repoPath = typeof payload.repoPath === 'string' ? payload.repoPath.trim() : ''
155
+ const path = typeof payload.path === 'string' ? payload.path.trim() : ''
156
+ if (!repoPath || !path) throw new Error('缺少仓库路径或 Worktree 路径。')
157
+ await runGit(ctx.subprocess, repoPath, ['worktree', 'remove', path])
158
+ return { removed: true, path }
159
+ })
160
+
161
+ if (endpoint === 'worktree.remove-session') return recover(async () => {
162
+ const path = typeof payload.path === 'string' ? payload.path.trim() : ''
163
+ if (!path) throw new Error('缺少 Session 工作目录。')
164
+ const porcelain = await runGit(ctx.subprocess, path, ['worktree', 'list', '--porcelain'])
165
+ const worktrees = parseWorktrees(porcelain)
166
+ const target = worktrees.find((worktree) => samePath(worktree.path, path))
167
+ if (!target || target.isMain) return { removed: false, path }
168
+ const repoPath = worktrees.find((worktree) => worktree.isMain)?.path
169
+ if (!repoPath) throw new Error('无法定位主仓库。')
170
+ await runGit(ctx.subprocess, repoPath, ['worktree', 'remove', target.path])
171
+ return { removed: true, path: target.path }
172
+ }, classifyGitError)
173
+
174
+ if (endpoint === 'worktree.status') return recover(async () => {
175
+ const path = typeof payload.path === 'string' ? payload.path.trim() : ''
176
+ if (!path) throw new Error('缺少 Worktree 路径。')
177
+ const output = await runGit(ctx.subprocess, path, ['status', '--short', '--branch'])
178
+ const lines = output ? output.split(/\r?\n/) : []
179
+ return {
180
+ branchLine: lines.find((line) => line.startsWith('## ')) ?? '',
181
+ changedFiles: lines.filter((line) => line && !line.startsWith('## ')).length,
182
+ output,
183
+ }
184
+ })
185
+
186
+ if (endpoint === 'worktree.prune') return recover(async () => {
187
+ const path = typeof payload.path === 'string' ? payload.path.trim() : ''
188
+ if (!path) throw new Error('缺少仓库路径。')
189
+ await runGit(ctx.subprocess, path, ['worktree', 'prune'])
190
+ return { pruned: true }
191
+ })
192
+
193
+ return fail('bad-request', `Unknown endpoint: ${endpoint}`)
194
+ }, { authority: 'loopback' }), 'dsh-simple-worktree rpc')
195
+ }
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@alpacachen/dsh-simple-worktree",
3
+ "version": "1.0.2",
4
+ "description": "A minimal worktree manager with one button and one dialog for DeepSeek Harness.",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "deepseek-harness",
8
+ "dsh",
9
+ "dsh-plugin",
10
+ "git",
11
+ "worktree"
12
+ ],
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/alpacachen/dsh-worktree.git"
19
+ },
20
+ "homepage": "https://github.com/alpacachen/dsh-worktree",
21
+ "bugs": {
22
+ "url": "https://github.com/alpacachen/dsh-worktree/issues"
23
+ },
24
+ "type": "module",
25
+ "main": "./lib/index.js",
26
+ "exports": {
27
+ ".": "./lib/index.js",
28
+ "./client": "./client/client.js",
29
+ "./cordis.patch.yml": "./cordis.patch.yml",
30
+ "./package.json": "./package.json"
31
+ },
32
+ "files": [
33
+ "lib",
34
+ "client",
35
+ "cordis.patch.yml",
36
+ "package.json",
37
+ "README.md",
38
+ "README.zh.md"
39
+ ],
40
+ "peerDependencies": {
41
+ "@deepseek-ai/cordis": "^4.0.1"
42
+ },
43
+ "dsh": {
44
+ "bundle": {
45
+ "patch": "./cordis.patch.yml"
46
+ },
47
+ "client": {
48
+ "inject": [
49
+ "@deepseek-ai/dsh-client-connection",
50
+ "@deepseek-ai/dsh-client-runtime",
51
+ "@deepseek-ai/dsh-client-ui-slots",
52
+ "@deepseek-ai/dsh-client-ui-workspace"
53
+ ],
54
+ "platform": "web"
55
+ }
56
+ },
57
+ "devDependencies": {
58
+ "@deepseek-ai/cordis": "^4.0.1",
59
+ "@testing-library/react": "16.3.2",
60
+ "@testing-library/user-event": "14.6.5",
61
+ "@types/node": "^22.10.0",
62
+ "@types/react": "^18.3.12",
63
+ "@types/react-dom": "^18.3.1",
64
+ "esbuild": "^0.28.2",
65
+ "jsdom": "^26.1.0",
66
+ "react": "^18.3.1",
67
+ "react-dom": "^18.3.1",
68
+ "typescript": "^5.7.2",
69
+ "vitest": "^3.2.7"
70
+ },
71
+ "dependencies": {
72
+ "@radix-ui/react-dialog": "1.1.6",
73
+ "lucide-react": "0.474.0"
74
+ },
75
+ "scripts": {
76
+ "build": "node build.mjs",
77
+ "typecheck": "tsc --noEmit",
78
+ "test:unit": "vitest run",
79
+ "check:client-bundle": "node scripts/check-client-bundle.mjs",
80
+ "check:tracked-bundle": "node scripts/check-tracked-bundle.mjs",
81
+ "check:package": "node scripts/check-package-contents.mjs",
82
+ "test": "pnpm build && pnpm typecheck && pnpm test:unit && pnpm check:client-bundle && pnpm check:tracked-bundle && pnpm check:package"
83
+ }
84
+ }