dsh-git-workspace 0.0.0-stage → 0.1.1
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 +28 -0
- package/README.md +217 -2
- package/cordis.patch.yml +9 -0
- package/lib/client.js +736 -0
- package/lib/client.js.map +1 -0
- package/lib/index.js +815 -0
- package/lib/index.js.map +1 -0
- package/lib/types/index.d.ts +24 -0
- package/package.json +71 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":["useState","useRef","useCallback","Button"],"sources":["../src/client/index.tsx"],"sourcesContent":["/**\n * @dsh-external/dsh-git-workspace — client 半。\n *\n * 接管 ui-workspace 声明的两个 directory-flow 单占洞,把原来的目录浏览\n * 对话框换成「本地目录 / GitHub 仓库」双来源对话框。\n *\n * 洞的契约(来自 ui-workspace / directory-picker-browse 实现):\n * props: open, busy, onPicked(path), onCancel(), onError(err)\n * inject: t, listDirectory, createDirectory, pickNativeDirectory\n * 本实现只消费 open / busy / onPicked / onCancel:错误留在对话框内显示,\n * 不驱动 owner 的 onError arm(与内置 browse 一致)。\n *\n * 遮蔽规则来自 dsh-client-ui-slots 的 single 分支:同 priority 二次注册会抛错,\n * 不同 priority 按升序投影取胜者。内置 browse 用默认 0,这里用负数接管。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\n\nconst LOCALE_NS = 'github-workspace'\nconst CLONE_ENDPOINT = '/gh-workspace/clone'\n/**\n * 远低于内置 browse(默认 0)与任何已知占用者。实测洞里存在 priority -1 的\n * 注册(error 文案里的 \"registered by Gb\"),所以 -1 不够低,用 -1000 打底,\n * 每次 apply 再递减一档,既保证胜出也不会撞同优先级。\n */\nconst DEPTH_PRIORITY = -1000\n\n/**\n * 每次 apply 递减一档。装配器的动态注入与启动自动恢复可能让 apply 跑多遍,\n * 而 single 洞对同优先级二次注册是硬抛错。让每份注册各占一档后:\n * 全部注册成功,投影取最小者渲染;任一份被 dispose 回收,另一份仍然在。\n */\nlet applyGeneration = 0\n\nconst zh = {\n title: '添加工作区',\n tabLocal: '本地目录',\n tabGithub: 'Git 仓库',\n localHint: '填写一个已存在的目录绝对路径,也可以用系统文件夹选择器。',\n localPlaceholder: '例如 D:\\\\projects\\\\my-repo',\n pickNative: '选择文件夹…',\n open: '使用此目录',\n repoLabel: '仓库地址',\n repoHint: '支持 owner/repo(默认 GitHub)、https://、ssh:// 与 git@host:path,任意 Git 服务器都可以。',\n repoPlaceholder: 'deepseek-ai/DeepSeek-Harness 或 https://gitlab.com/group/repo',\n branchLabel: '分支',\n branchPlaceholder: '留空使用默认分支',\n parentLabel: '克隆到',\n parentPlaceholder: '留空使用默认目录',\n clone: '克隆并添加',\n cloning: '正在克隆…',\n cancel: '取消',\n errPathRequired: '请先填写目录路径。',\n errRepoRequired: '请先填写仓库。',\n errPickUnavailable: '当前环境没有系统文件夹选择器,请直接填写路径。',\n errClone: '克隆失败。',\n loading: '加载中…',\n emptyDir: '这里没有子目录。',\n cloningTitle: '正在克隆仓库',\n cloneFailed: '克隆失败',\n cancelled: '已取消',\n dismiss: '关闭',\n tokenLabel: '访问令牌',\n tokenHint: '留空则复用本机 git 凭据(如 Windows 凭据管理器的 credential.helper)。需要指定账号时再填该服务器的 Personal Access Token,按仓库地址的主机注入,只用于本次克隆,不保存。',\n tokenPlaceholder: '留空使用本机凭据,或填 ghp_… / glpat-… 等',\n}\n\nconst en = {\n title: 'Add Workspace',\n tabLocal: 'Local folder',\n tabGithub: 'Git repository',\n localHint: 'Enter an existing absolute folder path, or use the system folder picker.',\n localPlaceholder: 'e.g. D:\\\\projects\\\\my-repo',\n pickNative: 'Choose folder…',\n open: 'Use this folder',\n repoLabel: 'Repository',\n repoHint: 'owner/repo (GitHub), https://, ssh:// or git@host:path — any Git server works.',\n repoPlaceholder: 'deepseek-ai/DeepSeek-Harness or https://gitlab.com/group/repo',\n branchLabel: 'Branch',\n branchPlaceholder: 'Leave empty for the default branch',\n parentLabel: 'Clone into',\n parentPlaceholder: 'Leave empty for the default folder',\n clone: 'Clone and add',\n cloning: 'Cloning…',\n cancel: 'Cancel',\n errPathRequired: 'Enter a folder path first.',\n errRepoRequired: 'Enter a repository first.',\n errPickUnavailable: 'No system folder picker in this environment; type the path instead.',\n errClone: 'Clone failed.',\n loading: 'Loading…',\n emptyDir: 'No subfolders here.',\n cloningTitle: 'Cloning repository',\n cloneFailed: 'Clone failed',\n cancelled: 'Cancelled',\n dismiss: 'Dismiss',\n tokenLabel: 'Access token',\n tokenHint: 'Leave empty to reuse the local git credential helper (e.g. Windows Credential Manager). Fill a personal access token for that server only when you need a specific account; it is injected for the repository host, used once, never stored.',\n tokenPlaceholder: 'Empty = local credentials, or ghp_… / glpat-…',\n}\n\nconst styles = {\n overlay: {\n position: 'fixed',\n inset: 0,\n zIndex: 4000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(0,0,0,0.45)',\n } as const,\n dialog: {\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n gap: '14px',\n width: '560px',\n maxWidth: '92vw',\n maxHeight: '86vh',\n overflowY: 'auto',\n padding: '20px',\n borderRadius: '16px',\n background: 'Canvas',\n color: 'CanvasText',\n boxShadow: '0 20px 60px rgba(0,0,0,0.45)',\n font: 'inherit',\n } as const,\n title: { margin: 0, fontSize: '16px', fontWeight: 600 } as const,\n tabs: { display: 'flex', gap: '6px' } as const,\n tab: (active: boolean) =>\n ({\n appearance: 'none',\n border: '1px solid transparent',\n borderRadius: '8px',\n padding: '6px 14px',\n cursor: 'pointer',\n font: 'inherit',\n fontWeight: active ? 600 : 400,\n color: 'inherit',\n background: active ? 'rgba(127,127,127,0.22)' : 'transparent',\n borderColor: active ? 'rgba(127,127,127,0.35)' : 'transparent',\n }) as const,\n hint: { fontSize: '12px', opacity: 0.62, margin: 0 } as const,\n field: { display: 'flex', flexDirection: 'column', gap: '5px' } as const,\n label: { fontSize: '12px', fontWeight: 600, opacity: 0.78 } as const,\n input: {\n boxSizing: 'border-box',\n width: '100%',\n padding: '8px 10px',\n borderRadius: '8px',\n border: '1px solid rgba(127,127,127,0.36)',\n background: 'Field',\n color: 'FieldText',\n font: 'inherit',\n fontSize: '13px',\n } as const,\n error: {\n margin: 0,\n padding: '8px 10px',\n borderRadius: '8px',\n fontSize: '12px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n color: '#ff8080',\n background: 'rgba(255,80,80,0.12)',\n } as const,\n footer: { display: 'flex', justifyContent: 'flex-end', gap: '8px' } as const,\n listBox: {\n display: 'flex',\n flexDirection: 'column',\n maxHeight: '240px',\n overflowY: 'auto',\n border: '1px solid rgba(127,127,127,0.28)',\n borderRadius: '10px',\n } as const,\n listRow: {\n display: 'block',\n width: '100%',\n textAlign: 'left',\n appearance: 'none',\n border: 0,\n borderBottom: '1px solid rgba(127,127,127,0.14)',\n background: 'transparent',\n color: 'inherit',\n font: 'inherit',\n fontSize: '13px',\n padding: '8px 12px',\n cursor: 'pointer',\n } as const,\n listMeta: { fontSize: '11px', opacity: 0.6, padding: '8px 12px' } as const,\n floating: {\n position: 'fixed',\n right: '18px',\n bottom: '18px',\n zIndex: 4001,\n width: '330px',\n maxWidth: '90vw',\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n padding: '14px 16px',\n borderRadius: '12px',\n background: 'Canvas',\n color: 'CanvasText',\n border: '1px solid rgba(127,127,127,0.28)',\n boxShadow: '0 12px 36px rgba(0,0,0,0.35)',\n fontSize: '13px',\n } as const,\n floatingHead: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '8px' } as const,\n floatingTitle: { fontWeight: 600, fontSize: '13px' } as const,\n floatingClose: {\n appearance: 'none',\n border: 0,\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n fontSize: '16px',\n lineHeight: 1,\n opacity: 0.65,\n padding: 0,\n } as const,\n floatingRepo: { fontSize: '12px', opacity: 0.72, wordBreak: 'break-word' } as const,\n progressTrack: {\n height: '6px',\n borderRadius: '3px',\n background: 'rgba(127,127,127,0.25)',\n overflow: 'hidden',\n } as const,\n progressFill: {\n height: '100%',\n background: '#4a7dff',\n transition: 'width 0.3s ease',\n } as const,\n floatingMeta: { display: 'flex', justifyContent: 'space-between', fontSize: '11px', opacity: 0.7 } as const,\n}\n\ntype Translate = (key: string, params?: Record<string, unknown>) => string\n\ninterface DialogProps {\n open: boolean\n busy?: boolean\n onPicked: (path: string) => void\n onCancel: () => void\n t: Translate\n listDirectory?: (path: string, signal?: AbortSignal) => Promise<unknown>\n pickNativeDirectory?: () => Promise<string | undefined>\n}\n\ninterface FloatingJobProps {\n job: any\n t: Translate\n onCancel: () => void\n onDismiss: () => void\n}\n\n/**\n * 克隆进度浮层:固定在右下角,不遮住主界面,用户可继续在 DSH 里操作。\n * 运行中只提供取消,失败后提供关闭。\n */\nfunction FloatingJob(props: FloatingJobProps): any {\n const { job, t, onCancel, onDismiss } = props\n const raw = Number(job?.percent)\n const percent = Number.isFinite(raw) ? Math.max(0, Math.min(100, raw)) : 0\n const failed = job?.state === 'failed'\n const cancelled = job?.state === 'cancelled'\n\n return (\n <div style={styles.floating}>\n <div style={styles.floatingHead}>\n <span style={styles.floatingTitle}>\n {failed ? t('cloneFailed') : cancelled ? t('cancelled') : t('cloningTitle')}\n </span>\n <button\n type=\"button\"\n style={styles.floatingClose}\n aria-label={failed || cancelled ? t('dismiss') : t('cancel')}\n onClick={failed || cancelled ? onDismiss : onCancel}\n >\n ×\n </button>\n </div>\n <div style={styles.floatingRepo}>{String(job?.repo ?? '')}</div>\n <div style={styles.progressTrack}>\n <div style={{ ...styles.progressFill, width: percent + '%' }} />\n </div>\n <div style={styles.floatingMeta}>\n <span>{failed ? t('cloneFailed') : String(job?.detail ?? '')}</span>\n <span>{percent}%</span>\n </div>\n {failed ? <p style={styles.error}>{String(job?.error ?? '')}</p> : null}\n </div>\n )\n}\n\nfunction WorkspaceSourceDialog(props: DialogProps): any {\n const { open, onPicked, onCancel, t, listDirectory, pickNativeDirectory } = props\n const ownerBusy = props.busy === true\n const [tab, setTab] = useState<'local' | 'github'>('local')\n const [localPath, setLocalPath] = useState('')\n const [repo, setRepo] = useState('')\n const [branch, setBranch] = useState('')\n const [parentDir, setParentDir] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [cloning, setCloning] = useState(false)\n const [listing, setListing] = useState<any>(null)\n const [listingBusy, setListingBusy] = useState(false)\n const [token, setToken] = useState('')\n const [job, setJob] = useState<any>(null)\n const submittedJobRef = useRef<string | null>(null)\n\n // 每次关闭后回到干净状态,避免上次失败的原因残留在界面上。\n useEffect(() => {\n if (open) return\n setTab('local')\n setLocalPath('')\n setRepo('')\n setBranch('')\n setParentDir('')\n setError(null)\n setCloning(false)\n setListing(null)\n setListingBusy(false)\n setJob(null)\n setToken('')\n submittedJobRef.current = null\n }, [open])\n\n /** 列一层目录;不传路径时列 Host 主目录。 */\n const load = useCallback(async (path?: string) => {\n if (typeof listDirectory !== 'function') return\n setListingBusy(true)\n setError(null)\n try {\n const result: any = await listDirectory(path as any)\n setListing(result ?? null)\n if (result && typeof result.path === 'string') setLocalPath(result.path)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setListingBusy(false)\n }\n }, [listDirectory])\n\n // 打开本地页签时自动列出主目录,省掉用户手打路径。\n useEffect(() => {\n if (!open || tab !== 'local' || listing !== null) return\n void load(undefined)\n }, [open, tab, listing, load])\n\n const submitLocal = useCallback(() => {\n const value = localPath.trim()\n if (value === '') {\n setError(t('errPathRequired'))\n return\n }\n setError(null)\n onPicked(value)\n }, [localPath, onPicked, t])\n\n const pickNative = useCallback(async () => {\n if (typeof pickNativeDirectory !== 'function') {\n setError(t('errPickUnavailable'))\n return\n }\n try {\n const picked = await pickNativeDirectory()\n if (typeof picked === 'string' && picked.trim() !== '') {\n setError(null)\n onPicked(picked.trim())\n }\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n }\n }, [pickNativeDirectory, onPicked, t])\n\n const cloneRepo = useCallback(async () => {\n const value = repo.trim()\n if (value === '') {\n setError(t('errRepoRequired'))\n return\n }\n setCloning(true)\n setError(null)\n try {\n const response = await fetch(CLONE_ENDPOINT, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n repo: value,\n branch: branch.trim(),\n parentDir: parentDir.trim(),\n token: token.trim(),\n }),\n })\n const data: any = await response.json()\n if (data?.ok !== true) {\n throw new Error(data?.error?.message ?? t('errClone'))\n }\n setCloning(false)\n if (data.value?.state === 'done' && data.value?.path) {\n onPicked(String(data.value.path))\n return\n }\n // 任务已在 host 侧排程:对话框收成角落浮层,用户可继续操作 DSH。\n setJob(data.value)\n } catch (reason) {\n setCloning(false)\n setError(reason instanceof Error ? reason.message : String(reason))\n }\n }, [repo, branch, parentDir, token, onPicked, t])\n\n // 进度轮询:依赖 job.id 与运行状态两个标量,百分比变化不会重建定时器。\n const jobId: string | undefined = job?.id\n const jobRunning = job?.state === 'running'\n useEffect(() => {\n if (jobId === undefined || !jobRunning) return\n const timer = setInterval(() => {\n void (async () => {\n try {\n const response = await fetch('/gh-workspace/job?id=' + encodeURIComponent(jobId))\n // 任务已被清理:停止轮询并收起浮层(jobId 变 undefined 会让 effect 清定时器)。\n if (response.status === 404) {\n setJob(null)\n return\n }\n if (!response.ok) return\n const data: any = await response.json()\n if (data?.ok === true && data.value) setJob(data.value)\n } catch {\n /* 单次失败继续轮询 */\n }\n })()\n }, 700)\n return () => clearInterval(timer)\n }, [jobId, jobRunning])\n\n // 完成即交回 owner 注册为工作区;用 ref 防严格模式下的重复提交。\n useEffect(() => {\n if (job === null || job.state !== 'done' || typeof job.path !== 'string') return\n if (submittedJobRef.current === job.id) return\n submittedJobRef.current = job.id\n onPicked(job.path)\n }, [job, onPicked])\n\n const cancelJob = useCallback(async () => {\n if (job === null) return\n const id = job.id\n setJob(null)\n try {\n await fetch('/gh-workspace/job/cancel', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id }),\n })\n } catch {\n /* 取消失败也先收起浮层 */\n }\n onCancel()\n }, [job, onCancel])\n\n // 恢复只在「打开」这一刻做一次。依赖 job 会让取消后立刻重新拉回同一个任务:\n // 取消时 host 要等子进程 close 才把 state 改成 cancelled,这期间 /jobs 仍返回它。\n const restoredRef = useRef(false)\n useEffect(() => {\n if (!open) {\n restoredRef.current = false\n return\n }\n if (restoredRef.current) return\n restoredRef.current = true\n void (async () => {\n try {\n const response = await fetch('/gh-workspace/jobs')\n const data: any = await response.json()\n const active = data?.ok === true ? data.value?.jobs : undefined\n if (Array.isArray(active) && active.length > 0) setJob(active[0])\n } catch {\n /* 没有进行中任务 */\n }\n })()\n }, [open])\n\n if (!open) return null\n\n if (job !== null) {\n return <FloatingJob job={job} t={t} onCancel={() => void cancelJob()} onDismiss={onCancel} />\n }\n\n // owner 在注册工作区期间会置 busy,必须并进来,否则按钮仍可点。\n const busy = cloning === true || ownerBusy\n\n return (\n <div style={styles.overlay} onClick={onCancel}>\n <div style={styles.dialog} onClick={(event: any) => event.stopPropagation()}>\n <h2 style={styles.title}>{t('title')}</h2>\n\n <div style={styles.tabs}>\n <button type=\"button\" style={styles.tab(tab === 'local')} onClick={() => setTab('local')}>\n {t('tabLocal')}\n </button>\n <button type=\"button\" style={styles.tab(tab === 'github')} onClick={() => setTab('github')}>\n {t('tabGithub')}\n </button>\n </div>\n\n {tab === 'local' ? (\n <div style={styles.field}>\n <p style={styles.hint}>{t('localHint')}</p>\n <input\n style={styles.input}\n value={localPath}\n placeholder={t('localPlaceholder')}\n onChange={(event: any) => setLocalPath(event.target.value)}\n onKeyDown={(event: any) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n submitLocal()\n }\n }}\n />\n {typeof pickNativeDirectory === 'function' ? (\n <div>\n <Button variant=\"outline\" onClick={() => void pickNative()}>\n {t('pickNative')}\n </Button>\n </div>\n ) : null}\n {listing !== null ? (\n <div style={styles.listBox}>\n {Array.isArray(listing.entries) && listing.entries.length > 0 ? (\n listing.entries.map((entry: any) => (\n <button\n key={String(entry.path)}\n type=\"button\"\n style={styles.listRow}\n title={String(entry.path)}\n onClick={() => void load(String(entry.path))}\n >\n {String(entry.name)}\n </button>\n ))\n ) : (\n <div style={styles.listMeta}>{listingBusy ? t('loading') : t('emptyDir')}</div>\n )}\n </div>\n ) : listingBusy ? (\n <p style={styles.hint}>{t('loading')}</p>\n ) : null}\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <div style={styles.field}>\n <span style={styles.label}>{t('repoLabel')}</span>\n <input\n style={styles.input}\n value={repo}\n placeholder={t('repoPlaceholder')}\n disabled={busy}\n onChange={(event: any) => setRepo(event.target.value)}\n />\n <p style={styles.hint}>{t('repoHint')}</p>\n </div>\n <div style={styles.field}>\n <span style={styles.label}>{t('branchLabel')}</span>\n <input\n style={styles.input}\n value={branch}\n placeholder={t('branchPlaceholder')}\n disabled={busy}\n onChange={(event: any) => setBranch(event.target.value)}\n />\n </div>\n <div style={styles.field}>\n <span style={styles.label}>{t('parentLabel')}</span>\n <input\n style={styles.input}\n value={parentDir}\n placeholder={t('parentPlaceholder')}\n disabled={busy}\n onChange={(event: any) => setParentDir(event.target.value)}\n />\n </div>\n <div style={styles.field}>\n <span style={styles.label}>{t('tokenLabel')}</span>\n <input\n style={styles.input}\n type=\"password\"\n autoComplete=\"off\"\n value={token}\n placeholder={t('tokenPlaceholder')}\n disabled={busy}\n onChange={(event: any) => setToken(event.target.value)}\n />\n <p style={styles.hint}>{t('tokenHint')}</p>\n </div>\n </div>\n )}\n\n {error !== null ? <p style={styles.error}>{error}</p> : null}\n\n <div style={styles.footer}>\n <Button variant=\"outline\" disabled={busy} onClick={onCancel}>\n {t('cancel')}\n </Button>\n {tab === 'local' ? (\n <Button variant=\"primary\" disabled={busy} onClick={submitLocal}>\n {t('open')}\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busy} onClick={() => void cloneRepo()}>\n {busy ? t('cloning') : t('clone')}\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n}\n\ntype ClientContext = {\n slots: {\n inject: (name: string, factory: () => unknown) => () => void\n register: (spec: Record<string, unknown>, component: unknown) => () => void\n }\n uiWorkspace: {\n listDirectory: (path: string, signal?: AbortSignal) => Promise<unknown>\n createDirectory: (path: string, name: string) => Promise<unknown>\n /** 系统文件夹选择器;返回选中目录,取消时返回 null。 */\n pickDirectory?: () => Promise<string | null | undefined>\n }\n locale: {\n register: (ns: string, dictionaries: Record<string, Record<string, string>>) => () => void\n bind: (ns: string) => Translate\n }\n effect: (fn: () => unknown, label?: string) => () => void\n}\n\nexport const inject = ['slots', 'uiWorkspace', 'locale']\n\nexport function apply(ctx: ClientContext): void {\n // 每次 apply 占一档更低的 priority,重复 apply 时不会撞上同优先级注册。\n const priority = DEPTH_PRIORITY - applyGeneration++\n\n ctx.effect(() => {\n try {\n return ctx.locale.register(LOCALE_NS, { zh, en })\n } catch {\n // 重复 apply(动态注入与启动自动恢复同时存活)时字典已由先者注册。\n return () => {}\n }\n }, 'dsh-git-workspace: dictionaries')\n\n const injected = () => {\n // 与 dsh-client-ui-directory-picker-native 相同的两级来源:\n // 先用桌面注入的 __DSH_DIRECTORY_PICKER__,没有就走 uiWorkspace.pickDirectory()。\n const picker: (() => Promise<string | null | undefined>) | undefined =\n typeof (globalThis as any).__DSH_DIRECTORY_PICKER__?.pick === 'function'\n ? () => (globalThis as any).__DSH_DIRECTORY_PICKER__.pick()\n : typeof ctx.uiWorkspace.pickDirectory === 'function'\n ? () => ctx.uiWorkspace.pickDirectory!()\n : undefined\n\n return {\n t: ctx.locale.bind(LOCALE_NS),\n listDirectory: (path: string, signal?: AbortSignal) => ctx.uiWorkspace.listDirectory(path, signal),\n createDirectory: (path: string, name: string) => ctx.uiWorkspace.createDirectory(path, name),\n pickNativeDirectory: picker,\n }\n }\n\n // 两个洞都占用:侧栏 Add workspace 与 Hero 的 workspace picker。\n // 结构与 dsh-client-ui-directory-picker-browse 一致:嵌套 slots.inject +\n // generator 逐个 yield register,由 slots 自己管理生命周期。\n ctx.slots.inject('conversation.hero.workspace.directoryFlow', () =>\n ctx.slots.inject('sidebar.workspaces.directoryFlow', function* () {\n try {\n yield ctx.slots.register({\n name: 'conversation.hero.workspace.directoryFlow',\n priority,\n inject: injected,\n }, WorkspaceSourceDialog)\n } catch {\n /* 极端情况下(同 priority 已被占)保留先者,不带走整个 client 半 */\n }\n try {\n yield ctx.slots.register({\n name: 'sidebar.workspaces.directoryFlow',\n priority,\n inject: injected,\n }, WorkspaceSourceDialog)\n } catch {\n /* 同上 */\n }\n }),\n )\n}\n"],"mappings":"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"}
|