@marsken/dsh-studio 0.1.13 → 0.1.15

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/README.md CHANGED
@@ -611,16 +611,16 @@ DSH 的 web 只有一张登录 cookie,所有人共用;所以平台自己记
611
611
  | 一次通过率 | 已完成的卡里,history 从没往回退过的比例 | 与页首「一次通过率」KPI **同一条定义**(`index.js` 的 `taskTimeline.backward`) |
612
612
  | 返工率 | 往回退过的卡 ÷ 名下卡数 | 同上 |
613
613
  | AI 失败 / 缺陷重开 | `agentFailures` / `reopenCount` 求和 | 单独列,**不进**返工率 |
614
- | 成本 | 未接入 | 平台还没有按卡/按项目的 token 记账,接上 usage 才会有数字 |
614
+ | 成本 | token 按会话日志逐次累加,钱 = token × 价目表 | `~/.dsh/sessions/*/studio-*/session.v4.jsonl.zstd` 的 `usage`;价目表在设置 → 成本与预算 |
615
615
 
616
616
  已知偏差:`task.expert` 会在换列时被列负责人覆盖,所以「卡数」看的是**当前负责**的卡,不是历史上派给过它的所有卡。
617
617
 
618
- 成本为什么还是「未接入」:宿主没有把 token usage 暴露给插件;会话目录里的 `session.v4.jsonl.zstd` 解出来是整份 JSON 快照,没有稳定可依赖的 usage 字段(`dsh-ui-usage-billing` 那类插件是自带解析器 + 价目表的)。要真算钱得先解决这两件事,已单开一张卡跟踪。
618
+ 成本怎么来的(0.1.12 起):宿主仍然没有把 usage 暴露给插件,所以改成自己读会话日志——`assistant/message` 上带 `usage`(入/出/缓存读/缓存写),模型名在请求上下文里继承。同一条消息里 usage 会出现两次(消息体 + 流式 chunk),只认消息上的那份。价目表要自己配,没配的模型花费记「未知」而不是 0。(`dsh-ui-usage-billing` 那类插件是自带解析器 + 价目表的)。要真算钱得先解决这两件事,已单开一张卡跟踪。
619
619
  ## 已知限制
620
620
 
621
621
  - 多维表格镜像(`baseToken` / `tableId`)只存配置,尚未实现写入。
622
- - GitLab 同步 Issue 与**关联 MR**(`/issues/:iid/related_merge_requests`),但不同步 MR 的评论与流水线状态;MR 的合并/关闭状态要等下一次同步才会反映到卡上。
623
- - 用例记录存在卡上(`task.cases`):2026-11-13 起有跨卡的**用例总览**页签,并支持**勾选一批接口用例批量跑**(结果回写到各自的卡、失败照旧开缺陷)。但还没有「回归套件」这个对象——固定的用例集合、一键重跑、历次通过率趋势都还没有,批量跑是临时勾选、跑完即散。
622
+ - GitLab 同步 Issue 与**关联 MR**(`/issues/:iid/related_merge_requests`);卡上挂 MR 后「从 GitLab 核对」会拉 MR 详情、`/changes` 与 `/pipelines`(流水线状态进 `coding.gitlab`)。**不同步 MR 的评论**;MR 的合并/关闭状态要等下一次同步才反映到卡上。
623
+ - 用例记录存在卡上(`task.cases`):跨卡的**用例总览**页签可以勾选批量跑(结果回写各自卡、失败照旧开缺陷),也支持**回归套件**(`/suite/*`:按规则或手选固定一批,一键重跑,`by` 记「套件:名字」)。但还没有「回归套件」这个对象——固定的用例集合、一键重跑、历次通过率趋势都还没有,批量跑是临时勾选、跑完即散。
624
624
  - 缺陷卡的严重级别默认 `P2`、优先级 `normal`:自动建卡不猜严重程度,由人或在评论里改。
625
625
  - 派单失败会记在 `/studio-api/integrations` 与卡片抽屉里,不会自动重试。
626
626
  - 集成健康现在会**落盘保留最近一次结果**(SQLite 的 `meta:side:integration-health`,不进 state、不涨 revision、不占快照):重启 dsh-web 后四条通道不再回到「还没用过」。仍然只是「最近一次」,没有按小时/按天的长期趋势(要趋势还得上采集)。
@@ -766,7 +766,7 @@ node /tmp/verify-dashboard.mjs # 工作台风险计数 / flaky 不开缺陷 /
766
766
 
