@skillfm/local 2.6.4 → 2.7.1
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/agent-hints.d.ts.map +1 -1
- package/dist/agent-hints.js +28 -13
- package/dist/agent-hints.js.map +1 -1
- 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 +83 -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 +130 -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 +104 -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/credential-tools.d.ts +37 -0
- package/dist/mcp/tools/credential-tools.d.ts.map +1 -0
- package/dist/mcp/tools/credential-tools.js +109 -0
- package/dist/mcp/tools/credential-tools.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 +44 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +188 -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/brain-push-client.d.ts +13 -0
- package/dist/scheduler/brain-push-client.d.ts.map +1 -0
- package/dist/scheduler/brain-push-client.js +46 -0
- package/dist/scheduler/brain-push-client.js.map +1 -0
- package/dist/scheduler/index.d.ts +6 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +5 -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,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tools/index.ts — MCP tool registry.
|
|
3
|
+
*
|
|
4
|
+
* Pulls the canonical tool-name list from `SKILLFM_TOOL_NAMES` (vendored
|
|
5
|
+
* contract beacon-mcp-tools-v1) and registers a handler for each:
|
|
6
|
+
* - 8 "key" tools have real handlers (Phase 0 mock-backed)
|
|
7
|
+
* - 25+ remaining names → `_placeholder` returning TOOL_NOT_IMPLEMENTED
|
|
8
|
+
*
|
|
9
|
+
* `registerAllTools(server, deps)` is the single entry point the MCP server
|
|
10
|
+
* calls in src/index.ts. We use minimal zod schemas for each tool's input —
|
|
11
|
+
* just enough to satisfy the MCP SDK's `inputSchema` requirement; deeper
|
|
12
|
+
* validation lives inside each handler (so violations come back as
|
|
13
|
+
* SkillFmToolError envelopes, not MCP protocol errors).
|
|
14
|
+
*
|
|
15
|
+
* TODO Week 5:
|
|
16
|
+
* - Replace `z.object({}).passthrough()` placeholder schemas with real zod
|
|
17
|
+
* schemas derived from the vendored contract types.
|
|
18
|
+
* - Add per-tool `description` strings (English; agents read these to
|
|
19
|
+
* match Tool Search) — keep them keyword-rich per PRD-MCP-SKILL §4.
|
|
20
|
+
* - Track tool-call telemetry: invocation count + latency histogram.
|
|
21
|
+
* - Add `outputSchema` (MCP SDK supports it as of 1.1) for each Phase-0
|
|
22
|
+
* handler with a real Output type.
|
|
23
|
+
*/
|
|
24
|
+
import { z } from 'zod';
|
|
25
|
+
import { SKILLFM_TOOL_NAMES, } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
26
|
+
import { handleCheckUsage } from './check-usage.js';
|
|
27
|
+
import { handleSuggestRoute } from './suggest-route.js';
|
|
28
|
+
import { handleCheckExpiry } from './check-expiry.js';
|
|
29
|
+
import { handleAvatarMarket } from './avatar-market.js';
|
|
30
|
+
import { handleGetMonthlyPicks } from './get-monthly-picks.js';
|
|
31
|
+
import { handleRecordAcceptance } from './record-acceptance.js';
|
|
32
|
+
import { handleRecordRejection } from './record-rejection.js';
|
|
33
|
+
import { handleUserPreferences } from './user-preferences.js';
|
|
34
|
+
import { makePlaceholderHandler } from './_placeholder.js';
|
|
35
|
+
import { handleMemorySearch } from './memory-search.js';
|
|
36
|
+
import { handleMemorySave } from './memory-save.js';
|
|
37
|
+
import { handleMemoryRecent } from './memory-recent.js';
|
|
38
|
+
import { handleSaveCredential, handleGetCredential, handleListCredentials, handleRemoveCredential, } from './credential-tools.js';
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// Minimal input shape — every Phase 0 tool accepts a free-form object.
|
|
41
|
+
// Validation is done inside handlers (so failures come back as
|
|
42
|
+
// SkillFmToolError, not MCP-protocol level rejections).
|
|
43
|
+
// ============================================================================
|
|
44
|
+
const PASSTHROUGH_SCHEMA = z.object({}).passthrough();
|
|
45
|
+
/** MCP SDK requires content blocks. We always wrap our envelope as JSON text. */
|
|
46
|
+
function wrapEnvelope(envelope) {
|
|
47
|
+
return {
|
|
48
|
+
content: [{ type: 'text', text: JSON.stringify(envelope) }],
|
|
49
|
+
isError: !envelope.ok,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// Key tool registration
|
|
54
|
+
// ============================================================================
|
|
55
|
+
function registerKeyTools(server, deps) {
|
|
56
|
+
server.tool('skillfm_check_usage', 'Get the agent\'s LLM/API spending for the current period across all platforms (Anthropic / OpenAI / DeepSeek / Qwen / Doubao / etc). Returns total spent, per-platform breakdown, savings already realized, and warnings. Call this before suggesting a budget action to the user.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
57
|
+
const env = await handleCheckUsage(input, { brain: deps.brain });
|
|
58
|
+
return wrapEnvelope(env);
|
|
59
|
+
});
|
|
60
|
+
server.tool('skillfm_suggest_route', 'Recommend a cheaper / faster LLM model for a specific task before the agent runs it. Returns recommended model + alternatives + estimated savings + human-readable reasoning. Use this BEFORE executing an LLM call when cost is a concern.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
61
|
+
const env = await handleSuggestRoute(input, { brain: deps.brain });
|
|
62
|
+
return wrapEnvelope(env);
|
|
63
|
+
});
|
|
64
|
+
server.tool('skillfm_check_expiry', 'List the user\'s expiring assets (domains, SSL certs, payment cards, API balances) within a window. Returns severity-ranked items with renewal action URLs. Use this when the user asks "what\'s expiring" or proactively in monthly reviews.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
65
|
+
const env = await handleCheckExpiry(input, { brain: deps.brain });
|
|
66
|
+
return wrapEnvelope(env);
|
|
67
|
+
});
|
|
68
|
+
server.tool('skillfm_avatar_market', 'Recommend SkillFM avatars (autonomous money-making skills) matching a detected user intent. Returns avatar matches + pricing + real success cases + setup requirements. Use this when the user mentions making money, side income, or specific platforms (xianyu, fiverr, etc).', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
69
|
+
const env = await handleAvatarMarket(input, { brain: deps.brain });
|
|
70
|
+
return wrapEnvelope(env);
|
|
71
|
+
});
|
|
72
|
+
server.tool('skillfm_get_monthly_picks', 'Fetch this month\'s curated SkillFM skill picks (Pro feature). Returns a personalized list of skills with install commands for each agent harness. Free users receive AUTH.PRO_REQUIRED — surface the upgrade prompt to the user.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
73
|
+
const env = await handleGetMonthlyPicks(input, { brain: deps.brain, isProTier: deps.isProTier });
|
|
74
|
+
return wrapEnvelope(env);
|
|
75
|
+
});
|
|
76
|
+
server.tool('skillfm_record_acceptance', 'Record that the user accepted a SkillFM suggestion. Pass the ruleId returned by the originating tool. Drives the brain feedback loop that personalizes future suggestions.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
77
|
+
const env = await handleRecordAcceptance(input, { brain: deps.brain });
|
|
78
|
+
return wrapEnvelope(env);
|
|
79
|
+
});
|
|
80
|
+
server.tool('skillfm_record_rejection', 'Record that the user dismissed a SkillFM suggestion. Optionally include a reason (not_relevant / too_pushy / wrong_timing / other). Critical for keeping suggestion quality high — call this whenever the user says no.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
81
|
+
const env = await handleRecordRejection(input, { brain: deps.brain });
|
|
82
|
+
return wrapEnvelope(env);
|
|
83
|
+
});
|
|
84
|
+
server.tool('skillfm_user_preferences', 'Read or update SkillFM suggestion preferences (per-session/day frequency limits, quiet hours, disabled categories A-H). Use action=get to read, action=set with a partial preferences patch to update.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
85
|
+
const env = await handleUserPreferences(input, { brain: deps.brain });
|
|
86
|
+
return wrapEnvelope(env);
|
|
87
|
+
});
|
|
88
|
+
// ─── Day 6 B1: Memory tools (Pro-only, Mem0 self-host backend) ───
|
|
89
|
+
const memoryDeps = { memory: deps.memory ?? null, isProTier: deps.isProTier };
|
|
90
|
+
server.tool('skillfm_memory_search', 'Search the user\'s cross-device / cross-session memory (Pro feature, Mem0-backed). Returns relevant past conversation snippets ranked by semantic similarity. Use this when the agent needs to recall what the user discussed in previous sessions or what they learned.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
91
|
+
const env = await handleMemorySearch(input, memoryDeps);
|
|
92
|
+
return wrapEnvelope(env);
|
|
93
|
+
});
|
|
94
|
+
server.tool('skillfm_memory_save', 'Explicitly save a conversation snippet or learning to the user\'s cross-device memory (Pro feature, Mem0-backed). Use this when the user asks to "remember this" or when the agent identifies a fact worth persisting across sessions.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
95
|
+
const env = await handleMemorySave(input, memoryDeps);
|
|
96
|
+
return wrapEnvelope(env);
|
|
97
|
+
});
|
|
98
|
+
server.tool('skillfm_memory_recent', 'List the user\'s most recent memory items (Pro feature, Mem0-backed). Returns up to N items in reverse chronological order. Use this for "what did we work on yesterday" type queries.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
99
|
+
const env = await handleMemoryRecent(input, memoryDeps);
|
|
100
|
+
return wrapEnvelope(env);
|
|
101
|
+
});
|
|
102
|
+
// ─── Phase 2: Credential vault tools (BYOK: keys 加密存本地, 不出节点) ───
|
|
103
|
+
// Agent 装 SkillFM 后引导用户加 LLM provider 的 billing API key, 启用 Beacon 监控。
|
|
104
|
+
const vaultDeps = deps.vault ? { vault: deps.vault } : null;
|
|
105
|
+
server.tool('skillfm_save_credential', 'Save a BYOK provider API key to the local encrypted vault (AES-256-GCM, never leaves the user node). Use this when onboarding a user — ask them which LLM provider (openai/anthropic/deepseek/doubao/qwen/kimi) or asset registrar (cloudflare/namecheap/godaddy/...) they want monitored, then save the billing-only API key here. Beacon scheduler reads this vault to poll provider billing APIs every 30 minutes.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
106
|
+
if (!vaultDeps) {
|
|
107
|
+
return wrapEnvelope({
|
|
108
|
+
ok: false,
|
|
109
|
+
error: { code: 'VAULT.NOT_CONFIGURED', message: 'Local vault not available in this MCP transport.', retryable: false },
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const env = await handleSaveCredential(input, vaultDeps);
|
|
113
|
+
return wrapEnvelope(env);
|
|
114
|
+
});
|
|
115
|
+
server.tool('skillfm_get_credential', 'Check whether a credential exists in the vault for a given provider. Returns { has_key: bool } — does NOT return the key value (security). Use this to decide if the user needs to add a key for a particular provider.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
116
|
+
if (!vaultDeps) {
|
|
117
|
+
return wrapEnvelope({
|
|
118
|
+
ok: false,
|
|
119
|
+
error: { code: 'VAULT.NOT_CONFIGURED', message: 'Local vault not available in this MCP transport.', retryable: false },
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
const env = await handleGetCredential(input, vaultDeps);
|
|
123
|
+
return wrapEnvelope(env);
|
|
124
|
+
});
|
|
125
|
+
server.tool('skillfm_list_credentials', 'List the provider names currently in the local vault. Does NOT return key values. Use this at session start to know which providers Beacon is already monitoring vs which ones to ask the user to add.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
126
|
+
if (!vaultDeps) {
|
|
127
|
+
return wrapEnvelope({
|
|
128
|
+
ok: false,
|
|
129
|
+
error: { code: 'VAULT.NOT_CONFIGURED', message: 'Local vault not available in this MCP transport.', retryable: false },
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
const env = await handleListCredentials(input, vaultDeps);
|
|
133
|
+
return wrapEnvelope(env);
|
|
134
|
+
});
|
|
135
|
+
server.tool('skillfm_remove_credential', 'Remove a provider credential from the vault (e.g. user revoked the key, no longer wants Beacon to monitor that provider). Returns { removed: bool, provider }.', PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
136
|
+
if (!vaultDeps) {
|
|
137
|
+
return wrapEnvelope({
|
|
138
|
+
ok: false,
|
|
139
|
+
error: { code: 'VAULT.NOT_CONFIGURED', message: 'Local vault not available in this MCP transport.', retryable: false },
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const env = await handleRemoveCredential(input, vaultDeps);
|
|
143
|
+
return wrapEnvelope(env);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// ============================================================================
|
|
147
|
+
// Placeholder tools — names reserved by contract but Phase 0 = NOT_IMPLEMENTED
|
|
148
|
+
// ============================================================================
|
|
149
|
+
const KEY_TOOL_NAMES = new Set([
|
|
150
|
+
'skillfm_check_usage',
|
|
151
|
+
'skillfm_suggest_route',
|
|
152
|
+
'skillfm_check_expiry',
|
|
153
|
+
'skillfm_avatar_market',
|
|
154
|
+
'skillfm_get_monthly_picks',
|
|
155
|
+
'skillfm_record_acceptance',
|
|
156
|
+
'skillfm_record_rejection',
|
|
157
|
+
'skillfm_user_preferences',
|
|
158
|
+
// Phase 2: vault credential tools (real handlers, not placeholders)
|
|
159
|
+
'skillfm_save_credential',
|
|
160
|
+
'skillfm_get_credential',
|
|
161
|
+
'skillfm_list_credentials',
|
|
162
|
+
'skillfm_remove_credential',
|
|
163
|
+
]);
|
|
164
|
+
function registerPlaceholderTools(server) {
|
|
165
|
+
const allNames = Object.values(SKILLFM_TOOL_NAMES).flat();
|
|
166
|
+
for (const name of allNames) {
|
|
167
|
+
if (KEY_TOOL_NAMES.has(name))
|
|
168
|
+
continue;
|
|
169
|
+
const handler = makePlaceholderHandler(name);
|
|
170
|
+
server.tool(name, `[Phase 0 placeholder] ${name} ships in Week 5. Calling this returns SKILLFM.TOOL.NOT_IMPLEMENTED.`, PASSTHROUGH_SCHEMA.shape, async (input) => {
|
|
171
|
+
const env = await handler(input);
|
|
172
|
+
return wrapEnvelope(env);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Register every Phase 0 beacon MCP tool. Called once by src/index.ts on
|
|
178
|
+
* server bootstrap.
|
|
179
|
+
*/
|
|
180
|
+
export function registerAllTools(server, deps) {
|
|
181
|
+
registerKeyTools(server, deps);
|
|
182
|
+
registerPlaceholderTools(server);
|
|
183
|
+
}
|
|
184
|
+
/** For tests / sanity checks. Not part of the public package surface. */
|
|
185
|
+
export function _listAllRegisteredToolNames() {
|
|
186
|
+
return Object.values(SKILLFM_TOOL_NAMES).flat();
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
2
|
+
import type { MemoryToolsDeps } from './memory-search.js';
|
|
3
|
+
interface MemoryRecentInput {
|
|
4
|
+
limit?: number;
|
|
5
|
+
}
|
|
6
|
+
interface MemoryRecentOutput {
|
|
7
|
+
items: Array<{
|
|
8
|
+
id: string;
|
|
9
|
+
text: string;
|
|
10
|
+
created_at: string;
|
|
11
|
+
metadata: Record<string, unknown>;
|
|
12
|
+
}>;
|
|
13
|
+
count: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function handleMemoryRecent(input: MemoryRecentInput, deps: MemoryToolsDeps): Promise<SkillFmToolResult<MemoryRecentOutput>>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=memory-recent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-recent.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory-recent.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAEvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC,CAsChD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/mcp/tools/memory-recent.ts
|
|
2
|
+
//
|
|
3
|
+
// MCP tool: skillfm_memory_recent (Day 6 B1, Pro-only)
|
|
4
|
+
// 列最近 N 条记忆 (无相关性, 仅时序)
|
|
5
|
+
import { MemoryError } from '../../memory/index.js';
|
|
6
|
+
export async function handleMemoryRecent(input, deps) {
|
|
7
|
+
if (!deps.isProTier) {
|
|
8
|
+
return {
|
|
9
|
+
ok: false,
|
|
10
|
+
error: { code: 'AUTH.PRO_REQUIRED', message: 'Memory is a Pro feature.', retryable: false },
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (!deps.memory) {
|
|
14
|
+
return {
|
|
15
|
+
ok: false,
|
|
16
|
+
error: { code: 'MEMORY.NOT_CONFIGURED', message: 'Mem0 backend not configured.', retryable: false },
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const items = await deps.memory.recent(Math.min(input.limit ?? 20, 100));
|
|
21
|
+
return {
|
|
22
|
+
ok: true,
|
|
23
|
+
data: {
|
|
24
|
+
items: items.map((i) => ({
|
|
25
|
+
id: i.id,
|
|
26
|
+
text: i.text,
|
|
27
|
+
created_at: i.created_at,
|
|
28
|
+
metadata: i.metadata,
|
|
29
|
+
})),
|
|
30
|
+
count: items.length,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
const code = e instanceof MemoryError ? e.code : 'MEMORY.UNKNOWN';
|
|
36
|
+
return {
|
|
37
|
+
ok: false,
|
|
38
|
+
error: {
|
|
39
|
+
code,
|
|
40
|
+
message: e instanceof Error ? e.message : String(e),
|
|
41
|
+
retryable: code === 'MEMORY_BACKEND_UNREACHABLE',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=memory-recent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-recent.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory-recent.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,uDAAuD;AACvD,wBAAwB;AAGxB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAiBpD,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,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,0BAA0B,EAAE,SAAS,EAAE,KAAK,EAAE;SAC5F,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,8BAA8B,EAAE,SAAS,EAAE,KAAK,EAAE;SACpG,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACzE,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI,EAAE;gBACJ,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvB,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,QAAQ,EAAE,CAAC,CAAC,QAAmC;iBAChD,CAAC,CAAC;gBACH,KAAK,EAAE,KAAK,CAAC,MAAM;aACpB;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,15 @@
|
|
|
1
|
+
import type { SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
|
|
2
|
+
import type { MemoryToolsDeps } from './memory-search.js';
|
|
3
|
+
interface MemorySaveInput {
|
|
4
|
+
text: string;
|
|
5
|
+
source?: 'claude-code' | 'cursor' | 'openclaw' | 'manual';
|
|
6
|
+
user_tags?: string[];
|
|
7
|
+
privacy?: 'private' | 'shared';
|
|
8
|
+
}
|
|
9
|
+
interface MemorySaveOutput {
|
|
10
|
+
id: string;
|
|
11
|
+
saved_at: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function handleMemorySave(input: MemorySaveInput, deps: MemoryToolsDeps): Promise<SkillFmToolResult<MemorySaveOutput>>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=memory-save.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-save.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory-save.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAEvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CAChC;AAED,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CA6C9C"}
|
|
@@ -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"}
|