dsh-group-status 0.2.2 → 0.3.0

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.
Files changed (86) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.en.md +36 -18
  3. package/README.md +39 -19
  4. package/lib/client.js +659 -300
  5. package/lib/client.js.map +1 -1
  6. package/lib/index.js +22 -9
  7. package/lib/types/client/BadgeSettingsCard.d.ts +24 -0
  8. package/lib/types/client/BadgeSettingsCard.d.ts.map +1 -0
  9. package/lib/types/client/BadgeSettingsCard.js +73 -0
  10. package/lib/types/client/BadgeSettingsCard.js.map +1 -0
  11. package/lib/types/client/badge-field.d.ts +44 -0
  12. package/lib/types/client/badge-field.d.ts.map +1 -0
  13. package/lib/types/client/badge-field.js +77 -0
  14. package/lib/types/client/badge-field.js.map +1 -0
  15. package/lib/types/client/badge-labels.d.ts +92 -0
  16. package/lib/types/client/badge-labels.d.ts.map +1 -0
  17. package/lib/types/client/badge-labels.js +150 -0
  18. package/lib/types/client/badge-labels.js.map +1 -0
  19. package/lib/types/client/badge-settings.d.ts +31 -3
  20. package/lib/types/client/badge-settings.d.ts.map +1 -1
  21. package/lib/types/client/badge-settings.js +50 -6
  22. package/lib/types/client/badge-settings.js.map +1 -1
  23. package/lib/types/client/facet-store.d.ts +46 -0
  24. package/lib/types/client/facet-store.d.ts.map +1 -0
  25. package/lib/types/client/facet-store.js +123 -0
  26. package/lib/types/client/facet-store.js.map +1 -0
  27. package/lib/types/client/facet-visibility.d.ts +17 -0
  28. package/lib/types/client/facet-visibility.d.ts.map +1 -0
  29. package/lib/types/client/facet-visibility.js +18 -0
  30. package/lib/types/client/facet-visibility.js.map +1 -0
  31. package/lib/types/client/facets.d.ts +265 -0
  32. package/lib/types/client/facets.d.ts.map +1 -0
  33. package/lib/types/client/facets.js +209 -0
  34. package/lib/types/client/facets.js.map +1 -0
  35. package/lib/types/client/group-status.d.ts +97 -45
  36. package/lib/types/client/group-status.d.ts.map +1 -1
  37. package/lib/types/client/group-status.js +148 -85
  38. package/lib/types/client/group-status.js.map +1 -1
  39. package/lib/types/client/index.d.ts +25 -0
  40. package/lib/types/client/index.d.ts.map +1 -1
  41. package/lib/types/client/index.js +59 -1
  42. package/lib/types/client/index.js.map +1 -1
  43. package/lib/types/client/legacy/bridge.d.ts +30 -0
  44. package/lib/types/client/legacy/bridge.d.ts.map +1 -0
  45. package/lib/types/client/legacy/bridge.js +58 -0
  46. package/lib/types/client/legacy/bridge.js.map +1 -0
  47. package/lib/types/client/legacy/register-legacy-facets.d.ts +14 -0
  48. package/lib/types/client/legacy/register-legacy-facets.d.ts.map +1 -0
  49. package/lib/types/client/legacy/register-legacy-facets.js +77 -0
  50. package/lib/types/client/legacy/register-legacy-facets.js.map +1 -0
  51. package/lib/types/client/legacy/schedule.d.ts +49 -0
  52. package/lib/types/client/legacy/schedule.d.ts.map +1 -0
  53. package/lib/types/client/legacy/schedule.js +73 -0
  54. package/lib/types/client/legacy/schedule.js.map +1 -0
  55. package/lib/types/client/legacy/store-source.d.ts +78 -0
  56. package/lib/types/client/legacy/store-source.d.ts.map +1 -0
  57. package/lib/types/client/legacy/store-source.js +82 -0
  58. package/lib/types/client/legacy/store-source.js.map +1 -0
  59. package/lib/types/client/legacy/waiting-review.d.ts +85 -0
  60. package/lib/types/client/legacy/waiting-review.d.ts.map +1 -0
  61. package/lib/types/client/legacy/waiting-review.js +179 -0
  62. package/lib/types/client/legacy/waiting-review.js.map +1 -0
  63. package/lib/types/client/locales.d.ts +46 -4
  64. package/lib/types/client/locales.d.ts.map +1 -1
  65. package/lib/types/client/locales.js +46 -4
  66. package/lib/types/client/locales.js.map +1 -1
  67. package/lib/types/client/rows/GroupBadge.d.ts +19 -25
  68. package/lib/types/client/rows/GroupBadge.d.ts.map +1 -1
  69. package/lib/types/client/rows/GroupBadge.js +45 -106
  70. package/lib/types/client/rows/GroupBadge.js.map +1 -1
  71. package/lib/types/client/rows/Rows.d.ts +7 -3
  72. package/lib/types/client/rows/Rows.d.ts.map +1 -1
  73. package/lib/types/client/rows/Rows.js +6 -6
  74. package/lib/types/client/rows/Rows.js.map +1 -1
  75. package/lib/types/client/rows/WorkspaceBrowser.d.ts.map +1 -1
  76. package/lib/types/client/rows/WorkspaceBrowser.js +21 -21
  77. package/lib/types/client/rows/WorkspaceBrowser.js.map +1 -1
  78. package/lib/types/client/tree.d.ts +2 -5
  79. package/lib/types/client/tree.d.ts.map +1 -1
  80. package/lib/types/client/tree.js +0 -5
  81. package/lib/types/client/tree.js.map +1 -1
  82. package/lib/types/index.d.ts +31 -1
  83. package/lib/types/index.d.ts.map +1 -1
  84. package/lib/types/index.js +13 -1
  85. package/lib/types/index.js.map +1 -1
  86. package/package.json +1 -5
