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.
- package/SKILL.md +12 -3
- package/dist/.gen-inputs.json +4 -4
- package/dist/admin/adminDocs.d.ts +57 -0
- package/dist/admin/adminDocs.d.ts.map +1 -0
- package/dist/admin/adminDocs.js +190 -0
- package/dist/admin/adminDocs.js.map +1 -0
- package/dist/admin/adminParts.d.ts +37 -0
- package/dist/admin/adminParts.d.ts.map +1 -0
- package/dist/admin/adminParts.js +83 -0
- package/dist/admin/adminParts.js.map +1 -0
- package/dist/admin/handlers.d.ts.map +1 -1
- package/dist/admin/handlers.js +196 -6
- package/dist/admin/handlers.js.map +1 -1
- package/dist/admin/routes.d.ts +10 -1
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +2 -0
- package/dist/admin/routes.js.map +1 -1
- package/dist/analyze/analyzeDocs.d.ts +51 -0
- package/dist/analyze/analyzeDocs.d.ts.map +1 -0
- package/dist/analyze/analyzeDocs.js +442 -0
- package/dist/analyze/analyzeDocs.js.map +1 -0
- package/dist/analyze/analyzeParts.d.ts +53 -0
- package/dist/analyze/analyzeParts.d.ts.map +1 -0
- package/dist/analyze/analyzeParts.js +229 -0
- package/dist/analyze/analyzeParts.js.map +1 -0
- package/dist/analyze/handlers.d.ts.map +1 -1
- package/dist/analyze/handlers.js +41 -4
- package/dist/analyze/handlers.js.map +1 -1
- package/dist/cli/cmd_read.js +8 -2
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/fetch/feishu.d.ts +6 -0
- package/dist/fetch/feishu.d.ts.map +1 -1
- package/dist/fetch/feishu.js +18 -7
- package/dist/fetch/feishu.js.map +1 -1
- package/dist/fetch/index.d.ts +1 -1
- package/dist/fetch/index.d.ts.map +1 -1
- package/dist/fetch/index.js +1 -1
- package/dist/fetch/index.js.map +1 -1
- package/dist/fetch/paths.d.ts +17 -4
- package/dist/fetch/paths.d.ts.map +1 -1
- package/dist/fetch/paths.js +25 -7
- package/dist/fetch/paths.js.map +1 -1
- package/dist/health.d.ts.map +1 -1
- package/dist/health.js +12 -8
- package/dist/health.js.map +1 -1
- package/dist/help/index.d.ts +1 -0
- package/dist/help/index.d.ts.map +1 -1
- package/dist/help/index.js +3 -0
- package/dist/help/index.js.map +1 -1
- package/dist/plan/discussDocs.d.ts +8 -0
- package/dist/plan/discussDocs.d.ts.map +1 -0
- package/dist/plan/discussDocs.js +321 -0
- package/dist/plan/discussDocs.js.map +1 -0
- package/dist/plan/feishuDocs.d.ts +19 -0
- package/dist/plan/feishuDocs.d.ts.map +1 -0
- package/dist/plan/feishuDocs.js +257 -0
- package/dist/plan/feishuDocs.js.map +1 -0
- package/dist/plan/handlers.d.ts.map +1 -1
- package/dist/plan/handlers.js +107 -3
- package/dist/plan/handlers.js.map +1 -1
- package/dist/plan/index.d.ts +2 -0
- package/dist/plan/index.d.ts.map +1 -1
- package/dist/plan/index.js +16 -9
- package/dist/plan/index.js.map +1 -1
- package/dist/plan/iso.d.ts +2 -0
- package/dist/plan/iso.d.ts.map +1 -1
- package/dist/plan/iso.js +6 -2
- package/dist/plan/iso.js.map +1 -1
- package/dist/plan/planDocs.d.ts +47 -0
- package/dist/plan/planDocs.d.ts.map +1 -0
- package/dist/plan/planDocs.js +159 -0
- package/dist/plan/planDocs.js.map +1 -0
- package/dist/plan/planParts.d.ts +38 -0
- package/dist/plan/planParts.d.ts.map +1 -0
- package/dist/plan/planParts.js +96 -0
- package/dist/plan/planParts.js.map +1 -0
- package/dist/plan/probe.d.ts +28 -0
- package/dist/plan/probe.d.ts.map +1 -0
- package/dist/plan/probe.js +114 -0
- package/dist/plan/probe.js.map +1 -0
- package/dist/plan/receipt.d.ts +12 -0
- package/dist/plan/receipt.d.ts.map +1 -1
- package/dist/plan/receipt.js +17 -0
- package/dist/plan/receipt.js.map +1 -1
- package/dist/plan/receiptDocs.d.ts +26 -0
- package/dist/plan/receiptDocs.d.ts.map +1 -0
- package/dist/plan/receiptDocs.js +341 -0
- package/dist/plan/receiptDocs.js.map +1 -0
- package/dist/plan/replayDocs.d.ts +165 -0
- package/dist/plan/replayDocs.d.ts.map +1 -0
- package/dist/plan/replayDocs.js +226 -0
- package/dist/plan/replayDocs.js.map +1 -0
- package/dist/plan/replaySections.d.ts +5 -0
- package/dist/plan/replaySections.d.ts.map +1 -0
- package/dist/plan/replaySections.js +471 -0
- package/dist/plan/replaySections.js.map +1 -0
- package/dist/plan/reviewDocs.d.ts +4 -0
- package/dist/plan/reviewDocs.d.ts.map +1 -0
- package/dist/plan/reviewDocs.js +130 -0
- package/dist/plan/reviewDocs.js.map +1 -0
- package/dist/plan/sync.d.ts.map +1 -1
- package/dist/plan/sync.js +5 -0
- package/dist/plan/sync.js.map +1 -1
- package/dist/policy/index.d.ts +1 -1
- package/dist/policy/index.d.ts.map +1 -1
- package/dist/policy/index.js +1 -1
- package/dist/policy/index.js.map +1 -1
- package/dist/policy/plan.d.ts +8 -0
- package/dist/policy/plan.d.ts.map +1 -1
- package/dist/policy/plan.js +20 -0
- package/dist/policy/plan.js.map +1 -1
- package/dist/query/handlers.d.ts +3 -0
- package/dist/query/handlers.d.ts.map +1 -1
- package/dist/query/handlers.js +86 -12
- package/dist/query/handlers.js.map +1 -1
- package/dist/query/queryDocs.d.ts +64 -0
- package/dist/query/queryDocs.d.ts.map +1 -0
- package/dist/query/queryDocs.js +554 -0
- package/dist/query/queryDocs.js.map +1 -0
- package/dist/query/routes.d.ts +11 -1
- package/dist/query/routes.d.ts.map +1 -1
- package/dist/query/routes.js +5 -1
- package/dist/query/routes.js.map +1 -1
- package/dist/render/copyArea.d.ts +61 -0
- package/dist/render/copyArea.d.ts.map +1 -0
- package/dist/render/copyArea.js +80 -0
- package/dist/render/copyArea.js.map +1 -0
- package/dist/render/html.d.ts.map +1 -1
- package/dist/render/html.js +3 -1
- package/dist/render/html.js.map +1 -1
- package/dist/render/index.d.ts +3 -0
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +2 -0
- package/dist/render/index.js.map +1 -1
- package/dist/shared/dayPage.d.ts +67 -0
- package/dist/shared/dayPage.d.ts.map +1 -0
- package/dist/shared/dayPage.js +92 -0
- package/dist/shared/dayPage.js.map +1 -0
- package/dist/shared/detailPage.d.ts +55 -0
- package/dist/shared/detailPage.d.ts.map +1 -0
- package/dist/shared/detailPage.js +65 -0
- package/dist/shared/detailPage.js.map +1 -0
- package/dist/shared/docPage.d.ts +22 -0
- package/dist/shared/docPage.d.ts.map +1 -0
- package/dist/shared/docPage.js +52 -0
- package/dist/shared/docPage.js.map +1 -0
- package/dist/shared/overviewPage.d.ts +52 -0
- package/dist/shared/overviewPage.d.ts.map +1 -0
- package/dist/shared/overviewPage.js +65 -0
- package/dist/shared/overviewPage.js.map +1 -0
- package/dist/shared/pageNav.d.ts +24 -0
- package/dist/shared/pageNav.d.ts.map +1 -0
- package/dist/shared/pageNav.js +70 -0
- package/dist/shared/pageNav.js.map +1 -0
- package/dist/shared/pageParts.d.ts +45 -0
- package/dist/shared/pageParts.d.ts.map +1 -0
- package/dist/shared/pageParts.js +154 -0
- package/dist/shared/pageParts.js.map +1 -0
- package/dist/shared/planPage.d.ts +49 -0
- package/dist/shared/planPage.d.ts.map +1 -0
- package/dist/shared/planPage.js +48 -0
- package/dist/shared/planPage.js.map +1 -0
- package/dist/shared/rangePage.d.ts +44 -0
- package/dist/shared/rangePage.d.ts.map +1 -0
- package/dist/shared/rangePage.js +50 -0
- package/dist/shared/rangePage.js.map +1 -0
- package/dist/shared/weekPage.d.ts +36 -0
- package/dist/shared/weekPage.d.ts.map +1 -0
- package/dist/shared/weekPage.js +42 -0
- package/dist/shared/weekPage.js.map +1 -0
- package/dist/triggers/routes.generated.d.ts +23 -1
- package/dist/triggers/routes.generated.d.ts.map +1 -1
- package/dist/triggers/routes.generated.js +4 -1
- package/dist/triggers/routes.generated.js.map +1 -1
- package/dist/write/handlers.d.ts.map +1 -1
- package/dist/write/handlers.js +101 -5
- package/dist/write/handlers.js.map +1 -1
- package/dist/write/writeDocs.d.ts +27 -0
- package/dist/write/writeDocs.d.ts.map +1 -0
- package/dist/write/writeDocs.js +423 -0
- package/dist/write/writeDocs.js.map +1 -0
- package/dist/write/writeParts.d.ts +54 -0
- package/dist/write/writeParts.d.ts.map +1 -0
- package/dist/write/writeParts.js +117 -0
- package/dist/write/writeParts.js.map +1 -0
- 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"}
|