skill-schedule 0.3.3 → 0.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/SKILL.md +12 -3
  2. package/dist/.gen-inputs.json +4 -4
  3. package/dist/admin/adminDocs.d.ts +57 -0
  4. package/dist/admin/adminDocs.d.ts.map +1 -0
  5. package/dist/admin/adminDocs.js +190 -0
  6. package/dist/admin/adminDocs.js.map +1 -0
  7. package/dist/admin/adminParts.d.ts +37 -0
  8. package/dist/admin/adminParts.d.ts.map +1 -0
  9. package/dist/admin/adminParts.js +83 -0
  10. package/dist/admin/adminParts.js.map +1 -0
  11. package/dist/admin/handlers.d.ts.map +1 -1
  12. package/dist/admin/handlers.js +196 -6
  13. package/dist/admin/handlers.js.map +1 -1
  14. package/dist/admin/routes.d.ts +10 -1
  15. package/dist/admin/routes.d.ts.map +1 -1
  16. package/dist/admin/routes.js +2 -0
  17. package/dist/admin/routes.js.map +1 -1
  18. package/dist/analyze/analyzeDocs.d.ts +51 -0
  19. package/dist/analyze/analyzeDocs.d.ts.map +1 -0
  20. package/dist/analyze/analyzeDocs.js +442 -0
  21. package/dist/analyze/analyzeDocs.js.map +1 -0
  22. package/dist/analyze/analyzeParts.d.ts +53 -0
  23. package/dist/analyze/analyzeParts.d.ts.map +1 -0
  24. package/dist/analyze/analyzeParts.js +229 -0
  25. package/dist/analyze/analyzeParts.js.map +1 -0
  26. package/dist/analyze/handlers.d.ts.map +1 -1
  27. package/dist/analyze/handlers.js +41 -4
  28. package/dist/analyze/handlers.js.map +1 -1
  29. package/dist/cli/cmd_read.js +8 -2
  30. package/dist/cli/cmd_read.js.map +1 -1
  31. package/dist/fetch/feishu.d.ts +6 -0
  32. package/dist/fetch/feishu.d.ts.map +1 -1
  33. package/dist/fetch/feishu.js +18 -7
  34. package/dist/fetch/feishu.js.map +1 -1
  35. package/dist/fetch/index.d.ts +1 -1
  36. package/dist/fetch/index.d.ts.map +1 -1
  37. package/dist/fetch/index.js +1 -1
  38. package/dist/fetch/index.js.map +1 -1
  39. package/dist/health.d.ts.map +1 -1
  40. package/dist/health.js +8 -5
  41. package/dist/health.js.map +1 -1
  42. package/dist/help/index.d.ts +1 -0
  43. package/dist/help/index.d.ts.map +1 -1
  44. package/dist/help/index.js +3 -0
  45. package/dist/help/index.js.map +1 -1
  46. package/dist/plan/discussDocs.d.ts +8 -0
  47. package/dist/plan/discussDocs.d.ts.map +1 -0
  48. package/dist/plan/discussDocs.js +321 -0
  49. package/dist/plan/discussDocs.js.map +1 -0
  50. package/dist/plan/feishuDocs.d.ts +19 -0
  51. package/dist/plan/feishuDocs.d.ts.map +1 -0
  52. package/dist/plan/feishuDocs.js +257 -0
  53. package/dist/plan/feishuDocs.js.map +1 -0
  54. package/dist/plan/handlers.d.ts.map +1 -1
  55. package/dist/plan/handlers.js +107 -3
  56. package/dist/plan/handlers.js.map +1 -1
  57. package/dist/plan/index.d.ts +2 -0
  58. package/dist/plan/index.d.ts.map +1 -1
  59. package/dist/plan/index.js +16 -9
  60. package/dist/plan/index.js.map +1 -1
  61. package/dist/plan/iso.d.ts +2 -0
  62. package/dist/plan/iso.d.ts.map +1 -1
  63. package/dist/plan/iso.js +6 -2
  64. package/dist/plan/iso.js.map +1 -1
  65. package/dist/plan/planDocs.d.ts +47 -0
  66. package/dist/plan/planDocs.d.ts.map +1 -0
  67. package/dist/plan/planDocs.js +159 -0
  68. package/dist/plan/planDocs.js.map +1 -0
  69. package/dist/plan/planParts.d.ts +38 -0
  70. package/dist/plan/planParts.d.ts.map +1 -0
  71. package/dist/plan/planParts.js +96 -0
  72. package/dist/plan/planParts.js.map +1 -0
  73. package/dist/plan/probe.d.ts +28 -0
  74. package/dist/plan/probe.d.ts.map +1 -0
  75. package/dist/plan/probe.js +114 -0
  76. package/dist/plan/probe.js.map +1 -0
  77. package/dist/plan/receipt.d.ts +12 -0
  78. package/dist/plan/receipt.d.ts.map +1 -1
  79. package/dist/plan/receipt.js +17 -0
  80. package/dist/plan/receipt.js.map +1 -1
  81. package/dist/plan/receiptDocs.d.ts +26 -0
  82. package/dist/plan/receiptDocs.d.ts.map +1 -0
  83. package/dist/plan/receiptDocs.js +341 -0
  84. package/dist/plan/receiptDocs.js.map +1 -0
  85. package/dist/plan/replayDocs.d.ts +165 -0
  86. package/dist/plan/replayDocs.d.ts.map +1 -0
  87. package/dist/plan/replayDocs.js +226 -0
  88. package/dist/plan/replayDocs.js.map +1 -0
  89. package/dist/plan/replaySections.d.ts +5 -0
  90. package/dist/plan/replaySections.d.ts.map +1 -0
  91. package/dist/plan/replaySections.js +471 -0
  92. package/dist/plan/replaySections.js.map +1 -0
  93. package/dist/plan/reviewDocs.d.ts +4 -0
  94. package/dist/plan/reviewDocs.d.ts.map +1 -0
  95. package/dist/plan/reviewDocs.js +130 -0
  96. package/dist/plan/reviewDocs.js.map +1 -0
  97. package/dist/plan/sync.d.ts.map +1 -1
  98. package/dist/plan/sync.js +5 -0
  99. package/dist/plan/sync.js.map +1 -1
  100. package/dist/policy/index.d.ts +1 -1
  101. package/dist/policy/index.d.ts.map +1 -1
  102. package/dist/policy/index.js +1 -1
  103. package/dist/policy/index.js.map +1 -1
  104. package/dist/policy/plan.d.ts +8 -0
  105. package/dist/policy/plan.d.ts.map +1 -1
  106. package/dist/policy/plan.js +20 -0
  107. package/dist/policy/plan.js.map +1 -1
  108. package/dist/query/handlers.d.ts +3 -0
  109. package/dist/query/handlers.d.ts.map +1 -1
  110. package/dist/query/handlers.js +86 -12
  111. package/dist/query/handlers.js.map +1 -1
  112. package/dist/query/queryDocs.d.ts +64 -0
  113. package/dist/query/queryDocs.d.ts.map +1 -0
  114. package/dist/query/queryDocs.js +554 -0
  115. package/dist/query/queryDocs.js.map +1 -0
  116. package/dist/query/routes.d.ts +11 -1
  117. package/dist/query/routes.d.ts.map +1 -1
  118. package/dist/query/routes.js +5 -1
  119. package/dist/query/routes.js.map +1 -1
  120. package/dist/render/copyArea.d.ts +61 -0
  121. package/dist/render/copyArea.d.ts.map +1 -0
  122. package/dist/render/copyArea.js +80 -0
  123. package/dist/render/copyArea.js.map +1 -0
  124. package/dist/render/html.d.ts.map +1 -1
  125. package/dist/render/html.js +3 -1
  126. package/dist/render/html.js.map +1 -1
  127. package/dist/render/index.d.ts +3 -0
  128. package/dist/render/index.d.ts.map +1 -1
  129. package/dist/render/index.js +2 -0
  130. package/dist/render/index.js.map +1 -1
  131. package/dist/shared/dayPage.d.ts +67 -0
  132. package/dist/shared/dayPage.d.ts.map +1 -0
  133. package/dist/shared/dayPage.js +92 -0
  134. package/dist/shared/dayPage.js.map +1 -0
  135. package/dist/shared/detailPage.d.ts +55 -0
  136. package/dist/shared/detailPage.d.ts.map +1 -0
  137. package/dist/shared/detailPage.js +65 -0
  138. package/dist/shared/detailPage.js.map +1 -0
  139. package/dist/shared/docPage.d.ts +22 -0
  140. package/dist/shared/docPage.d.ts.map +1 -0
  141. package/dist/shared/docPage.js +52 -0
  142. package/dist/shared/docPage.js.map +1 -0
  143. package/dist/shared/overviewPage.d.ts +52 -0
  144. package/dist/shared/overviewPage.d.ts.map +1 -0
  145. package/dist/shared/overviewPage.js +65 -0
  146. package/dist/shared/overviewPage.js.map +1 -0
  147. package/dist/shared/pageNav.d.ts +24 -0
  148. package/dist/shared/pageNav.d.ts.map +1 -0
  149. package/dist/shared/pageNav.js +70 -0
  150. package/dist/shared/pageNav.js.map +1 -0
  151. package/dist/shared/pageParts.d.ts +45 -0
  152. package/dist/shared/pageParts.d.ts.map +1 -0
  153. package/dist/shared/pageParts.js +154 -0
  154. package/dist/shared/pageParts.js.map +1 -0
  155. package/dist/shared/planPage.d.ts +49 -0
  156. package/dist/shared/planPage.d.ts.map +1 -0
  157. package/dist/shared/planPage.js +48 -0
  158. package/dist/shared/planPage.js.map +1 -0
  159. package/dist/shared/rangePage.d.ts +44 -0
  160. package/dist/shared/rangePage.d.ts.map +1 -0
  161. package/dist/shared/rangePage.js +50 -0
  162. package/dist/shared/rangePage.js.map +1 -0
  163. package/dist/shared/weekPage.d.ts +36 -0
  164. package/dist/shared/weekPage.d.ts.map +1 -0
  165. package/dist/shared/weekPage.js +42 -0
  166. package/dist/shared/weekPage.js.map +1 -0
  167. package/dist/triggers/routes.generated.d.ts +23 -1
  168. package/dist/triggers/routes.generated.d.ts.map +1 -1
  169. package/dist/triggers/routes.generated.js +4 -1
  170. package/dist/triggers/routes.generated.js.map +1 -1
  171. package/dist/write/handlers.d.ts.map +1 -1
  172. package/dist/write/handlers.js +101 -5
  173. package/dist/write/handlers.js.map +1 -1
  174. package/dist/write/writeDocs.d.ts +27 -0
  175. package/dist/write/writeDocs.d.ts.map +1 -0
  176. package/dist/write/writeDocs.js +423 -0
  177. package/dist/write/writeDocs.js.map +1 -0
  178. package/dist/write/writeParts.d.ts +54 -0
  179. package/dist/write/writeParts.d.ts.map +1 -0
  180. package/dist/write/writeParts.js +117 -0
  181. package/dist/write/writeParts.js.map +1 -0
  182. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planDocs.d.ts","sourceRoot":"","sources":["../../src/plan/planDocs.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAShD;;;6CAG6C;AAC7C,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,MACqB,CAAC;AAErE;;gDAEgD;AAChD,wBAAgB,MAAM,CACpB,MAAM,EAAE,SAAS;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,GAC5E;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAWpD;AAED,wDAAwD;AACxD,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,KAAG,MACsF,CAAC;AAKjI;;;;uCAIuC;AACvC,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB;IACnB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;CACrC;AAED,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;CACjC;AAMD,qDAAqD;AACrD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,SAAS,EAAE,CAIb;AAYD;;uEAEuE;AACvE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,kBAAuB,GAC5B,MAAM,CAoFR"}