767
767
  - `config.costs = { budgetRuns, budgetHours, warnAt }`(默认 500 次 / 80 小时 / 80%)。
768
768
  - `GET /costs` 返回 `budget: { runs, hours, runRate, hourRate, level, hint }`,`level` 为 `ok|warn|over`;效能页「AI 执行成本」下方是一条预算进度条,超 `warnAt` 变黄、超 100% 变红。
769
- - 口径仍是「派单次数 + 机上时长」,宿主没有回传 token 用量。
769
+ - 口径分两层:**次数 + 机上时长**(派单日志)与 **token + 花费**(会话日志 + 价目表),两者口径不同,别混着看。
770
770
 
771
771
  ### 集成失败升级
772
772
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  | 项 | 值 |
8
8
  | --- | --- |
9
- | dsh-studio | `package.json` `version: 0.1.13` |
9
+ | dsh-studio | `package.json` `version: 0.1.15` |
10
10
  | DeepSeek Harness | `0.2.2-rc.1`(`dsh --version`) |
11
11
  | Node | `v24.22.2`(Linux 目标机);本机 Windows `v24.19.0` |
12
12
  | 目标系统 | Ubuntu 24.04,`dsh web` 监听 `18080`,nginx `:80` 反代并注入 `dsh-auth-*` cookie |
package/docs/publish.md CHANGED
@@ -127,6 +127,8 @@ token 只写进临时 npmrc(放在仓库外或 `tmp/` 且不提交),发完
127
127
  | --- | --- | --- |
128
128
  | `0.1.0` | 2026-11-13 | 首个公开版:看板 / 需求 / 用例回归 / 效能 / 设计评审四期 |
129
129
  | `0.1.1` | 2026-11-13 | 补三张 README 截图(npm 页可看图);默认值与文档去掉公司内网信息 |
130
+ | `0.1.15` | 2026-11-15 | 清掉三处过期的「已知限制」 |
131
+ | `0.1.14` | 2026-11-15 | 修正成本口径的过期文案 |
130
132
  | `0.1.13` | 2026-11-15 | 价目表编辑器 + 未配价目模型清单 |
131
133
  | `0.1.12` | 2026-11-15 | 真实 token 成本(读会话日志 + 价目表计价) |
132
134
  | `0.1.11` | 2026-11-15 | 需求变更影响面(接口 + 面板)、可跑用例口径修正、成本口径文档 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marsken/dsh-studio",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "type": "module",
5
5
  "description": "DSH Studio: role-based multi-agent workspace (product / architect / developer / QA) with a live work board, GitLab + Feishu connection settings, all configurable from the web GUI.",
6
6
  "main": "index.js",
@@ -295,7 +295,7 @@ export function runSummary() {
295
295
  byModel: sort(byModel),
296
296
  byPromptVersion: sort(byPrompt),
297
297
  days: [...byDay.values()].sort((a, b) => (a.day < b.day ? -1 : 1)).slice(-14),
298
- note: '宿主没有回传 token 用量,这里统计的是派单次数与执行时长;成本按你们自己的模型单价乘次数即可。',
298
+ note: 'token 用量读自 studio-* 会话日志(每次模型调用都记一次);钱要显示得先在「成本与预算」里配价目表,没配的模型会单独列出来。',
299
299
  }
300
300
  }
301
301
 
@@ -118,7 +118,7 @@ export function buildQuality(state, runs) {
118
118
  },
119
119
  cost: {
120
120
  wired: false,
121
- note: '成本还没接真实 token usage:平台目前只记录派单次数与耗时,没有按卡/按项目记账。接上 usage 之后这里才会有数字。',
121
+ note: '成本按真实 token 用量算:读 studio-* 会话日志,按卡 / 按专家汇总;价目表没配时只给 token,花费显示未知。',
122
122
  },
123
123
  }
124
124
  }
@@ -46,7 +46,7 @@ export async function handleInsightsRoute({ method, route, req, res, store, url
46
46
  return true
47
47
  }
48
48
  if (method === 'GET' && route === '/quality') {
49
- // AI 质量:派单量 / 一次通过率 / 返工率 / 平均耗时。成本未接入(见 README 口径)。
49
+ // AI 质量:派单量 / 一次通过率 / 返工率 / 平均耗时;成本见 /costs 的 usage(读会话日志 + 价目表)。
50
50
  host.sendJson(res, 200, { ok: true, quality: buildQuality(store.snapshot(), runSummary()) })
51
51
  return true
52
52
  }