relay-dsh-plugin-claude 0.2.2 → 0.2.3-rc.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/README.md +9 -9
- package/README.zh.md +9 -9
- package/lib/client.js.map +1 -1
- package/lib/host-plugin.js +2 -0
- package/lib/host-plugin.js.map +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Claude Code Conversations for DeepSeek Harness
|
|
2
2
|
|
|
3
|
-
> **
|
|
3
|
+
> **Release candidate `0.2.3-rc.2` is verified on official DSH `0.1.5-rc.2` and `0.1.6-alpha.1`.** Imported history now supplies the settlement stream required by current DSH while remaining valid on rc.2; peer metadata declares both exact releases. [Install it from npm](https://www.npmjs.com/package/relay-dsh-plugin-claude) · [Compatibility evidence](https://github.com/yangbobo2021/Relay/tree/codex/relay-foundation/dsh-lab/dsh-0.1.6-alpha.1-20260915).
|
|
4
4
|
|
|
5
|
-
> **Release channels:** `latest` → `0.2.2`; `next` → `0.2.
|
|
5
|
+
> **Release channels:** `latest` → `0.2.2`; `next` → `0.2.3-rc.2`.
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npx @deepseek-ai/dsh@0.1.
|
|
9
|
-
npx @deepseek-ai/dsh@0.1.
|
|
8
|
+
npx @deepseek-ai/dsh@0.1.6-alpha.1 plugin --profile web add relay-dsh-plugin-claude@next
|
|
9
|
+
npx @deepseek-ai/dsh@0.1.6-alpha.1 web
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
[](https://www.npmjs.com/package/relay-dsh-plugin-claude)
|
|
@@ -15,7 +15,7 @@ npx @deepseek-ai/dsh@0.1.2-rc.1 web
|
|
|
15
15
|
[](https://github.com/yangbobo2021/relay-dsh-plugin-claude/stargazers)
|
|
16
16
|
[](LICENSE)
|
|
17
17
|
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
18
|
-
[](https://www.npmjs.com/package/relay-dsh-plugin-claude/v/0.2.
|
|
18
|
+
[](https://www.npmjs.com/package/relay-dsh-plugin-claude/v/0.2.2)
|
|
19
19
|
|
|
20
20
|
English | [中文](README.zh.md)
|
|
21
21
|
|
|
@@ -118,7 +118,7 @@ Use `@latest` to install the current stable release:
|
|
|
118
118
|
npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add relay-dsh-plugin-claude@latest
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
-
At the time of writing, `latest` resolves to stable version `0.2.
|
|
121
|
+
At the time of writing, `latest` resolves to stable version `0.2.2`. The linked
|
|
122
122
|
npm page is the source of truth for the current version.
|
|
123
123
|
|
|
124
124
|
#### npm prerelease (recommended during DSH preview)
|
|
@@ -131,7 +131,7 @@ contains the latest model-selection synchronization fix:
|
|
|
131
131
|
npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add relay-dsh-plugin-claude@next
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
-
At the time of writing, `next` resolves to `0.2.
|
|
134
|
+
At the time of writing, `next` resolves to `0.2.3-rc.2`.
|
|
135
135
|
|
|
136
136
|
#### GitHub development build
|
|
137
137
|
|
|
@@ -145,7 +145,7 @@ npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add github:yangbobo2021/rel
|
|
|
145
145
|
full Commit SHA instead. For example:
|
|
146
146
|
|
|
147
147
|
```bash
|
|
148
|
-
npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add github:yangbobo2021/relay-dsh-plugin-claude#v0.2.2
|
|
148
|
+
npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add github:yangbobo2021/relay-dsh-plugin-claude#v0.2.3-rc.2
|
|
149
149
|
```
|
|
150
150
|
|
|
151
151
|
The official DSH CLI initializes the `web` Profile if it does not exist, asks
|
|
@@ -361,7 +361,7 @@ Report bugs and feature requests in this repository's
|
|
|
361
361
|
|
|
362
362
|
### Published stable installation
|
|
363
363
|
|
|
364
|
-
Stable `0.2.
|
|
364
|
+
Stable `0.2.2` targets DSH `0.1.1-rc.2` and the `0.1.2` preview line through `0.1.2-rc.1`; install it from npm `latest` or Git tag `v0.2.2`.
|
|
365
365
|
|
|
366
366
|
```sh
|
|
367
367
|
npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add relay-dsh-plugin-claude@latest
|
package/README.zh.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# 在 DeepSeek Harness 中使用 Claude Code 对话
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **候选版本 `0.2.3-rc.2` 已在官方 DSH `0.1.5-rc.2` 和 `0.1.6-alpha.1` 上验证。** 导入历史现在会提供新版 DSH 要求的结算 stream,同时保持 rc.2 有效;peer 元数据已声明两个精确版本。[从 npm 安装](https://www.npmjs.com/package/relay-dsh-plugin-claude) · [兼容性证据](https://github.com/yangbobo2021/Relay/tree/codex/relay-foundation/dsh-lab/dsh-0.1.6-alpha.1-20260915)。
|
|
4
4
|
|
|
5
|
-
> **发布通道:** `latest` → `0.2.2`;`next` → `0.2.
|
|
5
|
+
> **发布通道:** `latest` → `0.2.2`;`next` → `0.2.3-rc.2`。
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npx @deepseek-ai/dsh@0.1.
|
|
9
|
-
npx @deepseek-ai/dsh@0.1.
|
|
8
|
+
npx @deepseek-ai/dsh@0.1.6-alpha.1 plugin --profile web add relay-dsh-plugin-claude@next
|
|
9
|
+
npx @deepseek-ai/dsh@0.1.6-alpha.1 web
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
[](https://www.npmjs.com/package/relay-dsh-plugin-claude)
|
|
@@ -15,7 +15,7 @@ npx @deepseek-ai/dsh@0.1.2-rc.1 web
|
|
|
15
15
|
[](https://github.com/yangbobo2021/relay-dsh-plugin-claude/stargazers)
|
|
16
16
|
[](LICENSE)
|
|
17
17
|
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
18
|
-
[](https://www.npmjs.com/package/relay-dsh-plugin-claude/v/0.2.
|
|
18
|
+
[](https://www.npmjs.com/package/relay-dsh-plugin-claude/v/0.2.2)
|
|
19
19
|
|
|
20
20
|
[English](README.md) | 中文
|
|
21
21
|
|
|
@@ -113,7 +113,7 @@ claude
|
|
|
113
113
|
npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add relay-dsh-plugin-claude@latest
|
|
114
114
|
```
|
|
115
115
|
|
|
116
|
-
本文更新时,`latest` 指向稳定版 `0.2.
|
|
116
|
+
本文更新时,`latest` 指向稳定版 `0.2.2`。最新版本请以链接中的 npm 页面
|
|
117
117
|
为准。
|
|
118
118
|
|
|
119
119
|
#### npm 预发布版(DSH 预览阶段推荐)
|
|
@@ -125,7 +125,7 @@ npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add relay-dsh-plugin-claude
|
|
|
125
125
|
npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add relay-dsh-plugin-claude@next
|
|
126
126
|
```
|
|
127
127
|
|
|
128
|
-
本文更新时,`next` 指向 `0.2.
|
|
128
|
+
本文更新时,`next` 指向 `0.2.3-rc.2`。
|
|
129
129
|
|
|
130
130
|
#### GitHub 开发版
|
|
131
131
|
|
|
@@ -139,7 +139,7 @@ npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add github:yangbobo2021/rel
|
|
|
139
139
|
SHA。例如:
|
|
140
140
|
|
|
141
141
|
```bash
|
|
142
|
-
npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add github:yangbobo2021/relay-dsh-plugin-claude#v0.2.2
|
|
142
|
+
npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add github:yangbobo2021/relay-dsh-plugin-claude#v0.2.3-rc.2
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
官方 DSH CLI 会在需要时初始化 `web` Profile,通过 `pnpm` 安装所选软件包和
|
|
@@ -331,7 +331,7 @@ npm pack
|
|
|
331
331
|
|
|
332
332
|
### 已发布稳定版安装
|
|
333
333
|
|
|
334
|
-
稳定版 `0.2.
|
|
334
|
+
稳定版 `0.2.2` 面向 DSH `0.1.1-rc.2` 以及截至 `0.1.2-rc.1` 的 `0.1.2` 预览版本线;可通过 npm `latest` 或 Git Tag `v0.2.2` 安装。
|
|
335
335
|
|
|
336
336
|
```sh
|
|
337
337
|
npx @deepseek-ai/dsh@0.1.2-rc.1 plugin --profile web add relay-dsh-plugin-claude@latest
|
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["IconSparkle16","Modal","css","Button","css","DisclosureRow","IconCodeOutline16","StateDot"],"sources":["../dsh-client-compat.mjs","../model-selection.mjs","../claude-import-contract.mjs","../src/client/claude-session-import-client.mjs","../src/client/claude-session-import-ui-policy.mjs","../src/client/ClaudeSessionImportAction.tsx","../src/client/ClaudeActivityView.tsx","../src/client/claude-activity.ts","../src/client/locales.ts","../src/client/compatible-runtime.ts","../src/client/index.ts"],"sourcesContent":["// Public interface adapters shared by both supported DSH generations.\nexport function sessionPreset(session) {\n if (session?.projectionValues && Object.hasOwn(session.projectionValues, 'agentPreset')) {\n return session.projectionValues.agentPreset;\n }\n return session?.agentPreset;\n}\n\nconst service = (ctx, name) => typeof ctx.get === 'function' ? ctx.get(name) : ctx[name];\nexport function modelDirectory(ctx, sessionId) {\n const directories = service(ctx, 'modelDirectories');\n if (directories) return directories.directoryFor(sessionId);\n const sessions = service(ctx, 'connection')?.api?.sessions;\n if (!sessions) throw new Error('DSH model selection interface is unavailable');\n return {\n async load() {\n const response = await sessions.models({ sessionId });\n if (!response.result.ok) throw new Error('DSH model discovery failed');\n return response.result.value;\n },\n async select(selection) {\n const response = await sessions.selectModel({ sessionId, ...selection });\n if (!response.result.ok) throw new Error('DSH model selection failed');\n },\n };\n}\n","import { sessionPreset, modelDirectory } from \"./dsh-client-compat.mjs\";\nexport function installModelSelection(ctx, preset, provider, otherProvider) {\n let stopped = false;\n const selecting = new Set();\n const pending = new Set();\n\n const sync = () => {\n if (stopped) return;\n const list = ctx.sessions.list.getSnapshot();\n const id = list.current;\n if (id === undefined || list.byId[id]?.blank !== true) return;\n if (selecting.has(id)) {\n pending.add(id);\n return;\n }\n\n const selectedPreset = sessionPreset(list.byId[id]);\n if (selectedPreset !== preset && selectedPreset === otherProvider) return;\n selecting.add(id);\n void (async () => {\n const directory = modelDirectory(ctx, id);\n const models = await directory.load();\n if (stopped || !models.current) return;\n const latest = ctx.sessions.list.getSnapshot().byId[id];\n if (ctx.sessions.list.getSnapshot().current !== id || latest?.blank !== true || sessionPreset(latest) !== selectedPreset) {\n pending.add(id);\n return;\n }\n // Model projection changes also update the Session list in alpha.2.\n // Do not reset a chosen model or select again on our own projection update.\n if (selectedPreset === preset && models.current.provider === provider) return;\n const target = selectedPreset === preset\n ? models.groups.find((group) => group.id === provider)\n : models.current.provider === provider\n ? models.groups.find((group) => group.id !== provider && group.id !== otherProvider)\n : undefined;\n const model = target?.models[0];\n if (!target || !model) return;\n await directory.select({\n provider: target.id,\n model: model.id,\n ...(model.reasoning?.defaultEffort\n ? { reasoningEffort: model.reasoning.defaultEffort }\n : {}),\n });\n })().catch(() => {}).finally(() => {\n selecting.delete(id);\n if (pending.delete(id)) sync();\n });\n };\n\n const off = ctx.sessions.list.subscribe(sync);\n sync();\n return () => { stopped = true; off(); };\n}\n","export const CLAUDE_IMPORT_PATH = \"/api/relay/claude/import\";\n","import { CLAUDE_IMPORT_PATH } from \"../../claude-import-contract.mjs\";\n\nexport function resolveImportWorkspace(workspaces, sessions) {\n const current = sessions?.current;\n if (current !== undefined) {\n const owner = workspaces?.items?.find(workspace => workspace.sessionIds?.includes(current));\n if (owner) return owner;\n }\n const recent = workspaces?.recentWorkspaceId;\n return workspaces?.items?.find(workspace => workspace.workspaceId === recent) ?? null;\n}\n\nexport async function scanClaudeWorkspace(cwd, fetchImpl = fetch) {\n const response = await fetchImpl(CLAUDE_IMPORT_PATH, requestInit(\"scan\", cwd));\n const body = await readJsonResponse(response);\n if (!response.ok) throw new Error(body?.message ?? `Claude import scan failed with HTTP ${response.status}`);\n return body;\n}\n\nexport async function importClaudeWorkspace(cwd, { sessionIds, onProgress } = {}, fetchImpl = fetch) {\n const response = await fetchImpl(CLAUDE_IMPORT_PATH, requestInit(\"import\", cwd, sessionIds));\n if (!response.ok) {\n const body = await readJsonResponse(response);\n throw new Error(body?.message ?? `Claude import failed with HTTP ${response.status}`);\n }\n let completed = null;\n for await (const frame of ndjsonFrames(response.body)) {\n if (frame?.type === \"progress\") onProgress?.(frame);\n if (frame?.type === \"complete\") completed = frame.result;\n if (frame?.type === \"error\") throw new Error(frame.message ?? \"Claude import failed\");\n }\n if (completed === null) throw new Error(\"Claude import response ended before completion\");\n return completed;\n}\n\nexport async function refreshImportedWorkspace(sessions, workspaces) {\n await sessions.refresh();\n await workspaces.refresh();\n}\n\nexport async function* ndjsonFrames(body) {\n if (!body || typeof body.getReader !== \"function\") throw new Error(\"Claude import response has no readable body\");\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n while (true) {\n const { done, value } = await reader.read();\n buffer += decoder.decode(value, { stream: !done });\n let newline = buffer.indexOf(\"\\n\");\n while (newline !== -1) {\n const line = buffer.slice(0, newline).trim();\n buffer = buffer.slice(newline + 1);\n if (line) yield parseFrame(line);\n newline = buffer.indexOf(\"\\n\");\n }\n if (done) break;\n }\n const finalLine = buffer.trim();\n if (finalLine) yield parseFrame(finalLine);\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction requestInit(action, cwd, sessionIds) {\n return {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n action,\n cwd,\n ...(sessionIds === undefined ? {} : { sessionIds }),\n }),\n };\n}\n\nasync function readJsonResponse(response) {\n try {\n return await response.json();\n } catch {\n return null;\n }\n}\n\nfunction parseFrame(line) {\n try {\n return JSON.parse(line);\n } catch {\n throw new Error(\"Claude import returned malformed progress data\");\n }\n}\n","export function claudeSessionImportUiPolicy(phase, selected = 0, failed = 0, hasWorkspace = true) {\n if (phase === \"importing\") {\n return Object.freeze({ canClose: false, primary: \"importing\", primaryDisabled: true });\n }\n if (phase === \"summary\") {\n return Object.freeze({\n canClose: true,\n secondary: \"cancel\",\n primary: \"import-selected\",\n primaryDisabled: selected === 0,\n });\n }\n if (phase === \"select-workspace\") {\n return Object.freeze({\n canClose: true,\n secondary: \"cancel\",\n primary: \"scan\",\n primaryDisabled: !hasWorkspace,\n });\n }\n if (phase === \"error\") {\n return Object.freeze({ canClose: true, secondary: \"cancel\", primary: \"retry\", primaryDisabled: false });\n }\n if (phase === \"complete\" && failed > 0) {\n return Object.freeze({ canClose: true, secondary: \"close\", primary: \"retry\", primaryDisabled: false });\n }\n return Object.freeze({ canClose: true, primary: \"close\", primaryDisabled: false });\n}\n\nexport function claudeSessionImportUpdatedAtDate(value) {\n if (value === null || value === undefined) return null;\n const milliseconds = typeof value === \"number\" && Number.isFinite(value) && Math.abs(value) < 1e12\n ? value * 1000\n : value;\n const date = new Date(milliseconds);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport {\n Button,\n IconSparkle16,\n Modal,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type {\n InjectFace,\n PropsLocale,\n} from '@deepseek-ai/dsh-client-ui-slots'\nimport type { SessionImportProviderOwnerProps } from 'relay-dsh-plugin-session-import/contracts'\nimport { resolveImportWorkspace } from './claude-session-import-client.mjs'\nimport {\n claudeSessionImportUpdatedAtDate,\n claudeSessionImportUiPolicy,\n type ClaudeSessionImportUiAction,\n} from './claude-session-import-ui-policy.mjs'\nimport css from './ClaudeSessionImportAction.module.css'\n\ninterface WorkspaceView {\n workspaceId: string\n title: string\n path: string\n sessionIds: readonly string[]\n}\n\ninterface WorkspaceState {\n items: readonly WorkspaceView[]\n recentWorkspaceId?: string\n}\n\ninterface SessionState {\n current?: string\n}\n\ninterface Summary {\n found: number\n existing: number\n recoverable: number\n ready: number\n}\n\ninterface Candidate {\n id: string\n title: string\n cwd: string\n updatedAt: number | string | null\n status: 'ready' | 'recoverable'\n}\n\ninterface ImportResult {\n found: number\n imported: number\n existing: number\n failed: number\n failures: readonly { session: string; message: string }[]\n}\n\ninterface Progress extends ImportResult {\n completed: number\n total: number\n}\n\ninterface Observable<T> {\n getSnapshot: () => T\n subscribe: (listener: () => void) => () => void\n}\n\nexport interface ClaudeSessionImportInjected {\n hooks: {\n claudeSessionImportWorkspaces: Observable<WorkspaceState>\n claudeSessionImportSessions: Observable<SessionState>\n }\n scanWorkspace: (cwd: string) => Promise<{\n workspace: { title: string; path: string }\n summary: Summary\n candidates: readonly Candidate[]\n }>\n importWorkspace: (\n cwd: string,\n sessionIds: readonly string[],\n onProgress: (progress: Progress) => void,\n ) => Promise<ImportResult>\n refreshWorkspaceState: () => Promise<void>\n}\n\ntype Props = SessionImportProviderOwnerProps\n & InjectFace<ClaudeSessionImportInjected>\n & PropsLocale<'relay.claude'>\n\ntype Phase = 'idle' | 'no-workspace' | 'select-workspace' | 'scanning' | 'summary' | 'importing' | 'complete' | 'error'\n\nexport function ClaudeSessionImportProvider({\n registerProvider,\n useClaudeSessionImportWorkspaces,\n useClaudeSessionImportSessions,\n scanWorkspace,\n importWorkspace,\n refreshWorkspaceState,\n t,\n}: Props): ReactNode {\n const workspaces = useClaudeSessionImportWorkspaces(value => value)\n const sessions = useClaudeSessionImportSessions(value => value)\n const availableTarget = resolveImportWorkspace(workspaces, sessions) as WorkspaceView | null\n const [open, setOpen] = useState(false)\n const [target, setTarget] = useState<WorkspaceView | null>(null)\n const [phase, setPhase] = useState<Phase>('idle')\n const [summary, setSummary] = useState<Summary | null>(null)\n const [candidates, setCandidates] = useState<readonly Candidate[]>([])\n const [selectedIds, setSelectedIds] = useState<ReadonlySet<string>>(new Set())\n const [progress, setProgress] = useState<Progress | null>(null)\n const [result, setResult] = useState<ImportResult | null>(null)\n const [error, setError] = useState('')\n const request = useRef(0)\n\n const close = (): void => {\n if (!claudeSessionImportUiPolicy(phase, selectedIds.size, result?.failed).canClose) return\n request.current += 1\n setOpen(false)\n }\n\n const scan = (workspace: WorkspaceView): void => {\n const generation = ++request.current\n setPhase('scanning')\n setSummary(null)\n setCandidates([])\n setSelectedIds(new Set())\n setProgress(null)\n setResult(null)\n setError('')\n void scanWorkspace(workspace.path).then(\n response => {\n if (request.current !== generation) return\n setSummary(response.summary)\n setCandidates(response.candidates)\n setSelectedIds(new Set(response.candidates.map(candidate => candidate.id)))\n setPhase('summary')\n },\n reason => {\n if (request.current !== generation) return\n setError(messageOf(reason))\n setPhase('error')\n },\n )\n }\n\n const begin = useCallback((): void => {\n const selected = availableTarget ?? workspaces.items[0] ?? null\n setTarget(selected)\n setOpen(true)\n if (selected === null) {\n setPhase('no-workspace')\n return\n }\n setPhase('select-workspace')\n }, [availableTarget, workspaces.items])\n\n useEffect(() => registerProvider({\n id: 'claude',\n label: t('importAction'),\n icon: <IconSparkle16 size={16} />,\n order: 20,\n open: begin,\n }), [begin, registerProvider, t])\n\n const scanSelected = (): void => {\n if (target !== null) scan(target)\n }\n\n const importSelected = (): void => {\n const sessionIds = candidates\n .filter(candidate => selectedIds.has(candidate.id))\n .map(candidate => candidate.id)\n if (target === null || summary === null || sessionIds.length === 0 || phase === 'importing') return\n const generation = ++request.current\n setPhase('importing')\n setProgress({\n completed: 0,\n total: sessionIds.length,\n found: sessionIds.length,\n imported: 0,\n existing: 0,\n failed: 0,\n failures: [],\n })\n setError('')\n void (async () => {\n try {\n const completed = await importWorkspace(target.path, sessionIds, update => {\n if (request.current === generation) setProgress(update)\n })\n await refreshWorkspaceState()\n if (request.current !== generation) return\n setResult(completed)\n setPhase('complete')\n } catch (reason) {\n if (request.current !== generation) return\n setError(messageOf(reason))\n setPhase('error')\n }\n })()\n }\n\n const retry = (): void => {\n if (target !== null) scan(target)\n }\n\n return (\n <>\n <Modal\n open={open}\n onClose={close}\n title={t('importTitle')}\n closeLabel={t('close')}\n description={t('importDescription')}\n className={css.dialog}\n footer={modalFooter({\n phase,\n selectedCount: selectedIds.size,\n result,\n close,\n scanSelected,\n retry,\n importSelected,\n t,\n })}\n >\n <div className={css.body} aria-live=\"polite\">\n {phase === 'select-workspace' && target !== null && (\n <div className={css.workspaceChoice}>\n <label htmlFor=\"claude-import-workspace\">{t('importWorkspaceLabel')}</label>\n <select\n id=\"claude-import-workspace\"\n value={target.workspaceId}\n aria-describedby=\"claude-import-workspace-help\"\n onChange={event => {\n const selected = workspaces.items.find(workspace => workspace.workspaceId === event.currentTarget.value)\n if (selected !== undefined) setTarget(selected)\n }}\n >\n {workspaces.items.map(workspace => (\n <option key={workspace.workspaceId} value={workspace.workspaceId}>{workspace.title}</option>\n ))}\n </select>\n <span id=\"claude-import-workspace-help\" className={css.message}>{t('importChooseWorkspace')}</span>\n <span className={css.workspacePath} title={target.path}>{target.path}</span>\n </div>\n )}\n {target !== null && phase !== 'select-workspace' && (\n <div className={css.workspace}>\n <strong>{target.title}</strong>\n <span title={target.path}>{target.path}</span>\n </div>\n )}\n {phase === 'no-workspace' && <p className={css.message}>{t('importNoWorkspace')}</p>}\n {phase === 'scanning' && <p className={css.message}>{t('importScanning')}</p>}\n {phase === 'summary' && summary !== null && (\n <SummaryView\n summary={summary}\n candidates={candidates}\n selectedIds={selectedIds}\n onSelectionChange={setSelectedIds}\n t={t}\n />\n )}\n {phase === 'importing' && progress !== null && <ProgressView progress={progress} t={t} />}\n {phase === 'complete' && result !== null && <ResultView result={result} t={t} />}\n {phase === 'error' && <p className={css.error} role=\"alert\">{error || t('importFailed')}</p>}\n </div>\n </Modal>\n </>\n )\n}\n\nfunction SummaryView({\n summary,\n candidates,\n selectedIds,\n onSelectionChange,\n t,\n}: {\n summary: Summary\n candidates: readonly Candidate[]\n selectedIds: ReadonlySet<string>\n onSelectionChange: (selected: ReadonlySet<string>) => void\n t: Props['t']\n}): ReactNode {\n const select = (id: string, checked: boolean): void => {\n const next = new Set(selectedIds)\n if (checked) next.add(id)\n else next.delete(id)\n onSelectionChange(next)\n }\n return (\n <div className={css.summary}>\n <dl className={css.metrics}>\n <Metric label={t('importFound')} value={summary.found} />\n <Metric label={t('importExisting')} value={summary.existing} />\n <Metric label={t('importRecoverable')} value={summary.recoverable} />\n <Metric label={t('importReady')} value={summary.ready} accent />\n </dl>\n {candidates.length === 0 ? (\n <p className={css.message}>{t('importEmpty')}</p>\n ) : (\n <>\n <div className={css.selectionToolbar}>\n <span>{t('importSelected')}: {selectedIds.size} / {candidates.length}</span>\n <div>\n <button type=\"button\" onClick={() => onSelectionChange(new Set(candidates.map(candidate => candidate.id)))}>\n {t('importSelectAll')}\n </button>\n <button type=\"button\" onClick={() => onSelectionChange(new Set())}>\n {t('importClearSelection')}\n </button>\n </div>\n </div>\n <ul className={css.candidates} aria-label={t('importCandidates')}>\n {candidates.map(candidate => (\n <li key={candidate.id}>\n <label>\n <input\n type=\"checkbox\"\n checked={selectedIds.has(candidate.id)}\n onChange={event => select(candidate.id, event.currentTarget.checked)}\n />\n <span className={css.candidateBody}>\n <span className={css.candidateHeading}>\n <strong>{candidate.title}</strong>\n <span>{candidate.status === 'recoverable' ? t('importStatusRecoverable') : t('importStatusReady')}</span>\n </span>\n <code>{candidate.id}</code>\n <span title={candidate.cwd}>{candidate.cwd}</span>\n <time dateTime={dateTimeValue(candidate.updatedAt)}>{formatUpdatedAt(candidate.updatedAt)}</time>\n </span>\n </label>\n </li>\n ))}\n </ul>\n </>\n )}\n </div>\n )\n}\n\nfunction ProgressView({ progress, t }: { progress: Progress; t: Props['t'] }): ReactNode {\n const maximum = Math.max(1, progress.total)\n return (\n <div className={css.progress}>\n <div className={css.progressCopy}>\n <strong>{t('importImporting')}</strong>\n <span>{progress.completed} / {progress.total}</span>\n </div>\n <progress value={progress.completed} max={maximum} aria-label={t('importImporting')} />\n </div>\n )\n}\n\nfunction ResultView({ result, t }: { result: ImportResult; t: Props['t'] }): ReactNode {\n return (\n <div>\n <p className={result.failed > 0 ? css.partial : css.success}>\n {result.failed > 0 ? t('importPartial') : t('importComplete')}\n </p>\n <dl className={css.metrics}>\n <Metric label={t('importImported')} value={result.imported} accent />\n <Metric label={t('importExisting')} value={result.existing} />\n <Metric label={t('importFailures')} value={result.failed} danger={result.failed > 0} />\n </dl>\n {result.failures.length > 0 && (\n <ul className={css.failures} aria-label={t('importFailures')}>\n {result.failures.map(failure => (\n <li key={failure.session}>\n <code>{failure.session}</code>\n <span>{failure.message}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nfunction Metric({\n label, value, accent = false, danger = false,\n}: { label: string; value: number; accent?: boolean; danger?: boolean }): ReactNode {\n return (\n <div className={css.metric}>\n <dt>{label}</dt>\n <dd className={danger ? css.dangerValue : accent ? css.accentValue : undefined}>{value}</dd>\n </div>\n )\n}\n\nfunction modalFooter({\n phase, selectedCount, result, close, scanSelected, retry, importSelected, t,\n}: {\n phase: Phase\n selectedCount: number\n result: ImportResult | null\n close: () => void\n scanSelected: () => void\n retry: () => void\n importSelected: () => void\n t: Props['t']\n}): ReactNode {\n const policy = claudeSessionImportUiPolicy(phase, selectedCount, result?.failed, phase !== 'no-workspace')\n const actions: Record<ClaudeSessionImportUiAction, (() => void) | undefined> = {\n cancel: close,\n close,\n 'import-selected': importSelected,\n importing: undefined,\n retry,\n scan: scanSelected,\n }\n const labels: Record<ClaudeSessionImportUiAction, string> = {\n cancel: t('cancel'),\n close: t('close'),\n 'import-selected': t('importSelectedAction'),\n importing: t('importImporting'),\n retry: t('retry'),\n scan: t('importScanAction'),\n }\n return (\n <>\n {policy.secondary !== undefined && (\n <Button variant=\"outline\" onClick={actions[policy.secondary]}>\n {labels[policy.secondary]}\n </Button>\n )}\n <Button\n variant={policy.primary === 'close' ? 'outline' : undefined}\n disabled={policy.primaryDisabled}\n onClick={actions[policy.primary]}\n >\n {labels[policy.primary]}\n </Button>\n </>\n )\n}\n\nfunction dateTimeValue(value: Candidate['updatedAt']): string | undefined {\n const date = claudeSessionImportUpdatedAtDate(value)\n return date?.toISOString()\n}\n\nfunction formatUpdatedAt(value: Candidate['updatedAt']): string {\n const date = claudeSessionImportUpdatedAtDate(value)\n return date === null ? '-' : new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date)\n}\n\nfunction messageOf(reason: unknown): string {\n return reason instanceof Error ? reason.message : String(reason)\n}\n","import { memo, useState } from 'react'\nimport {\n DisclosureRow,\n IconCodeOutline16,\n StateDot,\n type StateDotState,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ClaudeActivityData } from './claude-activity.ts'\nimport css from './ClaudeActivityView.module.css'\n\ntype ClaudeActivityViewProps = PropsRuntime<'conversation.chat.node', 'relay-claude-activity'>\n\nfunction dotState(status: ClaudeActivityData['status']): StateDotState {\n if (status === 'running') return 'ongoing'\n if (status === 'error') return 'error'\n return 'done'\n}\n\nexport const ClaudeActivityView = memo(function ClaudeActivityView({ node }: ClaudeActivityViewProps) {\n const activity = node.data as ClaudeActivityData\n const [open, setOpen] = useState(false)\n const expandable = activity.input !== undefined || activity.output !== undefined || activity.provenance !== undefined\n return (\n <div className={css.activity} data-claude-activity={activity.type}>\n <DisclosureRow\n icon={<IconCodeOutline16 />}\n title={activity.title}\n open={open}\n expandable={expandable}\n onToggle={() => { setOpen(value => !value) }}\n expandOnRowClick\n collapsedContent={(\n <span className={css.summary}>\n <span>{activity.summary}</span>\n <StateDot state={dotState(activity.status)} size={8} />\n </span>\n )}\n >\n <div className={css.detail}>\n {activity.provenance !== undefined ? (\n <div\n className={css.provenance}\n title={`Claude Code · Session ${activity.provenance.claudeSessionId} · Turn ${activity.provenance.turnId}`}\n >\n Claude Code · Session {shortId(activity.provenance.claudeSessionId)} · Turn {shortId(activity.provenance.turnId)}\n </div>\n ) : null}\n {activity.input !== undefined ? <pre>{activity.input}</pre> : null}\n {activity.output !== undefined ? <pre>{activity.output}</pre> : null}\n </div>\n </DisclosureRow>\n </div>\n )\n})\n\nfunction shortId(value: string): string {\n return value.length > 15 ? `${value.slice(0, 8)}...${value.slice(-4)}` : value\n}\n","import type { ConversationNodeDefinition } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type { ChatConversationViewNode } from '@deepseek-ai/dsh-client-ui-chat/client'\nimport type { SessionEventMap } from '@deepseek-ai/dsh-session/types'\n\ntype SessionEventContractAnchor = SessionEventMap\n\nexport type ClaudeActivityStatus = 'running' | 'completed' | 'error'\n\nexport interface ClaudeActivityData {\n readonly type: string\n readonly status: ClaudeActivityStatus\n readonly title: string\n readonly summary?: string\n readonly input?: string\n readonly output?: string\n readonly provenance?: {\n readonly claudeSessionId: string\n readonly turnId: string\n }\n}\n\nexport interface ClaudeActivityEventData {\n readonly version: 1\n readonly claudeSessionId: string\n readonly turnId: string\n readonly itemId: string\n readonly phase: 'started' | 'completed'\n readonly activity: ClaudeActivityData\n}\n\ndeclare module '@deepseek-ai/dsh-session/types' {\n interface SessionEventMap {\n 'relay-claude/activity': ClaudeActivityEventData\n }\n}\n\ndeclare module '@deepseek-ai/dsh-client-ui-chat/client' {\n interface ChatNodeDataMap {\n 'relay-claude-activity': ClaudeActivityData\n }\n}\n\nexport const claudeActivityDefinition: ConversationNodeDefinition<ClaudeActivityData> = {\n kind: 'relay-claude-activity',\n target: 'chat',\n match: event => event.type === 'relay-claude/activity'\n ? { id: event.data.itemId, role: event.data.phase === 'started' ? 'start' : 'update' }\n : null,\n start: (_context, match) => {\n if (match.event.type !== 'relay-claude/activity') {\n throw new Error('Claude activity start requires relay-claude/activity')\n }\n return {\n ...match.event.data.activity,\n provenance: {\n claudeSessionId: match.event.data.claudeSessionId,\n turnId: match.event.data.turnId,\n },\n }\n },\n update: (context, match) => match.event.type === 'relay-claude/activity'\n ? {\n ...match.event.data.activity,\n provenance: {\n claudeSessionId: match.event.data.claudeSessionId,\n turnId: match.event.data.turnId,\n },\n }\n : context.state,\n buildViewNode: (context): ChatConversationViewNode | null => {\n if (context.start === undefined || context.state === undefined) return null\n return {\n key: context.key,\n kind: 'relay-claude-activity',\n id: context.id,\n target: 'chat',\n anchorSeq: context.start.event.seq,\n location: context.start.location,\n visibility: 'visible',\n data: context.state,\n }\n },\n}\n","export const en = {\n importAction: 'Import from Claude',\n importTitle: 'Import Claude Sessions',\n importDescription: 'Select existing Claude terminal Sessions from this Workspace to continue in DSH.',\n importWorkspaceLabel: 'Target Workspace',\n importChooseWorkspace: 'Choose the Workspace whose Sessions you want to scan and import.',\n importScanAction: 'Scan Sessions',\n importNoWorkspace: 'Open or select a Workspace before importing Sessions.',\n importScanning: 'Scanning native Claude Sessions...',\n importFound: 'Found',\n importExisting: 'Already linked',\n importRecoverable: 'Recoverable',\n importReady: 'Available',\n importEmpty: 'No unlinked Claude Sessions are available in this Workspace.',\n importSelected: 'Selected',\n importSelectAll: 'Select all',\n importClearSelection: 'Clear',\n importCandidates: 'Claude Session candidates',\n importStatusReady: 'Ready',\n importStatusRecoverable: 'Retry import',\n importSelectedAction: 'Import selected',\n importImporting: 'Importing Sessions...',\n importComplete: 'Import completed.',\n importPartial: 'Some Sessions could not be imported.',\n importImported: 'Imported',\n importFailures: 'Failed',\n importFailed: 'Claude Session import failed.',\n cancel: 'Cancel',\n close: 'Close',\n retry: 'Retry',\n} as const\n\nexport const zh: Record<keyof typeof en, string> = {\n importAction: '从 Claude 导入',\n importTitle: '导入 Claude 会话',\n importDescription: '选择当前工作区中已有的 Claude 终端会话,并在 DSH 中继续。',\n importWorkspaceLabel: '目标 Workspace',\n importChooseWorkspace: '选择要扫描和导入会话的 Workspace。',\n importScanAction: '扫描会话',\n importNoWorkspace: '请先打开或选择一个工作区。',\n importScanning: '正在扫描原生 Claude 会话...',\n importFound: '发现',\n importExisting: '已绑定',\n importRecoverable: '可恢复',\n importReady: '可导入',\n importEmpty: '当前工作区没有未绑定的 Claude 会话。',\n importSelected: '已选择',\n importSelectAll: '全选',\n importClearSelection: '清空',\n importCandidates: 'Claude 会话候选列表',\n importStatusReady: '可导入',\n importStatusRecoverable: '重试导入',\n importSelectedAction: '导入所选会话',\n importImporting: '正在导入会话...',\n importComplete: '导入完成。',\n importPartial: '部分会话未能导入。',\n importImported: '已导入',\n importFailures: '失败',\n importFailed: 'Claude 会话导入失败。',\n cancel: '取消',\n close: '关闭',\n retry: '重试',\n}\n\nexport type ClaudeLocaleKey = keyof typeof en\n","import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\n\nexport function conversationEvents(ctx: Context): Context['uiConversation']['events'] {\n const events = ctx.get('uiConversation')?.events ?? ctx.get('conversationEvents')\n if (!events) throw new Error('DSH conversation events service is unavailable')\n return events\n}\n\n/** Bind setup and disposal to the service family actually present in this DSH. */\nexport function withConversationRuntime(ctx: Context, setup: (ctx: Context) => (() => void)): () => void {\n const current = ctx.inject(['uiConversation', 'modelDirectories'], inner => setup(inner))\n const legacy = ctx.inject(['conversationEvents'], inner => {\n if (inner.get('uiConversation')) return\n return setup(inner)\n })\n return () => { void current.dispose(); void legacy.dispose() }\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type { ChatNodeOwnerProps } from '@deepseek-ai/dsh-client-ui-chat/client'\nimport { installModelSelection, type ModelSelectionContext } from '../../model-selection.mjs'\nimport { ClaudeSessionImportProvider, type ClaudeSessionImportInjected } from './ClaudeSessionImportAction.tsx'\nimport { ClaudeActivityView } from './ClaudeActivityView.tsx'\nimport { claudeActivityDefinition } from './claude-activity.ts'\nimport { en, zh, type ClaudeLocaleKey } from './locales.ts'\nimport {\n importClaudeWorkspace,\n refreshImportedWorkspace,\n scanClaudeWorkspace,\n} from './claude-session-import-client.mjs'\nimport type { SessionImportProviderSlotDefinition } from 'relay-dsh-plugin-session-import/contracts'\nimport { conversationEvents, withConversationRuntime } from './compatible-runtime.ts'\n\ntype DshSlotContractAnchor = ChatNodeOwnerProps\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface SlotMap {\n 'relay.session-import.provider': SessionImportProviderSlotDefinition\n }\n interface LocaleNamespaceMap {\n 'relay.claude': ClaudeLocaleKey\n }\n}\n\nexport const inject = ['slots', 'theme', 'locale', 'remote', 'sessions', 'workspaces', 'connection']\n\nexport async function apply(ctx: ClientContext): Promise<() => Promise<void>> {\n ctx.effect(() => ctx.locale.register('relay.claude', { zh, en }), 'relay-claude: dictionaries')\n applySessionImport(ctx)\n const unsubscribe = withConversationRuntime(ctx, inner => {\n conversationEvents(inner).register(claudeActivityDefinition)\n inner.slots.inject('conversation.chat.node', () => inner.slots.register({\n name: 'conversation.chat.node', key: 'relay-claude-activity',\n }, ClaudeActivityView))\n return installModelSelection(inner as ModelSelectionContext, 'relay-claude', 'relay-claude', 'relay-codex')\n })\n return async () => { unsubscribe() }\n}\n\nfunction applySessionImport(ctx: ClientContext): void {\n const injected = (): ClaudeSessionImportInjected => ({\n hooks: {\n claudeSessionImportWorkspaces: ctx.workspaces.list,\n claudeSessionImportSessions: ctx.sessions.list,\n },\n scanWorkspace: cwd => scanClaudeWorkspace(cwd),\n importWorkspace: (cwd, sessionIds, onProgress) => importClaudeWorkspace(cwd, { sessionIds, onProgress }),\n refreshWorkspaceState: () => refreshImportedWorkspace(\n ctx.sessions as typeof ctx.sessions & { refresh(): Promise<void> },\n ctx.workspaces as typeof ctx.workspaces & { refresh(): Promise<void> },\n ),\n })\n ctx.slots.inject('relay.session-import.provider', () => ctx.slots.register({\n name: 'relay.session-import.provider',\n id: 'claude',\n order: 20,\n inject: injected,\n locale: 'relay.claude',\n }, ClaudeSessionImportProvider))\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["IconSparkle16","Modal","css","Button","css","DisclosureRow","IconCodeOutline16","StateDot"],"sources":["../dsh-client-compat.mjs","../model-selection.mjs","../claude-import-contract.mjs","../src/client/claude-session-import-client.mjs","../src/client/claude-session-import-ui-policy.mjs","../src/client/ClaudeSessionImportAction.tsx","../src/client/ClaudeActivityView.tsx","../src/client/claude-activity.ts","../src/client/locales.ts","../src/client/compatible-runtime.ts","../src/client/index.ts"],"sourcesContent":["// Public interface adapters shared by both supported DSH generations.\nexport function sessionPreset(session) {\n if (session?.projectionValues && Object.hasOwn(session.projectionValues, 'agentPreset')) {\n return session.projectionValues.agentPreset;\n }\n return session?.agentPreset;\n}\n\nconst service = (ctx, name) => typeof ctx.get === 'function' ? ctx.get(name) : ctx[name];\nexport function modelDirectory(ctx, sessionId) {\n const directories = service(ctx, 'modelDirectories');\n if (directories) return directories.directoryFor(sessionId);\n const sessions = service(ctx, 'connection')?.api?.sessions;\n if (!sessions) throw new Error('DSH model selection interface is unavailable');\n return {\n async load() {\n const response = await sessions.models({ sessionId });\n if (!response.result.ok) throw new Error('DSH model discovery failed');\n return response.result.value;\n },\n async select(selection) {\n const response = await sessions.selectModel({ sessionId, ...selection });\n if (!response.result.ok) throw new Error('DSH model selection failed');\n },\n };\n}\n","import { sessionPreset, modelDirectory } from \"./dsh-client-compat.mjs\";\nexport function installModelSelection(ctx, preset, provider, otherProvider) {\n let stopped = false;\n const selecting = new Set();\n const pending = new Set();\n\n const sync = () => {\n if (stopped) return;\n const list = ctx.sessions.list.getSnapshot();\n const id = list.current;\n if (id === undefined || list.byId[id]?.blank !== true) return;\n if (selecting.has(id)) {\n pending.add(id);\n return;\n }\n\n const selectedPreset = sessionPreset(list.byId[id]);\n if (selectedPreset !== preset && selectedPreset === otherProvider) return;\n selecting.add(id);\n void (async () => {\n const directory = modelDirectory(ctx, id);\n const models = await directory.load();\n if (stopped || !models.current) return;\n const latest = ctx.sessions.list.getSnapshot().byId[id];\n if (ctx.sessions.list.getSnapshot().current !== id || latest?.blank !== true || sessionPreset(latest) !== selectedPreset) {\n pending.add(id);\n return;\n }\n // Model projection changes also update the Session list in alpha.2.\n // Do not reset a chosen model or select again on our own projection update.\n if (selectedPreset === preset && models.current.provider === provider) return;\n const target = selectedPreset === preset\n ? models.groups.find((group) => group.id === provider)\n : models.current.provider === provider\n ? models.groups.find((group) => group.id !== provider && group.id !== otherProvider)\n : undefined;\n const model = target?.models[0];\n if (!target || !model) return;\n await directory.select({\n provider: target.id,\n model: model.id,\n ...(model.reasoning?.defaultEffort\n ? { reasoningEffort: model.reasoning.defaultEffort }\n : {}),\n });\n })().catch(() => {}).finally(() => {\n selecting.delete(id);\n if (pending.delete(id)) sync();\n });\n };\n\n const off = ctx.sessions.list.subscribe(sync);\n sync();\n return () => { stopped = true; off(); };\n}\n","export const CLAUDE_IMPORT_PATH = \"/api/relay/claude/import\";\n","import { CLAUDE_IMPORT_PATH } from \"../../claude-import-contract.mjs\";\n\nexport function resolveImportWorkspace(workspaces, sessions) {\n const current = sessions?.current;\n if (current !== undefined) {\n const owner = workspaces?.items?.find(workspace => workspace.sessionIds?.includes(current));\n if (owner) return owner;\n }\n const recent = workspaces?.recentWorkspaceId;\n return workspaces?.items?.find(workspace => workspace.workspaceId === recent) ?? null;\n}\n\nexport async function scanClaudeWorkspace(cwd, fetchImpl = fetch) {\n const response = await fetchImpl(CLAUDE_IMPORT_PATH, requestInit(\"scan\", cwd));\n const body = await readJsonResponse(response);\n if (!response.ok) throw new Error(body?.message ?? `Claude import scan failed with HTTP ${response.status}`);\n return body;\n}\n\nexport async function importClaudeWorkspace(cwd, { sessionIds, onProgress } = {}, fetchImpl = fetch) {\n const response = await fetchImpl(CLAUDE_IMPORT_PATH, requestInit(\"import\", cwd, sessionIds));\n if (!response.ok) {\n const body = await readJsonResponse(response);\n throw new Error(body?.message ?? `Claude import failed with HTTP ${response.status}`);\n }\n let completed = null;\n for await (const frame of ndjsonFrames(response.body)) {\n if (frame?.type === \"progress\") onProgress?.(frame);\n if (frame?.type === \"complete\") completed = frame.result;\n if (frame?.type === \"error\") throw new Error(frame.message ?? \"Claude import failed\");\n }\n if (completed === null) throw new Error(\"Claude import response ended before completion\");\n return completed;\n}\n\nexport async function refreshImportedWorkspace(sessions, workspaces) {\n await sessions.refresh();\n await workspaces.refresh();\n}\n\nexport async function* ndjsonFrames(body) {\n if (!body || typeof body.getReader !== \"function\") throw new Error(\"Claude import response has no readable body\");\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n while (true) {\n const { done, value } = await reader.read();\n buffer += decoder.decode(value, { stream: !done });\n let newline = buffer.indexOf(\"\\n\");\n while (newline !== -1) {\n const line = buffer.slice(0, newline).trim();\n buffer = buffer.slice(newline + 1);\n if (line) yield parseFrame(line);\n newline = buffer.indexOf(\"\\n\");\n }\n if (done) break;\n }\n const finalLine = buffer.trim();\n if (finalLine) yield parseFrame(finalLine);\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction requestInit(action, cwd, sessionIds) {\n return {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n action,\n cwd,\n ...(sessionIds === undefined ? {} : { sessionIds }),\n }),\n };\n}\n\nasync function readJsonResponse(response) {\n try {\n return await response.json();\n } catch {\n return null;\n }\n}\n\nfunction parseFrame(line) {\n try {\n return JSON.parse(line);\n } catch {\n throw new Error(\"Claude import returned malformed progress data\");\n }\n}\n","export function claudeSessionImportUiPolicy(phase, selected = 0, failed = 0, hasWorkspace = true) {\n if (phase === \"importing\") {\n return Object.freeze({ canClose: false, primary: \"importing\", primaryDisabled: true });\n }\n if (phase === \"summary\") {\n return Object.freeze({\n canClose: true,\n secondary: \"cancel\",\n primary: \"import-selected\",\n primaryDisabled: selected === 0,\n });\n }\n if (phase === \"select-workspace\") {\n return Object.freeze({\n canClose: true,\n secondary: \"cancel\",\n primary: \"scan\",\n primaryDisabled: !hasWorkspace,\n });\n }\n if (phase === \"error\") {\n return Object.freeze({ canClose: true, secondary: \"cancel\", primary: \"retry\", primaryDisabled: false });\n }\n if (phase === \"complete\" && failed > 0) {\n return Object.freeze({ canClose: true, secondary: \"close\", primary: \"retry\", primaryDisabled: false });\n }\n return Object.freeze({ canClose: true, primary: \"close\", primaryDisabled: false });\n}\n\nexport function claudeSessionImportUpdatedAtDate(value) {\n if (value === null || value === undefined) return null;\n const milliseconds = typeof value === \"number\" && Number.isFinite(value) && Math.abs(value) < 1e12\n ? value * 1000\n : value;\n const date = new Date(milliseconds);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport {\n Button,\n IconSparkle16,\n Modal,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type {\n InjectFace,\n PropsLocale,\n} from '@deepseek-ai/dsh-client-ui-slots'\nimport type { SessionImportProviderOwnerProps } from 'relay-dsh-plugin-session-import/contracts'\nimport { resolveImportWorkspace } from './claude-session-import-client.mjs'\nimport {\n claudeSessionImportUpdatedAtDate,\n claudeSessionImportUiPolicy,\n type ClaudeSessionImportUiAction,\n} from './claude-session-import-ui-policy.mjs'\nimport css from './ClaudeSessionImportAction.module.css'\n\ninterface WorkspaceView {\n workspaceId: string\n title: string\n path: string\n sessionIds: readonly string[]\n}\n\ninterface WorkspaceState {\n items: readonly WorkspaceView[]\n recentWorkspaceId?: string\n}\n\ninterface SessionState {\n current?: string\n}\n\ninterface Summary {\n found: number\n existing: number\n recoverable: number\n ready: number\n}\n\ninterface Candidate {\n id: string\n title: string\n cwd: string\n updatedAt: number | string | null\n status: 'ready' | 'recoverable'\n}\n\ninterface ImportResult {\n found: number\n imported: number\n existing: number\n failed: number\n failures: readonly { session: string; message: string }[]\n}\n\ninterface Progress extends ImportResult {\n completed: number\n total: number\n}\n\ninterface Observable<T> {\n getSnapshot: () => T\n subscribe: (listener: () => void) => () => void\n}\n\nexport interface ClaudeSessionImportInjected {\n hooks: {\n claudeSessionImportWorkspaces: Observable<WorkspaceState>\n claudeSessionImportSessions: Observable<SessionState>\n }\n scanWorkspace: (cwd: string) => Promise<{\n workspace: { title: string; path: string }\n summary: Summary\n candidates: readonly Candidate[]\n }>\n importWorkspace: (\n cwd: string,\n sessionIds: readonly string[],\n onProgress: (progress: Progress) => void,\n ) => Promise<ImportResult>\n refreshWorkspaceState: () => Promise<void>\n}\n\ntype Props = SessionImportProviderOwnerProps\n & InjectFace<ClaudeSessionImportInjected>\n & PropsLocale<'relay.claude'>\n\ntype Phase = 'idle' | 'no-workspace' | 'select-workspace' | 'scanning' | 'summary' | 'importing' | 'complete' | 'error'\n\nexport function ClaudeSessionImportProvider({\n registerProvider,\n useClaudeSessionImportWorkspaces,\n useClaudeSessionImportSessions,\n scanWorkspace,\n importWorkspace,\n refreshWorkspaceState,\n t,\n}: Props): ReactNode {\n const workspaces = useClaudeSessionImportWorkspaces((value: WorkspaceState) => value)\n const sessions = useClaudeSessionImportSessions((value: SessionState) => value)\n const availableTarget = resolveImportWorkspace(workspaces, sessions) as WorkspaceView | null\n const [open, setOpen] = useState(false)\n const [target, setTarget] = useState<WorkspaceView | null>(null)\n const [phase, setPhase] = useState<Phase>('idle')\n const [summary, setSummary] = useState<Summary | null>(null)\n const [candidates, setCandidates] = useState<readonly Candidate[]>([])\n const [selectedIds, setSelectedIds] = useState<ReadonlySet<string>>(new Set())\n const [progress, setProgress] = useState<Progress | null>(null)\n const [result, setResult] = useState<ImportResult | null>(null)\n const [error, setError] = useState('')\n const request = useRef(0)\n\n const close = (): void => {\n if (!claudeSessionImportUiPolicy(phase, selectedIds.size, result?.failed).canClose) return\n request.current += 1\n setOpen(false)\n }\n\n const scan = (workspace: WorkspaceView): void => {\n const generation = ++request.current\n setPhase('scanning')\n setSummary(null)\n setCandidates([])\n setSelectedIds(new Set())\n setProgress(null)\n setResult(null)\n setError('')\n void scanWorkspace(workspace.path).then(\n response => {\n if (request.current !== generation) return\n setSummary(response.summary)\n setCandidates(response.candidates)\n setSelectedIds(new Set(response.candidates.map(candidate => candidate.id)))\n setPhase('summary')\n },\n reason => {\n if (request.current !== generation) return\n setError(messageOf(reason))\n setPhase('error')\n },\n )\n }\n\n const begin = useCallback((): void => {\n const selected = availableTarget ?? workspaces.items[0] ?? null\n setTarget(selected)\n setOpen(true)\n if (selected === null) {\n setPhase('no-workspace')\n return\n }\n setPhase('select-workspace')\n }, [availableTarget, workspaces.items])\n\n useEffect(() => registerProvider({\n id: 'claude',\n label: t('importAction'),\n icon: <IconSparkle16 size={16} />,\n order: 20,\n open: begin,\n }), [begin, registerProvider, t])\n\n const scanSelected = (): void => {\n if (target !== null) scan(target)\n }\n\n const importSelected = (): void => {\n const sessionIds = candidates\n .filter(candidate => selectedIds.has(candidate.id))\n .map(candidate => candidate.id)\n if (target === null || summary === null || sessionIds.length === 0 || phase === 'importing') return\n const generation = ++request.current\n setPhase('importing')\n setProgress({\n completed: 0,\n total: sessionIds.length,\n found: sessionIds.length,\n imported: 0,\n existing: 0,\n failed: 0,\n failures: [],\n })\n setError('')\n void (async () => {\n try {\n const completed = await importWorkspace(target.path, sessionIds, update => {\n if (request.current === generation) setProgress(update)\n })\n await refreshWorkspaceState()\n if (request.current !== generation) return\n setResult(completed)\n setPhase('complete')\n } catch (reason) {\n if (request.current !== generation) return\n setError(messageOf(reason))\n setPhase('error')\n }\n })()\n }\n\n const retry = (): void => {\n if (target !== null) scan(target)\n }\n\n return (\n <>\n <Modal\n open={open}\n onClose={close}\n title={t('importTitle')}\n closeLabel={t('close')}\n description={t('importDescription')}\n className={css.dialog}\n footer={modalFooter({\n phase,\n selectedCount: selectedIds.size,\n result,\n close,\n scanSelected,\n retry,\n importSelected,\n t,\n })}\n >\n <div className={css.body} aria-live=\"polite\">\n {phase === 'select-workspace' && target !== null && (\n <div className={css.workspaceChoice}>\n <label htmlFor=\"claude-import-workspace\">{t('importWorkspaceLabel')}</label>\n <select\n id=\"claude-import-workspace\"\n value={target.workspaceId}\n aria-describedby=\"claude-import-workspace-help\"\n onChange={event => {\n const selected = workspaces.items.find((workspace: WorkspaceView) => workspace.workspaceId === event.currentTarget.value)\n if (selected !== undefined) setTarget(selected)\n }}\n >\n {workspaces.items.map((workspace: WorkspaceView) => (\n <option key={workspace.workspaceId} value={workspace.workspaceId}>{workspace.title}</option>\n ))}\n </select>\n <span id=\"claude-import-workspace-help\" className={css.message}>{t('importChooseWorkspace')}</span>\n <span className={css.workspacePath} title={target.path}>{target.path}</span>\n </div>\n )}\n {target !== null && phase !== 'select-workspace' && (\n <div className={css.workspace}>\n <strong>{target.title}</strong>\n <span title={target.path}>{target.path}</span>\n </div>\n )}\n {phase === 'no-workspace' && <p className={css.message}>{t('importNoWorkspace')}</p>}\n {phase === 'scanning' && <p className={css.message}>{t('importScanning')}</p>}\n {phase === 'summary' && summary !== null && (\n <SummaryView\n summary={summary}\n candidates={candidates}\n selectedIds={selectedIds}\n onSelectionChange={setSelectedIds}\n t={t}\n />\n )}\n {phase === 'importing' && progress !== null && <ProgressView progress={progress} t={t} />}\n {phase === 'complete' && result !== null && <ResultView result={result} t={t} />}\n {phase === 'error' && <p className={css.error} role=\"alert\">{error || t('importFailed')}</p>}\n </div>\n </Modal>\n </>\n )\n}\n\nfunction SummaryView({\n summary,\n candidates,\n selectedIds,\n onSelectionChange,\n t,\n}: {\n summary: Summary\n candidates: readonly Candidate[]\n selectedIds: ReadonlySet<string>\n onSelectionChange: (selected: ReadonlySet<string>) => void\n t: Props['t']\n}): ReactNode {\n const select = (id: string, checked: boolean): void => {\n const next = new Set(selectedIds)\n if (checked) next.add(id)\n else next.delete(id)\n onSelectionChange(next)\n }\n return (\n <div className={css.summary}>\n <dl className={css.metrics}>\n <Metric label={t('importFound')} value={summary.found} />\n <Metric label={t('importExisting')} value={summary.existing} />\n <Metric label={t('importRecoverable')} value={summary.recoverable} />\n <Metric label={t('importReady')} value={summary.ready} accent />\n </dl>\n {candidates.length === 0 ? (\n <p className={css.message}>{t('importEmpty')}</p>\n ) : (\n <>\n <div className={css.selectionToolbar}>\n <span>{t('importSelected')}: {selectedIds.size} / {candidates.length}</span>\n <div>\n <button type=\"button\" onClick={() => onSelectionChange(new Set(candidates.map(candidate => candidate.id)))}>\n {t('importSelectAll')}\n </button>\n <button type=\"button\" onClick={() => onSelectionChange(new Set())}>\n {t('importClearSelection')}\n </button>\n </div>\n </div>\n <ul className={css.candidates} aria-label={t('importCandidates')}>\n {candidates.map(candidate => (\n <li key={candidate.id}>\n <label>\n <input\n type=\"checkbox\"\n checked={selectedIds.has(candidate.id)}\n onChange={event => select(candidate.id, event.currentTarget.checked)}\n />\n <span className={css.candidateBody}>\n <span className={css.candidateHeading}>\n <strong>{candidate.title}</strong>\n <span>{candidate.status === 'recoverable' ? t('importStatusRecoverable') : t('importStatusReady')}</span>\n </span>\n <code>{candidate.id}</code>\n <span title={candidate.cwd}>{candidate.cwd}</span>\n <time dateTime={dateTimeValue(candidate.updatedAt)}>{formatUpdatedAt(candidate.updatedAt)}</time>\n </span>\n </label>\n </li>\n ))}\n </ul>\n </>\n )}\n </div>\n )\n}\n\nfunction ProgressView({ progress, t }: { progress: Progress; t: Props['t'] }): ReactNode {\n const maximum = Math.max(1, progress.total)\n return (\n <div className={css.progress}>\n <div className={css.progressCopy}>\n <strong>{t('importImporting')}</strong>\n <span>{progress.completed} / {progress.total}</span>\n </div>\n <progress value={progress.completed} max={maximum} aria-label={t('importImporting')} />\n </div>\n )\n}\n\nfunction ResultView({ result, t }: { result: ImportResult; t: Props['t'] }): ReactNode {\n return (\n <div>\n <p className={result.failed > 0 ? css.partial : css.success}>\n {result.failed > 0 ? t('importPartial') : t('importComplete')}\n </p>\n <dl className={css.metrics}>\n <Metric label={t('importImported')} value={result.imported} accent />\n <Metric label={t('importExisting')} value={result.existing} />\n <Metric label={t('importFailures')} value={result.failed} danger={result.failed > 0} />\n </dl>\n {result.failures.length > 0 && (\n <ul className={css.failures} aria-label={t('importFailures')}>\n {result.failures.map(failure => (\n <li key={failure.session}>\n <code>{failure.session}</code>\n <span>{failure.message}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nfunction Metric({\n label, value, accent = false, danger = false,\n}: { label: string; value: number; accent?: boolean; danger?: boolean }): ReactNode {\n return (\n <div className={css.metric}>\n <dt>{label}</dt>\n <dd className={danger ? css.dangerValue : accent ? css.accentValue : undefined}>{value}</dd>\n </div>\n )\n}\n\nfunction modalFooter({\n phase, selectedCount, result, close, scanSelected, retry, importSelected, t,\n}: {\n phase: Phase\n selectedCount: number\n result: ImportResult | null\n close: () => void\n scanSelected: () => void\n retry: () => void\n importSelected: () => void\n t: Props['t']\n}): ReactNode {\n const policy = claudeSessionImportUiPolicy(phase, selectedCount, result?.failed, phase !== 'no-workspace')\n const actions: Record<ClaudeSessionImportUiAction, (() => void) | undefined> = {\n cancel: close,\n close,\n 'import-selected': importSelected,\n importing: undefined,\n retry,\n scan: scanSelected,\n }\n const labels: Record<ClaudeSessionImportUiAction, string> = {\n cancel: t('cancel'),\n close: t('close'),\n 'import-selected': t('importSelectedAction'),\n importing: t('importImporting'),\n retry: t('retry'),\n scan: t('importScanAction'),\n }\n return (\n <>\n {policy.secondary !== undefined && (\n <Button variant=\"outline\" onClick={actions[policy.secondary]}>\n {labels[policy.secondary]}\n </Button>\n )}\n <Button\n variant={policy.primary === 'close' ? 'outline' : undefined}\n disabled={policy.primaryDisabled}\n onClick={actions[policy.primary]}\n >\n {labels[policy.primary]}\n </Button>\n </>\n )\n}\n\nfunction dateTimeValue(value: Candidate['updatedAt']): string | undefined {\n const date = claudeSessionImportUpdatedAtDate(value)\n return date?.toISOString()\n}\n\nfunction formatUpdatedAt(value: Candidate['updatedAt']): string {\n const date = claudeSessionImportUpdatedAtDate(value)\n return date === null ? '-' : new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date)\n}\n\nfunction messageOf(reason: unknown): string {\n return reason instanceof Error ? reason.message : String(reason)\n}\n","import { memo, useState } from 'react'\nimport {\n DisclosureRow,\n IconCodeOutline16,\n StateDot,\n type StateDotState,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ClaudeActivityData } from './claude-activity.ts'\nimport css from './ClaudeActivityView.module.css'\n\ntype ClaudeActivityViewProps = PropsRuntime<'conversation.chat.node', 'relay-claude-activity'>\n\nfunction dotState(status: ClaudeActivityData['status']): StateDotState {\n if (status === 'running') return 'ongoing'\n if (status === 'error') return 'error'\n return 'done'\n}\n\nexport const ClaudeActivityView = memo(function ClaudeActivityView({ node }: ClaudeActivityViewProps) {\n const activity = node.data as ClaudeActivityData\n const [open, setOpen] = useState(false)\n const expandable = activity.input !== undefined || activity.output !== undefined || activity.provenance !== undefined\n return (\n <div className={css.activity} data-claude-activity={activity.type}>\n <DisclosureRow\n icon={<IconCodeOutline16 />}\n title={activity.title}\n open={open}\n expandable={expandable}\n onToggle={() => { setOpen(value => !value) }}\n expandOnRowClick\n collapsedContent={(\n <span className={css.summary}>\n <span>{activity.summary}</span>\n <StateDot state={dotState(activity.status)} size={8} />\n </span>\n )}\n >\n <div className={css.detail}>\n {activity.provenance !== undefined ? (\n <div\n className={css.provenance}\n title={`Claude Code · Session ${activity.provenance.claudeSessionId} · Turn ${activity.provenance.turnId}`}\n >\n Claude Code · Session {shortId(activity.provenance.claudeSessionId)} · Turn {shortId(activity.provenance.turnId)}\n </div>\n ) : null}\n {activity.input !== undefined ? <pre>{activity.input}</pre> : null}\n {activity.output !== undefined ? <pre>{activity.output}</pre> : null}\n </div>\n </DisclosureRow>\n </div>\n )\n})\n\nfunction shortId(value: string): string {\n return value.length > 15 ? `${value.slice(0, 8)}...${value.slice(-4)}` : value\n}\n","import type { ConversationNodeDefinition } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type { ChatConversationViewNode } from '@deepseek-ai/dsh-client-ui-chat/client'\nimport type { SessionEventMap } from '@deepseek-ai/dsh-session/types'\n\ntype SessionEventContractAnchor = SessionEventMap\n\nexport type ClaudeActivityStatus = 'running' | 'completed' | 'error'\n\nexport interface ClaudeActivityData {\n readonly type: string\n readonly status: ClaudeActivityStatus\n readonly title: string\n readonly summary?: string\n readonly input?: string\n readonly output?: string\n readonly provenance?: {\n readonly claudeSessionId: string\n readonly turnId: string\n }\n}\n\nexport interface ClaudeActivityEventData {\n readonly version: 1\n readonly claudeSessionId: string\n readonly turnId: string\n readonly itemId: string\n readonly phase: 'started' | 'completed'\n readonly activity: ClaudeActivityData\n}\n\ndeclare module '@deepseek-ai/dsh-session/types' {\n interface SessionEventMap {\n 'relay-claude/activity': ClaudeActivityEventData\n }\n}\n\ndeclare module '@deepseek-ai/dsh-client-ui-chat/client' {\n interface ChatNodeDataMap {\n 'relay-claude-activity': ClaudeActivityData\n }\n}\n\nexport const claudeActivityDefinition: ConversationNodeDefinition<ClaudeActivityData> = {\n kind: 'relay-claude-activity',\n target: 'chat',\n match: event => event.type === 'relay-claude/activity'\n ? { id: event.data.itemId, role: event.data.phase === 'started' ? 'start' : 'update' }\n : null,\n start: (_context, match) => {\n if (match.event.type !== 'relay-claude/activity') {\n throw new Error('Claude activity start requires relay-claude/activity')\n }\n return {\n ...match.event.data.activity,\n provenance: {\n claudeSessionId: match.event.data.claudeSessionId,\n turnId: match.event.data.turnId,\n },\n }\n },\n update: (context, match) => match.event.type === 'relay-claude/activity'\n ? {\n ...match.event.data.activity,\n provenance: {\n claudeSessionId: match.event.data.claudeSessionId,\n turnId: match.event.data.turnId,\n },\n }\n : context.state,\n buildViewNode: (context): ChatConversationViewNode | null => {\n if (context.start === undefined || context.state === undefined) return null\n return {\n key: context.key,\n kind: 'relay-claude-activity',\n id: context.id,\n target: 'chat',\n anchorSeq: context.start.event.seq,\n location: context.start.location,\n visibility: 'visible',\n data: context.state,\n }\n },\n}\n","export const en = {\n importAction: 'Import from Claude',\n importTitle: 'Import Claude Sessions',\n importDescription: 'Select existing Claude terminal Sessions from this Workspace to continue in DSH.',\n importWorkspaceLabel: 'Target Workspace',\n importChooseWorkspace: 'Choose the Workspace whose Sessions you want to scan and import.',\n importScanAction: 'Scan Sessions',\n importNoWorkspace: 'Open or select a Workspace before importing Sessions.',\n importScanning: 'Scanning native Claude Sessions...',\n importFound: 'Found',\n importExisting: 'Already linked',\n importRecoverable: 'Recoverable',\n importReady: 'Available',\n importEmpty: 'No unlinked Claude Sessions are available in this Workspace.',\n importSelected: 'Selected',\n importSelectAll: 'Select all',\n importClearSelection: 'Clear',\n importCandidates: 'Claude Session candidates',\n importStatusReady: 'Ready',\n importStatusRecoverable: 'Retry import',\n importSelectedAction: 'Import selected',\n importImporting: 'Importing Sessions...',\n importComplete: 'Import completed.',\n importPartial: 'Some Sessions could not be imported.',\n importImported: 'Imported',\n importFailures: 'Failed',\n importFailed: 'Claude Session import failed.',\n cancel: 'Cancel',\n close: 'Close',\n retry: 'Retry',\n} as const\n\nexport const zh: Record<keyof typeof en, string> = {\n importAction: '从 Claude 导入',\n importTitle: '导入 Claude 会话',\n importDescription: '选择当前工作区中已有的 Claude 终端会话,并在 DSH 中继续。',\n importWorkspaceLabel: '目标 Workspace',\n importChooseWorkspace: '选择要扫描和导入会话的 Workspace。',\n importScanAction: '扫描会话',\n importNoWorkspace: '请先打开或选择一个工作区。',\n importScanning: '正在扫描原生 Claude 会话...',\n importFound: '发现',\n importExisting: '已绑定',\n importRecoverable: '可恢复',\n importReady: '可导入',\n importEmpty: '当前工作区没有未绑定的 Claude 会话。',\n importSelected: '已选择',\n importSelectAll: '全选',\n importClearSelection: '清空',\n importCandidates: 'Claude 会话候选列表',\n importStatusReady: '可导入',\n importStatusRecoverable: '重试导入',\n importSelectedAction: '导入所选会话',\n importImporting: '正在导入会话...',\n importComplete: '导入完成。',\n importPartial: '部分会话未能导入。',\n importImported: '已导入',\n importFailures: '失败',\n importFailed: 'Claude 会话导入失败。',\n cancel: '取消',\n close: '关闭',\n retry: '重试',\n}\n\nexport type ClaudeLocaleKey = keyof typeof en\n","import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\n\nexport function conversationEvents(ctx: Context): Context['uiConversation']['events'] {\n const events = ctx.get('uiConversation')?.events ?? ctx.get('conversationEvents')\n if (!events) throw new Error('DSH conversation events service is unavailable')\n return events\n}\n\n/** Bind setup and disposal to the service family actually present in this DSH. */\nexport function withConversationRuntime(ctx: Context, setup: (ctx: Context) => (() => void)): () => void {\n const current = ctx.inject(['uiConversation', 'modelDirectories'], inner => setup(inner))\n const legacy = ctx.inject(['conversationEvents'], inner => {\n if (inner.get('uiConversation')) return\n return setup(inner)\n })\n return () => { void current.dispose(); void legacy.dispose() }\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type { ChatNodeOwnerProps } from '@deepseek-ai/dsh-client-ui-chat/client'\nimport { installModelSelection, type ModelSelectionContext } from '../../model-selection.mjs'\nimport { ClaudeSessionImportProvider, type ClaudeSessionImportInjected } from './ClaudeSessionImportAction.tsx'\nimport { ClaudeActivityView } from './ClaudeActivityView.tsx'\nimport { claudeActivityDefinition } from './claude-activity.ts'\nimport { en, zh, type ClaudeLocaleKey } from './locales.ts'\nimport {\n importClaudeWorkspace,\n refreshImportedWorkspace,\n scanClaudeWorkspace,\n} from './claude-session-import-client.mjs'\nimport type { SessionImportProviderSlotDefinition } from 'relay-dsh-plugin-session-import/contracts'\nimport { conversationEvents, withConversationRuntime } from './compatible-runtime.ts'\n\ntype DshSlotContractAnchor = ChatNodeOwnerProps\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface SlotMap {\n 'relay.session-import.provider': SessionImportProviderSlotDefinition\n }\n interface LocaleNamespaceMap {\n 'relay.claude': ClaudeLocaleKey\n }\n}\n\nexport const inject = ['slots', 'theme', 'locale', 'remote', 'sessions', 'workspaces', 'connection']\n\nexport async function apply(ctx: ClientContext): Promise<() => Promise<void>> {\n ctx.effect(() => ctx.locale.register('relay.claude', { zh, en }), 'relay-claude: dictionaries')\n applySessionImport(ctx)\n const unsubscribe = withConversationRuntime(ctx, inner => {\n conversationEvents(inner).register(claudeActivityDefinition)\n inner.slots.inject('conversation.chat.node', () => inner.slots.register({\n name: 'conversation.chat.node', key: 'relay-claude-activity',\n }, ClaudeActivityView))\n return installModelSelection(inner as ModelSelectionContext, 'relay-claude', 'relay-claude', 'relay-codex')\n })\n return async () => { unsubscribe() }\n}\n\nfunction applySessionImport(ctx: ClientContext): void {\n const injected = (): ClaudeSessionImportInjected => ({\n hooks: {\n claudeSessionImportWorkspaces: ctx.workspaces.list,\n claudeSessionImportSessions: ctx.sessions.list,\n },\n scanWorkspace: cwd => scanClaudeWorkspace(cwd),\n importWorkspace: (cwd, sessionIds, onProgress) => importClaudeWorkspace(cwd, { sessionIds, onProgress }),\n refreshWorkspaceState: () => refreshImportedWorkspace(\n ctx.sessions as typeof ctx.sessions & { refresh(): Promise<void> },\n ctx.workspaces as typeof ctx.workspaces & { refresh(): Promise<void> },\n ),\n })\n ctx.slots.inject('relay.session-import.provider', () => ctx.slots.register({\n name: 'relay.session-import.provider',\n id: 'claude',\n order: 20,\n inject: injected,\n locale: 'relay.claude',\n }, ClaudeSessionImportProvider))\n}\n"],"mappings":"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"}
|
package/lib/host-plugin.js
CHANGED
|
@@ -3418,6 +3418,7 @@ function buildClaudeHistorySeed(projection, updatedAt, config) {
|
|
|
3418
3418
|
if (entry.kind === "message") append("assistant/message", {
|
|
3419
3419
|
turn,
|
|
3420
3420
|
step,
|
|
3421
|
+
stream: [],
|
|
3421
3422
|
message: freezeMessage({
|
|
3422
3423
|
id: MessageId(entry.id),
|
|
3423
3424
|
role: "assistant",
|
|
@@ -3434,6 +3435,7 @@ function buildClaudeHistorySeed(projection, updatedAt, config) {
|
|
|
3434
3435
|
append("assistant/message", {
|
|
3435
3436
|
turn,
|
|
3436
3437
|
step,
|
|
3438
|
+
stream: [],
|
|
3437
3439
|
message: freezeMessage({
|
|
3438
3440
|
id: MessageId(entry.requestId),
|
|
3439
3441
|
role: "assistant",
|