@skillfm/local 2.6.4 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -1
- package/dist/_signers/aliyun-v3.d.ts +21 -0
- package/dist/_signers/aliyun-v3.d.ts.map +1 -0
- package/dist/_signers/aliyun-v3.js +47 -0
- package/dist/_signers/aliyun-v3.js.map +1 -0
- package/dist/_signers/canonical.d.ts +29 -0
- package/dist/_signers/canonical.d.ts.map +1 -0
- package/dist/_signers/canonical.js +59 -0
- package/dist/_signers/canonical.js.map +1 -0
- package/dist/_signers/index.d.ts +9 -0
- package/dist/_signers/index.d.ts.map +1 -0
- package/dist/_signers/index.js +6 -0
- package/dist/_signers/index.js.map +1 -0
- package/dist/_signers/tencent-tc3.d.ts +21 -0
- package/dist/_signers/tencent-tc3.d.ts.map +1 -0
- package/dist/_signers/tencent-tc3.js +48 -0
- package/dist/_signers/tencent-tc3.js.map +1 -0
- package/dist/_signers/volc-v4.d.ts +18 -0
- package/dist/_signers/volc-v4.d.ts.map +1 -0
- package/dist/_signers/volc-v4.js +43 -0
- package/dist/_signers/volc-v4.js.map +1 -0
- package/dist/asset-connectors/aliyun-ecs.d.ts +18 -0
- package/dist/asset-connectors/aliyun-ecs.d.ts.map +1 -0
- package/dist/asset-connectors/aliyun-ecs.js +99 -0
- package/dist/asset-connectors/aliyun-ecs.js.map +1 -0
- package/dist/asset-connectors/base.d.ts +15 -0
- package/dist/asset-connectors/base.d.ts.map +1 -0
- package/dist/asset-connectors/base.js +19 -0
- package/dist/asset-connectors/base.js.map +1 -0
- package/dist/asset-connectors/cloudflare.d.ts +18 -0
- package/dist/asset-connectors/cloudflare.d.ts.map +1 -0
- package/dist/asset-connectors/cloudflare.js +94 -0
- package/dist/asset-connectors/cloudflare.js.map +1 -0
- package/dist/asset-connectors/digitalocean.d.ts +18 -0
- package/dist/asset-connectors/digitalocean.d.ts.map +1 -0
- package/dist/asset-connectors/digitalocean.js +79 -0
- package/dist/asset-connectors/digitalocean.js.map +1 -0
- package/dist/asset-connectors/godaddy.d.ts +18 -0
- package/dist/asset-connectors/godaddy.d.ts.map +1 -0
- package/dist/asset-connectors/godaddy.js +62 -0
- package/dist/asset-connectors/godaddy.js.map +1 -0
- package/dist/asset-connectors/hetzner.d.ts +18 -0
- package/dist/asset-connectors/hetzner.d.ts.map +1 -0
- package/dist/asset-connectors/hetzner.js +52 -0
- package/dist/asset-connectors/hetzner.js.map +1 -0
- package/dist/asset-connectors/index.d.ts +18 -0
- package/dist/asset-connectors/index.d.ts.map +1 -0
- package/dist/asset-connectors/index.js +52 -0
- package/dist/asset-connectors/index.js.map +1 -0
- package/dist/asset-connectors/namecheap.d.ts +34 -0
- package/dist/asset-connectors/namecheap.d.ts.map +1 -0
- package/dist/asset-connectors/namecheap.js +178 -0
- package/dist/asset-connectors/namecheap.js.map +1 -0
- package/dist/asset-connectors/ssl-labs.d.ts +22 -0
- package/dist/asset-connectors/ssl-labs.d.ts.map +1 -0
- package/dist/asset-connectors/ssl-labs.js +79 -0
- package/dist/asset-connectors/ssl-labs.js.map +1 -0
- package/dist/asset-connectors/tencent-cvm.d.ts +18 -0
- package/dist/asset-connectors/tencent-cvm.d.ts.map +1 -0
- package/dist/asset-connectors/tencent-cvm.js +145 -0
- package/dist/asset-connectors/tencent-cvm.js.map +1 -0
- package/dist/asset-connectors/types.d.ts +45 -0
- package/dist/asset-connectors/types.d.ts.map +1 -0
- package/dist/asset-connectors/types.js +26 -0
- package/dist/asset-connectors/types.js.map +1 -0
- package/dist/asset-connectors/vultr.d.ts +18 -0
- package/dist/asset-connectors/vultr.d.ts.map +1 -0
- package/dist/asset-connectors/vultr.js +73 -0
- package/dist/asset-connectors/vultr.js.map +1 -0
- package/dist/connectors/anthropic.d.ts +10 -0
- package/dist/connectors/anthropic.d.ts.map +1 -0
- package/dist/connectors/anthropic.js +103 -0
- package/dist/connectors/anthropic.js.map +1 -0
- package/dist/connectors/base.d.ts +11 -0
- package/dist/connectors/base.d.ts.map +1 -0
- package/dist/connectors/base.js +19 -0
- package/dist/connectors/base.js.map +1 -0
- package/dist/connectors/deepseek.d.ts +14 -0
- package/dist/connectors/deepseek.d.ts.map +1 -0
- package/dist/connectors/deepseek.js +77 -0
- package/dist/connectors/deepseek.js.map +1 -0
- package/dist/connectors/doubao.d.ts +10 -0
- package/dist/connectors/doubao.d.ts.map +1 -0
- package/dist/connectors/doubao.js +64 -0
- package/dist/connectors/doubao.js.map +1 -0
- package/dist/connectors/index.d.ts +14 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +42 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/kimi.d.ts +10 -0
- package/dist/connectors/kimi.d.ts.map +1 -0
- package/dist/connectors/kimi.js +67 -0
- package/dist/connectors/kimi.js.map +1 -0
- package/dist/connectors/openai.d.ts +10 -0
- package/dist/connectors/openai.d.ts.map +1 -0
- package/dist/connectors/openai.js +101 -0
- package/dist/connectors/openai.js.map +1 -0
- package/dist/connectors/qwen.d.ts +10 -0
- package/dist/connectors/qwen.d.ts.map +1 -0
- package/dist/connectors/qwen.js +66 -0
- package/dist/connectors/qwen.js.map +1 -0
- package/dist/connectors/types.d.ts +47 -0
- package/dist/connectors/types.d.ts.map +1 -0
- package/dist/connectors/types.js +24 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/guard/bin.js +0 -0
- package/dist/index.js +50 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js +128 -0
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
- package/dist/mcp/brain-client.d.ts +96 -0
- package/dist/mcp/brain-client.d.ts.map +1 -0
- package/dist/mcp/brain-client.js +214 -0
- package/dist/mcp/brain-client.js.map +1 -0
- package/dist/mcp/cache.d.ts +55 -0
- package/dist/mcp/cache.d.ts.map +1 -0
- package/dist/mcp/cache.js +109 -0
- package/dist/mcp/cache.js.map +1 -0
- package/dist/mcp/config.d.ts +29 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +69 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/decision-engine.d.ts +54 -0
- package/dist/mcp/decision-engine.d.ts.map +1 -0
- package/dist/mcp/decision-engine.js +107 -0
- package/dist/mcp/decision-engine.js.map +1 -0
- package/dist/mcp/errors.d.ts +66 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +127 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +40 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +98 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools/_placeholder.d.ts +24 -0
- package/dist/mcp/tools/_placeholder.d.ts.map +1 -0
- package/dist/mcp/tools/_placeholder.js +29 -0
- package/dist/mcp/tools/_placeholder.js.map +1 -0
- package/dist/mcp/tools/avatar-market.d.ts +22 -0
- package/dist/mcp/tools/avatar-market.d.ts.map +1 -0
- package/dist/mcp/tools/avatar-market.js +33 -0
- package/dist/mcp/tools/avatar-market.js.map +1 -0
- package/dist/mcp/tools/check-expiry.d.ts +23 -0
- package/dist/mcp/tools/check-expiry.d.ts.map +1 -0
- package/dist/mcp/tools/check-expiry.js +29 -0
- package/dist/mcp/tools/check-expiry.js.map +1 -0
- package/dist/mcp/tools/check-usage.d.ts +25 -0
- package/dist/mcp/tools/check-usage.d.ts.map +1 -0
- package/dist/mcp/tools/check-usage.js +33 -0
- package/dist/mcp/tools/check-usage.js.map +1 -0
- package/dist/mcp/tools/get-monthly-picks.d.ts +25 -0
- package/dist/mcp/tools/get-monthly-picks.d.ts.map +1 -0
- package/dist/mcp/tools/get-monthly-picks.js +35 -0
- package/dist/mcp/tools/get-monthly-picks.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +41 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +139 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/memory-recent.d.ts +17 -0
- package/dist/mcp/tools/memory-recent.d.ts.map +1 -0
- package/dist/mcp/tools/memory-recent.js +46 -0
- package/dist/mcp/tools/memory-recent.js.map +1 -0
- package/dist/mcp/tools/memory-save.d.ts +15 -0
- package/dist/mcp/tools/memory-save.d.ts.map +1 -0
- package/dist/mcp/tools/memory-save.js +53 -0
- package/dist/mcp/tools/memory-save.js.map +1 -0
- package/dist/mcp/tools/memory-search.d.ts +24 -0
- package/dist/mcp/tools/memory-search.d.ts.map +1 -0
- package/dist/mcp/tools/memory-search.js +64 -0
- package/dist/mcp/tools/memory-search.js.map +1 -0
- package/dist/mcp/tools/record-acceptance.d.ts +22 -0
- package/dist/mcp/tools/record-acceptance.d.ts.map +1 -0
- package/dist/mcp/tools/record-acceptance.js +33 -0
- package/dist/mcp/tools/record-acceptance.js.map +1 -0
- package/dist/mcp/tools/record-rejection.d.ts +23 -0
- package/dist/mcp/tools/record-rejection.d.ts.map +1 -0
- package/dist/mcp/tools/record-rejection.js +34 -0
- package/dist/mcp/tools/record-rejection.js.map +1 -0
- package/dist/mcp/tools/suggest-route.d.ts +26 -0
- package/dist/mcp/tools/suggest-route.d.ts.map +1 -0
- package/dist/mcp/tools/suggest-route.js +56 -0
- package/dist/mcp/tools/suggest-route.js.map +1 -0
- package/dist/mcp/tools/user-preferences.d.ts +22 -0
- package/dist/mcp/tools/user-preferences.d.ts.map +1 -0
- package/dist/mcp/tools/user-preferences.js +63 -0
- package/dist/mcp/tools/user-preferences.js.map +1 -0
- package/dist/mcp-stdio/bin.js +0 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +4 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/mem0-client.d.ts +32 -0
- package/dist/memory/mem0-client.d.ts.map +1 -0
- package/dist/memory/mem0-client.js +161 -0
- package/dist/memory/mem0-client.js.map +1 -0
- package/dist/memory/types.d.ts +47 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +20 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/router/catalog.d.ts +4 -0
- package/dist/router/catalog.d.ts.map +1 -0
- package/dist/router/catalog.js +103 -0
- package/dist/router/catalog.js.map +1 -0
- package/dist/router/classifier.d.ts +5 -0
- package/dist/router/classifier.d.ts.map +1 -0
- package/dist/router/classifier.js +43 -0
- package/dist/router/classifier.js.map +1 -0
- package/dist/router/index.d.ts +7 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +6 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/litellm-config.d.ts +34 -0
- package/dist/router/litellm-config.d.ts.map +1 -0
- package/dist/router/litellm-config.js +78 -0
- package/dist/router/litellm-config.js.map +1 -0
- package/dist/router/route.d.ts +3 -0
- package/dist/router/route.d.ts.map +1 -0
- package/dist/router/route.js +63 -0
- package/dist/router/route.js.map +1 -0
- package/dist/router/types.d.ts +36 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/saas-connectors/base.d.ts +16 -0
- package/dist/saas-connectors/base.d.ts.map +1 -0
- package/dist/saas-connectors/base.js +16 -0
- package/dist/saas-connectors/base.js.map +1 -0
- package/dist/saas-connectors/brave.d.ts +19 -0
- package/dist/saas-connectors/brave.d.ts.map +1 -0
- package/dist/saas-connectors/brave.js +50 -0
- package/dist/saas-connectors/brave.js.map +1 -0
- package/dist/saas-connectors/fal.d.ts +15 -0
- package/dist/saas-connectors/fal.d.ts.map +1 -0
- package/dist/saas-connectors/fal.js +35 -0
- package/dist/saas-connectors/fal.js.map +1 -0
- package/dist/saas-connectors/index.d.ts +11 -0
- package/dist/saas-connectors/index.d.ts.map +1 -0
- package/dist/saas-connectors/index.js +32 -0
- package/dist/saas-connectors/index.js.map +1 -0
- package/dist/saas-connectors/replicate.d.ts +19 -0
- package/dist/saas-connectors/replicate.d.ts.map +1 -0
- package/dist/saas-connectors/replicate.js +43 -0
- package/dist/saas-connectors/replicate.js.map +1 -0
- package/dist/saas-connectors/serper.d.ts +19 -0
- package/dist/saas-connectors/serper.d.ts.map +1 -0
- package/dist/saas-connectors/serper.js +47 -0
- package/dist/saas-connectors/serper.js.map +1 -0
- package/dist/saas-connectors/types.d.ts +31 -0
- package/dist/saas-connectors/types.d.ts.map +1 -0
- package/dist/saas-connectors/types.js +6 -0
- package/dist/saas-connectors/types.js.map +1 -0
- package/dist/scheduler/index.d.ts +4 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +4 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/poll.d.ts +4 -0
- package/dist/scheduler/poll.d.ts.map +1 -0
- package/dist/scheduler/poll.js +170 -0
- package/dist/scheduler/poll.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +18 -0
- package/dist/scheduler/scheduler.d.ts.map +1 -0
- package/dist/scheduler/scheduler.js +67 -0
- package/dist/scheduler/scheduler.js.map +1 -0
- package/dist/scheduler/types.d.ts +49 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/scheduler/types.js +14 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/vault/cli.d.ts +2 -0
- package/dist/vault/cli.d.ts.map +1 -0
- package/dist/vault/cli.js +170 -0
- package/dist/vault/cli.js.map +1 -0
- package/dist/vault/crypto.d.ts +9 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +54 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/index.d.ts +6 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +5 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/types.d.ts +28 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +22 -0
- package/dist/vault/types.js.map +1 -0
- package/dist/vault/vault.d.ts +34 -0
- package/dist/vault/vault.d.ts.map +1 -0
- package/dist/vault/vault.js +149 -0
- package/dist/vault/vault.js.map +1 -0
- package/package.json +17 -5
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/mcp/tools/memory-save.ts
|
|
2
|
+
//
|
|
3
|
+
// MCP tool: skillfm_memory_save (Day 6 B1, Pro-only)
|
|
4
|
+
// 让 agent 显式保存当前对话片段到用户跨设备记忆
|
|
5
|
+
import { MemoryError } from '../../memory/index.js';
|
|
6
|
+
export async function handleMemorySave(input, deps) {
|
|
7
|
+
if (!deps.isProTier) {
|
|
8
|
+
return {
|
|
9
|
+
ok: false,
|
|
10
|
+
error: {
|
|
11
|
+
code: 'AUTH.PRO_REQUIRED',
|
|
12
|
+
message: 'Memory save is a Pro feature.',
|
|
13
|
+
retryable: false,
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (!deps.memory) {
|
|
18
|
+
return {
|
|
19
|
+
ok: false,
|
|
20
|
+
error: {
|
|
21
|
+
code: 'MEMORY.NOT_CONFIGURED',
|
|
22
|
+
message: 'Mem0 backend not configured.',
|
|
23
|
+
retryable: false,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (!input.text || input.text.length === 0) {
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
error: { code: 'INPUT.INVALID', message: 'text required', retryable: false },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const id = await deps.memory.put(input.text, {
|
|
35
|
+
source: input.source ?? 'manual',
|
|
36
|
+
user_tags: input.user_tags,
|
|
37
|
+
privacy: input.privacy ?? 'private',
|
|
38
|
+
});
|
|
39
|
+
return { ok: true, data: { id, saved_at: new Date().toISOString() } };
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
const code = e instanceof MemoryError ? e.code : 'MEMORY.UNKNOWN';
|
|
43
|
+
return {
|
|
44
|
+
ok: false,
|
|
45
|
+
error: {
|
|
46
|
+
code,
|
|
47
|
+
message: e instanceof Error ? e.message : String(e),
|
|
48
|
+
retryable: code === 'MEMORY_BACKEND_UNREACHABLE',
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=memory-save.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-save.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory-save.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,qDAAqD;AACrD,6BAA6B;AAG7B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAepD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAsB,EACtB,IAAqB;IAErB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,+BAA+B;gBACxC,SAAS,EAAE,KAAK;aACjB;SACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,8BAA8B;gBACvC,SAAS,EAAE,KAAK;aACjB;SACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE;SAC7E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;YAC3C,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ;YAChC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,SAAS;SACpC,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;IACxE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,CAAC,YAAY,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAClE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI;gBACJ,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBACnD,SAAS,EAAE,IAAI,KAAK,4BAA4B;aACjD;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
2
|
+
import type { MemoryStore } from '../../memory/index.js';
|
|
3
|
+
interface MemorySearchInput {
|
|
4
|
+
query: string;
|
|
5
|
+
k?: number;
|
|
6
|
+
min_score?: number;
|
|
7
|
+
}
|
|
8
|
+
interface MemorySearchOutput {
|
|
9
|
+
query: string;
|
|
10
|
+
results: Array<{
|
|
11
|
+
id: string;
|
|
12
|
+
text: string;
|
|
13
|
+
score: number;
|
|
14
|
+
created_at: string;
|
|
15
|
+
metadata: Record<string, unknown>;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
export interface MemoryToolsDeps {
|
|
19
|
+
memory: MemoryStore | null;
|
|
20
|
+
isProTier: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function handleMemorySearch(input: MemorySearchInput, deps: MemoryToolsDeps): Promise<SkillFmToolResult<MemorySearchOutput>>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=memory-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory-search.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,uBAAuB,CAAC;AAG7E,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC,CAwDhD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/mcp/tools/memory-search.ts
|
|
2
|
+
//
|
|
3
|
+
// MCP tool: skillfm_memory_search (Day 6 B1, Pro-only)
|
|
4
|
+
// 调 Mem0Client 检索用户跨 session/设备的记忆 — 让 agent "记住"前几次对话学到什么
|
|
5
|
+
import { MemoryError } from '../../memory/index.js';
|
|
6
|
+
export async function handleMemorySearch(input, deps) {
|
|
7
|
+
if (!deps.isProTier) {
|
|
8
|
+
return {
|
|
9
|
+
ok: false,
|
|
10
|
+
error: {
|
|
11
|
+
code: 'AUTH.PRO_REQUIRED',
|
|
12
|
+
message: 'Memory search is a Pro feature. Upgrade at https://skillfm.ai/beacon/upgrade',
|
|
13
|
+
retryable: false,
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (!deps.memory) {
|
|
18
|
+
return {
|
|
19
|
+
ok: false,
|
|
20
|
+
error: {
|
|
21
|
+
code: 'MEMORY.NOT_CONFIGURED',
|
|
22
|
+
message: 'Mem0 backend not configured. Run: skillfm-local memory setup',
|
|
23
|
+
retryable: false,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (!input.query || input.query.length === 0) {
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
error: { code: 'INPUT.INVALID', message: 'query required', retryable: false },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const r = await deps.memory.search(input.query, {
|
|
35
|
+
k: input.k ?? 5,
|
|
36
|
+
min_score: input.min_score,
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
ok: true,
|
|
40
|
+
data: {
|
|
41
|
+
query: input.query,
|
|
42
|
+
results: r.map((sr) => ({
|
|
43
|
+
id: sr.item.id,
|
|
44
|
+
text: sr.item.text,
|
|
45
|
+
score: sr.score,
|
|
46
|
+
created_at: sr.item.created_at,
|
|
47
|
+
metadata: sr.item.metadata,
|
|
48
|
+
})),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
const code = e instanceof MemoryError ? e.code : 'MEMORY.UNKNOWN';
|
|
54
|
+
return {
|
|
55
|
+
ok: false,
|
|
56
|
+
error: {
|
|
57
|
+
code,
|
|
58
|
+
message: e instanceof Error ? e.message : String(e),
|
|
59
|
+
retryable: code === 'MEMORY_BACKEND_UNREACHABLE',
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=memory-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-search.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory-search.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,uDAAuD;AACvD,2DAA2D;AAI3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAwBpD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAwB,EACxB,IAAqB;IAErB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,8EAA8E;gBACvF,SAAS,EAAE,KAAK;aACjB;SACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,8DAA8D;gBACvE,SAAS,EAAE,KAAK;aACjB;SACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE;SAC9E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,GAAyB,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;YACpE,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC;YACf,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QACH,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI,EAAE;gBACJ,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBACtB,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;oBACd,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI;oBAClB,KAAK,EAAE,EAAE,CAAC,KAAK;oBACf,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU;oBAC9B,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAmC;iBACtD,CAAC,CAAC;aACJ;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,CAAC,YAAY,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAClE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI;gBACJ,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBACnD,SAAS,EAAE,IAAI,KAAK,4BAA4B;aACjD;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tools/record-acceptance.ts — handler for `skillfm_record_acceptance`.
|
|
3
|
+
*
|
|
4
|
+
* Agent calls this AFTER the user accepted a SkillFM suggestion (e.g. "yes,
|
|
5
|
+
* switch to DeepSeek for this task"). Drives the brain feedback loop that
|
|
6
|
+
* raises future acceptance probability for that user × category.
|
|
7
|
+
*
|
|
8
|
+
* Phase 0: forwards to BrainClient.postFeedback (mock returns 0.42 rate).
|
|
9
|
+
*
|
|
10
|
+
* TODO Week 5:
|
|
11
|
+
* - Add idempotency-key (suggestionId + 'acc') — retries from MCP server
|
|
12
|
+
* restart shouldn't double-count.
|
|
13
|
+
* - If `realizedValue` provided, push into savings ledger.
|
|
14
|
+
* - Emit telemetry event 'acceptance' for product analytics.
|
|
15
|
+
*/
|
|
16
|
+
import { type SkillFmRecordAcceptanceInput, type SkillFmRecordFeedbackOutput, type SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
17
|
+
import type { BrainClient } from '../brain-client.js';
|
|
18
|
+
export interface RecordAcceptanceDeps {
|
|
19
|
+
brain: BrainClient;
|
|
20
|
+
}
|
|
21
|
+
export declare function handleRecordAcceptance(input: SkillFmRecordAcceptanceInput, deps: RecordAcceptanceDeps): Promise<SkillFmToolResult<SkillFmRecordFeedbackOutput>>;
|
|
22
|
+
//# sourceMappingURL=record-acceptance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-acceptance.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/record-acceptance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACvB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,4BAA4B,EACnC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,iBAAiB,CAAC,2BAA2B,CAAC,CAAC,CAezD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tools/record-acceptance.ts — handler for `skillfm_record_acceptance`.
|
|
3
|
+
*
|
|
4
|
+
* Agent calls this AFTER the user accepted a SkillFM suggestion (e.g. "yes,
|
|
5
|
+
* switch to DeepSeek for this task"). Drives the brain feedback loop that
|
|
6
|
+
* raises future acceptance probability for that user × category.
|
|
7
|
+
*
|
|
8
|
+
* Phase 0: forwards to BrainClient.postFeedback (mock returns 0.42 rate).
|
|
9
|
+
*
|
|
10
|
+
* TODO Week 5:
|
|
11
|
+
* - Add idempotency-key (suggestionId + 'acc') — retries from MCP server
|
|
12
|
+
* restart shouldn't double-count.
|
|
13
|
+
* - If `realizedValue` provided, push into savings ledger.
|
|
14
|
+
* - Emit telemetry event 'acceptance' for product analytics.
|
|
15
|
+
*/
|
|
16
|
+
import { invalidInput } from '../errors.js';
|
|
17
|
+
export async function handleRecordAcceptance(input, deps) {
|
|
18
|
+
if (typeof input.ruleId !== 'string' || input.ruleId.length === 0) {
|
|
19
|
+
return {
|
|
20
|
+
ok: false,
|
|
21
|
+
error: invalidInput('ruleId is required').toToolError(),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const result = await deps.brain.postFeedback('acceptance', input);
|
|
25
|
+
if (!result.ok) {
|
|
26
|
+
return {
|
|
27
|
+
ok: false,
|
|
28
|
+
error: { code: result.code, message: result.message, retryable: result.retryable },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return { ok: true, data: result.data };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=record-acceptance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-acceptance.js","sourceRoot":"","sources":["../../../src/mcp/tools/record-acceptance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAM5C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAmC,EACnC,IAA0B;IAE1B,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC,WAAW,EAAE;SACxD,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;SACnF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tools/record-rejection.ts — handler for `skillfm_record_rejection`.
|
|
3
|
+
*
|
|
4
|
+
* Agent calls this when the user dismisses a suggestion. Critical for
|
|
5
|
+
* keeping us out of "Clippy spam" territory: rejection signal feeds back
|
|
6
|
+
* into the decision engine via `acceptanceRateForCategory`.
|
|
7
|
+
*
|
|
8
|
+
* Phase 0: forwards to BrainClient.postFeedback (mock returns 0.31 rate).
|
|
9
|
+
*
|
|
10
|
+
* TODO Week 5:
|
|
11
|
+
* - When `reason='too_pushy'` arrives 3+ times for a category, brain
|
|
12
|
+
* should auto-disable that category in the user's prefs.
|
|
13
|
+
* - Surface rejection trends back to brain so curators can deprecate
|
|
14
|
+
* low-value rules.
|
|
15
|
+
* - Emit telemetry event 'rejection' with reason for product analytics.
|
|
16
|
+
*/
|
|
17
|
+
import { type SkillFmRecordRejectionInput, type SkillFmRecordFeedbackOutput, type SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
18
|
+
import type { BrainClient } from '../brain-client.js';
|
|
19
|
+
export interface RecordRejectionDeps {
|
|
20
|
+
brain: BrainClient;
|
|
21
|
+
}
|
|
22
|
+
export declare function handleRecordRejection(input: SkillFmRecordRejectionInput, deps: RecordRejectionDeps): Promise<SkillFmToolResult<SkillFmRecordFeedbackOutput>>;
|
|
23
|
+
//# sourceMappingURL=record-rejection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-rejection.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/record-rejection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACvB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,2BAA2B,EAClC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,iBAAiB,CAAC,2BAA2B,CAAC,CAAC,CAezD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tools/record-rejection.ts — handler for `skillfm_record_rejection`.
|
|
3
|
+
*
|
|
4
|
+
* Agent calls this when the user dismisses a suggestion. Critical for
|
|
5
|
+
* keeping us out of "Clippy spam" territory: rejection signal feeds back
|
|
6
|
+
* into the decision engine via `acceptanceRateForCategory`.
|
|
7
|
+
*
|
|
8
|
+
* Phase 0: forwards to BrainClient.postFeedback (mock returns 0.31 rate).
|
|
9
|
+
*
|
|
10
|
+
* TODO Week 5:
|
|
11
|
+
* - When `reason='too_pushy'` arrives 3+ times for a category, brain
|
|
12
|
+
* should auto-disable that category in the user's prefs.
|
|
13
|
+
* - Surface rejection trends back to brain so curators can deprecate
|
|
14
|
+
* low-value rules.
|
|
15
|
+
* - Emit telemetry event 'rejection' with reason for product analytics.
|
|
16
|
+
*/
|
|
17
|
+
import { invalidInput } from '../errors.js';
|
|
18
|
+
export async function handleRecordRejection(input, deps) {
|
|
19
|
+
if (typeof input.ruleId !== 'string' || input.ruleId.length === 0) {
|
|
20
|
+
return {
|
|
21
|
+
ok: false,
|
|
22
|
+
error: invalidInput('ruleId is required').toToolError(),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const result = await deps.brain.postFeedback('rejection', input);
|
|
26
|
+
if (!result.ok) {
|
|
27
|
+
return {
|
|
28
|
+
ok: false,
|
|
29
|
+
error: { code: result.code, message: result.message, retryable: result.retryable },
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return { ok: true, data: result.data };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=record-rejection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-rejection.js","sourceRoot":"","sources":["../../../src/mcp/tools/record-rejection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAM5C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAkC,EAClC,IAAyB;IAEzB,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC,WAAW,EAAE;SACxD,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;SACnF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tools/suggest-route.ts — handler for `skillfm_suggest_route`.
|
|
3
|
+
*
|
|
4
|
+
* Returns a model-routing recommendation BEFORE the agent runs the task.
|
|
5
|
+
* Phase 0: hardcoded recommendation (DeepSeek-Chat for code_completion,
|
|
6
|
+
* Claude Opus for reasoning) — matches PRD-MCP-SKILL §6.1 demo numbers.
|
|
7
|
+
*
|
|
8
|
+
* TODO Week 5:
|
|
9
|
+
* - Real call to brain `/v1/beacon/suggest-route` (LLM-as-router
|
|
10
|
+
* evaluates task vs. provider catalog).
|
|
11
|
+
* - Plug provider-side cost tables (refresh nightly via brain).
|
|
12
|
+
* - `qualityVsCurrent` should come from a real benchmark suite, not a
|
|
13
|
+
* hardcoded enum.
|
|
14
|
+
* - Frequency-limit + decision-engine wiring — currently bypass-call.
|
|
15
|
+
* - Honor `currentModel` input (skip suggestion if user is already on the
|
|
16
|
+
* cheapest viable option).
|
|
17
|
+
* - Quality-gate: `qualityRequirement='high'` should never recommend
|
|
18
|
+
* `significant_drop`.
|
|
19
|
+
*/
|
|
20
|
+
import { type SkillFmSuggestRouteInput, type SkillFmSuggestRouteOutput, type SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
21
|
+
import type { BrainClient } from '../brain-client.js';
|
|
22
|
+
export interface SuggestRouteDeps {
|
|
23
|
+
brain: BrainClient;
|
|
24
|
+
}
|
|
25
|
+
export declare function handleSuggestRoute(input: SkillFmSuggestRouteInput, _deps: SuggestRouteDeps): Promise<SkillFmToolResult<SkillFmSuggestRouteOutput>>;
|
|
26
|
+
//# sourceMappingURL=suggest-route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest-route.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/suggest-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EAEvB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;CACpB;AAUD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,wBAAwB,EAC/B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,CAAC,CA6BvD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tools/suggest-route.ts — handler for `skillfm_suggest_route`.
|
|
3
|
+
*
|
|
4
|
+
* Returns a model-routing recommendation BEFORE the agent runs the task.
|
|
5
|
+
* Phase 0: hardcoded recommendation (DeepSeek-Chat for code_completion,
|
|
6
|
+
* Claude Opus for reasoning) — matches PRD-MCP-SKILL §6.1 demo numbers.
|
|
7
|
+
*
|
|
8
|
+
* TODO Week 5:
|
|
9
|
+
* - Real call to brain `/v1/beacon/suggest-route` (LLM-as-router
|
|
10
|
+
* evaluates task vs. provider catalog).
|
|
11
|
+
* - Plug provider-side cost tables (refresh nightly via brain).
|
|
12
|
+
* - `qualityVsCurrent` should come from a real benchmark suite, not a
|
|
13
|
+
* hardcoded enum.
|
|
14
|
+
* - Frequency-limit + decision-engine wiring — currently bypass-call.
|
|
15
|
+
* - Honor `currentModel` input (skip suggestion if user is already on the
|
|
16
|
+
* cheapest viable option).
|
|
17
|
+
* - Quality-gate: `qualityRequirement='high'` should never recommend
|
|
18
|
+
* `significant_drop`.
|
|
19
|
+
*/
|
|
20
|
+
import { invalidInput } from '../errors.js';
|
|
21
|
+
const PHASE_0_DEFAULT_RECOMMENDATION = {
|
|
22
|
+
model: 'deepseek-chat-v4',
|
|
23
|
+
provider: 'deepseek',
|
|
24
|
+
estCost: 0.018,
|
|
25
|
+
estLatencyMs: 1_400,
|
|
26
|
+
qualityVsCurrent: 'slight_drop',
|
|
27
|
+
};
|
|
28
|
+
export async function handleSuggestRoute(input, _deps) {
|
|
29
|
+
if (typeof input.task !== 'string' || input.task.length === 0) {
|
|
30
|
+
return {
|
|
31
|
+
ok: false,
|
|
32
|
+
error: invalidInput('task is required and must be a non-empty string').toToolError(),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Phase 0 hardcoded — Week 5 calls brain.fetchRule + provider catalog
|
|
36
|
+
const output = {
|
|
37
|
+
recommended: PHASE_0_DEFAULT_RECOMMENDATION,
|
|
38
|
+
alternatives: [
|
|
39
|
+
{
|
|
40
|
+
model: 'qwen3-coder',
|
|
41
|
+
provider: 'qwen',
|
|
42
|
+
estCost: 0.012,
|
|
43
|
+
pros: ['cheapest', 'fast'],
|
|
44
|
+
cons: ['lower quality on long context'],
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
estSavings: { perCall: 0.064, monthlyIfAlwaysSwitched: 41 },
|
|
48
|
+
reasoning: {
|
|
49
|
+
en: 'For code_completion tasks, DeepSeek-Chat-V4 delivers ~95% Claude Opus quality at 8% the cost.',
|
|
50
|
+
zh: '对于代码补全类任务,DeepSeek-Chat-V4 能以 8% 的成本达到 Claude Opus ~95% 的质量。',
|
|
51
|
+
},
|
|
52
|
+
shouldSuggestToUser: true,
|
|
53
|
+
};
|
|
54
|
+
return { ok: true, data: output };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=suggest-route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest-route.js","sourceRoot":"","sources":["../../../src/mcp/tools/suggest-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AASH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAM5C,MAAM,8BAA8B,GAAqB;IACvD,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,KAAK;IACnB,gBAAgB,EAAE,aAAa;CAChC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAA+B,EAC/B,KAAuB;IAEvB,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,YAAY,CAAC,iDAAiD,CAAC,CAAC,WAAW,EAAE;SACrF,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,MAAM,MAAM,GAA8B;QACxC,WAAW,EAAE,8BAA8B;QAC3C,YAAY,EAAE;YACZ;gBACE,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;gBAC1B,IAAI,EAAE,CAAC,+BAA+B,CAAC;aACxC;SACF;QACD,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,EAAE;QAC3D,SAAS,EAAE;YACT,EAAE,EAAE,+FAA+F;YACnG,EAAE,EAAE,8DAA8D;SACnE;QACD,mBAAmB,EAAE,IAAI;KAC1B,CAAC;IAEF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tools/user-preferences.ts — handler for `skillfm_user_preferences`.
|
|
3
|
+
*
|
|
4
|
+
* Get / set client-side UserPreferences (frequency limits, quiet hours,
|
|
5
|
+
* disabled categories). Persisted to ~/.skillfm/beacon-mcp/user-prefs.json.
|
|
6
|
+
*
|
|
7
|
+
* Phase 0: fully working (no brain dependency for read; brain push is
|
|
8
|
+
* best-effort fire-and-forget).
|
|
9
|
+
*
|
|
10
|
+
* TODO Week 5:
|
|
11
|
+
* - Validation: maxPerSession 1-20, maxPerDay 1-100, timezone is IANA.
|
|
12
|
+
* - When prefs change, also push to brain so other devices (mobile app
|
|
13
|
+
* in Phase 2) sync.
|
|
14
|
+
* - Atomic write via .tmp + rename to survive MCP server kill.
|
|
15
|
+
*/
|
|
16
|
+
import { type SkillFmUserPreferencesInput, type SkillFmUserPreferencesOutput, type SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
17
|
+
import type { BrainClient } from '../brain-client.js';
|
|
18
|
+
export interface UserPreferencesDeps {
|
|
19
|
+
brain: BrainClient;
|
|
20
|
+
}
|
|
21
|
+
export declare function handleUserPreferences(input: SkillFmUserPreferencesInput, deps: UserPreferencesDeps): Promise<SkillFmToolResult<SkillFmUserPreferencesOutput>>;
|
|
22
|
+
//# sourceMappingURL=user-preferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-preferences.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/user-preferences.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,iBAAiB,EAEvB,MAAM,+CAA+C,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,WAAW,CAAC;CACpB;AAkBD,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,2BAA2B,EAClC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,CAAC,CA8B1D"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tools/user-preferences.ts — handler for `skillfm_user_preferences`.
|
|
3
|
+
*
|
|
4
|
+
* Get / set client-side UserPreferences (frequency limits, quiet hours,
|
|
5
|
+
* disabled categories). Persisted to ~/.skillfm/beacon-mcp/user-prefs.json.
|
|
6
|
+
*
|
|
7
|
+
* Phase 0: fully working (no brain dependency for read; brain push is
|
|
8
|
+
* best-effort fire-and-forget).
|
|
9
|
+
*
|
|
10
|
+
* TODO Week 5:
|
|
11
|
+
* - Validation: maxPerSession 1-20, maxPerDay 1-100, timezone is IANA.
|
|
12
|
+
* - When prefs change, also push to brain so other devices (mobile app
|
|
13
|
+
* in Phase 2) sync.
|
|
14
|
+
* - Atomic write via .tmp + rename to survive MCP server kill.
|
|
15
|
+
*/
|
|
16
|
+
import { loadPrefs, savePrefs, DEFAULT_USER_PREFERENCES } from '../cache.js';
|
|
17
|
+
import { invalidInput } from '../errors.js';
|
|
18
|
+
function mergePrefs(current, patch) {
|
|
19
|
+
return {
|
|
20
|
+
disabledCategories: patch.disabledCategories ?? current.disabledCategories,
|
|
21
|
+
maxPerSession: patch.maxPerSession ?? current.maxPerSession,
|
|
22
|
+
maxPerDay: patch.maxPerDay ?? current.maxPerDay,
|
|
23
|
+
quietHours: patch.quietHours
|
|
24
|
+
? {
|
|
25
|
+
enabled: patch.quietHours.enabled ?? current.quietHours.enabled,
|
|
26
|
+
start: patch.quietHours.start ?? current.quietHours.start,
|
|
27
|
+
end: patch.quietHours.end ?? current.quietHours.end,
|
|
28
|
+
timezone: patch.quietHours.timezone ?? current.quietHours.timezone,
|
|
29
|
+
}
|
|
30
|
+
: current.quietHours,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export async function handleUserPreferences(input, deps) {
|
|
34
|
+
if (input.action === 'get') {
|
|
35
|
+
const prefs = loadPrefs();
|
|
36
|
+
return { ok: true, data: prefs };
|
|
37
|
+
}
|
|
38
|
+
if (input.action === 'set') {
|
|
39
|
+
const current = loadPrefs() ?? DEFAULT_USER_PREFERENCES;
|
|
40
|
+
const next = mergePrefs(current, input.preferences);
|
|
41
|
+
try {
|
|
42
|
+
savePrefs(next);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
return {
|
|
46
|
+
ok: false,
|
|
47
|
+
error: {
|
|
48
|
+
code: 'SKILLFM.CACHE.WRITE_FAILED',
|
|
49
|
+
message: `failed to persist prefs: ${err.message}`,
|
|
50
|
+
retryable: false,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Best-effort cloud sync (don't block on failure)
|
|
55
|
+
void deps.brain.putPreferences(next);
|
|
56
|
+
return { ok: true, data: next };
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
ok: false,
|
|
60
|
+
error: invalidInput('action must be "get" or "set"').toToolError(),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=user-preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-preferences.js","sourceRoot":"","sources":["../../../src/mcp/tools/user-preferences.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAM5C,SAAS,UAAU,CAAC,OAAwB,EAAE,KAA+B;IAC3E,OAAO;QACL,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,IAAI,OAAO,CAAC,kBAAkB;QAC1E,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa;QAC3D,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS;QAC/C,UAAU,EAAE,KAAK,CAAC,UAAU;YAC1B,CAAC,CAAC;gBACE,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO;gBAC/D,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK;gBACzD,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG;gBACnD,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ;aACnE;YACH,CAAC,CAAC,OAAO,CAAC,UAAU;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAkC,EAClC,IAAyB;IAEzB,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,SAAS,EAAE,IAAI,wBAAwB,CAAC;QACxD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,4BAA6B,GAAa,CAAC,OAAO,EAAE;oBAC7D,SAAS,EAAE,KAAK;iBACjB;aACF,CAAC;QACJ,CAAC;QACD,kDAAkD;QAClD,KAAK,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,YAAY,CAAC,+BAA+B,CAAC,CAAC,WAAW,EAAE;KACnE,CAAC;AACJ,CAAC"}
|
package/dist/mcp-stdio/bin.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { MemoryId, MemoryItem, MemoryMetadata, MemorySearchResult, MemoryStore, SearchOptions, } from './types.js';
|
|
2
|
+
export { MemoryError, MEMORY_ERROR_CODES } from './types.js';
|
|
3
|
+
export { Mem0Client } from './mem0-client.js';
|
|
4
|
+
export type { Mem0ClientConfig } from './mem0-client.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAUxC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type MemoryStore, type MemoryId, type MemoryItem, type MemoryMetadata, type MemorySearchResult, type SearchOptions } from './types.js';
|
|
2
|
+
export interface Mem0ClientConfig {
|
|
3
|
+
/** Mem0 server base URL (default: http://localhost:11000) */
|
|
4
|
+
base_url?: string;
|
|
5
|
+
/** 默认 user_id, 不传则需在每次调用 opts 里指定 */
|
|
6
|
+
default_user_id?: string;
|
|
7
|
+
/** Mem0 server API key (self-host 默认无 auth, cloud 需要) */
|
|
8
|
+
api_key?: string;
|
|
9
|
+
/** fetch 超时 ms (default 10s) */
|
|
10
|
+
timeout_ms?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class Mem0Client implements MemoryStore {
|
|
13
|
+
private base_url;
|
|
14
|
+
private default_user_id?;
|
|
15
|
+
private api_key?;
|
|
16
|
+
private timeout_ms;
|
|
17
|
+
constructor(cfg?: Mem0ClientConfig);
|
|
18
|
+
private headers;
|
|
19
|
+
private fetchWithTimeout;
|
|
20
|
+
private resolveUserId;
|
|
21
|
+
private toItem;
|
|
22
|
+
put(text: string, metadata?: MemoryMetadata): Promise<MemoryId>;
|
|
23
|
+
search(query: string, opts?: SearchOptions): Promise<MemorySearchResult[]>;
|
|
24
|
+
recent(limit?: number, user_id?: string): Promise<MemoryItem[]>;
|
|
25
|
+
delete(id: MemoryId): Promise<boolean>;
|
|
26
|
+
health(): Promise<{
|
|
27
|
+
ok: boolean;
|
|
28
|
+
error?: string;
|
|
29
|
+
backend: string;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=mem0-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem0-client.d.ts","sourceRoot":"","sources":["../../src/memory/mem0-client.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAGnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAqBD,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;gBAEf,GAAG,CAAC,EAAE,gBAAgB;IAOlC,OAAO,CAAC,OAAO;YASD,gBAAgB;IAe9B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,MAAM;IAUR,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IA6B/D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA4B1E,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAc/D,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtC,MAAM,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAmB1E"}
|