skill-bill 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 (101) 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 +530 -0
  4. package/dist/cli/cmd_read.js.map +1 -0
  5. package/dist/fetch/db.d.ts +55 -0
  6. package/dist/fetch/db.d.ts.map +1 -0
  7. package/dist/fetch/db.js +255 -0
  8. package/dist/fetch/db.js.map +1 -0
  9. package/dist/fetch/errors.d.ts +13 -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/index.d.ts +5 -0
  14. package/dist/fetch/index.d.ts.map +1 -0
  15. package/dist/fetch/index.js +4 -0
  16. package/dist/fetch/index.js.map +1 -0
  17. package/dist/fetch/paths.d.ts +8 -0
  18. package/dist/fetch/paths.d.ts.map +1 -0
  19. package/dist/fetch/paths.js +36 -0
  20. package/dist/fetch/paths.js.map +1 -0
  21. package/dist/help/index.d.ts +2 -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 +53 -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 +5 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/policy/accounts.d.ts +13 -0
  34. package/dist/policy/accounts.d.ts.map +1 -0
  35. package/dist/policy/accounts.js +31 -0
  36. package/dist/policy/accounts.js.map +1 -0
  37. package/dist/policy/analysis.d.ts +12 -0
  38. package/dist/policy/analysis.d.ts.map +1 -0
  39. package/dist/policy/analysis.js +39 -0
  40. package/dist/policy/analysis.js.map +1 -0
  41. package/dist/policy/category.d.ts +31 -0
  42. package/dist/policy/category.d.ts.map +1 -0
  43. package/dist/policy/category.js +115 -0
  44. package/dist/policy/category.js.map +1 -0
  45. package/dist/policy/goals.d.ts +15 -0
  46. package/dist/policy/goals.d.ts.map +1 -0
  47. package/dist/policy/goals.js +33 -0
  48. package/dist/policy/goals.js.map +1 -0
  49. package/dist/policy/index.d.ts +13 -0
  50. package/dist/policy/index.d.ts.map +1 -0
  51. package/dist/policy/index.js +7 -0
  52. package/dist/policy/index.js.map +1 -0
  53. package/dist/policy/record.d.ts +15 -0
  54. package/dist/policy/record.d.ts.map +1 -0
  55. package/dist/policy/record.js +62 -0
  56. package/dist/policy/record.js.map +1 -0
  57. package/dist/policy/wakewords.d.ts +14 -0
  58. package/dist/policy/wakewords.d.ts.map +1 -0
  59. package/dist/policy/wakewords.js +121 -0
  60. package/dist/policy/wakewords.js.map +1 -0
  61. package/dist/render/envelope.d.ts +6 -0
  62. package/dist/render/envelope.d.ts.map +1 -0
  63. package/dist/render/envelope.js +56 -0
  64. package/dist/render/envelope.js.map +1 -0
  65. package/dist/render/errors.d.ts +5 -0
  66. package/dist/render/errors.d.ts.map +1 -0
  67. package/dist/render/errors.js +9 -0
  68. package/dist/render/errors.js.map +1 -0
  69. package/dist/render/html.d.ts +13 -0
  70. package/dist/render/html.d.ts.map +1 -0
  71. package/dist/render/html.js +60 -0
  72. package/dist/render/html.js.map +1 -0
  73. package/dist/render/index.d.ts +8 -0
  74. package/dist/render/index.d.ts.map +1 -0
  75. package/dist/render/index.js +6 -0
  76. package/dist/render/index.js.map +1 -0
  77. package/dist/render/templates.d.ts +5 -0
  78. package/dist/render/templates.d.ts.map +1 -0
  79. package/dist/render/templates.js +58 -0
  80. package/dist/render/templates.js.map +1 -0
  81. package/dist/render/views.d.ts +86 -0
  82. package/dist/render/views.d.ts.map +1 -0
  83. package/dist/render/views.js +127 -0
  84. package/dist/render/views.js.map +1 -0
  85. package/package.json +32 -0
  86. package/templates/account_query.html +16 -0
  87. package/templates/account_write.html +16 -0
  88. package/templates/analysis_compare.html +16 -0
  89. package/templates/analysis_overview.html +16 -0
  90. package/templates/analysis_trend.html +16 -0
  91. package/templates/goal_query.html +16 -0
  92. package/templates/goal_write.html +16 -0
  93. package/templates/help.html +16 -0
  94. package/templates/link_submit.html +16 -0
  95. package/templates/record_add.html +16 -0
  96. package/templates/record_detail.html +16 -0
  97. package/templates/record_range.html +16 -0
  98. package/templates/record_search.html +16 -0
  99. package/templates/record_today.html +16 -0
  100. package/templates/record_update.html +16 -0
  101. package/templates/setup_run.html +16 -0
