Commit Graph
22 Commits
Author SHA1 Message Date
jiangchen 4e666033d2 feat(host): 镜像落盘缓存 —— 重启后镜像和累计指标都还在('没有内容映射'的根治)
问题:DSH 重启后内存里的镜像/计数清空,而活动会话的 .jsonl.zstd 还没落盘(宿主是批量写),
所以镜像一直空着。
做法:插件每 3 秒把 最近 40 行消息 + 标题 + 累计计数(turns/steps/out/in/cacheRead/decodeMs/lastTps)
写进 %DSH_HOME%/float-window/mirror-cache.json,apply 时恢复;dispose 时再存一次。
实测:建会话发两条消息 → 重启实例 → rows=2、turns=2、steps=2,消息原文都在。
另修:快照在'宿主活动会话列表里还没有该会话'时也照算指标(否则恢复出来的数字不显示);
清理 tick 计数器的双自增 bug(导致缓存保存节奏错乱)。
2026-09-27 18:22:23 +08:00
jiangchen e00d73be82 fix(host): 根因——spawn 的 detached:true 让 PowerShell 起来即退;feat: 三种跟随方式(默认跟随前台)
根因(对照实验):spawn('powershell', [...], {detached:true}) 在 Windows 上 → 子进程 exit 0、
脚本一行没跑(日志里连 start 都没有),表现就是『点打开没反应』;detached:false 完全正常。
现在 spawnShell:绝对路径优先 + 不 detached + 等心跳确认,失败把原因写进 status notes。

跟随方式(用户需求:切到哪个会话就跟哪个,且可配置):
- front(默认)跟随前台:客户端半订阅 uiSession.current,会话一换就上报 /window{action:front}
- latest 跟随最新事件;pinned 固定在 ⇄ 里选中的会话
设置入口:设置→悬浮窗(模式三选一);浮窗 ⇄ 里点会话=切到 pinned
快照新增 follow/front 字段;/window 支持 action=follow|front
2026-09-27 17:39:15 +08:00
jiangchen 3205aaea76 feat: 缓存命中率有来源了(assistant/chunk 的 usage 事件)+ DSH 启动自动拉起浮窗
挖到真源:事件流里 assistant/chunk 带 chunk.type='usage'
  {inputTokens,outputTokens,cacheReadTokens,reasoningTokens}
从此算出真实指标(不再依赖 tokenMeter 的估算):
  缓存命中率 = cacheRead/(input+cacheRead)     实测 0.9976(与 App 状态栏 99% 一致)
  总量       = output + input + cacheRead      实测 88.99M
  tok/s      = outputTokens/该步耗时            实测 37.3
  上下文占用 = 最后一步的 input+cacheRead / 窗口(不是历史累加)  实测 56.3%
插件与镜像桥两侧都接上了;镜像桥改为跟随插件认定的当前会话。

另:autoOpen(默认开)——DSH 启动后 1.5s 若浮窗没在跑就自动拉起(用户选定)。
2026-09-27 17:29:51 +08:00
jiangchen f234213297 fix(host): 修掉『点打开没反应』——投递命令后必须等心跳确认,否则重新拉起
真机现象:DSH 重启会把浮窗进程一起带走(它是 DSH 进程树的后代),但 alive.json 心跳还新鲜,
插件以为它活着 → 只往 command.json 投了个 open,发给了已经不存在的进程,窗口当然不出来。
现在 controlFloat 投递后轮询心跳(最多 1.6s):没更新就判定它已死并重新 spawn(隐藏窗口)。
另:上下文占比兜底按 1M 生效,真机实测 ctx=0.176。
2026-09-27 17:25:47 +08:00
jiangchen 6ee713b145 feat: 独立镜像桥(免 DSH 重启出镜像/指标)+ 去掉 IP 显示 + 上下文占比兜底
- tools/mirror-bridge.mjs:直接读 %DSH_HOME%/sessions/**/session.jsonl.zstd(多帧 zstd 按魔数切帧解)
  与 storages/session_projcache.json,算出 消息行/轮/步/tok·s⁻¹/token/上下文占比 并写
  snapshot-bridge.json(插件缺字段时由浮窗补齐);插件在写 snapshot.json 时它不抢
