@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.
Files changed (301) hide show
  1. package/README.md +50 -1
  2. package/dist/_signers/aliyun-v3.d.ts +21 -0
  3. package/dist/_signers/aliyun-v3.d.ts.map +1 -0
  4. package/dist/_signers/aliyun-v3.js +47 -0
  5. package/dist/_signers/aliyun-v3.js.map +1 -0
  6. package/dist/_signers/canonical.d.ts +29 -0
  7. package/dist/_signers/canonical.d.ts.map +1 -0
  8. package/dist/_signers/canonical.js +59 -0
  9. package/dist/_signers/canonical.js.map +1 -0
  10. package/dist/_signers/index.d.ts +9 -0
  11. package/dist/_signers/index.d.ts.map +1 -0
  12. package/dist/_signers/index.js +6 -0
  13. package/dist/_signers/index.js.map +1 -0
  14. package/dist/_signers/tencent-tc3.d.ts +21 -0
  15. package/dist/_signers/tencent-tc3.d.ts.map +1 -0
  16. package/dist/_signers/tencent-tc3.js +48 -0
  17. package/dist/_signers/tencent-tc3.js.map +1 -0
  18. package/dist/_signers/volc-v4.d.ts +18 -0
  19. package/dist/_signers/volc-v4.d.ts.map +1 -0
  20. package/dist/_signers/volc-v4.js +43 -0
  21. package/dist/_signers/volc-v4.js.map +1 -0
  22. package/dist/agent-hints.d.ts.map +1 -1
  23. package/dist/agent-hints.js +28 -13
  24. package/dist/agent-hints.js.map +1 -1
  25. package/dist/asset-connectors/aliyun-ecs.d.ts +18 -0
  26. package/dist/asset-connectors/aliyun-ecs.d.ts.map +1 -0
  27. package/dist/asset-connectors/aliyun-ecs.js +99 -0
  28. package/dist/asset-connectors/aliyun-ecs.js.map +1 -0
  29. package/dist/asset-connectors/base.d.ts +15 -0
  30. package/dist/asset-connectors/base.d.ts.map +1 -0
  31. package/dist/asset-connectors/base.js +19 -0
  32. package/dist/asset-connectors/base.js.map +1 -0
  33. package/dist/asset-connectors/cloudflare.d.ts +18 -0
  34. package/dist/asset-connectors/cloudflare.d.ts.map +1 -0
  35. package/dist/asset-connectors/cloudflare.js +94 -0
  36. package/dist/asset-connectors/cloudflare.js.map +1 -0
  37. package/dist/asset-connectors/digitalocean.d.ts +18 -0
  38. package/dist/asset-connectors/digitalocean.d.ts.map +1 -0
  39. package/dist/asset-connectors/digitalocean.js +79 -0
  40. package/dist/asset-connectors/digitalocean.js.map +1 -0
  41. package/dist/asset-connectors/godaddy.d.ts +18 -0
  42. package/dist/asset-connectors/godaddy.d.ts.map +1 -0
  43. package/dist/asset-connectors/godaddy.js +62 -0
  44. package/dist/asset-connectors/godaddy.js.map +1 -0
  45. package/dist/asset-connectors/hetzner.d.ts +18 -0
  46. package/dist/asset-connectors/hetzner.d.ts.map +1 -0
  47. package/dist/asset-connectors/hetzner.js +52 -0
  48. package/dist/asset-connectors/hetzner.js.map +1 -0
  49. package/dist/asset-connectors/index.d.ts +18 -0
  50. package/dist/asset-connectors/index.d.ts.map +1 -0
  51. package/dist/asset-connectors/index.js +52 -0
  52. package/dist/asset-connectors/index.js.map +1 -0
  53. package/dist/asset-connectors/namecheap.d.ts +34 -0
  54. package/dist/asset-connectors/namecheap.d.ts.map +1 -0
  55. package/dist/asset-connectors/namecheap.js +178 -0
  56. package/dist/asset-connectors/namecheap.js.map +1 -0
  57. package/dist/asset-connectors/ssl-labs.d.ts +22 -0
  58. package/dist/asset-connectors/ssl-labs.d.ts.map +1 -0
  59. package/dist/asset-connectors/ssl-labs.js +79 -0
  60. package/dist/asset-connectors/ssl-labs.js.map +1 -0
  61. package/dist/asset-connectors/tencent-cvm.d.ts +18 -0
  62. package/dist/asset-connectors/tencent-cvm.d.ts.map +1 -0
  63. package/dist/asset-connectors/tencent-cvm.js +145 -0
  64. package/dist/asset-connectors/tencent-cvm.js.map +1 -0
  65. package/dist/asset-connectors/types.d.ts +45 -0
  66. package/dist/asset-connectors/types.d.ts.map +1 -0
  67. package/dist/asset-connectors/types.js +26 -0
  68. package/dist/asset-connectors/types.js.map +1 -0
  69. package/dist/asset-connectors/vultr.d.ts +18 -0
  70. package/dist/asset-connectors/vultr.d.ts.map +1 -0
  71. package/dist/asset-connectors/vultr.js +73 -0
  72. package/dist/asset-connectors/vultr.js.map +1 -0
  73. package/dist/connectors/anthropic.d.ts +10 -0
  74. package/dist/connectors/anthropic.d.ts.map +1 -0
  75. package/dist/connectors/anthropic.js +103 -0
  76. package/dist/connectors/anthropic.js.map +1 -0
  77. package/dist/connectors/base.d.ts +11 -0
  78. package/dist/connectors/base.d.ts.map +1 -0
  79. package/dist/connectors/base.js +19 -0
  80. package/dist/connectors/base.js.map +1 -0
  81. package/dist/connectors/deepseek.d.ts +14 -0
  82. package/dist/connectors/deepseek.d.ts.map +1 -0
  83. package/dist/connectors/deepseek.js +77 -0
  84. package/dist/connectors/deepseek.js.map +1 -0
  85. package/dist/connectors/doubao.d.ts +10 -0
  86. package/dist/connectors/doubao.d.ts.map +1 -0
  87. package/dist/connectors/doubao.js +64 -0
  88. package/dist/connectors/doubao.js.map +1 -0
  89. package/dist/connectors/index.d.ts +14 -0
  90. package/dist/connectors/index.d.ts.map +1 -0
  91. package/dist/connectors/index.js +42 -0
  92. package/dist/connectors/index.js.map +1 -0
  93. package/dist/connectors/kimi.d.ts +10 -0
  94. package/dist/connectors/kimi.d.ts.map +1 -0
  95. package/dist/connectors/kimi.js +67 -0
  96. package/dist/connectors/kimi.js.map +1 -0
  97. package/dist/connectors/openai.d.ts +10 -0
  98. package/dist/connectors/openai.d.ts.map +1 -0
  99. package/dist/connectors/openai.js +101 -0
  100. package/dist/connectors/openai.js.map +1 -0
  101. package/dist/connectors/qwen.d.ts +10 -0
  102. package/dist/connectors/qwen.d.ts.map +1 -0
  103. package/dist/connectors/qwen.js +66 -0
  104. package/dist/connectors/qwen.js.map +1 -0
  105. package/dist/connectors/types.d.ts +47 -0
  106. package/dist/connectors/types.d.ts.map +1 -0
  107. package/dist/connectors/types.js +24 -0
  108. package/dist/connectors/types.js.map +1 -0
  109. package/dist/guard/bin.js +0 -0
  110. package/dist/index.js +83 -1
  111. package/dist/index.js.map +1 -1
  112. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
  113. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
  114. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js +130 -0
  115. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
  116. package/dist/mcp/brain-client.d.ts +96 -0
  117. package/dist/mcp/brain-client.d.ts.map +1 -0
  118. package/dist/mcp/brain-client.js +214 -0
  119. package/dist/mcp/brain-client.js.map +1 -0
  120. package/dist/mcp/cache.d.ts +55 -0
  121. package/dist/mcp/cache.d.ts.map +1 -0
  122. package/dist/mcp/cache.js +109 -0
  123. package/dist/mcp/cache.js.map +1 -0
  124. package/dist/mcp/config.d.ts +29 -0
  125. package/dist/mcp/config.d.ts.map +1 -0
  126. package/dist/mcp/config.js +69 -0
  127. package/dist/mcp/config.js.map +1 -0
  128. package/dist/mcp/decision-engine.d.ts +54 -0
  129. package/dist/mcp/decision-engine.d.ts.map +1 -0
  130. package/dist/mcp/decision-engine.js +107 -0
  131. package/dist/mcp/decision-engine.js.map +1 -0
  132. package/dist/mcp/errors.d.ts +66 -0
  133. package/dist/mcp/errors.d.ts.map +1 -0
  134. package/dist/mcp/errors.js +127 -0
  135. package/dist/mcp/errors.js.map +1 -0
  136. package/dist/mcp/index.d.ts +40 -0
  137. package/dist/mcp/index.d.ts.map +1 -0
  138. package/dist/mcp/index.js +104 -0
  139. package/dist/mcp/index.js.map +1 -0
  140. package/dist/mcp/tools/_placeholder.d.ts +24 -0
  141. package/dist/mcp/tools/_placeholder.d.ts.map +1 -0
  142. package/dist/mcp/tools/_placeholder.js +29 -0
  143. package/dist/mcp/tools/_placeholder.js.map +1 -0
  144. package/dist/mcp/tools/avatar-market.d.ts +22 -0
  145. package/dist/mcp/tools/avatar-market.d.ts.map +1 -0
  146. package/dist/mcp/tools/avatar-market.js +33 -0
  147. package/dist/mcp/tools/avatar-market.js.map +1 -0
  148. package/dist/mcp/tools/check-expiry.d.ts +23 -0
  149. package/dist/mcp/tools/check-expiry.d.ts.map +1 -0
  150. package/dist/mcp/tools/check-expiry.js +29 -0
  151. package/dist/mcp/tools/check-expiry.js.map +1 -0
  152. package/dist/mcp/tools/check-usage.d.ts +25 -0
  153. package/dist/mcp/tools/check-usage.d.ts.map +1 -0
  154. package/dist/mcp/tools/check-usage.js +33 -0
  155. package/dist/mcp/tools/check-usage.js.map +1 -0
  156. package/dist/mcp/tools/credential-tools.d.ts +37 -0
  157. package/dist/mcp/tools/credential-tools.d.ts.map +1 -0
  158. package/dist/mcp/tools/credential-tools.js +109 -0
  159. package/dist/mcp/tools/credential-tools.js.map +1 -0
  160. package/dist/mcp/tools/get-monthly-picks.d.ts +25 -0
  161. package/dist/mcp/tools/get-monthly-picks.d.ts.map +1 -0
  162. package/dist/mcp/tools/get-monthly-picks.js +35 -0
  163. package/dist/mcp/tools/get-monthly-picks.js.map +1 -0
  164. package/dist/mcp/tools/index.d.ts +44 -0
  165. package/dist/mcp/tools/index.d.ts.map +1 -0
  166. package/dist/mcp/tools/index.js +188 -0
  167. package/dist/mcp/tools/index.js.map +1 -0
  168. package/dist/mcp/tools/memory-recent.d.ts +17 -0
  169. package/dist/mcp/tools/memory-recent.d.ts.map +1 -0
  170. package/dist/mcp/tools/memory-recent.js +46 -0
  171. package/dist/mcp/tools/memory-recent.js.map +1 -0
  172. package/dist/mcp/tools/memory-save.d.ts +15 -0
  173. package/dist/mcp/tools/memory-save.d.ts.map +1 -0
  174. package/dist/mcp/tools/memory-save.js +53 -0
  175. package/dist/mcp/tools/memory-save.js.map +1 -0
  176. package/dist/mcp/tools/memory-search.d.ts +24 -0
  177. package/dist/mcp/tools/memory-search.d.ts.map +1 -0
  178. package/dist/mcp/tools/memory-search.js +64 -0
  179. package/dist/mcp/tools/memory-search.js.map +1 -0
  180. package/dist/mcp/tools/record-acceptance.d.ts +22 -0
  181. package/dist/mcp/tools/record-acceptance.d.ts.map +1 -0
  182. package/dist/mcp/tools/record-acceptance.js +33 -0
  183. package/dist/mcp/tools/record-acceptance.js.map +1 -0
  184. package/dist/mcp/tools/record-rejection.d.ts +23 -0
  185. package/dist/mcp/tools/record-rejection.d.ts.map +1 -0
  186. package/dist/mcp/tools/record-rejection.js +34 -0
  187. package/dist/mcp/tools/record-rejection.js.map +1 -0
  188. package/dist/mcp/tools/suggest-route.d.ts +26 -0
  189. package/dist/mcp/tools/suggest-route.d.ts.map +1 -0
  190. package/dist/mcp/tools/suggest-route.js +56 -0
  191. package/dist/mcp/tools/suggest-route.js.map +1 -0
  192. package/dist/mcp/tools/user-preferences.d.ts +22 -0
  193. package/dist/mcp/tools/user-preferences.d.ts.map +1 -0
  194. package/dist/mcp/tools/user-preferences.js +63 -0
  195. package/dist/mcp/tools/user-preferences.js.map +1 -0
  196. package/dist/mcp-stdio/bin.js +0 -0
  197. package/dist/memory/index.d.ts +5 -0
  198. package/dist/memory/index.d.ts.map +1 -0
  199. package/dist/memory/index.js +4 -0
  200. package/dist/memory/index.js.map +1 -0
  201. package/dist/memory/mem0-client.d.ts +32 -0
  202. package/dist/memory/mem0-client.d.ts.map +1 -0
  203. package/dist/memory/mem0-client.js +161 -0
  204. package/dist/memory/mem0-client.js.map +1 -0
  205. package/dist/memory/types.d.ts +47 -0
  206. package/dist/memory/types.d.ts.map +1 -0
  207. package/dist/memory/types.js +20 -0
  208. package/dist/memory/types.js.map +1 -0
  209. package/dist/router/catalog.d.ts +4 -0
  210. package/dist/router/catalog.d.ts.map +1 -0
  211. package/dist/router/catalog.js +103 -0
  212. package/dist/router/catalog.js.map +1 -0
  213. package/dist/router/classifier.d.ts +5 -0
  214. package/dist/router/classifier.d.ts.map +1 -0
  215. package/dist/router/classifier.js +43 -0
  216. package/dist/router/classifier.js.map +1 -0
  217. package/dist/router/index.d.ts +7 -0
  218. package/dist/router/index.d.ts.map +1 -0
  219. package/dist/router/index.js +6 -0
  220. package/dist/router/index.js.map +1 -0
  221. package/dist/router/litellm-config.d.ts +34 -0
  222. package/dist/router/litellm-config.d.ts.map +1 -0
  223. package/dist/router/litellm-config.js +78 -0
  224. package/dist/router/litellm-config.js.map +1 -0
  225. package/dist/router/route.d.ts +3 -0
  226. package/dist/router/route.d.ts.map +1 -0
  227. package/dist/router/route.js +63 -0
  228. package/dist/router/route.js.map +1 -0
  229. package/dist/router/types.d.ts +36 -0
  230. package/dist/router/types.d.ts.map +1 -0
  231. package/dist/router/types.js +7 -0
  232. package/dist/router/types.js.map +1 -0
  233. package/dist/saas-connectors/base.d.ts +16 -0
  234. package/dist/saas-connectors/base.d.ts.map +1 -0
  235. package/dist/saas-connectors/base.js +16 -0
  236. package/dist/saas-connectors/base.js.map +1 -0
  237. package/dist/saas-connectors/brave.d.ts +19 -0
  238. package/dist/saas-connectors/brave.d.ts.map +1 -0
  239. package/dist/saas-connectors/brave.js +50 -0
  240. package/dist/saas-connectors/brave.js.map +1 -0
  241. package/dist/saas-connectors/fal.d.ts +15 -0
  242. package/dist/saas-connectors/fal.d.ts.map +1 -0
  243. package/dist/saas-connectors/fal.js +35 -0
  244. package/dist/saas-connectors/fal.js.map +1 -0
  245. package/dist/saas-connectors/index.d.ts +11 -0
  246. package/dist/saas-connectors/index.d.ts.map +1 -0
  247. package/dist/saas-connectors/index.js +32 -0
  248. package/dist/saas-connectors/index.js.map +1 -0
  249. package/dist/saas-connectors/replicate.d.ts +19 -0
  250. package/dist/saas-connectors/replicate.d.ts.map +1 -0
  251. package/dist/saas-connectors/replicate.js +43 -0
  252. package/dist/saas-connectors/replicate.js.map +1 -0
  253. package/dist/saas-connectors/serper.d.ts +19 -0
  254. package/dist/saas-connectors/serper.d.ts.map +1 -0
  255. package/dist/saas-connectors/serper.js +47 -0
  256. package/dist/saas-connectors/serper.js.map +1 -0
  257. package/dist/saas-connectors/types.d.ts +31 -0
  258. package/dist/saas-connectors/types.d.ts.map +1 -0
  259. package/dist/saas-connectors/types.js +6 -0
  260. package/dist/saas-connectors/types.js.map +1 -0
  261. package/dist/scheduler/brain-push-client.d.ts +13 -0
  262. package/dist/scheduler/brain-push-client.d.ts.map +1 -0
  263. package/dist/scheduler/brain-push-client.js +46 -0
  264. package/dist/scheduler/brain-push-client.js.map +1 -0
  265. package/dist/scheduler/index.d.ts +6 -0
  266. package/dist/scheduler/index.d.ts.map +1 -0
  267. package/dist/scheduler/index.js +5 -0
  268. package/dist/scheduler/index.js.map +1 -0
  269. package/dist/scheduler/poll.d.ts +4 -0
  270. package/dist/scheduler/poll.d.ts.map +1 -0
  271. package/dist/scheduler/poll.js +170 -0
  272. package/dist/scheduler/poll.js.map +1 -0
  273. package/dist/scheduler/scheduler.d.ts +18 -0
  274. package/dist/scheduler/scheduler.d.ts.map +1 -0
  275. package/dist/scheduler/scheduler.js +67 -0
  276. package/dist/scheduler/scheduler.js.map +1 -0
  277. package/dist/scheduler/types.d.ts +49 -0
  278. package/dist/scheduler/types.d.ts.map +1 -0
  279. package/dist/scheduler/types.js +14 -0
  280. package/dist/scheduler/types.js.map +1 -0
  281. package/dist/vault/cli.d.ts +2 -0
  282. package/dist/vault/cli.d.ts.map +1 -0
  283. package/dist/vault/cli.js +170 -0
  284. package/dist/vault/cli.js.map +1 -0
  285. package/dist/vault/crypto.d.ts +9 -0
  286. package/dist/vault/crypto.d.ts.map +1 -0
  287. package/dist/vault/crypto.js +54 -0
  288. package/dist/vault/crypto.js.map +1 -0
  289. package/dist/vault/index.d.ts +6 -0
  290. package/dist/vault/index.d.ts.map +1 -0
  291. package/dist/vault/index.js +5 -0
  292. package/dist/vault/index.js.map +1 -0
  293. package/dist/vault/types.d.ts +28 -0
  294. package/dist/vault/types.d.ts.map +1 -0
  295. package/dist/vault/types.js +22 -0
  296. package/dist/vault/types.js.map +1 -0
  297. package/dist/vault/vault.d.ts +34 -0
  298. package/dist/vault/vault.d.ts.map +1 -0
  299. package/dist/vault/vault.js +149 -0
  300. package/dist/vault/vault.js.map +1 -0
  301. package/package.json +17 -5
