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,96 @@
1
+ /** #787 · 「日程与计划」写侧这一族的**族级页内自造件**(页内自造件与样式常量的唯一住处)。
2
+ *
3
+ * 为什么住这里:本票五张页里只有一处公共层给不出的件——**改前改后逐格对照的蓝调面板**
4
+ * (老侧 f14「改/删日程回执」与 f15「补日程回执」的必现块「字段前后对照」)。公共层
5
+ * `renderChangeRows` 给的是「行即件」(不返容器),直接当一块塞进页壳,宽档栅格下每行各占一整行;
6
+ * 而老侧那层底(浅蓝底 + 左侧蓝档)也只在作息这一族用。写法照 `src/write/writeParts.ts` 的先例
7
+ * (同族两处自造件),**不跨能力引它**——那份是写入与同步域自己的件。
8
+ *
9
+ * **只认形状,不认领域**:进来的是摆好的数据(哪几格改过、改前改后是什么值,都由 `receiptDocs.ts`
10
+ * 算好),出去是 HTML 串。
11
+ *
12
+ * **样式纪律(本票的代码层窄判据)**:本文件是**族级样式常量的唯一住处**——CSS 里的长度一律取下面
13
+ * 那组具名常量、颜色一律取公共层冻结 token(`var(--…)`),`px` 字面量一处也不写。断点只用仓内
14
+ * 既有值 **820**(页内自造件那一档),不新造。
15
+ */
16
+ import { renderChangeRows } from 'base-paint/blocks';
17
+ /** 五字符转义(与公共层 `blocks.ts` 同口径;本件不引区块层内部件)。 */
18
+ function esc(value) {
19
+ return value.replace(/[&<>"']/g, (ch) => {
20
+ if (ch === '&')
21
+ return '&amp;';
22
+ if (ch === '<')
23
+ return '&lt;';
24
+ if (ch === '>')
25
+ return '&gt;';
26
+ if (ch === '"')
27
+ return '&quot;';
28
+ return '&#39;';
29
+ });
30
+ }
31
+ /** 族级样式常量(本域 CSS 里所有长度的出处;数值只在这里出现一次)。 */
32
+ const PANEL_GAP = 8;
33
+ const PANEL_PAD_Y = 12;
34
+ const PANEL_PAD_X = 14;
35
+ const PANEL_RADIUS = 12;
36
+ const RAIL_W = 3;
37
+ const HAIRLINE = 1;
38
+ const FS_TITLE = 15;
39
+ const FS_BODY = 13;
40
+ const NARROW = 820;
41
+ /** #788 目标达成卡那一件的长度(与上面同表:本文件是唯一住处)。 */
42
+ const GOAL_COLS = 2;
43
+ const GOAL_FS_VALUE = 22;
44
+ const GOAL_FS_LABEL = 13;
45
+ const GOAL_FS_HINT = 12;
46
+ const px = (n) => n + 'px';
47
+ const LF = String.fromCharCode(10);
48
+ /** 蓝调前后对照面板(老侧必现块「字段前后对照」):一行标题 + 一段逐格对照。
49
+ * 只改了一处也要出(一行也是对照);`rows` 为空=空串(不留空壳)。 */
50
+ export function renderChangePanel(input) {
51
+ if (input.rows.length === 0)
52
+ return '';
53
+ return '<h2 class="sch-pl-h2">' + esc(input.title) + '</h2>'
54
+ + '<div class="sch-pl-diff">' + renderChangeRows({ rows: input.rows }) + '</div>';
55
+ }
56
+ /** #788 · 段名(页上一段的标题):走公共层区块自己的段名类 `heat-title`(与 `shared/overviewPage`
57
+ * 的逐日段名同一条口径),**不新造类名、不新添 CSS**。老侧那四档的每个区块都有自己的名字,
58
+ * 出页门与探针按名字认块,故段名必须由一处产出。 */
59
+ export function renderSectionTitle(text) {
60
+ return '<h2 class="heat-title">' + esc(text) + '</h2>';
61
+ }
62
+ /** 目标达成:一格一张卡(标签 + 读数 + 一句怎么读)。`cards` 为空=空串(不留空壳)。 */
63
+ export function renderGoalCards(cards) {
64
+ if (cards.length === 0)
65
+ return '';
66
+ return '<div class="sch-pl-goals">' + cards.map((card) => '<div class="sch-pl-goal">'
67
+ + '<div class="sch-pl-goal-label">' + esc(card.label) + '</div>'
68
+ + '<div class="sch-pl-goal-value">' + esc(card.value) + '</div>'
69
+ + '<div class="sch-pl-goal-hint">' + esc(card.hint) + '</div>'
70
+ + '</div>').join('') + '</div>';
71
+ }
72
+ /** 本处族级件的样式唯一产出者(只对用上它的页面有作用)。
73
+ * 颜色只取公共层冻结 token;长度只取上面那组常量——本串里不出现 `px` 字面量。 */
74
+ export function planPartsCss() {
75
+ return [
76
+ '/* #787 日程与计划域·族级件(断点只用仓内既有值 820) */',
77
+ '.sch-pl-h2 { margin: 0 0 ' + px(PANEL_GAP) + '; font-size: ' + px(FS_TITLE) + '; font-weight: 600; color: var(--fg); }',
78
+ '.sch-pl-diff { padding: ' + px(PANEL_PAD_Y) + ' ' + px(PANEL_PAD_X) + '; border: ' + px(HAIRLINE) + ' solid var(--line);',
79
+ ' border-left: ' + px(RAIL_W) + ' solid var(--blue); border-radius: ' + px(PANEL_RADIUS) + '; background: var(--soft); }',
80
+ '.sch-pl-note { margin: 0; color: var(--fg2); font-size: ' + px(FS_BODY) + '; line-height: 1.7; }',
81
+ '/* #788 复盘与飞书域·族级件:目标达成卡(断点只用仓内既有值 820) */',
82
+ '.sch-pl-goals { display: grid; grid-template-columns: repeat(' + String(GOAL_COLS) + ', minmax(0, 1fr));',
83
+ ' gap: ' + px(PANEL_GAP) + '; margin: ' + px(PANEL_GAP) + ' 0 ' + px(PANEL_GAP) + '; }',
84
+ '.sch-pl-goal { padding: ' + px(PANEL_PAD_Y) + ' ' + px(PANEL_PAD_X) + '; border: ' + px(HAIRLINE) + ' solid var(--line);',
85
+ ' border-radius: ' + px(PANEL_RADIUS) + '; background: var(--soft); }',
86
+ '.sch-pl-goal-label { color: var(--fg2); font-size: ' + px(GOAL_FS_LABEL) + '; }',
87
+ '.sch-pl-goal-value { margin-top: ' + px(PANEL_GAP) + '; font-size: ' + px(GOAL_FS_VALUE) + '; font-weight: 600;',
88
+ ' color: var(--fg); font-variant-numeric: tabular-nums; }',
89
+ '.sch-pl-goal-hint { margin-top: ' + px(PANEL_GAP) + '; color: var(--fg2); font-size: ' + px(GOAL_FS_HINT) + '; line-height: 1.7; }',
90
+ '@media (max-width: ' + px(NARROW) + ') {',
91
+ ' .sch-pl-diff { padding: ' + px(PANEL_PAD_Y) + ' ' + px(PANEL_GAP) + '; }',
92
+ ' .sch-pl-goals { grid-template-columns: minmax(0, 1fr); }',
93
+ '}',
94
+ ].join(LF);
95
+ }
96
+ //# sourceMappingURL=planParts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planParts.js","sourceRoot":"","sources":["../../src/plan/planParts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type PlanOpCtx, type PlanOpResult } from './context.js';
2
+ /** 三档(老侧 `tier` 的三值)。 */
3
+ export type FeishuTier = 'full' | 'partial' | 'missing';
4
+ export interface TierReport {
5
+ readonly tier: FeishuTier;
6
+ /** lark-cli 的可执行路径(没找到=null)。 */
7
+ readonly cliPath: string | null;
8
+ readonly version: string | null;
9
+ /** 探测源真值(`auth status` 里的 openId 原串;回执不带它,页上不读它——显示读 `authenticated`)。 */
10
+ readonly openId: string | null;
11
+ /** 授权那道门过没过(`openId !== null` 的布尔投影;页上「授权登录过」与进度条只读它)。 */
12
+ readonly authenticated: boolean;
13
+ /** 日历那一道门的结果(没过或没探到=false)。 */
14
+ readonly calendar: boolean;
15
+ /** 为什么停在这一档(说人话,进回执与页)。 */
16
+ readonly why: string;
17
+ }
18
+ /** 三门逐道探一遍(**纯读**:`--version`/`auth status`/`calendar +agenda` 都不写字)。 */
19
+ export declare function probeTiers(): TierReport;
20
+ /** 探测这一趟的回执:档位 + 本地这一天的账(不碰远端写入,也不拉远端读数)。 */
21
+ export declare function runProbe(ctx: PlanOpCtx, report: TierReport): PlanOpResult;
22
+ /** 三档在回执那一句话里的说法(一处定义)。 */
23
+ export declare const TIER_CN: Record<FeishuTier, string>;
24
+ /** 三档在页上读数卡里的短说法(一处定义)。 */
25
+ export declare const TIER_VALUE: Record<FeishuTier, string>;
26
+ /** 三档各自下一步怎么走(页上那一段;只此一处)。 */
27
+ export declare const TIER_NEXT: Record<FeishuTier, readonly string[]>;
28
+ //# sourceMappingURL=probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../src/plan/probe.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAiB,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAGhF,yBAAyB;AACzB,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,2BAA2B;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,yEAAyE;AACzE,wBAAgB,UAAU,IAAI,UAAU,CA6BvC;AAED,6CAA6C;AAC7C,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,YAAY,CA2BzE;AAED,2BAA2B;AAC3B,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAI9C,CAAC;AAEF,2BAA2B;AAC3B,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIjD,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAc3D,CAAC"}
@@ -0,0 +1,114 @@
1
+ /** #788 · 飞书能力探测(`op=sync` + `dryRun`,唤醒词「飞书探测」):**只读**,三档。
2
+ *
3
+ * 老侧那三档(`feishu_sync.py` 的 `FeishuStatus.tier`)逐条照搬:
4
+ * ① lark-cli 装没装(家目录那几个绝对候选 + `where`/`which` 那一档,`fetch` 层已有的候选表);
5
+ * ② 授权过没过(`auth status` 里的 openId);
6
+ * ③ 日历可不可达(`calendar +agenda` 拉得动)。
7
+ * 三档=`full`(三门全过)/`partial`(装了但授权或日历那一门没过)/`missing`(没装)。
8
+ *
9
+ * **为什么要有这一支**:路由表里「飞书探测」的预设是 `{op:'sync', dryRun:true}`——那一枚预设
10
+ * 就是「先看,不写」的意思;而 `runSync` 此前**根本不看 `dryRun`**,于是「飞书探测」会真跑一趟
11
+ * 同步(真往用户的飞书日历里写)。本票把这一支补上(#787 的证据件把「先问再写」那一问划给了本票):
12
+ * 探测**只读**,一门写都不发;要看差异就先跑它,要真同步再说「日程管家同步」。
13
+ *
14
+ * **探测结论不是失败**:没装 lark-cli 也 exit 0(回执 remote 记 `none`——本命令不碰远端),
15
+ * 档位与「下一步怎么办」照实写在回执与页上(老侧原话:缺失依赖不报错,调用方按探测结果决定后续流程)。
16
+ *
17
+ * #896 · 授权那道门只传布尔位,不传 openId 原值:`TierReport.openId` 是探测源真值(`probeTiers()`
18
+ * 里刚拿到的那一个),但回执(`runProbe()` 的 `extra` → `data` 顶层)里只放 `authReady: boolean`,
19
+ * 不放 openId 原串——页上「授权登录过」与进度条都只读这个布尔位。`handlers.ts` 重建出来的副本
20
+ * 因此把 `openId` 置 null(仅占形状,页上不读它),显示以 `authenticated` 为准。
21
+ */
22
+ import { authOpenId, checkCalendar, findLarkCli, larkVersion } from '../fetch/index.js';
23
+ import { receiptResult } from './context.js';
24
+ import { buildReceipt } from './receipt.js';
25
+ /** 三门逐道探一遍(**纯读**:`--version`/`auth status`/`calendar +agenda` 都不写字)。 */
26
+ export function probeTiers() {
27
+ const cli = findLarkCli();
28
+ if (cli === null) {
29
+ return {
30
+ tier: 'missing', cliPath: null, version: null, openId: null, authenticated: false, calendar: false,
31
+ why: '本机没找到飞书命令行,同步与探测都跑不了。装它需要你自己动手(本技能不代装)',
32
+ };
33
+ }
34
+ const version = larkVersion(cli);
35
+ let openId = null;
36
+ try {
37
+ openId = authOpenId(cli);
38
+ }
39
+ catch {
40
+ return {
41
+ tier: 'partial', cliPath: cli, version, openId: null, authenticated: false, calendar: false,
42
+ why: '飞书命令行装了但没登录,先在终端里跑一次授权登录',
43
+ };
44
+ }
45
+ const calendar = checkCalendar(cli);
46
+ if (!calendar) {
47
+ return {
48
+ tier: 'partial', cliPath: cli, version, openId, authenticated: true, calendar: false,
49
+ why: '飞书命令行装了也登录了,但日历拉不动(多半是缺日历授权),补一次授权再探',
50
+ };
51
+ }
52
+ return {
53
+ tier: 'full', cliPath: cli, version, openId, authenticated: true, calendar: true,
54
+ why: '飞书命令行在场,授权与日历两道门都过了,可以同步',
55
+ };
56
+ }
57
+ /** 探测这一趟的回执:档位 + 本地这一天的账(不碰远端写入,也不拉远端读数)。 */
58
+ export function runProbe(ctx, report) {
59
+ const date = ctx.params.date === undefined || ctx.params.date === null || ctx.params.date === ''
60
+ ? null : String(ctx.params.date);
61
+ const message = '飞书探测:' + TIER_CN[report.tier] + '。' + report.why + '。这一趟只探,没有写任何对象';
62
+ return receiptResult(buildReceipt({
63
+ op: 'sync',
64
+ message,
65
+ local: 'checked',
66
+ // 探测不碰远端写入:`none` = 本命令与远端无关(达成判据据此给 0,不把「没装」当失败)。
67
+ remote: 'none',
68
+ remoteId: null,
69
+ errors: [],
70
+ notes: [report.why],
71
+ ...(date === null ? {} : { date }),
72
+ counts: { cliInstalled: report.cliPath === null ? 0 : 1, authenticated: report.authenticated ? 1 : 0, calendar: report.calendar ? 1 : 0 },
73
+ extra: {
74
+ probe: true,
75
+ tier: report.tier,
76
+ tierText: TIER_CN[report.tier],
77
+ tierWhy: report.why,
78
+ cliPath: report.cliPath,
79
+ cliVersion: report.version,
80
+ // #896 · 只给布尔位,不给 openId 原串(隐私):页上「授权登录过」与进度条读它。
81
+ authReady: report.authenticated,
82
+ calendarReady: report.calendar,
83
+ },
84
+ }));
85
+ }
86
+ /** 三档在回执那一句话里的说法(一处定义)。 */
87
+ export const TIER_CN = {
88
+ full: '三档里的全通',
89
+ partial: '三档里的不完全',
90
+ missing: '三档里的没装',
91
+ };
92
+ /** 三档在页上读数卡里的短说法(一处定义)。 */
93
+ export const TIER_VALUE = {
94
+ full: '全通',
95
+ partial: '不完全',
96
+ missing: '没装',
97
+ };
98
+ /** 三档各自下一步怎么走(页上那一段;只此一处)。 */
99
+ export const TIER_NEXT = {
100
+ full: [
101
+ '要看这一天本地与飞书的差异,下一步就说「日程管家同步」,它会回填标识,补齐远端并清掉孤儿。',
102
+ '要动的是别的一天,把日期一并说清楚(比如「同步 2026-09-22 的日程」)。',
103
+ ],
104
+ partial: [
105
+ '先在终端里把飞书命令行的授权补上,再回来说一次「飞书探测」。',
106
+ '授权没过之前,「日程管家同步」会停在阻断那一档,本地照写,远端一行不动。',
107
+ ],
108
+ missing: [
109
+ '飞书命令行没装:装与不装由你定,本技能不代装也不代登。',
110
+ '不装也能用:本地那些事照跑(记作息,排计划,复盘),只是日程不会出现在飞书日历上。',
111
+ '要装的话,用你惯用的包管理器装一个全局命令行即可,装完回来说「飞书探测」。',
112
+ ],
113
+ };
114
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/plan/probe.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type ScheduleCopyAreaInput } from '../render/copyArea.js';
1
2
  export declare const LOCAL_STATES: readonly ["created", "found", "updated", "deleted", "upserted", "unchanged", "preview", "reviewed", "checked"];
