← 返回列表
未验证
解析会话上下文为卡片,动态编辑并应用到会话
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/22 · 已提供中文文档
已弃用:由 dsh-context-console 取代;0.1.1 仍可用于回滚
综合分
28.2
GitHub 分
28.2
用户评分
—
★ Stars
1
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add anweat/dsh-assistant-message-forge该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-attachment@deepseek-ai/dsh-brand@deepseek-ai/dsh-invariants@deepseek-ai/dsh-llm@deepseek-ai/dsh-scope@deepseek-ai/dsh-session用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
dsh-assistant-message-forge(消息锻造台)
[!IMPORTANT]
维护状态:已停止功能更新。 本插件由
dsh-context-console
完整继承;新插件保留消息锻造、上下文卡片、sessionlog 导入与保守修复能力,
并新增轨迹墙、Prompt / Skill / MCP / Tools 管理和缓存观察。现有 0.1.1
版本继续保留供回滚使用,新部署请迁移到 dsh-context-console。
双面(Host + Client)DSH 插件:在会话区新增一个 消息锻造台 页签,核心是
详细上下文解析 → 记录 → 卡片化 → 动态编辑 → 开放修改:
DSH 消息锻造台
1. context/refresh 把当前会话完整解析成一张张 ContextCard
(turn/step 边界、user/assistant 消息、tool call/result、request header、
其他 log-only 事件;assistant/chunk 按轮折叠计数);
2. 解析结果连同卡片 overrides 一起 记录 到
$DSH_HOME/assistant-message-forge/context-.json;
3. 页签内按轮分组 卡片化 展示,含 surface 折叠状态(原始被替换 / 替换生效中);
4. 卡片可 动态编辑:文本/reasoning/provider/model/usage、工具名与
arguments、工具结果文本;编辑先保存为记录,也可 保存并应用到会话
(surface replace 直接改写当前会话中的原消息)。
此外保留 v1 能力:创建/修改/删除/注入 assistant 草稿、上传识别
session.jsonl(.zstd);导入区还会做完整性预览,并可把安全可解释的损坏
恢复为新的 session-repaired- 会话。
能力
| 能力 | 入口 | 说明 |
|---|---|---|
| 上下文解析+记录 | 会话上下文 → 刷新解析 | 全事件分类解析并落盘为 context 记录 |
| 上下文卡片化 | 会话上下文卡片流 | 按轮分组,边界/消息/工具/请求/其他卡片 + surface 状态 |
| 卡片动态编辑 | 卡片 → 编辑 → 保存记录 | 修改只写入记录 override,刷新解析不丢 |
| 应用到会话 | 卡片 → 保存并应用到会话 / 应用到会话 | user/assistant/tool-result 用 surface replace 替换原消息,模型上下文即时生效 |
| 添加/修改/删除草稿 | 草稿区按钮 | 草稿持久化在 drafts.json |
| 注入到会话 | 草稿行 → 注入到当前会话 | 完整合成轮 + flush |
| 导入识别 sessionlog | 底部文件选择 → 导入并识别 | zstd/JSONL 解码 + packed chunk 展开 + 事件识别 |
| 修复损坏 sessionlog | 完整性预览 → 创建修复会话 | 后写分支覆盖 + 官方 crash closer + 官方 seed 校验;原日志只读 |
| 复用识别结果 | 识别行 → 存为草稿 / 注入 | 保留 reasoning+text/provider/model/usage |
架构
浏览器客户端 DSH host (Node)
ForgeView(conversation.view 页签)
├─ ContextPanel:解析记录卡片流 + 动态编辑
├─ 草稿区:添加/修改/删除/注入按钮
├─ sessionlog 文件选择 + 识别/修复预览
└── connection.rpc.call(AMF_RPC_CHANNEL) ──▶ /dsh-assistant-message-forge
├─ DraftStore(drafts.json)
├─ ContextRecordStore(context-.json + overrides)
├─ parseContext / surface replace apply
├─ parse/repairSessionLogBytes(node:zlib zstd)
└─ injectMessage(session.append + flush)
- Host 半通过 ctx.connection.rpc.handle() 注册通用 Connection RPC 通道(loopback 信任边界),不修改 apiproxy 允许列表。
- Client 半注册 conversation.view 页签(scope: session),组件经 sessionId 标准 prop 拿到当前会话。
RPC 端点
通道:/dsh-assistant-message-forge
| endpoint | payload | 返回 |
|---|---|---|
| drafts/list | {} | AssistantDraft[] |
| drafts/save | { draft: { id?, title?, content, reasoning?, provider?, model? } } | 保存后的 AssistantDraft |
| drafts/delete | { id } | boolean |
| session/inject | { sessionId, message: { content, reasoning?, provider?, model?, usage? } } | { sessionId, turn, step, seq, messageId, flushed } |
| context/load | { sessionId } | 已记录的 ContextSnapshot 或 null |
| context/refresh | { sessionId } | 重新解析并记录后的 ContextSnapshot |
| records/update | { sessionId, key, patch } | 合并卡片 override 后的 ContextSnapshot |
| records/reset | { sessionId } | 丢弃全部 override 后的 ContextSnapshot 或 null |
| context/apply | { sessionId, key } | { sessionId, replacedSeq, newSeq, type, turn?, step?, flushed } |
| sessionlog/parse | { name, dataBase64 } | SessionLogParseResponse |
| sessionlog/repair-preview | { name, dataBase64 } | SessionLogRepairReport |
| sessionlog/repair-create | { name, dataBase64 } | { sessionId, flushed, report } |
错误统一走 RpcResult 的 { ok:false, error:{ code:'internal', ... } } 分支;参数校验失败、会话不存在、当前会话存在未闭合 turn 时都会返回可读 message。
卡片与修改语义
- 卡片解析覆盖:turn/start|end、step/start|end、user/message、
assistant/message(reasoning/text/provider/model/usage)、tool/call、
tool/result、request/header、request/context、其余 log-only 事件。
assistant/chunk 不逐条成卡,按轮统计 chunkCount。
- 记录优先:records/update 只改 override;之后 context/refresh 重新解析时
会合并 override,不会丢。records/reset 丢弃全部记录修改。
- 应用到会话 = surface replace:对 user/message、assistant/message、
tool/result 追加一个 surfaceOp: {op:'replace', start:seq, end:seq} 事件,
原节点被 shadow(模型 deriveMessages 用新内容),原始 append 事件仍保留在
日志与官方对话流中;卡片流会同时显示「原始已被替换」和「替换生效」两张卡。
- tool/result 特殊限制:DSH surface 校验只允许改写 tool-result 的
content;message id/source/isError/error wrapper 必须保持原值,因此
isError 在记录里可改,但应用时按原值写回。
- 会话正在运行(存在未闭合 turn)时注入和应用都会拒绝,避免破坏执行边界。
- 导入识别的投影:识别结果把 content 块投影为 text + reasoning 两条;
tool-call、image 等非文本块计数为 unsupportedBlocks,注入时不会携带。
- 传输上限:上传 base64 ≤ 128 MiB;解压后 ≤ 128 MiB;识别列表每批最多 200 条(truncated 标记)。
会话修复语义与边界
- 后写分支覆盖:物理日志出现 seq dsh web 是 --profile web 的硬别名;给自定义 profile 启动 Web 应用要用
pnpm dsh --profile --port ,并保证该 profile 的 dsh.profile.bundles
依次包含 @deepseek-ai/dsh-base、@deepseek-ai/dsh-web-app、dsh-assistant-message-forge。
开发期热更
- Client 半:client-hmr 会 watch 所有已挂载 bundle 的 lib/client.js。改完 src/client/** 后
pnpm run build,浏览器自动拉取新 rev(本插件构建约 1 秒)。
- Host 半:web profile 的 loader HMR 关闭;改 src/index.ts / src/store.ts /
src/sessionlog.ts 后需重启 dsh web。
E2E 冒烟
对运行中的实例执行按钮级验证(创建一次性会话 → 上下文刷新解析 →
助手卡片记录编辑/应用 → 丢弃记录修改 → 草稿添加/修改/注入 →
导入识别 → 损坏日志预览/创建修复会话 → 删除草稿):
$env:AMF_URL='http://127.0.0.1:3090'
$env:SESSION_LOG=$env:DSH_SESSION_JSONL
node scripts/e2e-smoke.mjs
脚本用 D:/codeproject/dsh-browser/node_modules/playwright(可用 PLAYWRIGHT_ROOT 覆盖),
先经 RPC 创建一个 workspace-attached 的一次性会话再逐项点击中文 UI,避免污染真实会话;
PLAYWRIGHT_CHANNEL=chrome 可显式使用本机 Chrome,AMF_HEADED=1 可打开可见浏览器窗口。扫码进群