@@ -0,0 +1,24 @@
1
+ /**
2
+ * src/tools/_placeholder.ts — Stub handler for the 25+ Phase 0 placeholder tools.
3
+ *
4
+ * The beacon-mcp-tools-v1 contract reserves 30+ tool names but only writes
5
+ * full input/output schemas for 8 of them (5 key + 3 feedback/prefs). Until
6
+ * subagent-A finishes the schema sweep in Week 5, every reserved name still
7
+ * has to be a registered MCP tool — otherwise agents discover only 8 tools
8
+ * and can't reason about the full surface.
9
+ *
10
+ * This handler returns SkillFmToolError code = TOOL_NOT_IMPLEMENTED.
11
+ *
12
+ * TODO Week 5:
13
+ * - Delete this file once every tool name has its own typed handler.
14
+ * - Until then, keep the userHint copy short — agents may forward it
15
+ * verbatim to end users.
16
+ */
17
+ import { type SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
18
+ /**
19
+ * Generic placeholder. The MCP server registers it for every reserved tool
20
+ * name, capturing `toolName` in a closure so the error message identifies
21
+ * which tool the agent tried to call.
22
+ */
23
+ export declare function makePlaceholderHandler(toolName: string): (input: Record<string, unknown>) => Promise<SkillFmToolResult<Record<string, unknown>>>;
24
+ //# sourceMappingURL=_placeholder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_placeholder.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/_placeholder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAGvF;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,GACf,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAKzF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * src/tools/_placeholder.ts — Stub handler for the 25+ Phase 0 placeholder tools.
3
+ *
4
+ * The beacon-mcp-tools-v1 contract reserves 30+ tool names but only writes
5
+ * full input/output schemas for 8 of them (5 key + 3 feedback/prefs). Until
6
+ * subagent-A finishes the schema sweep in Week 5, every reserved name still
7
+ * has to be a registered MCP tool — otherwise agents discover only 8 tools
8
+ * and can't reason about the full surface.
9
+ *
10
+ * This handler returns SkillFmToolError code = TOOL_NOT_IMPLEMENTED.
11
+ *
12
+ * TODO Week 5:
13
+ * - Delete this file once every tool name has its own typed handler.
14
+ * - Until then, keep the userHint copy short — agents may forward it
15
+ * verbatim to end users.
16
+ */
17
+ import { notImplemented } from '../errors.js';
18
+ /**
19
+ * Generic placeholder. The MCP server registers it for every reserved tool
20
+ * name, capturing `toolName` in a closure so the error message identifies
21
+ * which tool the agent tried to call.
22
+ */
23
+ export function makePlaceholderHandler(toolName) {
24
+ return async (_input) => {
25
+ const err = notImplemented(toolName);
26
+ return { ok: false, error: err.toToolError() };
27
+ };
28
+ }
29
+ //# sourceMappingURL=_placeholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_placeholder.js","sourceRoot":"","sources":["../../../src/mcp/tools/_placeholder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAgB;IAEhB,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IACjD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * src/tools/avatar-market.ts — handler for `skillfm_avatar_market`.
3
+ *
4
+ * Recommend SkillFM "avatars" (e.g. xianyu-avatar-adult) based on a detected
5
+ * user intent. Phase 0: passes through the empty mock fixture.
6
+ *
7
+ * TODO Week 5:
8
+ * - Real intent classification on the brain (LLM call) → marketplace match.
9
+ * - Plug `realCase` field with live "Eric ¥15 first sale" once xianyu Day 0
10
+ * KPI lands.
11
+ * - Add inline upsell: if user is Free, only return top-1 match + Pro hint
12
+ * for unlocking the full 5.
13
+ * - i18n market filter: cn agents see CNY pricing + zh strings primary.
14
+ * - Cache hot intents (e.g. "make money on the side") for 1h to cut LLM cost.
15
+ */
16
+ import { type SkillFmAvatarMarketInput, type SkillFmAvatarMarketOutput, type SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
17
+ import type { BrainClient } from '../brain-client.js';
18
+ export interface AvatarMarketDeps {
19
+ brain: BrainClient;
20
+ }
21
+ export declare function handleAvatarMarket(input: SkillFmAvatarMarketInput, deps: AvatarMarketDeps): Promise<SkillFmToolResult<SkillFmAvatarMarketOutput>>;
22
+ //# sourceMappingURL=avatar-market.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-market.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/avatar-market.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACvB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,wBAAwB,EAC/B,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,CAAC,CAevD"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * src/tools/avatar-market.ts — handler for `skillfm_avatar_market`.
3
+ *
4
+ * Recommend SkillFM "avatars" (e.g. xianyu-avatar-adult) based on a detected
5
+ * user intent. Phase 0: passes through the empty mock fixture.
6
+ *
7
+ * TODO Week 5:
8
+ * - Real intent classification on the brain (LLM call) → marketplace match.
9
+ * - Plug `realCase` field with live "Eric ¥15 first sale" once xianyu Day 0
10
+ * KPI lands.
11
+ * - Add inline upsell: if user is Free, only return top-1 match + Pro hint
12
+ * for unlocking the full 5.
13
+ * - i18n market filter: cn agents see CNY pricing + zh strings primary.
14
+ * - Cache hot intents (e.g. "make money on the side") for 1h to cut LLM cost.
15
+ */
16
+ import { invalidInput } from '../errors.js';
17
+ export async function handleAvatarMarket(input, deps) {
18
+ if (typeof input.userIntent !== 'string' || input.userIntent.length === 0) {
19
+ return {
20
+ ok: false,
21
+ error: invalidInput('userIntent is required').toToolError(),
22
+ };
23
+ }
24
+ const result = await deps.brain.getAvatarMarket(input.userIntent);
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, degraded: deps.brain.isDegraded() };
32
+ }
33
+ //# sourceMappingURL=avatar-market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-market.js","sourceRoot":"","sources":["../../../src/mcp/tools/avatar-market.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAM5C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAA+B,EAC/B,IAAsB;IAEtB,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1E,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,YAAY,CAAC,wBAAwB,CAAC,CAAC,WAAW,EAAE;SAC5D,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,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,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * src/tools/check-expiry.ts — handler for `skillfm_check_expiry`.
3
+ *
4
+ * Returns domain / SSL / card / API-balance expiry items within `withinDays`.
5
+ *
6
+ * Phase 0: passes through brain.getAssets mock (currently empty fixture).
7
+ *
8
+ * TODO Week 5:
9
+ * - Real backend `/v1/beacon/assets` join across user-registered domains
10
+ * (WHOIS), SSL (CT logs), payment cards (Stripe vault meta), API balances
11
+ * (provider-specific endpoints scraped via BYOK reverse dispatch).
12
+ * - Severity calculation moves to brain (consistency across users).
13
+ * - Free tier filter: only return `severity >= 'critical'` (≤ 7 days).
14
+ * Apply `proLockedDetails=true` to other items so agent shows a teaser.
15
+ * - `actionUrl` deep-link generation (Stripe portal, registrar console).
16
+ */
17
+ import { type SkillFmCheckExpiryInput, type SkillFmCheckExpiryOutput, type SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
18
+ import type { BrainClient } from '../brain-client.js';
19
+ export interface CheckExpiryDeps {
20
+ brain: BrainClient;
21
+ }
22
+ export declare function handleCheckExpiry(input: SkillFmCheckExpiryInput, deps: CheckExpiryDeps): Promise<SkillFmToolResult<SkillFmCheckExpiryOutput>>;
23
+ //# sourceMappingURL=check-expiry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-expiry.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/check-expiry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACvB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,uBAAuB,EAC9B,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,CAAC,CAWtD"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * src/tools/check-expiry.ts — handler for `skillfm_check_expiry`.
3
+ *
4
+ * Returns domain / SSL / card / API-balance expiry items within `withinDays`.
5
+ *
6
+ * Phase 0: passes through brain.getAssets mock (currently empty fixture).
7
+ *
8
+ * TODO Week 5:
9
+ * - Real backend `/v1/beacon/assets` join across user-registered domains
10
+ * (WHOIS), SSL (CT logs), payment cards (Stripe vault meta), API balances
11
+ * (provider-specific endpoints scraped via BYOK reverse dispatch).
12
+ * - Severity calculation moves to brain (consistency across users).
13
+ * - Free tier filter: only return `severity >= 'critical'` (≤ 7 days).
14
+ * Apply `proLockedDetails=true` to other items so agent shows a teaser.
15
+ * - `actionUrl` deep-link generation (Stripe portal, registrar console).
16
+ */
17
+ export async function handleCheckExpiry(input, deps) {
18
+ const within = input.withinDays ?? 30;
19
+ const cat = input.category ?? 'all';
20
+ const result = await deps.brain.getAssets(within, cat === 'all' ? undefined : cat);
21
+ if (!result.ok) {
22
+ return {
23
+ ok: false,
24
+ error: { code: result.code, message: result.message, retryable: result.retryable },
25
+ };
26
+ }
27
+ return { ok: true, data: result.data, degraded: deps.brain.isDegraded() };
28
+ }
29
+ //# sourceMappingURL=check-expiry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-expiry.js","sourceRoot":"","sources":["../../../src/mcp/tools/check-expiry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAaH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA8B,EAC9B,IAAqB;IAErB,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnF,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,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * src/tools/check-usage.ts — handler for `skillfm_check_usage`.
3
+ *
4
+ * Phase 0: returns the mock fixture from BrainClient.getUsage() (matches
5
+ * ACCEPTANCE-SCENARIO §1.1 A2 — $487 / month, $312 already saved).
6
+ *
7
+ * TODO Week 5:
8
+ * - Pull real usage from each provider via BYOK proxy (LlmTask reverse
9
+ * dispatch — agent runs the SDK calls on user machine, MCP only
10
+ * aggregates). Never read API keys here.
11
+ * - Honor `period` input ('24h' / '7d' / '30d') — Phase 0 always returns
12
+ * monthly.
13
+ * - Apply Pro gating: Free users get totalSpent + savings only;
14
+ * `byPlatform` breakdown locked behind ProLockedFeature.
15
+ * - Per-platform `tokens` and `calls` should come from ccusage / Mem0
16
+ * integrations, not from brain.
17
+ * - Add cache: if last fetch < 30s ago, return cached blob.
18
+ */
19
+ import { type SkillFmCheckUsageInput, type SkillFmCheckUsageOutput, type SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
20
+ import type { BrainClient } from '../brain-client.js';
21
+ export interface CheckUsageDeps {
22
+ brain: BrainClient;
23
+ }
24
+ export declare function handleCheckUsage(_input: SkillFmCheckUsageInput, deps: CheckUsageDeps): Promise<SkillFmToolResult<SkillFmCheckUsageOutput>>;
25
+ //# sourceMappingURL=check-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-usage.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/check-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACvB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,sBAAsB,EAC9B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,CAarD"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * src/tools/check-usage.ts — handler for `skillfm_check_usage`.
3
+ *
4
+ * Phase 0: returns the mock fixture from BrainClient.getUsage() (matches
5
+ * ACCEPTANCE-SCENARIO §1.1 A2 — $487 / month, $312 already saved).
6
+ *
7
+ * TODO Week 5:
8
+ * - Pull real usage from each provider via BYOK proxy (LlmTask reverse
9
+ * dispatch — agent runs the SDK calls on user machine, MCP only
10
+ * aggregates). Never read API keys here.
11
+ * - Honor `period` input ('24h' / '7d' / '30d') — Phase 0 always returns
12
+ * monthly.
13
+ * - Apply Pro gating: Free users get totalSpent + savings only;
14
+ * `byPlatform` breakdown locked behind ProLockedFeature.
15
+ * - Per-platform `tokens` and `calls` should come from ccusage / Mem0
16
+ * integrations, not from brain.
17
+ * - Add cache: if last fetch < 30s ago, return cached blob.
18
+ */
19
+ export async function handleCheckUsage(_input, deps) {
20
+ const result = await deps.brain.getUsage();
21
+ if (!result.ok) {
22
+ return {
23
+ ok: false,
24
+ error: {
25
+ code: result.code,
26
+ message: result.message,
27
+ retryable: result.retryable,
28
+ },
29
+ };
30
+ }
31
+ return { ok: true, data: result.data, degraded: deps.brain.isDegraded() };
32
+ }
33
+ //# sourceMappingURL=check-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-usage.js","sourceRoot":"","sources":["../../../src/mcp/tools/check-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAaH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAA8B,EAC9B,IAAoB;IAEpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
2
+ import type { Vault } from '../../vault/index.js';
3
+ interface SaveCredentialInput {
4
+ provider: string;
5
+ key: string;
6
+ }
7
+ interface GetCredentialInput {
8
+ provider: string;
9
+ }
10
+ interface RemoveCredentialInput {
11
+ provider: string;
12
+ }
13
+ interface SaveCredentialOutput {
14
+ saved: true;
15
+ provider: string;
16
+ }
17
+ interface GetCredentialOutput {
18
+ provider: string;
19
+ has_key: boolean;
20
+ }
21
+ interface ListCredentialsOutput {
22
+ providers: string[];
23
+ count: number;
24
+ }
25
+ interface RemoveCredentialOutput {
26
+ removed: boolean;
27
+ provider: string;
28
+ }
29
+ export interface CredentialToolsDeps {
30
+ vault: Vault;
31
+ }
32
+ export declare function handleSaveCredential(input: SaveCredentialInput, deps: CredentialToolsDeps): Promise<SkillFmToolResult<SaveCredentialOutput>>;
33
+ export declare function handleGetCredential(input: GetCredentialInput, deps: CredentialToolsDeps): Promise<SkillFmToolResult<GetCredentialOutput>>;
34
+ export declare function handleListCredentials(_input: unknown, deps: CredentialToolsDeps): Promise<SkillFmToolResult<ListCredentialsOutput>>;
35
+ export declare function handleRemoveCredential(input: RemoveCredentialInput, deps: CredentialToolsDeps): Promise<SkillFmToolResult<RemoveCredentialOutput>>;
36
+ export {};
37
+ //# sourceMappingURL=credential-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/credential-tools.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAIlD,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,UAAU,oBAAoB;IAC5B,KAAK,EAAE,IAAI,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,sBAAsB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,KAAK,CAAC;CACd;AAmBD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,CAwBlD;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,kBAAkB,EACzB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAkBjD;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC,CAcnD;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,CAkBpD"}
@@ -0,0 +1,109 @@
1
+ // sdk/skillfm-local/src/mcp/tools/credential-tools.ts
2
+ //
3
+ // MCP tools for vault — Phase 2 走通 Beacon
4
+ // skillfm_save_credential — vault.put(provider, key)
5
+ // skillfm_get_credential — { provider } → { has_key } (不返真值, 防 agent 把 key 暴露给 user/log)
6
+ // skillfm_list_credentials — vault.list() (只返 provider 名, 不返 key 值)
7
+ // skillfm_remove_credential — vault.delete(provider)
8
+ //
9
+ // BYOK 红线: API key 永远不出节点。Vault 用 AES-256-GCM 加密存 ~/.skillfm/vault.enc,
10
+ // master key 在 ~/.skillfm/vault.key (chmod 0600)。
11
+ // handler 不返 key 值给 agent — agent 不需要知道 key 真值。
12
+ // agent 只需知道 "用户已配某 provider" 就能引导补缺。
13
+ // ── handlers ──────────────────────────────────────────────────────────
14
+ const ALLOWED_PROVIDER_PATTERN = /^[a-z0-9_-]+$/i;
15
+ function validateProvider(provider) {
16
+ if (typeof provider !== 'string' || provider.length === 0) {
17
+ return { ok: false, msg: 'provider required' };
18
+ }
19
+ if (provider.length > 64) {
20
+ return { ok: false, msg: 'provider too long (max 64)' };
21
+ }
22
+ if (!ALLOWED_PROVIDER_PATTERN.test(provider)) {
23
+ return { ok: false, msg: 'provider must match [a-z0-9_-]+' };
24
+ }
25
+ return { ok: true, v: provider };
26
+ }
27
+ export async function handleSaveCredential(input, deps) {
28
+ const v = validateProvider(input?.provider);
29
+ if (!v.ok) {
30
+ return { ok: false, error: { code: 'INPUT.INVALID', message: v.msg, retryable: false } };
31
+ }
32
+ if (typeof input?.key !== 'string' || input.key.length === 0) {
33
+ return { ok: false, error: { code: 'INPUT.INVALID', message: 'key required', retryable: false } };
34
+ }
35
+ if (input.key.length > 4096) {
36
+ return { ok: false, error: { code: 'INPUT.INVALID', message: 'key too long (max 4096)', retryable: false } };
37
+ }
38
+ try {
39
+ await deps.vault.put(v.v, input.key);
40
+ return { ok: true, data: { saved: true, provider: v.v } };
41
+ }
42
+ catch (e) {
43
+ return {
44
+ ok: false,
45
+ error: {
46
+ code: 'VAULT.IO_ERROR',
47
+ message: e instanceof Error ? e.message : String(e),
48
+ retryable: true,
49
+ },
50
+ };
51
+ }
52
+ }
53
+ export async function handleGetCredential(input, deps) {
54
+ const v = validateProvider(input?.provider);
55
+ if (!v.ok) {
56
+ return { ok: false, error: { code: 'INPUT.INVALID', message: v.msg, retryable: false } };
57
+ }
58
+ try {
59
+ const val = await deps.vault.get(v.v);
60
+ return { ok: true, data: { provider: v.v, has_key: val !== null } };
61
+ }
62
+ catch (e) {
63
+ return {
64
+ ok: false,
65
+ error: {
66
+ code: 'VAULT.IO_ERROR',
67
+ message: e instanceof Error ? e.message : String(e),
68
+ retryable: true,
69
+ },
70
+ };
71
+ }
72
+ }
73
+ export async function handleListCredentials(_input, deps) {
74
+ try {
75
+ const providers = await deps.vault.list();
76
+ return { ok: true, data: { providers, count: providers.length } };
77
+ }
78
+ catch (e) {
79
+ return {
80
+ ok: false,
81
+ error: {
82
+ code: 'VAULT.IO_ERROR',
83
+ message: e instanceof Error ? e.message : String(e),
84
+ retryable: true,
85
+ },
86
+ };
87
+ }
88
+ }
89
+ export async function handleRemoveCredential(input, deps) {
90
+ const v = validateProvider(input?.provider);
91
+ if (!v.ok) {
92
+ return { ok: false, error: { code: 'INPUT.INVALID', message: v.msg, retryable: false } };
93
+ }
94
+ try {
95
+ const removed = await deps.vault.delete(v.v);
96
+ return { ok: true, data: { removed, provider: v.v } };
97
+ }
98
+ catch (e) {
99
+ return {
100
+ ok: false,
101
+ error: {
102
+ code: 'VAULT.IO_ERROR',
103
+ message: e instanceof Error ? e.message : String(e),
104
+ retryable: true,
105
+ },
106
+ };
107
+ }
108
+ }
109
+ //# sourceMappingURL=credential-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/credential-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * src/tools/get-monthly-picks.ts — handler for `skillfm_get_monthly_picks` (Pro).
3
+ *
4
+ * Phase 0:
5
+ * - Free users → ok=false + AUTH.PRO_REQUIRED (per contract §7 comment).
6
+ * - Pro users → returns the empty mock fixture.
7
+ *
8
+ * TODO Week 5:
9
+ * - Real Pro-tier check from agent_token claims (currently we treat
10
+ * "no token" → degraded, "with token" → assume Pro; need real tier).
11
+ * - Personalized picks: pass user usage profile into brain rule eval.
12
+ * - Localize curationTheme strings per agent locale.
13
+ * - Cache picks for 24h — same pick set across MCP server restarts.
14
+ * - Pre-render install commands per agent (claude_code / cursor / openclaw)
15
+ * using detected agent harness (skillfm-local already does harness probe).
16
+ */
17
+ import { type SkillFmGetMonthlyPicksInput, type SkillFmGetMonthlyPicksOutput, type SkillFmToolResult } from '../_vendored-contracts/beacon-mcp-tools-v1.js';
18
+ import type { BrainClient } from '../brain-client.js';
19
+ export interface GetMonthlyPicksDeps {
20
+ brain: BrainClient;
21
+ /** Phase 0 stub — Week 5 will read from agent_token claims */
22
+ isProTier: boolean;
23
+ }
24
+ export declare function handleGetMonthlyPicks(input: SkillFmGetMonthlyPicksInput, deps: GetMonthlyPicksDeps): Promise<SkillFmToolResult<SkillFmGetMonthlyPicksOutput>>;
25
+ //# sourceMappingURL=get-monthly-picks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-monthly-picks.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/get-monthly-picks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,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;IACnB,8DAA8D;IAC9D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,2BAA2B,EAClC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,CAAC,CAiB1D"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * src/tools/get-monthly-picks.ts — handler for `skillfm_get_monthly_picks` (Pro).
3
+ *
4
+ * Phase 0:
5
+ * - Free users → ok=false + AUTH.PRO_REQUIRED (per contract §7 comment).
6
+ * - Pro users → returns the empty mock fixture.
7
+ *
8
+ * TODO Week 5:
9
+ * - Real Pro-tier check from agent_token claims (currently we treat
10
+ * "no token" → degraded, "with token" → assume Pro; need real tier).
11
+ * - Personalized picks: pass user usage profile into brain rule eval.
12
+ * - Localize curationTheme strings per agent locale.
13
+ * - Cache picks for 24h — same pick set across MCP server restarts.
14
+ * - Pre-render install commands per agent (claude_code / cursor / openclaw)
15
+ * using detected agent harness (skillfm-local already does harness probe).
16
+ */
17
+ import { proRequired } from '../errors.js';
18
+ export async function handleGetMonthlyPicks(input, deps) {
19
+ if (!deps.isProTier) {
20
+ return {
21
+ ok: false,
22
+ error: proRequired('skillfm_get_monthly_picks').toToolError(),
23
+ };
24
+ }
25
+ const personalized = input.forUserContext ?? false;
26
+ const result = await deps.brain.getMonthlyPicks(personalized);
27
+ if (!result.ok) {
28
+ return {
29
+ ok: false,
30
+ error: { code: result.code, message: result.message, retryable: result.retryable },
31
+ };
32
+ }
33
+ return { ok: true, data: result.data };
34
+ }
35
+ //# sourceMappingURL=get-monthly-picks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-monthly-picks.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-monthly-picks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQ3C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAkC,EAClC,IAAyB;IAEzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,WAAW,CAAC,2BAA2B,CAAC,CAAC,WAAW,EAAE;SAC9D,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAC9D,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,44 @@
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 type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
25
+ import type { BrainClient } from '../brain-client.js';
26
+ import type { MemoryStore } from '../../memory/index.js';
27
+ import type { Vault } from '../../vault/index.js';
28
+ export interface ToolRegistryDeps {
29
+ brain: BrainClient;
30
+ /** Phase 0: derived from `agentToken !== null`; Week 5: real claim. */
31
+ isProTier: boolean;
32
+ /** Mem0 self-host client (Day 6 B1, Pro-only); null = 未配置, MCP tools 返 NOT_CONFIGURED */
33
+ memory?: MemoryStore | null;
34
+ /** Local credential vault (BYOK: keys 加密存本地节点 ~/.skillfm/vault.{key,enc}, 不出节点) */
35
+ vault?: Vault | null;
36
+ }
37
+ /**
38
+ * Register every Phase 0 beacon MCP tool. Called once by src/index.ts on
39
+ * server bootstrap.
40
+ */
41
+ export declare function registerAllTools(server: McpServer, deps: ToolRegistryDeps): void;
42
+ /** For tests / sanity checks. Not part of the public package surface. */
43
+ export declare function _listAllRegisteredToolNames(): string[];
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAoBtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAMlD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,mFAAmF;IACnF,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;CACtB;AAwPD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAGhF;AAED,yEAAyE;AACzE,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAEtD"}