2
3
  export type LocalState = (typeof LOCAL_STATES)[number];
3
4
  /** 远端侧状态:`found_feishu`/`created_feishu`/`unavailable` 三值沿用老家口径(S-04),后两值是合成写新增的档。 */
@@ -49,4 +50,15 @@ export declare function achievedOf(remote: RemoteState, errors: string[]): boole
49
50
  export declare function buildReceipt(input: ReceiptInput): PlanReceipt;
50
51
  /** 远端侧一句话(人读):写在 message 里,机读看 `remote` 字段。 */
51
52
  export declare const REMOTE_LABEL: Record<RemoteState, string>;
53
+ /** 本域一张页的复制区载荷(#887):`schedule.plan.write` 下的所有页共用**回执**这一种形状
54
+ * (`ok` + `message`),数据位就是这一趟那句话;日志位=这一趟的 2–6 段。
55
+ * `ok` 缺省 `true`:本域这些页都是「本地这一半已经做完」才出的(远端没成由 `message` 里那句讲清)。
56
+ * 一处定义,五个页装配件共用(回执/商量/复盘/飞书/续跑分节)——别处不各写一份复制区口径。 */
57
+ export declare function planCopyArea(args: {
58
+ readonly message: string;
59
+ readonly command: string;
60
+ readonly source: string;
61
+ readonly ok?: boolean;
62
+ readonly m5Line?: string;
63
+ }): ScheduleCopyAreaInput;
52
64
  //# sourceMappingURL=receipt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../src/plan/receipt.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,gHAAiH,CAAC;AAC3I,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,sFAAsF;AACtF,eAAO,MAAM,aAAa,mHAEhB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe;IACf,KAAK,EAAE,UAAU,CAAC;IAClB,yEAAyE;IACzE,MAAM,EAAE,WAAW,CAAC;IACpB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yBAAyB;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;8DAC8D;AAC9D,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAGzE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAqB7D;AAED,+CAA+C;AAC/C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAQpD,CAAC"}
