skill-schedule 0.3.2 → 0.3.12

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 (186) 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/fetch/feishu.d.ts +6 -0
  32. package/dist/fetch/feishu.d.ts.map +1 -1
  33. package/dist/fetch/feishu.js +18 -7
  34. package/dist/fetch/feishu.js.map +1 -1
  35. package/dist/fetch/index.d.ts +1 -1
  36. package/dist/fetch/index.d.ts.map +1 -1
  37. package/dist/fetch/index.js +1 -1
  38. package/dist/fetch/index.js.map +1 -1
  39. package/dist/fetch/paths.d.ts +17 -4
  40. package/dist/fetch/paths.d.ts.map +1 -1
  41. package/dist/fetch/paths.js +25 -7
  42. package/dist/fetch/paths.js.map +1 -1
  43. package/dist/health.d.ts.map +1 -1
  44. package/dist/health.js +12 -8
  45. package/dist/health.js.map +1 -1
  46. package/dist/help/index.d.ts +1 -0
  47. package/dist/help/index.d.ts.map +1 -1
  48. package/dist/help/index.js +3 -0
  49. package/dist/help/index.js.map +1 -1
  50. package/dist/plan/discussDocs.d.ts +8 -0
  51. package/dist/plan/discussDocs.d.ts.map +1 -0
  52. package/dist/plan/discussDocs.js +321 -0
  53. package/dist/plan/discussDocs.js.map +1 -0
  54. package/dist/plan/feishuDocs.d.ts +19 -0
  55. package/dist/plan/feishuDocs.d.ts.map +1 -0
  56. package/dist/plan/feishuDocs.js +257 -0
  57. package/dist/plan/feishuDocs.js.map +1 -0
  58. package/dist/plan/handlers.d.ts.map +1 -1
  59. package/dist/plan/handlers.js +107 -3
  60. package/dist/plan/handlers.js.map +1 -1
  61. package/dist/plan/index.d.ts +2 -0
  62. package/dist/plan/index.d.ts.map +1 -1
  63. package/dist/plan/index.js +16 -9
  64. package/dist/plan/index.js.map +1 -1
  65. package/dist/plan/iso.d.ts +2 -0
  66. package/dist/plan/iso.d.ts.map +1 -1
  67. package/dist/plan/iso.js +6 -2
  68. package/dist/plan/iso.js.map +1 -1
  69. package/dist/plan/planDocs.d.ts +47 -0
  70. package/dist/plan/planDocs.d.ts.map +1 -0
  71. package/dist/plan/planDocs.js +159 -0
  72. package/dist/plan/planDocs.js.map +1 -0
  73. package/dist/plan/planParts.d.ts +38 -0
  74. package/dist/plan/planParts.d.ts.map +1 -0
  75. package/dist/plan/planParts.js +96 -0
  76. package/dist/plan/planParts.js.map +1 -0
  77. package/dist/plan/probe.d.ts +28 -0
  78. package/dist/plan/probe.d.ts.map +1 -0
  79. package/dist/plan/probe.js +114 -0
  80. package/dist/plan/probe.js.map +1 -0
  81. package/dist/plan/receipt.d.ts +12 -0
  82. package/dist/plan/receipt.d.ts.map +1 -1
  83. package/dist/plan/receipt.js +17 -0
  84. package/dist/plan/receipt.js.map +1 -1
  85. package/dist/plan/receiptDocs.d.ts +26 -0
  86. package/dist/plan/receiptDocs.d.ts.map +1 -0
  87. package/dist/plan/receiptDocs.js +341 -0
  88. package/dist/plan/receiptDocs.js.map +1 -0
  89. package/dist/plan/replayDocs.d.ts +165 -0
  90. package/dist/plan/replayDocs.d.ts.map +1 -0
  91. package/dist/plan/replayDocs.js +226 -0
  92. package/dist/plan/replayDocs.js.map +1 -0
  93. package/dist/plan/replaySections.d.ts +5 -0
  94. package/dist/plan/replaySections.d.ts.map +1 -0
  95. package/dist/plan/replaySections.js +471 -0
  96. package/dist/plan/replaySections.js.map +1 -0
  97. package/dist/plan/reviewDocs.d.ts +4 -0
  98. package/dist/plan/reviewDocs.d.ts.map +1 -0
  99. package/dist/plan/reviewDocs.js +130 -0
  100. package/dist/plan/reviewDocs.js.map +1 -0
  101. package/dist/plan/sync.d.ts.map +1 -1
  102. package/dist/plan/sync.js +5 -0
  103. package/dist/plan/sync.js.map +1 -1
  104. package/dist/policy/index.d.ts +1 -1
  105. package/dist/policy/index.d.ts.map +1 -1
  106. package/dist/policy/index.js +1 -1
  107. package/dist/policy/index.js.map +1 -1
  108. package/dist/policy/plan.d.ts +8 -0
  109. package/dist/policy/plan.d.ts.map +1 -1
  110. package/dist/policy/plan.js +20 -0
  111. package/dist/policy/plan.js.map +1 -1
  112. package/dist/query/handlers.d.ts +3 -0
  113. package/dist/query/handlers.d.ts.map +1 -1
  114. package/dist/query/handlers.js +86 -12
  115. package/dist/query/handlers.js.map +1 -1
  116. package/dist/query/queryDocs.d.ts +64 -0
  117. package/dist/query/queryDocs.d.ts.map +1 -0
  118. package/dist/query/queryDocs.js +554 -0
  119. package/dist/query/queryDocs.js.map +1 -0
  120. package/dist/query/routes.d.ts +11 -1
  121. package/dist/query/routes.d.ts.map +1 -1
  122. package/dist/query/routes.js +5 -1
  123. package/dist/query/routes.js.map +1 -1
  124. package/dist/render/copyArea.d.ts +61 -0
  125. package/dist/render/copyArea.d.ts.map +1 -0
  126. package/dist/render/copyArea.js +80 -0
  127. package/dist/render/copyArea.js.map +1 -0
  128. package/dist/render/html.d.ts.map +1 -1
  129. package/dist/render/html.js +3 -1
  130. package/dist/render/html.js.map +1 -1
  131. package/dist/render/index.d.ts +3 -0
  132. package/dist/render/index.d.ts.map +1 -1
  133. package/dist/render/index.js +2 -0
  134. package/dist/render/index.js.map +1 -1
  135. package/dist/shared/dayPage.d.ts +67 -0
  136. package/dist/shared/dayPage.d.ts.map +1 -0
  137. package/dist/shared/dayPage.js +92 -0
  138. package/dist/shared/dayPage.js.map +1 -0
  139. package/dist/shared/detailPage.d.ts +55 -0
  140. package/dist/shared/detailPage.d.ts.map +1 -0
  141. package/dist/shared/detailPage.js +65 -0
  142. package/dist/shared/detailPage.js.map +1 -0
  143. package/dist/shared/docPage.d.ts +22 -0
  144. package/dist/shared/docPage.d.ts.map +1 -0
  145. package/dist/shared/docPage.js +52 -0
  146. package/dist/shared/docPage.js.map +1 -0
  147. package/dist/shared/overviewPage.d.ts +52 -0
  148. package/dist/shared/overviewPage.d.ts.map +1 -0
  149. package/dist/shared/overviewPage.js +65 -0
  150. package/dist/shared/overviewPage.js.map +1 -0
  151. package/dist/shared/pageNav.d.ts +24 -0
  152. package/dist/shared/pageNav.d.ts.map +1 -0
  153. package/dist/shared/pageNav.js +70 -0
  154. package/dist/shared/pageNav.js.map +1 -0
  155. package/dist/shared/pageParts.d.ts +45 -0
  156. package/dist/shared/pageParts.d.ts.map +1 -0
  157. package/dist/shared/pageParts.js +154 -0
  158. package/dist/shared/pageParts.js.map +1 -0
  159. package/dist/shared/planPage.d.ts +49 -0
  160. package/dist/shared/planPage.d.ts.map +1 -0
  161. package/dist/shared/planPage.js +48 -0
  162. package/dist/shared/planPage.js.map +1 -0
  163. package/dist/shared/rangePage.d.ts +44 -0
  164. package/dist/shared/rangePage.d.ts.map +1 -0
  165. package/dist/shared/rangePage.js +50 -0
  166. package/dist/shared/rangePage.js.map +1 -0
  167. package/dist/shared/weekPage.d.ts +36 -0
  168. package/dist/shared/weekPage.d.ts.map +1 -0
  169. package/dist/shared/weekPage.js +42 -0
  170. package/dist/shared/weekPage.js.map +1 -0
  171. package/dist/triggers/routes.generated.d.ts +23 -1
  172. package/dist/triggers/routes.generated.d.ts.map +1 -1
  173. package/dist/triggers/routes.generated.js +4 -1
  174. package/dist/triggers/routes.generated.js.map +1 -1
  175. package/dist/write/handlers.d.ts.map +1 -1
  176. package/dist/write/handlers.js +101 -5
  177. package/dist/write/handlers.js.map +1 -1
  178. package/dist/write/writeDocs.d.ts +27 -0
  179. package/dist/write/writeDocs.d.ts.map +1 -0
  180. package/dist/write/writeDocs.js +423 -0
  181. package/dist/write/writeDocs.js.map +1 -0
  182. package/dist/write/writeParts.d.ts +54 -0
  183. package/dist/write/writeParts.d.ts.map +1 -0
  184. package/dist/write/writeParts.js +117 -0
  185. package/dist/write/writeParts.js.map +1 -0
  186. package/package.json +3 -3