- 浮窗标题栏不再显示 endpoint IP,只在未连接时显示状态词;数据来自桥时指标带 ≈
- host: contextUsed 兜底按 1M 上下文算(真机 sessionProjection=n,拿不到上下文窗口)
- 实测:snapshot -> page rows=40 turns=1 steps=67 tok=214639;outbox watch 切会话生效
2026-09-27 17:20:14 +08:00
jiangchen cb57f75577 fix(host): 起浮窗不再经 cmd/start(那个黑控制台窗口);feat(shell): 相机按钮一键切换截图隐藏 + 标准齿轮设置图标
- 黑窗根因:spawnShell 用 cmd /c start 跑 .cmd,start 会新建控制台,批处理里的中文还被按 GBK 解析成乱码报错。
  改成 spawn('powershell.exe', [-WindowStyle Hidden -File ...]) detached + windowsHide,无窗启动
- 标题栏新增相机按钮:一键切换『截图时隐藏本窗』(高亮=隐藏生效),设置面板里那项同步;
  开发期要截图给别人看,点一下就可见
- 设置图标从'小太阳'换成标准齿轮
2026-09-27 17:07:35 +08:00
jiangchen 7d1417fa1c fix(shell): 去掉所有窗口级玻璃(白框/黑块根因);feat: 多会话切换 + 文件桥(桌面壳 HTTP 网关 403 的解法)
白框根因:SetWindowCompositionAttribute(Win10 亚克力) / DwmExtendFrameIntoClientArea(客户区变玻璃)
/ WebView2 Transparent 背景 三者在真机上都会让 8px 边环露白、WebView2 变黑。现在窗口永远由
应用自绘深色,背景效果只作为页面侧半透明(不再碰 DWM 与窗口 alpha)。

新增:
- 会话切换:标题栏 ⇄ 按钮 + 列表(会话标题/轮/步/消息数,可'跟随最新');宿主侧 pinnedSessionId,
  被选中的会话不再被其它会话的事件抢走;snapshot 里带 sessions[]
- 文件桥:桌面壳对未认证请求一律 403(实测 6 种请求形态),浮窗改走文件——宿主每秒写 snapshot.json,
  浮窗渲染;浮窗的 chat/watch/newSession 写 outbox.json,宿主轮询执行。端到端实测通过
- 编码修复:快照按显式 UTF-8 读(PS 5.1 Get-Content -Raw 会按 GBK 读坏中文 JSON);
  outbox 写 UTF-8 无 BOM
2026-09-27 17:02:07 +08:00
jiangchen 387f9a0012 feat: 页面按钮 + 设置分区 + 修掉同步注册事故
- fix(host): 工具/设置注册从 async 续体挪回 apply 同步段 —— cordis 的 ctx 在 apply 返回后失效,
  之前真机报 'cannot create effect on inactive context',导致 float_window 没装上
- feat(host): tapIndex 往 index.html 注入『悬浮窗』按钮(自带状态点/看门狗/被 SPA 重建后自动补回),
  实测带 auth cookie 拉首页 HTML 已含该按钮;config.button=false 可关
- feat(client): 客户端半 lib/client.js(ModuleLoader 格式,无需构建)注册 sidebar.footer.action
  与 settings.section(设置→悬浮窗整页:打开/全屏/固定/锁定/隐藏/关闭 + 会话状态);接管后摘掉注入的备用按钮
- package.json: exports['./client'] + dsh.client{inject,platform}
2026-09-27 16:26:40 +08:00
jiangchen 5f258e8308 docs: 补 15-17 号踩坑(defineTool 必须转换参数 schema、具名导出被 default 吞、上下文窗口来自 request/context) 2026-09-27 16:09:30 +08:00
jiangchen 60474fceea fix(host): 修掉会打断每一轮的致命 bug —— 0.1.7 的工具参数必须经 defineTool 转成 JSON Schema
- 事故现象:每轮 Invalid schema for function 'float_window': schema must be a JSON Schema of 'type: object', got 'type: null'
- 根因:直接注册 DSL 对象,参数未做 parameterSchemaSpecToJsonSchema 转换,provider 收到 parameters.type=null
- 修复:解析 @deepseek-ai/dsh-tools 的 defineTool 后再注册;解析不到就跳过注册;注册前自检 type==='object'
- 自检证据:状态文件新增 toolSchema 与 toolSchemas(从真实 request/header 抓的模型视角 schema)
  实测 0.1.7:float_window parametersType=object, required=[action]