@@ -0,0 +1,12 @@
1
+ export type OverviewKind = 'monthly' | 'yearly' | 'overview' | 'week' | 'category' | 'account' | 'ledger' | 'structure' | 'stats';
2
+ export type CompareKind = 'period' | 'range' | 'yoy' | 'category';
3
+ export type TrendKind = 'trend' | 'category' | 'top' | 'frequent' | 'distribution' | 'activity' | 'insight' | 'anomaly' | 'debt' | 'reimburse' | 'installment' | 'refund';
4
+ export declare function parseOverviewKind(params: Record<string, unknown>): OverviewKind;
5
+ export declare function parseCompareKind(params: Record<string, unknown>): CompareKind;
6
+ export declare function parseTrendKind(params: Record<string, unknown>): TrendKind;
7
+ export declare function needMonth(params: Record<string, unknown>, name?: string): string;
8
+ export declare function needRange(params: Record<string, unknown>): {
9
+ start: string;
10
+ end: string;
11
+ };
12
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/policy/analysis.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AAClI,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,GAAG,QAAQ,CAAC;AAE1K,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAK/E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAK7E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAKzE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,SAAU,GAAG,MAAM,CAEjF;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAQzF"}
@@ -0,0 +1,39 @@
1
+ // 口径层·分析 params 校验(老家 analyze.py + analysis/cli.py 对应)。
2
+ // kind 分流:overview(月度/年度/总览/周报/分类/账户/账本/结构/统计)/ compare(对比/双区间/同比/分类对比)/ trend(趋势/大额/高频/分布/活跃/洞察/异常/借贷/报销/分期/退款)。
3
+ import { BillPolicyError } from '../fetch/errors.js';
4
+ import { normalizeDate, normalizeMonth } from './category.js';
5
+ export function parseOverviewKind(params) {
6
+ const k = params.kind === undefined ? 'monthly' : params.kind;
7
+ const ok = ['monthly', 'yearly', 'overview', 'week', 'category', 'account', 'ledger', 'structure', 'stats'];
8
+ if (typeof k === 'string' && ok.includes(k))
9
+ return k;
10
+ throw new BillPolicyError('POLICY_BAD_INPUT', 'kind 非法(期望 ' + ok.join('/') + '):' + JSON.stringify(k));
11
+ }
12
+ export function parseCompareKind(params) {
13
+ const k = params.kind === undefined ? 'period' : params.kind;
14
+ const ok = ['period', 'range', 'yoy', 'category'];
15
+ if (typeof k === 'string' && ok.includes(k))
16
+ return k;
17
+ throw new BillPolicyError('POLICY_BAD_INPUT', 'kind 非法(期望 period/range/yoy/category):' + JSON.stringify(k));
18
+ }
19
+ export function parseTrendKind(params) {
20
+ const k = params.kind === undefined ? 'trend' : params.kind;
21
+ const ok = ['trend', 'category', 'top', 'frequent', 'distribution', 'activity', 'insight', 'anomaly', 'debt', 'reimburse', 'installment', 'refund'];
22
+ if (typeof k === 'string' && ok.includes(k))
23
+ return k;
24
+ throw new BillPolicyError('POLICY_BAD_INPUT', 'kind 非法(期望 trend/category/top/frequent/distribution/activity/insight/anomaly/debt/reimburse/installment/refund):' + JSON.stringify(k));
25
+ }
26
+ export function needMonth(params, name = 'month') {
27
+ return normalizeMonth(params[name], name);
28
+ }
29
+ export function needRange(params) {
30
+ if (params.start === undefined || params.end === undefined) {
31
+ throw new BillPolicyError('POLICY_MISSING_SLOT', '缺槽位 start/end');
32
+ }
33
+ const start = normalizeDate(params.start, 'start');
34
+ const end = normalizeDate(params.end, 'end');
35
+ if (start > end)
36
+ throw new BillPolicyError('POLICY_BAD_INPUT', 'start 不得晚于 end');
37
+ return { start, end };
38
+ }
39
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/policy/analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export declare const EXPENSE_L1: readonly ["餐饮", "居家", "穿着", "出行", "玩乐", "学习", "健康", "社交", "宠物", "其他"];
2
+ export declare const INCOME_L1: readonly ["工资", "奖金", "兼职", "投资", "其他收入", "退款"];
3
+ export declare const SPECIAL_L1: readonly ["借贷", "分期", "转账"];
4
+ export declare const ALL_L1: readonly ["餐饮", "居家", "穿着", "出行", "玩乐", "学习", "健康", "社交", "宠物", "其他", "工资", "奖金", "兼职", "投资", "其他收入", "退款", "借贷", "分期", "转账"];
5
+ export type BillL1 = (typeof ALL_L1)[number];
6
+ export declare const DEFAULTS: {
7
+ readonly account: "";
8
+ readonly ledger: "生活";
9
+ readonly currency: "人民币";
10
+ readonly note: "";
11
+ };
12
+ export declare function l1Of(category: string): string;
13
+ export declare function validateCategory(raw: unknown): string;
14
+ export declare function validateAmount(raw: unknown): number;
15
+ export declare const DATETIME_RE: RegExp;
16
+ export declare const DATE_RE: RegExp;
17
+ export declare const MONTH_RE: RegExp;
18
+ export declare function validateTime(raw: unknown): string;
19
+ export declare function normalizeDate(d: unknown, field?: string): string;
20
+ export declare function normalizeMonth(m: unknown, field?: string): string;
21
+ export interface BillRecordInput {
22
+ category: string;
23
+ amount: number;
24
+ time: string;
25
+ account: string;
26
+ ledger: string;
27
+ currency: string;
28
+ note: string;
29
+ }
30
+ export declare function validateRecord(raw: Record<string, unknown>): BillRecordInput;
31
+ //# sourceMappingURL=category.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category.d.ts","sourceRoot":"","sources":["../../src/policy/category.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,uEAAwE,CAAC;AAChG,eAAO,MAAM,SAAS,iDAAkD,CAAC;AACzE,eAAO,MAAM,UAAU,6BAA8B,CAAC;AACtD,eAAO,MAAM,MAAM,+HAAwD,CAAC;AAC5E,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7C,eAAO,MAAM,QAAQ;;;;;CAAoE,CAAC;AAE1F,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7C;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAiBrD;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQnD;AAED,eAAO,MAAM,WAAW,QAA2D,CAAC;AACpF,eAAO,MAAM,OAAO,QAAwB,CAAC;AAC7C,eAAO,MAAM,QAAQ,QAA4B,CAAC;AAQlD,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAajD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,SAAS,GAAG,MAAM,CAUhE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,SAAU,GAAG,MAAM,CAKlE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CACjE;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAkB5E"}
@@ -0,0 +1,115 @@
1
+ // 口径层·分类与金额(老家 references/categories.md + scripts/validators.py 对应)。
2
+ // 支出 L1 10 + 收入 L1 6 + 借贷/分期/转账隔离;amount 符号即分类依据(支出负/收入正),不单设 type 列。
3
+ import { BillPolicyError } from '../fetch/errors.js';
4
+ export const EXPENSE_L1 = ['餐饮', '居家', '穿着', '出行', '玩乐', '学习', '健康', '社交', '宠物', '其他'];
5
+ export const INCOME_L1 = ['工资', '奖金', '兼职', '投资', '其他收入', '退款'];
6
+ export const SPECIAL_L1 = ['借贷', '分期', '转账'];
7
+ export const ALL_L1 = [...EXPENSE_L1, ...INCOME_L1, ...SPECIAL_L1];
8
+ export const DEFAULTS = { account: '', ledger: '生活', currency: '人民币', note: '' };
9
+ export function l1Of(category) {
10
+ return category.split('/')[0].trim();
11
+ }
12
+ // 分类校验:须含 L1(允许 L1/L2/L3 三级 / 分隔);旧数据无 / 视为 L1;未知 L1 阻断。
13
+ export function validateCategory(raw) {
14
+ if (typeof raw !== 'string' || raw.trim().length === 0) {
15
+ throw new BillPolicyError('POLICY_BAD_CATEGORY', 'category 不能为空');
16
+ }
17
+ const s = raw.trim();
18
+ const l1 = l1Of(s);
19
+ if (!ALL_L1.includes(l1)) {
20
+ throw new BillPolicyError('POLICY_BAD_CATEGORY', '未知 L1 分类:' + l1);
21
+ }
22
+ const parts = s.split('/').map((p) => p.trim());
23
+ if (parts.some((p) => p.length === 0)) {
24
+ throw new BillPolicyError('POLICY_BAD_CATEGORY', '分类层级含空段');
25
+ }
26
+ if (parts.length > 3) {
27
+ throw new BillPolicyError('POLICY_BAD_CATEGORY', '分类至多 L1/L2/L3 三级');
28
+ }
29
+ return s;
30
+ }
31
+ // 金额:带符号浮点,支出负/收入正,零阻断(符号即分类依据)。
32
+ export function validateAmount(raw) {
33
+ const n = typeof raw === 'string' && raw.trim() !== '' ? Number(raw.trim()) : raw;
34
+ if (typeof n !== 'number' || !Number.isFinite(n)) {
35
+ throw new BillPolicyError('POLICY_BAD_AMOUNT', 'amount 须为带符号数字');
36
+ }
37
+ if (n === 0)
38
+ throw new BillPolicyError('POLICY_BAD_AMOUNT', 'amount 不得为 0');
39
+ if (Math.abs(n) > 1e12)
40
+ throw new BillPolicyError('POLICY_BAD_AMOUNT', 'amount 超界');
41
+ return Math.round(n * 100) / 100;
42
+ }
43
+ export const DATETIME_RE = /^(\d{4})-(\d{2})-(\d{2})(?: (\d{2}):(\d{2}):(\d{2}))?$/;
44
+ export const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
45
+ export const MONTH_RE = /^\d{4}-(0[1-9]|1[0-2])$/;
46
+ function realDate(y, m, d) {
47
+ const dt = new Date(y, m - 1, d);
48
+ return dt.getFullYear() === y && dt.getMonth() === m - 1 && dt.getDate() === d;
49
+ }
50
+ // 时间:YYYY-MM-DD HH:mm:ss 或 YYYY-MM-DD(补 12:00:00);非法阻断。
51
+ export function validateTime(raw) {
52
+ if (typeof raw !== 'string' || raw.trim().length === 0) {
53
+ throw new BillPolicyError('POLICY_BAD_TIME', 'time 不能为空');
54
+ }
55
+ const s = raw.trim().replace(/\//g, '-');
56
+ const m = DATETIME_RE.exec(s);
57
+ if (!m)
58
+ throw new BillPolicyError('POLICY_BAD_TIME', 'time 格式非法');
59
+ const y = Number(m[1]);
60
+ const mo = Number(m[2]);
61
+ const d = Number(m[3]);
62
+ if (!realDate(y, mo, d))
63
+ throw new BillPolicyError('POLICY_BAD_TIME', 'time 非真实日期');
64
+ if (m[4] === undefined)
65
+ return s + ' 12:00:00';
66
+ const hh = Number(m[4]);
67
+ const mm = Number(m[5]);
68
+ const ss = Number(m[6]);
69
+ if (hh > 23 || mm > 59 || ss > 59)
70
+ throw new BillPolicyError('POLICY_BAD_TIME', 'time 时分秒非法');
71
+ return s;
72
+ }
73
+ export function normalizeDate(d, field = 'date') {
74
+ if (typeof d !== 'string' || d.trim().length === 0) {
75
+ throw new BillPolicyError('POLICY_BAD_TIME', field + ' 须为日期字符串');
76
+ }
77
+ let s = d.trim().replace(/\//g, '-').replace(/\./g, '-');
78
+ if (/^\d{8}$/.test(s))
79
+ s = s.slice(0, 4) + '-' + s.slice(4, 6) + '-' + s.slice(6);
80
+ if (!DATE_RE.test(s))
81
+ throw new BillPolicyError('POLICY_BAD_TIME', field + ' 格式非法');
82
+ const parts2 = s.split('-').map(Number);
83
+ if (!realDate(parts2[0], parts2[1], parts2[2]))
84
+ throw new BillPolicyError('POLICY_BAD_TIME', field + ' 非真实日期');
85
+ return s;
86
+ }
87
+ export function normalizeMonth(m, field = 'month') {
88
+ if (typeof m !== 'string' || !MONTH_RE.test(m.trim())) {
89
+ throw new BillPolicyError('POLICY_BAD_TIME', field + ' 格式非法');
90
+ }
91
+ return m.trim();
92
+ }
93
+ // 整单校验:7 字段(account/ledger/currency/note 可缺省);坏输入阻断。
94
+ export function validateRecord(raw) {
95
+ const category = validateCategory(raw.category);
96
+ const amount = validateAmount(raw.amount);
97
+ const time = raw.time === undefined || raw.time === null || raw.time === ''
98
+ ? new Date().toISOString().slice(0, 10) + ' 12:00:00'
99
+ : validateTime(raw.time);
100
+ const str = (v, name) => {
101
+ if (v === undefined || v === null)
102
+ return '';
103
+ if (typeof v !== 'string')
104
+ throw new BillPolicyError('POLICY_BAD_INPUT', name + ' 须为字符串');
105
+ return v;
106
+ };
107
+ return {
108
+ category, amount, time,
109
+ account: raw.account === undefined || raw.account === '' ? DEFAULTS.account : str(raw.account, 'account'),
110
+ ledger: raw.ledger === undefined || raw.ledger === '' ? DEFAULTS.ledger : str(raw.ledger, 'ledger'),
111
+ currency: raw.currency === undefined || raw.currency === '' ? DEFAULTS.currency : str(raw.currency, 'currency'),
112
+ note: str(raw.note ?? '', 'note'),
113
+ };
114
+ }
115
+ //# sourceMappingURL=category.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category.js","sourceRoot":"","sources":["../../src/policy/category.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type GoalOp = 'set-budget' | 'budget' | 'set-saving' | 'saving';
2
+ export declare function parseGoalOp(params: Record<string, unknown>): GoalOp;
3
+ export declare function validateBudgetAmount(raw: unknown): number;
4
+ export declare function validateSetBudget(params: Record<string, unknown>): {
5
+ month: string;
6
+ category: string;
7
+ amount: number;
8
+ force: boolean;
9
+ };
10
+ export declare function validateSetSaving(params: Record<string, unknown>): {
11
+ name: string;
12
+ amount: number;
13
+ deadline: string | null;
14
+ };
15
+ //# sourceMappingURL=goals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goals.d.ts","sourceRoot":"","sources":["../../src/policy/goals.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEvE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAInE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAMzD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAKtI;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAQ5H"}
@@ -0,0 +1,33 @@
1
+ // 口径层·目标 params 校验(老家 goal/cli.py 对应:set-budget/budget/set-saving/saving)。
2
+ // 覆盖语义:同月同分类预算已存在默认拒绝(conflict),AI 层提示用户确认后加 --force 重跑。
3
+ import { BillPolicyError } from '../fetch/errors.js';
4
+ import { normalizeMonth, normalizeDate } from './category.js';
5
+ export function parseGoalOp(params) {
6
+ const op = params.op === undefined ? 'budget' : params.op;
7
+ if (op === 'set-budget' || op === 'budget' || op === 'set-saving' || op === 'saving')
8
+ return op;
9
+ throw new BillPolicyError('POLICY_BAD_INPUT', 'op 非法(期望 set-budget/budget/set-saving/saving):' + JSON.stringify(op));
10
+ }
11
+ export function validateBudgetAmount(raw) {
12
+ const n = typeof raw === 'string' ? Number(raw.trim()) : raw;
13
+ if (typeof n !== 'number' || !Number.isFinite(n) || n <= 0) {
14
+ throw new BillPolicyError('POLICY_BAD_INPUT', '预算 amount 须为正数:' + JSON.stringify(raw));
15
+ }
16
+ return Math.round(n * 100) / 100;
17
+ }
18
+ export function validateSetBudget(params) {
19
+ const amount = validateBudgetAmount(params.amount);
20
+ const month = params.month === undefined ? new Date().toISOString().slice(0, 7) : normalizeMonth(params.month);
21
+ const category = typeof params.category === 'string' && params.category ? params.category.trim() : '';
22
+ return { month, category, amount, force: params.force === true };
23
+ }
24
+ export function validateSetSaving(params) {
25
+ if (typeof params.name !== 'string' || !params.name.trim()) {
26
+ throw new BillPolicyError('POLICY_MISSING_SLOT', '缺槽位 name(储蓄目标名)');
27
+ }
28
+ const amount = validateBudgetAmount(params.amount);
29
+ const deadline = params.deadline === undefined || params.deadline === null || params.deadline === ''
30
+ ? null : normalizeDate(params.deadline, 'deadline');
31
+ return { name: params.name.trim(), amount, deadline };
32
+ }
33
+ //# sourceMappingURL=goals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goals.js","sourceRoot":"","sources":["../../src/policy/goals.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,yDAAyD;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9D,MAAM,UAAU,WAAW,CAAC,MAA+B;IACzD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1D,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAChG,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,gDAAgD,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AACvH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7D,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAA+B;IAC/D,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/G,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAA+B;IAC/D,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE;QAClG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,13 @@
1
+ export { EXPENSE_L1, INCOME_L1, SPECIAL_L1, ALL_L1, DEFAULTS, l1Of, validateCategory, validateAmount, validateTime, normalizeDate, normalizeMonth, validateRecord } from './category.js';
2
+ export type { BillL1, BillRecordInput } from './category.js';
3
+ export { parseRecordOp, needId, validateAddInput, validateUpdateInput, resolveQueryDate, resolveRange } from './record.js';
4
+ export type { RecordOp } from './record.js';
5
+ export { parseOverviewKind, parseCompareKind, parseTrendKind, needMonth, needRange } from './analysis.js';
6
+ export type { OverviewKind, CompareKind, TrendKind } from './analysis.js';
7
+ export { parseGoalOp, validateBudgetAmount, validateSetBudget, validateSetSaving } from './goals.js';
8
+ export type { GoalOp } from './goals.js';
9
+ export { parseAccountOp, needName, validateTransfer, TRANSFER_OUT_CATEGORY, TRANSFER_IN_CATEGORY, TRANSFER_LEDGER } from './accounts.js';
10
+ export type { AccountOp } from './accounts.js';
11
+ export { routeWakeword, WAKE_TABLE } from './wakewords.js';
12
+ export type { BillKey, WakeRoute, WakeEntry } from './wakewords.js';
13
+ //# 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,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzL,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3H,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1G,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACrG,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzI,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { EXPENSE_L1, INCOME_L1, SPECIAL_L1, ALL_L1, DEFAULTS, l1Of, validateCategory, validateAmount, validateTime, normalizeDate, normalizeMonth, validateRecord } from './category.js';
2
+ export { parseRecordOp, needId, validateAddInput, validateUpdateInput, resolveQueryDate, resolveRange } from './record.js';
3
+ export { parseOverviewKind, parseCompareKind, parseTrendKind, needMonth, needRange } from './analysis.js';
4
+ export { parseGoalOp, validateBudgetAmount, validateSetBudget, validateSetSaving } from './goals.js';
5
+ export { parseAccountOp, needName, validateTransfer, TRANSFER_OUT_CATEGORY, TRANSFER_IN_CATEGORY, TRANSFER_LEDGER } from './accounts.js';
6
+ export { routeWakeword, WAKE_TABLE } from './wakewords.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEzL,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3H,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1G,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErG,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEzI,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { validateRecord } from './category.js';
2
+ export type RecordOp = 'add' | 'update' | 'undo' | 'restore';
3
+ export declare function parseRecordOp(params: Record<string, unknown>): RecordOp;
4
+ export declare function needId(params: Record<string, unknown>): number;
5
+ export declare function validateAddInput(params: Record<string, unknown>): ReturnType<typeof validateRecord>;
6
+ export declare function validateUpdateInput(params: Record<string, unknown>): {
7
+ id: number;
8
+ patch: Record<string, unknown>;
9
+ };
10
+ export declare function resolveQueryDate(params: Record<string, unknown>): string;
11
+ export declare function resolveRange(params: Record<string, unknown>): {
12
+ start: string;
13
+ end: string;
14
+ };
15
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/policy/record.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkD,cAAc,EAAiB,MAAM,eAAe,CAAC;AAE9G,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE7D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAIvE;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAM9D;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAEnG;AAGD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAgBnH;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMxE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAQ5F"}
@@ -0,0 +1,62 @@
1
+ // 口径层·记账 params 校验(老家 record_bill.py + write/cli.py 对应)。
2
+ // op 分流:add(单笔/批量逐笔)/ update / undo(软删)/ restore;拍账单图片识别以外置为准。
3
+ import { BillPolicyError } from '../fetch/errors.js';
4
+ import { validateAmount, validateCategory, validateTime, validateRecord, normalizeDate } from './category.js';
5
+ export function parseRecordOp(params) {
6
+ const op = params.op === undefined ? 'add' : params.op;
7
+ if (op === 'add' || op === 'update' || op === 'undo' || op === 'restore')
8
+ return op;
9
+ throw new BillPolicyError('POLICY_BAD_INPUT', 'op 非法(期望 add/update/undo/restore):' + JSON.stringify(op));
10
+ }
11
+ export function needId(params) {
12
+ const id = params.id;
13
+ if (!Number.isInteger(id) || id <= 0) {
14
+ throw new BillPolicyError('POLICY_BAD_INPUT', '须给正整数 id');
15
+ }
16
+ return id;
17
+ }
18
+ // add:7 字段强校验(批量由调用方逐笔调本函数,不在此展开数组)。
19
+ export function validateAddInput(params) {
20
+ return validateRecord(params);
21
+ }
22
+ // update:id 必填 + 至少改一个字段(amount/category/time 分项校验)。
23
+ export function validateUpdateInput(params) {
24
+ const id = needId(params);
25
+ const patch = {};
26
+ if (params.category !== undefined)
27
+ patch.category = validateCategory(params.category);
28
+ if (params.amount !== undefined)
29
+ patch.amount = validateAmount(params.amount);
30
+ if (params.time !== undefined)
31
+ patch.time = validateTime(params.time);
32
+ for (const k of ['account', 'ledger', 'currency', 'note']) {
33
+ if (params[k] !== undefined) {
34
+ if (typeof params[k] !== 'string')
35
+ throw new BillPolicyError('POLICY_BAD_INPUT', k + ' 须为字符串');
36
+ patch[k] = params[k];
37
+ }
38
+ }
39
+ if (!Object.keys(patch).length) {
40
+ throw new BillPolicyError('POLICY_BAD_INPUT', 'update 至少改一个字段(category/amount/time/account/ledger/currency/note)');
41
+ }
42
+ return { id, patch };
43
+ }
44
+ export function resolveQueryDate(params) {
45
+ if (params.date === undefined || params.date === null || params.date === '') {
46
+ return new Date().toISOString().slice(0, 10);
47
+ }
48
+ if (typeof params.date !== 'string')
49
+ throw new BillPolicyError('POLICY_BAD_TIME', 'date 须为字符串');
50
+ return normalizeDate(params.date);
51
+ }
52
+ export function resolveRange(params) {
53
+ if (params.start === undefined || params.end === undefined) {
54
+ throw new BillPolicyError('POLICY_MISSING_SLOT', '缺槽位 start/end(期望 YYYY-MM-DD)');
55
+ }
56
+ const start = normalizeDate(params.start, 'start');
57
+ const end = normalizeDate(params.end, 'end');
58
+ if (start > end)
59
+ throw new BillPolicyError('POLICY_BAD_INPUT', 'start 不得晚于 end:' + start + '~' + end);
60
+ return { start, end };
61
+ }
62
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/policy/record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type BillKey = 'bill.record.add' | 'bill.record.update' | 'bill.record.today' | 'bill.record.range' | 'bill.record.search' | 'bill.record.detail' | 'bill.analysis.overview' | 'bill.analysis.compare' | 'bill.analysis.trend' | 'bill.goal.write' | 'bill.goal.query' | 'bill.account.write' | 'bill.account.query' | 'bill.link.submit' | 'bill.setup.run' | 'bill.help.lookup';
2
+ export interface WakeRoute {
3
+ key: BillKey;
4
+ params: Record<string, unknown>;
5
+ }
6
+ export interface WakeEntry {
7
+ phrase: string;
8
+ key: BillKey;
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,iBAAiB,GAAG,oBAAoB,GACxC,mBAAmB,GAAG,mBAAmB,GAAG,oBAAoB,GAAG,oBAAoB,GACvF,wBAAwB,GAAG,uBAAuB,GAAG,qBAAqB,GAC1E,iBAAiB,GAAG,iBAAiB,GACrC,oBAAoB,GAAG,oBAAoB,GAC3C,kBAAkB,GAAG,gBAAgB,GACrC,kBAAkB,CAAC;AAEvB,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,EA8FjC,CAAC;AAKF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,SAAS,CAUxF"}
@@ -0,0 +1,121 @@
1
+ // 口径层·唤醒词路由:自然语言 → 16 联动 key;最长匹配;无命中/缺槽位 throw。
2
+ // HELP 速查唯一上游;改这里,HELP 构建期跟进。77 短语 = 72 功能 + 4 HELP + 1 补齐读链(查账单详情,老家无直接词)。
3
+ import { BillPolicyError } from '../fetch/errors.js';
4
+ // 全量唤醒词表(HELP 速查唯一上游;改这里,HELP 构建期跟进)。
5
+ export const WAKE_TABLE = [
6
+ // HELP 现找 4 条(§141~144,不在自身 HELP 展示中列出自身,查询走 lookup)。
7
+ { phrase: '饼干记账 HELP', key: 'bill.help.lookup' },
8
+ { phrase: '饼干记账帮助', key: 'bill.help.lookup' },
9
+ { phrase: '查帮助', key: 'bill.help.lookup' },
10
+ { phrase: '能做什么', key: 'bill.help.lookup' },
11
+ // record.add 13(#11/#12/#13/#14/#15/#16/#17/#18/#19/#20/#21/#22:支出/收入/拍账单/批量/退款/报销/到账/借出/借入/收回/偿还/分期 + 记一笔通用)。
12
+ { phrase: '记支出', key: 'bill.record.add', preset: { kind: 'expense' } },
13
+ { phrase: '记收入', key: 'bill.record.add', preset: { kind: 'income' } },
14
+ { phrase: '拍账单', key: 'bill.record.add', preset: { kind: 'photo' } },
15
+ { phrase: '批量录入', key: 'bill.record.add', preset: { kind: 'batch' } },
16
+ { phrase: '记退款', key: 'bill.record.add', preset: { kind: 'refund' } },
17
+ { phrase: '记报销', key: 'bill.record.add', preset: { kind: 'reimburse' } },
18
+ { phrase: '报销到账', key: 'bill.record.add', preset: { kind: 'reimburse-done' } },
19
+ { phrase: '记借出', key: 'bill.record.add', preset: { kind: 'lend' } },
20
+ { phrase: '记借入', key: 'bill.record.add', preset: { kind: 'borrow' } },
21
+ { phrase: '记收回', key: 'bill.record.add', preset: { kind: 'collect' } },
22
+ { phrase: '记偿还', key: 'bill.record.add', preset: { kind: 'repay' } },
23
+ { phrase: '记分期', key: 'bill.record.add', preset: { kind: 'installment' } },
24
+ { phrase: '记一笔', key: 'bill.record.add' },
25
+ // record.update 3(#23/#24/#25:改/撤销/恢复)。
26
+ { phrase: '改记录', key: 'bill.record.update', needs: ['id'] },
27
+ { phrase: '撤销', key: 'bill.record.update', preset: { op: 'undo' }, needs: ['id'] },
28
+ { phrase: '恢复', key: 'bill.record.update', preset: { op: 'restore' }, needs: ['id'] },
29
+ // record.today 5(#51~#54:今天/昨天/某天/最近 + 查账单通用别名;查账单详情走 detail 最长匹配)。
30
+ { phrase: '查今天', key: 'bill.record.today' },
31
+ { phrase: '查昨天', key: 'bill.record.today', preset: { date: 'yesterday' } },
32
+ { phrase: '查某天', key: 'bill.record.today', needs: ['date'] },
33
+ { phrase: '查最近', key: 'bill.record.today', preset: { recent: true } },
34
+ { phrase: '查账单', key: 'bill.record.today' },
35
+ // record.range 6(#55~#58/#61/#62:周/月/区间/分类/账户/账本)。
36
+ { phrase: '查周', key: 'bill.record.range', preset: { range: 'week' } },
37
+ { phrase: '查月', key: 'bill.record.range', preset: { range: 'month' } },
38
+ { phrase: '查区间', key: 'bill.record.range', needs: ['start', 'end'] },
39
+ { phrase: '查分类', key: 'bill.record.range', needs: ['category'] },
40
+ { phrase: '查账户', key: 'bill.record.range', needs: ['account'] },
41
+ { phrase: '查账本', key: 'bill.record.range', needs: ['ledger'] },
42
+ // record.search 5(#59/#60/#63/#64/#65:搜备注/查标签/查欠款/查待报销/查分期)。
43
+ { phrase: '搜备注', key: 'bill.record.search', needs: ['q'] },
44
+ { phrase: '查标签', key: 'bill.record.search', preset: { kind: 'tag' }, needs: ['tag'] },
45
+ { phrase: '查欠款', key: 'bill.record.search', preset: { kind: 'debt' } },
46
+ { phrase: '查待报销', key: 'bill.record.search', preset: { kind: 'reimburse' } },
47
+ { phrase: '查分期', key: 'bill.record.search', preset: { kind: 'installment' } },
48
+ // record.detail 1(单条详情,id 分流)。
49
+ { phrase: '查账单详情', key: 'bill.record.detail', needs: ['id'] },
50
+ // analysis.overview 9(#81/#82/#83/#84/#85/#86/#87/#88/#98:月度/年度/总览/周报/分类/账户/账本/结构/统计)。
51
+ { phrase: '看月度', key: 'bill.analysis.overview', preset: { kind: 'monthly' } },
52
+ { phrase: '看年度', key: 'bill.analysis.overview', preset: { kind: 'yearly' } },
53
+ { phrase: '看总览', key: 'bill.analysis.overview', preset: { kind: 'overview' } },
54
+ { phrase: '看周报', key: 'bill.analysis.overview', preset: { kind: 'week' } },
55
+ { phrase: '看分类', key: 'bill.analysis.overview', preset: { kind: 'category' } },
56
+ { phrase: '看账户', key: 'bill.analysis.overview', preset: { kind: 'account' } },
57
+ { phrase: '看账本', key: 'bill.analysis.overview', preset: { kind: 'ledger' } },
58
+ { phrase: '看结构', key: 'bill.analysis.overview', preset: { kind: 'structure' } },
59
+ { phrase: '做统计', key: 'bill.analysis.overview', preset: { kind: 'stats' } },
60
+ // analysis.compare 4(#89/#90/#91/#92:对比/双区间/同比/分类对比)。
61
+ { phrase: '看对比', key: 'bill.analysis.compare', preset: { kind: 'period' } },
62
+ { phrase: '看双区间', key: 'bill.analysis.compare', preset: { kind: 'range' } },
63
+ { phrase: '看同比', key: 'bill.analysis.compare', preset: { kind: 'yoy' } },
64
+ { phrase: '看分类对比', key: 'bill.analysis.compare', preset: { kind: 'category' } },
65
+ // analysis.trend 12(#93~#105:趋势/分类趋势/大额/高频/分布/活跃/洞察/异常/借贷/报销/分期/退款)。
66
+ { phrase: '看趋势', key: 'bill.analysis.trend', preset: { kind: 'trend' } },
67
+ { phrase: '看分类趋势', key: 'bill.analysis.trend', preset: { kind: 'category' } },
68
+ { phrase: '看大额', key: 'bill.analysis.trend', preset: { kind: 'top' } },
69
+ { phrase: '看高频', key: 'bill.analysis.trend', preset: { kind: 'frequent' } },
70
+ { phrase: '看分布', key: 'bill.analysis.trend', preset: { kind: 'distribution' } },
71
+ { phrase: '看活跃', key: 'bill.analysis.trend', preset: { kind: 'activity' } },
72
+ { phrase: '看洞察', key: 'bill.analysis.trend', preset: { kind: 'insight' } },
73
+ { phrase: '看异常', key: 'bill.analysis.trend', preset: { kind: 'anomaly' } },
74
+ { phrase: '看借贷', key: 'bill.analysis.trend', preset: { kind: 'debt' } },
75
+ { phrase: '看报销', key: 'bill.analysis.trend', preset: { kind: 'reimburse' } },
76
+ { phrase: '看分期', key: 'bill.analysis.trend', preset: { kind: 'installment' } },
77
+ { phrase: '看退款', key: 'bill.analysis.trend', preset: { kind: 'refund' } },
78
+ // goal.write 2(#111/#113:设定预算/设定目标)。
79
+ { phrase: '设定预算', key: 'bill.goal.write', preset: { op: 'set-budget' }, needs: ['amount'] },
80
+ { phrase: '设定目标', key: 'bill.goal.write', preset: { op: 'set-saving' }, needs: ['name', 'amount'] },
81
+ // goal.query 2(#112/#114:看预算/看目标)。
82
+ { phrase: '看预算', key: 'bill.goal.query', preset: { op: 'budget' } },
83
+ { phrase: '看目标', key: 'bill.goal.query', preset: { op: 'saving' } },
84
+ // account.write 3(#121/#122/#123:新增/改/转账)。
85
+ { phrase: '新增账户', key: 'bill.account.write', preset: { op: 'add' }, needs: ['name'] },
86
+ { phrase: '改账户', key: 'bill.account.write', preset: { op: 'update' }, needs: ['name'] },
87
+ { phrase: '账户转账', key: 'bill.account.write', preset: { op: 'transfer' }, needs: ['amount', 'from', 'to'] },
88
+ // account.query 1(#124:看账户汇总)。
89
+ { phrase: '看账户汇总', key: 'bill.account.query' },
90
+ // link.submit 2(#131/#132:买东西/吃饭;主操作复用 record.add,跨技能仅复制 prompt)。
91
+ { phrase: '买东西', key: 'bill.link.submit', preset: { scene: 'purchase' } },
92
+ { phrase: '吃饭', key: 'bill.link.submit', preset: { scene: 'meal' } },
93
+ // setup.run 5(#1~#5:初始化/初始化状态/备份/恢复备份/导入)。
94
+ { phrase: '初始化', key: 'bill.setup.run', preset: { op: 'init' } },
95
+ { phrase: '初始化状态', key: 'bill.setup.run', preset: { op: 'init-status' } },
96
+ { phrase: '备份', key: 'bill.setup.run', preset: { op: 'backup-create' } },
97
+ { phrase: '恢复备份', key: 'bill.setup.run', preset: { op: 'restore' } },
98
+ { phrase: '导入', key: 'bill.setup.run', preset: { op: 'import' }, needs: ['file'] },
99
+ ];
100
+ // 最长匹配优先(“看分类对比”不落入“看分类”,“初始化状态”不落入“初始化”,“报销到账”不落入“记报销”)。
101
+ const SORTED = [...WAKE_TABLE].sort((a, b) => b.phrase.length - a.phrase.length);
102
+ export function routeWakeword(text, ctx = {}) {
103
+ if (typeof text !== 'string' || text.length === 0)
104
+ throw new BillPolicyError('POLICY_NO_MATCH', '唤醒词为空');
105
+ const hit = SORTED.find((e) => text.includes(e.phrase));
106
+ if (!hit)
107
+ throw new BillPolicyError('POLICY_NO_MATCH', '无命中唤醒词:' + text);
108
+ for (const s of hit.needs || []) {
109
+ if (ctx[s] === undefined || ctx[s] === null || ctx[s] === '') {
110
+ throw new BillPolicyError('POLICY_MISSING_SLOT', '缺槽位 ' + s + ':' + hit.phrase);
111
+ }
112
+ }
113
+ return { key: hit.key, params: { ...(hit.preset || {}), ...pickCtx(ctx, hit.needs || []) } };
114
+ }
115
+ function pickCtx(ctx, needs) {
116
+ const o = {};
117
+ for (const k of needs)
118
+ o[k] = ctx[k];
119
+ return o;
120
+ }
121
+ //# 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,6 @@
1
+ import { type Envelope, type EnvelopeShape } from 'base-link-core';
2
+ export declare const BILL_KEY_SHAPES: Record<string, EnvelopeShape>;
3
+ export declare function billShapeFor(key: string): EnvelopeShape;
4
+ export declare function buildBillEnvelope(key: string, data: unknown): Envelope;
5
+ export declare function parseBillEnvelope(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,CAiBzD,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"}