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 CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  - Node.js `22.19.x` 或 `>= 24`;
14
14
  - pnpm;
15
- - 与项目当前依赖匹配的 DSH。本版本面向 DSH `0.1.2-rc.1`。
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
- - 同步 `pnpm-lock.yaml`;本仓库不维护并行的 `package-lock.json`;
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.2-rc.1` and requires Node.js `>= 24`. DSH is still a release candidate, so upgrades may require changes in the centralized adapter layer described below.
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.2-rc.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
- This update migrates to the split Client services, `useChat` snapshots, settings registration, and session projection APIs, and updates message action row targeting. Dependencies and the lockfile target `0.1.2-rc.1` without the retired `dsh-client-runtime`. For an existing local linked install, rebuild, restart DSH, and reload the page to load both the new Host and Client.
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.2-rc.1`; pre-release API or DOM changes can require adapter updates.
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 supports DSH persistence locations of kind `jsonl` only.
250
- - Unloading a live session prefers tracked public Agent handles. An already-live untracked session uses a guarded compatibility path for the current DSH registry internals, so this path deserves special review on DSH upgrades.
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.2-rc.1`,要求 Node.js `>= 24`。DSH 仍是 RC 版本,升级后可能需要调整下文所述的集中适配层。
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.2-rc.1` 兼容的 Web profile
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
- 本次适配迁移到新版拆分后的 Client 服务、`useChat` 聊天快照、设置注册和会话投影接口,并更新消息操作行定位。依赖与锁文件统一到 `0.1.2-rc.1`;不再加载已停止更新的 `dsh-client-runtime`。已有本地链接安装在重新构建后,需要重启 DSH 并刷新页面以加载新的 Host 和 Client。
255
+ 开发与宿主依赖统一使用 `^0.1.5-rc.2`,锁文件记录当前已验证版本。已适配新版会话格式、消息来源字段、`main.conversation` 插槽,以及 JSONL 后端的持久化快照和定位能力。已有本地链接安装在重新构建后,需要重启 DSH 并刷新页面以加载新的 Host 和 Client。
245
256
 
246
- - 当前依赖面向 DSH `0.1.2-rc.1`;预发布 API 或 DOM 变化可能要求更新 adapter。
257
+ - 当前依赖面向 DSH `0.1.5-rc.2`;预发布 API 或 DOM 变化可能要求更新 adapter。
247
258
  - DSH More 的产品内文案目前以简体中文为主;对 DSH 原生 Copy/Archive 元素的定位同时识别中英文标签。
248
259
  - 消息操作只面向仍在当前 model surface 中的普通用户消息和助手消息;编辑要求所属轮次已经完成。