@@ -0,0 +1,159 @@
1
+ /** #782 · 「日程与计划」域的**页数据**(口径层):事件行 → 「查日程」要的东西。
2
+ *
3
+ * 口径本件自己算的那一条:**空档**=这一天里没排事件的连续时段(从 00:00 起算、到 24:00 收尾;
4
+ * 相邻事件首尾相接或重叠都不断档)。老侧「查日程」页面的空档就是这个意思,但老侧没有独立函数,
5
+ * 故这一条口径落在这里、只此一处。f12「商量计划预览」的**空档提示**也用这一条(#787),
6
+ * 所以它住 `plan` 侧而不是 `query` 侧:两个能力都在用,抄一份到别处就走散了。
7
+ *
8
+ * 事件自身的口径(时间/标题/分类/完成/是否已同步飞书)直接调 `render/views.ts` 的
9
+ * `buildPlanToday`,本件不重算。
10
+ *
11
+ * #786 这一段补的三处(查日程这一族在图上归 #786;本件是它的页数据来源):
12
+ * · **文案过分隔符门**(#516 的真门):页头三件与事件行右槽里的 `·`/`|`、时段与空档的 `~`、
13
+ * 结论条里的 `、` 全部改成行文标点或分槽——照 #784/#785 两张页的同一条口径(范围写「至」)。
14
+ * · **两支查法**(`search`):按标题搜(老侧只出 JSON)与按时段查重(老侧只出 JSON)共用这一张页;
15
+ * 全天的读数(色带/空档/卡)仍是这一天的全貌,只有**列表**换成命中集合,页头与结论条明说这一趟是怎么查的。
16
+ * · **已软删**(`inactive`,可选):老侧这条也只出 JSON;软删事件上同一张页,行尾标「已软删」,结论条报条数。
17
+ * 不给时产出与 #782 那张样张页**逐字节相同**(除上面那三处文案修正——那三处是票面点名的债)。
18
+ */
19
+ import { LEVEL1_WHITELIST, completionLabelOf, fmtDurShort, l1Of, toMinutes } from '../policy/index.js';
20
+ import { buildPlanToday } from '../render/views.js';
21
+ import { scheduleCopyLog, scheduleNowStamp } from '../render/copyArea.js';
22
+ import { hourCellsOf } from '../shared/pageParts.js';
23
+ import { renderPlanPage } from '../shared/planPage.js';
24
+ /** 一级分类的权威顺序(配色与图例都照它),取自 `policy` 的白名单。 */
25
+ const L1_ORDER = [...LEVEL1_WHITELIST];
26
+ const DAY_END = 1440;
27
+ /** 钟点 → 分钟,且**这一天末尾那一格**按 24:00 算:末段写 `23:59` 与写 `24:00` 是同一件事
28
+ * (校验口径 `assertCoverage24h` 的原话:「末事件 time_end 必须为 24:00,当前 23:59 视同」),
29
+ * 而落盘的候选是**归一过**的(`normalizeTime` 把 `24:00` 改写成 `23:59`)。整日覆盖、空隙、
30
+ * 时长三处都按这一条算,否则「整天接满」会被读成「还差一分钟」。定义只此一处。 */
31
+ export const minutesOfDayEnd = (hhmm) => (hhmm === '24:00' || hhmm === '23:59' ? DAY_END : toMinutes(hhmm));
32
+ /** 空档:未排事件的连续时段(按时间先后扫一遍,游标只前进;相邻或重叠都不断档)。
33
+ * #787 起本件对外给这一条:f12「商量计划预览」的**空隙提示**与 f10「查日程」的空档是同一件事,
34
+ * 两个用法都在本能力目录里,故仍只此一处(收的只是「有起止的东西」,不要求是库行)。 */
35
+ export function gapsOf(events) {
36
+ const sorted = [...events].sort((a, b) => minutesOfDayEnd(a.time_start) - minutesOfDayEnd(b.time_start));
37
+ const out = [];
38
+ let cursor = 0;
39
+ for (const e of sorted) {
40
+ const start = minutesOfDayEnd(e.time_start);
41
+ if (start > cursor)
42
+ out.push({ start: cursor, end: start });
43
+ cursor = Math.max(cursor, minutesOfDayEnd(e.time_end));
44
+ }
45
+ if (cursor < DAY_END)
46
+ out.push({ start: cursor, end: DAY_END });
47
+ return out;
48
+ }
49
+ /** 分钟数 → `HH:MM` 钟点(`24:00` 收尾):页上空档与空隙两处共用的写法,只此一处。 */
50
+ export const clockOf = (minutes) => minutes >= DAY_END ? '24:00' : String(Math.floor(minutes / 60)).padStart(2, '0') + ':' + String(minutes % 60).padStart(2, '0');
51
+ /** 起止一律写「起 至 止」:`~` 是分隔符门(#516)点名的符号顶替,页上不许出现。 */
52
+ const spanOf = (start, end) => start + ' 至 ' + end;
53
+ /** 当天分钟数:`24:00` 是「到这一天末尾」(=1440)。**不走 `normalizeTime`**——它把 `24:00` 改写成
54
+ * `23:59`(那是飞书 ISO 的口径),用在这一段的窗口比较里会把 23:00 至 23:59 那一条漏在窗口外。 */
55
+ const minutesOf = (hhmm) => (hhmm === '24:00' ? DAY_END : toMinutes(hhmm));
56
+ /** 这一时段里有哪几件:与窗口**重叠**即算(起在前、止在后都算)。查重用,故不要求整段包住。 */
57
+ export function eventsInWindow(events, start, end) {
58
+ const lo = minutesOf(start);
59
+ const hi = minutesOf(end);
60
+ return events.filter((e) => toMinutes(e.time_start) < hi && toMinutes(e.time_end) > lo);
61
+ }
62
+ /** 事件行(事件卡的一行):`left`=起止、`main`=标题、`right`=完成与同步状态。
63
+ * 软删的那几行右槽写「已软删」——它是这一行的身份,不另立一段。 */
64
+ function eventRowOf(e, deleted) {
65
+ const completion = e.completion === null || e.completion === '' ? '未复盘' : completionLabelOf(e.completion);
66
+ const right = deleted
67
+ ? '已软删'
68
+ : completion + (e.feishu_event_id === null ? '' : ',已同步飞书');
69
+ return { left: spanOf(e.time_start, e.time_end), main: e.title, right };
70
+ }
71
+ /** 「查日程」整页(形状=A 覆盖条+事件卡;老侧 f10 的三个必现块都在)。
72
+ *
73
+ * `events` 是**这一天的活跃事件**(读数/色带/空档都按它算);`opts.search.list` 只换列表那一段。 */
74
+ export function renderPlanDayPage(events, date, opts = {}) {
75
+ const view = buildPlanToday(date, [...events]);
76
+ const gaps = gapsOf(events);
77
+ const busyMinutes = events.reduce((sum, e) => sum + (toMinutes(e.time_end) - toMinutes(e.time_start)), 0);
78
+ const freeMinutes = gaps.reduce((sum, g) => sum + (g.end - g.start), 0);
79
+ const done = view.items.filter((item) => (item.completion ?? '').startsWith('已完成')).length;
80
+ const synced = view.items.filter((item) => item.synced).length;
81
+ const inactive = opts.inactive ?? [];
82
+ const listed = opts.search === undefined ? events : opts.search.list;
83
+ const hits = listed.length;
84
+ const search = opts.search;
85
+ const focusLine = search === undefined
86
+ ? ''
87
+ : (search.title !== undefined
88
+ ? '按标题「' + search.title + '」搜到 ' + hits + ' 件。'
89
+ : (search.window !== undefined
90
+ ? spanOf(search.window.start, search.window.end) + ' 这一段里有 ' + hits + ' 件。'
91
+ : ''));
92
+ const data = {
93
+ head: {
94
+ // 文档标题走「技能名 空格 页名」(`·` 是分隔符门点名的并列符号之一,页头也是可见文本)。
95
+ docTitle: '作息管家 查日程',
96
+ eyebrow: '作息管家 查询与浏览',
97
+ title: '查日程',
98
+ subtitle: focusLine === ''
99
+ ? date + ' 这一天排了 ' + view.total + ' 件事件,空档 ' + gaps.length + ' 段共 ' + fmtDurShort(freeMinutes) + '。'
100
+ : focusLine + date + ' 这一天一共 ' + view.total + ' 件事件。',
101
+ },
102
+ cells: hourCellsOf(events.map((e) => ({
103
+ start: toMinutes(e.time_start),
104
+ end: toMinutes(e.time_end),
105
+ key: l1Of(e.category ?? ''),
106
+ }))),
107
+ order: L1_ORDER,
108
+ kpis: [
109
+ search === undefined
110
+ ? { label: '事件', value: String(view.total), unit: '件', detail: '这一天排的' }
111
+ : { label: '命中', value: String(hits), unit: '件', detail: '这一天一共 ' + view.total + ' 件' },
112
+ { label: '已排时段', value: fmtDurShort(busyMinutes), detail: '最早 ' + (events[0]?.time_start ?? '无') + ' 起' },
113
+ { label: '空档', value: String(gaps.length), unit: '段', detail: '合计 ' + fmtDurShort(freeMinutes) },
114
+ {
115
+ label: '已完成',
116
+ value: String(done),
117
+ unit: '件',
118
+ detail: '已同步飞书 ' + synced + ' 件' + (inactive.length === 0 ? '' : ',已软删 ' + inactive.length + ' 件'),
119
+ },
120
+ ],
121
+ conclusion: date + ' 排了 ' + view.total + ' 件,占了 ' + fmtDurShort(busyMinutes) + '。'
122
+ + '空档 ' + gaps.length + ' 段,共 ' + fmtDurShort(freeMinutes) + '。'
123
+ + (search !== undefined && search.window !== undefined && hits === 0 ? '这一时段没有安排。' : '')
124
+ + '已完成 ' + done + ' 件。'
125
+ + (inactive.length === 0 ? '' : '另有 ' + inactive.length + ' 件已软删。'),
126
+ events: {
127
+ items: [
128
+ ...listed.map((e) => eventRowOf(e, false)),
129
+ ...inactive.map((e) => eventRowOf(e, true)),
130
+ ],
131
+ // 空列表那句话随查法变(#786):按标题搜没命中与「这一天没有事件」不是一回事。
132
+ ...(search === undefined
133
+ ? {}
134
+ : { emptyText: search.title !== undefined ? '这一天没有标题命中的事件' : '这一时段没有安排' }),
135
+ },
136
+ gaps: gaps.map((gap) => ({
137
+ left: spanOf(clockOf(gap.start), clockOf(gap.end)),
138
+ main: '空档',
139
+ right: fmtDurShort(gap.end - gap.start),
140
+ })),
141
+ // 筛选位(老侧 f10 的第三块必现块):日期/分类/状态三格,说明句里不堆并列分隔符。
142
+ filters: [
143
+ { name: 'plan-date', label: '日期', value: date },
144
+ { name: 'plan-category', label: '分类', value: '全部', options: ['全部', ...L1_ORDER] },
145
+ { name: 'plan-state', label: '状态', value: '全部', options: ['全部', '已完成', '未完成', '已同步飞书'] },
146
+ ],
147
+ copy: {
148
+ key: 'schedule.plan.today',
149
+ payload: buildPlanToday(date, [...listed]),
150
+ log: scheduleCopyLog({
151
+ command: 'schedule-cmd-read schedule.plan.today --params {"date":"' + date + '"}',
152
+ source: '日程事件表(' + events.length + ' 行)',
153
+ actionAt: scheduleNowStamp(),
154
+ }),
155
+ },
156
+ };
157
+ return renderPlanPage(data);
158
+ }
159
+ //# sourceMappingURL=planDocs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planDocs.js","sourceRoot":"","sources":["../../src/plan/planDocs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
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 { type ChangeRowInput } from 'base-paint/blocks';
17
+ /** 蓝调前后对照面板(老侧必现块「字段前后对照」):一行标题 + 一段逐格对照。
18
+ * 只改了一处也要出(一行也是对照);`rows` 为空=空串(不留空壳)。 */
19
+ export declare function renderChangePanel(input: {
20
+ readonly title: string;
21
+ readonly rows: readonly ChangeRowInput[];
22
+ }): string;
23
+ /** #788 · 段名(页上一段的标题):走公共层区块自己的段名类 `heat-title`(与 `shared/overviewPage`
24
+ * 的逐日段名同一条口径),**不新造类名、不新添 CSS**。老侧那四档的每个区块都有自己的名字,
25
+ * 出页门与探针按名字认块,故段名必须由一处产出。 */
26
+ export declare function renderSectionTitle(text: string): string;
27
+ /** #788 · 目标达成卡(老侧 month 档的「目标达成」:`.goal-card` 那一件)。 */
28
+ export interface GoalCardInput {
29
+ readonly label: string;
30
+ readonly value: string;
31
+ readonly hint: string;
32
+ }
33
+ /** 目标达成:一格一张卡(标签 + 读数 + 一句怎么读)。`cards` 为空=空串(不留空壳)。 */
34
+ export declare function renderGoalCards(cards: readonly GoalCardInput[]): string;
35
+ /** 本处族级件的样式唯一产出者(只对用上它的页面有作用)。
36
+ * 颜色只取公共层冻结 token;长度只取上面那组常量——本串里不出现 `px` 字面量。 */
37
+ export declare function planPartsCss(): string;
38
+ //# sourceMappingURL=planParts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planParts.d.ts","sourceRoot":"","sources":["../../src/plan/planParts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgC1E;2CAC2C;AAC3C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;CAC1C,GAAG,MAAM,CAIT;AAED;;8BAE8B;AAC9B,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wDAAwD;AACxD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAQvE;AAED;mDACmD;AACnD,wBAAgB,YAAY,IAAI,MAAM,CAqBrC"}
@@ -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"}