skill-memo-ilife 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.
Files changed (83) hide show
  1. package/dist/cli/cmd_read.d.ts +3 -0
  2. package/dist/cli/cmd_read.d.ts.map +1 -0
  3. package/dist/cli/cmd_read.js +178 -0
  4. package/dist/cli/cmd_read.js.map +1 -0
  5. package/dist/fetch/db.d.ts +31 -0
  6. package/dist/fetch/db.d.ts.map +1 -0
  7. package/dist/fetch/db.js +117 -0
  8. package/dist/fetch/db.js.map +1 -0
  9. package/dist/fetch/errors.d.ts +11 -0
  10. package/dist/fetch/errors.d.ts.map +1 -0
  11. package/dist/fetch/errors.js +18 -0
  12. package/dist/fetch/errors.js.map +1 -0
  13. package/dist/fetch/feishu.d.ts +24 -0
  14. package/dist/fetch/feishu.d.ts.map +1 -0
  15. package/dist/fetch/feishu.js +117 -0
  16. package/dist/fetch/feishu.js.map +1 -0
  17. package/dist/fetch/index.d.ts +6 -0
  18. package/dist/fetch/index.d.ts.map +1 -0
  19. package/dist/fetch/index.js +4 -0
  20. package/dist/fetch/index.js.map +1 -0
  21. package/dist/help/index.d.ts +3 -0
  22. package/dist/help/index.d.ts.map +1 -0
  23. package/dist/help/index.js +2 -0
  24. package/dist/help/index.js.map +1 -0
  25. package/dist/help/lookup.d.ts +11 -0
  26. package/dist/help/lookup.d.ts.map +1 -0
  27. package/dist/help/lookup.js +38 -0
  28. package/dist/help/lookup.js.map +1 -0
  29. package/dist/index.d.ts +5 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +6 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/policy/category.d.ts +7 -0
  34. package/dist/policy/category.d.ts.map +1 -0
  35. package/dist/policy/category.js +29 -0
  36. package/dist/policy/category.js.map +1 -0
  37. package/dist/policy/crud.d.ts +19 -0
  38. package/dist/policy/crud.d.ts.map +1 -0
  39. package/dist/policy/crud.js +24 -0
  40. package/dist/policy/crud.js.map +1 -0
  41. package/dist/policy/index.d.ts +10 -0
  42. package/dist/policy/index.d.ts.map +1 -0
  43. package/dist/policy/index.js +6 -0
  44. package/dist/policy/index.js.map +1 -0
  45. package/dist/policy/reminder.d.ts +10 -0
  46. package/dist/policy/reminder.d.ts.map +1 -0
  47. package/dist/policy/reminder.js +20 -0
  48. package/dist/policy/reminder.js.map +1 -0
  49. package/dist/policy/wakewords.d.ts +14 -0
  50. package/dist/policy/wakewords.d.ts.map +1 -0
  51. package/dist/policy/wakewords.js +53 -0
  52. package/dist/policy/wakewords.js.map +1 -0
  53. package/dist/policy/wish.d.ts +7 -0
  54. package/dist/policy/wish.d.ts.map +1 -0
  55. package/dist/policy/wish.js +13 -0
  56. package/dist/policy/wish.js.map +1 -0
  57. package/dist/render/envelope.d.ts +6 -0
  58. package/dist/render/envelope.d.ts.map +1 -0
  59. package/dist/render/envelope.js +50 -0
  60. package/dist/render/envelope.js.map +1 -0
  61. package/dist/render/errors.d.ts +5 -0
  62. package/dist/render/errors.d.ts.map +1 -0
  63. package/dist/render/errors.js +10 -0
  64. package/dist/render/errors.js.map +1 -0
  65. package/dist/render/html.d.ts +10 -0
  66. package/dist/render/html.d.ts.map +1 -0
  67. package/dist/render/html.js +52 -0
  68. package/dist/render/html.js.map +1 -0
  69. package/dist/render/index.d.ts +6 -0
  70. package/dist/render/index.d.ts.map +1 -0
  71. package/dist/render/index.js +5 -0
  72. package/dist/render/index.js.map +1 -0
  73. package/dist/render/templates.d.ts +4 -0
  74. package/dist/render/templates.d.ts.map +1 -0
  75. package/dist/render/templates.js +26 -0
  76. package/dist/render/templates.js.map +1 -0
  77. package/package.json +32 -0
  78. package/templates/change_category.html +257 -0
  79. package/templates/init_report.html +225 -0
  80. package/templates/memo_query.html +104 -0
  81. package/templates/sync_report.html +512 -0
  82. package/templates/wish_complete.html +239 -0
  83. package/templates/wish_plan.html +272 -0