- 顺带:request/context 的 contextWindow 用于上下文用量;Config 增加 tool 开关
2026-09-27 16:08:45 +08:00
jiangchen 8b74c2d2b4 feat(host): 导出 schemastery Config -> DSH 设置页出现悬浮窗配置卡片;实测 profile config 经 apply(ctx,config) 下发到浮窗;README 补设置入口说明 2026-09-27 14:52:08 +08:00
jiangchen c3ca013d20 feat(host): /window 路由与 float_window 工具共用同一段动作逻辑;smoke-host 升级为 20 条断言的映射/路由测试(真实抓包形状),实测 open 能拉起浮窗 2026-09-27 14:50:01 +08:00
jiangchen 5ddca41b8a feat(host): 版本自适应宿主调用(0.1.7 sessionController / 0.1.0 apiProxy),在 DSH Desktop 内置 0.1.7-rc.2 上实测镜像与发消息全通 2026-09-27 14:46:07 +08:00
jiangchen a6d2c828a8 fix(host): 修掉会杀死 DSH 的 resolveModelInfo unhandled rejection;按真实事件结构(event.data)重写镜像映射;标题栏与指标显示打磨 2026-09-27 14:37:50 +08:00
jiangchen f708c52e3e feat(shell): open 动作会前置并激活已有浮窗(Agent 调 float_window open 时不再是无操作) 2026-09-27 14:25:50 +08:00
jiangchen 5aa92d50da feat(host): 浮窗聊天框打通(apiProxy.sessions.prompt)+ 会话控制路由 + 事件直方图自检 2026-09-27 14:25:35 +08:00
jiangchen b58bde162f feat(host): 指标改为事件计数兜底 + 自检状态文件;实测真实实例中工具注册成功
- 隔离实例(独立 DSH_HOME + 最小 profile)实测:plugin-status.json tool=true,无加载错误
- 服务探测:sessions/tools/tokenMeter/llm/shell/sandboxPolicy/webServer 均可用;本 profile 无 settings 服务
- 轮/步/tok-s 改为从 session/event 自行累计(不依赖 session-projection),tokenMeter 字段首次调用记入状态文件便于核对
2026-09-27 14:19:38 +08:00
jiangchen baa4e86058 fix(shell): 修复页面按钮全失效(param 名不能叫 args)+ -NoExclude 不再成为默认;README 补验证方法与踩坑 2026-09-27 14:14:23 +08:00
jiangchen 90674cf165 fix(host): ctx.set 前必须 ctx.provide,否则整个插件树加载失败、DSH 起不来(隔离实例实测复现;修复后正常启动并写出 endpoint.json 与 HTTP 路由) 2026-09-27 14:11:06 +08:00
jiangchen 0c730f424c fix(shell): -NoExclude 只作用于本次运行,不再写回状态文件(避免调试后默认失去抓屏隐身) 2026-09-27 14:04:51 +08:00
jiangchen 472bbe243e feat(host): 注册 DSH 设置命名空间(设置→插件 里的悬浮窗卡片)
- ctx.settings.register('dsh-float-window', schema) best-effort:schemastery 解析不到时只跳过
- 设置变更通过 SSE 广播给浮窗
- 说明:link: 安装的插件解析不到 profile 依赖时降级,浮窗自带设置面板仍然可用
2026-09-27 14:04:28 +08:00
jiangchen 8e4a648465 feat: DSH 悬浮窗 v0.1.0 — 原生置顶小窗 + 会话镜像 + 抓屏隐身
- shell: WinForms + WebView2 原生壳(无边框/置顶/固定位置/锁定尺寸/全屏/自适应缩放/截图排除)
- shell/ui.html: 自适应界面(工具栏、会话镜像区、底部聊天框、轮/步/tok/s/MTOK/缓存命中/上下文状态条、外观设置)
- lib/host.js: DSH 插件 Host 半(endpoint 写入、SSE 会话与指标快照、float_window Agent 工具)
- tools: WebView2 SDK 拉取、BOM 修复、Host 冒烟测试
- README: 架构、实测结论(WDA_EXCLUDEFROMCAPTURE、玻璃模式、DPI、WebView2 加载)
2026-09-27 14:02:58 +08:00