@skillfm/local 2.7.2 → 2.7.4

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 (126) hide show
  1. package/dist/checkup/daily-push.d.ts +29 -0
  2. package/dist/checkup/daily-push.d.ts.map +1 -0
  3. package/dist/checkup/daily-push.js +86 -0
  4. package/dist/checkup/daily-push.js.map +1 -0
  5. package/dist/checkup/dimension-1-usage.d.ts +22 -0
  6. package/dist/checkup/dimension-1-usage.d.ts.map +1 -0
  7. package/dist/checkup/dimension-1-usage.js +115 -0
  8. package/dist/checkup/dimension-1-usage.js.map +1 -0
  9. package/dist/checkup/dimension-3-files.d.ts +23 -0
  10. package/dist/checkup/dimension-3-files.d.ts.map +1 -0
  11. package/dist/checkup/dimension-3-files.js +165 -0
  12. package/dist/checkup/dimension-3-files.js.map +1 -0
  13. package/dist/checkup/dimension-4-context.d.ts +18 -0
  14. package/dist/checkup/dimension-4-context.d.ts.map +1 -0
  15. package/dist/checkup/dimension-4-context.js +177 -0
  16. package/dist/checkup/dimension-4-context.js.map +1 -0
  17. package/dist/checkup/index.d.ts +11 -0
  18. package/dist/checkup/index.d.ts.map +1 -0
  19. package/dist/checkup/index.js +10 -0
  20. package/dist/checkup/index.js.map +1 -0
  21. package/dist/checkup/report.d.ts +21 -0
  22. package/dist/checkup/report.d.ts.map +1 -0
  23. package/dist/checkup/report.js +133 -0
  24. package/dist/checkup/report.js.map +1 -0
  25. package/dist/checkup/score.d.ts +27 -0
  26. package/dist/checkup/score.d.ts.map +1 -0
  27. package/dist/checkup/score.js +101 -0
  28. package/dist/checkup/score.js.map +1 -0
  29. package/dist/checkup/types.d.ts +64 -0
  30. package/dist/checkup/types.d.ts.map +1 -0
  31. package/dist/checkup/types.js +5 -0
  32. package/dist/checkup/types.js.map +1 -0
  33. package/dist/connectors/anthropic.d.ts.map +1 -1
  34. package/dist/connectors/anthropic.js +3 -0
  35. package/dist/connectors/anthropic.js.map +1 -1
  36. package/dist/guard/bin.js +0 -0
  37. package/dist/index.js +4 -2
  38. package/dist/index.js.map +1 -1
  39. package/dist/mcp/index.d.ts.map +1 -1
  40. package/dist/mcp/index.js +27 -0
  41. package/dist/mcp/index.js.map +1 -1
  42. package/dist/mcp/tools/checkup.d.ts +21 -0
  43. package/dist/mcp/tools/checkup.d.ts.map +1 -0
  44. package/dist/mcp/tools/checkup.js +35 -0
  45. package/dist/mcp/tools/checkup.js.map +1 -0
  46. package/dist/mcp/tools/explain-provider-key.d.ts.map +1 -1
  47. package/dist/mcp/tools/explain-provider-key.js +15 -13
  48. package/dist/mcp/tools/explain-provider-key.js.map +1 -1
  49. package/dist/mcp/tools/index.d.ts +6 -0
  50. package/dist/mcp/tools/index.d.ts.map +1 -1
  51. package/dist/mcp/tools/index.js +56 -4
  52. package/dist/mcp/tools/index.js.map +1 -1
  53. package/dist/mcp/tools/setup-gateway.d.ts +16 -0
  54. package/dist/mcp/tools/setup-gateway.d.ts.map +1 -0
  55. package/dist/mcp/tools/setup-gateway.js +79 -0
  56. package/dist/mcp/tools/setup-gateway.js.map +1 -0
  57. package/dist/mcp/tools/show-my-usage.d.ts +26 -0
  58. package/dist/mcp/tools/show-my-usage.d.ts.map +1 -0
  59. package/dist/mcp/tools/show-my-usage.js +68 -0
  60. package/dist/mcp/tools/show-my-usage.js.map +1 -0
  61. package/dist/mcp-stdio/bin.js +0 -0
  62. package/dist/reconciliation/engine.d.ts +30 -0
  63. package/dist/reconciliation/engine.d.ts.map +1 -0
  64. package/dist/reconciliation/engine.js +62 -0
  65. package/dist/reconciliation/engine.js.map +1 -0
  66. package/dist/reconciliation/index.d.ts +8 -0
  67. package/dist/reconciliation/index.d.ts.map +1 -0
  68. package/dist/reconciliation/index.js +8 -0
  69. package/dist/reconciliation/index.js.map +1 -0
  70. package/dist/reconciliation/l1-reconciler.d.ts +29 -0
  71. package/dist/reconciliation/l1-reconciler.d.ts.map +1 -0
  72. package/dist/reconciliation/l1-reconciler.js +144 -0
  73. package/dist/reconciliation/l1-reconciler.js.map +1 -0
  74. package/dist/reconciliation/l2-reconciler.d.ts +21 -0
  75. package/dist/reconciliation/l2-reconciler.d.ts.map +1 -0
  76. package/dist/reconciliation/l2-reconciler.js +241 -0
  77. package/dist/reconciliation/l2-reconciler.js.map +1 -0
  78. package/dist/reconciliation/types.d.ts +49 -0
  79. package/dist/reconciliation/types.d.ts.map +1 -0
  80. package/dist/reconciliation/types.js +9 -0
  81. package/dist/reconciliation/types.js.map +1 -0
  82. package/dist/save-token/e1-router.d.ts +7 -0
  83. package/dist/save-token/e1-router.d.ts.map +1 -0
  84. package/dist/save-token/e1-router.js +112 -0
  85. package/dist/save-token/e1-router.js.map +1 -0
  86. package/dist/save-token/e2-cache.d.ts +7 -0
  87. package/dist/save-token/e2-cache.d.ts.map +1 -0
  88. package/dist/save-token/e2-cache.js +128 -0
  89. package/dist/save-token/e2-cache.js.map +1 -0
  90. package/dist/save-token/e3-batch.d.ts +7 -0
  91. package/dist/save-token/e3-batch.d.ts.map +1 -0
  92. package/dist/save-token/e3-batch.js +80 -0
  93. package/dist/save-token/e3-batch.js.map +1 -0
  94. package/dist/save-token/gateway-setup.d.ts +27 -0
  95. package/dist/save-token/gateway-setup.d.ts.map +1 -0
  96. package/dist/save-token/gateway-setup.js +200 -0
  97. package/dist/save-token/gateway-setup.js.map +1 -0
  98. package/dist/save-token/index.d.ts +13 -0
  99. package/dist/save-token/index.d.ts.map +1 -0
  100. package/dist/save-token/index.js +23 -0
  101. package/dist/save-token/index.js.map +1 -0
  102. package/dist/save-token/types.d.ts +46 -0
  103. package/dist/save-token/types.d.ts.map +1 -0
  104. package/dist/save-token/types.js +5 -0
  105. package/dist/save-token/types.js.map +1 -0
  106. package/dist/usage-local/index.d.ts +32 -0
  107. package/dist/usage-local/index.d.ts.map +1 -0
  108. package/dist/usage-local/index.js +32 -0
  109. package/dist/usage-local/index.js.map +1 -0
  110. package/dist/usage-local/model-pricing.d.ts +38 -0
  111. package/dist/usage-local/model-pricing.d.ts.map +1 -0
  112. package/dist/usage-local/model-pricing.js +230 -0
  113. package/dist/usage-local/model-pricing.js.map +1 -0
  114. package/dist/usage-local/openclaw-watcher.d.ts +35 -0
  115. package/dist/usage-local/openclaw-watcher.d.ts.map +1 -0
  116. package/dist/usage-local/openclaw-watcher.js +190 -0
  117. package/dist/usage-local/openclaw-watcher.js.map +1 -0
  118. package/dist/usage-local/store.d.ts +50 -0
  119. package/dist/usage-local/store.d.ts.map +1 -0
  120. package/dist/usage-local/store.js +201 -0
  121. package/dist/usage-local/store.js.map +1 -0
  122. package/dist/usage-local/types.d.ts +94 -0
  123. package/dist/usage-local/types.d.ts.map +1 -0
  124. package/dist/usage-local/types.js +6 -0
  125. package/dist/usage-local/types.js.map +1 -0
  126. package/package.json +2 -2