1
+ {"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../src/plan/receipt.ts"],"names":[],"mappings":"AAMA,OAAO,EAAqC,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEtG,eAAO,MAAM,YAAY,gHAAiH,CAAC;AAC3I,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,sFAAsF;AACtF,eAAO,MAAM,aAAa,mHAEhB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe;IACf,KAAK,EAAE,UAAU,CAAC;IAClB,yEAAyE;IACzE,MAAM,EAAE,WAAW,CAAC;IACpB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yBAAyB;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;8DAC8D;AAC9D,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAGzE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAqB7D;AAED,+CAA+C;AAC/C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAQpD,CAAC;AAEF;;;qDAGqD;AACrD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,qBAAqB,CAWxB"}
@@ -4,6 +4,7 @@
4
4
  // 老家回执在「命中本地且已有远端标识」那一支根本没有 `feishu` 键(`schedule_db.py:1062` 对 `:1066`/`:1083`),
5
5
  // 消费方按字段取会 KeyError。本实现**三格永在**,且「这一趟算不算达成」是显式字段(`achieved`),
6
6
  // 由出口映射成退出码(没达成 → 非 0,照裁定 A6②/用户故事 6;降级照老 A6①:远端不可用不拦住本地写)。
7
+ import { scheduleCopyLog, scheduleNowStamp } from '../render/copyArea.js';
7
8
  export const LOCAL_STATES = ['created', 'found', 'updated', 'deleted', 'upserted', 'unchanged', 'preview', 'reviewed', 'checked'];
