@skillfm/local 2.7.3 → 2.7.5

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 (120) 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 +36 -0
  10. package/dist/checkup/dimension-3-files.d.ts.map +1 -0
  11. package/dist/checkup/dimension-3-files.js +276 -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 +26 -0
  22. package/dist/checkup/report.d.ts.map +1 -0
  23. package/dist/checkup/report.js +173 -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/mcp/index.d.ts.map +1 -1
  34. package/dist/mcp/index.js +27 -0
  35. package/dist/mcp/index.js.map +1 -1
  36. package/dist/mcp/tools/checkup.d.ts +21 -0
  37. package/dist/mcp/tools/checkup.d.ts.map +1 -0
  38. package/dist/mcp/tools/checkup.js +35 -0
  39. package/dist/mcp/tools/checkup.js.map +1 -0
  40. package/dist/mcp/tools/index.d.ts +6 -0
  41. package/dist/mcp/tools/index.d.ts.map +1 -1
  42. package/dist/mcp/tools/index.js +47 -0
  43. package/dist/mcp/tools/index.js.map +1 -1
  44. package/dist/mcp/tools/setup-gateway.d.ts +16 -0
  45. package/dist/mcp/tools/setup-gateway.d.ts.map +1 -0
  46. package/dist/mcp/tools/setup-gateway.js +79 -0
  47. package/dist/mcp/tools/setup-gateway.js.map +1 -0
  48. package/dist/mcp/tools/show-my-usage.d.ts +26 -0
  49. package/dist/mcp/tools/show-my-usage.d.ts.map +1 -0
  50. package/dist/mcp/tools/show-my-usage.js +68 -0
  51. package/dist/mcp/tools/show-my-usage.js.map +1 -0
  52. package/dist/reconciliation/engine.d.ts +30 -0
  53. package/dist/reconciliation/engine.d.ts.map +1 -0
  54. package/dist/reconciliation/engine.js +62 -0
  55. package/dist/reconciliation/engine.js.map +1 -0
  56. package/dist/reconciliation/index.d.ts +8 -0
  57. package/dist/reconciliation/index.d.ts.map +1 -0
  58. package/dist/reconciliation/index.js +8 -0
  59. package/dist/reconciliation/index.js.map +1 -0
  60. package/dist/reconciliation/l1-reconciler.d.ts +29 -0
  61. package/dist/reconciliation/l1-reconciler.d.ts.map +1 -0
  62. package/dist/reconciliation/l1-reconciler.js +144 -0
  63. package/dist/reconciliation/l1-reconciler.js.map +1 -0
  64. package/dist/reconciliation/l2-reconciler.d.ts +21 -0
  65. package/dist/reconciliation/l2-reconciler.d.ts.map +1 -0
  66. package/dist/reconciliation/l2-reconciler.js +241 -0
  67. package/dist/reconciliation/l2-reconciler.js.map +1 -0
  68. package/dist/reconciliation/types.d.ts +49 -0
  69. package/dist/reconciliation/types.d.ts.map +1 -0
  70. package/dist/reconciliation/types.js +9 -0
  71. package/dist/reconciliation/types.js.map +1 -0
  72. package/dist/save-token/e1-router.d.ts +7 -0
  73. package/dist/save-token/e1-router.d.ts.map +1 -0
  74. package/dist/save-token/e1-router.js +112 -0
  75. package/dist/save-token/e1-router.js.map +1 -0
  76. package/dist/save-token/e2-cache.d.ts +7 -0
  77. package/dist/save-token/e2-cache.d.ts.map +1 -0
  78. package/dist/save-token/e2-cache.js +128 -0
  79. package/dist/save-token/e2-cache.js.map +1 -0
  80. package/dist/save-token/e3-batch.d.ts +7 -0
  81. package/dist/save-token/e3-batch.d.ts.map +1 -0
  82. package/dist/save-token/e3-batch.js +80 -0
  83. package/dist/save-token/e3-batch.js.map +1 -0
  84. package/dist/save-token/gateway-setup.d.ts +27 -0
  85. package/dist/save-token/gateway-setup.d.ts.map +1 -0
  86. package/dist/save-token/gateway-setup.js +200 -0
  87. package/dist/save-token/gateway-setup.js.map +1 -0
  88. package/dist/save-token/index.d.ts +13 -0
  89. package/dist/save-token/index.d.ts.map +1 -0
  90. package/dist/save-token/index.js +23 -0
  91. package/dist/save-token/index.js.map +1 -0
  92. package/dist/save-token/types.d.ts +46 -0
  93. package/dist/save-token/types.d.ts.map +1 -0
  94. package/dist/save-token/types.js +5 -0
  95. package/dist/save-token/types.js.map +1 -0
  96. package/dist/usage-local/index.d.ts +34 -0
  97. package/dist/usage-local/index.d.ts.map +1 -0
  98. package/dist/usage-local/index.js +33 -0
  99. package/dist/usage-local/index.js.map +1 -0
  100. package/dist/usage-local/model-pricing.d.ts +42 -0
  101. package/dist/usage-local/model-pricing.d.ts.map +1 -0
  102. package/dist/usage-local/model-pricing.js +253 -0
  103. package/dist/usage-local/model-pricing.js.map +1 -0
  104. package/dist/usage-local/openclaw-watcher.d.ts +35 -0
  105. package/dist/usage-local/openclaw-watcher.d.ts.map +1 -0
  106. package/dist/usage-local/openclaw-watcher.js +190 -0
  107. package/dist/usage-local/openclaw-watcher.js.map +1 -0
  108. package/dist/usage-local/plan.d.ts +58 -0
  109. package/dist/usage-local/plan.d.ts.map +1 -0
  110. package/dist/usage-local/plan.js +84 -0
  111. package/dist/usage-local/plan.js.map +1 -0
  112. package/dist/usage-local/store.d.ts +50 -0
  113. package/dist/usage-local/store.d.ts.map +1 -0
  114. package/dist/usage-local/store.js +201 -0
  115. package/dist/usage-local/store.js.map +1 -0
  116. package/dist/usage-local/types.d.ts +94 -0
  117. package/dist/usage-local/types.d.ts.map +1 -0
  118. package/dist/usage-local/types.js +6 -0
  119. package/dist/usage-local/types.js.map +1 -0
  120. 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,36 @@
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
+ interface CleanupHistoryEntry {
9
+ timestamp: string;
10
+ bytes_freed: number;
11
+ files_moved: number;
12
+ }
13
+ declare function appendCleanupHistory(entry: CleanupHistoryEntry): Promise<void>;
14
+ /**
15
+ * 跑一次 file 体检 — 返 DimensionStatus + 各 group 详情 + 累计 history
16
+ */
17
+ export declare function checkDimensionFiles(): Promise<DimensionStatus & {
18
+ groups: FileGroup[];
19
+ cumulative_this_month: {
20
+ bytes: number;
21
+ files: number;
22
+ };
23
+ }>;
24
+ /**
25
+ * Export for cleanup execution to record history
26
+ */
27
+ export { appendCleanupHistory };
28
+ /**
29
+ * 一键清 — 删 group 列出的文件 (移到 ~/.skillfm/cleanup-archive/<timestamp>/ 不真删, 7 天后真清)
30
+ * 返 删了多少 bytes + 多少 file
31
+ */
32
+ export declare function executeFileCleanup(groups: FileGroup[]): Promise<{
33
+ bytes_freed: number;
34
+ files_moved: number;
35
+ }>;
36
+ //# 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;AA4HD,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AA0BD,iBAAe,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E;AASD;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,GAAG;IAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAAC,qBAAqB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAoEvJ;AAED;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAgCnH"}
@@ -0,0 +1,276 @@
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
+ // ── Agent trace files ──
18
+ { label: '旧 OpenClaw trajectory (>7d)',
19
+ base: path.join(homedir(), '.openclaw', 'agents'),
20
+ matcher: (_, name) => name.endsWith('.trajectory.jsonl'), min_age_days: 7 },
21
+ { label: 'OpenClaw debug logs (>7d)',
22
+ base: '/tmp/openclaw',
23
+ matcher: (_, name) => name.endsWith('.log'), min_age_days: 7 },
24
+ { label: '旧 Claude Code session jsonl (>30d)',
25
+ base: path.join(homedir(), '.claude', 'projects'),
26
+ matcher: (_, name) => name.endsWith('.jsonl'), min_age_days: 30 },
27
+ // ── 系统垃圾 ──
28
+ { label: '.DS_Store 系统文件',
29
+ base: homedir(),
30
+ matcher: (_, name) => name === '.DS_Store', min_age_days: 0 },
31
+ { label: '.AppleDouble',
32
+ base: homedir(),
33
+ matcher: (_, name) => name.startsWith('._'), min_age_days: 30 },
34
+ { label: 'Thumbs.db (Windows)',
35
+ base: homedir(),
36
+ matcher: (_, name) => name === 'Thumbs.db', min_age_days: 0 },
37
+ // ── npm / node cache 旧 ──
38
+ { label: 'npm _cacache (>30d)',
39
+ base: path.join(homedir(), '.npm', '_cacache'),
40
+ matcher: (_, name) => true, min_age_days: 30 },
41
+ { label: 'npm _logs',
42
+ base: path.join(homedir(), '.npm', '_logs'),
43
+ matcher: (_, name) => name.endsWith('.log'), min_age_days: 7 },
44
+ { label: 'npx 旧 cache',
45
+ base: path.join(homedir(), '.npm', '_npx'),
46
+ matcher: (_, name) => true, min_age_days: 30 },
47
+ // ── pip / cargo / 编译 cache ──
48
+ { label: 'pip cache 旧',
49
+ base: path.join(homedir(), '.cache', 'pip'),
50
+ matcher: (_, name) => true, min_age_days: 30 },
51
+ // ── macOS Caches 旧 ──
52
+ { label: 'macOS user Caches 旧 (>60d)',
53
+ base: path.join(homedir(), 'Library', 'Caches'),
54
+ matcher: (_, name) => name.endsWith('.cache') || name.endsWith('.tmp') || name.endsWith('.log'),
55
+ min_age_days: 60 },
56
+ // ── Downloads 旧 ──
57
+ { label: 'Downloads 旧 (>180d)',
58
+ base: path.join(homedir(), 'Downloads'),
59
+ matcher: (_, name) => true, min_age_days: 180 },
60
+ // ── /tmp 旧 ──
61
+ { label: '/tmp 旧文件 (>14d)',
62
+ base: '/tmp',
63
+ matcher: (_, name) => true, min_age_days: 14 },
64
+ // ── 各 IDE temp ──
65
+ { label: 'Cursor 旧 cache',
66
+ base: path.join(homedir(), 'Library', 'Application Support', 'Cursor', 'CachedExtensionVSIXs'),
67
+ matcher: (_, name) => true, min_age_days: 60 },
68
+ { label: 'VS Code 旧 logs',
69
+ base: path.join(homedir(), 'Library', 'Application Support', 'Code', 'logs'),
70
+ matcher: (_, name) => true, min_age_days: 30 },
71
+ ];
72
+ /**
73
+ * 主扫描入口 — recursive 但限深度 (4)
74
+ */
75
+ async function scanGroup(base, matcher, min_age_days, maxDepth = 4) {
76
+ const group = { label: '', paths: [], total_bytes: 0, age_days_min: 999 };
77
+ if (!fs.existsSync(base))
78
+ return group;
79
+ const ageThresholdMs = Date.now() - min_age_days * 86400000;
80
+ async function walk(dir, depth) {
81
+ if (depth > maxDepth)
82
+ return;
83
+ let entries;
84
+ try {
85
+ entries = await fs.promises.readdir(dir, { withFileTypes: true });
86
+ }
87
+ catch {
88
+ return;
89
+ }
90
+ for (const ent of entries) {
91
+ const full = path.join(dir, ent.name);
92
+ // 跳过常见的 system/重要目录避免误扫
93
+ if (ent.name === 'node_modules' || ent.name === '.git' || ent.name === '.npm')
94
+ continue;
95
+ if (ent.isDirectory()) {
96
+ await walk(full, depth + 1);
97
+ }
98
+ else if (ent.isFile() && matcher(full, ent.name)) {
99
+ try {
100
+ const stat = await fs.promises.stat(full);
101
+ if (stat.mtimeMs > ageThresholdMs && min_age_days > 0)
102
+ continue;
103
+ const ageDays = (Date.now() - stat.mtimeMs) / 86400000;
104
+ group.paths.push(full);
105
+ group.total_bytes += stat.size;
106
+ if (ageDays < group.age_days_min)
107
+ group.age_days_min = ageDays;
108
+ }
109
+ catch {
110
+ // skip
111
+ }
112
+ }
113
+ }
114
+ }
115
+ await walk(base, 0);
116
+ return group;
117
+ }
118
+ /**
119
+ * 累计 cleanup history — V1.4 加 (Eric Q3: 0 MB 不能死气, 用累计激发感知)
120
+ */
121
+ const CLEANUP_HISTORY_PATH = path.join(homedir(), '.skillfm', 'cleanup-history.jsonl');
122
+ async function loadCleanupTotalThisMonth() {
123
+ if (!fs.existsSync(CLEANUP_HISTORY_PATH))
124
+ return { bytes: 0, files: 0 };
125
+ try {
126
+ const text = await fs.promises.readFile(CLEANUP_HISTORY_PATH, 'utf-8');
127
+ const monthStart = new Date();
128
+ monthStart.setDate(1);
129
+ monthStart.setHours(0, 0, 0, 0);
130
+ let bytes = 0, files = 0;
131
+ for (const line of text.split('\n')) {
132
+ const t = line.trim();
133
+ if (!t.startsWith('{'))
134
+ continue;
135
+ try {
136
+ const entry = JSON.parse(t);
137
+ if (Date.parse(entry.timestamp) >= monthStart.getTime()) {
138
+ bytes += entry.bytes_freed;
139
+ files += entry.files_moved;
140
+ }
141
+ }
142
+ catch { }
143
+ }
144
+ return { bytes, files };
145
+ }
146
+ catch {
147
+ return { bytes: 0, files: 0 };
148
+ }
149
+ }
150
+ async function appendCleanupHistory(entry) {
151
+ const dir = path.dirname(CLEANUP_HISTORY_PATH);
152
+ if (!fs.existsSync(dir)) {
153
+ await fs.promises.mkdir(dir, { recursive: true, mode: 0o700 });
154
+ }
155
+ await fs.promises.appendFile(CLEANUP_HISTORY_PATH, JSON.stringify(entry) + '\n', { mode: 0o600 });
156
+ }
157
+ function formatBytes(bytes) {
158
+ if (bytes >= 1024 ** 3)
159
+ return (bytes / (1024 ** 3)).toFixed(1) + ' GB';
160
+ if (bytes >= 1024 ** 2)
161
+ return (bytes / (1024 ** 2)).toFixed(0) + ' MB';
162
+ if (bytes >= 1024)
163
+ return (bytes / 1024).toFixed(0) + ' KB';
164
+ return bytes + ' B';
165
+ }
166
+ /**
167
+ * 跑一次 file 体检 — 返 DimensionStatus + 各 group 详情 + 累计 history
168
+ */
169
+ export async function checkDimensionFiles() {
170
+ const groups = [];
171
+ for (const target of SCAN_TARGETS) {
172
+ const g = await scanGroup(target.base, target.matcher, target.min_age_days);
173
+ g.label = target.label;
174
+ if (g.total_bytes > 0)
175
+ groups.push(g);
176
+ }
177
+ const total_bytes = groups.reduce((s, g) => s + g.total_bytes, 0);
178
+ const total_gb = total_bytes / (1024 ** 3);
179
+ const cumulative = await loadCleanupTotalThisMonth();
180
+ const findings = [];
181
+ let severity = 'healthy';
182
+ if (total_gb > 10) {
183
+ findings.push({
184
+ headline: `${formatBytes(total_bytes)} 中间文件可清 (扫了 ${groups.length} 类)`,
185
+ severity: 'critical',
186
+ score_deduction: 15,
187
+ fix_label: '一键清 (基础安全 path, 可恢复)',
188
+ fix_free_allowed: true,
189
+ estimated_savings: { description: `释放 ${formatBytes(total_bytes)} 磁盘` },
190
+ });
191
+ severity = 'critical';
192
+ }
193
+ else if (total_gb > 3) {
194
+ findings.push({
195
+ headline: `${formatBytes(total_bytes)} 中间文件可清`,
196
+ severity: 'warning',
197
+ score_deduction: 8,
198
+ fix_label: '一键清',
199
+ fix_free_allowed: true,
200
+ estimated_savings: { description: `释放 ${formatBytes(total_bytes)} 磁盘` },
201
+ });
202
+ severity = 'warning';
203
+ }
204
+ else if (total_bytes > 100 * 1024 * 1024) { // 100MB+
205
+ findings.push({
206
+ headline: `${formatBytes(total_bytes)} 中间文件可清`,
207
+ severity: 'info',
208
+ score_deduction: 3,
209
+ fix_label: '一键清',
210
+ fix_free_allowed: true,
211
+ });
212
+ severity = 'info';
213
+ }
214
+ // V1.4 — 0 MB 时正向 UX (累计 history 激发感知)
215
+ let headline;
216
+ if (total_bytes === 0) {
217
+ if (cumulative.bytes > 0) {
218
+ headline = `✨ 干净! 本月已帮你清 ${formatBytes(cumulative.bytes)}`;
219
+ }
220
+ else {
221
+ headline = `✨ 干净! 文件保持得很好`;
222
+ }
223
+ }
224
+ else {
225
+ const cumulativeStr = cumulative.bytes > 0 ? ` (本月已清 ${formatBytes(cumulative.bytes)})` : '';
226
+ headline = `${formatBytes(total_bytes)} 可清${cumulativeStr}`;
227
+ }
228
+ return {
229
+ dimension: 'files',
230
+ severity,
231
+ headline,
232
+ findings,
233
+ pro_locked: false,
234
+ groups,
235
+ cumulative_this_month: cumulative,
236
+ };
237
+ }
238
+ /**
239
+ * Export for cleanup execution to record history
240
+ */
241
+ export { appendCleanupHistory };
242
+ /**
243
+ * 一键清 — 删 group 列出的文件 (移到 ~/.skillfm/cleanup-archive/<timestamp>/ 不真删, 7 天后真清)
244
+ * 返 删了多少 bytes + 多少 file
245
+ */
246
+ export async function executeFileCleanup(groups) {
247
+ const archiveBase = path.join(homedir(), '.skillfm', 'cleanup-archive', new Date().toISOString().replace(/[:.]/g, '-'));
248
+ await fs.promises.mkdir(archiveBase, { recursive: true, mode: 0o700 });
249
+ let bytes_freed = 0;
250
+ let files_moved = 0;
251
+ for (const group of groups) {
252
+ for (const filePath of group.paths) {
253
+ try {
254
+ const stat = await fs.promises.stat(filePath);
255
+ const relativeName = filePath.replace(/^\//, '').replace(/\//g, '_');
256
+ const archivePath = path.join(archiveBase, relativeName);
257
+ await fs.promises.rename(filePath, archivePath);
258
+ bytes_freed += stat.size;
259
+ files_moved += 1;
260
+ }
261
+ catch {
262
+ // skip
263
+ }
264
+ }
265
+ }
266
+ // V1.4: append history (for next checkup show "本月已清 X GB")
267
+ if (bytes_freed > 0) {
268
+ await appendCleanupHistory({
269
+ timestamp: new Date().toISOString(),
270
+ bytes_freed,
271
+ files_moved,
272
+ }).catch(() => { });
273
+ }
274
+ return { bytes_freed, files_moved };
275
+ }
276
+ //# 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":"AAAA,qDAAqD;AACrD,EAAE;AACF,wCAAwC;AACxC,EAAE;AACF,2BAA2B;AAC3B,iFAAiF;AACjF,mBAAmB;AACnB,6CAA6C;AAC7C,4EAA4E;AAC5E,EAAE;AACF,+DAA+D;AAC/D,4EAA4E;AAE5E,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAWlC,MAAM,YAAY,GAMb;IACH,0BAA0B;IAC1B,EAAE,KAAK,EAAE,6BAA6B;QACpC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC;QACjD,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;IAC7E,EAAE,KAAK,EAAE,2BAA2B;QAClC,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;IAChE,EAAE,KAAK,EAAE,oCAAoC;QAC3C,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;QACjD,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;IAEnE,aAAa;IACb,EAAE,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,OAAO,EAAE;QACf,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE;IAC/D,EAAE,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,OAAO,EAAE;QACf,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;IACjE,EAAE,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,OAAO,EAAE;QACf,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE;IAE/D,2BAA2B;IAC3B,EAAE,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC;QAC9C,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;IAChD,EAAE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC;QAC3C,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;IAChE,EAAE,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC;QAC1C,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;IAEhD,+BAA+B;IAC/B,EAAE,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC;QAC3C,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;IAEhD,uBAAuB;IACvB,EAAE,KAAK,EAAE,4BAA4B;QACnC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/F,YAAY,EAAE,EAAE,EAAE;IAEpB,oBAAoB;IACpB,EAAE,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC;QACvC,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE;IAEjD,eAAe;IACf,EAAE,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;IAEhD,mBAAmB;IACnB,EAAE,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,sBAAsB,CAAC;QAC9F,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;IAChD,EAAE,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,CAAC;QAC5E,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;CACjD,CAAC;AAEF;;GAEG;AACH,KAAK,UAAU,SAAS,CACtB,IAAY,EACZ,OAAoD,EACpD,YAAoB,EACpB,QAAQ,GAAG,CAAC;IAEZ,MAAM,KAAK,GAAc,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;IACrF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,QAAQ,CAAC;IAE5D,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,KAAa;QAC5C,IAAI,KAAK,GAAG,QAAQ;YAAE,OAAO;QAC7B,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACtC,wBAAwB;YACxB,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YACxF,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC1C,IAAI,IAAI,CAAC,OAAO,GAAG,cAAc,IAAI,YAAY,GAAG,CAAC;wBAAE,SAAS;oBAChE,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;oBACvD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvB,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC;oBAC/B,IAAI,OAAO,GAAG,KAAK,CAAC,YAAY;wBAAE,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC;gBACjE,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,uBAAuB,CAAC,CAAC;AAQvF,KAAK,UAAU,yBAAyB;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACjC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAwB,CAAC;gBACnD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;oBACxD,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC;oBAC3B,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC;gBAC7B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAChC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,KAA0B;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACxE,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACxE,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAC5D,OAAO,KAAK,GAAG,IAAI,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAC5E,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,yBAAyB,EAAE,CAAC;IAErD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,QAAQ,GAAa,SAAS,CAAC;IAEnC,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC;YACZ,QAAQ,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,eAAe,MAAM,CAAC,MAAM,KAAK;YACtE,QAAQ,EAAE,UAAU;YACpB,eAAe,EAAE,EAAE;YACnB,SAAS,EAAE,sBAAsB;YACjC,gBAAgB,EAAE,IAAI;YACtB,iBAAiB,EAAE,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE;SACxE,CAAC,CAAC;QACH,QAAQ,GAAG,UAAU,CAAC;IACxB,CAAC;SAAM,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC;YACZ,QAAQ,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,SAAS;YAC9C,QAAQ,EAAE,SAAS;YACnB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,KAAK;YAChB,gBAAgB,EAAE,IAAI;YACtB,iBAAiB,EAAE,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE;SACxE,CAAC,CAAC;QACH,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;SAAM,IAAI,WAAW,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,SAAS;QACrD,QAAQ,CAAC,IAAI,CAAC;YACZ,QAAQ,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,SAAS;YAC9C,QAAQ,EAAE,MAAM;YAChB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,KAAK;YAChB,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QACH,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;IAED,uCAAuC;IACvC,IAAI,QAAgB,CAAC;IACrB,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACzB,QAAQ,GAAG,gBAAgB,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,eAAe,CAAC;QAC7B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,QAAQ,GAAG,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,aAAa,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,SAAS,EAAE,OAAO;QAClB,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,UAAU,EAAE,KAAK;QACjB,MAAM;QACN,qBAAqB,EAAE,UAAU;KAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAmB;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACxH,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvE,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBACrE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;gBACzD,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAChD,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC;gBACzB,WAAW,IAAI,CAAC,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,oBAAoB,CAAC;YACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,WAAW;YACX,WAAW;SACZ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACtC,CAAC"}
@@ -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"}