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,341 @@
1
+ /** #787 · 日程与计划·写侧的**三张回执页**(口径与页装配):补计划回执、改计划回执、删计划回执。
2
+ *
3
+ * 为什么口径住这里、不住共用位:共用位不许出现任何一个能力的名字,而「这一天算不算补上了、
4
+ * 改了几格、软删之后这一天还剩几件」全是**本域的口径**——摆好再交给页型函数与族级件。
5
+ *
6
+ * **不重算别家口径**:事件自身的字段(时段/标题/分类/完成/同步标识)直接读库行(`fetch` 的能力门),
7
+ * 一级分类映射调 `policy` 的 `l1Of`,时间解析调 `toMinutes`。本件只做「页上摆成什么样」。
8
+ *
9
+ * 三张页(老侧家族 → 这条写命令的哪一支):
10
+ * · 补计划回执(老侧 f15「补日程回执」)← `op=ensure`:新事件回执 + **幂等命中注记位**(同一天同一段
11
+ * 起止已经有了=这一步没新建,回执里的号还是原来那条);批量那一支(`dates[]`)出逐天结果表;
12
+ * · 改计划回执(老侧 f14「改/删日程回执」)← `op=update`:**字段前后对照**(蓝调面板)+ **飞书询问位**
13
+ * (这一趟远端侧做了什么、没做什么,如实报);
14
+ * · 删计划回执(老侧 f14 同一家族)← `op=deactivate`:软删的对照(这一天在排的件数变了、这一条不再算),
15
+ * 并写明原件还在库里。
16
+ *
17
+ * **页上文案纪律**:一页里不出现命令键、库列名、参数名、票号;并列关系一律用版面表达(对照行/卡片格/
18
+ * 表格列),不拿 `·`/`|`/`~`/`、`/`;` 这些符号顶替设计——本票证据件里那条机器判据(分隔符门)量的
19
+ * 就是这条。范围一律写「至」,不用波浪号。
20
+ *
21
+ * #891 补的**页内定位**(不动件序列,只给已有的段名加锚点与页首目录):判据(小节数 ≥ 3 出目录)
22
+ * 与装配的唯一一处定义地在 `shared/pageNav.ts` 的 `SECTION_TOC_MIN`。
23
+ * **这一页型里被判为短页的是「批量补计划回执」**:它恒 2 小节(`这一趟的结果`/`复制与留档`)
24
+ * ⇒ `tocEl` 保持 0、D5 那条腿照旧扣 4;另外三张回执恒 ≥4 小节(补计划回执 4/5 小节按有没有命中注记位)。
25
+ */
26
+ import { renderCaliberLine, renderConclusionBar, renderDataTable, renderDisclosure, renderFeedbackBlock, renderKpiGrid, } from 'base-paint/blocks';
27
+ import { renderFactStrip } from 'base-paint';
28
+ import { listPlanEvents } from '../fetch/index.js';
29
+ import { fmtDur, fmtDurShort, completionLabelOf, l1Of, toMinutes, LEVEL1_WHITELIST } from '../policy/index.js';
30
+ import { scheduleCopyArea } from '../render/copyArea.js';
31
+ import { assembleDocPage } from '../shared/docPage.js';
32
+ import { pageSections } from '../shared/pageNav.js';
33
+ import { hourCellsOf, renderHourBand } from '../shared/pageParts.js';
34
+ import { REMOTE_LABEL, planCopyArea } from './receipt.js';
35
+ import { planPartsCss, renderChangePanel } from './planParts.js';
36
+ /** 域词(页眉那一行)。 */
37
+ const EYEBROW = '作息管家 日程与计划';
38
+ /** 一级分类的权威顺序(色带配色与图例都照它),定义只此一处:`policy` 的白名单。 */
39
+ const L1_ORDER = [...LEVEL1_WHITELIST];
40
+ /** 回执页上的字段中文名(库列名与命令参数名都不上屏;一处定义)。 */
41
+ const FIELD_LABELS = {
42
+ date: '日期',
43
+ time_start: '开始时间',
44
+ time_end: '结束时间',
45
+ title: '标题',
46
+ notes: '备注',
47
+ category: '分类',
48
+ completion: '完成状态',
49
+ completion_note: '完成说明',
50
+ };
51
+ const span = (start, end) => start + ' 至 ' + end;
52
+ const empty = (v) => (v === null || v === undefined || v === '' ? '—' : String(v));
53
+ /** #894 · 完成状态上屏写法:库里存的是半角口径,页上走全角映射(取值不动)。 */
54
+ const completionText = (v) => (v === null || v === undefined || v === '' ? '—' : completionLabelOf(String(v)));
55
+ /** 事件行在页上的分类写法:没标分类的那一条写「未分类」(不印空串)。 */
56
+ const categoryOf = (e) => (e.category === null || e.category === '' ? '未分类' : e.category);
57
+ function cellsOf(events) {
58
+ return hourCellsOf(events.map((e) => ({
59
+ start: toMinutes(e.time_start),
60
+ end: toMinutes(e.time_end),
61
+ key: l1Of(e.category ?? ''),
62
+ })));
63
+ }
64
+ /** 「补计划回执」整页:新事件回执 +(命中时)幂等命中注记位 + 这一天现在的排布。 */
65
+ export function ensureReceiptPage(handle, r) {
66
+ const event = listPlanEvents(handle, r.date, true).find((e) => e.id === r.id);
67
+ const day = listPlanEvents(handle, r.date);
68
+ const minutes = event === undefined ? 0 : toMinutes(event.time_end) - toMinutes(event.time_start);
69
+ const sameCategory = event === undefined ? 0 : day.filter((e) => e.category === event.category).length;
70
+ const hit = renderFeedbackBlock({
71
+ title: '这一步没有新建',
72
+ toast: {
73
+ icon: 'info',
74
+ msg: '这个日期配这一段起止本来就有一条了,补计划认了原来那条,没有重复建。回执里的编号还是它。',
75
+ },
76
+ staticNotice: true,
77
+ });
78
+ const head = {
79
+ docTitle: '作息管家 补计划回执',
80
+ eyebrow: EYEBROW,
81
+ title: '补计划回执',
82
+ subtitle: event === undefined
83
+ ? r.date + ' 这一条没有在库里找到,先把这一趟的读数摆出来。'
84
+ : '补的是 ' + r.date + ' 的 ' + span(event.time_start, event.time_end) + ',标题是「' + event.title + '」。',
85
+ };
86
+ const current = event === undefined ? [] : [
87
+ { k: '编号', v: String(event.id) },
88
+ { k: '日期', v: event.date },
89
+ { k: '时段', v: span(event.time_start, event.time_end) },
90
+ { k: '时长', v: fmtDur(minutes) },
91
+ { k: '标题', v: event.title },
92
+ { k: '分类', v: categoryOf(event) },
93
+ { k: '备注', v: empty(event.notes) },
94
+ { k: '完成状态', v: completionText(event.completion) },
95
+ ];
96
+ const { toc, body } = pageSections([
97
+ { navText: r.created ? '' : '这一步没有新建', html: r.created ? '' : hit },
98
+ { html: renderConclusionBar(r.created
99
+ ? '已经补上 ' + r.date + ' 的 ' + (event === undefined ? '这一条' : span(event.time_start, event.time_end))
100
+ + ',这一天现在排了 ' + day.length + ' 件。'
101
+ : '这一天本来就有这一段,这一步没有新建,' + r.date + ' 现在排了 ' + day.length + ' 件。') },
102
+ { navText: '这一趟的结果', html: renderKpiGrid([
103
+ { label: '事件编号', value: String(r.id), detail: r.date },
104
+ {
105
+ label: '本地这一半', value: r.created ? '新建' : '原有',
106
+ detail: r.created ? '这条是新写进去的' : '命中已有那条,没有重复建',
107
+ },
108
+ { label: '时段', value: event === undefined ? '—' : fmtDurShort(minutes), detail: event === undefined ? '—' : span(event.time_start, event.time_end) },
109
+ { label: '这一天', value: String(day.length) + ' 件', detail: '同一分类 ' + String(sameCategory) + ' 件' },
110
+ ], { title: '这一趟的结果' }) },
111
+ { navText: '这一条的前后', html: renderChangePanel({ title: '这一条的前后', rows: [
112
+ { label: '库里有没有', before: r.created ? '没有' : '已经有了', after: '有这一条' },
113
+ { label: '事件编号', before: r.created ? '—' : String(r.id), after: String(r.id), arrow: false },
114
+ ] }) },
115
+ { html: renderFactStrip({
116
+ items: [
117
+ { label: '远端侧', value: REMOTE_LABEL[r.remote] },
118
+ { label: '这一天现有', value: String(day.length) + ' 件' },
119
+ { label: '同分类', value: String(sameCategory) + ' 件' },
120
+ { label: '完成状态', value: event === undefined ? '—' : completionText(event.completion) },
121
+ ],
122
+ }) },
123
+ { navText: '复制与留档', html: scheduleCopyArea({
124
+ title: '复制与留档',
125
+ dataActionId: 'ilife-sch-plan-copy-data',
126
+ logActionId: 'ilife-sch-plan-copy-log',
127
+ ...planCopyArea({
128
+ message: '补计划回执:日期 ' + r.date + ',事件编号 ' + String(r.id) + ',时段 '
129
+ + (event === undefined ? '—' : span(event.time_start, event.time_end)) + ',本地这一半 '
130
+ + (r.created ? '新建' : '命中已有') + ',远端侧 ' + REMOTE_LABEL[r.remote],
131
+ command: 'schedule-cmd-read schedule.plan.write --params {"op":"ensure","date":"' + r.date + '"}',
132
+ source: '日程计划表(' + r.date + ' 现有 ' + String(day.length) + ' 件)',
133
+ }),
134
+ }) },
135
+ { html: renderDisclosure({
136
+ title: '这一条现在的样子',
137
+ contentHtml: renderDataTable({
138
+ caption: '库里这一条',
139
+ columns: [{ key: 'k', label: '项' }, { key: 'v', label: '值' }],
140
+ rows: current,
141
+ emptyText: '库里没有找到这一条',
142
+ }),
143
+ }) },
144
+ // 段名是「<日期> 这一天现在的排布」;目录项与它逐字同源(同一句拼接写两处)。
145
+ { navText: r.date + ' 这一天现在的排布', html: event === undefined ? '' : renderHourBand(cellsOf(day), {
146
+ order: L1_ORDER, title: r.date + ' 这一天现在的排布', height: 120,
147
+ }) },
148
+ ]);
149
+ return assembleDocPage({ head, content: toc + body, extraCss: planPartsCss() });
150
+ }
151
+ /** 「批量补计划回执」整页:逐天结果表 + 汇总(复用单天那张页的口径,不另算一遍)。 */
152
+ export function ensureBatchReceiptPage(handle, days) {
153
+ const created = days.filter((d) => d.created).length;
154
+ const found = days.length - created;
155
+ const failed = days.filter((d) => !d.achieved).length;
156
+ const sorted = [...days].map((d) => d.date).sort();
157
+ const tables = days.map((d) => {
158
+ const event = listPlanEvents(handle, d.date, true).find((e) => e.id === d.id);
159
+ return {
160
+ date: d.date,
161
+ time: event === undefined ? '—' : span(event.time_start, event.time_end),
162
+ title: event === undefined ? '—' : event.title,
163
+ result: d.created ? '新建' : '命中已有',
164
+ remote: REMOTE_LABEL[d.remote],
165
+ };
166
+ });
167
+ const head = {
168
+ docTitle: '作息管家 补计划回执',
169
+ eyebrow: EYEBROW,
170
+ title: '批量补计划回执',
171
+ subtitle: '补的是 ' + (sorted.length === 0 ? '一个日期也没给' : sorted[0] + ' 至 ' + sorted[sorted.length - 1])
172
+ + ',一共 ' + days.length + ' 天。',
173
+ };
174
+ const { toc, body } = pageSections([
175
+ { html: renderConclusionBar(failed === 0
176
+ ? '这次 ' + days.length + ' 天都补上了,新建 ' + created + ' 天,命中已有 ' + found + ' 天。'
177
+ : '这次 ' + days.length + ' 天里 ' + failed + ' 天的远端侧没成,本地那一半照写。') },
178
+ { navText: '这一趟的结果', html: renderKpiGrid([
179
+ { label: '天数', value: String(days.length) + ' 天', detail: '这一趟补的' },
180
+ { label: '新建', value: String(created) + ' 天', detail: '本地原来没有这一段' },
181
+ { label: '命中已有', value: String(found) + ' 天', detail: '同一天同一段起止已存在' },
182
+ { label: '远端侧没成', value: String(failed) + ' 天', detail: failed === 0 ? '一天不差' : '本地那一半照写' },
183
+ ], { title: '这一趟的结果' }) },
184
+ { html: renderDataTable({
185
+ caption: '逐天结果',
186
+ columns: [
187
+ { key: 'date', label: '日期' },
188
+ { key: 'time', label: '时段' },
189
+ { key: 'title', label: '标题' },
190
+ { key: 'result', label: '本地这一半' },
191
+ { key: 'remote', label: '远端侧' },
192
+ ],
193
+ rows: tables,
194
+ emptyText: '这一趟一天也没收到',
195
+ }) },
196
+ { html: renderCaliberLine('同一天同一段起止只留一条 | 再补一次不算新建,也不会重复') },
197
+ { navText: '复制与留档', html: scheduleCopyArea({
198
+ title: '复制与留档',
199
+ dataActionId: 'ilife-sch-plan-copy-data',
200
+ logActionId: 'ilife-sch-plan-copy-log',
201
+ ...planCopyArea({
202
+ message: '批量补计划回执:' + String(days.length) + ' 天,'
203
+ + days.map((d) => d.date + ' ' + (d.created ? '新建' : '命中已有') + ' ' + REMOTE_LABEL[d.remote]).join(','),
204
+ command: 'schedule-cmd-read schedule.plan.write --params {"op":"ensure","dates":['
205
+ + days.map((d) => '"' + d.date + '"').join(',') + ']}',
206
+ source: '日程计划表(' + String(days.length) + ' 天)',
207
+ }),
208
+ }) },
209
+ ]);
210
+ return assembleDocPage({ head, content: toc + body, extraCss: planPartsCss() });
211
+ }
212
+ /* ─────────────────────────── ② 改计划回执(老侧 f14) ─────────────────────────── */
213
+ function fieldValue(key, value) {
214
+ if (value === null || value === undefined || value === '')
215
+ return '—';
216
+ if (key === 'completion')
217
+ return completionLabelOf(String(value));
218
+ return String(value);
219
+ }
220
+ /** 「改计划回执」整页:字段前后对照 + 飞书询问位 + 这条现在长什么样。 */
221
+ export function updateReceiptPage(handle, before, after, patchKeys, remote) {
222
+ const rows = patchKeys
223
+ .filter((key) => FIELD_LABELS[key] !== undefined)
224
+ .map((key) => ({
225
+ label: FIELD_LABELS[key],
226
+ before: fieldValue(key, before[key]),
227
+ after: fieldValue(key, after[key]),
228
+ }));
229
+ const moved = before.time_start !== after.time_start || before.time_end !== after.time_end;
230
+ const day = listPlanEvents(handle, after.date);
231
+ const head = {
232
+ docTitle: '作息管家 改计划回执',
233
+ eyebrow: EYEBROW,
234
+ title: '改计划回执',
235
+ subtitle: '改的是 ' + after.date + ' 的 ' + span(before.time_start, before.time_end)
236
+ + ',改完是 ' + span(after.time_start, after.time_end) + '。',
237
+ };
238
+ const { toc, body } = pageSections([
239
+ { html: renderConclusionBar(moved
240
+ ? '这一条已经改好,时段挪到了 ' + span(after.time_start, after.time_end) + ',改的是哪几格下面逐格对照。'
241
+ : '这一条已经改好,时段没动,改的是哪几格下面逐格对照。') },
242
+ { navText: '这一趟的结果', html: renderKpiGrid([
243
+ { label: '事件编号', value: String(after.id), detail: after.date },
244
+ { label: '现在的时段', value: fmtDurShort(toMinutes(after.time_end) - toMinutes(after.time_start)), detail: span(after.time_start, after.time_end) },
245
+ { label: '改动处数', value: String(rows.length) + ' 处', detail: moved ? '其中时段也变了' : '时段没动' },
246
+ { label: '这一天', value: String(day.length) + ' 件', detail: '改完之后的排布' },
247
+ ], { title: '这一趟的结果' }) },
248
+ { navText: '这次改了什么', html: renderChangePanel({ title: '这次改了什么', rows }) },
249
+ { navText: '时段变了,飞书那条也换过', html: moved
250
+ ? renderFeedbackBlock({
251
+ title: '时段变了,飞书那条也换过',
252
+ toast: {
253
+ icon: 'warn',
254
+ msg: '远端日历没有「改时间」这个动作,所以这一趟是先按新时段建一条,建好之后把旧的那条删掉。两步都成了才算远端侧成功。',
255
+ },
256
+ staticNotice: true,
257
+ })
258
+ : '' },
259
+ { html: renderFactStrip({
260
+ items: [
261
+ { label: '远端侧', value: REMOTE_LABEL[remote] },
262
+ { label: '现在的标题', value: after.title },
263
+ { label: '现在的分类', value: categoryOf(after) },
264
+ { label: '完成状态', value: completionText(after.completion) },
265
+ ],
266
+ }) },
267
+ { navText: '复制与留档', html: scheduleCopyArea({
268
+ title: '复制与留档',
269
+ dataActionId: 'ilife-sch-plan-copy-data',
270
+ logActionId: 'ilife-sch-plan-copy-log',
271
+ ...planCopyArea({
272
+ message: '改计划回执:日期 ' + after.date + ',事件编号 ' + String(after.id) + ',这次改了 '
273
+ + String(rows.length) + ' 处(' + rows.map((r) => r.label).join(',') + '),现在的时段 '
274
+ + span(after.time_start, after.time_end) + ',远端侧 ' + REMOTE_LABEL[remote],
275
+ command: 'schedule-cmd-read schedule.plan.write --params {"op":"update","id":' + String(after.id) + '}',
276
+ source: '日程计划表(' + after.date + ' 现有 ' + String(day.length) + ' 件)',
277
+ }),
278
+ }) },
279
+ ]);
280
+ return assembleDocPage({ head, content: toc + body, extraCss: planPartsCss() });
281
+ }
282
+ /* ─────────────────────────── ③ 删计划回执(老侧 f14 同一家族) ─────────────────────────── */
283
+ /** 「删计划回执」整页:软删的对照 + 飞书询问位 + 这一次删掉的是哪一条。 */
284
+ export function deactivateReceiptPage(handle, before, remote) {
285
+ const day = listPlanEvents(handle, before.date);
286
+ const minutes = toMinutes(before.time_end) - toMinutes(before.time_start);
287
+ const head = {
288
+ docTitle: '作息管家 删计划回执',
289
+ eyebrow: EYEBROW,
290
+ title: '删计划回执',
291
+ subtitle: '删的是 ' + before.date + ' 的 ' + span(before.time_start, before.time_end) + ',标题是「' + before.title + '」。',
292
+ };
293
+ const { toc, body } = pageSections([
294
+ { html: renderConclusionBar('这一条已经不再算进 ' + before.date + ' 了,这一天现在排着 ' + day.length
295
+ + ' 件。库里那一条没有真的删掉,只是标记成不再算。') },
296
+ { navText: '这一趟的结果', html: renderKpiGrid([
297
+ { label: '事件编号', value: String(before.id), detail: before.date },
298
+ { label: '删掉的时段', value: fmtDurShort(minutes), detail: span(before.time_start, before.time_end) },
299
+ { label: '这一天', value: String(day.length) + ' 件', detail: '比删之前少一件' },
300
+ { label: '本地这一半', value: '不再算', detail: '标记成不活跃' },
301
+ ], { title: '这一趟的结果' }) },
302
+ { navText: '这一条的前后', html: renderChangePanel({ title: '这一条的前后', rows: [
303
+ { label: '这一条', before: '在排', after: '不再算' },
304
+ { label: '这一天在排的件数', before: String(day.length + 1) + ' 件', after: String(day.length) + ' 件' },
305
+ { label: '远端那条', before: before.feishu_event_id === null ? '没有' : '有', after: before.feishu_event_id === null ? '没有' : '按这一趟的结果处理' },
306
+ ] }) },
307
+ { navText: '这是软删,不是抹掉', html: renderFeedbackBlock({
308
+ title: '这是软删,不是抹掉',
309
+ toast: {
310
+ icon: 'info',
311
+ msg: '库里那一条还在,只是不再算进这一天的排布。同槽位上属于本技能的远端对象一并清掉,别的对象不动。',
312
+ },
313
+ staticNotice: true,
314
+ }) },
315
+ { html: renderFactStrip({
316
+ items: [
317
+ { label: '远端侧', value: REMOTE_LABEL[remote] },
318
+ { label: '原来的标题', value: before.title },
319
+ { label: '原来的分类', value: categoryOf(before) },
320
+ { label: '完成状态', value: completionText(before.completion) },
321
+ ],
322
+ }) },
323
+ { html: renderCaliberLine('删计划只动这一条 | 别的事件与别的日期一件不动') },
324
+ { navText: '复制与留档', html: scheduleCopyArea({
325
+ title: '复制与留档',
326
+ dataActionId: 'ilife-sch-plan-copy-data',
327
+ logActionId: 'ilife-sch-plan-copy-log',
328
+ ...planCopyArea({
329
+ message: '删计划回执:日期 ' + before.date + ',事件编号 ' + String(before.id) + ',删掉的时段 '
330
+ + span(before.time_start, before.time_end) + ',这一天现在 ' + String(day.length) + ' 件,远端侧 '
331
+ + REMOTE_LABEL[remote],
332
+ command: 'schedule-cmd-read schedule.plan.write --params {"op":"deactivate","id":' + String(before.id) + '}',
333
+ source: '日程计划表(' + before.date + ' 现有 ' + String(day.length) + ' 件)',
334
+ }),
335
+ }) },
336
+ // 段名是「<日期> 这一天现在的排布」;目录项与它逐字同源。
337
+ { navText: before.date + ' 这一天现在的排布', html: renderHourBand(cellsOf(day), { order: L1_ORDER, title: before.date + ' 这一天现在的排布', height: 120 }) },
338
+ ]);
339
+ return assembleDocPage({ head, content: toc + body, extraCss: planPartsCss() });
340
+ }
341
+ //# sourceMappingURL=receiptDocs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receiptDocs.js","sourceRoot":"","sources":["../../src/plan/receiptDocs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EACL,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EACzE,mBAAmB,EAAE,aAAa,GACnC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAiB,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEjE,iBAAiB;AACjB,MAAM,OAAO,GAAG,YAAY,CAAC;AAC7B,kDAAkD;AAClD,MAAM,QAAQ,GAAsB,CAAC,GAAG,gBAAgB,CAAC,CAAC;AAE1D,sCAAsC;AACtC,MAAM,YAAY,GAAqC;IACrD,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,MAAM;IAClB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,MAAM;IAClB,eAAe,EAAE,MAAM;CACxB,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,GAAW,EAAU,EAAE,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC;AACzE,MAAM,KAAK,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,+CAA+C;AAC/C,MAAM,cAAc,GAAG,CAAC,CAAU,EAAU,EAAE,CAC5C,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnF,wCAAwC;AACxC,MAAM,UAAU,GAAG,CAAC,CAAY,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE7G,SAAS,OAAO,CAAC,MAA4B;IAC3C,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;QAC9B,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC1B,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;KAC5B,CAAC,CAAC,CAAC,CAAC;AACP,CAAC;AAYD,gDAAgD;AAChD,MAAM,UAAU,iBAAiB,CAAC,MAAkB,EAAE,CAAgB;IACpE,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAClG,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IACvG,MAAM,GAAG,GAAG,mBAAmB,CAAC;QAC9B,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,8CAA8C;SACpD;QACD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,MAAM,IAAI,GAAa;QACrB,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,KAAK,KAAK,SAAS;YAC3B,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,0BAA0B;YACrC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI;KACpG,CAAC;IACF,MAAM,OAAO,GAAmB,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;QAChC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE;QAC1B,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE;QACtD,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;QAC/B,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE;QAC3B,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE;QACjC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAClC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;KACnD,CAAC;IACF,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC;QACjC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;QACnE,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,OAAO;gBACnC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;sBAC/F,WAAW,GAAG,GAAG,CAAC,MAAM,GAAG,KAAK;gBACpC,CAAC,CAAC,qBAAqB,GAAG,CAAC,CAAC,IAAI,GAAG,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE;QACrE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,CAAC;gBACvC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE;gBACtD;oBACE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;oBAC9C,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc;iBAChD;gBACD,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACpJ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,EAAE;aAClG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;QACzB,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;oBACpE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;oBACpE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;iBAC7F,EAAE,CAAC,EAAE;QACN,EAAE,IAAI,EAAE,eAAe,CAAC;gBACtB,KAAK,EAAE;oBACL,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;oBAC/C,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE;oBACpD,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,EAAE;oBACpD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;iBACvF;aACF,CAAC,EAAE;QACJ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC;gBACzC,KAAK,EAAE,OAAO;gBACd,YAAY,EAAE,0BAA0B;gBACxC,WAAW,EAAE,yBAAyB;gBACtC,GAAG,YAAY,CAAC;oBACd,OAAO,EAAE,WAAW,GAAG,CAAC,CAAC,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM;0BAC5D,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS;0BAChF,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClE,OAAO,EAAE,wEAAwE,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI;oBACjG,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK;iBAChE,CAAC;aACH,CAAC,EAAE;QACJ,EAAE,IAAI,EAAE,gBAAgB,CAAC;gBACvB,KAAK,EAAE,UAAU;gBACjB,WAAW,EAAE,eAAe,CAAC;oBAC3B,OAAO,EAAE,OAAO;oBAChB,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;oBAC7D,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,WAAW;iBACvB,CAAC;aACH,CAAC,EAAE;QACJ,0CAA0C;QAC1C,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,GAAG,WAAW,EAAE,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC7F,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG;aAC1D,CAAC,EAAE;KACL,CAAC,CAAC;IACH,OAAO,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAWD,gDAAgD;AAChD,MAAM,UAAU,sBAAsB,CAAC,MAAkB,EAAE,IAA+B;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IACtD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,MAAM,GAAmB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9E,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC;YACxE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK;YAC9C,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;YACjC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;SAC/B,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAa;QACrB,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;cAChG,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK;KACjC,CAAC;IACF,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC;QACjC,EAAE,IAAI,EAAE,mBAAmB,CAAC,MAAM,KAAK,CAAC;gBACtC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK;gBAC3E,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,mBAAmB,CAAC,EAAE;QAClE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,CAAC;gBACvC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;gBACnE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE;gBACnE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE;gBACrE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE;aAC5F,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;QACzB,EAAE,IAAI,EAAE,eAAe,CAAC;gBACtB,OAAO,EAAE,MAAM;gBACf,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC5B,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC5B,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC7B,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;oBACjC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE;iBAChC;gBACD,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,WAAW;aACvB,CAAC,EAAE;QACJ,EAAE,IAAI,EAAE,iBAAiB,CAAC,+BAA+B,CAAC,EAAE;QAC5D,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC;gBACzC,KAAK,EAAE,OAAO;gBACd,YAAY,EAAE,0BAA0B;gBACxC,WAAW,EAAE,yBAAyB;gBACtC,GAAG,YAAY,CAAC;oBACd,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK;0BAC7C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBACxG,OAAO,EAAE,yEAAyE;0BAC9E,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;oBACxD,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK;iBAC/C,CAAC;aACH,CAAC,EAAE;KACL,CAAC,CAAC;IACH,OAAO,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,6EAA6E;AAE7E,SAAS,UAAU,CAAC,GAAW,EAAE,KAAc;IAC7C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IACtE,IAAI,GAAG,KAAK,YAAY;QAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,iBAAiB,CAC/B,MAAkB,EAAE,MAAiB,EAAE,KAAgB,EAAE,SAA4B,EAAE,MAAmB;IAE1G,MAAM,IAAI,GAAqB,SAAS;SACrC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;SAChD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;QACxB,MAAM,EAAE,UAAU,CAAC,GAAG,EAAG,MAA6C,CAAC,GAAG,CAAC,CAAC;QAC5E,KAAK,EAAE,UAAU,CAAC,GAAG,EAAG,KAA4C,CAAC,GAAG,CAAC,CAAC;KAC3E,CAAC,CAAC,CAAC;IACN,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC;IAC3F,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAa;QACrB,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC;cAC5E,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,GAAG;KAC3D,CAAC;IACF,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC;QACjC,EAAE,IAAI,EAAE,mBAAmB,CAAC,KAAK;gBAC/B,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,gBAAgB;gBAC9E,CAAC,CAAC,4BAA4B,CAAC,EAAE;QACnC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,CAAC;gBACvC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE;gBAC9D,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE;gBAC/I,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE;gBACxF,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE;aACtE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;QACzB,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;QACzE,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK;gBACpC,CAAC,CAAC,mBAAmB,CAAC;oBACpB,KAAK,EAAE,cAAc;oBACrB,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM;wBACZ,GAAG,EAAE,0DAA0D;qBAChE;oBACD,YAAY,EAAE,IAAI;iBACnB,CAAC;gBACF,CAAC,CAAC,EAAE,EAAE;QACR,EAAE,IAAI,EAAE,eAAe,CAAC;gBACtB,KAAK,EAAE;oBACL,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE;oBAC7C,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;oBACtC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE;oBAC5C,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;iBAC3D;aACF,CAAC,EAAE;QACJ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC;gBACzC,KAAK,EAAE,OAAO;gBACd,YAAY,EAAE,0BAA0B;gBACxC,WAAW,EAAE,yBAAyB;gBACtC,GAAG,YAAY,CAAC;oBACd,OAAO,EAAE,WAAW,GAAG,KAAK,CAAC,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,QAAQ;0BACtE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU;0BAC7E,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC;oBAC3E,OAAO,EAAE,qEAAqE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,GAAG;oBACvG,MAAM,EAAE,QAAQ,GAAG,KAAK,CAAC,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK;iBACpE,CAAC;aACH,CAAC,EAAE;KACL,CAAC,CAAC;IACH,OAAO,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,kFAAkF;AAElF,4CAA4C;AAC5C,MAAM,UAAU,qBAAqB,CAAC,MAAkB,EAAE,MAAiB,EAAE,MAAmB;IAC9F,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAa;QACrB,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI;KAClH,CAAC;IACF,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC;QACjC,EAAE,IAAI,EAAE,mBAAmB,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,GAAG,aAAa,GAAG,GAAG,CAAC,MAAM;kBAC/E,0BAA0B,CAAC,EAAE;QACjC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,CAAC;gBACvC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBAChE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;gBACjG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE;gBACrE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE;aACnD,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;QACzB,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;oBACpE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;oBAC5C,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE;oBAC9F,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;iBACrI,EAAE,CAAC,EAAE;QACN,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,CAAC;gBAChD,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE;oBACL,IAAI,EAAE,MAAM;oBACZ,GAAG,EAAE,iDAAiD;iBACvD;gBACD,YAAY,EAAE,IAAI;aACnB,CAAC,EAAE;QACJ,EAAE,IAAI,EAAE,eAAe,CAAC;gBACtB,KAAK,EAAE;oBACL,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE;oBAC7C,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;oBACvC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;oBAC7C,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;iBAC5D;aACF,CAAC,EAAE;QACJ,EAAE,IAAI,EAAE,iBAAiB,CAAC,0BAA0B,CAAC,EAAE;QACvD,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC;gBACzC,KAAK,EAAE,OAAO;gBACd,YAAY,EAAE,0BAA0B;gBACxC,WAAW,EAAE,yBAAyB;gBACtC,GAAG,YAAY,CAAC;oBACd,OAAO,EAAE,WAAW,GAAG,MAAM,CAAC,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS;0BACzE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS;0BACrF,YAAY,CAAC,MAAM,CAAC;oBACxB,OAAO,EAAE,yEAAyE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG;oBAC5G,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK;iBACrE,CAAC;aACH,CAAC,EAAE;QACJ,gCAAgC;QAChC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,GAAG,WAAW,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE;KAC/I,CAAC,CAAC;IACH,OAAO,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,165 @@
1
+ /** #788 · 「复盘」一体页(老侧 f18「区间复盘」/`schedule_replay.html`)的**窗口路由与口径**。
2
+ *
3
+ * 为什么是「一体页」:老侧复盘四档(复盘今日/本周/本月/区间)**共用同一个模板**,四档的差别只在
4
+ * 页上摆哪几段([ADR-0005](../../../../docs/adr) 与老侧 `scenarios/replay.yaml` 的 T3 裁定:
5
+ * 「一体模板 · 4 粒度同一模板,区间按跨度自动路由区块」)。本件逐档照搬那份路由:
6
+ *
7
+ * day 计划 vs 实际对照 → 实际作息 → 计划执行 → 跨域对比 → 健康分 → 亮点与问题(缺计划另有补齐引导)
8
+ * week 7 维趋势 → 24h × N 天热力图 → 健康分(均值) → 亮点与问题
9
+ * month 月度聚合 → 环比对比(上月同期) → 目标达成 → 健康分 → 亮点与问题
10
+ * 通用 实际作息 → 计划执行 → 跨域对比 → 亮点与问题(四段叙事)
11
+ * 全档 4 卡读数 + 页尾「复盘到明天的衔接」+ 复制区
12
+ *
13
+ * **区间的档从跨度来**(不是从有数据的天数来):≤1 天→今日档,≤7 天→本周档,≤31 天→本月档,
14
+ * 其余→通用档。这一个路由只写在这里一处。
15
+ *
16
+ * **口径住本能力目录**(`src/plan/`,与 `queryDocs.ts`/`writeDocs.ts` 同一分工)。能复用的一律复用,
17
+ * 本件不重算别家口径:一级分类聚合与单日读数调 `render/views.ts` 的 `buildRecordRange`/
18
+ * `buildRecordToday`,一级分类映射调 `policy` 的 `l1Of`,健康分与异常判定调 `policy` 的
19
+ * `computeHealthScore`/`detectAnomalies`,窗口换算调 `policy` 的 `relativeToRange`。
20
+ *
21
+ * 本件自己算的那几条(都只此一处,别处引用):
22
+ * · **跨域对照**:某条计划的**实际时长**=这一天与它时段相交的作息记录各自交集之和;
23
+ * **未执行**=完成状态属于「部分完成/未完成/未完成(不可抗力)」;**超计划**=与它搭边的记录
24
+ * 时长合计 ≥ 计划时长 ×1.2;**计划外**=没有任何计划与它搭边的记录(老侧 `render_replay` 的
25
+ * T05 跨域段,三个阈值逐条照抄)。
26
+ * · **上月同期**:起止各往前挪一个自然月(老侧 `_shift_month`)。
27
+ * · **亮点与问题**:拿**前一段等长区间**当对照,走仓内既有的 `detectAnomalies`(红 20%/黄 10%),
28
+ * **不抄**老侧那个把区间对折成前后半段的 mock 算法——那条是「没有历史数据时的权宜」,本仓的
29
+ * 区间查询拿得到前一段,就用真对照。
30
+ */
31
+ import type { PlanEvent, ScheduleDb, ScheduleRecord } from '../fetch/db.js';
32
+ import { type Anomaly } from '../policy/index.js';
33
+ /** 四档(老侧 `render_replay` 的 `granularity`)+ 本件按跨度判出来的那一档。 */
34
+ export type ReplayGranularity = 'day' | 'week' | 'month' | 'range';
35
+ export interface ReplayWindow {
36
+ readonly start: string;
37
+ readonly end: string;
38
+ /** 跨度天数(起止都算),页头与路由都用它。 */
39
+ readonly days: number;
40
+ /** 唤醒词点的那一档(`复盘区间` 就是 `range`)。 */
41
+ readonly requested: ReplayGranularity;
42
+ /** 页上真按哪一档画(只对 `range` 会与 `requested` 不同)。 */
43
+ readonly effective: ReplayGranularity;
44
+ }
45
+ /** 起止之间每一天(含两端),顺序即页上的行序。 */
46
+ export declare function eachDay(start: string, end: string): string[];
47
+ /** 起止各挪一个自然月(日号超出目标月天数时收到月末):老侧 `_shift_month` 的同一条口径。 */
48
+ export declare function shiftMonth(date: string, delta: number): string;
49
+ /** 唤醒词那一档 + 参数 → 这一趟的窗口与页上真画的那一档。
50
+ *
51
+ * `day`/`week`/`month` 的锚点=`date` 参数(不给即今天);`range` 走 `resolveRangeParam`
52
+ * (显式 start/end,或 `range=本周/上月…`,或 `recentDays=N`)。 */
53
+ export declare function replayWindowOf(granularity: unknown, params: Record<string, unknown>): ReplayWindow;
54
+ /** 裸词「复盘」那一档的窗口:单日(`date` 参数,不给即今天)。 */
55
+ export declare function dayWindow(params: Record<string, unknown>): ReplayWindow;
56
+ /** 区间按跨度路由(老侧 `_make_granularity_data` 的三条边界,逐条照抄):≤1 天→今日档,
57
+ * ≤7 天→本周档,≤31 天→本月档,其余→通用档。 */
58
+ export declare function routeBySpan(days: number): ReplayGranularity;
59
+ /** 逐日那几块(热力图)在**通用档**最多印几天;逐条那几张清单在通用档最多印几行。
60
+ *
61
+ * 为什么要有这几位上界:交付面有一条体积门(`deliverHtml` 超过 256 KB 直接拒收),而这几件都是
62
+ * 「行即件」的**逐日/逐条**形状——60 天的热力图光它自己就 180 KB 起,一段 61 天的区间里
63
+ * 「计划外记录」能有 800 条(实测一行约 226 B,合计 181 KB),老侧那份 540 KB 的区间复盘页
64
+ * 正是用户报「数据量爆炸」的原件。通用档本来就是「跨了月才轮到的四段叙事」:
65
+ * **一眼看节奏**那几块给最近一周,**逐条**那几块给头几条并写明另有几条,整段读数走聚合那几块。 */
66
+ export declare const HEAT_DAYS_CAP = 7;
67
+ export declare const LIST_ROWS_CAP = 12;
68
+ export declare const PAIR_ROWS_CAP = 31;
69
+ /** 逐日那几块(热力图)在**通用档**最多印几天。 */
70
+ /** 一级分类分钟数:调 `render/views.ts` 的 `buildRecordRange`(载荷口径那一份),只把 `l1.` 前缀取掉。 */
71
+ export declare function byL1Of(start: string, end: string, records: readonly ScheduleRecord[]): Record<string, number>;
72
+ /** 一条计划的跨域对照(计划 vs 实际)。 */
73
+ export interface CrossPair {
74
+ readonly id: number;
75
+ readonly date: string;
76
+ readonly time: string;
77
+ readonly title: string;
78
+ readonly planMinutes: number;
79
+ readonly actualMinutes: number;
80
+ readonly deltaMinutes: number;
81
+ readonly completion: string;
82
+ }
83
+ /** 跨域那一族的四条清单(老侧 `cross_domain` 的四个键)。 */
84
+ export interface CrossDomain {
85
+ readonly pairs: readonly CrossPair[];
86
+ readonly unexecuted: readonly PlanEvent[];
87
+ /** 溢出:与计划搭边的记录里**落在计划时段之外**的那部分合计 ≥ 计划时长 20% 的那些。 */
88
+ readonly overrun: readonly {
89
+ readonly id: number;
90
+ readonly date: string;
91
+ readonly title: string;
92
+ readonly planMinutes: number;
93
+ readonly spillMinutes: number;
94
+ }[];
95
+ readonly unexpected: readonly ScheduleRecord[];
96
+ }
97
+ /** 计划 vs 实际:逐条计划的**实际时长**=这一天与它时段相交的记录各自交集之和;
98
+ * **溢出**=那些搭边记录里落在计划时段之外的分钟数合计(老侧那条是拿记录**整块**时长比计划时长,
99
+ * 种子数据里 7 条计划会全被判成「花超」(30 分钟的散步被旁边 45 分钟的块带成 1.5 倍),读数没有
100
+ * 分辨力;本票改成只看溢出计划时段的那部分,阈值仍是 20%——这是**有意偏离**,写进证据件)。 */
101
+ export declare function crossDomainOf(plans: readonly PlanEvent[], records: readonly ScheduleRecord[]): CrossDomain;
102
+ /** 一天一段的读数(周档的矩阵行、月档的健康分序列、通用档的逐日明细都用它)。 */
103
+ export interface ReplayDayRow {
104
+ readonly date: string;
105
+ readonly blocks: number;
106
+ readonly minutes: number;
107
+ readonly score: number;
108
+ /** 这一天的一级分类分钟数(7 维趋势的每一个点就是它)。 */
109
+ readonly byL1: Record<string, number>;
110
+ readonly records: readonly ScheduleRecord[];
111
+ readonly plans: readonly PlanEvent[];
112
+ }
113
+ /** 这一档页上要的全部东西(`replaySections.ts` 按档取用)。 */
114
+ export interface ReplayData {
115
+ readonly win: ReplayWindow;
116
+ readonly records: readonly ScheduleRecord[];
117
+ readonly plans: readonly PlanEvent[];
118
+ readonly totalMinutes: number;
119
+ readonly activeDays: number;
120
+ readonly byL1: Record<string, number>;
121
+ readonly dimScores: Record<string, number>;
122
+ readonly healthScore: number;
123
+ readonly healthSeries: readonly {
124
+ readonly date: string;
125
+ readonly score: number;
126
+ }[];
127
+ readonly healthMean: number;
128
+ readonly completionCounts: readonly {
129
+ readonly state: string;
130
+ readonly count: number;
131
+ }[];
132
+ readonly completionRate: number | null;
133
+ /** 这一段标过完成状态的计划条数(完成率的分母就是它)。 */
134
+ readonly marked: number;
135
+ readonly completionByL1: readonly {
136
+ readonly name: string;
137
+ readonly total: number;
138
+ readonly done: number;
139
+ readonly marked: number;
140
+ readonly rate: number | null;
141
+ }[];
142
+ readonly days: readonly ReplayDayRow[];
143
+ readonly cross: CrossDomain;
144
+ readonly monthCompare: readonly {
145
+ readonly name: string;
146
+ readonly cur: number;
147
+ readonly prev: number;
148
+ readonly deltaPct: number | null;
149
+ }[];
150
+ readonly monthRateCompare: {
151
+ readonly cur: number;
152
+ readonly prev: number;
153
+ readonly deltaPct: number;
154
+ } | null;
155
+ readonly anomalies: readonly Anomaly[];
156
+ readonly prevSpan: {
157
+ readonly start: string;
158
+ readonly end: string;
159
+ };
160
+ /** 复盘之后要接上的那一天(末日的次日)。 */
161
+ readonly nextDay: string;
162
+ }
163
+ /** 把窗口里的行装配成页上要的那份数据(全部读操作,不写库)。 */
164
+ export declare function replayData(handle: ScheduleDb, win: ReplayWindow): ReplayData;
165
+ //# sourceMappingURL=replayDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayDocs.d.ts","sourceRoot":"","sources":["../../src/plan/replayDocs.ts"],"names":[],"mappings":"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"}