dsh-task-ledger 0.0.124 → 0.0.125

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/dist/client.js CHANGED
@@ -53261,7 +53261,8 @@ window.__ModuleLoader__.load({
53261
53261
  claim: !mine && task.status === "open",
53262
53262
  resume: mine,
53263
53263
  finish: mine,
53264
- release: mine
53264
+ release: mine,
53265
+ cancel: mine || task.status === "open"
53265
53266
  };
53266
53267
  }
53267
53268
  /** 六档菜单命中。标记(`stale` / `overdue` / `backlog`)都由 skill 判定,前端只读布尔。 */
@@ -53608,10 +53609,12 @@ body{
53608
53609
  --dtl-business-soft:color-mix(in srgb,var(--dtl-business) 14%,transparent);
53609
53610
  --dtl-danger-soft:color-mix(in srgb,var(--dtl-danger) 8%,transparent);
53610
53611
 
53611
- /* ── 趋势图三色(2026-10-29 接回图表时恢复)─────────────────────
53612
- 完成 = 蓝(--dtl-business)、未结 = 琥珀、新增 = 灰(fg-dim,明暗自带) */
53612
+ /* ── 趋势图三色(2026-10-29 用户定稿)───────────────────────────
53613
+ 结案 = 绿、新增 = 蓝、未结 = 琥珀;三色直接取核心 alias
53614
+ (state-success-primary / state-business-primary / state-warn-primary),不手写色值 */
53615
+ --dtl-chart-done:var(--dtl-success);
53613
53616
  --dtl-chart-open:var(--dtl-warning);
53614
- --dtl-chart-added:var(--dtl-fg-dim);
53617
+ --dtl-chart-added:var(--dtl-business);
53615
53618
 
53616
53619
  /* ── 交互底 ──────────────────────────────────────────────────── */
53617
53620
  /* 卡 / 行 hover 高亮:淡蓝(灰高亮在卡底上几乎看不出来) */
@@ -53711,9 +53714,10 @@ body[data-ds-dark-theme]{
53711
53714
  padding:var(--dtl-space-4);}
53712
53715
  .dtl-trend__legend{display:flex;align-items:center;flex-wrap:wrap;gap:var(--dtl-space-3);
53713
53716
  font-size:var(--dtl-font-xs);color:var(--dtl-fg-3);}
53714
- .dtl-trend__dot{display:inline-block;width:8px;height:8px;margin-right:4px;border-radius:var(--dtl-radius-xs);
53717
+ /* 图例色块:直角方块,与柱子同一造型(用户 2026-10-29:不要圆角) */
53718
+ .dtl-trend__dot{display:inline-block;width:8px;height:8px;margin-right:4px;border-radius:0;
53715
53719
  vertical-align:middle;}
53716
- .dtl-trend__dot--done{background:var(--dtl-business);}
53720
+ .dtl-trend__dot--done{background:var(--dtl-chart-done);}
53717
53721
  .dtl-trend__dot--open{background:var(--dtl-chart-open);}
53718
53722
  .dtl-trend__dot--added{background:var(--dtl-chart-added);}
53719
53723
  /* 「只看我的」:贴图例右侧的小复选框(原生控件 + accent-color,不自绘皮肤) */
@@ -53735,11 +53739,12 @@ body[data-ds-dark-theme]{
53735
53739
  .dtl-trend__col{position:relative;flex:1 1 0;min-width:0;display:flex;flex-direction:column;
53736
53740
  justify-content:flex-end;padding-bottom:14px;}
53737
53741
  .dtl-trend__bars{display:flex;align-items:flex-end;justify-content:center;gap:1px;flex:1 1 auto;min-height:0;}
53738
- /* 柱宽 5px、无圆角(用户 2026-10-17:「太粗、不要圆弧」);非零柱给 2px 下限 */
53739
- .dtl-trend__bar{position:relative;width:5px;flex:none;min-height:2px;
53742
+ /* 柱宽 7.5px、无圆角(2026-10-17「不要圆弧」;2026-10-29 用户要求再加粗到 1.5 倍,5 → 7.5);
53743
+ 非零柱给 2px 下限 */
53744
+ .dtl-trend__bar{position:relative;width:7.5px;flex:none;min-height:2px;
53740
53745
  transition:filter var(--dtl-dur-fast) var(--dtl-ease);}
53741
- /* 完成柱要盖在隔壁更高的柱子上:柱顶数值会伸出 5px 柱宽,否则被邻居压掉 */
53742
- .dtl-trend__bar--done{background:var(--dtl-business);z-index:1;}
53746
+ /* 结案柱要盖在隔壁更高的柱子上:柱顶数值会伸出柱宽,否则被邻居压掉 */
53747
+ .dtl-trend__bar--done{background:var(--dtl-chart-done);z-index:1;}
53743
53748
  .dtl-trend__bar--open{background:var(--dtl-chart-open);}
53744
53749
  .dtl-trend__bar--added{background:var(--dtl-chart-added);}
53745
53750
  /* hover 整列三根一起提亮(用户 2026-10-17:不是只亮蓝的一根) */
@@ -54032,7 +54037,7 @@ body[data-ds-dark-theme]{
54032
54037
  //#region src/client/task-row.ts
54033
54038
  /**
54034
54039
  * 任务行(宿主**无表格件** ⇒ 自绘):整行一张卡,样式照抄 dispatch-table 任务配置卡:
54035
- * 左缘 6×36 状态条 + 标题行 + 第二行工作区/标签;右侧灰字时长;悬停出「继续 / 结束 / 释放」;
54040
+ * 左缘 6×36 状态条 + 标题行 + 第二行工作区/标签;右侧灰字时长;悬停出「继续 / 完成 / 释放 / 取消」;
54036
54041
  * 最右常驻「查看」放大镜钮。
54037
54042
  *
54038
54043
  * 「我的待办」卡只摆异常标记(进行中只靠左缘色条,不再重复一枚)。
@@ -54139,6 +54144,7 @@ body[data-ds-dark-theme]{
54139
54144
  const resumeButton = tipBtn((0, react$1.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutlineRegular, { size: 14 }), "actionResume", "tipResume");
54140
54145
  const finishButton = tipBtn((0, react$1.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineRegular, { size: 14 }), "actionFinish", "tipFinish");
54141
54146
  const releaseButton = tipBtn(null, "actionRelease", "tipRelease");
54147
+ const cancelButton = tipBtn(null, "actionCancel", "tipCancel");
54142
54148
  const tagOf = (which, tip) => {
54143
54149
  const text = statusLabel(which, t);
54144
54150
  return (0, react$1.createElement)(Tag, {
@@ -54181,7 +54187,6 @@ body[data-ds-dark-theme]{
54181
54187
  variant: "link",
54182
54188
  size: "sm",
54183
54189
  maxWidth: 180,
54184
- title: t("filterByOwner", { name: ownerName }),
54185
54190
  onClick: () => focusOwner(ownerUuid, ownerName)
54186
54191
  }, `@${ownerName}`);
54187
54192
  const handleRowClick = (event) => {
@@ -54204,25 +54209,27 @@ body[data-ds-dark-theme]{
54204
54209
  text: row.task.workspace.title,
54205
54210
  tone: "person",
54206
54211
  maxWidth: 200,
54207
- tip: t("filterByWorkspace", { name: row.task.workspace.title }),
54208
54212
  onClick: () => setQuery({ workspace: row.task.workspace.id })
54209
- }), (0, react$1.createElement)("span", { className: "dtl-taskrow__meta" }, metaText), (0, react$1.createElement)("span", { className: "dtl-taskrow__actions" }, actions.claim ? claimButton : null, actions.resume ? resumeButton : null, actions.finish ? finishButton : null, actions.release ? releaseButton : null, copyButton, actions.view ? viewButton : null)));
54213
+ }), (0, react$1.createElement)("span", { className: "dtl-taskrow__meta" }, metaText), (0, react$1.createElement)("span", { className: "dtl-taskrow__actions" }, actions.claim ? claimButton : null, actions.resume ? resumeButton : null, actions.finish ? finishButton : null, actions.release ? releaseButton : null, actions.cancel ? cancelButton : null, copyButton, actions.view ? viewButton : null)));
54210
54214
  }
54211
54215
  //#endregion
54212
54216
  //#region src/client/trend-chart.ts
54213
54217
  /**
54214
- * 首页趋势图(右上卡):近 8 周 × 三根细柱 = 完成 / 未结 / 新增。
54218
+ * 首页趋势图(右上卡):近 8 周 × 三根细柱 = 结案 / 未结 / 新增。
54219
+ *
54220
+ * 术语(2026-10-29 用户拍板):**结案 = 完成 + 取消**(上位词),图上的「结案」柱就是两者之和;
54221
+ * 悬停时括号拆开「完成 X · 取消 Y」。skill 侧的桶仍是 `done` / `cancelled` 两个独立数,这里只做相加。
54215
54222
  *
54216
54223
  * 数据口径**全由 skill 算好**(`stats --trend week --last 8w --by-owner`,host 已跨工作区求和):
54217
- * 完成按结案时间、新增按**创建人**、未结是「该周结束时仍未结案」(待认领 + 进行中合成一个数)。
54224
+ * 结案按结案时间、新增按**创建人**、未结是「该周结束时仍未结案」(待认领 + 进行中合成一个数)。
54218
54225
  *
54219
54226
  * 「只看我的」(2026-10-29 用户定稿):勾上 = 我的,不勾 = 所有;两套数随快照一起回来 ⇒ 勾选零请求。
54220
- * 按人口径 = skill 的 per-owner:`added` 按 creator(我提的)、`done` / `open` 按 owner(我负责的)。
54227
+ * 按人口径 = skill 的 per-owner:`added` 按 creator(我提的)、`done` / `cancelled` / `open` 按 owner(我负责的)。
54221
54228
  *
54222
54229
  * 画法(2026-10-17 参考图口径):
54223
- * - 柱宽 5px、组内 1px、**无圆角**;柱高百分比(祖先链有确定高度,见 ui.ts 的注释);
54230
+ * - 柱宽 7.5px、组内 1px、**无圆角**;柱高百分比(祖先链有确定高度,见 ui.ts 的注释);
54224
54231
  * - y 轴三档刻度(0 / 半峰 / 峰)+ 淡网格线 + 底部基线;
54225
- * - **只标「完成」数值**(三系列 × 8 周会糊成一片),未结 / 新增走 hover;
54232
+ * - **只标「结案」数值**(三系列 × 8 周会糊成一片),未结 / 新增走 hover;
54226
54233
  * - hover 整列三根一起提亮 + 自绘浮卡(原生 title 太慢且长相不一)——纯 CSS,无额外状态。
54227
54234
  */
54228
54235
  const BAR_KINDS = [
@@ -54230,12 +54237,17 @@ body[data-ds-dark-theme]{
54230
54237
  "added",
54231
54238
  "open"
54232
54239
  ];
54233
- const ZERO = {
54234
- added: 0,
54235
- done: 0,
54236
- cancelled: 0,
54237
- open: 0
54238
- };
54240
+ /**
54241
+ * 四数归一:老版本 host 返回的桶可能没有 `cancelled`(甚至没有 `owners`),
54242
+ * 缺字段按 0 —— 这是「那一类记录本来就没有」,不是拿 0 充真值。
54243
+ * 不做这层兜底,`done + undefined` 会变成 NaN,把峰、刻度、柱高整张图一起毁掉。
54244
+ */
54245
+ const norm = (cell) => ({
54246
+ added: cell?.added ?? 0,
54247
+ done: cell?.done ?? 0,
54248
+ cancelled: cell?.cancelled ?? 0,
54249
+ open: cell?.open ?? 0
54250
+ });
54239
54251
  /** 系列名:只看我的时候「未结」就是「进行中」(我的任务必然有人接)。 */
54240
54252
  const labelKey = (kind, mine) => kind === "done" ? "chartDone" : kind === "added" ? "chartAdded" : mine ? "chartDoing" : "chartOpen";
54241
54253
  function TrendChart(props) {
@@ -54245,19 +54257,21 @@ body[data-ds-dark-theme]{
54245
54257
  const mine = mineOnly && me !== null;
54246
54258
  if (buckets.length === 0) return (0, react$1.createElement)("div", { className: "dtl-card dtl-trend" }, (0, react$1.createElement)("div", { className: "dtl-trend__foot" }, t("chartEmpty")));
54247
54259
  /** 当前口径下这一桶的三个数:全量,或「我的」那条(没数据就是 0)。 */
54248
- const counts = (bucket) => mine ? bucket.owners[me] ?? ZERO : bucket;
54260
+ const counts = (bucket) => mine ? norm(bucket.owners?.[me]) : norm(bucket);
54249
54261
  /** 未结拆两段:进行中 = 各人未结之和;待认领 = 未结 − 进行中。
54250
54262
  * 「只看我的」时只有进行中(我的任务必然有人接),不显示拆分行。 */
54251
54263
  const breakdown = (bucket) => {
54252
- const doing = Object.values(bucket.owners).reduce((sum, cell) => sum + cell.open, 0);
54264
+ const doing = Object.values(bucket.owners ?? {}).reduce((sum, cell) => sum + cell.open, 0);
54253
54265
  return {
54254
54266
  doing,
54255
54267
  waiting: Math.max(0, bucket.open - doing)
54256
54268
  };
54257
54269
  };
54270
+ /** 结案 = 完成 + 取消(用户 2026-10-29 定的上位词);图上的「结案」柱就是它。 */
54271
+ const closed = (cell) => cell.done + cell.cancelled;
54258
54272
  const peak = buckets.reduce((max, bucket) => {
54259
54273
  const cell = counts(bucket);
54260
- return Math.max(max, cell.added, cell.done, cell.open);
54274
+ return Math.max(max, cell.added, closed(cell), cell.open);
54261
54275
  }, 0);
54262
54276
  const top = peak === 0 ? 1 : peak;
54263
54277
  const ticks = [
@@ -54266,7 +54280,7 @@ body[data-ds-dark-theme]{
54266
54280
  "0"
54267
54281
  ];
54268
54282
  const bar = (bucket, kind) => {
54269
- const value = counts(bucket)[kind];
54283
+ const value = kind === "done" ? closed(counts(bucket)) : counts(bucket)[kind];
54270
54284
  return (0, react$1.createElement)("div", {
54271
54285
  className: `dtl-trend__bar dtl-trend__bar--${kind}`,
54272
54286
  style: {
@@ -54278,7 +54292,7 @@ body[data-ds-dark-theme]{
54278
54292
  const column = (bucket) => (0, react$1.createElement)("div", { className: "dtl-trend__col" }, (0, react$1.createElement)("div", { className: "dtl-trend__tip" }, (0, react$1.createElement)("div", { className: "dtl-trend__tip-row" }, t("periodRange", {
54279
54293
  from: bucket.from,
54280
54294
  to: bucket.to
54281
- })), ...BAR_KINDS.map((kind) => (0, react$1.createElement)("div", { className: "dtl-trend__tip-row" }, (0, react$1.createElement)("span", { className: `dtl-trend__dot dtl-trend__dot--${kind}` }), kind === "open" && !mine ? `${t("chartOpen")} ${formatCount(counts(bucket).open)}(${t("chartDoing")} ${formatCount(breakdown(bucket).doing)} · ${t("chartWaiting")} ${formatCount(breakdown(bucket).waiting)})` : `${t(labelKey(kind, mine))} ${formatCount(counts(bucket)[kind])}`))), (0, react$1.createElement)("div", { className: "dtl-trend__bars" }, ...BAR_KINDS.map((kind) => bar(bucket, kind))), (0, react$1.createElement)("div", { className: "dtl-trend__x" }, bucket.to.slice(5)));
54295
+ })), ...BAR_KINDS.map((kind) => (0, react$1.createElement)("div", { className: "dtl-trend__tip-row" }, (0, react$1.createElement)("span", { className: `dtl-trend__dot dtl-trend__dot--${kind}` }), kind === "done" ? `${t("chartDone")} ${formatCount(closed(counts(bucket)))}(${t("chartFinished")} ${formatCount(counts(bucket).done)} · ${t("chartCancelled")} ${formatCount(counts(bucket).cancelled)})` : kind === "open" && !mine ? `${t("chartOpen")} ${formatCount(counts(bucket).open)}(${t("chartDoing")} ${formatCount(breakdown(bucket).doing)} · ${t("chartWaiting")} ${formatCount(breakdown(bucket).waiting)})` : `${t(labelKey(kind, mine))} ${formatCount(counts(bucket)[kind])}`))), (0, react$1.createElement)("div", { className: "dtl-trend__bars" }, ...BAR_KINDS.map((kind) => bar(bucket, kind))), (0, react$1.createElement)("div", { className: "dtl-trend__x" }, bucket.to.slice(5)));
54282
54296
  const first = buckets[0];
54283
54297
  const partial = trend.coverageFrom !== "" && trend.coverageFrom > first.from ? (0, react$1.createElement)("div", { className: "dtl-trend__foot" }, t("chartPartial", { from: trend.coverageFrom })) : null;
54284
54298
  return (0, react$1.createElement)("div", { className: "dtl-card dtl-trend" }, (0, react$1.createElement)("div", { className: "dtl-trend__legend" }, ...BAR_KINDS.map((kind) => (0, react$1.createElement)("span", null, (0, react$1.createElement)("span", { className: `dtl-trend__dot dtl-trend__dot--${kind}` }), t(labelKey(kind, mine)))), me === null ? null : (0, react$1.createElement)("label", { className: "dtl-trend__mine" }, (0, react$1.createElement)("input", {
@@ -54501,7 +54515,8 @@ body[data-ds-dark-theme]{
54501
54515
  });
54502
54516
  /** 子集卡占比小字:分母为 0 或自己没有 ⇒ 不显示(不拿 0% 充数)。 */
54503
54517
  const share = (part, whole, key) => part > 0 && whole > 0 ? t(key, { n: Math.round(part / whole * 100) }) : "";
54504
- /** 统计台卡:数字 = 结案总数(含取消);有取消时小字拆「结案 X · 取消 Y」。
54518
+ /** 统计台卡:数字 = **结案**(完成 + 取消);有取消时小字拆「完成 X · 取消 Y」
54519
+ * (术语 2026-10-29 用户拍板:结案是上位词,完成只指正常结案)。
54505
54520
  * 不可点,hover 给具体日期区间;数字 null(历史读不到)留 '—',不拿 0 充数。 */
54506
54521
  const weekCard = (label, total, cancelled, from, to) => (0, react$1.createElement)(StatCard, {
54507
54522
  label: t(label),
@@ -54606,8 +54621,8 @@ body[data-ds-dark-theme]{
54606
54621
  onClick: onBack
54607
54622
  }, `← ${t("backToConversation")}`), (0, react$1.createElement)("div", { style: titleStyle }, t("panelTitle"), (0, react$1.createElement)("span", {
54608
54623
  style: buildTagStyle,
54609
- title: `v0.0.124 · 261029-195826-322`
54610
- }, `v0.0.124 261029-195826-322`))), (0, react$1.createElement)("div", { style: {
54624
+ title: `v0.0.125 · 261029-215620-858`
54625
+ }, `v0.0.125 261029-215620-858`))), (0, react$1.createElement)("div", { style: {
54611
54626
  display: "flex",
54612
54627
  alignItems: "center",
54613
54628
  gap: "var(--dtl-space-3)"
@@ -54688,12 +54703,14 @@ body[data-ds-dark-theme]{
54688
54703
  statStaleTitle: "停滞 = 进行中满 {n} 天没更新",
54689
54704
  statOverdueTitle: "逾期 = 认领后满 {n} 天还没结案",
54690
54705
  statBacklogTitle: "积压 = 待认领满 {n} 天没人接",
54691
- statWeekDone: "本周完成",
54692
- statLastWeekDone: "上周完成",
54693
- statWeekSplit: "结案 {done} · 取消 {cancelled}",
54706
+ statWeekDone: "本周结案",
54707
+ statLastWeekDone: "上周结案",
54708
+ statWeekSplit: "完成 {done} · 取消 {cancelled}",
54694
54709
  daysNone: "—",
54695
54710
  daysValue: "{n} 天",
54696
- chartDone: "完成",
54711
+ chartDone: "结案",
54712
+ chartFinished: "完成",
54713
+ chartCancelled: "取消",
54697
54714
  chartOpen: "未结",
54698
54715
  chartAdded: "新增",
54699
54716
  chartEmpty: "还没有可统计的记录",
@@ -54732,20 +54749,19 @@ body[data-ds-dark-theme]{
54732
54749
  relMonths: "{n} 个月前",
54733
54750
  relYears: "{n} 年前",
54734
54751
  whenSubmitted: "更新于 {time}",
54735
- filterByOwner: "只看 @{name} 的任务",
54736
- filterByWorkspace: "只看工作区 {name}",
54737
- filterByTag: "搜索标签 #{tag}",
54738
54752
  copyTaskId: "点击复制任务 ID",
54739
54753
  copiedTaskId: "已复制任务 ID",
54740
54754
  copyFailed: "复制失败",
54741
54755
  actionClaim: "认领",
54742
54756
  actionResume: "继续",
54743
- actionFinish: "结束",
54757
+ actionFinish: "完成",
54744
54758
  actionRelease: "释放",
54745
- tipClaim: "把这个任务认领到自己名下",
54746
- tipResume: "继续推进这个任务",
54747
- tipFinish: "结案并写入历史",
54748
- tipRelease: "释放认领,让别人接手",
54759
+ actionCancel: "取消",
54760
+ tipClaim: "将该任务归入本人名下,状态置为进行中",
54761
+ tipResume: "恢复对该任务的推进",
54762
+ tipFinish: "将该任务标记为完成,并归档入历史",
54763
+ tipRelease: "解除本人认领,任务退回公共池",
54764
+ tipCancel: "将该任务标记为取消并归档,不计入完成",
54749
54765
  viewDetail: "查看详情",
54750
54766
  fieldCreatorStamp: "创建于 {age}",
54751
54767
  viewModeLabel: "视图",
@@ -54780,12 +54796,14 @@ body[data-ds-dark-theme]{
54780
54796
  statStaleTitle: "stale = active with no update for {n}+ days",
54781
54797
  statOverdueTitle: "overdue = claimed {n}+ days ago and still open",
54782
54798
  statBacklogTitle: "backlog = unclaimed for {n}+ days",
54783
- statWeekDone: "Done this week",
54784
- statLastWeekDone: "Done last week",
54785
- statWeekSplit: "Closed {done} · Cancelled {cancelled}",
54799
+ statWeekDone: "Closed this week",
54800
+ statLastWeekDone: "Closed last week",
54801
+ statWeekSplit: "Done {done} · Cancelled {cancelled}",
54786
54802
  daysNone: "—",
54787
54803
  daysValue: "{n}d",
54788
- chartDone: "Done",
54804
+ chartDone: "Closed",
54805
+ chartFinished: "Done",
54806
+ chartCancelled: "Cancelled",
54789
54807
  chartOpen: "Open",
54790
54808
  chartAdded: "Added",
54791
54809
  chartEmpty: "No records to chart yet",
@@ -54824,20 +54842,19 @@ body[data-ds-dark-theme]{
54824
54842
  relMonths: "{n} mo ago",
54825
54843
  relYears: "{n} y ago",
54826
54844
  whenSubmitted: "updated {time}",
54827
- filterByOwner: "Only tasks owned by @{name}",
54828
- filterByWorkspace: "Only workspace {name}",
54829
- filterByTag: "Search tag #{tag}",
54830
54845
  copyTaskId: "Click to copy task ID",
54831
54846
  copiedTaskId: "Task ID copied",
54832
54847
  copyFailed: "Copy failed",
54833
54848
  actionClaim: "Claim",
54834
54849
  actionResume: "Resume",
54835
- actionFinish: "Close",
54850
+ actionFinish: "Finish",
54836
54851
  actionRelease: "Release",
54837
- tipClaim: "claim this task as mine",
54838
- tipResume: "keep working on this task",
54839
- tipFinish: "close and archive it",
54840
- tipRelease: "release the claim for others",
54852
+ actionCancel: "Cancel",
54853
+ tipClaim: "assign this task to me and set it to in progress",
54854
+ tipResume: "resume work on this task",
54855
+ tipFinish: "mark this task as done and archive it",
54856
+ tipRelease: "drop my claim and return the task to the public pool",
54857
+ tipCancel: "mark this task as cancelled and archive it; not counted as done",
54841
54858
  viewDetail: "View details",
54842
54859
  fieldCreatorStamp: "created {age}",
54843
54860
  viewModeLabel: "View",