skill-schedule 0.3.3 → 0.3.13

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 (187) hide show
  1. package/SKILL.md +12 -3
  2. package/dist/.gen-inputs.json +4 -4
  3. package/dist/admin/adminDocs.d.ts +57 -0
  4. package/dist/admin/adminDocs.d.ts.map +1 -0
  5. package/dist/admin/adminDocs.js +190 -0
  6. package/dist/admin/adminDocs.js.map +1 -0
  7. package/dist/admin/adminParts.d.ts +37 -0
  8. package/dist/admin/adminParts.d.ts.map +1 -0
  9. package/dist/admin/adminParts.js +83 -0
  10. package/dist/admin/adminParts.js.map +1 -0
  11. package/dist/admin/handlers.d.ts.map +1 -1
  12. package/dist/admin/handlers.js +196 -6
  13. package/dist/admin/handlers.js.map +1 -1
  14. package/dist/admin/routes.d.ts +10 -1
  15. package/dist/admin/routes.d.ts.map +1 -1
  16. package/dist/admin/routes.js +2 -0
  17. package/dist/admin/routes.js.map +1 -1
  18. package/dist/analyze/analyzeDocs.d.ts +51 -0
  19. package/dist/analyze/analyzeDocs.d.ts.map +1 -0
  20. package/dist/analyze/analyzeDocs.js +442 -0
  21. package/dist/analyze/analyzeDocs.js.map +1 -0
  22. package/dist/analyze/analyzeParts.d.ts +53 -0
  23. package/dist/analyze/analyzeParts.d.ts.map +1 -0
  24. package/dist/analyze/analyzeParts.js +229 -0
  25. package/dist/analyze/analyzeParts.js.map +1 -0
  26. package/dist/analyze/handlers.d.ts.map +1 -1
  27. package/dist/analyze/handlers.js +41 -4
  28. package/dist/analyze/handlers.js.map +1 -1
  29. package/dist/cli/cmd_read.js +8 -2
  30. package/dist/cli/cmd_read.js.map +1 -1
  31. package/dist/cli/config.d.ts +0 -9
  32. package/dist/cli/config.d.ts.map +1 -1
  33. package/dist/cli/config.js +20 -1
  34. package/dist/cli/config.js.map +1 -1
  35. package/dist/fetch/feishu.d.ts +6 -0
  36. package/dist/fetch/feishu.d.ts.map +1 -1
  37. package/dist/fetch/feishu.js +18 -7
  38. package/dist/fetch/feishu.js.map +1 -1
  39. package/dist/fetch/index.d.ts +1 -1
  40. package/dist/fetch/index.d.ts.map +1 -1
  41. package/dist/fetch/index.js +1 -1
  42. package/dist/fetch/index.js.map +1 -1
  43. package/dist/health.d.ts +11 -0
  44. package/dist/health.d.ts.map +1 -1
  45. package/dist/health.js +48 -22
  46. package/dist/health.js.map +1 -1
  47. package/dist/help/index.d.ts +1 -0
  48. package/dist/help/index.d.ts.map +1 -1
  49. package/dist/help/index.js +3 -0
  50. package/dist/help/index.js.map +1 -1
  51. package/dist/plan/discussDocs.d.ts +8 -0
  52. package/dist/plan/discussDocs.d.ts.map +1 -0
  53. package/dist/plan/discussDocs.js +321 -0
  54. package/dist/plan/discussDocs.js.map +1 -0
  55. package/dist/plan/feishuDocs.d.ts +19 -0
  56. package/dist/plan/feishuDocs.d.ts.map +1 -0
  57. package/dist/plan/feishuDocs.js +257 -0
  58. package/dist/plan/feishuDocs.js.map +1 -0
  59. package/dist/plan/handlers.d.ts.map +1 -1
  60. package/dist/plan/handlers.js +107 -3
  61. package/dist/plan/handlers.js.map +1 -1
  62. package/dist/plan/index.d.ts +2 -0
  63. package/dist/plan/index.d.ts.map +1 -1
  64. package/dist/plan/index.js +16 -9
  65. package/dist/plan/index.js.map +1 -1
  66. package/dist/plan/iso.d.ts +2 -0
  67. package/dist/plan/iso.d.ts.map +1 -1
  68. package/dist/plan/iso.js +6 -2
  69. package/dist/plan/iso.js.map +1 -1
  70. package/dist/plan/planDocs.d.ts +47 -0
  71. package/dist/plan/planDocs.d.ts.map +1 -0
  72. package/dist/plan/planDocs.js +159 -0
  73. package/dist/plan/planDocs.js.map +1 -0
  74. package/dist/plan/planParts.d.ts +38 -0
  75. package/dist/plan/planParts.d.ts.map +1 -0
  76. package/dist/plan/planParts.js +96 -0
  77. package/dist/plan/planParts.js.map +1 -0
  78. package/dist/plan/probe.d.ts +28 -0
  79. package/dist/plan/probe.d.ts.map +1 -0
  80. package/dist/plan/probe.js +114 -0
  81. package/dist/plan/probe.js.map +1 -0
  82. package/dist/plan/receipt.d.ts +12 -0
  83. package/dist/plan/receipt.d.ts.map +1 -1
  84. package/dist/plan/receipt.js +17 -0
  85. package/dist/plan/receipt.js.map +1 -1
  86. package/dist/plan/receiptDocs.d.ts +26 -0
  87. package/dist/plan/receiptDocs.d.ts.map +1 -0
  88. package/dist/plan/receiptDocs.js +341 -0
  89. package/dist/plan/receiptDocs.js.map +1 -0
  90. package/dist/plan/replayDocs.d.ts +165 -0
  91. package/dist/plan/replayDocs.d.ts.map +1 -0
  92. package/dist/plan/replayDocs.js +226 -0
  93. package/dist/plan/replayDocs.js.map +1 -0
  94. package/dist/plan/replaySections.d.ts +5 -0
  95. package/dist/plan/replaySections.d.ts.map +1 -0
  96. package/dist/plan/replaySections.js +471 -0
  97. package/dist/plan/replaySections.js.map +1 -0
  98. package/dist/plan/reviewDocs.d.ts +4 -0
  99. package/dist/plan/reviewDocs.d.ts.map +1 -0
  100. package/dist/plan/reviewDocs.js +130 -0
  101. package/dist/plan/reviewDocs.js.map +1 -0
  102. package/dist/plan/sync.d.ts.map +1 -1
  103. package/dist/plan/sync.js +5 -0
  104. package/dist/plan/sync.js.map +1 -1
  105. package/dist/policy/index.d.ts +1 -1
  106. package/dist/policy/index.d.ts.map +1 -1
  107. package/dist/policy/index.js +1 -1
  108. package/dist/policy/index.js.map +1 -1
  109. package/dist/policy/plan.d.ts +8 -0
  110. package/dist/policy/plan.d.ts.map +1 -1
  111. package/dist/policy/plan.js +20 -0
  112. package/dist/policy/plan.js.map +1 -1
  113. package/dist/query/handlers.d.ts +3 -0
  114. package/dist/query/handlers.d.ts.map +1 -1
  115. package/dist/query/handlers.js +86 -12
  116. package/dist/query/handlers.js.map +1 -1
  117. package/dist/query/queryDocs.d.ts +64 -0
  118. package/dist/query/queryDocs.d.ts.map +1 -0
  119. package/dist/query/queryDocs.js +554 -0
  120. package/dist/query/queryDocs.js.map +1 -0
  121. package/dist/query/routes.d.ts +11 -1
  122. package/dist/query/routes.d.ts.map +1 -1
  123. package/dist/query/routes.js +5 -1
  124. package/dist/query/routes.js.map +1 -1
  125. package/dist/render/copyArea.d.ts +61 -0
  126. package/dist/render/copyArea.d.ts.map +1 -0
  127. package/dist/render/copyArea.js +80 -0
  128. package/dist/render/copyArea.js.map +1 -0
  129. package/dist/render/html.d.ts.map +1 -1
  130. package/dist/render/html.js +3 -1
  131. package/dist/render/html.js.map +1 -1
  132. package/dist/render/index.d.ts +3 -0
  133. package/dist/render/index.d.ts.map +1 -1
  134. package/dist/render/index.js +2 -0
  135. package/dist/render/index.js.map +1 -1
  136. package/dist/shared/dayPage.d.ts +67 -0
  137. package/dist/shared/dayPage.d.ts.map +1 -0
  138. package/dist/shared/dayPage.js +92 -0
  139. package/dist/shared/dayPage.js.map +1 -0
  140. package/dist/shared/detailPage.d.ts +55 -0
  141. package/dist/shared/detailPage.d.ts.map +1 -0
  142. package/dist/shared/detailPage.js +65 -0
  143. package/dist/shared/detailPage.js.map +1 -0
  144. package/dist/shared/docPage.d.ts +22 -0
  145. package/dist/shared/docPage.d.ts.map +1 -0
  146. package/dist/shared/docPage.js +52 -0
  147. package/dist/shared/docPage.js.map +1 -0
  148. package/dist/shared/overviewPage.d.ts +52 -0
  149. package/dist/shared/overviewPage.d.ts.map +1 -0
  150. package/dist/shared/overviewPage.js +65 -0
  151. package/dist/shared/overviewPage.js.map +1 -0
  152. package/dist/shared/pageNav.d.ts +24 -0
  153. package/dist/shared/pageNav.d.ts.map +1 -0
  154. package/dist/shared/pageNav.js +70 -0
  155. package/dist/shared/pageNav.js.map +1 -0
  156. package/dist/shared/pageParts.d.ts +45 -0
  157. package/dist/shared/pageParts.d.ts.map +1 -0
  158. package/dist/shared/pageParts.js +154 -0
  159. package/dist/shared/pageParts.js.map +1 -0
  160. package/dist/shared/planPage.d.ts +49 -0
  161. package/dist/shared/planPage.d.ts.map +1 -0
  162. package/dist/shared/planPage.js +48 -0
  163. package/dist/shared/planPage.js.map +1 -0
  164. package/dist/shared/rangePage.d.ts +44 -0
  165. package/dist/shared/rangePage.d.ts.map +1 -0
  166. package/dist/shared/rangePage.js +50 -0
  167. package/dist/shared/rangePage.js.map +1 -0
  168. package/dist/shared/weekPage.d.ts +36 -0
  169. package/dist/shared/weekPage.d.ts.map +1 -0
  170. package/dist/shared/weekPage.js +42 -0
  171. package/dist/shared/weekPage.js.map +1 -0
  172. package/dist/triggers/routes.generated.d.ts +23 -1
  173. package/dist/triggers/routes.generated.d.ts.map +1 -1
  174. package/dist/triggers/routes.generated.js +4 -1
  175. package/dist/triggers/routes.generated.js.map +1 -1
  176. package/dist/write/handlers.d.ts.map +1 -1
  177. package/dist/write/handlers.js +101 -5
  178. package/dist/write/handlers.js.map +1 -1
  179. package/dist/write/writeDocs.d.ts +27 -0
  180. package/dist/write/writeDocs.d.ts.map +1 -0
  181. package/dist/write/writeDocs.js +423 -0
  182. package/dist/write/writeDocs.js.map +1 -0
  183. package/dist/write/writeParts.d.ts +54 -0
  184. package/dist/write/writeParts.d.ts.map +1 -0
  185. package/dist/write/writeParts.js +117 -0
  186. package/dist/write/writeParts.js.map +1 -0
  187. package/package.json +3 -3
