dsh-more 0.0.7 → 0.0.9
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/CONTRIBUTING.md +5 -3
- package/README.md +17 -6
- package/README.zh-CN.md +17 -6
- package/dist/client.js +1 -1
- package/dist/index.js +105 -31
- package/dist/types/patches/projectless-tasks/client/adapter.d.ts +2 -2
- package/dsh.plugin.json +1 -1
- package/package.json +62 -60
package/CONTRIBUTING.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
- Node.js `22.19.x` 或 `>= 24`;
|
|
14
14
|
- pnpm;
|
|
15
|
-
- 与项目当前依赖匹配的 DSH
|
|
15
|
+
- 与项目当前依赖匹配的 DSH。本版本以 `0.1.5-rc.2` 为验证基线,依赖范围为 `^0.1.5-rc.2`。
|
|
16
16
|
|
|
17
17
|
首次检出后执行:
|
|
18
18
|
|
|
@@ -316,12 +316,14 @@ pnpm run release -- --otp=123456
|
|
|
316
316
|
优先使用现有依赖和平台适配层。确实需要新增时:
|
|
317
317
|
|
|
318
318
|
- 只在构建或测试中使用的包放入 `devDependencies`;
|
|
319
|
-
- 运行时由 DSH 提供的外部包放入 `peerDependencies`,并在 `devDependencies`
|
|
319
|
+
- 运行时由 DSH 提供的外部包放入 `peerDependencies`,并在 `devDependencies` 使用相同的兼容版本范围(例如 `^0.1.5-rc.2`),不固定单一版本;
|
|
320
320
|
- Client bundle 真正产生外部 `require()` 时,将对应模块加入 `dsh.client.inject`;
|
|
321
321
|
- 只用于 TypeScript module augmentation、且不会出现在发布声明或运行时 bundle 中的包,可以仅作为开发依赖;
|
|
322
|
-
-
|
|
322
|
+
- 保留并同步 `pnpm-lock.yaml` 记录已验证的解析结果;CI 使用 `--frozen-lockfile`。需要更新范围内版本时运行 `pnpm update`,然后执行完整检查;本仓库不维护并行的 `package-lock.json`;
|
|
323
323
|
- 不要为了一个很小的 helper 引入大型依赖。
|
|
324
324
|
|
|
325
|
+
DSH 当前使用 `^0.1.5-rc.2`:接受后续 `0.1.x` 正式版本和同一 `0.1.5` 基线的更新 RC,不自动跨入 `0.2`,也不接受其他版本基线的预发布包。不要用各子包的 `latest` 标签做批量升级;上游子包标签并不总是与 CLI 对齐。JSONL 后端仅作为开发依赖,用于真实存储兼容性测试。
|
|
326
|
+
|
|
325
327
|
更新锁文件后再次运行完整检查,并在变更说明中写明依赖的用途。
|
|
326
328
|
|
|
327
329
|
## 提交前检查清单
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ Practical, independently switchable patches for missing context and history cont
|
|
|
6
6
|
|
|
7
7
|
`dsh-more` integrates with the existing DSH interface instead of adding a separate management dashboard. Its current patch set can edit a user message and restart from that point, remove one message while preserving the surrounding context, and permanently delete a session while leaving native archive behavior intact.
|
|
8
8
|
|
|
9
|
-
> **Compatibility:** the current release targets DeepSeek Harness `0.1.
|
|
9
|
+
> **Compatibility:** the current release targets DeepSeek Harness `0.1.5-rc.2` and requires Node.js `>= 24`. DSH is still a release candidate, so upgrades may require changes in the centralized adapter layer described below.
|
|
10
10
|
|
|
11
11
|
## Features
|
|
12
12
|
|
|
@@ -24,7 +24,7 @@ Patch switches live under **Settings → Plugins → Plugin configuration → DS
|
|
|
24
24
|
### Requirements
|
|
25
25
|
|
|
26
26
|
- Node.js `>= 24`
|
|
27
|
-
- A working `dsh` CLI and a Web profile compatible with DSH `0.1.
|
|
27
|
+
- A working `dsh` CLI and a Web profile compatible with DSH `0.1.5-rc.2`
|
|
28
28
|
- Access to the npm registry that publishes `dsh-more`
|
|
29
29
|
|
|
30
30
|
pnpm is needed only when installing or developing from source. For a published release, use the DSH plugin command so the package is installed into the selected DSH profile; do not install it globally with `npm install -g`.
|
|
@@ -233,6 +233,17 @@ pnpm run package # Build and create the npm tarball
|
|
|
233
233
|
|
|
234
234
|
Generated source, `dist/`, and tarballs are not committed. `prepack` runs the complete check before `npm pack` or `npm publish`.
|
|
235
235
|
|
|
236
|
+
### Dependency updates
|
|
237
|
+
|
|
238
|
+
`package.json` uses compatible version ranges so installs and updates can resolve newer versions within those ranges. `pnpm-lock.yaml` preserves reproducible builds; a normal install keeps already locked versions. To refresh dependencies and validate them:
|
|
239
|
+
|
|
240
|
+
```sh
|
|
241
|
+
pnpm update
|
|
242
|
+
pnpm run check
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
The DSH range `^0.1.5-rc.2` accepts later stable `0.1.x` releases and newer `0.1.5` RCs. It does not cross into `0.2` or include alpha/RC releases with a different version tuple.
|
|
246
|
+
|
|
236
247
|
### Verification scope
|
|
237
248
|
|
|
238
249
|
Automated tests cover patch registry alignment, independent activation/disposal, Settings projection, mutation trust checks, confirmation expiry/tampering/staleness, message selection and clean rebuilds, runtime-context continuity, and cold/live session deletion.
|
|
@@ -241,13 +252,13 @@ The repository does not currently contain a full browser end-to-end suite agains
|
|
|
241
252
|
|
|
242
253
|
## Compatibility notes
|
|
243
254
|
|
|
244
|
-
|
|
255
|
+
Development and host dependency ranges use `^0.1.5-rc.2`; the lockfile records the versions currently verified. The adapters and tests cover the current session format, message provenance, `main.conversation` slot, and JSONL persistence snapshots and location capability. For an existing local linked install, rebuild, restart DSH, and reload the page to load both the new Host and Client.
|
|
245
256
|
|
|
246
|
-
- The current dependency set targets DSH `0.1.
|
|
257
|
+
- The current dependency set targets DSH `0.1.5-rc.2`; pre-release API or DOM changes can require adapter updates.
|
|
247
258
|
- In-product DSH More copy is currently primarily Simplified Chinese, although native Copy/Archive selectors recognize both Chinese and English labels.
|
|
248
259
|
- Message actions operate only on ordinary user messages and assistant messages still present in the current model surface; editing requires a completed owning turn.
|
|
249
|
-
- Permanent deletion
|
|
250
|
-
- Unloading a live session
|
|
260
|
+
- Permanent deletion requires a `jsonl` backend with a valid location capability. Its current `locate` hook is internal; the adapter checks its presence and result. Tests cover plain and Zstandard-compressed session files.
|
|
261
|
+
- Unloading a live session uses tracked public Agent handles. With handle-based persistence, deletion refuses an already-live session whose Agent handle was not tracked and asks for a DSH restart, preserving write ownership and file locks.
|
|
251
262
|
|
|
252
263
|
## License
|
|
253
264
|
|
package/README.zh-CN.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
`dsh-more` 不创建平行的“管理中心”,而是把能力直接嵌入 DSH 现有界面。当前补丁可以编辑用户消息并从该处重新开始、在保留前后上下文的前提下删除单条消息,以及在不改变原生归档语义的情况下永久删除会话。
|
|
8
8
|
|
|
9
|
-
> **兼容性:** 当前发布面向 DeepSeek Harness `0.1.
|
|
9
|
+
> **兼容性:** 当前发布面向 DeepSeek Harness `0.1.5-rc.2`,要求 Node.js `>= 24`。DSH 仍是 RC 版本,升级后可能需要调整下文所述的集中适配层。
|
|
10
10
|
|
|
11
11
|
## 功能概览
|
|
12
12
|
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
### 环境要求
|
|
25
25
|
|
|
26
26
|
- Node.js `>= 24`
|
|
27
|
-
- 可正常使用的 `dsh` CLI,以及与 DSH `0.1.
|
|
27
|
+
- 可正常使用的 `dsh` CLI,以及与 DSH `0.1.5-rc.2` 兼容的 Web profile
|
|
28
28
|
- 能访问发布 `dsh-more` 的 npm registry
|
|
29
29
|
|
|
30
30
|
只有从源码安装或参与开发时才需要 pnpm。安装已发布版本时,应通过 DSH 插件命令把包加入指定 profile;不要使用 `npm install -g` 全局安装。
|
|
@@ -233,6 +233,17 @@ pnpm run package # 构建并生成 npm tarball
|
|
|
233
233
|
|
|
234
234
|
生成源码、`dist/` 和 tarball 都不提交。`npm pack` 或 `npm publish` 之前,`prepack` 会执行完整检查。
|
|
235
235
|
|
|
236
|
+
### 依赖更新
|
|
237
|
+
|
|
238
|
+
`package.json` 使用兼容版本范围,允许安装或更新时解析范围内的新版本;`pnpm-lock.yaml` 保留可复现的构建结果,普通安装不会自动改写已经锁定的版本。更新依赖并验证:
|
|
239
|
+
|
|
240
|
+
```sh
|
|
241
|
+
pnpm update
|
|
242
|
+
pnpm run check
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
DSH 的 `^0.1.5-rc.2` 接受后续 `0.1.x` 正式版本和 `0.1.5` 的更新 RC,不自动跨入 `0.2`,也不包含其他版本基线的 alpha/RC。
|
|
246
|
+
|
|
236
247
|
### 验证范围
|
|
237
248
|
|
|
238
249
|
自动化测试覆盖注册表一致性、独立启停与清理、Settings 投影、写请求信任栅栏、确认令牌过期/篡改/状态变化、消息选择与干净重建、runtime-context 连续性,以及冷/实时会话删除。
|
|
@@ -241,13 +252,13 @@ pnpm run package # 构建并生成 npm tarball
|
|
|
241
252
|
|
|
242
253
|
## 兼容性说明
|
|
243
254
|
|
|
244
|
-
|
|
255
|
+
开发与宿主依赖统一使用 `^0.1.5-rc.2`,锁文件记录当前已验证版本。已适配新版会话格式、消息来源字段、`main.conversation` 插槽,以及 JSONL 后端的持久化快照和定位能力。已有本地链接安装在重新构建后,需要重启 DSH 并刷新页面以加载新的 Host 和 Client。
|
|
245
256
|
|
|
246
|
-
- 当前依赖面向 DSH `0.1.
|
|
257
|
+
- 当前依赖面向 DSH `0.1.5-rc.2`;预发布 API 或 DOM 变化可能要求更新 adapter。
|
|
247
258
|
- DSH More 的产品内文案目前以简体中文为主;对 DSH 原生 Copy/Archive 元素的定位同时识别中英文标签。
|
|
248
259
|
- 消息操作只面向仍在当前 model surface 中的普通用户消息和助手消息;编辑要求所属轮次已经完成。
|
|
249
|
-
-
|
|
250
|
-
-
|
|
260
|
+
- 永久删除只支持提供有效定位能力的 `jsonl` 后端;当前后端的 `locate` 为内部接口,调用前会检查能力及返回值,测试覆盖普通和 Zstandard 压缩会话文件。
|
|
261
|
+
- 卸载实时会话时使用插件追踪到的公开 Agent handle。新版持久化后端仍持有写入句柄、但插件未追踪到对应 Agent handle 时,会拒绝删除并提示重启 DSH,避免遗留写入锁。
|
|
251
262
|
|
|
252
263
|
## 许可证
|
|
253
264
|
|
package/dist/client.js
CHANGED
|
@@ -1565,7 +1565,7 @@ var CONVERSATION_SLOTS = ["conversation", "main.conversation"];
|
|
|
1565
1565
|
function conversationSlot(name) {
|
|
1566
1566
|
return name;
|
|
1567
1567
|
}
|
|
1568
|
-
function installConversationAdapter(ctx, activation, name = "conversation") {
|
|
1568
|
+
function installConversationAdapter(ctx, activation, name = "main.conversation") {
|
|
1569
1569
|
const slot = conversationSlot(name);
|
|
1570
1570
|
const wrapped = /* @__PURE__ */ new Map();
|
|
1571
1571
|
let live = true;
|
package/dist/index.js
CHANGED
|
@@ -282,9 +282,13 @@ async function createEditedContinuation(ctx, sourceAgent, cut, editedText, child
|
|
|
282
282
|
agentOptions: {
|
|
283
283
|
...(request?.provider ?? sourceAgent.options.provider) === void 0 ? {} : { provider: request?.provider ?? sourceAgent.options.provider },
|
|
284
284
|
...(request?.model ?? sourceAgent.options.model) === void 0 ? {} : { model: request?.model ?? sourceAgent.options.model },
|
|
285
|
-
...sourceAgent.options.maxTokens === void 0 ? {} : { maxTokens: sourceAgent.options.maxTokens }
|
|
285
|
+
...sourceAgent.options.maxTokens === void 0 ? {} : { maxTokens: sourceAgent.options.maxTokens },
|
|
286
|
+
...(request?.reasoningEffort ?? sourceAgent.options.reasoningEffort) === void 0 ? {} : {
|
|
287
|
+
reasoningEffort: request?.reasoningEffort ?? sourceAgent.options.reasoningEffort
|
|
288
|
+
}
|
|
286
289
|
},
|
|
287
|
-
setup: (agentCtx) => {
|
|
290
|
+
setup: (agentCtx, agent) => {
|
|
291
|
+
agent.inbox.clear();
|
|
288
292
|
roster?.composeFrom(agentCtx, sourceAgent.ctx);
|
|
289
293
|
releaseRuntimeContextReplay = replaySeedRuntimeContext(agentCtx, seed);
|
|
290
294
|
}
|
|
@@ -475,7 +479,21 @@ function recordedDeletionSeqs(events) {
|
|
|
475
479
|
function buildCleanSeed(source, selection) {
|
|
476
480
|
const deleted = recordedDeletionSeqs(source.snapshotEvents());
|
|
477
481
|
for (const seq of selection.shadowedSeqs) deleted.add(seq);
|
|
478
|
-
const survivors =
|
|
482
|
+
const survivors = /* @__PURE__ */ new Map();
|
|
483
|
+
for (const seq of source.surface.nodes) {
|
|
484
|
+
if (deleted.has(seq)) continue;
|
|
485
|
+
const event = source.eventAt(seq);
|
|
486
|
+
if (event === void 0 || source.deriveEventMessage(event) === null) continue;
|
|
487
|
+
let anchor = event;
|
|
488
|
+
while (anchor.surfaceOp !== void 0 && anchor.surfaceOp !== "append") {
|
|
489
|
+
const previous = source.eventAt(anchor.surfaceOp.startSeq);
|
|
490
|
+
if (previous === void 0 || previous.seq >= anchor.seq) break;
|
|
491
|
+
anchor = previous;
|
|
492
|
+
}
|
|
493
|
+
const at = survivors.get(anchor.seq) ?? [];
|
|
494
|
+
at.push(event);
|
|
495
|
+
survivors.set(anchor.seq, at);
|
|
496
|
+
}
|
|
479
497
|
const rebuilt = Session.create(SessionId4(`session-rebuild-${randomUUID3()}`));
|
|
480
498
|
let turn = 0;
|
|
481
499
|
let step = 0;
|
|
@@ -483,6 +501,8 @@ function buildCleanSeed(source, selection) {
|
|
|
483
501
|
let stepOpen = false;
|
|
484
502
|
let assistantSeen = false;
|
|
485
503
|
const loggedCalls = /* @__PURE__ */ new Set();
|
|
504
|
+
const userSeqs = /* @__PURE__ */ new Map();
|
|
505
|
+
let sourceTurnOpen = false;
|
|
486
506
|
const closeStep = () => {
|
|
487
507
|
if (!stepOpen) return;
|
|
488
508
|
rebuilt.append("step/end", { turn, step });
|
|
@@ -509,40 +529,87 @@ function buildCleanSeed(source, selection) {
|
|
|
509
529
|
stepOpen = true;
|
|
510
530
|
}
|
|
511
531
|
};
|
|
512
|
-
for (const
|
|
513
|
-
if (
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
532
|
+
for (const entry of source.snapshotEvents()) {
|
|
533
|
+
if ([
|
|
534
|
+
"permission/preset",
|
|
535
|
+
"sandbox/mode",
|
|
536
|
+
"approval/policy",
|
|
537
|
+
"subagent/model-selection-policy",
|
|
538
|
+
"model/selection",
|
|
539
|
+
"request/header",
|
|
540
|
+
"request/context",
|
|
541
|
+
"agent-preset/selected"
|
|
542
|
+
].includes(entry.type)) {
|
|
543
|
+
rebuilt.append(entry.type, entry.data);
|
|
518
544
|
continue;
|
|
519
545
|
}
|
|
520
|
-
if (
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
// Only the reconstructed turn/step coordinates belong to the new log.
|
|
524
|
-
...event.data,
|
|
525
|
-
turn,
|
|
526
|
-
step
|
|
527
|
-
}, { surfaceOp: "append" });
|
|
528
|
-
assistantSeen = true;
|
|
529
|
-
for (const call of event.data.message.content) {
|
|
530
|
-
if (call.type !== "tool-call") continue;
|
|
531
|
-
rebuilt.append("tool/call", { turn, step, callId: call.id, name: call.name, arguments: call.arguments });
|
|
532
|
-
loggedCalls.add(call.id);
|
|
533
|
-
}
|
|
546
|
+
if (entry.type === "turn/start") {
|
|
547
|
+
closeTurn();
|
|
548
|
+
sourceTurnOpen = true;
|
|
534
549
|
continue;
|
|
535
550
|
}
|
|
536
|
-
if (
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
551
|
+
if (entry.type === "turn/end") {
|
|
552
|
+
closeTurn();
|
|
553
|
+
sourceTurnOpen = false;
|
|
554
|
+
continue;
|
|
555
|
+
}
|
|
556
|
+
if (entry.type === "step/end") {
|
|
557
|
+
closeStep();
|
|
558
|
+
continue;
|
|
559
|
+
}
|
|
560
|
+
for (const event of survivors.get(entry.seq) ?? []) {
|
|
561
|
+
if (event.type === "user/message" && !sourceTurnOpen && event.data.source.kind !== "user") {
|
|
562
|
+
rebuilt.append("user/message", event.data, { surfaceOp: "append" });
|
|
563
|
+
continue;
|
|
564
|
+
}
|
|
565
|
+
if (event.type === "assistant/message" && assistantSeen) closeStep();
|
|
566
|
+
openStep();
|
|
567
|
+
if (event.type === "system/message") {
|
|
568
|
+
rebuilt.append("system/message", { ...event.data, turn, step }, { surfaceOp: "append" });
|
|
569
|
+
continue;
|
|
570
|
+
}
|
|
571
|
+
if (event.type === "user/message") {
|
|
572
|
+
const appended = rebuilt.append("user/message", event.data, { surfaceOp: "append" });
|
|
573
|
+
if (event.data.source.kind === "user") userSeqs.set(event.seq, appended.seq);
|
|
574
|
+
continue;
|
|
575
|
+
}
|
|
576
|
+
if (event.type === "assistant/message") {
|
|
577
|
+
rebuilt.append("assistant/message", {
|
|
578
|
+
// Keep the durable stream and settlement metadata required by DSH 0.1.5.
|
|
579
|
+
// Only the reconstructed turn/step coordinates belong to the new log.
|
|
580
|
+
...event.data,
|
|
581
|
+
turn,
|
|
582
|
+
step
|
|
583
|
+
}, { surfaceOp: "append" });
|
|
584
|
+
assistantSeen = true;
|
|
585
|
+
for (const call of event.data.message.content) {
|
|
586
|
+
if (call.type !== "tool-call") continue;
|
|
587
|
+
rebuilt.append("tool/call", { turn, step, callId: call.id, name: call.name, arguments: call.arguments });
|
|
588
|
+
loggedCalls.add(call.id);
|
|
589
|
+
}
|
|
590
|
+
continue;
|
|
591
|
+
}
|
|
592
|
+
if (event.type === "tool/result") {
|
|
593
|
+
const callId = event.data.message.source.callId;
|
|
594
|
+
if (!loggedCalls.has(callId)) {
|
|
595
|
+
rebuilt.append("tool/call", { turn, step, callId: event.data.message.source.callId, name: "restored-tool", arguments: "{}" });
|
|
596
|
+
loggedCalls.add(callId);
|
|
597
|
+
}
|
|
598
|
+
rebuilt.append("tool/result", { turn, step, message: event.data.message, ...event.data.error === void 0 ? {} : { error: event.data.error }, ...event.data.meta === void 0 ? {} : { meta: event.data.meta } }, { surfaceOp: "append" });
|
|
541
599
|
}
|
|
542
|
-
rebuilt.append("tool/result", { turn, step, message: event.data.message, ...event.data.error === void 0 ? {} : { error: event.data.error }, ...event.data.meta === void 0 ? {} : { meta: event.data.meta } }, { surfaceOp: "append" });
|
|
543
600
|
}
|
|
544
601
|
}
|
|
545
602
|
closeTurn();
|
|
603
|
+
const title = source.snapshotEvents().findLast((event) => event.type === "session/title");
|
|
604
|
+
if (title?.type === "session/title") {
|
|
605
|
+
const messageSeqs = title.data.messageSeqs.flatMap((seq) => {
|
|
606
|
+
const mapped = userSeqs.get(seq);
|
|
607
|
+
return mapped === void 0 ? [] : [mapped];
|
|
608
|
+
});
|
|
609
|
+
if (title.data.source.kind === "user" || messageSeqs.length > 0) {
|
|
610
|
+
rebuilt.append("session/title", { ...title.data, messageSeqs });
|
|
611
|
+
}
|
|
612
|
+
}
|
|
546
613
|
return rebuilt.snapshotEvents();
|
|
547
614
|
}
|
|
548
615
|
async function createDeletedContinuation(ctx, sourceAgent, selection, childId = SessionId4(`session-${randomUUID3()}`)) {
|
|
@@ -578,7 +645,10 @@ async function createDeletedContinuation(ctx, sourceAgent, selection, childId =
|
|
|
578
645
|
agentOptions: {
|
|
579
646
|
...provider === void 0 ? {} : { provider },
|
|
580
647
|
...model === void 0 ? {} : { model },
|
|
581
|
-
...sourceAgent.options.maxTokens === void 0 ? {} : { maxTokens: sourceAgent.options.maxTokens }
|
|
648
|
+
...sourceAgent.options.maxTokens === void 0 ? {} : { maxTokens: sourceAgent.options.maxTokens },
|
|
649
|
+
...(request?.reasoningEffort ?? sourceAgent.options.reasoningEffort) === void 0 ? {} : {
|
|
650
|
+
reasoningEffort: request?.reasoningEffort ?? sourceAgent.options.reasoningEffort
|
|
651
|
+
}
|
|
582
652
|
},
|
|
583
653
|
setup: (agentCtx) => {
|
|
584
654
|
roster?.composeFrom(agentCtx, sourceAgent.ctx);
|
|
@@ -783,10 +853,14 @@ async function deleteSessionPermanently(ctx, rawSessionId) {
|
|
|
783
853
|
const stored = await ctx.sessionPersistence.list();
|
|
784
854
|
const header2 = stored.map((candidate) => "header" in candidate ? candidate.header : candidate).find((candidate) => candidate.id === sessionId) ?? live?.header;
|
|
785
855
|
if (header2 === void 0) throw new DshMoreError("not-found", "\u4F1A\u8BDD\u8BB0\u5F55\u4E0D\u5B58\u5728\u3002", 404);
|
|
786
|
-
const
|
|
856
|
+
const persistence = ctx.sessionPersistence;
|
|
857
|
+
const location = "locate" in persistence && typeof persistence.locate === "function" ? persistence.locate(header2) : void 0;
|
|
787
858
|
if (location === void 0) {
|
|
788
859
|
throw new DshMoreError("internal", "\u5F53\u524D\u6301\u4E45\u5316\u540E\u7AEF\u4E0D\u652F\u6301\u9010\u4F1A\u8BDD\u7269\u7406\u5220\u9664\u3002", 409);
|
|
789
860
|
}
|
|
861
|
+
if (typeof location !== "object" || location === null || !("kind" in location) || typeof location.kind !== "string" || !("path" in location) || typeof location.path !== "string") {
|
|
862
|
+
throw new DshMoreError("internal", "\u6301\u4E45\u5316\u540E\u7AEF\u8FD4\u56DE\u4E86\u65E0\u6548\u7684\u4F1A\u8BDD\u4F4D\u7F6E\u3002", 500);
|
|
863
|
+
}
|
|
790
864
|
if (location.kind !== "jsonl") {
|
|
791
865
|
throw new DshMoreError("internal", `\u6301\u4E45\u5316\u540E\u7AEF ${location.kind} \u4E0D\u652F\u6301\u5B89\u5168\u7684\u9010\u76EE\u5F55\u5220\u9664\u3002`, 409);
|
|
792
866
|
}
|
|
@@ -7,11 +7,11 @@ export declare function clientSessionActions(ctx: Context): Pick<ISessions, 'cre
|
|
|
7
7
|
/** Only the native workspace gate is removed; loading and business blocks stay native. */
|
|
8
8
|
export declare function unlockComposer(owner: ComposerBarOwnerProps, independent: boolean, block: ComposerBarOwnerProps['blocked']): ComposerBarOwnerProps;
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* Keep the native conversation registration identity,
|
|
11
11
|
* children, stores and render authorizations; adapt only its owner props.
|
|
12
12
|
* A dormant fallback registration invalidates the public slot subscription
|
|
13
13
|
* on install/uninstall, including an already mounted Web client.
|
|
14
14
|
*/
|
|
15
15
|
export declare const CONVERSATION_SLOTS: readonly ["conversation", "main.conversation"];
|
|
16
|
-
export declare function conversationSlot(name: typeof CONVERSATION_SLOTS[number]): 'conversation';
|
|
16
|
+
export declare function conversationSlot(name: typeof CONVERSATION_SLOTS[number]): 'main.conversation';
|
|
17
17
|
export declare function installConversationAdapter(ctx: Context, activation: PatchActivationSource, name?: typeof CONVERSATION_SLOTS[number]): () => void;
|
package/dsh.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-more",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Practical patches for missing DeepSeek Harness Web context and history controls.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -89,74 +89,76 @@
|
|
|
89
89
|
},
|
|
90
90
|
"peerDependencies": {
|
|
91
91
|
"@deepseek-ai/cordis": "^4.0.2",
|
|
92
|
-
"@deepseek-ai/dsh-agent": "^0.1.
|
|
93
|
-
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.
|
|
94
|
-
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.
|
|
95
|
-
"@deepseek-ai/dsh-client-ui-settings": "^0.1.
|
|
96
|
-
"@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.
|
|
97
|
-
"@deepseek-ai/dsh-client-ui-slots": "^0.1.
|
|
98
|
-
"@deepseek-ai/dsh-compaction": "^0.1.
|
|
99
|
-
"@deepseek-ai/dsh-agent-presets": "^0.1.
|
|
100
|
-
"@deepseek-ai/dsh-host-webserver": "^0.1.
|
|
101
|
-
"@deepseek-ai/dsh-llm": "^0.1.
|
|
102
|
-
"@deepseek-ai/dsh-session": "^0.1.
|
|
103
|
-
"@deepseek-ai/dsh-session-persistence": "^0.1.
|
|
104
|
-
"@deepseek-ai/dsh-session-projection": "^0.1.
|
|
105
|
-
"@deepseek-ai/dsh-settings": "^0.1.
|
|
106
|
-
"@deepseek-ai/dsh-system-prompt": "^0.1.
|
|
107
|
-
"@deepseek-ai/dsh-workspace": "^0.1.
|
|
108
|
-
"@deepseek-ai/dsh-web-app": "^0.1.
|
|
92
|
+
"@deepseek-ai/dsh-agent": "^0.1.5-rc.2",
|
|
93
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.5-rc.2",
|
|
94
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-rc.2",
|
|
95
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.5-rc.2",
|
|
96
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.5-rc.2",
|
|
97
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.2",
|
|
98
|
+
"@deepseek-ai/dsh-compaction": "^0.1.5-rc.2",
|
|
99
|
+
"@deepseek-ai/dsh-agent-presets": "^0.1.5-rc.2",
|
|
100
|
+
"@deepseek-ai/dsh-host-webserver": "^0.1.5-rc.2",
|
|
101
|
+
"@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
|
|
102
|
+
"@deepseek-ai/dsh-session": "^0.1.5-rc.2",
|
|
103
|
+
"@deepseek-ai/dsh-session-persistence": "^0.1.5-rc.2",
|
|
104
|
+
"@deepseek-ai/dsh-session-projection": "^0.1.5-rc.2",
|
|
105
|
+
"@deepseek-ai/dsh-settings": "^0.1.5-rc.2",
|
|
106
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.2",
|
|
107
|
+
"@deepseek-ai/dsh-workspace": "^0.1.5-rc.2",
|
|
108
|
+
"@deepseek-ai/dsh-web-app": "^0.1.5-rc.2",
|
|
109
109
|
"@deepseek-ai/schemastery": "^3.18.2",
|
|
110
110
|
"react": "^18.2.0",
|
|
111
111
|
"react-dom": "^18.2.0",
|
|
112
112
|
"zod": "^4.4.3",
|
|
113
|
-
"@deepseek-ai/dsh-api-session-controller": "^0.1.
|
|
114
|
-
"@deepseek-ai/dsh-api-workspace-controller": "^0.1.
|
|
115
|
-
"@deepseek-ai/dsh-client-ui-chat": "^0.1.
|
|
116
|
-
"@deepseek-ai/dsh-client-ui-session": "^0.1.
|
|
117
|
-
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.
|
|
118
|
-
"@deepseek-ai/dsh-client-store": "^0.1.
|
|
119
|
-
"@deepseek-ai/dsh-llm-retry": "^0.1.
|
|
120
|
-
"@deepseek-ai/dsh-session-title": "^0.1.
|
|
113
|
+
"@deepseek-ai/dsh-api-session-controller": "^0.1.5-rc.2",
|
|
114
|
+
"@deepseek-ai/dsh-api-workspace-controller": "^0.1.5-rc.2",
|
|
115
|
+
"@deepseek-ai/dsh-client-ui-chat": "^0.1.5-rc.2",
|
|
116
|
+
"@deepseek-ai/dsh-client-ui-session": "^0.1.5-rc.2",
|
|
117
|
+
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-rc.2",
|
|
118
|
+
"@deepseek-ai/dsh-client-store": "^0.1.5-rc.2",
|
|
119
|
+
"@deepseek-ai/dsh-llm-retry": "^0.1.5-rc.2",
|
|
120
|
+
"@deepseek-ai/dsh-session-title": "^0.1.5-rc.2",
|
|
121
|
+
"@deepseek-ai/dsh-client-ui-layout": "^0.1.5-rc.2"
|
|
121
122
|
},
|
|
122
123
|
"devDependencies": {
|
|
123
|
-
"@deepseek-ai/cordis": "4.0.2",
|
|
124
|
-
"@deepseek-ai/dsh-agent": "0.1.
|
|
125
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.1.
|
|
126
|
-
"@deepseek-ai/dsh-client-ui-layout": "0.1.
|
|
127
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.1.
|
|
128
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.1.
|
|
129
|
-
"@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.
|
|
130
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.1.
|
|
131
|
-
"@deepseek-ai/dsh-compaction": "0.1.
|
|
132
|
-
"@deepseek-ai/dsh-agent-presets": "0.1.
|
|
133
|
-
"@deepseek-ai/dsh-host-webserver": "0.1.
|
|
134
|
-
"@deepseek-ai/dsh-llm": "0.1.
|
|
135
|
-
"@deepseek-ai/dsh-session": "0.1.
|
|
136
|
-
"@deepseek-ai/dsh-session-persistence": "0.1.
|
|
137
|
-
"@deepseek-ai/dsh-session-projection": "0.1.
|
|
138
|
-
"@deepseek-ai/dsh-settings": "0.1.
|
|
139
|
-
"@deepseek-ai/dsh-system-prompt": "0.1.
|
|
140
|
-
"@deepseek-ai/dsh-workspace": "0.1.
|
|
141
|
-
"@deepseek-ai/dsh-web-app": "0.1.
|
|
142
|
-
"@deepseek-ai/schemastery": "3.18.2",
|
|
124
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
125
|
+
"@deepseek-ai/dsh-agent": "^0.1.5-rc.2",
|
|
126
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.5-rc.2",
|
|
127
|
+
"@deepseek-ai/dsh-client-ui-layout": "^0.1.5-rc.2",
|
|
128
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-rc.2",
|
|
129
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.5-rc.2",
|
|
130
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.5-rc.2",
|
|
131
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.2",
|
|
132
|
+
"@deepseek-ai/dsh-compaction": "^0.1.5-rc.2",
|
|
133
|
+
"@deepseek-ai/dsh-agent-presets": "^0.1.5-rc.2",
|
|
134
|
+
"@deepseek-ai/dsh-host-webserver": "^0.1.5-rc.2",
|
|
135
|
+
"@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
|
|
136
|
+
"@deepseek-ai/dsh-session": "^0.1.5-rc.2",
|
|
137
|
+
"@deepseek-ai/dsh-session-persistence": "^0.1.5-rc.2",
|
|
138
|
+
"@deepseek-ai/dsh-session-projection": "^0.1.5-rc.2",
|
|
139
|
+
"@deepseek-ai/dsh-settings": "^0.1.5-rc.2",
|
|
140
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.2",
|
|
141
|
+
"@deepseek-ai/dsh-workspace": "^0.1.5-rc.2",
|
|
142
|
+
"@deepseek-ai/dsh-web-app": "^0.1.5-rc.2",
|
|
143
|
+
"@deepseek-ai/schemastery": "^3.18.2",
|
|
143
144
|
"@types/node": "^24.0.0",
|
|
144
|
-
"@types/react": "
|
|
145
|
-
"@types/react-dom": "
|
|
145
|
+
"@types/react": "^18.3.0",
|
|
146
|
+
"@types/react-dom": "^18.3.0",
|
|
146
147
|
"esbuild": "^0.28.2",
|
|
147
|
-
"react": "18.3.1",
|
|
148
|
-
"react-dom": "18.3.1",
|
|
148
|
+
"react": "^18.3.1",
|
|
149
|
+
"react-dom": "^18.3.1",
|
|
149
150
|
"typescript": "^5.9.2",
|
|
150
151
|
"vitest": "^4.0.0",
|
|
151
|
-
"zod": "4.4.3",
|
|
152
|
-
"@deepseek-ai/dsh-api-session-controller": "0.1.
|
|
153
|
-
"@deepseek-ai/dsh-api-workspace-controller": "0.1.
|
|
154
|
-
"@deepseek-ai/dsh-client-ui-chat": "0.1.
|
|
155
|
-
"@deepseek-ai/dsh-client-ui-session": "0.1.
|
|
156
|
-
"@deepseek-ai/dsh-client-ui-renderer": "0.1.
|
|
157
|
-
"@deepseek-ai/dsh-client-store": "0.1.
|
|
158
|
-
"@deepseek-ai/dsh-llm-retry": "0.1.
|
|
159
|
-
"happy-dom": "20.14.0",
|
|
160
|
-
"@deepseek-ai/dsh-session-title": "0.1.
|
|
152
|
+
"zod": "^4.4.3",
|
|
153
|
+
"@deepseek-ai/dsh-api-session-controller": "^0.1.5-rc.2",
|
|
154
|
+
"@deepseek-ai/dsh-api-workspace-controller": "^0.1.5-rc.2",
|
|
155
|
+
"@deepseek-ai/dsh-client-ui-chat": "^0.1.5-rc.2",
|
|
156
|
+
"@deepseek-ai/dsh-client-ui-session": "^0.1.5-rc.2",
|
|
157
|
+
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-rc.2",
|
|
158
|
+
"@deepseek-ai/dsh-client-store": "^0.1.5-rc.2",
|
|
159
|
+
"@deepseek-ai/dsh-llm-retry": "^0.1.5-rc.2",
|
|
160
|
+
"happy-dom": "^20.14.0",
|
|
161
|
+
"@deepseek-ai/dsh-session-title": "^0.1.5-rc.2",
|
|
162
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": "^0.1.5-rc.2"
|
|
161
163
|
}
|
|
162
164
|
}
|