skill-schedule 0.1.0
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/dist/cli/cmd_read.d.ts +3 -0
- package/dist/cli/cmd_read.d.ts.map +1 -0
- package/dist/cli/cmd_read.js +312 -0
- package/dist/cli/cmd_read.js.map +1 -0
- package/dist/fetch/db.d.ts +97 -0
- package/dist/fetch/db.d.ts.map +1 -0
- package/dist/fetch/db.js +382 -0
- package/dist/fetch/db.js.map +1 -0
- package/dist/fetch/errors.d.ts +13 -0
- package/dist/fetch/errors.d.ts.map +1 -0
- package/dist/fetch/errors.js +18 -0
- package/dist/fetch/errors.js.map +1 -0
- package/dist/fetch/feishu.d.ts +36 -0
- package/dist/fetch/feishu.d.ts.map +1 -0
- package/dist/fetch/feishu.js +141 -0
- package/dist/fetch/feishu.js.map +1 -0
- package/dist/fetch/index.d.ts +7 -0
- package/dist/fetch/index.d.ts.map +1 -0
- package/dist/fetch/index.js +5 -0
- package/dist/fetch/index.js.map +1 -0
- package/dist/fetch/paths.d.ts +6 -0
- package/dist/fetch/paths.d.ts.map +1 -0
- package/dist/fetch/paths.js +31 -0
- package/dist/fetch/paths.js.map +1 -0
- package/dist/help/index.d.ts +3 -0
- package/dist/help/index.d.ts.map +1 -0
- package/dist/help/index.js +2 -0
- package/dist/help/index.js.map +1 -0
- package/dist/help/lookup.d.ts +11 -0
- package/dist/help/lookup.d.ts.map +1 -0
- package/dist/help/lookup.js +39 -0
- package/dist/help/lookup.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/policy/category.d.ts +29 -0
- package/dist/policy/category.d.ts.map +1 -0
- package/dist/policy/category.js +168 -0
- package/dist/policy/category.js.map +1 -0
- package/dist/policy/index.d.ts +10 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +6 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/plan.d.ts +26 -0
- package/dist/policy/plan.d.ts.map +1 -0
- package/dist/policy/plan.js +124 -0
- package/dist/policy/plan.js.map +1 -0
- package/dist/policy/record.d.ts +36 -0
- package/dist/policy/record.d.ts.map +1 -0
- package/dist/policy/record.js +189 -0
- package/dist/policy/record.js.map +1 -0
- package/dist/policy/routing.d.ts +13 -0
- package/dist/policy/routing.d.ts.map +1 -0
- package/dist/policy/routing.js +72 -0
- package/dist/policy/routing.js.map +1 -0
- package/dist/policy/wakewords.d.ts +14 -0
- package/dist/policy/wakewords.d.ts.map +1 -0
- package/dist/policy/wakewords.js +85 -0
- package/dist/policy/wakewords.js.map +1 -0
- package/dist/render/envelope.d.ts +6 -0
- package/dist/render/envelope.d.ts.map +1 -0
- package/dist/render/envelope.js +48 -0
- package/dist/render/envelope.js.map +1 -0
- package/dist/render/errors.d.ts +5 -0
- package/dist/render/errors.d.ts.map +1 -0
- package/dist/render/errors.js +9 -0
- package/dist/render/errors.js.map +1 -0
- package/dist/render/html.d.ts +13 -0
- package/dist/render/html.d.ts.map +1 -0
- package/dist/render/html.js +68 -0
- package/dist/render/html.js.map +1 -0
- package/dist/render/index.d.ts +8 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +6 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/templates.d.ts +5 -0
- package/dist/render/templates.d.ts.map +1 -0
- package/dist/render/templates.js +42 -0
- package/dist/render/templates.js.map +1 -0
- package/dist/render/views.d.ts +78 -0
- package/dist/render/views.d.ts.map +1 -0
- package/dist/render/views.js +145 -0
- package/dist/render/views.js.map +1 -0
- package/package.json +32 -0
- package/templates/help.html +16 -0
- package/templates/plan_day.html +16 -0
- package/templates/plan_receipt.html +16 -0
- package/templates/record_compare.html +16 -0
- package/templates/record_day.html +16 -0
- package/templates/record_detail.html +16 -0
- package/templates/record_range.html +16 -0
- package/templates/record_receipt.html +16 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { ScheduleRenderError } from './errors.js';
|
|
2
|
+
export const SCHEDULE_HTML_MAX_BYTES = 256 * 1024;
|
|
3
|
+
export function escapeHtml(s) {
|
|
4
|
+
return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
5
|
+
}
|
|
6
|
+
function recordItemHtml(n) {
|
|
7
|
+
const time = escapeHtml(String(n.time ?? ''));
|
|
8
|
+
const act = escapeHtml(String(n.activity ?? ''));
|
|
9
|
+
const cat = escapeHtml(String(n.category ?? ''));
|
|
10
|
+
const emoji = escapeHtml(String(n.emoji ?? ''));
|
|
11
|
+
const dur = escapeHtml(String(n.duration ?? ''));
|
|
12
|
+
return '<div class="item"><div class="item-head"><span class="time">' + time + '</span><span class="badge">' + emoji + cat + '</span><span class="dur">' + dur + '</span></div><div class="content">' + act + '</div></div>';
|
|
13
|
+
}
|
|
14
|
+
function planItemHtml(n) {
|
|
15
|
+
const time = escapeHtml(String(n.time ?? ''));
|
|
16
|
+
const title = escapeHtml(String(n.title ?? ''));
|
|
17
|
+
const done = n.completion ? ' <span class="done">' + escapeHtml(String(n.completion)) + '</span>' : '';
|
|
18
|
+
const sync = n.synced ? ' <span class="sync">☁</span>' : '';
|
|
19
|
+
return '<div class="item"><div class="item-head"><span class="time">' + time + '</span></div><div class="content">' + title + done + sync + '</div></div>';
|
|
20
|
+
}
|
|
21
|
+
function listHtml(items, key) {
|
|
22
|
+
if (!items.length)
|
|
23
|
+
return '<div class="hm-empty">暂无记录</div>';
|
|
24
|
+
const fn = key.startsWith('schedule.plan.') ? planItemHtml : recordItemHtml;
|
|
25
|
+
return items.map((x) => fn(x)).join('');
|
|
26
|
+
}
|
|
27
|
+
// 按形状渲染 envelope 为 section 页;未知形状 throw 不返空页。
|
|
28
|
+
export function renderEnvelopeHtml(env) {
|
|
29
|
+
const head = '<section data-skill="schedule" data-shape="' + env.shape + '" data-key="' + escapeHtml(env.key) + '">';
|
|
30
|
+
const d = env.data;
|
|
31
|
+
switch (env.shape) {
|
|
32
|
+
case 'list': return head + listHtml(d.items, env.key) + '</section>';
|
|
33
|
+
case 'detail': return head + recordItemHtml(d.item) + '</section>';
|
|
34
|
+
case 'receipt': return head + '<div class="receipt">' + escapeHtml(String(d.message)) + '</div></section>';
|
|
35
|
+
case 'stat': {
|
|
36
|
+
const rows = Object.entries((d.metrics || {}));
|
|
37
|
+
return head + rows.map(([k, v]) => '<div class="stat"><b>' + v + '</b><span>' + escapeHtml(k) + '</span></div>').join('') + '</section>';
|
|
38
|
+
}
|
|
39
|
+
case 'analysis': return head + '<div class="analysis">' + escapeHtml(String(d.summary)).replace(/\n/g, '<br>') + '</div></section>';
|
|
40
|
+
case 'fallback': return head + '<div data-degraded="1">' + escapeHtml(String(d.reason)) + '</div></section>';
|
|
41
|
+
default: throw new ScheduleRenderError('SCHEDULE_SHAPE_MISMATCH', '无法渲染形状:' + String(env.shape));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function estimateBytes(html) { return Buffer.byteLength(html, 'utf8'); }
|
|
45
|
+
// 体积门:超限 throw(调用方走 fallback 形状显式降级,不静默截断)。
|
|
46
|
+
export function assertHtmlSize(html, max = SCHEDULE_HTML_MAX_BYTES) {
|
|
47
|
+
if (estimateBytes(html) > max) {
|
|
48
|
+
throw new ScheduleRenderError('SCHEDULE_HTML_TOO_LARGE', 'HTML 超体积:' + estimateBytes(html) + ' > ' + max);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// 共享标记填充(老家离线注入壳对应):CSS/HELPERS/CONTENT 三标记各恰出现 1 次,否则 throw。
|
|
52
|
+
export const SHARED_CSS_MARKER = '<!--SHARED-CSS-->';
|
|
53
|
+
export const SHARED_HELPERS_MARKER = '<!--SHARED-HELPERS-->';
|
|
54
|
+
export const CONTENT_MARKER = '<!--CONTENT-->';
|
|
55
|
+
export const SHARED_CSS = '.page{font-family:system-ui,sans-serif;max-width:720px;margin:0 auto;padding:12px}.item{border:1px solid #ddd;border-radius:8px;padding:8px;margin:8px 0}.item-head{display:flex;gap:8px;align-items:center}.badge{background:#eee;border-radius:4px;padding:0 6px}.receipt{background:#f0fff0;border:1px solid #090;border-radius:8px;padding:12px}.stat{display:flex;gap:8px}.analysis{white-space:pre-wrap}.hm-empty{color:#888}';
|
|
56
|
+
export const SHARED_HELPERS = '<script>function copyItem(id){var e=document.getElementById(id);if(e&&navigator.clipboard){navigator.clipboard.writeText(e.innerText);}}</script>';
|
|
57
|
+
export function fillTemplate(template, contentHtml) {
|
|
58
|
+
for (const m of [SHARED_CSS_MARKER, SHARED_HELPERS_MARKER, CONTENT_MARKER]) {
|
|
59
|
+
if (template.split(m).length - 1 !== 1) {
|
|
60
|
+
throw new ScheduleRenderError('SCHEDULE_MARKER_INVALID', '标记须恰出现 1 次:' + m);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return template
|
|
64
|
+
.split(SHARED_CSS_MARKER).join('<style>' + SHARED_CSS + '</style>')
|
|
65
|
+
.split(SHARED_HELPERS_MARKER).join(SHARED_HELPERS)
|
|
66
|
+
.split(CONTENT_MARKER).join(contentHtml);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/render/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ScheduleRenderError } from './errors.js';
|
|
2
|
+
export { SCHEDULE_KEY_SHAPES, scheduleShapeFor, buildScheduleEnvelope, parseScheduleEnvelope } from './envelope.js';
|
|
3
|
+
export { toRecordItem, buildRecordToday, buildRecordRange, buildRecordDetail, buildRecordReceipt, buildRecordCompare, buildCategoryDeep, buildAnomaly, toPlanItem, buildPlanToday, buildPlanReceipt, buildHelpItems, HELP_EMPTY_HINT, } from './views.js';
|
|
4
|
+
export type { RecordItem, PlanItem, HelpItem } from './views.js';
|
|
5
|
+
export { SCHEDULE_HTML_MAX_BYTES, escapeHtml, renderEnvelopeHtml, estimateBytes, assertHtmlSize, SHARED_CSS_MARKER, SHARED_HELPERS_MARKER, CONTENT_MARKER, SHARED_CSS, SHARED_HELPERS, fillTemplate, } from './html.js';
|
|
6
|
+
export { SCHEDULE_TEMPLATES, templateFor, loadTemplate } from './templates.js';
|
|
7
|
+
export type { ScheduleTemplate } from './templates.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EACvF,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAC/E,gBAAgB,EAAE,cAAc,EAAE,eAAe,GAClD,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EACL,uBAAuB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EACtF,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,GACnG,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/E,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ScheduleRenderError } from './errors.js';
|
|
2
|
+
export { SCHEDULE_KEY_SHAPES, scheduleShapeFor, buildScheduleEnvelope, parseScheduleEnvelope } from './envelope.js';
|
|
3
|
+
export { toRecordItem, buildRecordToday, buildRecordRange, buildRecordDetail, buildRecordReceipt, buildRecordCompare, buildCategoryDeep, buildAnomaly, toPlanItem, buildPlanToday, buildPlanReceipt, buildHelpItems, HELP_EMPTY_HINT, } from './views.js';
|
|
4
|
+
export { SCHEDULE_HTML_MAX_BYTES, escapeHtml, renderEnvelopeHtml, estimateBytes, assertHtmlSize, SHARED_CSS_MARKER, SHARED_HELPERS_MARKER, CONTENT_MARKER, SHARED_CSS, SHARED_HELPERS, fillTemplate, } from './html.js';
|
|
5
|
+
export { SCHEDULE_TEMPLATES, templateFor, loadTemplate } from './templates.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EACvF,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAC/E,gBAAgB,EAAE,cAAc,EAAE,eAAe,GAClD,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,uBAAuB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EACtF,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,GACnG,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const SCHEDULE_TEMPLATES: readonly ["record_day", "record_range", "record_detail", "record_receipt", "record_compare", "plan_day", "plan_receipt", "help"];
|
|
2
|
+
export type ScheduleTemplate = (typeof SCHEDULE_TEMPLATES)[number];
|
|
3
|
+
export declare function templateFor(key: string): ScheduleTemplate;
|
|
4
|
+
export declare function loadTemplate(name: string): string;
|
|
5
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/render/templates.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,kIASrB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAGnE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAYzD;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMjD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// 渲染层·模板装载:8 模板随包发布;未知/缺失大声失败。
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { ScheduleRenderError } from './errors.js';
|
|
6
|
+
export const SCHEDULE_TEMPLATES = [
|
|
7
|
+
'record_day',
|
|
8
|
+
'record_range',
|
|
9
|
+
'record_detail',
|
|
10
|
+
'record_receipt',
|
|
11
|
+
'record_compare',
|
|
12
|
+
'plan_day',
|
|
13
|
+
'plan_receipt',
|
|
14
|
+
'help',
|
|
15
|
+
];
|
|
16
|
+
// key → 模板(compare 家族共用 record_compare;write 家族用 receipt 模板)。
|
|
17
|
+
export function templateFor(key) {
|
|
18
|
+
switch (key) {
|
|
19
|
+
case 'schedule.record.today': return 'record_day';
|
|
20
|
+
case 'schedule.record.range': return 'record_range';
|
|
21
|
+
case 'schedule.record.detail': return 'record_detail';
|
|
22
|
+
case 'schedule.record.write': return 'record_receipt';
|
|
23
|
+
case 'schedule.record.compare': return 'record_compare';
|
|
24
|
+
case 'schedule.plan.today': return 'plan_day';
|
|
25
|
+
case 'schedule.plan.write': return 'plan_receipt';
|
|
26
|
+
case 'schedule.help.lookup': return 'help';
|
|
27
|
+
default: throw new ScheduleRenderError('SCHEDULE_UNKNOWN_KEY', '无模板映射:' + key);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const templatesDir = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'templates');
|
|
31
|
+
export function loadTemplate(name) {
|
|
32
|
+
if (!SCHEDULE_TEMPLATES.includes(name)) {
|
|
33
|
+
throw new ScheduleRenderError('SCHEDULE_TEMPLATE_MISSING', '未知模板:' + name);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
return readFileSync(join(templatesDir, name + '.html'), 'utf8');
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
throw new ScheduleRenderError('SCHEDULE_TEMPLATE_MISSING', '模板缺失:' + name);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/render/templates.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,YAAY;IACZ,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,UAAU;IACV,cAAc;IACd,MAAM;CACE,CAAC;AAGX,8DAA8D;AAC9D,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,uBAAuB,CAAC,CAAC,OAAO,YAAY,CAAC;QAClD,KAAK,uBAAuB,CAAC,CAAC,OAAO,cAAc,CAAC;QACpD,KAAK,wBAAwB,CAAC,CAAC,OAAO,eAAe,CAAC;QACtD,KAAK,uBAAuB,CAAC,CAAC,OAAO,gBAAgB,CAAC;QACtD,KAAK,yBAAyB,CAAC,CAAC,OAAO,gBAAgB,CAAC;QACxD,KAAK,qBAAqB,CAAC,CAAC,OAAO,UAAU,CAAC;QAC9C,KAAK,qBAAqB,CAAC,CAAC,OAAO,cAAc,CAAC;QAClD,KAAK,sBAAsB,CAAC,CAAC,OAAO,MAAM,CAAC;QAC3C,OAAO,CAAC,CAAC,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,EAAE,QAAQ,GAAG,GAAG,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAE5F,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAwB,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,mBAAmB,CAAC,2BAA2B,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC;QAAC,OAAO,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IACxE,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,mBAAmB,CAAC,2BAA2B,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;IAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { ScheduleRecord, PlanEvent } from '../fetch/db.js';
|
|
2
|
+
export interface RecordItem {
|
|
3
|
+
id: number;
|
|
4
|
+
date: string;
|
|
5
|
+
time: string;
|
|
6
|
+
activity: string;
|
|
7
|
+
category: string;
|
|
8
|
+
emoji: string;
|
|
9
|
+
duration: string;
|
|
10
|
+
minutes: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function toRecordItem(r: ScheduleRecord): RecordItem;
|
|
13
|
+
export declare function buildRecordToday(date: string, records: ScheduleRecord[]): {
|
|
14
|
+
items: RecordItem[];
|
|
15
|
+
total: number;
|
|
16
|
+
coverage: number;
|
|
17
|
+
score: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function buildRecordRange(start: string, end: string, records: ScheduleRecord[]): {
|
|
20
|
+
metrics: Record<string, number>;
|
|
21
|
+
};
|
|
22
|
+
export declare function buildRecordDetail(record: ScheduleRecord): {
|
|
23
|
+
item: Record<string, unknown>;
|
|
24
|
+
};
|
|
25
|
+
export declare function buildRecordReceipt(message: string): {
|
|
26
|
+
ok: boolean;
|
|
27
|
+
message: string;
|
|
28
|
+
};
|
|
29
|
+
export declare function buildRecordCompare(args: {
|
|
30
|
+
labelA: string;
|
|
31
|
+
labelB: string;
|
|
32
|
+
a: ScheduleRecord[];
|
|
33
|
+
b: ScheduleRecord[];
|
|
34
|
+
}): {
|
|
35
|
+
summary: string;
|
|
36
|
+
};
|
|
37
|
+
export declare function buildCategoryDeep(start: string, end: string, category: string, records: ScheduleRecord[]): {
|
|
38
|
+
summary: string;
|
|
39
|
+
};
|
|
40
|
+
export declare function buildAnomaly(end: string, windowDays: number, daily: {
|
|
41
|
+
date: string;
|
|
42
|
+
byL1: Record<string, number>;
|
|
43
|
+
}[]): {
|
|
44
|
+
summary: string;
|
|
45
|
+
};
|
|
46
|
+
export interface PlanItem {
|
|
47
|
+
id: number;
|
|
48
|
+
date: string;
|
|
49
|
+
time: string;
|
|
50
|
+
title: string;
|
|
51
|
+
category: string;
|
|
52
|
+
completion: string | null;
|
|
53
|
+
synced: boolean;
|
|
54
|
+
}
|
|
55
|
+
export declare function toPlanItem(p: PlanEvent): PlanItem;
|
|
56
|
+
export declare function buildPlanToday(date: string, events: PlanEvent[]): {
|
|
57
|
+
items: PlanItem[];
|
|
58
|
+
total: number;
|
|
59
|
+
date: string;
|
|
60
|
+
};
|
|
61
|
+
export declare function buildPlanReceipt(message: string): {
|
|
62
|
+
ok: boolean;
|
|
63
|
+
message: string;
|
|
64
|
+
};
|
|
65
|
+
export interface HelpItem {
|
|
66
|
+
phrase: string;
|
|
67
|
+
key: string;
|
|
68
|
+
shape: string;
|
|
69
|
+
cli: string;
|
|
70
|
+
desc: string;
|
|
71
|
+
}
|
|
72
|
+
export declare const HELP_EMPTY_HINT = "\u65E0\u547D\u4E2D\uFF1A\u5B9A\u65F6\u4EFB\u52A1/\u65E9\u7761\u63D0\u9192\u7B49\u51FA scope\uFF0C\u4EE5\u5916\u7F6E\u4E3A\u51C6\uFF08HELP q \u4E3A\u7A7A\u770B\u5168\u8868\uFF0C\u6216\u6362\u5524\u9192\u8BCD\u5982\u201C\u67E5\u4F5C\u606F/\u67E5\u65E5\u7A0B\u201D\uFF09";
|
|
73
|
+
export declare function buildHelpItems(all: HelpItem[], q?: string): {
|
|
74
|
+
items: HelpItem[];
|
|
75
|
+
total: number;
|
|
76
|
+
hint?: string;
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/render/views.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { l1Of, fmtDur, fmtPct, computeHealthScore, detectAnomalies, getEmojiPrefix, } from '../policy/category.js';
|
|
2
|
+
export function toRecordItem(r) {
|
|
3
|
+
return {
|
|
4
|
+
id: r.id,
|
|
5
|
+
date: r.date,
|
|
6
|
+
time: r.time_start + '~' + r.time_end,
|
|
7
|
+
activity: r.activity,
|
|
8
|
+
category: r.category,
|
|
9
|
+
emoji: getEmojiPrefix(r.category),
|
|
10
|
+
duration: fmtDur(r.duration_minutes || 0),
|
|
11
|
+
minutes: r.duration_minutes || 0,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
// 单日:items + total + 覆盖分钟/健康分(供模板主卡)。
|
|
15
|
+
export function buildRecordToday(date, records) {
|
|
16
|
+
const items = records.map(toRecordItem);
|
|
17
|
+
const byL1 = {};
|
|
18
|
+
let coverage = 0;
|
|
19
|
+
for (const r of records) {
|
|
20
|
+
const l1 = l1Of(r.category);
|
|
21
|
+
byL1[l1] = (byL1[l1] || 0) + (r.duration_minutes || 0);
|
|
22
|
+
coverage += r.duration_minutes || 0;
|
|
23
|
+
}
|
|
24
|
+
return { items, total: items.length, coverage, score: computeHealthScore(byL1).score };
|
|
25
|
+
}
|
|
26
|
+
// 区间:stat metrics(一级→分钟)+ 天数/总分钟(metrics 值须全 number,日期信息进 key 维度)。
|
|
27
|
+
export function buildRecordRange(start, end, records) {
|
|
28
|
+
const metrics = {};
|
|
29
|
+
const days = new Set();
|
|
30
|
+
let total = 0;
|
|
31
|
+
for (const r of records) {
|
|
32
|
+
const l1 = l1Of(r.category);
|
|
33
|
+
const m = r.duration_minutes || 0;
|
|
34
|
+
metrics['l1.' + l1] = (metrics['l1.' + l1] || 0) + m;
|
|
35
|
+
days.add(r.date);
|
|
36
|
+
total += m;
|
|
37
|
+
}
|
|
38
|
+
metrics['days'] = days.size;
|
|
39
|
+
metrics['total'] = total;
|
|
40
|
+
metrics['blocks'] = records.length;
|
|
41
|
+
return { metrics };
|
|
42
|
+
}
|
|
43
|
+
export function buildRecordDetail(record) {
|
|
44
|
+
return {
|
|
45
|
+
item: {
|
|
46
|
+
id: record.id, date: record.date, time: record.time_start + '~' + record.time_end,
|
|
47
|
+
duration: fmtDur(record.duration_minutes || 0), activity: record.activity,
|
|
48
|
+
category: record.category, emoji: getEmojiPrefix(record.category),
|
|
49
|
+
edit_count: record.edit_count, updated_at: record.updated_at,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export function buildRecordReceipt(message) {
|
|
54
|
+
return { ok: true, message };
|
|
55
|
+
}
|
|
56
|
+
// 对比:analysis summary(两聚合 + 差异 + 健康分差 + 异常句;数字全来自实算)。
|
|
57
|
+
export function buildRecordCompare(args) {
|
|
58
|
+
const agg = (rs) => {
|
|
59
|
+
const byL1 = {};
|
|
60
|
+
const days = new Set();
|
|
61
|
+
let total = 0;
|
|
62
|
+
for (const r of rs) {
|
|
63
|
+
const l1 = l1Of(r.category);
|
|
64
|
+
const m = r.duration_minutes || 0;
|
|
65
|
+
byL1[l1] = (byL1[l1] || 0) + m;
|
|
66
|
+
days.add(r.date);
|
|
67
|
+
total += m;
|
|
68
|
+
}
|
|
69
|
+
return { byL1, total, days: days.size || 1 };
|
|
70
|
+
};
|
|
71
|
+
const A = agg(args.a);
|
|
72
|
+
const B = agg(args.b);
|
|
73
|
+
const sA = computeHealthScore(A.byL1).score;
|
|
74
|
+
const sB = computeHealthScore(B.byL1).score;
|
|
75
|
+
const lines = [];
|
|
76
|
+
lines.push(args.labelA + ' vs ' + args.labelB + ':块数 ' + args.a.length + '→' + args.b.length + ',时长 ' + fmtDur(A.total) + '→' + fmtDur(B.total) + ',健康分 ' + sA + '→' + sB + '。');
|
|
77
|
+
const dims = new Set([...Object.keys(A.byL1), ...Object.keys(B.byL1)].sort());
|
|
78
|
+
for (const d of dims) {
|
|
79
|
+
const c = B.byL1[d] || 0;
|
|
80
|
+
const p = A.byL1[d] || 0;
|
|
81
|
+
if (!p && !c)
|
|
82
|
+
continue;
|
|
83
|
+
const dp = p > 0 ? fmtPct(c - p, p) : 100;
|
|
84
|
+
lines.push(d + ':' + fmtDur(p) + '→' + fmtDur(c) + '(' + (dp >= 0 ? '+' : '') + dp + '%)。');
|
|
85
|
+
}
|
|
86
|
+
const reds = detectAnomalies(B.byL1, A.byL1).filter((a) => a.level === 'red');
|
|
87
|
+
if (reds.length)
|
|
88
|
+
lines.push('显著变化:' + reds.map((a) => a.dim + (a.deltaPct >= 0 ? '+' : '') + a.deltaPct + '%').join('、') + '。');
|
|
89
|
+
return { summary: lines.join('\n') };
|
|
90
|
+
}
|
|
91
|
+
// 类别深挖:analysis summary(区间内某分类明细 + 占比)。
|
|
92
|
+
export function buildCategoryDeep(start, end, category, records) {
|
|
93
|
+
const total = records.reduce((a, r) => a + (r.duration_minutes || 0), 0);
|
|
94
|
+
const hit = records.filter((r) => r.category === category || l1Of(r.category) === category);
|
|
95
|
+
const hm = hit.reduce((a, r) => a + (r.duration_minutes || 0), 0);
|
|
96
|
+
const lines = [
|
|
97
|
+
start + '~' + end + ' 类别深挖 ' + category + ':' + hit.length + ' 块,共 ' + fmtDur(hm) + '(占区间 ' + fmtPct(hm, total) + '%)。',
|
|
98
|
+
...hit.slice(0, 20).map((r) => r.date + ' ' + r.time_start + '~' + r.time_end + ' ' + r.activity),
|
|
99
|
+
];
|
|
100
|
+
if (hit.length > 20)
|
|
101
|
+
lines.push('……等共 ' + hit.length + ' 块。');
|
|
102
|
+
return { summary: lines.join('\n') };
|
|
103
|
+
}
|
|
104
|
+
// 异常检测:analysis summary(窗口内按日聚合 vs 均值,红/黄句)。
|
|
105
|
+
export function buildAnomaly(end, windowDays, daily) {
|
|
106
|
+
const mean = {};
|
|
107
|
+
for (const d of daily) {
|
|
108
|
+
for (const [k, v] of Object.entries(d.byL1))
|
|
109
|
+
mean[k] = (mean[k] || 0) + v;
|
|
110
|
+
}
|
|
111
|
+
for (const k of Object.keys(mean))
|
|
112
|
+
mean[k] = Math.round(mean[k] / Math.max(daily.length, 1));
|
|
113
|
+
const lines = ['截止 ' + end + ' 近 ' + windowDays + ' 天异常检测(vs 日均):'];
|
|
114
|
+
let any = false;
|
|
115
|
+
for (const d of daily) {
|
|
116
|
+
const reds = detectAnomalies(d.byL1, mean).filter((a) => a.level !== null);
|
|
117
|
+
if (reds.length) {
|
|
118
|
+
any = true;
|
|
119
|
+
lines.push(d.date + ':' + reds.map((a) => a.dim + (a.deltaPct >= 0 ? '+' : '') + a.deltaPct + '%').join('、') + '。');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (!any)
|
|
123
|
+
lines.push('无显著异常。');
|
|
124
|
+
return { summary: lines.join('\n') };
|
|
125
|
+
}
|
|
126
|
+
export function toPlanItem(p) {
|
|
127
|
+
return {
|
|
128
|
+
id: p.id, date: p.date, time: p.time_start + '~' + p.time_end, title: p.title,
|
|
129
|
+
category: p.category || '', completion: p.completion, synced: !!p.feishu_event_id,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
export function buildPlanToday(date, events) {
|
|
133
|
+
return { items: events.map(toPlanItem), total: events.length, date };
|
|
134
|
+
}
|
|
135
|
+
export function buildPlanReceipt(message) {
|
|
136
|
+
return { ok: true, message };
|
|
137
|
+
}
|
|
138
|
+
export const HELP_EMPTY_HINT = '无命中:定时任务/早睡提醒等出 scope,以外置为准(HELP q 为空看全表,或换唤醒词如“查作息/查日程”)';
|
|
139
|
+
export function buildHelpItems(all, q) {
|
|
140
|
+
const items = !q || !q.trim() ? all : all.filter((h) => q.includes(h.phrase) || h.phrase.includes(q.trim()));
|
|
141
|
+
if (!items.length)
|
|
142
|
+
return { items, total: 0, hint: HELP_EMPTY_HINT };
|
|
143
|
+
return { items, total: items.length };
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/render/views.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "skill-schedule",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "作息管家SKILL一期:取数+口径+渲染+出口(record/plan 双域),依 link-core",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/index.js",
|
|
10
|
+
"./fetch": "./dist/fetch/index.js",
|
|
11
|
+
"./policy": "./dist/policy/index.js",
|
|
12
|
+
"./render": "./dist/render/index.js",
|
|
13
|
+
"./cli": "./dist/cli/cmd_read.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"templates/*.html"
|
|
18
|
+
],
|
|
19
|
+
"bin": {
|
|
20
|
+
"schedule-cmd-read": "./dist/cli/cmd_read.js"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"base-link-core": "workspace:^0.1.0"
|
|
24
|
+
},
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=22.13"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc -b && node scripts/build-help.mjs",
|
|
30
|
+
"test": "node --test ../../test/scaffold.test.mjs"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>作息管家 HELP</title>
|
|
6
|
+
<!--SHARED-CSS-->
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="page">
|
|
10
|
+
<h1>作息管家 HELP</h1>
|
|
11
|
+
<p class="cmd">schedule-cmd-read schedule.help.lookup</p>
|
|
12
|
+
<!--CONTENT-->
|
|
13
|
+
</div>
|
|
14
|
+
<!--SHARED-HELPERS-->
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>查日程</title>
|
|
6
|
+
<!--SHARED-CSS-->
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="page">
|
|
10
|
+
<h1>查日程</h1>
|
|
11
|
+
<p class="cmd">schedule-cmd-read schedule.plan.today</p>
|
|
12
|
+
<!--CONTENT-->
|
|
13
|
+
</div>
|
|
14
|
+
<!--SHARED-HELPERS-->
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>日程回执</title>
|
|
6
|
+
<!--SHARED-CSS-->
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="page">
|
|
10
|
+
<h1>日程回执</h1>
|
|
11
|
+
<p class="cmd">schedule-cmd-read schedule.plan.write</p>
|
|
12
|
+
<!--CONTENT-->
|
|
13
|
+
</div>
|
|
14
|
+
<!--SHARED-HELPERS-->
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>查作息对比</title>
|
|
6
|
+
<!--SHARED-CSS-->
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="page">
|
|
10
|
+
<h1>查作息对比</h1>
|
|
11
|
+
<p class="cmd">schedule-cmd-read schedule.record.compare</p>
|
|
12
|
+
<!--CONTENT-->
|
|
13
|
+
</div>
|
|
14
|
+
<!--SHARED-HELPERS-->
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>查作息记录</title>
|
|
6
|
+
<!--SHARED-CSS-->
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="page">
|
|
10
|
+
<h1>查作息记录</h1>
|
|
11
|
+
<p class="cmd">schedule-cmd-read schedule.record.today</p>
|
|
12
|
+
<!--CONTENT-->
|
|
13
|
+
</div>
|
|
14
|
+
<!--SHARED-HELPERS-->
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>作息详情</title>
|
|
6
|
+
<!--SHARED-CSS-->
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="page">
|
|
10
|
+
<h1>作息详情</h1>
|
|
11
|
+
<p class="cmd">schedule-cmd-read schedule.record.detail</p>
|
|
12
|
+
<!--CONTENT-->
|
|
13
|
+
</div>
|
|
14
|
+
<!--SHARED-HELPERS-->
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>查作息区间</title>
|
|
6
|
+
<!--SHARED-CSS-->
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="page">
|
|
10
|
+
<h1>查作息区间</h1>
|
|
11
|
+
<p class="cmd">schedule-cmd-read schedule.record.range</p>
|
|
12
|
+
<!--CONTENT-->
|
|
13
|
+
</div>
|
|
14
|
+
<!--SHARED-HELPERS-->
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>记作息回执</title>
|
|
6
|
+
<!--SHARED-CSS-->
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div class="page">
|
|
10
|
+
<h1>记作息回执</h1>
|
|
11
|
+
<p class="cmd">schedule-cmd-read schedule.record.write</p>
|
|
12
|
+
<!--CONTENT-->
|
|
13
|
+
</div>
|
|
14
|
+
<!--SHARED-HELPERS-->
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|