@@ -0,0 +1,29 @@
1
+ import type { CheckupReport } from './types.js';
2
+ export type PushTime = '07:00' | '09:00' | '12:00' | '18:00' | '21:00';
3
+ export interface DailyPushConfig {
4
+ enabled: boolean;
5
+ push_time: PushTime;
6
+ /** Pro 用户:异常即时 push */
7
+ pro_realtime_anomaly: boolean;
8
+ /** Tier */
9
+ is_pro: boolean;
10
+ }
11
+ export declare const DEFAULT_PUSH_CONFIG: DailyPushConfig;
12
+ /**
13
+ * 拼一条 Daily Push 文本 (短, 60-200 字, 适合 IM)
14
+ */
15
+ export declare function renderDailyPush(report: CheckupReport): string;
16
+ /**
17
+ * 异常即时 push (Pro feature) — 真严重的 finding 才 push
18
+ * Free 用户:跳过 (只 push daily)
19
+ */
20
+ export declare function shouldPushRealtimeAnomaly(report: CheckupReport, config: DailyPushConfig): boolean;
21
+ /**
22
+ * 拼异常 push 文案
23
+ */
24
+ export declare function renderAnomalyPush(report: CheckupReport): string;
25
+ /**
26
+ * 把 push_time HH:MM 转 cron 表达式
27
+ */
28
+ export declare function pushTimeToCron(pushTime: PushTime): string;
29
+ //# sourceMappingURL=daily-push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-push.d.ts","sourceRoot":"","sources":["../../src/checkup/daily-push.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,QAAQ,CAAC;IACpB,uBAAuB;IACvB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW;IACX,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,mBAAmB,EAAE,eAKjC,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA4B7D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAWjG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAa/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAGzD"}
@@ -0,0 +1,86 @@
1
+ // sdk/skillfm-local/src/checkup/daily-push.ts
2
+ //
3
+ // Daily Push 框架 (PRD V1.3 §10).
4
+ // Eric 拍板: 09:00 默认 + 用户 5 选 (7/9/12/18/21).
5
+ // Free 限 1 次/天 + Pro 异常即时.
6
+ //
7
+ // 文案规则 (PRD §10.2):
8
+ // OK: "[早安] 你家 AI 昨天 23 次调用 ¥4.30 (↓18%). 今日 #1: 上下文 87%"
9
+ // 禁: "你家 AI 想念你了" (Replika 类 emotional dependency)
10
+ export const DEFAULT_PUSH_CONFIG = {
11
+ enabled: true,
12
+ push_time: '09:00',
13
+ pro_realtime_anomaly: false,
14
+ is_pro: false,
15
+ };
16
+ /**
17
+ * 拼一条 Daily Push 文本 (短, 60-200 字, 适合 IM)
18
+ */
19
+ export function renderDailyPush(report) {
20
+ const lines = [];
21
+ const overall_emoji = report.health_score >= 90 ? '✨' : report.health_score >= 70 ? '✅' : report.health_score >= 50 ? '⚠️' : '🔴';
22
+ const trend = report.health_trend;
23
+ const trendStr = trend != null
24
+ ? (trend > 0 ? ` ↑${trend}` : trend < 0 ? ` ↓${-trend}` : '')
25
+ : '';
26
+ lines.push(`[早安 ☀️] 你家 AI 健康度 ${report.health_score}/100 ${overall_emoji}${trendStr}`);
27
+ if (report.usage_summary_lines.length > 0) {
28
+ // 取第一条对账 line (最有价值)
29
+ lines.push(report.usage_summary_lines[0]);
30
+ }
31
+ if (report.all_healthy) {
32
+ lines.push('✨ 5 维度全干净, 保持!');
33
+ }
34
+ else if (report.top_focus) {
35
+ lines.push(`今日 #1: ${report.top_focus.headline}`);
36
+ if (report.top_focus.fix_label && report.top_focus.fix_free_allowed) {
37
+ lines.push(` → ${report.top_focus.fix_label}`);
38
+ }
39
+ }
40
+ lines.push('');
41
+ lines.push('回 [skillfm] 看完整体检 / [skip] 跳过今日');
42
+ return lines.join('\n');
43
+ }
44
+ /**
45
+ * 异常即时 push (Pro feature) — 真严重的 finding 才 push
46
+ * Free 用户:跳过 (只 push daily)
47
+ */
48
+ export function shouldPushRealtimeAnomaly(report, config) {
49
+ if (!config.is_pro)
50
+ return false;
51
+ if (!config.pro_realtime_anomaly)
52
+ return false;
53
+ // 任何 dimension 有 critical finding → push
54
+ for (const dim of report.dimensions) {
55
+ if (dim.severity === 'critical')
56
+ return true;
57
+ }
58
+ // 任何 reconciliation 偏差 > 30% → push
59
+ // (这里 report 里没存 reconciliations 详情, 简化版只看 dimensions)
60
+ return false;
61
+ }
62
+ /**
63
+ * 拼异常 push 文案
64
+ */
65
+ export function renderAnomalyPush(report) {
66
+ const critFinding = report.dimensions
67
+ .flatMap((d) => d.findings)
68
+ .find((f) => f.severity === 'critical');
69
+ if (!critFinding)
70
+ return '';
71
+ return [
72
+ `🚨 你家 AI 异常:`,
73
+ critFinding.headline,
74
+ critFinding.fix_label ? `→ ${critFinding.fix_label}` : '',
75
+ '',
76
+ '回 [skillfm] 看详情',
77
+ ].filter(Boolean).join('\n');
78
+ }
79
+ /**
80
+ * 把 push_time HH:MM 转 cron 表达式
81
+ */
82
+ export function pushTimeToCron(pushTime) {
83
+ const [hh, mm] = pushTime.split(':');
84
+ return `${mm} ${hh} * * *`;
85
+ }
86
+ //# sourceMappingURL=daily-push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-push.js","sourceRoot":"","sources":["../../src/checkup/daily-push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ReconciliationResult } from '../reconciliation/index.js';
2
+ import type { LocalUsageStore } from '../usage-local/store.js';
3
+ import type { DimensionStatus } from './types.js';
4
+ export interface UsageDimDeps {
5
+ store: LocalUsageStore;
6
+ reconciliations: ReconciliationResult[];
7
+ }
8
+ /**
9
+ * 算用量维度的 findings + status
10
+ *
11
+ * 检查项:
12
+ * F1: 对账偏差 > 15% (medium / severe) — 价表过时 / key 泄漏 / 异常
13
+ * F2: 余额耗尽预测 < 3 天 (critical) / < 7 天 (warning)
14
+ * F3: 单 model 占比 > 80% — 暗示可切 cheaper model (E1 router 候选)
15
+ * F4: 用量增长 > 上周 1.5x (warning) — 可能你 agent 失控
16
+ */
17
+ export declare function checkDimensionUsage(deps: UsageDimDeps): DimensionStatus;
18
+ /**
19
+ * 只 surface 用 — 拼出主入口"💰 用量"区段的多行 (基于 reconciliation summaries)
20
+ */
21
+ export declare function buildUsageSurfaceLines(reconciliations: ReconciliationResult[]): string[];
22
+ //# sourceMappingURL=dimension-1-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-1-usage.d.ts","sourceRoot":"","sources":["../../src/checkup/dimension-1-usage.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,eAAe,EAAE,oBAAoB,EAAE,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,CAmFvE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,eAAe,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAIxF"}
@@ -0,0 +1,115 @@
1
+ // sdk/skillfm-local/src/checkup/dimension-1-usage.ts
2
+ //
3
+ // 维度 1: 用量 / 费用 (PRD §4.1)
4
+ // Free 含 L0+L1+L2 三口径对账 (来自 reconciliation engine).
5
+ import { timeWindow } from '../usage-local/store.js';
6
+ /**
7
+ * 算用量维度的 findings + status
8
+ *
9
+ * 检查项:
10
+ * F1: 对账偏差 > 15% (medium / severe) — 价表过时 / key 泄漏 / 异常
11
+ * F2: 余额耗尽预测 < 3 天 (critical) / < 7 天 (warning)
12
+ * F3: 单 model 占比 > 80% — 暗示可切 cheaper model (E1 router 候选)
13
+ * F4: 用量增长 > 上周 1.5x (warning) — 可能你 agent 失控
14
+ */
15
+ export function checkDimensionUsage(deps) {
16
+ const findings = [];
17
+ for (const rec of deps.reconciliations) {
18
+ // F1: 偏差异常
19
+ if (rec.level === 'severe') {
20
+ findings.push({
21
+ headline: `${rec.provider} 对账偏差 ${rec.deviation_pct?.toFixed(0)}% — 严重异常`,
22
+ severity: 'critical',
23
+ score_deduction: 25,
24
+ fix_label: `去 ${rec.provider} 控制台核查 invoice + 检查 key 是否泄漏`,
25
+ fix_free_allowed: true,
26
+ });
27
+ }
28
+ else if (rec.level === 'medium') {
29
+ findings.push({
30
+ headline: `${rec.provider} 对账偏差 ${rec.deviation_pct?.toFixed(0)}% — 中等警告`,
31
+ severity: 'warning',
32
+ score_deduction: 12,
33
+ fix_label: `提示 SkillFM 价表过时 / 等下次 self-correct`,
34
+ fix_free_allowed: true,
35
+ });
36
+ }
37
+ // F2: 余额耗尽预测
38
+ if (rec.days_to_zero != null && rec.days_to_zero < 3 && rec.days_to_zero > 0) {
39
+ findings.push({
40
+ headline: `${rec.provider} 余额 ${(rec.remaining_balance_usd * 7.3).toFixed(2)} CNY → ${rec.days_to_zero.toFixed(1)} 天耗尽`,
41
+ severity: 'critical',
42
+ score_deduction: 20,
43
+ fix_label: `立刻去充值 (Pro 自动充值预警)`,
44
+ fix_free_allowed: true,
45
+ });
46
+ }
47
+ else if (rec.days_to_zero != null && rec.days_to_zero < 7) {
48
+ findings.push({
49
+ headline: `${rec.provider} 预计 ${rec.days_to_zero.toFixed(1)} 天后余额耗尽`,
50
+ severity: 'warning',
51
+ score_deduction: 8,
52
+ fix_label: `准备充值`,
53
+ fix_free_allowed: true,
54
+ });
55
+ }
56
+ }
57
+ // F3: 单 model 占比 > 80% (暗示 E1 router 候选, surface 给用户但 fix 是 Pro)
58
+ const today = timeWindow('today');
59
+ const byModel = deps.store.aggregateByModel(today);
60
+ const totalToday = byModel.reduce((s, m) => s + m.total_cost_usd, 0);
61
+ if (totalToday > 0.5) { // 至少有 ¥3.65 才有意义看
62
+ const top = byModel.sort((a, b) => b.total_cost_usd - a.total_cost_usd)[0];
63
+ if (top && top.total_cost_usd / totalToday > 0.8) {
64
+ findings.push({
65
+ headline: `单 model ${top.provider}/${top.model_id} 占今日 ${((top.total_cost_usd / totalToday) * 100).toFixed(0)}% 用量 — 可考虑切 cheaper`,
66
+ severity: 'info',
67
+ score_deduction: 4,
68
+ fix_label: `查看 E1 智能 router 建议 (可切 Haiku/cheaper model)`,
69
+ fix_free_allowed: true,
70
+ estimated_savings: { description: '估算月省 30-60% (取决于任务质量需求)' },
71
+ });
72
+ }
73
+ }
74
+ // 整体 severity = findings 中最高
75
+ const severity = aggregateSeverity(findings.map((f) => f.severity));
76
+ // headline (主入口 surface 1 行)
77
+ const reconciledLines = deps.reconciliations
78
+ .filter((r) => r.level !== 'no_data')
79
+ .map((r) => r.human_summary);
80
+ let headline;
81
+ if (findings.length === 0) {
82
+ headline = `用量正常 (今日 ¥${(totalToday * 7.3).toFixed(2)})`;
83
+ }
84
+ else {
85
+ headline = `${findings.length} 项可优化 — 今日 ¥${(totalToday * 7.3).toFixed(2)}`;
86
+ }
87
+ return {
88
+ dimension: 'usage',
89
+ severity,
90
+ headline,
91
+ findings,
92
+ pro_locked: false,
93
+ };
94
+ }
95
+ /**
96
+ * 只 surface 用 — 拼出主入口"💰 用量"区段的多行 (基于 reconciliation summaries)
97
+ */
98
+ export function buildUsageSurfaceLines(reconciliations) {
99
+ return reconciliations
100
+ .filter((r) => r.level !== 'no_data' || r.l0_estimated_usd > 0.01)
101
+ .map((r) => r.human_summary);
102
+ }
103
+ /**
104
+ * 取 findings 中最高 severity (critical > warning > info > healthy)
105
+ */
106
+ function aggregateSeverity(severities) {
107
+ if (severities.includes('critical'))
108
+ return 'critical';
109
+ if (severities.includes('warning'))
110
+ return 'warning';
111
+ if (severities.includes('info'))
112
+ return 'info';
113
+ return 'healthy';
114
+ }
115
+ //# sourceMappingURL=dimension-1-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-1-usage.js","sourceRoot":"","sources":["../../src/checkup/dimension-1-usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { DimensionStatus } from './types.js';
2
+ interface FileGroup {
3
+ label: string;
4
+ paths: string[];
5
+ total_bytes: number;
6
+ age_days_min: number;
7
+ }
8
+ /**
9
+ * 跑一次 file 体检 — 返 DimensionStatus + 各 group 详情
10
+ */
11
+ export declare function checkDimensionFiles(): Promise<DimensionStatus & {
12
+ groups: FileGroup[];
13
+ }>;
14
+ /**
15
+ * 一键清 — 删 group 列出的文件 (移到 ~/.skillfm/cleanup-archive/<timestamp>/ 不真删, 7 天后真清)
16
+ * 返 删了多少 bytes + 多少 file
17
+ */
18
+ export declare function executeFileCleanup(groups: FileGroup[]): Promise<{
19
+ bytes_freed: number;
20
+ files_moved: number;
21
+ }>;
22
+ export {};
23
+ //# sourceMappingURL=dimension-3-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-3-files.d.ts","sourceRoot":"","sources":["../../src/checkup/dimension-3-files.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAC;AAErE,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AA4ED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,GAAG;IAAE,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,CAAC,CAuD9F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBnH"}
@@ -0,0 +1,165 @@
1
+ // sdk/skillfm-local/src/checkup/dimension-3-files.ts
2
+ //
3
+ // 维度 3: 过程文件占用 (PRD §4.3) — 360 一键清理同构.
4
+ //
5
+ // 扫描目标 (基础白名单, Free 安全可清):
6
+ // - 旧 trajectory.jsonl (>7d): ~/.openclaw/agents/*/sessions/*.trajectory.jsonl
7
+ // - .DS_Store 文件
8
+ // - npm cache 旧 (~/.npm/_cacache 中 >30d 的)
9
+ // - 用户 workspace 的 .cache / .log / dist / build (但不动 src/) — 复杂, MVP skip
10
+ //
11
+ // 一键清: 仅清白名单 + 提供 archive backup (~/.skillfm/cleanup-archive/)
12
+ // MVP 只 surface 占用 + 提示, 真清需 Pro 二次确认 (PRD §4.3 fix_free_allowed=true 但有保护)
13
+ import * as fs from 'node:fs';
14
+ import * as path from 'node:path';
15
+ import { homedir } from 'node:os';
16
+ const SCAN_TARGETS = [
17
+ {
18
+ label: '旧 OpenClaw trajectory (>7d)',
19
+ base: path.join(homedir(), '.openclaw', 'agents'),
20
+ matcher: (_, name) => name.endsWith('.trajectory.jsonl'),
21
+ min_age_days: 7,
22
+ },
23
+ {
24
+ label: 'OpenClaw debug logs (>7d)',
25
+ base: '/tmp/openclaw',
26
+ matcher: (_, name) => name.endsWith('.log'),
27
+ min_age_days: 7,
28
+ },
29
+ {
30
+ label: '.DS_Store 系统文件',
31
+ base: homedir(),
32
+ matcher: (_, name) => name === '.DS_Store',
33
+ min_age_days: 0,
34
+ },
35
+ ];
36
+ /**
37
+ * 主扫描入口 — recursive 但限深度 (4)
38
+ */
39
+ async function scanGroup(base, matcher, min_age_days, maxDepth = 4) {
40
+ const group = { label: '', paths: [], total_bytes: 0, age_days_min: 999 };
41
+ if (!fs.existsSync(base))
42
+ return group;
43
+ const ageThresholdMs = Date.now() - min_age_days * 86400000;
44
+ async function walk(dir, depth) {
45
+ if (depth > maxDepth)
46
+ return;
47
+ let entries;
48
+ try {
49
+ entries = await fs.promises.readdir(dir, { withFileTypes: true });
50
+ }
51
+ catch {
52
+ return;
53
+ }
54
+ for (const ent of entries) {
55
+ const full = path.join(dir, ent.name);
56
+ // 跳过常见的 system/重要目录避免误扫
57
+ if (ent.name === 'node_modules' || ent.name === '.git' || ent.name === '.npm')
58
+ continue;
59
+ if (ent.isDirectory()) {
60
+ await walk(full, depth + 1);
61
+ }
62
+ else if (ent.isFile() && matcher(full, ent.name)) {
63
+ try {
64
+ const stat = await fs.promises.stat(full);
65
+ if (stat.mtimeMs > ageThresholdMs && min_age_days > 0)
66
+ continue;
67
+ const ageDays = (Date.now() - stat.mtimeMs) / 86400000;
68
+ group.paths.push(full);
69
+ group.total_bytes += stat.size;
70
+ if (ageDays < group.age_days_min)
71
+ group.age_days_min = ageDays;
72
+ }
73
+ catch {
74
+ // skip
75
+ }
76
+ }
77
+ }
78
+ }
79
+ await walk(base, 0);
80
+ return group;
81
+ }
82
+ /**
83
+ * 跑一次 file 体检 — 返 DimensionStatus + 各 group 详情
84
+ */
85
+ export async function checkDimensionFiles() {
86
+ const groups = [];
87
+ for (const target of SCAN_TARGETS) {
88
+ const g = await scanGroup(target.base, target.matcher, target.min_age_days);
89
+ g.label = target.label;
90
+ if (g.total_bytes > 0)
91
+ groups.push(g);
92
+ }
93
+ const total_bytes = groups.reduce((s, g) => s + g.total_bytes, 0);
94
+ const total_gb = total_bytes / (1024 ** 3);
95
+ const findings = [];
96
+ let severity = 'healthy';
97
+ if (total_gb > 10) {
98
+ findings.push({
99
+ headline: `${total_gb.toFixed(1)} GB 中间文件可清`,
100
+ severity: 'critical',
101
+ score_deduction: 15,
102
+ fix_label: '一键清 (基础安全 path)',
103
+ fix_free_allowed: true,
104
+ });
105
+ severity = 'critical';
106
+ }
107
+ else if (total_gb > 3) {
108
+ findings.push({
109
+ headline: `${total_gb.toFixed(1)} GB 中间文件可清`,
110
+ severity: 'warning',
111
+ score_deduction: 8,
112
+ fix_label: '一键清',
113
+ fix_free_allowed: true,
114
+ });
115
+ severity = 'warning';
116
+ }
117
+ else if (total_bytes > 100 * 1024 * 1024) { // 100MB+
118
+ findings.push({
119
+ headline: `${(total_bytes / (1024 ** 2)).toFixed(0)} MB 中间文件可清`,
120
+ severity: 'info',
121
+ score_deduction: 3,
122
+ fix_label: '一键清',
123
+ fix_free_allowed: true,
124
+ });
125
+ severity = 'info';
126
+ }
127
+ const headline = total_bytes > 0
128
+ ? `${total_gb >= 0.1 ? total_gb.toFixed(1) + ' GB' : (total_bytes / 1024 / 1024).toFixed(0) + ' MB'} 可清`
129
+ : '无中间文件可清';
130
+ return {
131
+ dimension: 'files',
132
+ severity,
133
+ headline,
134
+ findings,
135
+ pro_locked: false,
136
+ groups,
137
+ };
138
+ }
139
+ /**
140
+ * 一键清 — 删 group 列出的文件 (移到 ~/.skillfm/cleanup-archive/<timestamp>/ 不真删, 7 天后真清)
141
+ * 返 删了多少 bytes + 多少 file
142
+ */
143
+ export async function executeFileCleanup(groups) {
144
+ const archiveBase = path.join(homedir(), '.skillfm', 'cleanup-archive', new Date().toISOString().replace(/[:.]/g, '-'));
145
+ await fs.promises.mkdir(archiveBase, { recursive: true, mode: 0o700 });
146
+ let bytes_freed = 0;
147
+ let files_moved = 0;
148
+ for (const group of groups) {
149
+ for (const filePath of group.paths) {
150
+ try {
151
+ const stat = await fs.promises.stat(filePath);
152
+ const relativeName = filePath.replace(/^\//, '').replace(/\//g, '_');
153
+ const archivePath = path.join(archiveBase, relativeName);
154
+ await fs.promises.rename(filePath, archivePath);
155
+ bytes_freed += stat.size;
156
+ files_moved += 1;
157
+ }
158
+ catch {
159
+ // skip
160
+ }
161
+ }
162
+ }
163
+ return { bytes_freed, files_moved };
164
+ }
165
+ //# sourceMappingURL=dimension-3-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-3-files.js","sourceRoot":"","sources":["../../src/checkup/dimension-3-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { DimensionStatus } from './types.js';
2
+ interface ContextStatus {
3
+ agent_harness: string;
4
+ session_id: string;
5
+ /** 当前 system prompt + history token 数 */
6
+ current_tokens: number;
7
+ /** Model 上限 token 数 */
8
+ context_window_max: number;
9
+ /** % 占用 */
10
+ utilization_pct: number;
11
+ /** 该 session 已 turn 数 */
12
+ turn_count: number;
13
+ }
14
+ export declare function checkDimensionContext(): Promise<DimensionStatus & {
15
+ sessions: ContextStatus[];
16
+ }>;
17
+ export {};
18
+ //# sourceMappingURL=dimension-4-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-4-context.d.ts","sourceRoot":"","sources":["../../src/checkup/dimension-4-context.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAC;AAErE,UAAU,aAAa;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAqGD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,eAAe,GAAG;IAAE,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CAsDtG"}