249
- - 永久删除只支持 DSH 返回的 `jsonl` 持久化定位。
250
- - 卸载实时会话时优先使用插件追踪到的公开 Agent handle。对于插件启用前已经加载、未被追踪的会话,当前版本会走受保护的 DSH registry 内部兼容路径,因此升级 DSH 时应重点复核。
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 = source.surface.nodes.filter((seq) => !deleted.has(seq)).map((seq) => source.eventAt(seq)).filter((event) => event !== void 0 && source.deriveEventMessage(event) !== null);
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 event of survivors) {
513
- if (event.type === "user/message" && event.data.source.kind === "user" && turnOpen) closeTurn();
514
- if (event.type === "assistant/message" && assistantSeen) closeStep();
515
- openStep();
516
- if (event.type === "user/message") {
517
- rebuilt.append("user/message", event.data, { surfaceOp: "append" });
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 (event.type === "assistant/message") {
521
- rebuilt.append("assistant/message", {
522
- // Keep the durable stream and settlement metadata required by DSH 0.1.5.
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 (event.type === "tool/result") {
537
- const callId = event.data.message.source.callId;
538
- if (!loggedCalls.has(callId)) {
539
- rebuilt.append("tool/call", { turn, step, callId: event.data.message.source.callId, name: "restored-tool", arguments: "{}" });
540
- loggedCalls.add(callId);
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 location = typeof ctx.sessionPersistence.locate === "function" ? ctx.sessionPersistence.locate(header2) : void 0;
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
- * DSH 0.1.2-rc.1 compatibility seam. Keep the native registration identity,
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-more",
3
3
  "description": "Practical patches for missing DSH Web context and history controls",
4
- "version": "0.0.7",
4
+ "version": "0.0.9",
5
5
  "entry": {
6
6
  "name": "dsh-more",
7
7
  "inject": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-more",
3
- "version": "0.0.7",
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.2-rc.1",
93
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-rc.1",
94
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-rc.1",
95
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.2-rc.1",
96
- "@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.2-rc.1",
97
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-rc.1",
98
- "@deepseek-ai/dsh-compaction": "^0.1.2-rc.1",
99
- "@deepseek-ai/dsh-agent-presets": "^0.1.2-rc.1",
100
- "@deepseek-ai/dsh-host-webserver": "^0.1.2-rc.1",
101
- "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
102
- "@deepseek-ai/dsh-session": "^0.1.2-rc.1",
103
- "@deepseek-ai/dsh-session-persistence": "^0.1.2-rc.1",
104
- "@deepseek-ai/dsh-session-projection": "^0.1.2-rc.1",
105
- "@deepseek-ai/dsh-settings": "^0.1.2-rc.1",
106
- "@deepseek-ai/dsh-system-prompt": "^0.1.2-rc.1",
107
- "@deepseek-ai/dsh-workspace": "^0.1.2-rc.1",
108
- "@deepseek-ai/dsh-web-app": "^0.1.2-rc.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.2-rc.1",
114
- "@deepseek-ai/dsh-api-workspace-controller": "^0.1.2-rc.1",
115
- "@deepseek-ai/dsh-client-ui-chat": "^0.1.2-rc.1",
116
- "@deepseek-ai/dsh-client-ui-session": "^0.1.2-rc.1",
117
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-rc.1",
118
- "@deepseek-ai/dsh-client-store": "^0.1.2-rc.1",
119
- "@deepseek-ai/dsh-llm-retry": "^0.1.2-rc.1",
120
- "@deepseek-ai/dsh-session-title": "^0.1.2-rc.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.2-rc.1",
125
- "@deepseek-ai/dsh-client-ui-conversation": "0.1.2-rc.1",
126
- "@deepseek-ai/dsh-client-ui-layout": "0.1.2-rc.1",
127
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.2-rc.1",
128
- "@deepseek-ai/dsh-client-ui-settings": "0.1.2-rc.1",
129
- "@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.2-rc.1",
130
- "@deepseek-ai/dsh-client-ui-slots": "0.1.2-rc.1",
131
- "@deepseek-ai/dsh-compaction": "0.1.2-rc.1",
132
- "@deepseek-ai/dsh-agent-presets": "0.1.2-rc.1",
133
- "@deepseek-ai/dsh-host-webserver": "0.1.2-rc.1",
134
- "@deepseek-ai/dsh-llm": "0.1.2-rc.1",
135
- "@deepseek-ai/dsh-session": "0.1.2-rc.1",
136
- "@deepseek-ai/dsh-session-persistence": "0.1.2-rc.1",
137
- "@deepseek-ai/dsh-session-projection": "0.1.2-rc.1",
138
- "@deepseek-ai/dsh-settings": "0.1.2-rc.1",
139
- "@deepseek-ai/dsh-system-prompt": "0.1.2-rc.1",
140
- "@deepseek-ai/dsh-workspace": "0.1.2-rc.1",
141
- "@deepseek-ai/dsh-web-app": "0.1.2-rc.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": "~18.3.0",
145
- "@types/react-dom": "~18.3.0",
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.2-rc.1",
153
- "@deepseek-ai/dsh-api-workspace-controller": "0.1.2-rc.1",
154
- "@deepseek-ai/dsh-client-ui-chat": "0.1.2-rc.1",
155
- "@deepseek-ai/dsh-client-ui-session": "0.1.2-rc.1",
156
- "@deepseek-ai/dsh-client-ui-renderer": "0.1.2-rc.1",
157
- "@deepseek-ai/dsh-client-store": "0.1.2-rc.1",
158
- "@deepseek-ai/dsh-llm-retry": "0.1.2-rc.1",
159
- "happy-dom": "20.14.0",
160
- "@deepseek-ai/dsh-session-title": "0.1.2-rc.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
  }