@@ -0,0 +1,179 @@
1
+ /**
2
+ * 过渡期适配器:dsh-gitea-dispatch 的「等待评审」→ facet。
3
+ *
4
+ * ⚠️ **本目录整体是临时的**。dsh-gitea-dispatch 自己按 `../facets.ts` 的协议注册之后
5
+ * (对应它的 issue「把摘要 API 升级为 facet 注册」),这个文件与 `schedule.ts`、
6
+ * `facet-icons.tsx` 一起删除,本插件不再认识任何具体状态源。
7
+ *
8
+ * 保留在 `legacy/` 而不是混进核心,是为了让"删除它"成为一次可执行的收尾,而不是一句
9
+ * 口头承诺:核心模块(`group-status.ts` / `badge-labels.ts` / `rows/GroupBadge.tsx`)
10
+ * 里没有任何 `waitingReview` 字样可寻。
11
+ *
12
+ * ## 为什么这里既读快照又自己折
13
+ *
14
+ * 提供方(issue #16)导出 `summarizeWaitingGroup()`。能用到就用它:id 口径、
15
+ * `overdue > waiting` 排序、截止时刻算法都是它的所有物,委托才不会再出现"提供方加了
16
+ * 字段而徽标不知道"的静默丢数据。它不导出(旧版本)时才用本文件的等价实现。
17
+ *
18
+ * @module dsh-group-status/client/legacy/waiting-review
19
+ */
20
+ import { entryFor } from "../cross-plugin-summary.js";
21
+ import { GROUP_STATUS_FACET_PROTOCOL_VERSION } from "../facets.js";
22
+ /** facet id:与 dsh-gitea-dispatch 自己注册时应当使用的 id 保持一致。 */
23
+ export const WAITING_REVIEW_FACET_ID = 'dsh-gitea-dispatch.waiting-review';
24
+ /**
25
+ * 一条等待的绝对截止(epoch ms);`undefined` = 时长未知。
26
+ *
27
+ * 刻意与提供方的 `deadlineOf` 同口径(绝对 deadline 优先,才退 `startedAt + waitMaxSec`):
28
+ * CI 的等待从"进入循环"起算,而广播在此之前已发出,只按时长算会让徽标的倒计时晚于
29
+ * 真实截止(其 Issues #2577)。`startedAt` 的两种形态同理都要认。
30
+ */
31
+ export function waitingDeadlineOf(entry) {
32
+ if (typeof entry.deadline === 'number' && Number.isFinite(entry.deadline))
33
+ return entry.deadline;
34
+ const started = typeof entry.startedAt === 'number'
35
+ ? entry.startedAt
36
+ : typeof entry.startedAt === 'string' && entry.startedAt !== ''
37
+ ? Date.parse(entry.startedAt)
38
+ : Number.NaN;
39
+ if (Number.isFinite(started)
40
+ && typeof entry.waitMaxSec === 'number'
41
+ && Number.isFinite(entry.waitMaxSec)
42
+ && entry.waitMaxSec > 0) {
43
+ return started + entry.waitMaxSec * 1000;
44
+ }
45
+ return undefined;
46
+ }
47
+ /**
48
+ * 提供方聚合面缺席时的等价折叠。
49
+ *
50
+ * 与提供方的 `summarizeWaitingGroup()` 同一套判据:四形态 id 兜底(复用
51
+ * `cross-plugin-summary.ts` 的 `entryFor`,规则与它的 `waitingEntryFor` 相同)、
52
+ * `overdue > waiting` 排序、只把**未到期**的截止算作 `nextDeadline`。
53
+ */
54
+ export function summarizeWaitingGroupLocally(summary, sessionIds, now) {
55
+ const prNumbers = [];
56
+ let state;
57
+ let nextDeadline;
58
+ for (const sessionId of sessionIds) {
59
+ const entry = entryFor(summary, sessionId);
60
+ if (entry === undefined)
61
+ continue;
62
+ prNumbers.push(entry.prNumber);
63
+ if (entry.state === 'overdue')
64
+ state = 'overdue';
65
+ else if (state === undefined)
66
+ state = 'waiting';
67
+ const deadline = waitingDeadlineOf(entry);
68
+ // 已到点的条目由 `state: 'overdue'` 表达;把它算进倒计时会折出一个负数。
69
+ if (deadline !== undefined && deadline > now && (nextDeadline === undefined || deadline < nextDeadline)) {
70
+ nextDeadline = deadline;
71
+ }
72
+ }
73
+ const fold = { sessions: prNumbers.length, prNumbers, state };
74
+ // 用"缺键"而不是"键=undefined"对齐提供方:两条路径对下游必须不可区分。
75
+ if (nextDeadline !== undefined)
76
+ fold.nextDeadline = nextDeadline;
77
+ return fold;
78
+ }
79
+ /** 折果 `data` 的读取(本文件内部用)。 */
80
+ function dataOf(fold) {
81
+ return fold.data ?? { prNumbers: [], state: undefined };
82
+ }
83
+ /** 把提供方的折果装进 facet 形状(数量 / 色档 / 脉冲)。 */
84
+ function toFacetFold(source) {
85
+ const tone = source.state === 'overdue' ? 'error' : 'warn';
86
+ // 脉冲刻意不给等待评审的超时:提供方把 `overdue` 画成**静止**(其
87
+ // `lib/waiting-glyph.js`:「超时后停动画:静止即不再期待」),且它只代表 CI
88
+ // 窗口到期、不代表评审失败。同一条等待在行内静止、在父级闪动是两套说法。
89
+ // `nextDeadline` 缺键而不是 =undefined:与提供方的折果形状一致,也让两条折叠路径
90
+ // (委托 / 本地)对下游不可区分。
91
+ const data = source.nextDeadline === undefined
92
+ ? { prNumbers: source.prNumbers, state: source.state }
93
+ : { prNumbers: source.prNumbers, state: source.state, nextDeadline: source.nextDeadline };
94
+ return { count: source.sessions, tone, pulse: false, data };
95
+ }
96
+ /**
97
+ * 同 facet 跨层合并:PR 号取并集去重升序、色档取更紧急的一档、
98
+ * 倒计时取两侧更早的那个未到期截止。
99
+ */
100
+ export function mergeWaitingReviewFold(a, b) {
101
+ const left = dataOf(a);
102
+ const right = dataOf(b);
103
+ const prNumbers = [...new Set([...left.prNumbers, ...right.prNumbers])].sort((x, y) => x - y);
104
+ const state = left.state === 'overdue' || right.state === 'overdue'
105
+ ? 'overdue'
106
+ : left.state ?? right.state;
107
+ const deadlines = [left.nextDeadline, right.nextDeadline].filter((v) => v !== undefined);
108
+ const nextDeadline = deadlines.length === 0 ? undefined : Math.min(...deadlines);
109
+ const data = nextDeadline === undefined
110
+ ? { prNumbers, state }
111
+ : { prNumbers, state, nextDeadline };
112
+ return {
113
+ count: a.count + b.count,
114
+ tone: state === 'overdue' ? 'error' : 'warn',
115
+ pulse: a.pulse || b.pulse,
116
+ data,
117
+ };
118
+ }
119
+ /** `#15, #2783(+2)`:去重升序、封顶三个。 */
120
+ export function prNumberList(prNumbers) {
121
+ if (prNumbers === undefined || prNumbers.length === 0)
122
+ return '';
123
+ const distinct = [...new Set(prNumbers)].sort((a, b) => a - b);
124
+ const shown = distinct.slice(0, 3).map(pr => `#${pr}`);
125
+ if (distinct.length > shown.length)
126
+ shown.push(`+${distinct.length - shown.length}`);
127
+ return shown.join(', ');
128
+ }
129
+ /**
130
+ * 等待评审那一句文案:状态 + 剩余时长(分钟粒度)+ PR 号。
131
+ *
132
+ * 措辞与提供方自己的行内呈现同档(`等待评审 3:28` / `评审等待已超时` / `等待评审结果`),
133
+ * 但只到分钟:徽标只在提供方 store 通知时重渲染,秒级读数会停在旧值上撒谎。
134
+ */
135
+ export function waitingReviewLabel(fold, context) {
136
+ const t = context.t;
137
+ const data = dataOf(fold);
138
+ const phrase = (() => {
139
+ if (data.state === 'overdue')
140
+ return t('status.waitingReviewOverdue');
141
+ const deadline = data.nextDeadline;
142
+ if (deadline === undefined)
143
+ return t('status.waitingReview');
144
+ const left = Math.max(0, deadline - context.now);
145
+ if (left < 60_000)
146
+ return t('status.waitingReviewImminent');
147
+ if (left < 3_600_000)
148
+ return t('status.waitingReviewLeft', { time: t('time.minutes', { n: Math.floor(left / 60_000) }) });
149
+ return t('status.waitingReviewLeft', { time: t('time.hours', { n: Math.floor(left / 3_600_000) }) });
150
+ })();
151
+ const prs = prNumberList(data.prNumbers);
152
+ return prs === '' ? `${fold.count} ${phrase}` : `${fold.count} ${phrase} · ${prs}`;
153
+ }
154
+ /**
155
+ * 构造本插件内置的等待评审 facet。
156
+ *
157
+ * @param input - 提供方的摘要读取面;`summarize` 缺席时退回本地等价折叠。
158
+ * @param input.subscribe - 订阅快照变化(提供方 store 的订阅面)。
159
+ * @param input.getSnapshot - 读当前摘要 Map。
160
+ * @param input.summarize - 提供方的分组聚合(有则委托)。
161
+ */
162
+ export function createWaitingReviewFacet(input) {
163
+ const summarize = input.summarize ?? summarizeWaitingGroupLocally;
164
+ return {
165
+ protocol: GROUP_STATUS_FACET_PROTOCOL_VERSION,
166
+ id: WAITING_REVIEW_FACET_ID,
167
+ origin: 'legacy',
168
+ settingKey: 'showWaitingReviewInBadge',
169
+ order: 20,
170
+ subscribe: input.subscribe,
171
+ getSnapshot: input.getSnapshot,
172
+ fold: (snapshot, sessionIds, now) => toFacetFold(snapshot === undefined || sessionIds.length === 0
173
+ ? { sessions: 0, prNumbers: [], state: undefined }
174
+ : summarize(snapshot, sessionIds, now)),
175
+ merge: mergeWaitingReviewFold,
176
+ label: waitingReviewLabel,
177
+ };
178
+ }
179
+ //# sourceMappingURL=waiting-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waiting-review.js","sourceRoot":"","sources":["../../../../src/client/legacy/waiting-review.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD,OAAO,EAAE,mCAAmC,EAAE,MAAM,cAAc,CAAA;AAElE,wDAAwD;AACxD,MAAM,CAAC,MAAM,uBAAuB,GAAG,mCAAmC,CAAA;AAmD1E;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAgC;IAChE,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAA;IAChG,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACjD,CAAC,CAAC,KAAK,CAAC,SAAS;QACjB,CAAC,CAAC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,EAAE;YAC7D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;YAC7B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAA;IAChB,IACE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;WACrB,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;WACpC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;WACjC,KAAK,CAAC,UAAU,GAAG,CAAC,EACvB,CAAC;QACD,OAAO,OAAO,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI,CAAA;IAC1C,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAgC,EAChC,UAA6B,EAC7B,GAAW;IAEX,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,IAAI,KAAwC,CAAA;IAC5C,IAAI,YAAgC,CAAA;IACpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAC1C,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QACjC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC9B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,KAAK,GAAG,SAAS,CAAA;aAC3C,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,GAAG,SAAS,CAAA;QAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;QACzC,gDAAgD;QAChD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC;YACxG,YAAY,GAAG,QAAQ,CAAA;QACzB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAsB,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IAChF,4CAA4C;IAC5C,IAAI,YAAY,KAAK,SAAS;QAAE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IAChE,OAAO,IAAI,CAAA;AACb,CAAC;AAED,6BAA6B;AAC7B,SAAS,MAAM,CAAC,IAAkC;IAChD,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;AACzD,CAAC;AAED,wCAAwC;AACxC,SAAS,WAAW,CAAC,MAAyB;IAC5C,MAAM,IAAI,GAAc,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;IACrE,0CAA0C;IAC1C,oDAAoD;IACpD,sCAAsC;IACtC,uDAAuD;IACvD,oBAAoB;IACpB,MAAM,IAAI,GAAsB,MAAM,CAAC,YAAY,KAAK,SAAS;QAC/D,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;QACtD,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAA;IAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,CAA+B,EAAE,CAA+B;IACrG,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QACjE,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAA;IAC7B,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAA;IACrG,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAA;IAChF,MAAM,IAAI,GAAsB,YAAY,KAAK,SAAS;QACxD,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE;QACtB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAA;IACtC,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;QACxB,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QAC5C,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;QACzB,IAAI;KACL,CAAA;AACH,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,YAAY,CAAC,SAAwC;IACnE,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAChE,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACtD,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;IACpF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAkC,EAAE,OAA2B;IAChG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAA;IACnB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IACzB,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;QACnB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC,6BAA6B,CAAC,CAAA;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAA;QAClC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAA;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAChD,IAAI,IAAI,GAAG,MAAM;YAAE,OAAO,CAAC,CAAC,8BAA8B,CAAC,CAAA;QAC3D,IAAI,IAAI,GAAG,SAAS;YAAE,OAAO,CAAC,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACzH,OAAO,CAAC,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACtG,CAAC,CAAC,EAAE,CAAA;IACJ,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACxC,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,MAAM,GAAG,EAAE,CAAA;AACpF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAIxC;IACC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,4BAA4B,CAAA;IACjE,OAAO;QACL,QAAQ,EAAE,mCAAmC;QAC7C,EAAE,EAAE,uBAAuB;QAC3B,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,0BAA0B;QACtC,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC,WAAW,CAC9C,QAAQ,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAC/C,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;YAClD,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,CACzC;QACD,KAAK,EAAE,sBAAsB;QAC7B,KAAK,EAAE,kBAAkB;KAC1B,CAAA;AACH,CAAC"}
@@ -106,8 +106,7 @@ export declare const zh: {
106
106
  'status.compact.approval': string;
107
107
  'status.compact.planReview': string;
108
108
  'status.compact.answer': string;
109
- 'status.waitingReview': string;
110
- 'status.scheduled': string;
109
+ 'status.needsAttention': string;
111
110
  'status.completed': string;
112
111
  'hover.created': string;
113
112
  'hover.copied': string;
@@ -119,6 +118,28 @@ export declare const zh: {
119
118
  'time.months': string;
120
119
  'time.years': string;
121
120
  'time.ago': string;
121
+ 'settings.badge.section': string;
122
+ 'settings.badge.showRunning': string;
123
+ 'settings.badge.showRunningHint': string;
124
+ 'settings.badge.showPending': string;
125
+ 'settings.badge.showPendingHint': string;
126
+ 'settings.badge.showCompleted': string;
127
+ 'settings.badge.showCompletedHint': string;
128
+ 'settings.badge.showScheduled': string;
129
+ 'settings.badge.showScheduledHint': string;
130
+ 'settings.badge.showWaitingReview': string;
131
+ 'settings.badge.showWaitingReviewHint': string;
132
+ 'settings.hover.section': string;
133
+ 'settings.hover.showDetails': string;
134
+ 'settings.hover.showDetailsHint': string;
135
+ 'settings.count.section': string;
136
+ 'settings.count.threshold': string;
137
+ 'settings.count.thresholdHint': string;
138
+ 'settings.save': string;
139
+ 'settings.saving': string;
140
+ 'settings.saveFailed': string;
141
+ 'settings.readOnly': string;
142
+ 'settings.unavailable': string;
122
143
  };
123
144
  /** The workspace namespace key union. */
124
145
  export type WorkspaceKey = keyof typeof zh;
@@ -225,8 +246,7 @@ export declare const en: {
225
246
  'status.compact.approval': string;
226
247
  'status.compact.planReview': string;
227
248
  'status.compact.answer': string;
228
- 'status.waitingReview': string;
229
- 'status.scheduled': string;
249
+ 'status.needsAttention': string;
230
250
  'status.completed': string;
231
251
  'hover.created': string;
232
252
  'hover.copied': string;
@@ -238,5 +258,27 @@ export declare const en: {
238
258
  'time.months': string;
239
259
  'time.years': string;
240
260
  'time.ago': string;
261
+ 'settings.badge.section': string;
262
+ 'settings.badge.showRunning': string;
263
+ 'settings.badge.showRunningHint': string;
264
+ 'settings.badge.showPending': string;
265
+ 'settings.badge.showPendingHint': string;
266
+ 'settings.badge.showCompleted': string;
267
+ 'settings.badge.showCompletedHint': string;
268
+ 'settings.badge.showScheduled': string;
269
+ 'settings.badge.showScheduledHint': string;
270
+ 'settings.badge.showWaitingReview': string;
271
+ 'settings.badge.showWaitingReviewHint': string;
272
+ 'settings.hover.section': string;
273
+ 'settings.hover.showDetails': string;
274
+ 'settings.hover.showDetailsHint': string;
275
+ 'settings.count.section': string;
276
+ 'settings.count.threshold': string;
277
+ 'settings.count.thresholdHint': string;
278
+ 'settings.save': string;
279
+ 'settings.saving': string;
280
+ 'settings.saveFailed': string;
281
+ 'settings.readOnly': string;
282
+ 'settings.unavailable': string;
241
283
  };
242
284
  //# sourceMappingURL=locales.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mEAAmE;AACnE,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmHmB,CAAA;AAElC,yCAAyC;AACzC,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,EAAE,CAAA;AAE1C,mEAAmE;AACnE,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmHyB,CAAA"}
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mEAAmE;AACnE,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwImB,CAAA;AAElC,yCAAyC;AACzC,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,EAAE,CAAA;AAE1C,mEAAmE;AACnE,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwIyB,CAAA"}
@@ -106,8 +106,7 @@ export const zh = {
106
106
  'status.compact.approval': '待审批',
107
107
  'status.compact.planReview': '计划待审',
108
108
  'status.compact.answer': '待回答',
109
- 'status.waitingReview': '等待评审',
110
- 'status.scheduled': '定时任务',
109
+ 'status.needsAttention': '需要关注',
111
110
  'status.completed': '已完成',
112
111
  'hover.created': '创建于 {time}',
113
112
  'hover.copied': '已复制',
@@ -119,6 +118,28 @@ export const zh = {
119
118
  'time.months': '{n}个月',
120
119
  'time.years': '{n}年',
121
120
  'time.ago': '{t}前',
121
+ 'settings.badge.section': '折叠徽标',
122
+ 'settings.badge.showRunning': '显示「进行中」转圈',
123
+ 'settings.badge.showRunningHint': '关闭后,进行中的会话(含子智能体)不再画转圈,也不再计入折叠徽标的数字与悬停明细。',
124
+ 'settings.badge.showPending': '显示「待审批」黄点',
125
+ 'settings.badge.showPendingHint': '关闭后,等待审批 / 计划评审 / 等待回答的会话不再画黄点,也不再计入折叠徽标的数字与悬停明细。',
126
+ 'settings.badge.showCompleted': '显示「已完成」绿点',
127
+ 'settings.badge.showCompletedHint': '关闭后,「已完成」的会话不再画绿点,也不再计入折叠徽标的数字与悬停明细。会话行自身的绿点不受影响。',
128
+ 'settings.badge.showScheduled': '显示「定时任务」时钟',
129
+ 'settings.badge.showScheduledHint': '关闭后,带定时提醒的会话(来自 dsh-later)不再画时钟图标,也不再计入折叠徽标的数字与悬停明细。',
130
+ 'settings.badge.showWaitingReview': '显示「等待评审」沙漏',
131
+ 'settings.badge.showWaitingReviewHint': '关闭后,等待代码评审的会话(来自 dsh-gitea-dispatch)不再画沙漏图标,也不再计入折叠徽标的数字与悬停明细。',
132
+ 'settings.hover.section': '悬停明细',
133
+ 'settings.hover.showDetails': '显示状态明细行',
134
+ 'settings.hover.showDetailsHint': '关闭后,悬停卡只显示工作区标题、路径和创建时间——不再显示聚合状态明细行。',
135
+ 'settings.count.section': '数字显示',
136
+ 'settings.count.threshold': '数字显示阈值',
137
+ 'settings.count.thresholdHint': '数量 >= 此值时才在徽标上显示数字。默认 2(即 count=1 时省略,因为状态点已表达"有东西")。设为 1 则始终显示。',
138
+ 'settings.save': '保存',
139
+ 'settings.saving': '保存中…',
140
+ 'settings.saveFailed': '本部署没有接受这些值,已保留供你修改。',
141
+ 'settings.readOnly': '本部署的设置为只读。',
142
+ 'settings.unavailable': '该插件当前未加载,暂时无法配置。',
122
143
  };
123
144
  /** English dictionary, checked complete against the zh key set. */
124
145
  export const en = {
@@ -223,8 +244,7 @@ export const en = {
223
244
  'status.compact.approval': 'Approval',
224
245
  'status.compact.planReview': 'Plan review',
225
246
  'status.compact.answer': 'Answer',
226
- 'status.waitingReview': 'Waiting for review',
227
- 'status.scheduled': 'Scheduled',
247
+ 'status.needsAttention': 'Needs attention',
228
248
  'status.completed': 'Completed',
229
249
  'hover.created': 'Created {time}',
230
250
  'hover.copied': 'Copied',
@@ -236,5 +256,27 @@ export const en = {
236
256
  'time.months': '{n}mo',
237
257
  'time.years': '{n}y',
238
258
  'time.ago': '{t} ago',
259
+ 'settings.badge.section': 'Collapsed badge',
260
+ 'settings.badge.showRunning': 'Show the running dot',
261
+ 'settings.badge.showRunningHint': 'When off, running Sessions (and subagents) stop drawing the spinning dot and drop out of the collapsed badge count and its hover details.',
262
+ 'settings.badge.showPending': 'Show the pending dot',
263
+ 'settings.badge.showPendingHint': 'When off, Sessions waiting for approval / plan review / answer stop drawing the yellow dot and drop out of the collapsed badge count and its hover details.',
264
+ 'settings.badge.showCompleted': 'Show the completed dot',
265
+ 'settings.badge.showCompletedHint': 'When off, completed Sessions stop drawing the dot and drop out of the collapsed badge count and its hover details. The Session row\'s own dot is unaffected.',
266
+ 'settings.badge.showScheduled': 'Show the scheduled icon',
267
+ 'settings.badge.showScheduledHint': 'When off, Sessions with scheduled reminders (from dsh-later) stop drawing the clock icon and drop out of the collapsed badge count and its hover details.',
268
+ 'settings.badge.showWaitingReview': 'Show the waiting-for-review icon',
269
+ 'settings.badge.showWaitingReviewHint': 'When off, Sessions waiting for code review (from dsh-gitea-dispatch) stop drawing the hourglass icon and drop out of the collapsed badge count and its hover details.',
270
+ 'settings.hover.section': 'Hover details',
271
+ 'settings.hover.showDetails': 'Show status detail lines',
272
+ 'settings.hover.showDetailsHint': 'When off, the hover card shows only the workspace title, path, and creation time — no aggregated status lines.',
273
+ 'settings.count.section': 'Count display',
274
+ 'settings.count.threshold': 'Count display threshold',
275
+ 'settings.count.thresholdHint': 'The count is shown on the badge only when the total is >= this value. Default 2 (omits the count when it equals 1 — the dots already convey "something is happening"). Set to 1 to always show.',
276
+ 'settings.save': 'Save',
277
+ 'settings.saving': 'Saving…',
278
+ 'settings.saveFailed': 'The deployment did not accept these values; they were left for you to correct.',
279
+ 'settings.readOnly': 'This deployment stores settings read-only.',
280
+ 'settings.unavailable': 'This plugin is not loaded, so it cannot be configured right now.',
239
281
  };
240
282
  //# sourceMappingURL=locales.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"locales.js","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"locales.js","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"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"}
@@ -5,43 +5,37 @@
5
5
  * vendored file only needs one import and one `<GroupBadge />` call to wire
6
6
  * the badge in. Everything fork-specific lives here.
7
7
  *
8
+ * The **wording** lives in `../badge-labels.ts`: this file imports the host icon set,
9
+ * whose `require` graph only resolves inside the DSH app, so anything kept here is
10
+ * untestable in this repository.
11
+ *
12
+ * 本文件也**不为任何具体状态源写分支**:外部来源的图标、色档、脉冲、文案都随 facet
13
+ * 一起进来,这里只按登记顺序把它们排进徽标。
14
+ *
8
15
  * @module
9
16
  */
10
17
  import type { ReactNode } from 'react';
11
18
  import type { WorkspaceBrowserProps } from '../contract/slots.ts';
12
- import type { GroupLiveStatus, GroupNode } from '../tree.ts';
19
+ import type { GroupNode } from '../tree.ts';
13
20
  import type { ResolvedBadgeSettings } from '../badge-settings.ts';
21
+ export { facetCountTotal, facetGlyph, facetPulseClass, groupLiveLabel, hoverStatusLines } from '../badge-labels.ts';
14
22
  /** The standard locale seat, prop-passed from the browser root. */
15
23
  type RowTranslate = WorkspaceBrowserProps['t'];
16
- /**
17
- * Accessible label for a folded group's aggregated status, reusing the
18
- * session-row locale keys so both surfaces read identically.
19
- *
20
- * 按设置过滤:关掉的来源不出现在标签里(aria-label 与徽标视觉一致)。
21
- */
22
- export declare function groupLiveLabel(s: GroupLiveStatus, t: RowTranslate, settings: ResolvedBadgeSettings): string;
23
24
  /**
24
25
  * Aggregated live-status badge for a folded folder row. Dots reuse StateDot so
25
26
  * colors match session rows (warning = pending, ongoing = running, done = completed).
26
- * Renders nothing while expanded or when nothing is pending/active/completed/scheduled/waiting.
27
- *
28
- * Count matches the dots: pending + active + completed + waiting-review + scheduled sessions.
27
+ * Renders nothing while expanded or when nothing is pending/active/completed or any
28
+ * status source reports a contribution.
29
29
  *
30
- * `settings` 按来源过滤:关掉的来源不画点、不计数、不进 aria-label、不参与「是否显示徽标」
31
- * 的判断。会话行自身的状态不受影响:那是行级状态,不是分组提示。
32
- */
33
- export declare function groupLiveBadge(group: GroupNode, t: RowTranslate, settings: ResolvedBadgeSettings): ReactNode;
34
- /**
35
- * Build the status detail lines for the workspace hover card.
30
+ * Count matches the dots: host-side sessions plus every registered facet's own count.
36
31
  *
37
- * Extracted so `WorkspaceHoverContent` in `Rows.tsx` only needs to map the
38
- * returned array — the fork-specific status→line logic lives here.
32
+ * `settings` 按来源过滤:关掉的来源不画点、不计数、不进 aria-label、不参与「是否显示
33
+ * 徽标」的判断。会话行自身的状态点不受影响:那是行级状态,不是分组提示。**外部**来源的
34
+ * 过滤发生在折叠之前(`WorkspaceBrowser` 按 `facet.settingKey` 筛登记面),所以到这里
35
+ * 的折果已经是"该显示的",label 与视觉不可能各说一套。
39
36
  *
40
- * 按设置过滤:关掉的来源不出现在明细行里;`showHoverDetails=false` 时整段返回空。
37
+ * `now` 缺省取渲染时刻(与 `WorkspaceBrowser` 为相对时间读的时钟同一姿态):文案里的
38
+ * 剩余时长以此计算,只在提供方 store 通知时随渲染更新。
41
39
  */
42
- export declare function hoverStatusLines(status: GroupLiveStatus | undefined, t: RowTranslate, settings: ResolvedBadgeSettings): {
43
- state: 'warning' | 'ongoing' | 'done';
44
- text: string;
45
- }[];
46
- export {};
40
+ export declare function groupLiveBadge(group: GroupNode, t: RowTranslate, settings: ResolvedBadgeSettings, now?: number): ReactNode;
47
41
  //# sourceMappingURL=GroupBadge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupBadge.d.ts","sourceRoot":"","sources":["../../../../src/client/rows/GroupBadge.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAGjE,mEAAmE;AACnE,KAAK,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;AAI9C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAiB3G;AAID;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,qBAAqB,GAAG,SAAS,CAmD5G;AAID;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,CAAC,EAAE,YAAY,EACf,QAAQ,EAAE,qBAAqB,GAC9B;IAAE,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAyB3D"}
1
+ {"version":3,"file":"GroupBadge.d.ts","sourceRoot":"","sources":["../../../../src/client/rows/GroupBadge.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAIjE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAEnH,mEAAmE;AACnE,KAAK,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;AAI9C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,CAAC,EAAE,YAAY,EACf,QAAQ,EAAE,qBAAqB,EAC/B,GAAG,GAAE,MAAmB,GACvB,SAAS,CA+CX"}
@@ -1,132 +1,71 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { IconClockOutlineRegular, IconListPenOutlineRegular, StateDot, } from '@deepseek-ai/dsh-client-ui-primitives';
2
+ import { StateDot } from '@deepseek-ai/dsh-client-ui-primitives';
3
+ import { facetCountTotal, facetGlyph, facetPulseClass, groupLiveLabel } from "../badge-labels.js";
3
4
  import css from './Rows.module.css';
4
- // ── Accessible label ──
5
- /**
6
- * Accessible label for a folded group's aggregated status, reusing the
7
- * session-row locale keys so both surfaces read identically.
8
- *
9
- * 按设置过滤:关掉的来源不出现在标签里(aria-label 与徽标视觉一致)。
10
- */
11
- export function groupLiveLabel(s, t, settings) {
12
- const parts = [];
13
- if (settings.showPendingInBadge) {
14
- if (s.approval > 0)
15
- parts.push(`${s.approval} ${t('status.waitingApproval')}`);
16
- if (s.planReview > 0)
17
- parts.push(`${s.planReview} ${t('status.planReview')}`);
18
- if (s.question > 0)
19
- parts.push(`${s.question} ${t('status.waitingAnswer')}`);
20
- }
21
- if (settings.showRunningInBadge) {
22
- if (s.running > 0)
23
- parts.push(`${s.running} ${t('status.running')}`);
24
- if (s.subagents > 0) {
25
- parts.push(t(s.subagents === 1 ? 'status.subagentsRunning.one' : 'status.subagentsRunning.other', { n: s.subagents }));
26
- }
27
- }
28
- if (settings.showWaitingReviewInBadge && s.waitingReviewCount > 0)
29
- parts.push(`${s.waitingReviewCount} ${t('status.waitingReview')}`);
30
- if (settings.showScheduledInBadge && s.scheduledSessions > 0)
31
- parts.push(`${s.scheduledSessions} ${t('status.scheduled')}`);
32
- if (settings.showCompletedInBadge && s.done > 0)
33
- parts.push(`${s.done} ${t('status.completed')}`);
34
- return parts.join(' · ');
35
- }
5
+ export { facetCountTotal, facetGlyph, facetPulseClass, groupLiveLabel, hoverStatusLines } from "../badge-labels.js";
36
6
  // ── Badge ──
37
7
  /**
38
8
  * Aggregated live-status badge for a folded folder row. Dots reuse StateDot so
39
9
  * colors match session rows (warning = pending, ongoing = running, done = completed).
40
- * Renders nothing while expanded or when nothing is pending/active/completed/scheduled/waiting.
10
+ * Renders nothing while expanded or when nothing is pending/active/completed or any
11
+ * status source reports a contribution.
12
+ *
13
+ * Count matches the dots: host-side sessions plus every registered facet's own count.
41
14
  *
42
- * Count matches the dots: pending + active + completed + waiting-review + scheduled sessions.
15
+ * `settings` 按来源过滤:关掉的来源不画点、不计数、不进 aria-label、不参与「是否显示
16
+ * 徽标」的判断。会话行自身的状态点不受影响:那是行级状态,不是分组提示。**外部**来源的
17
+ * 过滤发生在折叠之前(`WorkspaceBrowser` 按 `facet.settingKey` 筛登记面),所以到这里
18
+ * 的折果已经是"该显示的",label 与视觉不可能各说一套。
43
19
  *
44
- * `settings` 按来源过滤:关掉的来源不画点、不计数、不进 aria-label、不参与「是否显示徽标」
45
- * 的判断。会话行自身的状态不受影响:那是行级状态,不是分组提示。
20
+ * `now` 缺省取渲染时刻(与 `WorkspaceBrowser` 为相对时间读的时钟同一姿态):文案里的
21
+ * 剩余时长以此计算,只在提供方 store 通知时随渲染更新。
46
22
  */
47
- export function groupLiveBadge(group, t, settings) {
23
+ export function groupLiveBadge(group, t, settings, now = Date.now()) {
48
24
  const s = group.liveStatus;
49
25
  if (group.expanded || s === undefined)
50
26
  return null;
51
27
  const pending = settings.showPendingInBadge ? s.approval + s.planReview + s.question : 0;
52
28
  const active = settings.showRunningInBadge ? s.running + s.subagents : 0;
53
- const scheduled = settings.showScheduledInBadge ? s.scheduledSessions : 0;
54
- const hasWaitingReview = settings.showWaitingReviewInBadge && s.waitingReviewCount > 0;
55
29
  const completed = settings.showCompletedInBadge ? s.done : 0;
56
- // 只在有 pending / active / 已完成 / 定时任务 / 等待评审时显示徽标
57
- if (pending === 0 && active === 0 && completed === 0 && scheduled === 0 && !hasWaitingReview)
30
+ const facetTotal = facetCountTotal(s);
31
+ // 只在有 pending / active / 已完成 / 任一外部来源有贡献时显示徽标
32
+ if (pending === 0 && active === 0 && completed === 0 && facetTotal === 0)
58
33
  return null;
59
- const label = groupLiveLabel(s, t, settings);
34
+ const label = groupLiveLabel(s, t, settings, now);
60
35
  const dots = [];
61
36
  if (pending > 0)
62
37
  dots.push(_jsx(StateDot, { state: "warning" }, "warn"));
63
38
  if (active > 0)
64
39
  dots.push(_jsx(StateDot, { state: "ongoing" }, "run"));
40
+ // #25①:点行顺序此前是 pending → active → **done** → facet,而明细(`hoverStatusLines`)
41
+ // 是 pending → active → **facet** → done,两处相反;而 `badge-labels.ts` 的注释声称两者
42
+ // 「完全一致」,括号里写的还正是明细那一种。此处按明细对齐(facet 排在 done 之前),
43
+ // 注释与实现从此同一条来源。
44
+ // 外部来源的相对次序由 facet.order 决定(谁更该被看见,来源自己排)。
45
+ // CSS module 的类型把 class 声明为可能 undefined,这里只在真的闪时才求值。
46
+ const urgentClass = css.groupBadgeUrgent ?? '';
47
+ for (const entry of s.facets.values()) {
48
+ const glyph = facetGlyph(entry, t, now);
49
+ const pulseClass = facetPulseClass(entry, urgentClass) || undefined;
50
+ dots.push(glyph === undefined
51
+ // provider 没画图标时退回通用点:陌生来源仍然可见,只是朴素。宿主只有三档状态点,
52
+ // 没有 error 档,所以 info 之外的色档都落到 warning 点上。
53
+ ? _jsx(StateDot, { state: entry.fold.tone === 'info' ? 'ongoing' : 'warning' }, entry.facet.id)
54
+ // #22:脉冲 class 加在**这一枚元素**上,不是整只徽标。同组里别家开闪不该让
55
+ // `pulse: false` 的来源跟着呼吸——那条约定不能依赖邻居的开关。
56
+ : _jsx("span", { className: pulseClass, children: glyph }, entry.facet.id));
57
+ }
65
58
  if (completed > 0)
66
59
  dots.push(_jsx(StateDot, { state: "done" }, "done"));
67
- // 定时任务图标(紫色 #8b5cf6 与 dsh-later 定时徽标同源,浅深底对比均 >=3:1;
68
- // urgent 橙 / overdue 红走宿主 warn/error 语义令牌)。与等待评审**用不同图标**——
69
- // 两者同属"在等"的语义,只靠颜色区分对色盲用户不可用。
70
- if (scheduled > 0) {
71
- const stateColor = s.scheduleState === 'overdue' ? 'var(--dsw-alias-state-error-primary)' : s.scheduleState === 'urgent' ? 'var(--dsw-alias-state-warn-secondary)' : '#8b5cf6';
72
- dots.push(_jsx("span", { style: { color: stateColor, display: 'inline-flex', alignItems: 'center' }, children: _jsx(IconClockOutlineRegular, { size: 14 }) }, "schedule"));
73
- }
74
- // 等待评审图标(琥珀色;超时转红)。数据来自 dsh-gitea-dispatch 的
75
- // useWaitingSummary()——本插件不自己轮询该端点(其 store 是唯一轮询方)。
76
- if (hasWaitingReview) {
77
- const stateColor = s.waitingReviewState === 'overdue' ? 'var(--dsw-alias-state-error-primary)' : 'var(--dsw-alias-state-warn-secondary)';
78
- dots.push(_jsx("span", { style: { color: stateColor, display: 'inline-flex', alignItems: 'center' }, children: _jsx(IconListPenOutlineRegular, { size: 14 }) }, "waiting-review"));
79
- }
80
- // 数字统计 pending + active + 已完成 + 定时任务会话 + 等待评审会话(与 dot 一致)
81
- // P2-3: 数字上限 99+,避免大项目组徽标过宽。
82
- // P3-3: count < countThreshold 时省略数字(点已表达"有东西");设置项 countThreshold 可调。
83
- const count = pending + active + completed + scheduled + (hasWaitingReview ? s.waitingReviewCount : 0);
60
+ // 数字 = 待审批 + 进行中(含子智能体)+ 已完成 + 各外部来源自己报的条数。
61
+ // #25②:「含子智能体」此前是**空头承诺**——`summarizeGroupStatus` 在 pending 分支里
62
+ // `continue` 掉了 `subagents += n.runningSubagentCount`,行内却给两个点。计数判据已
63
+ // 改成与 `Rows.tsx` 的 `sessionStatuses()` 同一套规则,这条注释现在才成立。
64
+ // P2-3: 上限 99+,避免大项目组徽标过宽。
65
+ // P3-3: 低于 countThreshold 时省略数字(点已表达"有东西");设置项可调。
66
+ const count = pending + active + completed + facetTotal;
84
67
  const countLabel = count > 99 ? '99+' : count >= settings.countThreshold ? String(count) : '';
85
- // P2-2: 紧急状态(overdue/urgent)时添加脉冲动画类。
86
- const isUrgent = s.scheduleState === 'overdue' || s.scheduleState === 'urgent'
87
- || s.waitingReviewState === 'overdue';
88
- const badgeClass = isUrgent ? `${css.groupBadge} ${css.groupBadgeUrgent}` : css.groupBadge;
89
- return (_jsxs("span", { className: badgeClass, role: "img", "aria-label": label, title: label, children: [dots, countLabel && _jsx("span", { className: css.groupBadgeCount, children: countLabel })] }));
90
- }
91
- // ── Hover-card status lines ──
92
- /**
93
- * Build the status detail lines for the workspace hover card.
94
- *
95
- * Extracted so `WorkspaceHoverContent` in `Rows.tsx` only needs to map the
96
- * returned array — the fork-specific status→line logic lives here.
97
- *
98
- * 按设置过滤:关掉的来源不出现在明细行里;`showHoverDetails=false` 时整段返回空。
99
- */
100
- export function hoverStatusLines(status, t, settings) {
101
- const lines = [];
102
- if (status === undefined || !settings.showHoverDetails)
103
- return lines;
104
- if (settings.showPendingInBadge) {
105
- if (status.approval > 0)
106
- lines.push({ state: 'warning', text: `${status.approval} ${t('status.waitingApproval')}` });
107
- if (status.planReview > 0)
108
- lines.push({ state: 'warning', text: `${status.planReview} ${t('status.planReview')}` });
109
- if (status.question > 0)
110
- lines.push({ state: 'warning', text: `${status.question} ${t('status.waitingAnswer')}` });
111
- }
112
- if (settings.showRunningInBadge) {
113
- if (status.running > 0)
114
- lines.push({ state: 'ongoing', text: `${status.running} ${t('status.running')}` });
115
- if (status.subagents > 0) {
116
- lines.push({
117
- state: 'ongoing',
118
- text: t(status.subagents === 1 ? 'status.subagentsRunning.one' : 'status.subagentsRunning.other', { n: status.subagents }),
119
- });
120
- }
121
- }
122
- if (settings.showWaitingReviewInBadge && status.waitingReviewCount > 0) {
123
- lines.push({ state: 'warning', text: `${status.waitingReviewCount} ${t('status.waitingReview')}` });
124
- }
125
- if (settings.showScheduledInBadge && status.scheduledSessions > 0) {
126
- lines.push({ state: 'warning', text: `${status.scheduledSessions} ${t('status.scheduled')}` });
127
- }
128
- if (settings.showCompletedInBadge && status.done > 0)
129
- lines.push({ state: 'done', text: `${status.done} ${t('status.completed')}` });
130
- return lines;
68
+ // #22:徽标**容器**不再带脉冲 class——脉冲是"某个来源的元素该闪",不是整只徽标该闪。
69
+ return (_jsxs("span", { className: css.groupBadge, role: "img", "aria-label": label, title: label, children: [dots, countLabel && _jsx("span", { className: css.groupBadgeCount, children: countLabel })] }));
131
70
  }
132
71
  //# sourceMappingURL=GroupBadge.js.map