8
9
  /** 远端侧状态:`found_feishu`/`created_feishu`/`unavailable` 三值沿用老家口径(S-04),后两值是合成写新增的档。 */
9
10
  export const REMOTE_STATES = [
@@ -54,4 +55,20 @@ export const REMOTE_LABEL = {
54
55
  skipped: '远端按参数跳过(只做本地)',
55
56
  none: '本命令不碰远端',
56
57
  };
58
+ /** 本域一张页的复制区载荷(#887):`schedule.plan.write` 下的所有页共用**回执**这一种形状
59
+ * (`ok` + `message`),数据位就是这一趟那句话;日志位=这一趟的 2–6 段。
60
+ * `ok` 缺省 `true`:本域这些页都是「本地这一半已经做完」才出的(远端没成由 `message` 里那句讲清)。
61
+ * 一处定义,五个页装配件共用(回执/商量/复盘/飞书/续跑分节)——别处不各写一份复制区口径。 */
62
+ export function planCopyArea(args) {
63
+ return {
64
+ key: 'schedule.plan.write',
65
+ payload: { ok: args.ok ?? true, message: args.message },
66
+ log: scheduleCopyLog({
67
+ command: args.command,
68
+ source: args.source,
69
+ actionAt: scheduleNowStamp(),
70
+ ...(args.m5Line === undefined ? {} : { m5Line: args.m5Line }),
71
+ }),
72
+ };
73
+ }
57
74
  //# sourceMappingURL=receipt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/plan/receipt.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,wDAAwD;AACxD,iFAAiF;AACjF,8DAA8D;AAC9D,4DAA4D;AAC5D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAU,CAAC;AAG3I,sFAAsF;AACtF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM;CAC9F,CAAC;AA6CX;8DAC8D;AAC9D,MAAM,UAAU,UAAU,CAAC,MAAmB,EAAE,MAAgB;IAC9D,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChC,OAAO,MAAM,KAAK,aAAa,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,GAAG,GAAgB;QACvB,EAAE,EAAE,QAAQ;QACZ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;QAChC,QAAQ;QACR,MAAM;QACN,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;KACzB,CAAC;IACF,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;QAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACpD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACvD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1D,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACvD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAgC;IACvD,YAAY,EAAE,iBAAiB;IAC/B,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE,iBAAiB;IAC9B,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,SAAS;CAChB,CAAC"}
1
+ {"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/plan/receipt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { PlanEvent, ScheduleDb } from '../fetch/db.js';
2
+ import { type RemoteState } from './receipt.js';
3
+ export interface EnsureReceipt {
4
+ readonly id: number;
5
+ readonly date: string;
6
+ /** 本地这一趟是新建还是命中已有的那一条(幂等)。 */
7
+ readonly created: boolean;
8
+ readonly remote: RemoteState;
9
+ }
10
+ /** 「补计划回执」整页:新事件回执 +(命中时)幂等命中注记位 + 这一天现在的排布。 */
11
+ export declare function ensureReceiptPage(handle: ScheduleDb, r: EnsureReceipt): string;
12
+ /** 批量补计划(`dates[]`)逐天一份结果:本地新建还是命中、远端侧成没成。 */
13
+ export interface EnsureBatchDay {
14
+ readonly date: string;
15
+ readonly id: number;
16
+ readonly created: boolean;
17
+ readonly remote: RemoteState;
18
+ readonly achieved: boolean;
19
+ }
20
+ /** 「批量补计划回执」整页:逐天结果表 + 汇总(复用单天那张页的口径,不另算一遍)。 */
21
+ export declare function ensureBatchReceiptPage(handle: ScheduleDb, days: readonly EnsureBatchDay[]): string;
22
+ /** 「改计划回执」整页:字段前后对照 + 飞书询问位 + 这条现在长什么样。 */
23
+ export declare function updateReceiptPage(handle: ScheduleDb, before: PlanEvent, after: PlanEvent, patchKeys: readonly string[], remote: RemoteState): string;
24
+ /** 「删计划回执」整页:软删的对照 + 飞书询问位 + 这一次删掉的是哪一条。 */
25
+ export declare function deactivateReceiptPage(handle: ScheduleDb, before: PlanEvent, remote: RemoteState): string;
26
+ //# sourceMappingURL=receiptDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receiptDocs.d.ts","sourceRoot":"","sources":["../../src/plan/receiptDocs.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAO5D,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAuC5E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAqF9E;AAED,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,gDAAgD;AAChD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CA2DlG;AAUD,2CAA2C;AAC3C,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,GACzG,MAAM,CA4DR;AAID,4CAA4C;AAC5C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAwDxG"}