@@ -0,0 +1,38 @@
1
+ // HELP 速查(M6):WAKE_TABLE 唯一上游;短语→key/cli/一句话。构建期注入 SKILL.md(scripts/build-help.mjs)。
2
+ import { WAKE_TABLE } from '../policy/index.js';
3
+ import { MEMO_KEY_SHAPES } from '../render/index.js';
4
+ function exampleParams(e) {
5
+ const p = { ...(e.preset || {}) };
6
+ for (const n of e.needs || []) {
7
+ if (p[n] === undefined)
8
+ p[n] = n === 'id' ? '<id>' : n === 'timeRange' ? '2026-09' : n === 'remindAt' ? '2026-10-01' : '<值>';
9
+ }
10
+ const keys = Object.keys(p);
11
+ return keys.length ? ' --params \'' + JSON.stringify(p) + '\'' : '';
12
+ }
13
+ const DESCS = {
14
+ 'memo.search': '搜笔记(关键词/CJK 子串,可按分类过滤)',
15
+ 'memo.detail': '看单条详情(须 id)',
16
+ 'memo.create': '记一条(含记提醒须 remindAt)',
17
+ 'memo.update': '更新笔记(须 id;完成心愿走 done)',
18
+ 'memo.remove': '删除(须 confirm;废弃提醒走 abandon 留笔记)',
19
+ 'memo.remind': '查提醒(含已完成)',
20
+ 'memo.wish': '心愿排期',
21
+ 'memo.sync': '飞书同步(须 lark 四门全绿)',
22
+ 'memo.batch': '批量改分类向导',
23
+ 'memo.stats': '聚合统计',
24
+ };
25
+ // 全量速查表(28 短语:16 显式 + 12 子唤醒词)。
26
+ export function buildHelpLookup() {
27
+ return WAKE_TABLE.map((e) => ({
28
+ phrase: e.phrase,
29
+ key: e.key,
30
+ shape: MEMO_KEY_SHAPES[e.key] || '??',
31
+ cli: 'memo-cmd-read ' + e.key + exampleParams(e),
32
+ desc: DESCS[e.key] || '',
33
+ }));
34
+ }
35
+ export function lookupWake(hits, word) {
36
+ return hits.filter((h) => word.includes(h.phrase));
37
+ }
38
+ //# sourceMappingURL=lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../src/help/lookup.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,EAAE,UAAU,EAAgB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIrD,SAAS,aAAa,CAAC,CAAyD;IAC9E,MAAM,CAAC,GAA4B,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/H,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,KAAK,GAA2B;IACpC,aAAa,EAAE,wBAAwB;IACvC,aAAa,EAAE,aAAa;IAC5B,aAAa,EAAE,qBAAqB;IACpC,aAAa,EAAE,uBAAuB;IACtC,aAAa,EAAE,iCAAiC;IAChD,aAAa,EAAE,WAAW;IAC1B,WAAW,EAAE,MAAM;IACnB,WAAW,EAAE,mBAAmB;IAChC,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,MAAM;CACrB,CAAC;AAEF,gCAAgC;AAChC,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI;QACrC,GAAG,EAAE,gBAAgB,GAAG,CAAC,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC;QAChD,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;KACzB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAe,EAAE,IAAY;IACtD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './fetch/index.js';
2
+ export * from './policy/index.js';
3
+ export * from './render/index.js';
4
+ export * from './help/index.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // skill-memo-ilife 入口:取数层(M2)+ 口径层(M3)+ 渲染层(M4);出口/SKILL 见 M5-M6。
2
+ export * from './fetch/index.js';
3
+ export * from './policy/index.js';
4
+ export * from './render/index.js';
5
+ export * from './help/index.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const MEMO_TOPS: readonly ["备忘", "心愿", "打卡", "情绪日记"];
2
+ export type MemoTop = (typeof MEMO_TOPS)[number];
3
+ export declare const MEMO_DEFAULT_TOP: MemoTop;
4
+ export declare const WAKE_TOPS: Record<string, MemoTop>;
5
+ export declare function normalizeTop(top: unknown): MemoTop;
6
+ export declare function normalizeSub(sub: unknown): string | null;
7
+ //# sourceMappingURL=category.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category.d.ts","sourceRoot":"","sources":["../../src/policy/category.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,qCAAsC,CAAC;AAC7D,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AACjD,eAAO,MAAM,gBAAgB,EAAE,OAAc,CAAC;AAG9C,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAK7C,CAAC;AAEF,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMlD;AAGD,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAKxD"}
@@ -0,0 +1,29 @@
1
+ // 口径层·分类(M3):顶层 4 种(备忘默认/心愿/打卡/情绪日记);sub 自由文本可 NULL;子唤醒词自带顶层。
2
+ import { MemoPolicyError } from '../fetch/errors.js';
3
+ export const MEMO_TOPS = ['备忘', '心愿', '打卡', '情绪日记'];
4
+ export const MEMO_DEFAULT_TOP = '备忘';
5
+ // 子唤醒词→顶层(记/查/改/删四组同表)。
6
+ export const WAKE_TOPS = {
7
+ '记心愿': '心愿', '记打卡': '打卡', '记情绪日记': '情绪日记',
8
+ '查心愿': '心愿', '查打卡': '打卡', '查情绪日记': '情绪日记',
9
+ '改心愿': '心愿', '改打卡': '打卡', '改情绪日记': '情绪日记',
10
+ '删心愿': '心愿', '删打卡': '打卡', '删情绪日记': '情绪日记',
11
+ };
12
+ export function normalizeTop(top) {
13
+ if (top === undefined || top === null || top === '')
14
+ return MEMO_DEFAULT_TOP;
15
+ if (typeof top !== 'string' || !MEMO_TOPS.includes(top)) {
16
+ throw new MemoPolicyError('POLICY_BAD_CATEGORY', '未知顶层分类:' + String(top) + '(仅备忘/心愿/打卡/情绪日记)');
17
+ }
18
+ return top;
19
+ }
20
+ // sub 自由文本:空串/空白归一为 null(AI 推断不出维度时不追问)。
21
+ export function normalizeSub(sub) {
22
+ if (sub === undefined || sub === null)
23
+ return null;
24
+ if (typeof sub !== 'string')
25
+ throw new MemoPolicyError('POLICY_BAD_CATEGORY', '子分类须为文本');
26
+ const t = sub.trim();
27
+ return t.length === 0 ? null : t;
28
+ }
29
+ //# sourceMappingURL=category.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category.js","sourceRoot":"","sources":["../../src/policy/category.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAU,CAAC;AAE7D,MAAM,CAAC,MAAM,gBAAgB,GAAY,IAAI,CAAC;AAE9C,wBAAwB;AACxB,MAAM,CAAC,MAAM,SAAS,GAA4B;IAChD,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM;IACzC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM;IACzC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM;IACzC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM;CAC1C,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,gBAAgB,CAAC;IAC7E,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAc,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,GAAc,CAAC;AACxB,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;IACzF,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare function crudCreate(input: {
2
+ title?: unknown;
3
+ body?: unknown;
4
+ }): {
5
+ title: string;
6
+ body: string;
7
+ };
8
+ export declare function crudUpdate(input: {
9
+ id?: unknown;
10
+ }): {
11
+ id: string;
12
+ };
13
+ export declare function crudRemove(input: {
14
+ id?: unknown;
15
+ confirm?: unknown;
16
+ }): {
17
+ id: string;
18
+ };
19
+ //# sourceMappingURL=crud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/policy/crud.ts"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAKtG;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAElE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAIrF"}
@@ -0,0 +1,24 @@
1
+ // 口径层·增删改查字段政策(M3):建须题/文其一、改删须 id、真删须 confirm;废弃走 reminder abandon。
2
+ import { MemoPolicyError } from '../fetch/errors.js';
3
+ function needId(id, op) {
4
+ if (typeof id !== 'string' || id.length === 0)
5
+ throw new MemoPolicyError('POLICY_BAD_INPUT', op + ' 须给 id');
6
+ return id;
7
+ }
8
+ export function crudCreate(input) {
9
+ const title = typeof input.title === 'string' ? input.title.trim() : '';
10
+ const body = typeof input.body === 'string' ? input.body.trim() : '';
11
+ if (!title && !body)
12
+ throw new MemoPolicyError('POLICY_BAD_INPUT', '新建须给标题或正文其一');
13
+ return { title, body };
14
+ }
15
+ export function crudUpdate(input) {
16
+ return { id: needId(input.id, '更新') };
17
+ }
18
+ export function crudRemove(input) {
19
+ const id = needId(input.id, '删除');
20
+ if (input.confirm !== true)
21
+ throw new MemoPolicyError('POLICY_BAD_INPUT', '真删须 confirm:true(废弃提醒走 abandon)');
22
+ return { id };
23
+ }
24
+ //# sourceMappingURL=crud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud.js","sourceRoot":"","sources":["../../src/policy/crud.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,SAAS,MAAM,CAAC,EAAW,EAAE,EAAU;IACrC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC5G,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAA0C;IACnE,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;IAClF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAuB;IAChD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAA0C;IACnE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,iCAAiC,CAAC,CAAC;IAC7G,OAAO,EAAE,EAAE,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { MEMO_TOPS, MEMO_DEFAULT_TOP, WAKE_TOPS, normalizeTop, normalizeSub } from './category.js';
2
+ export type { MemoTop } from './category.js';
3
+ export { REMIND_ISO_RE, normalizeRemindAt, routeRemind } from './reminder.js';
4
+ export type { RemindOp, RemindRoute } from './reminder.js';
5
+ export { routeWish, WISH_SYNC_OPS } from './wish.js';
6
+ export type { WishOp, WishSyncOp } from './wish.js';
7
+ export { crudCreate, crudUpdate, crudRemove } from './crud.js';
8
+ export { routeWakeword, WAKE_TABLE } from './wakewords.js';
9
+ export type { MemoKey, WakeRoute, WakeEntry } from './wakewords.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACnG,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACrD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { MEMO_TOPS, MEMO_DEFAULT_TOP, WAKE_TOPS, normalizeTop, normalizeSub } from './category.js';
2
+ export { REMIND_ISO_RE, normalizeRemindAt, routeRemind } from './reminder.js';
3
+ export { routeWish, WISH_SYNC_OPS } from './wish.js';
4
+ export { crudCreate, crudUpdate, crudRemove } from './crud.js';
5
+ export { routeWakeword, WAKE_TABLE } from './wakewords.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const REMIND_ISO_RE: RegExp;
2
+ export declare function normalizeRemindAt(v: unknown): string;
3
+ export type RemindOp = 'set' | 'query' | 'abandon' | 'complete' | 'listDone';
4
+ export interface RemindRoute {
5
+ key: string;
6
+ mode?: 'abandon' | 'delete';
7
+ done?: boolean;
8
+ }
9
+ export declare function routeRemind(op: RemindOp): RemindRoute;
10
+ //# sourceMappingURL=reminder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reminder.d.ts","sourceRoot":"","sources":["../../src/policy/reminder.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,QAAwB,CAAC;AAEnD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAKpD;AAED,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAC7E,MAAM,WAAW,WAAW;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CAAE;AAE1F,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,WAAW,CASrD"}
@@ -0,0 +1,20 @@
1
+ // 口径层·提醒路由(M3):设置/查/废弃/完成四向;废弃留笔记、删除去笔记(须 confirm)。
2
+ import { MemoPolicyError } from '../fetch/errors.js';
3
+ export const REMIND_ISO_RE = /^\d{4}-\d{2}-\d{2}$/;
4
+ export function normalizeRemindAt(v) {
5
+ if (typeof v !== 'string' || !REMIND_ISO_RE.test(v) || Number.isNaN(Date.parse(v))) {
6
+ throw new MemoPolicyError('POLICY_BAD_REMINDER', 'remindAt 须为 YYYY-MM-DD:' + String(v));
7
+ }
8
+ return v;
9
+ }
10
+ export function routeRemind(op) {
11
+ switch (op) {
12
+ case 'set': return { key: 'memo.create' };
13
+ case 'query': return { key: 'memo.remind' };
14
+ case 'abandon': return { key: 'memo.remove', mode: 'abandon' };
15
+ case 'complete': return { key: 'memo.update', done: true };
16
+ case 'listDone': return { key: 'memo.remind', done: true };
17
+ default: throw new MemoPolicyError('POLICY_BAD_REMINDER', '未知提醒操作:' + String(op));
18
+ }
19
+ }
20
+ //# sourceMappingURL=reminder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reminder.js","sourceRoot":"","sources":["../../src/policy/reminder.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAEnD,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE,yBAAyB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAKD,MAAM,UAAU,WAAW,CAAC,EAAY;IACtC,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;QAC1C,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;QAC5C,KAAK,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC/D,KAAK,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC3D,KAAK,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC3D,OAAO,CAAC,CAAC,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type MemoKey = 'memo.search' | 'memo.detail' | 'memo.create' | 'memo.update' | 'memo.remove' | 'memo.remind' | 'memo.wish' | 'memo.sync' | 'memo.batch' | 'memo.stats';
2
+ export interface WakeRoute {
3
+ key: MemoKey;
4
+ params: Record<string, unknown>;
5
+ }
6
+ export interface WakeEntry {
7
+ phrase: string;
8
+ key: MemoKey;
9
+ needs?: string[];
10
+ preset?: Record<string, unknown>;
11
+ }
12
+ export declare const WAKE_TABLE: WakeEntry[];
13
+ export declare function routeWakeword(text: string, ctx?: Record<string, unknown>): WakeRoute;
14
+ //# sourceMappingURL=wakewords.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wakewords.d.ts","sourceRoot":"","sources":["../../src/policy/wakewords.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GACf,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,GAC7E,aAAa,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;AAE5E,MAAM,WAAW,SAAS;IAAG,GAAG,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAAE;AAC7E,MAAM,WAAW,SAAS;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAAE;AAGhH,eAAO,MAAM,UAAU,EAAE,SAAS,EAiBjC,CAAC;AAYF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,SAAS,CAUxF"}
@@ -0,0 +1,53 @@
1
+ // 口径层·唤醒词路由(M3):9 查询类 + 写入类;最长匹配;批量改分类向导与改子分类按“批量”消歧;无命中/缺槽位 throw。
2
+ import { MemoPolicyError } from '../fetch/errors.js';
3
+ import { WAKE_TOPS } from './category.js';
4
+ // 全量唤醒词表(HELP 速查唯一上游;改这里,HELP 构建期跟进)。
5
+ export const WAKE_TABLE = [
6
+ { phrase: '按时间搜备忘', key: 'memo.search', needs: ['timeRange'] },
7
+ { phrase: '查已提醒备忘', key: 'memo.remind', preset: { done: false } },
8
+ { phrase: '批量改分类', key: 'memo.batch' },
9
+ { phrase: '改子分类', key: 'memo.update', needs: ['id'] },
10
+ { phrase: '搜备忘', key: 'memo.search' },
11
+ { phrase: '查备忘', key: 'memo.search' },
12
+ { phrase: '看备忘', key: 'memo.detail', needs: ['id'] },
13
+ { phrase: '看提醒', key: 'memo.remind' },
14
+ { phrase: '查提醒', key: 'memo.remind' },
15
+ { phrase: '设提醒', key: 'memo.create', needs: ['remindAt'] },
16
+ { phrase: '记提醒', key: 'memo.create', needs: ['remindAt'] },
17
+ { phrase: '废弃提醒', key: 'memo.remove', preset: { mode: 'abandon' } },
18
+ { phrase: '完成心愿', key: 'memo.update', preset: { done: true } },
19
+ { phrase: '心愿排期', key: 'memo.wish' },
20
+ { phrase: '记一条', key: 'memo.create' },
21
+ { phrase: '添加笔记', key: 'memo.create' },
22
+ ];
23
+ for (const [p, top] of Object.entries(WAKE_TOPS)) {
24
+ const verb = p[0];
25
+ if (verb === '记')
26
+ WAKE_TABLE.push({ phrase: p, key: 'memo.create', preset: { category: top } });
27
+ else if (verb === '查')
28
+ WAKE_TABLE.push({ phrase: p, key: p === '查心愿' ? 'memo.wish' : 'memo.search', preset: { category: top } });
29
+ else
30
+ WAKE_TABLE.push({ phrase: p, key: 'memo.update', needs: ['id'], preset: { category: top } });
31
+ }
32
+ // 最长匹配优先,保证“批量改分类”不落入“改子分类”。
33
+ const SORTED = [...WAKE_TABLE].sort((a, b) => b.phrase.length - a.phrase.length);
34
+ export function routeWakeword(text, ctx = {}) {
35
+ if (typeof text !== 'string' || text.length === 0)
36
+ throw new MemoPolicyError('POLICY_NO_MATCH', '唤醒词为空');
37
+ const hit = SORTED.find((e) => text.includes(e.phrase));
38
+ if (!hit)
39
+ throw new MemoPolicyError('POLICY_NO_MATCH', '无命中唤醒词:' + text);
40
+ for (const s of hit.needs || []) {
41
+ if (ctx[s] === undefined || ctx[s] === null || ctx[s] === '') {
42
+ throw new MemoPolicyError('POLICY_MISSING_SLOT', '缺槽位 ' + s + ':' + hit.phrase);
43
+ }
44
+ }
45
+ return { key: hit.key, params: { ...(hit.preset || {}), ...pickCtx(ctx, hit.needs || []) } };
46
+ }
47
+ function pickCtx(ctx, needs) {
48
+ const o = {};
49
+ for (const k of needs)
50
+ o[k] = ctx[k];
51
+ return o;
52
+ }
53
+ //# sourceMappingURL=wakewords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wakewords.js","sourceRoot":"","sources":["../../src/policy/wakewords.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type WishOp = 'plan' | 'complete';
2
+ export type WishSyncOp = 'add_wish_sync' | 'update_wish_sync' | 'complete_wish_sync' | 'update_due_sync' | 'clear_due_sync';
3
+ export declare const WISH_SYNC_OPS: WishSyncOp[];
4
+ export declare function routeWish(op: WishOp): {
5
+ key: string;
6
+ };
7
+ //# sourceMappingURL=wish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wish.d.ts","sourceRoot":"","sources":["../../src/policy/wish.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AACzC,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAC5H,eAAO,MAAM,aAAa,EAAE,UAAU,EAErC,CAAC;AAEF,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAIrD"}
@@ -0,0 +1,13 @@
1
+ // 口径层·心愿排期(M3):排期/完成/同步三向;同步动作名对齐 feishu 传输(实现见 fetch/feishu)。
2
+ import { MemoPolicyError } from '../fetch/errors.js';
3
+ export const WISH_SYNC_OPS = [
4
+ 'add_wish_sync', 'update_wish_sync', 'complete_wish_sync', 'update_due_sync', 'clear_due_sync',
5
+ ];
6
+ export function routeWish(op) {
7
+ if (op === 'plan')
8
+ return { key: 'memo.wish' };
9
+ if (op === 'complete')
10
+ return { key: 'memo.update' };
11
+ throw new MemoPolicyError('POLICY_BAD_INPUT', '未知心愿操作:' + String(op));
12
+ }
13
+ //# sourceMappingURL=wish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wish.js","sourceRoot":"","sources":["../../src/policy/wish.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIrD,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB;CAC/F,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,IAAI,EAAE,KAAK,MAAM;QAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;IAC/C,IAAI,EAAE,KAAK,UAAU;QAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;IACrD,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type Envelope, type EnvelopeShape } from 'base-link-core';
2
+ export declare const MEMO_KEY_SHAPES: Record<string, EnvelopeShape>;
3
+ export declare function memoShapeFor(key: string): EnvelopeShape;
4
+ export declare function buildMemoEnvelope(key: string, data: unknown): Envelope;
5
+ export declare function parseMemoEnvelope(input: unknown): Envelope;
6
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/render/envelope.ts"],"names":[],"mappings":"AACA,OAAO,EAAmD,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAWzD,CAAC;AAEF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAIvD;AAGD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAatE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAG1D"}
@@ -0,0 +1,50 @@
1
+ // 渲染层·envelope(M4):10 联动 key×shape 映射(M1 拆分表);key 字符串 P8 落表时冻结,此处只做形状分配与全字段校验。
2
+ import { createEnvelope, parseEnvelope, parseRegistryKey } from 'base-link-core';
3
+ import { MemoRenderError } from './errors.js';
4
+ export const MEMO_KEY_SHAPES = {
5
+ 'memo.search': 'list',
6
+ 'memo.detail': 'detail',
7
+ 'memo.create': 'receipt',
8
+ 'memo.update': 'receipt',
9
+ 'memo.remove': 'receipt',
10
+ 'memo.remind': 'list',
11
+ 'memo.wish': 'list',
12
+ 'memo.sync': 'receipt',
13
+ 'memo.batch': 'receipt',
14
+ 'memo.stats': 'stat',
15
+ };
16
+ export function memoShapeFor(key) {
17
+ const s = MEMO_KEY_SHAPES[key];
18
+ if (!s)
19
+ throw new MemoRenderError('MEMO_UNKNOWN_KEY', '未知联动 key:' + key);
20
+ return s;
21
+ }
22
+ // 建 envelope:key 先过命名空间,再按分配形状做全字段校验;错形状载荷即 throw。
23
+ export function buildMemoEnvelope(key, data) {
24
+ let parsedKey = '';
25
+ try {
26
+ parsedKey = parseRegistryKey(key).key;
27
+ }
28
+ catch (e) {
29
+ throw new MemoRenderError('MEMO_UNKNOWN_KEY', '非法 key:' + e.message);
30
+ }
31
+ const shape = memoShapeFor(parsedKey);
32
+ if (typeof data !== 'object' || data === null || Array.isArray(data)) {
33
+ throw new MemoRenderError('MEMO_BAD_PAYLOAD', '载荷须为对象:' + parsedKey);
34
+ }
35
+ try {
36
+ return createEnvelope({ skill: 'memo', shape, key: parsedKey, data: data });
37
+ }
38
+ catch (e) {
39
+ throw new MemoRenderError('MEMO_SHAPE_MISMATCH', shape + ' 全字段未过:' + e.message);
40
+ }
41
+ }
42
+ export function parseMemoEnvelope(input) {
43
+ try {
44
+ return parseEnvelope(input);
45
+ }
46
+ catch (e) {
47
+ throw new MemoRenderError('MEMO_BAD_PAYLOAD', 'envelope 非法:' + e.message);
48
+ }
49
+ }
50
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/render/envelope.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAqC,MAAM,gBAAgB,CAAC;AACpH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,aAAa,EAAE,MAAM;IACrB,aAAa,EAAE,QAAQ;IACvB,aAAa,EAAE,SAAS;IACxB,aAAa,EAAE,SAAS;IACxB,aAAa,EAAE,SAAS;IACxB,aAAa,EAAE,MAAM;IACrB,WAAW,EAAE,MAAM;IACnB,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,MAAM;CACrB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC;IACzE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,IAAa;IAC1D,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,CAAC;QAAC,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;IAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,SAAS,GAAI,CAAW,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAC9F,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAa,EAAE,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE,KAAK,GAAG,SAAS,GAAI,CAAW,CAAC,OAAO,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,CAAC;QAAC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,cAAc,GAAI,CAAW,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;AACrG,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare class MemoRenderError extends Error {
2
+ readonly code: 'MEMO_UNKNOWN_KEY' | 'MEMO_SHAPE_MISMATCH' | 'MEMO_BAD_PAYLOAD' | 'MEMO_HTML_TOO_LARGE' | 'MEMO_TEMPLATE_MISSING' | 'MEMO_MARKER_INVALID';
3
+ constructor(code: MemoRenderError['code'], message: string);
4
+ }
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/render/errors.ts"],"names":[],"mappings":"AACA,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EACT,kBAAkB,GAAG,qBAAqB,GAAG,kBAAkB,GAC/D,qBAAqB,GAAG,uBAAuB,GAAG,qBAAqB,CAAC;gBAChE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM;CAK3D"}
@@ -0,0 +1,10 @@
1
+ // 渲染层错误:坏 key/形状/载荷/超体积/缺模板一律 throw(fallback 形状是唯一的显式降级通道)。
2
+ export class MemoRenderError extends Error {
3
+ code;
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.name = 'MemoRenderError';
7
+ this.code = code;
8
+ }
9
+ }
10
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/render/errors.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAE+D;IAC5E,YAAY,IAA6B,EAAE,OAAe;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { Envelope } from 'base-link-core';
2
+ export declare const MEMO_HTML_MAX_BYTES: number;
3
+ export declare function escapeHtml(s: string): string;
4
+ export declare function renderEnvelopeHtml(env: Envelope): string;
5
+ export declare function estimateBytes(html: string): number;
6
+ export declare function assertHtmlSize(html: string, max?: number): void;
7
+ export declare const SHARED_CSS_MARKER = "<!--SHARED-CSS-->";
8
+ export declare const SHARED_HELPERS_MARKER = "<!--SHARED-HELPERS-->";
9
+ export declare function fillSharedMarkers(template: string, css: string, helpers: string): string;
10
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/render/html.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,mBAAmB,QAAa,CAAC;AAE9C,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAeD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAexD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAA4C;AAG/F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAsB,GAAG,IAAI,CAI5E;AAGD,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAE7D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOxF"}
@@ -0,0 +1,52 @@
1
+ import { MemoRenderError } from './errors.js';
2
+ export const MEMO_HTML_MAX_BYTES = 256 * 1024;
3
+ export function escapeHtml(s) {
4
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
5
+ }
6
+ function itemHtml(n) {
7
+ const id = escapeHtml(String(n.id ?? ''));
8
+ const content = escapeHtml(String(n.title ?? n.body ?? ''));
9
+ const cat = escapeHtml(String(n.category ?? ''));
10
+ return '<div class="item"><div class="item-head"><span class="id">' + id + '</span><span class="badge">' + cat + '</span></div><div class="content">' + content + '</div></div>';
11
+ }
12
+ function listHtml(items) {
13
+ if (!items.length)
14
+ return '<div class="hm-empty">暂无记录</div>';
15
+ return items.map((x) => itemHtml(x)).join('');
16
+ }
17
+ // 按形状渲染 envelope 为 section 页;未知形状(理论不可达)throw 不返空页。
18
+ export function renderEnvelopeHtml(env) {
19
+ const head = '<section data-skill="memo" data-shape="' + env.shape + '">';
20
+ const d = env.data;
21
+ switch (env.shape) {
22
+ case 'list': return head + listHtml(d.items) + '</section>';
23
+ case 'detail': return head + itemHtml(d.item) + '</section>';
24
+ case 'receipt': return head + '<div class="receipt">' + escapeHtml(String(d.message)) + '</div></section>';
25
+ case 'stat': {
26
+ const rows = Object.entries((d.metrics || {}));
27
+ return head + rows.map(([k, v]) => '<div class="stat"><b>' + v + '</b><span>' + escapeHtml(k) + '</span></div>').join('') + '</section>';
28
+ }
29
+ case 'analysis': return head + '<div class="analysis">' + escapeHtml(String(d.summary)) + '</div></section>';
30
+ case 'fallback': return head + '<div data-degraded="1">' + escapeHtml(String(d.reason)) + '</div></section>';
31
+ default: throw new MemoRenderError('MEMO_SHAPE_MISMATCH', '无法渲染形状:' + String(env.shape));
32
+ }
33
+ }
34
+ export function estimateBytes(html) { return Buffer.byteLength(html, 'utf8'); }
35
+ // 体积门:超限 throw(调用方走 fallback 形状显式降级,不静默截断)。
36
+ export function assertHtmlSize(html, max = MEMO_HTML_MAX_BYTES) {
37
+ if (estimateBytes(html) > max) {
38
+ throw new MemoRenderError('MEMO_HTML_TOO_LARGE', 'HTML 超体积:' + estimateBytes(html) + ' > ' + max);
39
+ }
40
+ }
41
+ // 共享标记填充(老家 _inject 对应):两标记各恰出现 1 次,否则 throw;init/HELP 模板不在此(M6)。
42
+ export const SHARED_CSS_MARKER = '<!--SHARED-CSS-->';
43
+ export const SHARED_HELPERS_MARKER = '<!--SHARED-HELPERS-->';
44
+ export function fillSharedMarkers(template, css, helpers) {
45
+ for (const m of [SHARED_CSS_MARKER, SHARED_HELPERS_MARKER]) {
46
+ if (template.split(m).length - 1 !== 1) {
47
+ throw new MemoRenderError('MEMO_MARKER_INVALID', '标记须恰出现 1 次:' + m);
48
+ }
49
+ }
50
+ return template.split(SHARED_CSS_MARKER).join(css).split(SHARED_HELPERS_MARKER).join(helpers);
51
+ }
52
+ //# 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,6 @@
1
+ export { MemoRenderError } from './errors.js';
2
+ export { MEMO_KEY_SHAPES, memoShapeFor, buildMemoEnvelope, parseMemoEnvelope } from './envelope.js';
3
+ export { MEMO_HTML_MAX_BYTES, escapeHtml, renderEnvelopeHtml, estimateBytes, assertHtmlSize, SHARED_CSS_MARKER, SHARED_HELPERS_MARKER, fillSharedMarkers } from './html.js';
4
+ export { MEMO_TEMPLATES, loadTemplate } from './templates.js';
5
+ export type { MemoTemplate } from './templates.js';
6
+ //# 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,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC5K,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9D,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { MemoRenderError } from './errors.js';
2
+ export { MEMO_KEY_SHAPES, memoShapeFor, buildMemoEnvelope, parseMemoEnvelope } from './envelope.js';
3
+ export { MEMO_HTML_MAX_BYTES, escapeHtml, renderEnvelopeHtml, estimateBytes, assertHtmlSize, SHARED_CSS_MARKER, SHARED_HELPERS_MARKER, fillSharedMarkers } from './html.js';
4
+ export { MEMO_TEMPLATES, loadTemplate } from './templates.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC5K,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const MEMO_TEMPLATES: readonly ["memo_query", "sync_report", "wish_plan", "wish_complete", "change_category", "init_report"];
2
+ export type MemoTemplate = (typeof MEMO_TEMPLATES)[number];
3
+ export declare function loadTemplate(name: string): string;
4
+ //# 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,cAAc,wGAOjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAI3D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMjD"}
@@ -0,0 +1,26 @@
1
+ // 渲染层·模板装载(M4/M6):6 模板随包发布(SKILL 包只含 SKILL.md+dist+模板);init_report 由 M6 落定。
2
+ import { readFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { MemoRenderError } from './errors.js';
6
+ export const MEMO_TEMPLATES = [
7
+ 'memo_query',
8
+ 'sync_report',
9
+ 'wish_plan',
10
+ 'wish_complete',
11
+ 'change_category',
12
+ 'init_report',
13
+ ];
14
+ const templatesDir = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'templates');
15
+ export function loadTemplate(name) {
16
+ if (!MEMO_TEMPLATES.includes(name)) {
17
+ throw new MemoRenderError('MEMO_TEMPLATE_MISSING', '未知模板:' + name);
18
+ }
19
+ try {
20
+ return readFileSync(join(templatesDir, name + '.html'), 'utf8');
21
+ }
22
+ catch (e) {
23
+ throw new MemoRenderError('MEMO_TEMPLATE_MISSING', '模板缺失:' + name);
24
+ }
25
+ }
26
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/render/templates.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,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,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY;IACZ,aAAa;IACb,WAAW;IACX,eAAe;IACf,iBAAiB;IACjB,aAAa;CACL,CAAC;AAGX,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,cAAc,CAAC,QAAQ,CAAC,IAAoB,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,eAAe,CAAC,uBAAuB,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;IACrE,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,eAAe,CAAC,uBAAuB,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;IAAC,CAAC;AACnF,CAAC"}