dsh-notch-focus 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +38 -0
- package/cordis.patch.yml +3 -0
- package/cordis.yml +5 -0
- package/lib/client.js +102 -0
- package/lib/client.js.map +1 -0
- package/lib/dsh-notch-focus.js +8 -0
- package/lib/types/client/index.d.ts +12 -0
- package/lib/types/dsh-notch-focus.d.ts +5 -0
- package/package.json +68 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 DSH Notch contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# dsh-notch-focus 0.1.2
|
|
2
|
+
|
|
3
|
+
DSH Notch 的客户端同步助手。0.1.2 源码的 `@deepseek-ai/dsh-*` peer 为 `>=0.2.0-rc.1 <0.2.1`,对应 DeepSeek Harness **`dsh-v0.2.0-rc.2` Desktop / Web**,与 `dsh-notch` 0.3.3 同时更新。该范围接受 `0.2.0-rc.2` 和稳定版 `0.2.0`,拒绝 `0.2.0` alpha,也拒绝 `0.1.7-rc.2`。已发布的 0.1.1 包仍在 v0.3.2 Release 里。
|
|
4
|
+
|
|
5
|
+
- 从 Notch 点击会话,通过 RC2 的 `uiWorkspace.openSession` 打开对话。
|
|
6
|
+
- 从 RC2 `uiSession.sessionStatus` 读取未读完成状态,通过 `retainedBy.mainView` 识别当前会话。
|
|
7
|
+
- 仅前台页面查看已完成会话时发送带时间的阅读确认;后台页面、仍运行的会话不会清除未读结果。
|
|
8
|
+
- 保留用户 fork,只排除 `origin: subagent` 的子代理;允许 API 创建的自定义会话 ID。
|
|
9
|
+
- 首次轮询忽略旧跳转请求,避免重新打开页面时意外切换会话。
|
|
10
|
+
|
|
11
|
+
## 安装
|
|
12
|
+
|
|
13
|
+
下载 [Notch v0.3.2 Release](https://github.com/aa2246740/dsh-notch/releases/tag/v0.3.2) 的 `dsh-notch-focus-0.1.1.tgz`,与 Host 插件安装到同一个 profile。
|
|
14
|
+
|
|
15
|
+
Desktop 使用应用内插件管理页;Web 使用:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
dsh plugin --profile web add /absolute/path/to/dsh-notch-focus-0.1.1.tgz
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
包内已有官方 `dsh.bundle.patch`,不要再手动追加同名条目。按管理器提示完成加载并重新打开页面;已有安装更新原条目。只替换磁盘文件不代表当前页面已加载新代码。
|
|
22
|
+
|
|
23
|
+
## 从源码构建
|
|
24
|
+
|
|
25
|
+
开发者需要 Node.js 24、DSHX 0.9.2(git 分支,不用 npm 上的旧版)和已备好依赖的 **`dsh-v0.2.0-rc.2`** Harness checkout。在本目录运行:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
npm ci --ignore-scripts --legacy-peer-deps
|
|
29
|
+
DSHX_HARNESS=/absolute/path/to/deepseek-harness npm run build
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
编译只写本插件的 `lib/`。客户端产物为 `lib/client.js`,使用 DSHX 的外部构建适配器。发布包已经带有该产物,安装者无需源码构建或 DSHX。
|
|
33
|
+
|
|
34
|
+
## English
|
|
35
|
+
|
|
36
|
+
The 0.1.2 companion source targets DSH `dsh-v0.2.0-rc.2` Desktop and Web with Notch 0.3.3. Its `@deepseek-ai/dsh-*` peer is `>=0.2.0-rc.1 <0.2.1`: that accepts `0.2.0-rc.2` and stable `0.2.0`, and rejects `0.2.0` alphas and `0.1.7-rc.2`. It uses `uiWorkspace.openSession`, `uiSession.sessionStatus`, and main-view retention for bidirectional navigation and timestamped reading acknowledgements. Inactive pages and running sessions cannot clear unread results. User forks remain independent; delegated subagents are excluded. The published 0.1.1 tarball remains on the v0.3.2 release.
|
|
37
|
+
|
|
38
|
+
Install the prebuilt `.tgz` from the linked release using the Desktop Plugins page or the Web CLI above. Both plugins must use the same profile. The package supplies its Bundle patch; do not mount it again manually. Follow the manager's loading instructions and reopen the page. Client HMR in every Desktop variant is not claimed.
|
package/cordis.patch.yml
ADDED
package/cordis.yml
ADDED
package/lib/client.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
window.__ModuleLoader__.load({
|
|
2
|
+
id: "dsh-notch-focus",
|
|
3
|
+
factory: (require) => {
|
|
4
|
+
var module = { exports: {} };
|
|
5
|
+
var exports = module.exports;
|
|
6
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
7
|
+
//#region src/client/index.tsx
|
|
8
|
+
const name = "dsh-notch-focus-client";
|
|
9
|
+
const inject = [
|
|
10
|
+
"sessions",
|
|
11
|
+
"uiWorkspace",
|
|
12
|
+
"uiSession"
|
|
13
|
+
];
|
|
14
|
+
const POLL_MS = 400;
|
|
15
|
+
function apply(ctx) {
|
|
16
|
+
const sessions = ctx.get("sessions");
|
|
17
|
+
const clientId = crypto.randomUUID();
|
|
18
|
+
let lastAt = 0;
|
|
19
|
+
let armed = false;
|
|
20
|
+
let stopped = false;
|
|
21
|
+
const open = async (sessionId) => {
|
|
22
|
+
try {
|
|
23
|
+
ctx.uiWorkspace.openSession(sessionId);
|
|
24
|
+
return;
|
|
25
|
+
} catch {}
|
|
26
|
+
try {
|
|
27
|
+
await sessions.refresh();
|
|
28
|
+
ctx.uiWorkspace.openSession(sessionId);
|
|
29
|
+
} catch {}
|
|
30
|
+
};
|
|
31
|
+
const poll = async () => {
|
|
32
|
+
try {
|
|
33
|
+
const snapshot = sessions.list.getSnapshot();
|
|
34
|
+
if (snapshot.phase === "ready") {
|
|
35
|
+
const rows = snapshot.ids.map((id) => snapshot.byId[id]).filter((row) => row && row.origin !== "subagent").map((row) => ({
|
|
36
|
+
id: row.id,
|
|
37
|
+
title: row.displayTitle,
|
|
38
|
+
completed: ctx.uiSession.sessionStatus.getSnapshot().get(row.id)?.completionUnread === true,
|
|
39
|
+
running: row.running,
|
|
40
|
+
updatedAt: row.updatedAt
|
|
41
|
+
}));
|
|
42
|
+
const focused = document.hasFocus();
|
|
43
|
+
const current = rows.find((row) => row.id === Object.values(snapshot.byId).find((item) => (item.retainedBy?.mainView ?? 0) > 0)?.id);
|
|
44
|
+
const viewed = focused && current && !current.running ? {
|
|
45
|
+
id: current.id,
|
|
46
|
+
at: Date.now()
|
|
47
|
+
} : void 0;
|
|
48
|
+
await fetch("/dsh-notch/sidebar", {
|
|
49
|
+
method: "POST",
|
|
50
|
+
headers: {
|
|
51
|
+
"content-type": "application/json",
|
|
52
|
+
"x-dsh-notch-client": "1"
|
|
53
|
+
},
|
|
54
|
+
body: JSON.stringify({
|
|
55
|
+
clientId,
|
|
56
|
+
projectionVersion: 3,
|
|
57
|
+
focused,
|
|
58
|
+
viewed,
|
|
59
|
+
rows
|
|
60
|
+
})
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (stopped) return;
|
|
64
|
+
const response = await fetch("/dsh-notch/pending-focus", { cache: "no-store" });
|
|
65
|
+
if (!response.ok) return;
|
|
66
|
+
const focus = (await response.json()).focus;
|
|
67
|
+
if (!armed) {
|
|
68
|
+
armed = true;
|
|
69
|
+
if (focus && typeof focus.at === "number") lastAt = focus.at;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (!focus || typeof focus.at !== "number" || focus.at <= lastAt) return;
|
|
73
|
+
if (typeof focus.sessionId !== "string" || focus.sessionId === "") return;
|
|
74
|
+
lastAt = focus.at;
|
|
75
|
+
await open(focus.sessionId);
|
|
76
|
+
try {
|
|
77
|
+
window.focus();
|
|
78
|
+
} catch {}
|
|
79
|
+
} catch {}
|
|
80
|
+
};
|
|
81
|
+
const tick = () => {
|
|
82
|
+
if (stopped) return;
|
|
83
|
+
poll().finally(() => {
|
|
84
|
+
if (!stopped) timer = window.setTimeout(tick, POLL_MS);
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
let timer = window.setTimeout(tick, POLL_MS);
|
|
88
|
+
poll();
|
|
89
|
+
ctx.effect(() => () => {
|
|
90
|
+
stopped = true;
|
|
91
|
+
window.clearTimeout(timer);
|
|
92
|
+
}, "dsh-notch-focus: poll");
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
exports.apply = apply;
|
|
96
|
+
exports.inject = inject;
|
|
97
|
+
exports.name = name;
|
|
98
|
+
return module.exports;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../src/client/index.tsx"],"sourcesContent":["import type { ISessions } from '@deepseek-ai/dsh-api-session-controller/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-session/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-workspace/client'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\n/**\n * Headless follower: polls the Host for notch focus wishes and selects the\n * session in every open DSH page (app webview or browser tab).\n *\n * First poll only arms (ignores a wish already sitting there) so a reload\n * does not yank the current session. A later click bumps `at` and opens.\n */\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\n\nexport const name = 'dsh-notch-focus-client'\nexport const inject = ['sessions', 'uiWorkspace', 'uiSession']\n\ninterface PendingFocusWire {\n ok?: boolean\n focus?: { sessionId?: string; at?: number } | null\n}\n\nconst POLL_MS = 400\n\nexport function apply(ctx: ClientContext): void {\n const sessions = ctx.get('sessions') as unknown as ISessions\n const clientId = crypto.randomUUID()\n let lastAt = 0\n let armed = false\n let stopped = false\n\n const open = async (sessionId: string): Promise<void> => {\n try {\n ctx.uiWorkspace.openSession(sessionId as SessionId)\n return\n } catch {\n /* list may be stale; refresh once and retry */\n }\n try {\n await sessions.refresh()\n ctx.uiWorkspace.openSession(sessionId as SessionId)\n } catch {\n /* session not in this page's list */\n }\n }\n\n const poll = async (): Promise<void> => {\n try {\n const snapshot = sessions.list.getSnapshot()\n if (snapshot.phase === 'ready') {\n // parentId also records independent user forks; only origin classifies\n // a delegated child, matching the official workspace sidebar.\n const rows = snapshot.ids.map(id => snapshot.byId[id]).filter(row => row && row.origin !== 'subagent').map(row => ({ id: row.id, title: row.displayTitle, completed: ctx.uiSession.sessionStatus.getSnapshot().get(row.id)?.completionUnread === true, running: row.running, updatedAt: row.updatedAt }))\n const focused = document.hasFocus()\n const current = rows.find(row => row.id === Object.values(snapshot.byId).find(item => (item.retainedBy?.mainView ?? 0) > 0)?.id)\n // updatedAt is the user's prompt timestamp, not the completion time.\n // Capture this observation before sending it, so a delayed request\n // cannot acknowledge a turn that finishes after the user looked.\n const viewed = focused && current && !current.running\n ? { id: current.id, at: Date.now() } : undefined\n await fetch('/dsh-notch/sidebar', { method: 'POST', headers: { 'content-type': 'application/json', 'x-dsh-notch-client': '1' }, body: JSON.stringify({ clientId, projectionVersion: 3, focused, viewed, rows }) })\n }\n if (stopped) return\n const response = await fetch('/dsh-notch/pending-focus', { cache: 'no-store' })\n if (!response.ok) return\n const data = (await response.json()) as PendingFocusWire\n const focus = data.focus\n if (!armed) {\n armed = true\n if (focus && typeof focus.at === 'number') lastAt = focus.at\n return\n }\n if (!focus || typeof focus.at !== 'number' || focus.at <= lastAt) return\n if (typeof focus.sessionId !== 'string' || focus.sessionId === '') return\n lastAt = focus.at\n await open(focus.sessionId)\n try {\n window.focus()\n } catch {\n /* native helper already fronts DSH.app */\n }\n } catch {\n /* Host unreachable mid-poll; the next tick retries. */\n }\n }\n\n const tick = (): void => {\n if (stopped) return\n void poll().finally(() => {\n if (!stopped) timer = window.setTimeout(tick, POLL_MS)\n })\n }\n let timer = window.setTimeout(tick, POLL_MS)\n void poll()\n\n ctx.effect(() => () => {\n stopped = true\n window.clearTimeout(timer)\n }, 'dsh-notch-focus: poll')\n}\n"],"mappings":";;;;;;;EAaA,MAAa,OAAO;EACpB,MAAa,SAAS;GAAC;GAAY;GAAe;EAAW;EAO7D,MAAM,UAAU;EAEhB,SAAgB,MAAM,KAA0B;GAC9C,MAAM,WAAW,IAAI,IAAI,UAAU;GACnC,MAAM,WAAW,OAAO,WAAW;GACnC,IAAI,SAAS;GACb,IAAI,QAAQ;GACZ,IAAI,UAAU;GAEd,MAAM,OAAO,OAAO,cAAqC;IACvD,IAAI;KACF,IAAI,YAAY,YAAY,SAAsB;KAClD;IACF,QAAQ,CAER;IACA,IAAI;KACF,MAAM,SAAS,QAAQ;KACvB,IAAI,YAAY,YAAY,SAAsB;IACpD,QAAQ,CAER;GACF;GAEA,MAAM,OAAO,YAA2B;IACtC,IAAI;KACF,MAAM,WAAW,SAAS,KAAK,YAAY;KAC3C,IAAI,SAAS,UAAU,SAAS;MAG9B,MAAM,OAAO,SAAS,IAAI,KAAI,OAAM,SAAS,KAAK,GAAG,CAAC,CAAC,QAAO,QAAO,OAAO,IAAI,WAAW,UAAU,CAAC,CAAC,KAAI,SAAQ;OAAE,IAAI,IAAI;OAAI,OAAO,IAAI;OAAc,WAAW,IAAI,UAAU,cAAc,YAAY,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,qBAAqB;OAAM,SAAS,IAAI;OAAS,WAAW,IAAI;MAAU,EAAE;MACxS,MAAM,UAAU,SAAS,SAAS;MAClC,MAAM,UAAU,KAAK,MAAK,QAAO,IAAI,OAAO,OAAO,OAAO,SAAS,IAAI,CAAC,CAAC,MAAK,UAAS,KAAK,YAAY,YAAY,KAAK,CAAC,CAAC,EAAE,EAAE;MAI/H,MAAM,SAAS,WAAW,WAAW,CAAC,QAAQ,UAC1C;OAAE,IAAI,QAAQ;OAAI,IAAI,KAAK,IAAI;MAAE,IAAI,KAAA;MACzC,MAAM,MAAM,sBAAsB;OAAE,QAAQ;OAAQ,SAAS;QAAE,gBAAgB;QAAoB,sBAAsB;OAAI;OAAG,MAAM,KAAK,UAAU;QAAE;QAAU,mBAAmB;QAAG;QAAS;QAAQ;OAAK,CAAC;MAAE,CAAC;KACnN;KACA,IAAI,SAAS;KACb,MAAM,WAAW,MAAM,MAAM,4BAA4B,EAAE,OAAO,WAAW,CAAC;KAC9E,IAAI,CAAC,SAAS,IAAI;KAElB,MAAM,SAAQ,MADM,SAAS,KAAK,EAAA,CACf;KACnB,IAAI,CAAC,OAAO;MACV,QAAQ;MACR,IAAI,SAAS,OAAO,MAAM,OAAO,UAAU,SAAS,MAAM;MAC1D;KACF;KACA,IAAI,CAAC,SAAS,OAAO,MAAM,OAAO,YAAY,MAAM,MAAM,QAAQ;KAClE,IAAI,OAAO,MAAM,cAAc,YAAY,MAAM,cAAc,IAAI;KACnE,SAAS,MAAM;KACf,MAAM,KAAK,MAAM,SAAS;KAC1B,IAAI;MACF,OAAO,MAAM;KACf,QAAQ,CAER;IACF,QAAQ,CAER;GACF;GAEA,MAAM,aAAmB;IACvB,IAAI,SAAS;IACb,KAAU,CAAC,CAAC,cAAc;KACxB,IAAI,CAAC,SAAS,QAAQ,OAAO,WAAW,MAAM,OAAO;IACvD,CAAC;GACH;GACA,IAAI,QAAQ,OAAO,WAAW,MAAM,OAAO;GAC3C,KAAU;GAEV,IAAI,mBAAmB;IACrB,UAAU;IACV,OAAO,aAAa,KAAK;GAC3B,GAAG,uBAAuB;EAC5B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless follower: polls the Host for notch focus wishes and selects the
|
|
3
|
+
* session in every open DSH page (app webview or browser tab).
|
|
4
|
+
*
|
|
5
|
+
* First poll only arms (ignores a wish already sitting there) so a reload
|
|
6
|
+
* does not yank the current session. A later click bumps `at` and opens.
|
|
7
|
+
*/
|
|
8
|
+
import type { Context as ClientContext } from '@deepseek-ai/cordis';
|
|
9
|
+
export declare const name = "dsh-notch-focus-client";
|
|
10
|
+
export declare const inject: string[];
|
|
11
|
+
export declare function apply(ctx: ClientContext): void;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-notch-focus",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Bidirectional session navigation and unread synchronization for DSH Desktop and Web 0.2.0-rc.2.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "lib/dsh-notch-focus.js",
|
|
7
|
+
"types": "lib/types/dsh-notch-focus.d.ts",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc -p tsconfig.json && tsdown",
|
|
10
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./lib/types/dsh-notch-focus.d.ts",
|
|
15
|
+
"default": "./lib/dsh-notch-focus.js"
|
|
16
|
+
},
|
|
17
|
+
"./client": {
|
|
18
|
+
"types": "./lib/types/client/index.d.ts",
|
|
19
|
+
"default": "./lib/client.js"
|
|
20
|
+
},
|
|
21
|
+
"./package.json": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
"dsh": {
|
|
24
|
+
"client": {
|
|
25
|
+
"inject": [
|
|
26
|
+
"@deepseek-ai/dsh-api-session-controller",
|
|
27
|
+
"@deepseek-ai/dsh-client-ui-workspace",
|
|
28
|
+
"@deepseek-ai/dsh-client-ui-session"
|
|
29
|
+
],
|
|
30
|
+
"platform": "web"
|
|
31
|
+
},
|
|
32
|
+
"bundle": {
|
|
33
|
+
"patch": "./cordis.patch.yml"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"lib/*.js",
|
|
38
|
+
"lib/*.js.map",
|
|
39
|
+
"lib/types/**/*.d.ts",
|
|
40
|
+
"cordis.yml",
|
|
41
|
+
"README.md",
|
|
42
|
+
"cordis.patch.yml",
|
|
43
|
+
"LICENSE"
|
|
44
|
+
],
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
47
|
+
},
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"peerDependencies": {
|
|
50
|
+
"@deepseek-ai/cordis": "^4.0.4",
|
|
51
|
+
"@deepseek-ai/dsh-client-ui-workspace": ">=0.2.0-rc.1 <0.2.1",
|
|
52
|
+
"@deepseek-ai/dsh-client-ui-session": ">=0.2.0-rc.1 <0.2.1",
|
|
53
|
+
"@deepseek-ai/dsh-api-session-controller": ">=0.2.0-rc.1 <0.2.1"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@deepseek-ai/cordis": "^4.0.4",
|
|
57
|
+
"@types/react": "~18.3.1",
|
|
58
|
+
"react": "^18.2.0",
|
|
59
|
+
"react-dom": "^18.2.0",
|
|
60
|
+
"tsdown": "^0.22.2",
|
|
61
|
+
"typescript": "^6.0.3",
|
|
62
|
+
"@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
|
|
63
|
+
"@deepseek-ai/dsh-client-ui-workspace": "0.2.0-rc.2",
|
|
64
|
+
"@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2",
|
|
65
|
+
"@deepseek-ai/dsh-session": "0.2.0-rc.2",
|
|
66
|
+
"@deepseek-ai/dsh-client-store": "0.2.0-rc.2"
|
|
67
|
+
}
|
|
68
|
+
}
|