@@ -0,0 +1,442 @@
1
+ /** #789 · 「分析与洞察」域的**页数据与页装配**(口径层):三张页各自要什么。
2
+ *
3
+ * 为什么口径住这里、不住共用位:共用位不许出现任何一个能力的名字,而「七维是哪七个、日均按谁摊、
4
+ * 基线取哪一段、二级分类怎么归」全是**本域的口径**——摆好再交给 `src/shared/` 的整页装配与
5
+ * 本域的族级件(`./analyzeParts.ts`)。
6
+ *
7
+ * **不重算别家口径**:一级分类映射调 `policy` 的 `l1Of`,健康分调 `policy` 的 `computeHealthScore`,
8
+ * 红黄线的判定调 `policy` 的 `detectAnomalies`(阈值只此一处),时长格式化调 `fmtDur`/`fmtDurShort`,
9
+ * 时间解析调 `toMinutes`;热力矩阵与配色调 `src/shared/pageParts.ts` 的现成件。
10
+ *
11
+ * 三张页(老侧家族 → 哪一条唤醒词):
12
+ * · **作息对比**(老侧 f03)←「对比两个月」(`kind=months` 或 `kind=ranges`):
13
+ * 四卡对照 + 7 维差异柱 + AI 思考钩子;
14
+ * · **类别深挖**(老侧 f04)←「类别深挖」(`kind=category`):
15
+ * 24h × N 天热力图 + 分类总览 + 记录明细;
16
+ * · **异常检测**(老侧 f05)←「异常检测」(`kind=anomaly`):
17
+ * 红框与黄框的异常条目 + 7 维雷达。
18
+ *
19
+ * **载荷不动**:本票只把「真页 HTML」交回出口,三个 `data` 载荷(`buildRecordCompare`/
20
+ * `buildCategoryDeep`/`buildAnomaly`)逐字不变——那是机器读的那一份。页是给人读的那一份,
21
+ * 按老侧家族的信息层级画(老侧逐块的名字与口径见 `docs/skills/skill-schedule/场景清单.json`
22
+ * 的 `families[].blocks_old`)。
23
+ *
24
+ * **页上文案纪律**:不出现命令键、库列名、参数名、英文裸词;并列关系一律用版面表达
25
+ * (卡片格/对照行/框),不拿 `、`/`·`/`|`/`;`/`~` 这些符号顶替设计——范围一律写「至」,
26
+ * 不用波浪号。需要一行里并列两件事时走公共层 `renderCaliberLine`(它按全角竖线拆成两段版面)。
27
+ *
28
+ * #891 补的**页内定位**(不动件序列,只给已有的段名加锚点与页首目录):判据(小节数 ≥ 3 出目录)
29
+ * 与装配的唯一一处定义地在 `shared/pageNav.ts` 的 `SECTION_TOC_MIN`。三张页都是长页:
30
+ * 作息对比 4 小节、类别深挖 5 小节、异常检测 4 小节(段名见各自的件序列;带读数的那两颗段名
31
+ * 〔`24h × N 天热力图`〕在目录里收成短名 `热力图`,读数留在大段名上)。
32
+ */
33
+ import { renderCaliberLine, renderConclusionBar, renderDataTable, renderDistributionRows, renderKpiGrid, renderProseBlock, } from 'base-paint/blocks';
34
+ import { HEALTH_TARGETS, detectAnomalies, fmtDur, fmtDurShort, fmtPct, getEmojiPrefix, l1Of, parseCategory, toMinutes, } from '../policy/index.js';
35
+ import { buildCategoryDeep, buildRecordCompare } from '../render/index.js';
36
+ import { scheduleCopyArea, scheduleCopyLog, scheduleNowStamp } from '../render/copyArea.js';
37
+ import { assembleDocPage } from '../shared/docPage.js';
38
+ import { pageSections } from '../shared/pageNav.js';
39
+ import { categoryColor, hourCellsOf, renderHeatMatrix } from '../shared/pageParts.js';
40
+ import { analyzePartsCss, renderAnomalyFrames, renderDiffBars, renderRadar, renderSectionTitle, } from './analyzeParts.js';
41
+ /** 页眉那一行域词(三张页同一句)。 */
42
+ const EYEBROW = '作息管家 分析与洞察';
43
+ /** 七个维度=健康分那张表(老侧 `HEALTH_DIMS` 同一组:创作不参评)。 */
44
+ const DIMS = Object.keys(HEALTH_TARGETS);
45
+ /** 基线段长度(老侧 `render_record_anomaly` 的 30 天,不新造)。 */
46
+ const BASELINE_DAYS = 30;
47
+ /** 热力图最多印多少行(再多只印最近这些天,与老侧区间页的上限同量级)。 */
48
+ const HEAT_ROWS_MAX = 31;
49
+ /** 一处「大变化」线:日均差超过这么久(老侧 `ai_questions_for_compare` 的 4h 是**总量**口径的线,
50
+ * 本页把维度读数换成日均之后按同一量级重定:两小时/半小时/一小时)。 */
51
+ const BIG_CHANGE_MINUTES = 2 * 60;
52
+ const WEEKDAY = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
53
+ /* ─────────────────────────── 小工具(日期与读数) ─────────────────────────── */
54
+ const pad2 = (n) => String(n).padStart(2, '0');
55
+ const fmtDate = (d) => d.getFullYear() + '-' + pad2(d.getMonth() + 1) + '-' + pad2(d.getDate());
56
+ /** `start` 至 `end` 逐日(含两端);起止非法或倒置时给空数组,调用方按空态处理。 */
57
+ export function datesOf(start, end) {
58
+ const out = [];
59
+ const d = new Date(start + 'T00:00:00');
60
+ const last = new Date(end + 'T00:00:00');
61
+ if (Number.isNaN(d.getTime()) || Number.isNaN(last.getTime()) || d.getTime() > last.getTime())
62
+ return out;
63
+ while (d.getTime() <= last.getTime()) {
64
+ out.push(fmtDate(d));
65
+ d.setDate(d.getDate() + 1);
66
+ }
67
+ return out;
68
+ }
69
+ /** 某天往前推 `n` 天(`n` 取正数)。 */
70
+ export function shiftDays(date, n) {
71
+ const d = new Date(date + 'T00:00:00');
72
+ if (Number.isNaN(d.getTime()))
73
+ return date;
74
+ d.setDate(d.getDate() - n);
75
+ return fmtDate(d);
76
+ }
77
+ /** 基线段的第一天:检测窗口结束日往前数满 30 天(与老侧「基线=结束日往前 30 天」同一段)。 */
78
+ export function baselineStartOf(end) {
79
+ return shiftDays(end, BASELINE_DAYS - 1);
80
+ }
81
+ /** 逐维(一级分类)合计分钟。表外的分类进 `未知` 那一格(与 `l1Of` 同一落点)。 */
82
+ function byDim(records) {
83
+ const out = {};
84
+ for (const r of records) {
85
+ const dim = l1Of(r.category);
86
+ out[dim] = (out[dim] ?? 0) + (r.duration_minutes ?? 0);
87
+ }
88
+ return out;
89
+ }
90
+ const totalOf = (dim) => Object.values(dim).reduce((a, b) => a + b, 0);
91
+ /** 带正负号的短时长(卡片与柱子旁那一栏用;`+`/`-` 前置)。 */
92
+ function signedShort(mins) {
93
+ const n = Math.round(mins);
94
+ if (n > 0)
95
+ return '+' + fmtDurShort(n);
96
+ if (n < 0)
97
+ return '-' + fmtDurShort(-n);
98
+ return '0分钟';
99
+ }
100
+ /** 带正负号的长时长(成句的地方用)。 */
101
+ function signedDur(mins) {
102
+ const n = Math.round(mins);
103
+ if (n > 0)
104
+ return '+' + fmtDur(n);
105
+ if (n < 0)
106
+ return '-' + fmtDur(-n);
107
+ return '0分钟';
108
+ }
109
+ /** 带正负号的百分数(一位小数)。 */
110
+ function signedPct(pct) {
111
+ return (pct > 0 ? '+' : '') + String(pct) + '%';
112
+ }
113
+ function minutesOf(records) {
114
+ return records.reduce((a, r) => a + (r.duration_minutes ?? 0), 0);
115
+ }
116
+ /** 按天的时刻片段(热力矩阵那一件要的形状:当天的分钟数 + 一枚不透明键)。 */
117
+ function spansOf(records, key) {
118
+ return records.map((r) => ({ start: toMinutes(r.time_start), end: toMinutes(r.time_end), key }));
119
+ }
120
+ /** 时段写法(页上只用「至」,不用波浪号)。 */
121
+ const spanText = (r) => r.time_start + ' 至 ' + r.time_end;
122
+ /** AI 思考钩子那几句(照老侧 `ai_questions_for_compare` 的骨架重写:大变化、睡眠那一维、工作那一维、兜底)。 */
123
+ function compareQuestions(rows, labelA, labelB) {
124
+ const qs = [];
125
+ const big = rows.filter((row) => Math.abs(row.deltaMinutes) > BIG_CHANGE_MINUTES);
126
+ if (big.length > 0) {
127
+ const top = big[0];
128
+ qs.push(labelA + ' 与 ' + labelB + ' 在「' + top.label + '」这一维的日均差了 ' + signedDur(top.deltaMinutes)
129
+ + ',这一段变化的主因你想从哪里说起?');
130
+ }
131
+ const keep = rows.find((row) => row.label === '维持');
132
+ if (keep !== undefined && Math.abs(keep.deltaMinutes) > 30) {
133
+ qs.push('「维持」那一维的日均差 ' + signedDur(keep.deltaMinutes) + ',这一段是你主动调整还是被事情推着走的?');
134
+ }
135
+ const work = rows.find((row) => row.label === '工作');
136
+ if (work !== undefined && work.deltaMinutes > 60) {
137
+ qs.push('「工作」那一维的日均多出 ' + signedDur(work.deltaMinutes) + ',多出来的时间是从哪一处挪过来的?');
138
+ }
139
+ if (qs.length === 0) {
140
+ qs.push('两段的日均整体接近,有没有哪一处细小的差别其实更要紧?');
141
+ }
142
+ return qs;
143
+ }
144
+ /** 作息对比整页(老侧 f03:四卡对照 + 7 维差异 + AI 钩子位)。
145
+ *
146
+ * **口径**:七维那一段比的是**按有记录的天数摊平的日均**(老侧 `build_diff_table` 比的是总量——那
147
+ * 口径遇到「一个区间记录到一半」就会把整个区间读成下降,本票按日均比,与「异常检测」那一页同一条)。
148
+ * 四卡里同时给总量差,两个读法都在页上,读者自己看得见差在哪。 */
149
+ export function renderComparePage(input) {
150
+ const dimA = byDim(input.a);
151
+ const dimB = byDim(input.b);
152
+ const datesA = datesOf(input.startA, input.endA);
153
+ const datesB = datesOf(input.startB, input.endB);
154
+ const activeA = Math.max(1, new Set(input.a.map((r) => r.date)).size);
155
+ const activeB = Math.max(1, new Set(input.b.map((r) => r.date)).size);
156
+ const totalA = totalOf(dimA);
157
+ const totalB = totalOf(dimB);
158
+ const avgA = totalA / activeA;
159
+ const avgB = totalB / activeB;
160
+ const rows = DIMS.map((dim) => {
161
+ const aDaily = Math.round((dimA[dim] ?? 0) / activeA);
162
+ const bDaily = Math.round((dimB[dim] ?? 0) / activeB);
163
+ const delta = bDaily - aDaily;
164
+ const pct = aDaily > 0 ? fmtPct(Math.abs(delta), aDaily) : (bDaily > 0 ? 100 : 0);
165
+ return {
166
+ label: dim,
167
+ glyph: getEmojiPrefix(dim),
168
+ aValue: aDaily,
169
+ bValue: bDaily,
170
+ aText: fmtDurShort(aDaily),
171
+ bText: fmtDurShort(bDaily),
172
+ deltaText: signedShort(delta) + ',' + signedPct(delta > 0 ? pct : -pct),
173
+ deltaMinutes: delta,
174
+ aLong: fmtDur(aDaily),
175
+ bLong: fmtDur(bDaily),
176
+ tone: delta > 0 ? 'up' : (delta < 0 ? 'down' : 'flat'),
177
+ };
178
+ });
179
+ const changed = rows.filter((row) => {
180
+ const base = row.aValue > 0 ? row.aValue : row.bValue;
181
+ return base > 0 && Math.abs(row.deltaMinutes) / base >= 0.1;
182
+ });
183
+ const cards = [
184
+ {
185
+ label: '区间 A', value: input.labelA,
186
+ detail: input.startA + ' 至 ' + input.endA + ',共 ' + String(datesA.length) + ' 天,其中 ' + String(activeA) + ' 天有记录',
187
+ },
188
+ {
189
+ label: '区间 B', value: input.labelB,
190
+ detail: input.startB + ' 至 ' + input.endB + ',共 ' + String(datesB.length) + ' 天,其中 ' + String(activeB) + ' 天有记录',
191
+ },
192
+ { label: '总时长差', value: signedShort(totalB - totalA), detail: 'B 减 A 的净变化' },
193
+ { label: '日均差', value: signedShort(avgB - avgA), detail: '按有记录的天数摊平到每一天' },
194
+ ];
195
+ const head = {
196
+ docTitle: '作息管家 作息对比',
197
+ eyebrow: EYEBROW,
198
+ title: '作息对比',
199
+ subtitle: input.labelA + '(' + input.startA + ' 至 ' + input.endA + ')与 ' + input.labelB
200
+ + '(' + input.startB + ' 至 ' + input.endB + ')逐维对照。',
201
+ };
202
+ const conclusion = input.labelA + ' 与 ' + input.labelB + ':总时长从 ' + fmtDur(totalA) + ' 到 ' + fmtDur(totalB)
203
+ + '。按有记录的天数摊平,日均从 ' + fmtDur(Math.round(avgA)) + ' 到 ' + fmtDur(Math.round(avgB))
204
+ + '。七个维度里有 ' + String(changed.length) + ' 个的日均变化过了一成。';
205
+ const { toc, body } = pageSections([
206
+ { navText: '四卡对照', html: renderKpiGrid(cards, { title: '四卡对照' }) },
207
+ { html: renderConclusionBar(conclusion) },
208
+ { navText: '7 维差异', html: renderSectionTitle('7 维差异')
209
+ + renderCaliberLine('A 段=' + input.labelA + ',' + input.startA + ' 至 ' + input.endA
210
+ + ' | B 段=' + input.labelB + ',' + input.startB + ' 至 ' + input.endB)
211
+ + renderCaliberLine('柱长按这一维里两段的较大者比 | 差值是 B 减 A,涨绿降红 | 七维按一级分类合计,创作不参评')
212
+ + renderDiffBars(rows) },
213
+ { navText: 'AI 思考钩子', html: renderSectionTitle('AI 思考钩子')
214
+ + renderCaliberLine('这一节是留给 AI 的入口:把下面任意一句复制给 AI,它就着这两个区间往下聊')
215
+ // 逐句一段正文(**不用列表行**:那一件是「一行一格、超出裁掉」的形状,窄屏上问题会被省略号吃掉——
216
+ // #789 的响应式读数在 390 档实测裁掉过四成,见证据件第四节)。
217
+ + compareQuestions(rows, input.labelA, input.labelB).map((text) => renderProseBlock({ text })).join('') },
218
+ { navText: '复制与留档', html: scheduleCopyArea({
219
+ title: '复制与留档',
220
+ dataActionId: 'ilife-sch-compare-copy-data',
221
+ logActionId: 'ilife-sch-compare-copy-log',
222
+ key: 'schedule.record.compare',
223
+ payload: buildRecordCompare({ labelA: input.labelA, labelB: input.labelB, a: [...input.a], b: [...input.b] }),
224
+ log: scheduleCopyLog({
225
+ command: 'schedule-cmd-read schedule.record.compare --params {"kind":"ranges","labelA":"' + input.labelA
226
+ + '","startA":"' + input.startA + '","endA":"' + input.endA + '","labelB":"' + input.labelB
227
+ + '","startB":"' + input.startB + '","endB":"' + input.endB + '"}',
228
+ source: '作息记录表(' + String(input.a.length + input.b.length) + ' 行)',
229
+ actionAt: scheduleNowStamp(),
230
+ }),
231
+ }) },
232
+ ]);
233
+ return assembleDocPage({ head, content: toc + body, extraCss: analyzePartsCss() });
234
+ }
235
+ /** 类别深挖整页(老侧 f04:24h × N 天热力图 + 分类总览 + 记录明细)。 */
236
+ export function renderCategoryPage(input) {
237
+ const hits = input.records.filter((r) => r.date >= input.start && r.date <= input.end
238
+ && l1Of(r.category) === input.level1);
239
+ const dates = datesOf(input.start, input.end);
240
+ const rows = dates.map((date) => {
241
+ const day = hits.filter((r) => r.date === date);
242
+ const cells = hourCellsOf(spansOf(day, input.level1));
243
+ return {
244
+ label: WEEKDAY[new Date(date + 'T00:00:00').getDay()],
245
+ date,
246
+ cells,
247
+ sum: fmtDurShort(minutesOf(day)),
248
+ };
249
+ });
250
+ const capped = rows.length > HEAT_ROWS_MAX ? rows.slice(rows.length - HEAT_ROWS_MAX) : rows;
251
+ const active = new Set(hits.map((r) => r.date)).size;
252
+ const total = minutesOf(hits);
253
+ const dailyAvg = active > 0 ? total / active : 0;
254
+ const bySecond = new Map();
255
+ for (const r of hits) {
256
+ const parsed = parseCategory(r.category);
257
+ const key = parsed.level2 === null ? '未分二级' : parsed.level2;
258
+ bySecond.set(key, (bySecond.get(key) ?? 0) + (r.duration_minutes ?? 0));
259
+ }
260
+ const secondKeys = [...bySecond.keys()].sort((x, y) => (bySecond.get(y) ?? 0) - (bySecond.get(x) ?? 0));
261
+ const secondRows = secondKeys.map((key) => ({
262
+ label: key,
263
+ value: fmtDur(bySecond.get(key) ?? 0) + ',占 ' + String(fmtPct(bySecond.get(key) ?? 0, total)) + '%',
264
+ pct: total > 0 ? Math.round(((bySecond.get(key) ?? 0) / total) * 100) : 0,
265
+ color: categoryColor(key, secondKeys),
266
+ }));
267
+ const detailRows = [...hits]
268
+ .sort((x, y) => (x.date + x.time_start).localeCompare(y.date + y.time_start))
269
+ .map((r) => ({
270
+ date: r.date,
271
+ time: spanText(r),
272
+ activity: r.activity,
273
+ category: r.category,
274
+ duration: fmtDur(r.duration_minutes ?? 0),
275
+ }));
276
+ const cards = [
277
+ {
278
+ label: '深挖类别', value: input.level1,
279
+ detail: input.requested === input.level1 ? '你问的就是这一维' : '「' + input.requested + '」按一级分类归到这一维',
280
+ },
281
+ { label: '总时长', value: fmtDur(total), detail: '这一段里这一维的时长合计' },
282
+ { label: '活跃天数', value: String(active), unit: '天', detail: '窗里一共 ' + String(dates.length) + ' 天' },
283
+ { label: '日均', value: fmtDur(Math.round(dailyAvg)), detail: '按有记录的那几天摊平' },
284
+ ];
285
+ const head = {
286
+ docTitle: '作息管家 类别深挖',
287
+ eyebrow: EYEBROW,
288
+ title: '类别深挖',
289
+ subtitle: '「' + input.level1 + '」在 ' + input.start + ' 至 ' + input.end + ' 的读数:'
290
+ + String(active) + ' 天里有记录,共 ' + fmtDur(total) + '。',
291
+ };
292
+ const caliber = input.requested === input.level1
293
+ ? '这一维按一级分类算 | 热力一格是一小时 | 没有记录的小时也占格'
294
+ : '「' + input.requested + '」按一级分类归到「' + input.level1 + '」 | 热力一格是一小时 | 没有记录的小时也占格';
295
+ const heatTitle = '24h × ' + String(dates.length) + ' 天热力图';
296
+ const { toc, body } = pageSections([
297
+ { navText: '这一段的读数', html: renderKpiGrid(cards, { title: '这一段的读数' }) },
298
+ { html: renderCaliberLine(caliber) },
299
+ // 段名是「24h × N 天热力图」(N 随这一段的天数变);目录项与它逐字同源(同一个常量写两处拼接)。
300
+ { navText: heatTitle, html: renderHeatMatrix(capped, {
301
+ order: [input.level1],
302
+ id: 'sch-an-heat',
303
+ title: heatTitle,
304
+ legend: true,
305
+ withTotal: true,
306
+ dayLabel: (row) => row.label + ' ' + row.date.slice(5),
307
+ }) },
308
+ { html: capped.length === rows.length
309
+ ? ''
310
+ : renderCaliberLine('这一段跨了 ' + String(rows.length) + ' 天,热力图只印最近 ' + String(capped.length) + ' 天') },
311
+ { navText: '分类总览', html: renderSectionTitle('分类总览')
312
+ + renderCaliberLine('这一维下面各二级分类的时长与占比 | 只有一级分类的记录归在「未分二级」')
313
+ + renderDistributionRows({ rows: secondRows }) },
314
+ { navText: '记录明细', html: renderSectionTitle('记录明细')
315
+ + renderDataTable({
316
+ columns: [
317
+ { key: 'date', label: '日期' },
318
+ { key: 'time', label: '时段' },
319
+ { key: 'activity', label: '活动' },
320
+ { key: 'category', label: '分类' },
321
+ { key: 'duration', label: '时长', align: 'right' },
322
+ ],
323
+ rows: detailRows,
324
+ emptyText: '这一段里这一维没有记录',
325
+ }) },
326
+ { navText: '复制与留档', html: scheduleCopyArea({
327
+ title: '复制与留档',
328
+ dataActionId: 'ilife-sch-category-copy-data',
329
+ logActionId: 'ilife-sch-category-copy-log',
330
+ key: 'schedule.record.compare',
331
+ payload: buildCategoryDeep(input.start, input.end, input.level1, [...input.records]),
332
+ log: scheduleCopyLog({
333
+ command: 'schedule-cmd-read schedule.record.compare --params {"kind":"category","category":"'
334
+ + input.level1 + '","start":"' + input.start + '","end":"' + input.end + '"}',
335
+ source: '作息记录表(' + String(hits.length) + ' 行)',
336
+ actionAt: scheduleNowStamp(),
337
+ }),
338
+ }) },
339
+ ]);
340
+ return assembleDocPage({ head, content: toc + body, extraCss: analyzePartsCss() });
341
+ }
342
+ /** 异常检测整页(老侧 f05:红框与黄框的条目 + 7 维雷达)。
343
+ *
344
+ * **口径**(老侧 `render_record_anomaly` 同一条):基线段=结束日往前 30 天,窗口=最近 N 天;
345
+ * 两段各自**先摊成日均**再比。红黄线取 `policy` 的 `detectAnomalies`:偏离过两成红框,过一成黄框。
346
+ * (老侧拿两段的总量直接比,窗口比基线短时必然读成降——本票按日均比,不照抄那处口径瑕疵。) */
347
+ export function renderAnomalyPage(input) {
348
+ const cur = byDim(input.records);
349
+ const base = byDim(input.baseline);
350
+ const w = Math.max(1, input.windowDays);
351
+ const curDaily = {};
352
+ const baseDaily = {};
353
+ for (const dim of DIMS) {
354
+ curDaily[dim] = (cur[dim] ?? 0) / w;
355
+ baseDaily[dim] = (base[dim] ?? 0) / BASELINE_DAYS;
356
+ }
357
+ const found = detectAnomalies(curDaily, baseDaily)
358
+ .sort((x, y) => (x.level === y.level ? Math.abs(y.deltaPct) - Math.abs(x.deltaPct) : (x.level === 'red' ? -1 : 1)));
359
+ const frames = found.map((a) => ({
360
+ level: a.level === 'red' ? 'red' : 'yellow',
361
+ headline: a.dim + (a.deltaPct > 0 ? '涨 ' : '降 ') + String(Math.abs(a.deltaPct)) + '%',
362
+ detail: '这一段日均 ' + fmtDur(Math.round(a.cur)) + ',基线日均 ' + fmtDur(Math.round(a.prev))
363
+ + ',两段差了 ' + signedDur(a.cur - a.prev) + '。',
364
+ }));
365
+ const reds = found.filter((a) => a.level === 'red').length;
366
+ const yellows = found.filter((a) => a.level === 'yellow').length;
367
+ const windowStart = shiftDays(input.end, w - 1);
368
+ const emptyText = w >= BASELINE_DAYS
369
+ ? '窗口与基线取的是同一段日子,逐维当然读不出偏离。要看偏离,把窗口开小一点(比如最近 7 天)。'
370
+ : '这一段的日均与基线比,没有哪一维的偏离过了一成。';
371
+ const cards = [
372
+ { label: '检测窗口', value: String(w), unit: '天', detail: windowStart + ' 至 ' + input.end },
373
+ {
374
+ label: '检出异常', value: String(found.length), unit: '项',
375
+ detail: found.length === 0 ? '这一段没有过线的维度' : '过了一成的维度数',
376
+ },
377
+ { label: '红框', value: String(reds), unit: '项', detail: '偏离过了两成' },
378
+ { label: '黄框', value: String(yellows), unit: '项', detail: '偏离过了一成' },
379
+ ];
380
+ const head = {
381
+ docTitle: '作息管家 异常检测',
382
+ eyebrow: EYEBROW,
383
+ title: '异常检测',
384
+ subtitle: '最近 ' + String(w) + ' 天(' + windowStart + ' 至 ' + input.end + ')的日均,与 ' + input.baselineStart
385
+ + ' 至 ' + input.end + ' 这 30 天的日均逐维对照。',
386
+ };
387
+ const radarRows = DIMS.map((dim) => ({
388
+ dim,
389
+ cur: Math.round(curDaily[dim]),
390
+ prev: Math.round(baseDaily[dim]),
391
+ move: signedShort(curDaily[dim] - baseDaily[dim]),
392
+ }));
393
+ const { toc, body } = pageSections([
394
+ { navText: '这一趟检测的读数', html: renderKpiGrid(cards, { title: '这一趟检测的读数' }) },
395
+ { navText: '异常详情', html: renderSectionTitle('异常详情')
396
+ + renderCaliberLine('红框=偏离过两成 | 黄框=偏离过一成 | 基线=' + input.baselineStart
397
+ + ' 至 ' + input.end + ' 这 30 天的日均')
398
+ + renderAnomalyFrames(frames, emptyText) },
399
+ { navText: '7 维雷达', html: renderSectionTitle('7 维雷达')
400
+ + renderRadar({
401
+ dims: DIMS.map((dim) => ({ label: dim, current: curDaily[dim], baseline: baseDaily[dim] })),
402
+ currentLabel: '最近 ' + String(w) + ' 天',
403
+ baselineLabel: '近 30 天',
404
+ caption: '蓝面=最近 ' + String(w) + ' 天的日均,灰面=近 30 天的日均。每一个轴按这一维里两段的较大者铺满,谁缩进去谁就少。',
405
+ })
406
+ + renderDataTable({
407
+ columns: [
408
+ { key: 'dim', label: '维度' },
409
+ { key: 'cur', label: '这一段日均', align: 'right' },
410
+ { key: 'prev', label: '基线日均', align: 'right' },
411
+ { key: 'move', label: '日均变化', align: 'right' },
412
+ ],
413
+ rows: radarRows.map((row) => {
414
+ const glyph = getEmojiPrefix(row.dim);
415
+ return { dim: glyph === '' ? row.dim : glyph + ' ' + row.dim, cur: fmtDur(row.cur), prev: fmtDur(row.prev), move: row.move };
416
+ }),
417
+ caption: '七维的日均读数(创作不参评)',
418
+ }) },
419
+ { navText: '复制与留档', html: scheduleCopyArea({
420
+ title: '复制与留档',
421
+ dataActionId: 'ilife-sch-anomaly-copy-data',
422
+ logActionId: 'ilife-sch-anomaly-copy-log',
423
+ key: 'schedule.record.compare',
424
+ // 这一份摘要从页上那几张读数原样拼(不重跑口径:红黄框与逐维日均就是上面算出来的那几行)。
425
+ payload: {
426
+ summary: '异常检测:最近 ' + String(w) + ' 天(' + windowStart + ' 至 ' + input.end + '),基线 '
427
+ + input.baselineStart + ' 至 ' + input.end + ' 这 30 天的日均,检出红框 ' + String(reds)
428
+ + ' 项、黄框 ' + String(yellows) + ' 项。'
429
+ + radarRows.map((row) => row.dim + ' 这一段日均 ' + fmtDur(row.cur) + ',基线日均 ' + fmtDur(row.prev)
430
+ + '(' + row.move + ')。').join(''),
431
+ },
432
+ log: scheduleCopyLog({
433
+ command: 'schedule-cmd-read schedule.record.compare --params {"kind":"anomaly","end":"' + input.end
434
+ + '","windowDays":' + String(w) + '}',
435
+ source: '作息记录表(窗口 ' + String(input.records.length) + ' 行)',
436
+ actionAt: scheduleNowStamp(),
437
+ }),
438
+ }) },
439
+ ]);
440
+ return assembleDocPage({ head, content: toc + body, extraCss: analyzePartsCss() });
441
+ }
442
+ //# sourceMappingURL=analyzeDocs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeDocs.js","sourceRoot":"","sources":["../../src/analyze/analyzeDocs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /** 域内段名(页上一段的标题)。老侧每个区块都有自己的名字,出页门与探针按名字认块,
2
+ * 故段名由一处产出:本件。 */
3
+ export declare function renderSectionTitle(text: string): string;
4
+ export interface DiffBarInput {
5
+ readonly label: string;
6
+ /** 维度名前的字形(由调用方给,本件不认领域)。 */
7
+ readonly glyph: string;
8
+ /** 两段的原始读数(分钟)——只用来算柱长,不上屏。 */
9
+ readonly aValue: number;
10
+ readonly bValue: number;
11
+ /** 两段已格式化的读数(上屏的那两串)。 */
12
+ readonly aText: string;
13
+ readonly bText: string;
14
+ /** 差值已格式化的样子(上屏)。 */
15
+ readonly deltaText: string;
16
+ readonly tone: 'up' | 'down' | 'flat';
17
+ }
18
+ /** 一条维度一行:名字 + 差值 / A 与 B 各一条柱子与读数。柱长按**本行两段的较大者**比
19
+ * (逐行归一:一维与另一维的量级差一个数量级时,跨行归一会把小维度压成看不见的一条线)。 */
20
+ export declare function renderDiffBars(rows: readonly DiffBarInput[]): string;
21
+ export interface RadarDimInput {
22
+ readonly label: string;
23
+ /** 当前段的日均分钟数。 */
24
+ readonly current: number;
25
+ /** 基线段的日均分钟数。 */
26
+ readonly baseline: number;
27
+ }
28
+ export interface RadarInput {
29
+ readonly dims: readonly RadarDimInput[];
30
+ readonly currentLabel: string;
31
+ readonly baselineLabel: string;
32
+ /** 图上那一行的读法(两圈各是什么)。 */
33
+ readonly caption: string;
34
+ }
35
+ /** 七维雷达:一张多边形图,两个面=当前段与基线段。少于三维不出(画不成面)。
36
+ *
37
+ * **每一个轴按这一维里两段的较大者铺满**(与「7 维差异柱」同一条:柱长按本行两段的较大者比)。
38
+ * 为什么不按七维共用一个最大值:作息那七维的量级差着一个数量级(睡眠十小时对「日常」二十分钟),
39
+ * 共用一个最大值会把六个维度压成一个点——老侧那一版就是共用最大值,图上只剩睡眠那一根。 */
40
+ export declare function renderRadar(input: RadarInput): string;
41
+ export interface AnomalyFrameInput {
42
+ readonly level: 'red' | 'yellow';
43
+ /** 一条框的第一行(这一维怎么了)。 */
44
+ readonly headline: string;
45
+ /** 一条框的第二行(读数与怎么读)。 */
46
+ readonly detail: string;
47
+ }
48
+ /** 红框(过两成)与黄框(过一成)的条目列表;一条都没有=一行空态文案(不留空壳)。 */
49
+ export declare function renderAnomalyFrames(items: readonly AnomalyFrameInput[], emptyText: string): string;
50
+ /** 本处族级件的样式(只对用上它们的页面有作用)。
51
+ * 颜色只取冻结 token 与 `CHART_PALETTE`;长度只取上面那组常量——本串里不出现 `px` 字面量。 */
52
+ export declare function analyzePartsCss(): string;
53
+ //# sourceMappingURL=analyzeParts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeParts.d.ts","sourceRoot":"","sources":["../../src/analyze/analyzeParts.ts"],"names":[],"mappings":"AAgFA;mBACmB;AACnB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAID,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qBAAqB;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;CACvC;AAED;kDACkD;AAClD,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAmBpE;AAWD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iBAAiB;IACjB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,wBAAwB;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;kDAIkD;AAClD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAiCrD;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC;IACjC,uBAAuB;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,+CAA+C;AAC/C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAclG;AAID;kEACkE;AAClE,wBAAgB,eAAe,IAAI,MAAM,CA0DxC"}