@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.
- package/dist/checkup/daily-push.d.ts +29 -0
- package/dist/checkup/daily-push.d.ts.map +1 -0
- package/dist/checkup/daily-push.js +86 -0
- package/dist/checkup/daily-push.js.map +1 -0
- package/dist/checkup/dimension-1-usage.d.ts +22 -0
- package/dist/checkup/dimension-1-usage.d.ts.map +1 -0
- package/dist/checkup/dimension-1-usage.js +115 -0
- package/dist/checkup/dimension-1-usage.js.map +1 -0
- package/dist/checkup/dimension-3-files.d.ts +36 -0
- package/dist/checkup/dimension-3-files.d.ts.map +1 -0
- package/dist/checkup/dimension-3-files.js +276 -0
- package/dist/checkup/dimension-3-files.js.map +1 -0
- package/dist/checkup/dimension-4-context.d.ts +18 -0
- package/dist/checkup/dimension-4-context.d.ts.map +1 -0
- package/dist/checkup/dimension-4-context.js +177 -0
- package/dist/checkup/dimension-4-context.js.map +1 -0
- package/dist/checkup/index.d.ts +11 -0
- package/dist/checkup/index.d.ts.map +1 -0
- package/dist/checkup/index.js +10 -0
- package/dist/checkup/index.js.map +1 -0
- package/dist/checkup/report.d.ts +26 -0
- package/dist/checkup/report.d.ts.map +1 -0
- package/dist/checkup/report.js +173 -0
- package/dist/checkup/report.js.map +1 -0
- package/dist/checkup/score.d.ts +27 -0
- package/dist/checkup/score.d.ts.map +1 -0
- package/dist/checkup/score.js +101 -0
- package/dist/checkup/score.js.map +1 -0
- package/dist/checkup/types.d.ts +64 -0
- package/dist/checkup/types.d.ts.map +1 -0
- package/dist/checkup/types.js +5 -0
- package/dist/checkup/types.js.map +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +27 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/tools/checkup.d.ts +21 -0
- package/dist/mcp/tools/checkup.d.ts.map +1 -0
- package/dist/mcp/tools/checkup.js +35 -0
- package/dist/mcp/tools/checkup.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +6 -0
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +47 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/setup-gateway.d.ts +16 -0
- package/dist/mcp/tools/setup-gateway.d.ts.map +1 -0
- package/dist/mcp/tools/setup-gateway.js +79 -0
- package/dist/mcp/tools/setup-gateway.js.map +1 -0
- package/dist/mcp/tools/show-my-usage.d.ts +26 -0
- package/dist/mcp/tools/show-my-usage.d.ts.map +1 -0
- package/dist/mcp/tools/show-my-usage.js +68 -0
- package/dist/mcp/tools/show-my-usage.js.map +1 -0
- package/dist/reconciliation/engine.d.ts +30 -0
- package/dist/reconciliation/engine.d.ts.map +1 -0
- package/dist/reconciliation/engine.js +62 -0
- package/dist/reconciliation/engine.js.map +1 -0
- package/dist/reconciliation/index.d.ts +8 -0
- package/dist/reconciliation/index.d.ts.map +1 -0
- package/dist/reconciliation/index.js +8 -0
- package/dist/reconciliation/index.js.map +1 -0
- package/dist/reconciliation/l1-reconciler.d.ts +29 -0
- package/dist/reconciliation/l1-reconciler.d.ts.map +1 -0
- package/dist/reconciliation/l1-reconciler.js +144 -0
- package/dist/reconciliation/l1-reconciler.js.map +1 -0
- package/dist/reconciliation/l2-reconciler.d.ts +21 -0
- package/dist/reconciliation/l2-reconciler.d.ts.map +1 -0
- package/dist/reconciliation/l2-reconciler.js +241 -0
- package/dist/reconciliation/l2-reconciler.js.map +1 -0
- package/dist/reconciliation/types.d.ts +49 -0
- package/dist/reconciliation/types.d.ts.map +1 -0
- package/dist/reconciliation/types.js +9 -0
- package/dist/reconciliation/types.js.map +1 -0
- package/dist/save-token/e1-router.d.ts +7 -0
- package/dist/save-token/e1-router.d.ts.map +1 -0
- package/dist/save-token/e1-router.js +112 -0
- package/dist/save-token/e1-router.js.map +1 -0
- package/dist/save-token/e2-cache.d.ts +7 -0
- package/dist/save-token/e2-cache.d.ts.map +1 -0
- package/dist/save-token/e2-cache.js +128 -0
- package/dist/save-token/e2-cache.js.map +1 -0
- package/dist/save-token/e3-batch.d.ts +7 -0
- package/dist/save-token/e3-batch.d.ts.map +1 -0
- package/dist/save-token/e3-batch.js +80 -0
- package/dist/save-token/e3-batch.js.map +1 -0
- package/dist/save-token/gateway-setup.d.ts +27 -0
- package/dist/save-token/gateway-setup.d.ts.map +1 -0
- package/dist/save-token/gateway-setup.js +200 -0
- package/dist/save-token/gateway-setup.js.map +1 -0
- package/dist/save-token/index.d.ts +13 -0
- package/dist/save-token/index.d.ts.map +1 -0
- package/dist/save-token/index.js +23 -0
- package/dist/save-token/index.js.map +1 -0
- package/dist/save-token/types.d.ts +46 -0
- package/dist/save-token/types.d.ts.map +1 -0
- package/dist/save-token/types.js +5 -0
- package/dist/save-token/types.js.map +1 -0
- package/dist/usage-local/index.d.ts +34 -0
- package/dist/usage-local/index.d.ts.map +1 -0
- package/dist/usage-local/index.js +33 -0
- package/dist/usage-local/index.js.map +1 -0
- package/dist/usage-local/model-pricing.d.ts +42 -0
- package/dist/usage-local/model-pricing.d.ts.map +1 -0
- package/dist/usage-local/model-pricing.js +253 -0
- package/dist/usage-local/model-pricing.js.map +1 -0
- package/dist/usage-local/openclaw-watcher.d.ts +35 -0
- package/dist/usage-local/openclaw-watcher.d.ts.map +1 -0
- package/dist/usage-local/openclaw-watcher.js +190 -0
- package/dist/usage-local/openclaw-watcher.js.map +1 -0
- package/dist/usage-local/plan.d.ts +58 -0
- package/dist/usage-local/plan.d.ts.map +1 -0
- package/dist/usage-local/plan.js +84 -0
- package/dist/usage-local/plan.js.map +1 -0
- package/dist/usage-local/store.d.ts +50 -0
- package/dist/usage-local/store.d.ts.map +1 -0
- package/dist/usage-local/store.js +201 -0
- package/dist/usage-local/store.js.map +1 -0
- package/dist/usage-local/types.d.ts +94 -0
- package/dist/usage-local/types.d.ts.map +1 -0
- package/dist/usage-local/types.js +6 -0
- package/dist/usage-local/types.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/checkup/types.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,qDAAqD"}
|
package/dist/mcp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAkDH;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DjD;AAKD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -37,6 +37,9 @@ import { loadConfig } from './config.js';
|
|
|
37
37
|
import { BrainClient } from './brain-client.js';
|
|
38
38
|
import { registerAllTools } from './tools/index.js';
|
|
39
39
|
import { Vault } from '../vault/index.js';
|
|
40
|
+
import { startUsageLocal } from '../usage-local/index.js';
|
|
41
|
+
import { ReconciliationEngine } from '../reconciliation/index.js';
|
|
42
|
+
import { AnthropicConnector, OpenAIConnector, DeepSeekConnector, KimiConnector, QwenConnector, DoubaoConnector, } from '../connectors/index.js';
|
|
40
43
|
const PACKAGE_NAME = '@skillfm/local';
|
|
41
44
|
// Resolve version from the host package.json so the MCP server reports the
|
|
42
45
|
// same version as `skillfm-local --version`. dist/mcp/index.js sits two
|
|
@@ -79,6 +82,28 @@ export async function startServer() {
|
|
|
79
82
|
// BYOK 红线: keys 加密存 ~/.skillfm/vault.{key,enc}, 不出节点
|
|
80
83
|
// lazy init (vault.put/get 内部 ensureInitialized)
|
|
81
84
|
const vault = new Vault();
|
|
85
|
+
// Beacon V2 (PRD V1.3): 启动 L0 trajectory watcher + 对账 engine
|
|
86
|
+
// fire-and-forget; 失败不阻塞 MCP server 启动 (例: 用户没装 OpenClaw)
|
|
87
|
+
let usageStore = null;
|
|
88
|
+
let reconciliationEngine = null;
|
|
89
|
+
try {
|
|
90
|
+
const usage = await startUsageLocal({ verbose: false });
|
|
91
|
+
usageStore = usage.store;
|
|
92
|
+
const connectors = {
|
|
93
|
+
anthropic: new AnthropicConnector(),
|
|
94
|
+
openai: new OpenAIConnector(),
|
|
95
|
+
deepseek: new DeepSeekConnector(),
|
|
96
|
+
kimi: new KimiConnector(),
|
|
97
|
+
qwen: new QwenConnector(),
|
|
98
|
+
doubao: new DoubaoConnector(),
|
|
99
|
+
};
|
|
100
|
+
reconciliationEngine = new ReconciliationEngine({
|
|
101
|
+
vault, connectors, store: usageStore,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
console.error(`[skillfm-local mcp] Beacon V2 init failed (non-blocking): ${e.message}`);
|
|
106
|
+
}
|
|
82
107
|
const server = new McpServer({
|
|
83
108
|
name: 'skillfm-beacon',
|
|
84
109
|
version: PACKAGE_VERSION,
|
|
@@ -86,6 +111,8 @@ export async function startServer() {
|
|
|
86
111
|
registerAllTools(server, {
|
|
87
112
|
brain,
|
|
88
113
|
vault,
|
|
114
|
+
usageStore,
|
|
115
|
+
reconciliationEngine,
|
|
89
116
|
// Phase 0 stub: any token = Pro. Week 5 will read tier from token claims.
|
|
90
117
|
isProTier: !cfg.degraded,
|
|
91
118
|
});
|
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { LocalUsageStore } from '../../usage-local/index.js';
|
|
2
|
+
import type { ReconciliationEngine } from '../../reconciliation/index.js';
|
|
3
|
+
import type { CheckupReport } from '../../checkup/index.js';
|
|
4
|
+
import type { SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
5
|
+
export interface SkillFmCheckupInput {
|
|
6
|
+
/** 是否返完整 finding 列表 (默认 false, 主入口模式只返 score + 5 维度 + top_focus) */
|
|
7
|
+
full?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface SkillFmCheckupOutput {
|
|
10
|
+
/** 渲染好的主入口文本 (< 300 字) */
|
|
11
|
+
rendered: string;
|
|
12
|
+
/** 完整 report (agent 可深挖) */
|
|
13
|
+
report: CheckupReport;
|
|
14
|
+
}
|
|
15
|
+
export interface CheckupToolDeps {
|
|
16
|
+
store: LocalUsageStore;
|
|
17
|
+
reconciliationEngine: ReconciliationEngine;
|
|
18
|
+
is_pro: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function handleSkillFmCheckup(_input: SkillFmCheckupInput, deps: CheckupToolDeps): Promise<SkillFmToolResult<SkillFmCheckupOutput>>;
|
|
21
|
+
//# sourceMappingURL=checkup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkup.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/checkup.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAEvF,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,CAsBlD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/mcp/tools/checkup.ts
|
|
2
|
+
//
|
|
3
|
+
// MCP tool: skillfm_checkup — Beacon V2 主入口 (PRD V1.3 §3.1).
|
|
4
|
+
//
|
|
5
|
+
// Agent 调此 tool 时返回:
|
|
6
|
+
// - 渲染好的 < 300 字主入口 UX (text)
|
|
7
|
+
// - 完整 CheckupReport (data, agent 可深挖各维度)
|
|
8
|
+
//
|
|
9
|
+
// 触发: 用户在 IM / agent 里说"看 SkillFM 体检" / "/skillfm" / "我家 AI 状态" 等
|
|
10
|
+
import { runCheckup, renderMainEntry } from '../../checkup/index.js';
|
|
11
|
+
export async function handleSkillFmCheckup(_input, deps) {
|
|
12
|
+
try {
|
|
13
|
+
const report = await runCheckup({
|
|
14
|
+
store: deps.store,
|
|
15
|
+
reconciliationEngine: deps.reconciliationEngine,
|
|
16
|
+
is_pro: deps.is_pro,
|
|
17
|
+
});
|
|
18
|
+
const rendered = renderMainEntry(report);
|
|
19
|
+
return {
|
|
20
|
+
ok: true,
|
|
21
|
+
data: { rendered, report },
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
return {
|
|
26
|
+
ok: false,
|
|
27
|
+
error: {
|
|
28
|
+
code: 'CHECKUP.FAILED',
|
|
29
|
+
message: e.message,
|
|
30
|
+
retryable: true,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=checkup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkup.js","sourceRoot":"","sources":["../../../src/mcp/tools/checkup.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,6DAA6D;AAC7D,EAAE;AACF,qBAAqB;AACrB,gCAAgC;AAChC,4CAA4C;AAC5C,EAAE;AACF,kEAAkE;AAIlE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAsBrE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA2B,EAC3B,IAAqB;IAErB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;SAC3B,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAG,CAAW,CAAC,OAAO;gBAC7B,SAAS,EAAE,IAAI;aAChB;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -25,6 +25,8 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
25
25
|
import type { BrainClient } from '../brain-client.js';
|
|
26
26
|
import type { MemoryStore } from '../../memory/index.js';
|
|
27
27
|
import type { Vault } from '../../vault/index.js';
|
|
28
|
+
import type { LocalUsageStore } from '../../usage-local/index.js';
|
|
29
|
+
import type { ReconciliationEngine } from '../../reconciliation/index.js';
|
|
28
30
|
export interface ToolRegistryDeps {
|
|
29
31
|
brain: BrainClient;
|
|
30
32
|
/** Phase 0: derived from `agentToken !== null`; Week 5: real claim. */
|
|
@@ -33,6 +35,10 @@ export interface ToolRegistryDeps {
|
|
|
33
35
|
memory?: MemoryStore | null;
|
|
34
36
|
/** Local credential vault (BYOK: keys 加密存本地节点 ~/.skillfm/vault.{key,enc}, 不出节点) */
|
|
35
37
|
vault?: Vault | null;
|
|
38
|
+
/** Beacon V2: 本地 trajectory 聚合 store (PRD §4.1 / §6) */
|
|
39
|
+
usageStore?: LocalUsageStore | null;
|
|
40
|
+
/** Beacon V2: L0+L1+L2 三口径对账 engine (PRD §5) */
|
|
41
|
+
reconciliationEngine?: ReconciliationEngine | null;
|
|
36
42
|
}
|
|
37
43
|
/**
|
|
38
44
|
* Register every Phase 0 beacon MCP tool. Called once by src/index.ts on
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAwBtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAM1E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,mFAAmF;IACnF,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,wDAAwD;IACxD,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,gDAAgD;IAChD,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACpD;AAmVD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAGhF;AAED,yEAAyE;AACzE,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAEtD"}
|
package/dist/mcp/tools/index.js
CHANGED
|
@@ -37,6 +37,9 @@ import { handleMemorySave } from './memory-save.js';
|
|
|
37
37
|
import { handleMemoryRecent } from './memory-recent.js';
|
|
38
38
|
import { handleSaveCredential, handleGetCredential, handleListCredentials, handleRemoveCredential, } from './credential-tools.js';
|
|
39
39
|
import { handleExplainProviderKey } from './explain-provider-key.js';
|
|
40
|
+
import { handleSkillFmCheckup } from './checkup.js';
|
|
41
|
+
import { handleSkillFmShowMyUsage } from './show-my-usage.js';
|
|
42
|
+
import { handleSkillFmSetupGateway } from './setup-gateway.js';
|
|
40
43
|
// ============================================================================
|
|
41
44
|
// Minimal input shape — every Phase 0 tool accepts a free-form object.
|
|
42
45
|
// Validation is done inside handlers (so failures come back as
|
|
@@ -58,6 +61,16 @@ const GET_CREDENTIAL_SCHEMA = z.object({
|
|
|
58
61
|
const REMOVE_CREDENTIAL_SCHEMA = z.object({
|
|
59
62
|
provider: z.string().describe('Provider name to remove from vault'),
|
|
60
63
|
});
|
|
64
|
+
// Beacon V2 tool schemas (P0: PASSTHROUGH 让 fields 被 strip 是真根因 dry_run/window/full 失效)
|
|
65
|
+
const CHECKUP_SCHEMA = z.object({
|
|
66
|
+
full: z.boolean().optional().describe('true 返完整 finding 列表; false (默认) 只返主入口模式'),
|
|
67
|
+
});
|
|
68
|
+
const SHOW_MY_USAGE_SCHEMA = z.object({
|
|
69
|
+
window: z.enum(['today', 'week', 'month', 'all']).optional().describe('时间窗口, 默认 today'),
|
|
70
|
+
});
|
|
71
|
+
const SETUP_GATEWAY_SCHEMA = z.object({
|
|
72
|
+
dry_run: z.boolean().optional().describe('true 仅 detect 不真改 IDE config (用于 onboarding 时先 surface 给用户看); false (默认) 真执行'),
|
|
73
|
+
});
|
|
61
74
|
/** MCP SDK requires content blocks. We always wrap our envelope as JSON text. */
|
|
62
75
|
function wrapEnvelope(envelope) {
|
|
63
76
|
return {
|
|
@@ -162,6 +175,40 @@ function registerKeyTools(server, deps) {
|
|
|
162
175
|
const env = await handleExplainProviderKey(input);
|
|
163
176
|
return wrapEnvelope(env);
|
|
164
177
|
});
|
|
178
|
+
// ─── Beacon V2: 主入口 + 用量 + Gateway onboarding ───
|
|
179
|
+
// 三个新 tool 依赖 usageStore + reconciliationEngine (Sidecar cmdStart 启动后注入).
|
|
180
|
+
// 没启动时返 BEACON_V2_NOT_READY error.
|
|
181
|
+
server.tool('skillfm_checkup', 'CRITICAL — Beacon V2 主入口. 用户说"看 SkillFM 体检" / "/skillfm" / "我家 AI 状态" 时调此 tool. 返渲染好的 < 300 字主入口 UX (text) + 完整 CheckupReport (健康度 score / 5 维度状态 / 今日 #1 / 对账 surface). Rendered text 直接转给用户看, 不要修改; agent 可深挖 report.dimensions 看每维度详情.', CHECKUP_SCHEMA.shape, async (input) => {
|
|
182
|
+
if (!deps.usageStore || !deps.reconciliationEngine) {
|
|
183
|
+
return wrapEnvelope({
|
|
184
|
+
ok: false,
|
|
185
|
+
error: { code: 'BEACON_V2.NOT_READY', message: 'Usage store / reconciliation engine not initialized in this transport.', retryable: false },
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
const env = await handleSkillFmCheckup(input, {
|
|
189
|
+
store: deps.usageStore,
|
|
190
|
+
reconciliationEngine: deps.reconciliationEngine,
|
|
191
|
+
is_pro: deps.isProTier,
|
|
192
|
+
});
|
|
193
|
+
return wrapEnvelope(env);
|
|
194
|
+
});
|
|
195
|
+
server.tool('skillfm_show_my_usage', 'Beacon V2: 看用户的 LLM 真用量数据 (按 today / week / month 时间窗口). 返跨 agent / 跨 provider / 跨 model 的聚合 + 估算成本 + Save Token 建议 (E1 router / E2 cache / E3 batch 扫描结果). 用户问"我用了多少 token / 花了多少钱 / 哪能省" 时调.', SHOW_MY_USAGE_SCHEMA.shape, async (input) => {
|
|
196
|
+
if (!deps.usageStore) {
|
|
197
|
+
return wrapEnvelope({
|
|
198
|
+
ok: false,
|
|
199
|
+
error: { code: 'BEACON_V2.NOT_READY', message: 'Usage store not initialized.', retryable: false },
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
const env = await handleSkillFmShowMyUsage(input, {
|
|
203
|
+
store: deps.usageStore,
|
|
204
|
+
is_pro: deps.isProTier,
|
|
205
|
+
});
|
|
206
|
+
return wrapEnvelope(env);
|
|
207
|
+
});
|
|
208
|
+
server.tool('skillfm_setup_gateway', 'Beacon V2 Onboarding 一键配置: 检测用户 IDE (Claude Code / Cursor / Codex / shell-env) + 改 ANTHROPIC_BASE_URL / OPENAI_API_BASE 指向 SkillFM gateway. 真改前 backup 原 config + 提供 1 行 revert command. dry_run=true 仅 detect 不真改 (用于 onboarding 时先 surface 给用户看会改啥). 用户授权后调 dry_run=false 真执行.', SETUP_GATEWAY_SCHEMA.shape, async (input) => {
|
|
209
|
+
const env = await handleSkillFmSetupGateway(input);
|
|
210
|
+
return wrapEnvelope(env);
|
|
211
|
+
});
|
|
165
212
|
}
|
|
166
213
|
// ============================================================================
|
|
167
214
|
// Placeholder tools — names reserved by contract but Phase 0 = NOT_IMPLEMENTED
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,kBAAkB,GAOnB,MAAM,+CAA+C,CAAC;AAIvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SetupResult } from '../../save-token/gateway-setup.js';
|
|
2
|
+
import type { GatewayDetection } from '../../save-token/types.js';
|
|
3
|
+
import type { SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
4
|
+
export interface SkillFmSetupGatewayInput {
|
|
5
|
+
/** dry_run=true 只 detect 不真改 (用于 onboarding 时先 surface 给用户看会改啥) */
|
|
6
|
+
dry_run?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface SkillFmSetupGatewayOutput {
|
|
9
|
+
gateway_base_url: string;
|
|
10
|
+
detections: GatewayDetection[];
|
|
11
|
+
setup_results: SetupResult[];
|
|
12
|
+
/** 渲染好的人类可读总结 */
|
|
13
|
+
rendered: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function handleSkillFmSetupGateway(input: SkillFmSetupGatewayInput): Promise<SkillFmToolResult<SkillFmSetupGatewayOutput>>;
|
|
16
|
+
//# sourceMappingURL=setup-gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-gateway.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/setup-gateway.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAEvF,MAAM,WAAW,wBAAwB;IACvC,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,CAAC,CA2BvD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/mcp/tools/setup-gateway.ts
|
|
2
|
+
//
|
|
3
|
+
// MCP tool: skillfm_setup_gateway — Onboarding 一键配置 (PRD §3.4 + 决策 #8).
|
|
4
|
+
//
|
|
5
|
+
// 用法:
|
|
6
|
+
// 1. agent 收到用户授权 → 调此 tool, dry_run=false
|
|
7
|
+
// 2. 此 tool 检测 IDE → 改 config → 返 setup_results 含 revert_command
|
|
8
|
+
// 3. agent 把结果转译给用户 ("我改了你 ~/.claude/settings.json 里的 ANTHROPIC_BASE_URL,
|
|
9
|
+
// 想 revert 的话跑 cp /tmp/.../claude-settings.json ~/.claude/settings.json")
|
|
10
|
+
import { detectIDEs, setupAllDetectedGateways, SKILLFM_GATEWAY_BASE_URL, } from '../../save-token/gateway-setup.js';
|
|
11
|
+
export async function handleSkillFmSetupGateway(input) {
|
|
12
|
+
const dry_run = input.dry_run ?? false;
|
|
13
|
+
try {
|
|
14
|
+
const detections = await detectIDEs();
|
|
15
|
+
const setup_results = dry_run ? [] : await setupAllDetectedGateways();
|
|
16
|
+
const rendered = renderSetupReport(dry_run, detections, setup_results);
|
|
17
|
+
return {
|
|
18
|
+
ok: true,
|
|
19
|
+
data: {
|
|
20
|
+
gateway_base_url: SKILLFM_GATEWAY_BASE_URL,
|
|
21
|
+
detections,
|
|
22
|
+
setup_results,
|
|
23
|
+
rendered,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
error: {
|
|
31
|
+
code: 'GATEWAY.SETUP_FAILED',
|
|
32
|
+
message: e.message,
|
|
33
|
+
retryable: false,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function renderSetupReport(dry_run, detections, results) {
|
|
39
|
+
const lines = [];
|
|
40
|
+
lines.push(`🔌 SkillFM Gateway Setup ${dry_run ? '(dry run)' : ''}`);
|
|
41
|
+
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
42
|
+
lines.push(`Gateway URL: ${SKILLFM_GATEWAY_BASE_URL}`);
|
|
43
|
+
lines.push('');
|
|
44
|
+
lines.push('检测到的 IDE:');
|
|
45
|
+
for (const d of detections) {
|
|
46
|
+
if (!d.detected)
|
|
47
|
+
continue;
|
|
48
|
+
const status = d.setup_status === 'configured' ? '✅ 已配置' : '⚠️ 未配置';
|
|
49
|
+
lines.push(` ${d.ide}: ${status}${d.config_path ? ` (${d.config_path})` : ''}`);
|
|
50
|
+
}
|
|
51
|
+
if (dry_run) {
|
|
52
|
+
lines.push('');
|
|
53
|
+
lines.push('⚠️ dry_run 模式 — 没有真改任何文件');
|
|
54
|
+
lines.push('调 skillfm_setup_gateway({dry_run: false}) 真执行');
|
|
55
|
+
return lines.join('\n');
|
|
56
|
+
}
|
|
57
|
+
if (results.length === 0) {
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push('❌ 没有可配置的 IDE — 请确认你装了 Claude Code / Cursor / Codex 等支持的 IDE');
|
|
60
|
+
return lines.join('\n');
|
|
61
|
+
}
|
|
62
|
+
lines.push('');
|
|
63
|
+
lines.push('Setup 结果:');
|
|
64
|
+
for (const r of results) {
|
|
65
|
+
if (r.applied) {
|
|
66
|
+
lines.push(` ✅ ${r.ide}: 已配 (${r.config_path})`);
|
|
67
|
+
if (r.revert_command) {
|
|
68
|
+
lines.push(` 回滚: ${r.revert_command}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
lines.push(` ⚠️ ${r.ide}: ${r.error ?? 'skip'}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
lines.push('');
|
|
76
|
+
lines.push('🎉 完成! Agent 重启后, 所有 LLM 调用会经过 SkillFM gateway, 我可以自动 cache + 路由 + 记账.');
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=setup-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-gateway.js","sourceRoot":"","sources":["../../../src/mcp/tools/setup-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { LocalUsageStore } from '../../usage-local/index.js';
|
|
2
|
+
import type { UsageAggregation, UsageByProvider, UsageByAgent, UsageByModel } from '../../usage-local/types.js';
|
|
3
|
+
import type { SaveTokenSuggestion } from '../../save-token/types.js';
|
|
4
|
+
import type { SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
5
|
+
export type UsageWindow = 'today' | 'week' | 'month' | 'all';
|
|
6
|
+
export interface SkillFmShowMyUsageInput {
|
|
7
|
+
/** 时间窗口 (默认 'today') */
|
|
8
|
+
window?: UsageWindow;
|
|
9
|
+
}
|
|
10
|
+
export interface SkillFmShowMyUsageOutput {
|
|
11
|
+
window: UsageWindow;
|
|
12
|
+
total: UsageAggregation;
|
|
13
|
+
by_provider: UsageByProvider[];
|
|
14
|
+
by_agent: UsageByAgent[];
|
|
15
|
+
by_model: UsageByModel[];
|
|
16
|
+
/** Save Token 建议 (Free surface) */
|
|
17
|
+
save_token_suggestions: SaveTokenSuggestion[];
|
|
18
|
+
/** 渲染好的人类可读文本 */
|
|
19
|
+
rendered: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ShowMyUsageDeps {
|
|
22
|
+
store: LocalUsageStore;
|
|
23
|
+
is_pro: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function handleSkillFmShowMyUsage(input: SkillFmShowMyUsageInput, deps: ShowMyUsageDeps): Promise<SkillFmToolResult<SkillFmShowMyUsageOutput>>;
|
|
26
|
+
//# sourceMappingURL=show-my-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show-my-usage.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/show-my-usage.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,YAAY,EACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAEvF,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE7D,MAAM,WAAW,uBAAuB;IACtC,wBAAwB;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,gBAAgB,CAAC;IACxB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,mCAAmC;IACnC,sBAAsB,EAAE,mBAAmB,EAAE,CAAC;IAC9C,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,uBAAuB,EAC9B,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,CAAC,CAsBtD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/mcp/tools/show-my-usage.ts
|
|
2
|
+
//
|
|
3
|
+
// MCP tool: skillfm_show_my_usage — 看真用量数据 (PRD §6 Save Token Engine surface)
|
|
4
|
+
// agent 调此 tool 时返:
|
|
5
|
+
// - 时间窗口内用量聚合 (today / week / month)
|
|
6
|
+
// - 按 provider / agent / model 分组
|
|
7
|
+
// - Save Token 建议 (E1/E2/E3 扫描结果)
|
|
8
|
+
import { timeWindow } from '../../usage-local/store.js';
|
|
9
|
+
import { scanAllEngines } from '../../save-token/index.js';
|
|
10
|
+
export async function handleSkillFmShowMyUsage(input, deps) {
|
|
11
|
+
const window = input.window ?? 'today';
|
|
12
|
+
const q = timeWindow(window);
|
|
13
|
+
const total = deps.store.aggregate(q);
|
|
14
|
+
const by_provider = deps.store.aggregateByProvider(q).sort((a, b) => b.total_cost_usd - a.total_cost_usd);
|
|
15
|
+
const by_agent = deps.store.aggregateByAgent(q).sort((a, b) => b.total_cost_usd - a.total_cost_usd);
|
|
16
|
+
const by_model = deps.store.aggregateByModel(q).sort((a, b) => b.total_cost_usd - a.total_cost_usd);
|
|
17
|
+
const save_token_suggestions = await scanAllEngines(deps.store, {
|
|
18
|
+
is_pro: deps.is_pro,
|
|
19
|
+
start: q.start,
|
|
20
|
+
end: q.end,
|
|
21
|
+
});
|
|
22
|
+
const rendered = renderUsageReport(window, total, by_provider, by_agent, by_model, save_token_suggestions);
|
|
23
|
+
return {
|
|
24
|
+
ok: true,
|
|
25
|
+
data: {
|
|
26
|
+
window, total, by_provider, by_agent, by_model, save_token_suggestions, rendered,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function renderUsageReport(window, total, by_provider, _by_agent, by_model, suggestions) {
|
|
31
|
+
const lines = [];
|
|
32
|
+
const periodLabel = { today: '今日', week: '本周', month: '本月', all: '历史' }[window];
|
|
33
|
+
lines.push(`💰 用量 ${periodLabel}`);
|
|
34
|
+
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
35
|
+
lines.push(`总: ¥${total.total_cost_cny.toFixed(2)} (${total.input_tokens + total.output_tokens} token, ${total.call_count} 次)`);
|
|
36
|
+
if (by_provider.length > 0) {
|
|
37
|
+
lines.push('');
|
|
38
|
+
lines.push('按 Provider:');
|
|
39
|
+
for (const p of by_provider.slice(0, 5)) {
|
|
40
|
+
const pct = total.total_cost_cny > 0 ? (p.total_cost_cny / total.total_cost_cny * 100).toFixed(0) : '0';
|
|
41
|
+
lines.push(` ${p.provider}: ¥${p.total_cost_cny.toFixed(2)} (${pct}%)`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (by_model.length > 0) {
|
|
45
|
+
lines.push('');
|
|
46
|
+
lines.push('按 Model (top 5):');
|
|
47
|
+
for (const m of by_model.slice(0, 5)) {
|
|
48
|
+
lines.push(` ${m.provider}/${m.model_id}: ¥${m.total_cost_cny.toFixed(2)} × ${m.call_count} 次`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (suggestions.length > 0) {
|
|
52
|
+
lines.push('');
|
|
53
|
+
lines.push('💡 省 token 建议 (按月省排序):');
|
|
54
|
+
for (const s of suggestions.slice(0, 5)) {
|
|
55
|
+
lines.push(` ${s.engine}: ${s.headline}`);
|
|
56
|
+
lines.push(` 估月省 ¥${s.estimated_savings_cny} (${s.estimated_savings_pct}% off)`);
|
|
57
|
+
if (s.fix_method === 'free_manual' && s.pro_unlock_label) {
|
|
58
|
+
lines.push(` ${s.pro_unlock_label}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
lines.push('');
|
|
64
|
+
lines.push('✨ 无明显省 token 机会, 你 AI 用得已经很高效');
|
|
65
|
+
}
|
|
66
|
+
return lines.join('\n');
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=show-my-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show-my-usage.js","sourceRoot":"","sources":["../../../src/mcp/tools/show-my-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Vault } from '../vault/index.js';
|
|
2
|
+
import type { Connector } from '../connectors/types.js';
|
|
3
|
+
import type { LocalUsageStore } from '../usage-local/store.js';
|
|
4
|
+
import type { ReconciliationResult, ReconcileOptions } from './types.js';
|
|
5
|
+
export interface EngineDeps {
|
|
6
|
+
vault: Vault;
|
|
7
|
+
connectors: Record<string, Connector>;
|
|
8
|
+
store: LocalUsageStore;
|
|
9
|
+
/** Override balance history file path */
|
|
10
|
+
historyPath?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class ReconciliationEngine {
|
|
13
|
+
private deps;
|
|
14
|
+
constructor(deps: EngineDeps);
|
|
15
|
+
/**
|
|
16
|
+
* 全部 provider 对账 (跑 vault 里所有 key 对应的 provider)
|
|
17
|
+
* 默认窗口: 今日 00:00 → 现在
|
|
18
|
+
*/
|
|
19
|
+
reconcileAll(opts?: ReconcileOptions): Promise<ReconciliationResult[]>;
|
|
20
|
+
/**
|
|
21
|
+
* 单 provider 对账 — auto select L1 vs L2 vs no_data
|
|
22
|
+
*/
|
|
23
|
+
reconcileProvider(provider: string, start: string, end: string): Promise<ReconciliationResult>;
|
|
24
|
+
/**
|
|
25
|
+
* 单条 surface 用的 1 行总结 (主入口 UX)
|
|
26
|
+
* "OpenAI: 估算 ¥3.20 vs 真扣 ¥3.40 偏差 6.3% ✅"
|
|
27
|
+
*/
|
|
28
|
+
static formatSurfaceLine(r: ReconciliationResult): string;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/reconciliation/engine.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQzE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,KAAK,EAAE,eAAe,CAAC;IACvB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,oBAAoB;IACnB,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEpC;;;OAGG;IACG,YAAY,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAiBhF;;OAEG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,oBAAoB,CAAC;IAsBhC;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM;CAG1D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/reconciliation/engine.ts
|
|
2
|
+
//
|
|
3
|
+
// Reconciliation Engine — 主类,coordinate L1 + L2,produce per-provider 结果.
|
|
4
|
+
// SkillFM 真护城河: 跟 Helicone/Cursor billing 拉开的"双口径对账"层.
|
|
5
|
+
import { reconcileL1 } from './l1-reconciler.js';
|
|
6
|
+
import { reconcileL2 } from './l2-reconciler.js';
|
|
7
|
+
const L1_PROVIDERS = new Set(['openai', 'anthropic']);
|
|
8
|
+
const L2_PROVIDERS = new Set(['deepseek', 'kimi']);
|
|
9
|
+
export class ReconciliationEngine {
|
|
10
|
+
deps;
|
|
11
|
+
constructor(deps) {
|
|
12
|
+
this.deps = deps;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 全部 provider 对账 (跑 vault 里所有 key 对应的 provider)
|
|
16
|
+
* 默认窗口: 今日 00:00 → 现在
|
|
17
|
+
*/
|
|
18
|
+
async reconcileAll(opts = {}) {
|
|
19
|
+
const now = new Date();
|
|
20
|
+
const start = opts.start ?? new Date(now.getFullYear(), now.getMonth(), now.getDate()).toISOString();
|
|
21
|
+
const end = opts.end ?? now.toISOString();
|
|
22
|
+
let providers = opts.providers;
|
|
23
|
+
if (!providers) {
|
|
24
|
+
// 默认: vault 里所有 provider
|
|
25
|
+
providers = await this.deps.vault.list();
|
|
26
|
+
}
|
|
27
|
+
const results = await Promise.all(providers.map((p) => this.reconcileProvider(p, start, end)));
|
|
28
|
+
return results;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 单 provider 对账 — auto select L1 vs L2 vs no_data
|
|
32
|
+
*/
|
|
33
|
+
async reconcileProvider(provider, start, end) {
|
|
34
|
+
const p = provider.toLowerCase();
|
|
35
|
+
if (L1_PROVIDERS.has(p)) {
|
|
36
|
+
return reconcileL1(this.deps, { provider: p, start, end });
|
|
37
|
+
}
|
|
38
|
+
if (L2_PROVIDERS.has(p)) {
|
|
39
|
+
return reconcileL2(this.deps, { provider: p, start, end });
|
|
40
|
+
}
|
|
41
|
+
// 其他 provider: 仅返 L0 数字,不对账
|
|
42
|
+
const l0Agg = this.deps.store.aggregate({ start, end, providers: [p] });
|
|
43
|
+
return {
|
|
44
|
+
provider: p,
|
|
45
|
+
reconciled_at: new Date().toISOString(),
|
|
46
|
+
window_start: start,
|
|
47
|
+
window_end: end,
|
|
48
|
+
l0_estimated_usd: l0Agg.total_cost_usd,
|
|
49
|
+
level: 'no_data',
|
|
50
|
+
anomalies: [],
|
|
51
|
+
human_summary: `${p}: 仅 L0 估算 ¥${(l0Agg.total_cost_usd * 7.3).toFixed(2)} (此 provider 暂不支持对账)`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 单条 surface 用的 1 行总结 (主入口 UX)
|
|
56
|
+
* "OpenAI: 估算 ¥3.20 vs 真扣 ¥3.40 偏差 6.3% ✅"
|
|
57
|
+
*/
|
|
58
|
+
static formatSurfaceLine(r) {
|
|
59
|
+
return r.human_summary;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/reconciliation/engine.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,yEAAyE;AACzE,uDAAuD;AAOvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AACtD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAWnD,MAAM,OAAO,oBAAoB;IACX;IAApB,YAAoB,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAExC;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,OAAyB,EAAE;QAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACrG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QAE1C,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,yBAAyB;YACzB,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3C,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAC5D,CAAC;QACF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,KAAa,EACb,GAAW;QAEX,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,4BAA4B;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxE,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACvC,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,GAAG;YACf,gBAAgB,EAAE,KAAK,CAAC,cAAc;YACtC,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,EAAE;YACb,aAAa,EAAE,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB;SAC/F,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,CAAuB;QAC9C,OAAO,CAAC,CAAC,aAAa,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type { DeviationLevel, AnomalyKind, ReconciliationResult, ReconcileOptions, BalanceSnapshot, } from './types.js';
|
|
2
|
+
export { reconcileL1, classifyDeviation } from './l1-reconciler.js';
|
|
3
|
+
export type { L1ReconcileDeps, L1ReconcileOptions } from './l1-reconciler.js';
|
|
4
|
+
export { reconcileL2 } from './l2-reconciler.js';
|
|
5
|
+
export type { L2ReconcileDeps, L2ReconcileOptions } from './l2-reconciler.js';
|
|
6
|
+
export { ReconciliationEngine } from './engine.js';
|
|
7
|
+
export type { EngineDeps } from './engine.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reconciliation/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/reconciliation/index.ts
|
|
2
|
+
//
|
|
3
|
+
// Reconciliation Engine — public API.
|
|
4
|
+
// 真护城河: L0 (本地 trace) + L1 (provider admin API) + L2 (provider balance diff) 三口径对账.
|
|
5
|
+
export { reconcileL1, classifyDeviation } from './l1-reconciler.js';
|
|
6
|
+
export { reconcileL2 } from './l2-reconciler.js';
|
|
7
|
+
export { ReconciliationEngine } from './engine.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|