@@ -0,0 +1,423 @@
1
+ /** #783 · 写入与同步域的**页数据与页装配**(口径层):写库之后那几张结果页各自要什么。
2
+ *
3
+ * 为什么口径住这里、不住共用位:共用位不许出现任何一个能力的名字,而「缺口怎么算、回溯窗口多长、
4
+ * 覆盖百分比的分母是谁、一级分类的权威顺序」全是**本域的口径**——摆好再交给页型函数与族级件。
5
+ *
6
+ * **不重算别家口径**:记录块数/覆盖分钟/健康分直接调 `render/views.ts` 的 `buildRecordToday`
7
+ * (那是这枚 key 既有口径的唯一实现);一级分类映射调 `policy` 的 `l1Of`,时间解析调 `toMinutes`。
8
+ *
9
+ * 四张页(老侧家族 → 写入与同步这一条命令的哪一支):
10
+ * · 记作息结果(老侧 f07「记录三件套结果」)← `op=add`:全天时间轴 + 过去几小时推断回溯 + 状态总览,
11
+ * 只记一级分类时页顶多一条细化提示(老侧 `cmd_add_record` 的 warning 位);
12
+ * · 修正作息回执(老侧 f09「修正作息回执」)← `op=amend`:蓝调 diff + 多字段前后对照;
13
+ * · 批量导入回执 ← `op=add` 带 `records[]`:逐条结果 + 汇总(老侧 `batch-add` 的 ok/partial 语义);
14
+ * · 写作息摘要回执 ← `op=summary`:写库回执(老侧这条无产物,本票按「每个唤醒词都落一份真页」补)。
15
+ *
16
+ * **页上文案纪律**:一页里不出现命令键、库列名、英文裸词;并列关系一律用版面表达(卡片格/徽章列/
17
+ * 键值行/对照行),不拿 `、`/`·`/`|`/`;`/`~` 这些符号顶替设计——本票证据件里那条机器判据
18
+ * (分隔符门)量的就是这条。范围一律写「至」,不用波浪号。
19
+ *
20
+ * #891 补的**页内定位**(不动件序列,只给已有的段名加锚点与页首目录):判据(小节数 ≥ 3 出目录)
21
+ * 与装配的唯一一处定义地在 `shared/pageNav.ts` 的 `SECTION_TOC_MIN`。
22
+ * **这一页型里被判为短页的是「写作息摘要回执」**:它恒 2 小节(`这次写了什么`/`复制与留档`)
23
+ * ⇒ `tocEl` 保持 0、D5 那条腿照旧扣 4;「批量导入回执」在有条目没通过校验时才出第 3 小节
24
+ * (`有几条没写进去`),全过那一档仍判短页。
25
+ */
26
+ import { renderCaliberLine, renderConclusionBar, renderDataTable, renderDisclosure, renderFeedbackBlock, renderKpiGrid, renderPreBlock, } from 'base-paint/blocks';
27
+ import { renderFactStrip } from 'base-paint';
28
+ import { DEFAULT_WHITELIST, LEVEL1_WHITELIST, fmtDur, fmtDurShort, fmtPct, l1Of, parseCategory, toMinutes, } from '../policy/index.js';
29
+ import { listRecordsByDate, listRecordsRange } from '../fetch/index.js';
30
+ import { buildRecordToday } from '../render/index.js';
31
+ import { scheduleCopyArea, scheduleCopyLog, scheduleNowStamp } from '../render/copyArea.js';
32
+ import { assembleDocPage } from '../shared/docPage.js';
33
+ import { pageSections } from '../shared/pageNav.js';
34
+ import { hourCellsOf, renderHourBand } from '../shared/pageParts.js';
35
+ import { renderDiffPanel, renderChipBand, renderPastHours, writePartsCss } from './writeParts.js';
36
+ /** 回溯窗口=这一条记录结束时刻往前推这么多分钟(老侧 `RECENT_HOURS = 3`)。 */
37
+ const RECENT_MINUTES = 3 * 60;
38
+ /** 来源消息与推理说明上屏前各截这么长(老侧 `_snip` 的 40/60)。 */
39
+ const SNIP_SOURCE = 40;
40
+ const SNIP_REASON = 60;
41
+ /** 批量回执逐条表最多摆几行(再多只出一句计数,别把页撑成一堵墙)。 */
42
+ const BATCH_ROWS_MAX = 40;
43
+ const DAY_MINUTES = 24 * 60;
44
+ const WEEK_DAYS = 7;
45
+ /** 域词(页眉那一行)与页名。 */
46
+ const EYEBROW = '作息管家 写入与同步';
47
+ /** 修正作息回执的字段中文名(库列名与命令参数名都不上屏;一处定义)。 */
48
+ const FIELD_LABELS = {
49
+ date: '日期',
50
+ time_start: '开始时间',
51
+ time_end: '结束时间',
52
+ duration_minutes: '时长',
53
+ activity: '活动',
54
+ category: '分类',
55
+ source_contents: '来源消息',
56
+ source_timestamps: '来源时间',
57
+ analysis_reasoning: '推理说明',
58
+ };
59
+ const isoOf = (d) => d.toISOString().slice(0, 10);
60
+ const dayShift = (iso, days) => {
61
+ const t = new Date(iso + 'T00:00:00Z');
62
+ t.setUTCDate(t.getUTCDate() + days);
63
+ return isoOf(t);
64
+ };
65
+ const hhmm = (minutes) => (minutes >= DAY_MINUTES
66
+ ? '24:00'
67
+ : String(Math.floor(minutes / 60)).padStart(2, '0') + ':' + String(minutes % 60).padStart(2, '0'));
68
+ /** 范围一律写「至」(不用波浪号,也不用短横)。 */
69
+ const span = (from, to) => from + ' 至 ' + to;
70
+ const snip = (text, max) => {
71
+ const s = (text ?? '').trim();
72
+ return s.length <= max ? s : s.slice(0, max) + '…';
73
+ };
74
+ /** **预览**(来源消息/推理说明这两处截断文本)的显示规范化:把「拿符号当分隔」的写法换回人话
75
+ * (范围写「至」,并列写「,」)——这两段本来就是摘要,改的是摘要的写法,不动库里那两列原文。
76
+ * **活动与分类原样上屏**:那是用户自己的话,不是我们的版面债,本函数不碰它们。 */
77
+ const preview = (text, max) => snip((text ?? '').replace(/[~~]/g, ' 至 ').replace(/[·;||、/;]/g, ',').replace(/\s+/g, ' ').trim(), max);
78
+ const nowMinutes = (now) => now.getHours() * 60 + now.getMinutes();
79
+ /** 一级分类的权威顺序(配色与图例都照它)——定义只此一处:`policy` 的白名单。 */
80
+ const orderOf = () => [...LEVEL1_WHITELIST];
81
+ /** 一段缺口有多少分钟(`24:00` 经 `toMinutes` 读作 1440,跨零点那一段因此算得对)。 */
82
+ const gapMinutes = (gap) => toMinutes(gap.to) - toMinutes(gap.from);
83
+ /** 单日缺口段(老侧 `_day_gap_slots` 口径:首条前 + 相邻间隔 + 末条后)。 */
84
+ function dayGapSlots(records) {
85
+ const sorted = [...records]
86
+ .filter((r) => r.time_start !== '' && r.time_end !== '')
87
+ .sort((a, b) => (a.time_start < b.time_start ? -1 : a.time_start > b.time_start ? 1 : a.id - b.id));
88
+ const slots = [];
89
+ let cursor = 0;
90
+ for (const r of sorted) {
91
+ const ts = toMinutes(r.time_start);
92
+ const te = Math.max(toMinutes(r.time_end), ts);
93
+ if (ts > cursor)
94
+ slots.push({ from: hhmm(cursor), to: hhmm(ts) });
95
+ if (te > cursor)
96
+ cursor = te;
97
+ }
98
+ if (cursor < DAY_MINUTES)
99
+ slots.push({ from: hhmm(cursor), to: '24:00' });
100
+ return slots;
101
+ }
102
+ function cellsOf(records) {
103
+ return hourCellsOf(records.map((r) => ({
104
+ start: toMinutes(r.time_start),
105
+ end: toMinutes(r.time_end),
106
+ key: l1Of(r.category),
107
+ })));
108
+ }
109
+ /** 复制区载荷(#887):这四张页都在 `schedule.record.write` 这一枚 key 上,形状是**回执**
110
+ * ——数据位=一份回执(`ok` + `message`,消息里写清这一趟的事实),日志位=这一趟的 2–6 段。
111
+ * `message` 用逗号串成一句话:复制文本走 `buildDataText` 的 text 口径,行内换行会并成一行。 */
112
+ function writeCopy(title, lines, command, source, ok = true) {
113
+ return {
114
+ key: 'schedule.record.write',
115
+ payload: { ok, message: title + ':' + lines.join(',') + '。' },
116
+ log: scheduleCopyLog({ command, source, actionAt: scheduleNowStamp() }),
117
+ };
118
+ }
119
+ /* ─────────────────────────── ① 记作息结果(老侧 f07) ─────────────────────────── */
120
+ /** 只记了一级分类时那条细化提示 + 候选二级徽章列(老侧 `cmd_add_record` 的 warning 位)。 */
121
+ function l1OnlyNotice(category) {
122
+ const level2 = DEFAULT_WHITELIST[category] ?? [];
123
+ const notice = renderFeedbackBlock({
124
+ title: '这条可以再细一档',
125
+ toast: { icon: 'warn', msg: '这一条只记到一级分类「' + category + '」,二级还空着。' },
126
+ staticNotice: true,
127
+ });
128
+ return notice + renderChipBand(level2);
129
+ }
130
+ /** 三条「接下来可以说什么」:整句可复制(老侧三个操作按钮的 prompt 位)。 */
131
+ function nextSteps(date, record) {
132
+ const lines = [
133
+ '请帮我接着 ' + date + ' 的 ' + record.time_end + ' 之后记下一条作息。',
134
+ '请帮我看看 ' + date + ' 这一天的全貌。',
135
+ '请帮我复盘 ' + date + ' 这一天。',
136
+ ];
137
+ const labels = ['继续记下一条', '看今日全貌', '晚点复盘'];
138
+ const blocks = lines.map((command, i) => renderPreBlock({
139
+ label: labels[i],
140
+ command,
141
+ actionId: 'ilife-sch-write-next-' + String(i + 1),
142
+ copyLabel: '复制这句话',
143
+ })).join('');
144
+ return renderDisclosure({ title: '接下来可以说什么', contentHtml: blocks });
145
+ }
146
+ /** 「记作息结果」整页:状态总览 + 全天时间轴 + 过去几小时推断回溯(老侧三件套),只记一级时加提示。 */
147
+ export function recordResultPage(handle, record, now = new Date()) {
148
+ const date = record.date;
149
+ const records = listRecordsByDate(handle, date);
150
+ const view = buildRecordToday(date, [...records]);
151
+ const gaps = dayGapSlots(records);
152
+ const week = listRecordsRange(handle, dayShift(date, -(WEEK_DAYS - 1)), date);
153
+ const isToday = date === isoOf(now);
154
+ const passed = isToday ? Math.max(nowMinutes(now), 1) : DAY_MINUTES;
155
+ const coveragePct = Math.min(Math.round((view.coverage / passed) * 1000) / 10, 100);
156
+ // ② 过去几小时推断回溯:窗口 = 这一条结束时刻往前推 3 小时;跨到别天的不算。
157
+ const anchor = toMinutes(record.time_end);
158
+ const windowStart = Math.max(0, anchor - RECENT_MINUTES);
159
+ const recent = [...records]
160
+ .filter((r) => toMinutes(r.time_end) > windowStart && toMinutes(r.time_start) < anchor)
161
+ .sort((a, b) => toMinutes(b.time_end) - toMinutes(a.time_end));
162
+ const cards = recent.map((r) => ({
163
+ time: span(r.time_start, r.time_end),
164
+ activity: r.activity,
165
+ category: r.category,
166
+ duration: fmtDurShort(r.duration_minutes ?? 0),
167
+ source: preview(r.source_contents ?? '', SNIP_SOURCE),
168
+ reasoning: preview(r.analysis_reasoning ?? '', SNIP_REASON),
169
+ isNew: r.id === record.id,
170
+ }));
171
+ const level1 = l1Of(record.category);
172
+ const level2 = parseCategory(record.category).level2;
173
+ const sameCategory = records.filter((r) => r.category === record.category).length;
174
+ const kpis = [
175
+ { label: '今日已记录', value: String(view.total) + ' 块', detail: date },
176
+ {
177
+ label: '覆盖时长', value: fmtDurShort(view.coverage),
178
+ detail: '已过 ' + fmtDurShort(passed) + ',覆盖 ' + coveragePct + '%',
179
+ bar: { pct: Math.round(coveragePct) },
180
+ },
181
+ {
182
+ label: '缺口时段', value: String(gaps.length) + ' 段',
183
+ detail: gaps.length === 0
184
+ ? '整天都记满了'
185
+ : ('合计 ' + String(gaps.reduce((sum, g) => sum + gapMinutes(g), 0)) + ' 分钟'),
186
+ },
187
+ { label: '本周累计', value: String(week.length) + ' 块', detail: '最近 7 天' },
188
+ ];
189
+ const head = {
190
+ docTitle: '作息管家 记作息结果',
191
+ eyebrow: EYEBROW,
192
+ title: '记作息结果',
193
+ subtitle: '刚写入的是 ' + date + ' 的 ' + span(record.time_start, record.time_end)
194
+ + ',活动是「' + record.activity + '」,分类是「' + record.category + '」。',
195
+ };
196
+ const { toc, body } = pageSections([
197
+ { navText: level2 === null ? '这条可以再细一档' : '', html: level2 === null ? l1OnlyNotice(level1) : '' },
198
+ { html: renderConclusionBar('已记下这一条,' + date + ' 一共 ' + view.total + ' 块记录,健康分 ' + view.score + '。') },
199
+ { navText: '当前状态总览', html: renderKpiGrid(kpis, { title: '当前状态总览' }) },
200
+ { navText: '全天作息时间轴', html: renderHourBand(cellsOf(records), { order: orderOf(), title: '全天作息时间轴', height: 140 }) },
201
+ { html: renderFactStrip({
202
+ items: [
203
+ { label: '回溯窗口', value: span(hhmm(windowStart), record.time_end) },
204
+ { label: '刚记录', value: span(record.time_start, record.time_end) },
205
+ { label: '本类已有', value: String(sameCategory) + ' 块' },
206
+ { label: '本类占比', value: fmtPct(record.duration_minutes ?? 0, view.coverage) + '%' },
207
+ ],
208
+ }) },
209
+ { navText: '过去几小时推断回溯', html: renderPastHours({
210
+ title: '过去几小时推断回溯',
211
+ cards,
212
+ emptyText: '回溯窗口里还没有别的记录,这是窗口里的第一笔。',
213
+ }) },
214
+ { html: nextSteps(date, record) },
215
+ { navText: '复制与留档', html: scheduleCopyArea({
216
+ title: '复制与留档',
217
+ dataActionId: 'ilife-sch-write-copy-data',
218
+ logActionId: 'ilife-sch-write-copy-log',
219
+ ...writeCopy('记作息结果', [
220
+ '日期:' + date,
221
+ '这一条:' + span(record.time_start, record.time_end) + ' ' + record.activity,
222
+ '分类:' + record.category,
223
+ '今日块数:' + view.total + ',覆盖:' + fmtDur(view.coverage) + ',健康分:' + view.score,
224
+ ], 'schedule-cmd-read schedule.record.write --params {"op":"add","date":"' + date
225
+ + '","time_start":"' + record.time_start + '","time_end":"' + record.time_end
226
+ + '","activity":"' + record.activity + '","category":"' + record.category + '"}', '作息记录表(这一条已入库)'),
227
+ }) },
228
+ ]);
229
+ return assembleDocPage({ head, content: toc + body, extraCss: writePartsCss() });
230
+ }
231
+ /* ─────────────────────────── ② 修正作息回执(老侧 f09) ─────────────────────────── */
232
+ /** 一个字段改前改后长什么样(时长补单位、空值写破折号)。 */
233
+ function fieldValue(key, value) {
234
+ if (value === null || value === undefined || value === '')
235
+ return '—';
236
+ if (key === 'duration_minutes')
237
+ return String(value) + ' 分钟';
238
+ return String(value);
239
+ }
240
+ /** 「修正作息回执」整页:蓝调 diff + 多字段前后对照 + 这条记录现在的样子。 */
241
+ export function amendReceiptPage(before, after, patchKeys, now = new Date()) {
242
+ const rows = patchKeys
243
+ .filter((key) => FIELD_LABELS[key] !== undefined)
244
+ .map((key) => ({
245
+ label: FIELD_LABELS[key],
246
+ before: fieldValue(key, before[key]),
247
+ after: fieldValue(key, after[key]),
248
+ }));
249
+ const older = after.date < isoOf(now);
250
+ const stale = older
251
+ ? renderFeedbackBlock({
252
+ title: '改的是一条旧记录',
253
+ toast: {
254
+ icon: 'warn',
255
+ msg: '这条记的是 ' + after.date + ',不是今天的。改动照样写进库,次数也照样加一。',
256
+ },
257
+ staticNotice: true,
258
+ })
259
+ : '';
260
+ const current = [
261
+ { k: '日期', v: after.date },
262
+ { k: '起止', v: span(after.time_start, after.time_end) },
263
+ { k: '时长', v: fmtDur(after.duration_minutes ?? 0) },
264
+ { k: '活动', v: after.activity },
265
+ { k: '分类', v: after.category },
266
+ { k: '来源消息', v: fieldValue('source_contents', after.source_contents) },
267
+ { k: '来源时间', v: fieldValue('source_timestamps', after.source_timestamps) },
268
+ { k: '推理说明', v: fieldValue('analysis_reasoning', after.analysis_reasoning) },
269
+ ];
270
+ const head = {
271
+ docTitle: '作息管家 修正作息回执',
272
+ eyebrow: EYEBROW,
273
+ title: '修正作息回执',
274
+ subtitle: '这条记录改过 ' + after.edit_count + ' 次,这次动的是 ' + after.date
275
+ + ' 的 ' + span(after.time_start, after.time_end) + '。',
276
+ };
277
+ const { toc, body } = pageSections([
278
+ { html: stale },
279
+ { html: renderConclusionBar('这条记录已经改好,改的是哪几格,原来是什么值,下面逐格对照。') },
280
+ { navText: '这条记录现在的样子', html: renderKpiGrid([
281
+ { label: '记录日期', value: after.date, detail: span(after.time_start, after.time_end) },
282
+ { label: '修改次数', value: '第 ' + after.edit_count + ' 次', detail: '库里这条被改过几次' },
283
+ { label: '现在的分类', value: after.category, detail: '一级 ' + l1Of(after.category) },
284
+ { label: '现在的活动', value: after.activity, detail: fmtDur(after.duration_minutes ?? 0) },
285
+ ], { title: '这条记录现在的样子' }) },
286
+ { navText: '这次改了什么', html: renderDiffPanel({ title: '这次改了什么', rows }) },
287
+ { html: renderDisclosure({
288
+ title: '改完之后的完整一条',
289
+ contentHtml: renderDataTable({
290
+ columns: [{ key: 'k', label: '项' }, { key: 'v', label: '值' }],
291
+ rows: current,
292
+ }),
293
+ }) },
294
+ { html: renderCaliberLine('改前那一格画着删除线,改后那一格是新值 | 时长按时段实算,跟起止对得上') },
295
+ { navText: '复制与留档', html: scheduleCopyArea({
296
+ title: '复制与留档',
297
+ dataActionId: 'ilife-sch-write-copy-data',
298
+ logActionId: 'ilife-sch-write-copy-log',
299
+ ...writeCopy('修正作息回执', [
300
+ '日期:' + after.date,
301
+ '这次改了 ' + String(rows.length) + ' 处:' + rows.map((r) => r.label).join(','),
302
+ '现在的分类:' + after.category,
303
+ '现在的活动:' + after.activity,
304
+ '修改次数:' + after.edit_count,
305
+ ], 'schedule-cmd-read schedule.record.write --params {"op":"amend","id":' + String(after.id) + '}', '作息记录表(这一条已改好,第 ' + String(after.edit_count) + ' 次)'),
306
+ }) },
307
+ ]);
308
+ return assembleDocPage({ head, content: toc + body, extraCss: writePartsCss() });
309
+ }
310
+ /** 「批量导入回执」整页:收到条数/写入成功/没通过 + 逐条结果。 */
311
+ export function batchReceiptPage(input) {
312
+ const total = input.rows.length;
313
+ const done = input.rows.filter((r) => r.ok).length;
314
+ const failed = total - done;
315
+ const shown = input.rows.slice(0, BATCH_ROWS_MAX);
316
+ const left = total - shown.length;
317
+ const tableRows = shown.map((r) => ({
318
+ n: String(r.seq),
319
+ time: r.time,
320
+ activity: r.activity,
321
+ category: r.category,
322
+ result: r.result,
323
+ }));
324
+ const head = {
325
+ docTitle: '作息管家 批量导入回执',
326
+ eyebrow: EYEBROW,
327
+ title: '批量导入回执',
328
+ subtitle: '导入的是 ' + input.date + ' 的记录,一共收到 ' + total + ' 条,写入 ' + done + ' 条。',
329
+ };
330
+ const { toc, body } = pageSections([
331
+ { navText: failed === 0 ? '' : '有几条没写进去', html: failed === 0 ? '' : renderFeedbackBlock({
332
+ title: '有几条没写进去',
333
+ toast: {
334
+ icon: 'warn',
335
+ msg: '没通过的 ' + failed + ' 条没有写进库,改好之后可以再导一次。',
336
+ },
337
+ staticNotice: true,
338
+ }) },
339
+ { html: renderConclusionBar(failed === 0
340
+ ? '这次收到 ' + total + ' 条,全都写进库了。'
341
+ : '这次收到 ' + total + ' 条,写进 ' + done + ' 条,另有 ' + failed + ' 条没通过校验。') },
342
+ { navText: '这一趟的结果', html: renderKpiGrid([
343
+ { label: '收到条数', value: String(total) + ' 条', detail: input.date },
344
+ { label: '写入成功', value: String(done) + ' 条', detail: '已进作息记录' },
345
+ { label: '没通过', value: String(failed) + ' 条', detail: failed === 0 ? '一条不差' : '没有写进库' },
346
+ {
347
+ label: '写入进度', value: String(total === 0 ? 0 : Math.round((done / total) * 100)) + '%',
348
+ detail: String(done) + ' / ' + String(total),
349
+ },
350
+ ], { title: '这一趟的结果' }) },
351
+ { html: renderDataTable({
352
+ caption: '逐条结果',
353
+ columns: [
354
+ { key: 'n', label: '第几条' },
355
+ { key: 'time', label: '时段' },
356
+ { key: 'activity', label: '活动' },
357
+ { key: 'category', label: '分类' },
358
+ { key: 'result', label: '结果' },
359
+ ],
360
+ rows: tableRows,
361
+ emptyText: '这一趟一条也没收到',
362
+ }) },
363
+ { html: left <= 0 ? '' : renderCaliberLine('另有 ' + left + ' 条没有摆上来,完整清单在复制出去的数据里') },
364
+ { navText: '复制与留档', html: scheduleCopyArea({
365
+ title: '复制与留档',
366
+ dataActionId: 'ilife-sch-write-copy-data',
367
+ logActionId: 'ilife-sch-write-copy-log',
368
+ ...writeCopy('批量导入回执', [
369
+ '日期:' + input.date,
370
+ '收到:' + total + ' 条,写入:' + done + ' 条,没通过:' + failed + ' 条',
371
+ ...input.rows.map((r) => '第 ' + r.seq + ' 条:' + r.time + ' ' + r.activity + ' ' + r.result),
372
+ ], 'schedule-cmd-read schedule.record.write --params {"records":[' + String(total) + ' 条]}', '作息记录表(这一趟写入 ' + done + ' 条)', failed === 0),
373
+ }) },
374
+ ]);
375
+ return assembleDocPage({ head, content: toc + body, extraCss: writePartsCss() });
376
+ }
377
+ /* ─────────────────────────── ④ 写作息摘要回执 ─────────────────────────── */
378
+ /** 「写作息摘要回执」整页:这次写了什么 + 当日这一支的现状(老侧这条无产物,新给一份真页)。 */
379
+ export function summaryReceiptPage(handle, summary) {
380
+ const records = listRecordsByDate(handle, summary.date);
381
+ const inLevel1 = records.filter((r) => l1Of(r.category) === summary.category);
382
+ const level1Minutes = inLevel1.reduce((sum, r) => sum + (r.duration_minutes ?? 0), 0);
383
+ const dayMinutes = records.reduce((sum, r) => sum + (r.duration_minutes ?? 0), 0);
384
+ const head = {
385
+ docTitle: '作息管家 写作息摘要回执',
386
+ eyebrow: EYEBROW,
387
+ title: '写作息摘要回执',
388
+ subtitle: '写的是 ' + summary.date + ' 的「' + summary.category + '」摘要,一共 '
389
+ + fmtDur(summary.totalMinutes) + '。',
390
+ };
391
+ const { toc, body } = pageSections([
392
+ { html: renderConclusionBar('这一条摘要已经写进库:' + summary.date + ' 的「' + summary.category + '」记作 '
393
+ + fmtDur(summary.totalMinutes) + '。') },
394
+ { navText: '这次写了什么', html: renderKpiGrid([
395
+ { label: '摘要日期', value: summary.date, detail: '写进每日摘要' },
396
+ { label: '一级分类', value: summary.category, detail: '八类之一' },
397
+ { label: '写入时长', value: fmtDur(summary.totalMinutes), detail: '这一次写的值' },
398
+ { label: '当天记录', value: String(inLevel1.length) + ' 块', detail: '同一天同一支' },
399
+ ], { title: '这次写了什么' }) },
400
+ { html: renderFactStrip({
401
+ items: [
402
+ { label: '当天这支记录合计', value: fmtDur(level1Minutes) },
403
+ { label: '当天全部记录合计', value: fmtDur(dayMinutes) },
404
+ { label: '这支占当天', value: fmtPct(level1Minutes, dayMinutes) + '%' },
405
+ ],
406
+ }) },
407
+ { html: renderCaliberLine('摘要与记录是两支账 | 摘要按天按一级分类各存一行,记录表照原样留着') },
408
+ { navText: '复制与留档', html: scheduleCopyArea({
409
+ title: '复制与留档',
410
+ dataActionId: 'ilife-sch-write-copy-data',
411
+ logActionId: 'ilife-sch-write-copy-log',
412
+ ...writeCopy('写作息摘要回执', [
413
+ '日期:' + summary.date,
414
+ '一级分类:' + summary.category,
415
+ '写入时长:' + fmtDur(summary.totalMinutes),
416
+ '当天这支记录合计:' + fmtDur(level1Minutes),
417
+ ], 'schedule-cmd-read schedule.record.write --params {"op":"summary","date":"' + summary.date
418
+ + '","category":"' + summary.category + '","total_minutes":' + String(summary.totalMinutes) + '}', '每日摘要表(这一天这一支已入库)'),
419
+ }) },
420
+ ]);
421
+ return assembleDocPage({ head, content: toc + body, extraCss: writePartsCss() });
422
+ }
423
+ //# sourceMappingURL=writeDocs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeDocs.js","sourceRoot":"","sources":["../../src/write/writeDocs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /** #783 · 写入与同步域的**两处族级件**(页内自造件):过去几小时推断回溯卡、蓝调 diff 面板。
2
+ *
3
+ * 为什么住这里(写得出哪几张页在用):本域的「记作息结果」(老侧 f07)要第二件——把回溯窗口里
4
+ * 每一段记录的**来源消息**与**推理说明**摆成卡(公共层给不出:它的列表行只有三格、摆不下两段长文);
5
+ * 「修正作息回执」(老侧 f09)要第三件——一段**改前改后逐格对照**,公共层 `renderChangeRows` 给了行,
6
+ * 但「蓝调」这层底与标题得住族级样式件里。两件都只有本域在用,按结构标准「写不出第二个用法就留在
7
+ * 能力目录」落这里,不进共用位。
8
+ *
9
+ * **只认形状,不认领域**:进来的是摆好的数据(时间段怎么拼、来源怎么截、改前改后是什么值,都由
10
+ * `writeDocs.ts` 算好),出去的是 HTML 串。
11
+ *
12
+ * **样式纪律(本票的代码层窄判据)**:本文件是**族级样式常量的唯一住处**——CSS 里的长度一律取下面
13
+ * 那组具名常量、颜色一律取公共层 token(`var(--…)`)或 `CHART_PALETTE`,`px` 字面量一处也不写。
14
+ * 断点只用仓内既有值 **820**(页内自造件那一档),不新造。
15
+ */
16
+ import { type ChangeRowInput } from 'base-paint/blocks';
17
+ /** 一张回溯卡要的东西(口径在 `writeDocs.ts`:时间怎么拼、来源怎么截都算好了再进来)。 */
18
+ export interface PastHourCard {
19
+ /** 这一段的起止(人话串,范围用「至」)。 */
20
+ readonly time: string;
21
+ readonly activity: string;
22
+ readonly category: string;
23
+ readonly duration: string;
24
+ /** 来源消息摘要(可能为空串=这一段没有来源)。 */
25
+ readonly source: string;
26
+ /** 推理说明摘要(可能为空串)。 */
27
+ readonly reasoning: string;
28
+ /** 这一张是不是刚写入的那一条(绿框高亮)。 */
29
+ readonly isNew: boolean;
30
+ }
31
+ /** 过去几小时推断回溯(老侧三件套的②):一行标题 + 一段卡片列。
32
+ * `cards` 为空=出一句空态话(这一块**恒在页上**,不因数据空而消失)。 */
33
+ export declare function renderPastHours(input: {
34
+ readonly title: string;
35
+ readonly cards: readonly PastHourCard[];
36
+ readonly emptyText: string;
37
+ }): string;
38
+ /** 蓝调 diff 面板(老侧修正作息回执的必现块「蓝调 diff」+「多字段前后对照」):
39
+ * 一行标题 + 一段逐格对照(改前/改后两栏,值由调用方给好)。 */
40
+ export declare function renderDiffPanel(input: {
41
+ readonly title: string;
42
+ readonly rows: readonly ChangeRowInput[];
43
+ }): string;
44
+ /** 徽章列(老侧「建议细化」那句里并列的二级候选)。
45
+ *
46
+ * **为什么必须包一层**:公共层 `renderChips` 是「**行即件**」——它只返一串 `<span class="ilife-block-chip">`,
47
+ * 不返容器(见 `出页交接-页型配方怎么用.md` §四第 1 条)。直接当一块往页里塞,那几枚徽章会各自成为页壳
48
+ * 正文的直接子件:桌面档下正文是栅格,每枚徽章各占一行的整宽(实测 1440 档从 880px 掉到 874px、
49
+ * 且单列配方被打散)。包一层本域的容器,它们才回到「一行并列」该有的样子。 */
50
+ export declare function renderChipBand(items: readonly string[]): string;
51
+ /** 这两处族级件的样式唯一产出者(只对用上它们的页面有作用)。
52
+ * 颜色只取公共层冻结 token;长度只取上面那组常量——本串里不出现 `px` 字面量。 */
53
+ export declare function writePartsCss(): string;
54
+ //# sourceMappingURL=writeParts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeParts.d.ts","sourceRoot":"","sources":["../../src/write/writeParts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAiC,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA6BvF,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qBAAqB;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;+CAC+C;AAC/C,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GAAG,MAAM,CAoBT;AAED;sCACsC;AACtC,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;CAC1C,GAAG,MAAM,CAIT;AAED;;;;;2CAK2C;AAC3C,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAG/D;AAED;mDACmD;AACnD,wBAAgB,aAAa,IAAI,MAAM,CA2BtC"}