level-up-mcp-server-cn 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/.claude/projects/c--Users-klexi-OneDrive-Desktop-Levelup-level-up-mcp-server/memory/project_testing_service.md +11 -0
  2. package/.claude/settings.local.json +10 -0
  3. package/.env.example +19 -0
  4. package/CLAUDE.md +222 -0
  5. package/CODE_REVIEW.md +282 -0
  6. package/LICENSE +64 -0
  7. package/README.md +198 -0
  8. package/dist/constants.d.ts +33 -0
  9. package/dist/constants.js +78 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/data/quest-seeds.d.ts +18 -0
  12. package/dist/data/quest-seeds.js +380 -0
  13. package/dist/data/quest-seeds.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.js +260 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/schemas/common.d.ts +33 -0
  18. package/dist/schemas/common.js +96 -0
  19. package/dist/schemas/common.js.map +1 -0
  20. package/dist/services/dispatcher.d.ts +27 -0
  21. package/dist/services/dispatcher.js +47 -0
  22. package/dist/services/dispatcher.js.map +1 -0
  23. package/dist/services/errors.d.ts +56 -0
  24. package/dist/services/errors.js +99 -0
  25. package/dist/services/errors.js.map +1 -0
  26. package/dist/services/format.d.ts +74 -0
  27. package/dist/services/format.js +144 -0
  28. package/dist/services/format.js.map +1 -0
  29. package/dist/services/ownership.d.ts +19 -0
  30. package/dist/services/ownership.js +79 -0
  31. package/dist/services/ownership.js.map +1 -0
  32. package/dist/services/quality-gate.d.ts +45 -0
  33. package/dist/services/quality-gate.js +131 -0
  34. package/dist/services/quality-gate.js.map +1 -0
  35. package/dist/services/rate-limit.d.ts +12 -0
  36. package/dist/services/rate-limit.js +49 -0
  37. package/dist/services/rate-limit.js.map +1 -0
  38. package/dist/services/register.d.ts +49 -0
  39. package/dist/services/register.js +63 -0
  40. package/dist/services/register.js.map +1 -0
  41. package/dist/services/supabase.d.ts +10 -0
  42. package/dist/services/supabase.js +79 -0
  43. package/dist/services/supabase.js.map +1 -0
  44. package/dist/tools/achievements.d.ts +6 -0
  45. package/dist/tools/achievements.js +242 -0
  46. package/dist/tools/achievements.js.map +1 -0
  47. package/dist/tools/admin.d.ts +16 -0
  48. package/dist/tools/admin.js +328 -0
  49. package/dist/tools/admin.js.map +1 -0
  50. package/dist/tools/agents.d.ts +3 -0
  51. package/dist/tools/agents.js +400 -0
  52. package/dist/tools/agents.js.map +1 -0
  53. package/dist/tools/bootstrap.d.ts +17 -0
  54. package/dist/tools/bootstrap.js +565 -0
  55. package/dist/tools/bootstrap.js.map +1 -0
  56. package/dist/tools/dispatchers/admin.d.ts +3 -0
  57. package/dist/tools/dispatchers/admin.js +50 -0
  58. package/dist/tools/dispatchers/admin.js.map +1 -0
  59. package/dist/tools/dispatchers/eval.d.ts +3 -0
  60. package/dist/tools/dispatchers/eval.js +40 -0
  61. package/dist/tools/dispatchers/eval.js.map +1 -0
  62. package/dist/tools/dispatchers/quests.d.ts +3 -0
  63. package/dist/tools/dispatchers/quests.js +60 -0
  64. package/dist/tools/dispatchers/quests.js.map +1 -0
  65. package/dist/tools/dispatchers/session.d.ts +3 -0
  66. package/dist/tools/dispatchers/session.js +38 -0
  67. package/dist/tools/dispatchers/session.js.map +1 -0
  68. package/dist/tools/dispatchers/skills.d.ts +3 -0
  69. package/dist/tools/dispatchers/skills.js +49 -0
  70. package/dist/tools/dispatchers/skills.js.map +1 -0
  71. package/dist/tools/dispatchers/tasks.d.ts +3 -0
  72. package/dist/tools/dispatchers/tasks.js +53 -0
  73. package/dist/tools/dispatchers/tasks.js.map +1 -0
  74. package/dist/tools/dispatchers/users.d.ts +3 -0
  75. package/dist/tools/dispatchers/users.js +65 -0
  76. package/dist/tools/dispatchers/users.js.map +1 -0
  77. package/dist/tools/dispatchers/xp.d.ts +3 -0
  78. package/dist/tools/dispatchers/xp.js +51 -0
  79. package/dist/tools/dispatchers/xp.js.map +1 -0
  80. package/dist/tools/growth-plan.d.ts +5 -0
  81. package/dist/tools/growth-plan.js +791 -0
  82. package/dist/tools/growth-plan.js.map +1 -0
  83. package/dist/tools/leaderboards.d.ts +10 -0
  84. package/dist/tools/leaderboards.js +279 -0
  85. package/dist/tools/leaderboards.js.map +1 -0
  86. package/dist/tools/leveling.d.ts +24 -0
  87. package/dist/tools/leveling.js +356 -0
  88. package/dist/tools/leveling.js.map +1 -0
  89. package/dist/tools/metrics.d.ts +3 -0
  90. package/dist/tools/metrics.js +247 -0
  91. package/dist/tools/metrics.js.map +1 -0
  92. package/dist/tools/quests.d.ts +5 -0
  93. package/dist/tools/quests.js +586 -0
  94. package/dist/tools/quests.js.map +1 -0
  95. package/dist/tools/ratings.d.ts +11 -0
  96. package/dist/tools/ratings.js +564 -0
  97. package/dist/tools/ratings.js.map +1 -0
  98. package/dist/tools/skills.d.ts +66 -0
  99. package/dist/tools/skills.js +1112 -0
  100. package/dist/tools/skills.js.map +1 -0
  101. package/dist/tools/system.d.ts +31 -0
  102. package/dist/tools/system.js +605 -0
  103. package/dist/tools/system.js.map +1 -0
  104. package/dist/tools/tasks.d.ts +73 -0
  105. package/dist/tools/tasks.js +1572 -0
  106. package/dist/tools/tasks.js.map +1 -0
  107. package/dist/tools/users.d.ts +97 -0
  108. package/dist/tools/users.js +1306 -0
  109. package/dist/tools/users.js.map +1 -0
  110. package/dist/tools/xp.d.ts +38 -0
  111. package/dist/tools/xp.js +670 -0
  112. package/dist/tools/xp.js.map +1 -0
  113. package/dist/types.d.ts +178 -0
  114. package/dist/types.js +12 -0
  115. package/dist/types.js.map +1 -0
  116. package/docs/recommended-skillsets.md +622 -0
  117. package/docs/skills-and-abilities-review.md +672 -0
  118. package/docs/v0.3-roadmap.md +191 -0
  119. package/package.json +35 -0
  120. package/sql/agent_pending_installs.sql +28 -0
  121. package/sql/award_class_xp.sql +81 -0
  122. package/supabase/.temp/cli-latest +1 -0
  123. package/supabase/.temp/gotrue-version +1 -0
  124. package/supabase/.temp/pooler-url +1 -0
  125. package/supabase/.temp/postgres-version +1 -0
  126. package/supabase/.temp/project-ref +1 -0
  127. package/supabase/.temp/rest-version +1 -0
  128. package/supabase/.temp/storage-migration +1 -0
  129. package/supabase/.temp/storage-version +1 -0
  130. package/supabase/migrations/20260314000000_anon_rls_policies.sql +311 -0
  131. package/supabase/migrations/20260314000001_ownership_rpcs.sql +382 -0
  132. package/supabase/migrations/20260314000002_evidence_and_growth_plan.sql +97 -0
  133. package/supabase/migrations/20260317000000_seed_quests.sql +62 -0
  134. package/supabase/migrations/20260317000001_star_cooldown_and_fixes.sql +16 -0
  135. package/supabase/migrations/20260318000000_restore_rank_names.sql +25 -0
  136. package/supabase/migrations/20260320000000_chinese_rank_names.sql +24 -0
  137. package/vitest.config.ts +11 -0
@@ -0,0 +1,565 @@
1
+ // ============================================================
2
+ // tools/bootstrap.ts — Bootstrap & Setup Wizard tools
3
+ // ============================================================
4
+ // Tool 1: levelup_bootstrap — Single-call session state loader
5
+ // Tool 2: levelup_setup_wizard — MCP-to-skill onboarding mapper
6
+ // ============================================================
7
+ import { z } from "zod";
8
+ import { supabase } from "../services/supabase.js";
9
+ import { ok, fail } from "../services/errors.js";
10
+ import { formatRankDisplay } from "../services/format.js";
11
+ import { toMcpResponse, logRegistered } from "../services/register.js";
12
+ import { uuidSchema } from "../schemas/common.js";
13
+ import { awardXpViaRpc } from "../services/quality-gate.js";
14
+ // ---- MCP-to-skill mapping table ----
15
+ const MCP_SKILL_MAP = {
16
+ // Official / Reference MCPs
17
+ filesystem: ["File Management"],
18
+ git: ["DevOps & Deployment"],
19
+ github: ["DevOps & Deployment", "Project Management"],
20
+ playwright: ["Testing & QA", "Web Development"],
21
+ brave_search: ["Web Search & Synthesis"],
22
+ fetch: ["Web Search & Synthesis", "API Integration"],
23
+ sequential_thinking: ["Strategy & Tactics"],
24
+ memory: ["Knowledge Management"],
25
+ // Productivity MCPs
26
+ notion: ["Note-Taking & Docs", "Knowledge Management", "Project Management"],
27
+ slack: ["Chat & Messaging", "Community Building"],
28
+ gmail: ["Email Management", "Email Marketing"],
29
+ google_calendar: ["Calendar & Scheduling"],
30
+ google_drive: ["File Management", "Note-Taking & Docs"],
31
+ atlassian: ["Project Management", "Testing & QA"],
32
+ clickup: ["Project Management", "Workflow Automation"],
33
+ // Infrastructure MCPs
34
+ terraform: ["DevOps & Deployment", "Cloud Services"],
35
+ aws: ["Cloud Services", "System Administration"],
36
+ cloudflare: ["Cloud Services", "Web Development"],
37
+ grafana: ["Monitoring & Logging"],
38
+ docker: ["DevOps & Deployment", "Cloud Services"],
39
+ vercel: ["DevOps & Deployment", "Web Development"],
40
+ supabase: ["Database Operations", "API Integration"],
41
+ // Creative MCPs
42
+ figma: ["Design & UX", "Presentations"],
43
+ canva: ["Design & UX", "Presentations", "Social Media Management"],
44
+ gamma: ["Presentations", "Content Writing"],
45
+ elevenlabs: ["Audio Production"],
46
+ // Business MCPs
47
+ stripe: ["E-commerce Operations", "API Integration"],
48
+ };
49
+ // ── Exported handlers for dispatcher ─────────────────────────
50
+ export async function handleBootstrap(params) {
51
+ // ---- Step 1: Resolve user_id ----
52
+ let userId = params.user_id || null;
53
+ if (!userId) {
54
+ // Check env var
55
+ const envUserId = process.env.LEVELUP_USER_ID;
56
+ if (envUserId) {
57
+ userId = envUserId;
58
+ }
59
+ }
60
+ if (!userId && params.username) {
61
+ const { data: userByName } = await supabase
62
+ .from("users")
63
+ .select("id")
64
+ .eq("username", params.username)
65
+ .maybeSingle();
66
+ if (userByName)
67
+ userId = userByName.id;
68
+ }
69
+ if (!userId) {
70
+ // Fallback: most recently created user
71
+ const { data: recentUser } = await supabase
72
+ .from("users")
73
+ .select("id")
74
+ .order("created_at", { ascending: false })
75
+ .limit(1)
76
+ .maybeSingle();
77
+ if (recentUser)
78
+ userId = recentUser.id;
79
+ }
80
+ if (!userId) {
81
+ return toMcpResponse(fail("未找到用户", "请先使用 levelup_register_user 注册用户。"));
82
+ }
83
+ // ---- Step 2: Fetch user profile ----
84
+ const { data: user, error: userError } = await supabase
85
+ .from("users")
86
+ .select("id, username, handle, profile_code, main_level, main_xp")
87
+ .eq("id", userId)
88
+ .single();
89
+ if (userError || !user) {
90
+ return toMcpResponse(fail("未找到用户", `未找到 ID 为 ${userId} 的用户。`));
91
+ }
92
+ // Fetch user rank
93
+ const { data: userRank } = await supabase
94
+ .from("rank_definitions")
95
+ .select("rank_name, rank_letter, min_level, max_level")
96
+ .eq("entity_type", "user")
97
+ .eq("locale", "zh")
98
+ .lte("min_level", user.main_level)
99
+ .gte("max_level", user.main_level)
100
+ .maybeSingle();
101
+ const userRankDisplay = formatRankDisplay(user.main_level, userRank?.rank_letter || null, userRank?.rank_name || null, userRank?.min_level || 1, userRank?.max_level || 5);
102
+ // ---- Step 3: Resolve agent ----
103
+ let agentId = params.agent_id || null;
104
+ let agentProfile = null;
105
+ let agentsList = null;
106
+ if (!agentId) {
107
+ const envAgentId = process.env.LEVELUP_AGENT_ID;
108
+ if (envAgentId) {
109
+ agentId = envAgentId;
110
+ }
111
+ }
112
+ if (!agentId) {
113
+ // Look up agents owned by this user
114
+ const { data: ownedAgents } = await supabase
115
+ .from("agents")
116
+ .select("id, name, level, xp, integrity_score")
117
+ .eq("owner_user_id", user.id);
118
+ if (ownedAgents && ownedAgents.length === 1) {
119
+ agentId = ownedAgents[0].id;
120
+ }
121
+ else if (ownedAgents && ownedAgents.length > 1) {
122
+ // Multiple agents — return list for client to pick
123
+ agentsList = ownedAgents.map((a) => ({
124
+ id: a.id,
125
+ name: a.name,
126
+ level: a.level,
127
+ xp: a.xp,
128
+ integrity_score: a.integrity_score,
129
+ }));
130
+ }
131
+ }
132
+ // Fetch full agent profile if we have an agent_id
133
+ if (agentId) {
134
+ const { data: agent } = await supabase
135
+ .from("agents")
136
+ .select("id, name, level, xp, integrity_score")
137
+ .eq("id", agentId)
138
+ .single();
139
+ if (agent) {
140
+ // Fetch agent rank
141
+ const { data: agentRank } = await supabase
142
+ .from("rank_definitions")
143
+ .select("rank_name, rank_letter, min_level, max_level")
144
+ .eq("entity_type", "agent")
145
+ .eq("locale", "zh")
146
+ .lte("min_level", agent.level)
147
+ .gte("max_level", agent.level)
148
+ .maybeSingle();
149
+ const agentRankDisplay = formatRankDisplay(agent.level, agentRank?.rank_letter || null, agentRank?.rank_name || null, agentRank?.min_level || 1, agentRank?.max_level || 5);
150
+ // Fetch agent skills
151
+ const { data: agentSkills } = await supabase
152
+ .from("agent_skills")
153
+ .select("proficiency_level, skills(name)")
154
+ .eq("agent_id", agentId);
155
+ const skills = (agentSkills || []).map((s) => ({
156
+ name: s.skills?.name || "未知",
157
+ proficiency_level: s.proficiency_level,
158
+ }));
159
+ agentProfile = {
160
+ id: agent.id,
161
+ name: agent.name,
162
+ level: agent.level,
163
+ xp: agent.xp,
164
+ rank_letter: agentRank?.rank_letter || null,
165
+ rank_name: agentRank?.rank_name || null,
166
+ rank_display: agentRankDisplay.rank_display,
167
+ integrity_score: agent.integrity_score,
168
+ skills,
169
+ };
170
+ }
171
+ }
172
+ // ---- Step 4: Fetch orphaned tasks ----
173
+ let orphanedQuery = supabase
174
+ .from("tasks")
175
+ .select("id, title, task_type_id, created_at, completion_pct, task_types(name)")
176
+ .eq("status", "in_progress")
177
+ .order("created_at", { ascending: false });
178
+ if (agentId) {
179
+ orphanedQuery = orphanedQuery.or(`user_id.eq.${user.id},agent_id.eq.${agentId}`);
180
+ }
181
+ else {
182
+ orphanedQuery = orphanedQuery.eq("user_id", user.id);
183
+ }
184
+ const { data: orphanedTasks } = await orphanedQuery;
185
+ // ---- Step 5: Fetch recent completed tasks ----
186
+ const { data: recentTasks } = await supabase
187
+ .from("tasks")
188
+ .select("id, title, completed_at")
189
+ .eq("user_id", user.id)
190
+ .in("status", ["completed", "failed"])
191
+ .order("completed_at", { ascending: false })
192
+ .limit(3);
193
+ // Fetch XP earned for recent tasks
194
+ const recentCompleted = [];
195
+ for (const task of recentTasks || []) {
196
+ const { data: xpAwards } = await supabase
197
+ .from("task_xp_awards")
198
+ .select("xp_awarded")
199
+ .eq("task_id", task.id);
200
+ const totalXp = (xpAwards || []).reduce((sum, a) => sum + (a.xp_awarded || 0), 0);
201
+ recentCompleted.push({
202
+ task_id: task.id,
203
+ title: task.title,
204
+ xp_earned: totalXp,
205
+ completed_at: task.completed_at,
206
+ });
207
+ }
208
+ // ---- Step 6: Build recovery actions ----
209
+ const now = new Date();
210
+ const twentyFourHoursAgo = new Date(now.getTime() - 24 * 60 * 60 * 1000);
211
+ const orphanedList = (orphanedTasks || []).map((t) => ({
212
+ task_id: t.id,
213
+ title: t.title,
214
+ task_type: t.task_types?.name || null,
215
+ started_at: t.created_at,
216
+ completion_pct: t.completion_pct,
217
+ }));
218
+ const recoveryActions = (orphanedTasks || []).map((t) => {
219
+ const createdAt = new Date(t.created_at);
220
+ const isOld = createdAt < twentyFourHoursAgo;
221
+ return {
222
+ task_id: t.id,
223
+ title: t.title,
224
+ suggestion: isOld ? "fail" : "resume",
225
+ reason: isOld
226
+ ? "任务已超过24小时,可能已被放弃。标记为失败可获得部分经验值(15%)。"
227
+ : "任务是最近开始的。请继续完成以获得全部经验值。",
228
+ };
229
+ });
230
+ // Fetch active quests for this user
231
+ let activeQuests = [];
232
+ try {
233
+ const { data: participants } = await supabase
234
+ .from("quest_participants")
235
+ .select("quest_id, status, completion_pct, progress_data")
236
+ .or(`user_id.eq.${user.id}${agentId ? `,agent_id.eq.${agentId}` : ""}`)
237
+ .eq("status", "active");
238
+ if (participants && participants.length > 0) {
239
+ const questIds = participants.map((p) => p.quest_id);
240
+ const { data: quests } = await supabase
241
+ .from("quests")
242
+ .select("id, title, base_xp_reward, metadata")
243
+ .in("id", questIds);
244
+ activeQuests = (quests || []).map((q) => {
245
+ const part = participants.find((p) => p.quest_id === q.id);
246
+ return {
247
+ quest_id: q.id,
248
+ title: q.title,
249
+ xp_reward: q.base_xp_reward,
250
+ progress: part?.completion_pct || 0,
251
+ category: q.metadata?.category || null,
252
+ };
253
+ });
254
+ }
255
+ }
256
+ catch {
257
+ // Quests may not be enabled
258
+ }
259
+ // Generate coaching nudge based on recent activity
260
+ let coachingNudge = null;
261
+ const completedCount = recentCompleted?.length || 0;
262
+ const skillCount = agentProfile?.skills?.length || 0;
263
+ const agentLevel = agentProfile?.level || 1;
264
+ if (completedCount === 0 && skillCount === 0) {
265
+ coachingNudge = "开始行动:调用 levelup_setup_wizard 将已安装的 MCP 注册为技能(每个 +20 经验值)。";
266
+ }
267
+ else if (skillCount < 3) {
268
+ coachingNudge = `你的智能体拥有 ${skillCount} 个技能。安装更多 MCP 并运行 setup_wizard 来解锁新能力。`;
269
+ }
270
+ else if (orphanedList.length > 0) {
271
+ coachingNudge = `你有 ${orphanedList.length} 个未完成的任务。请继续完成或关闭它们,保持档案整洁。`;
272
+ }
273
+ else if (agentLevel < 5) {
274
+ coachingNudge = "尝试完成不同类型的任务以获得多样性奖励(每种 +3 经验值)。查看你的成长计划,找到晋升 D 段位的最快路径。";
275
+ }
276
+ else {
277
+ coachingNudge = "表现出色!查看排行榜了解你的排名,或浏览技能集发现新能力。";
278
+ }
279
+ // Build auto-actions: things the agent should do immediately after bootstrap
280
+ const autoActions = [];
281
+ // Always ask agent to report its MCP servers (idempotent)
282
+ const agentIdForReport = agentProfile?.id || (agentsList && agentsList.length === 1 ? agentsList[0].id : null);
283
+ if (agentIdForReport) {
284
+ autoActions.push(`重要:请调用 levelup_report_installed_mcps,参数 agent_id="${agentIdForReport}",tool_names=[...你可用的所有 MCP 服务器名称列表]。` +
285
+ `查看你的可用工具——按 MCP 服务器前缀分组(例如以 "mcp__filesystem__" 开头的工具表示你安装了 "filesystem")。` +
286
+ `这将同步你的 MCP 环境到升级系统,并为新安装的工具奖励经验值。`);
287
+ }
288
+ // Check for pending installs from the frontend skill tree
289
+ if (agentIdForReport) {
290
+ autoActions.push(`请调用 levelup_get_pending_installs,参数 agent_id="${agentIdForReport}",检查用户是否通过网页端请求了任何 MCP/技能安装。`);
291
+ }
292
+ return toMcpResponse(ok({
293
+ user: {
294
+ id: user.id,
295
+ username: user.username,
296
+ handle: user.handle,
297
+ profile_code: user.profile_code,
298
+ level: user.main_level,
299
+ xp: user.main_xp,
300
+ rank_letter: userRank?.rank_letter || null,
301
+ rank_name: userRank?.rank_name || null,
302
+ rank_display: userRankDisplay.rank_display,
303
+ },
304
+ agent: agentProfile,
305
+ agents: agentsList,
306
+ session: {
307
+ orphaned_tasks: orphanedList,
308
+ recent_completed: recentCompleted,
309
+ recovery_actions: recoveryActions,
310
+ active_quests: activeQuests.length > 0 ? activeQuests : undefined,
311
+ coaching_nudge: coachingNudge,
312
+ auto_actions: autoActions.length > 0 ? autoActions : undefined,
313
+ },
314
+ }));
315
+ }
316
+ export async function handleSetupWizard(params) {
317
+ const agentId = params.agent_id;
318
+ const installedMcps = params.installed_mcps || [];
319
+ const autoRegister = params.auto_register_skills !== undefined ? params.auto_register_skills : true;
320
+ // Verify agent exists
321
+ const { data: agent, error: agentError } = await supabase
322
+ .from("agents")
323
+ .select("id, owner_user_id")
324
+ .eq("id", agentId)
325
+ .single();
326
+ if (agentError || !agent) {
327
+ return toMcpResponse(fail("未找到智能体", "请检查 agent_id。"));
328
+ }
329
+ // Collect all unique skill names from installed MCPs
330
+ const skillNamesNeeded = new Set();
331
+ const mcpToSkillNames = {};
332
+ for (const mcp of installedMcps) {
333
+ const normalizedMcp = mcp.toLowerCase().replace(/[-\s]/g, "_");
334
+ const mapped = MCP_SKILL_MAP[normalizedMcp];
335
+ if (mapped) {
336
+ mcpToSkillNames[normalizedMcp] = mapped;
337
+ for (const skillName of mapped) {
338
+ skillNamesNeeded.add(skillName);
339
+ }
340
+ }
341
+ }
342
+ // Fetch all matching skills from the catalog in one query
343
+ const { data: catalogSkills } = await supabase
344
+ .from("skills")
345
+ .select("id, name")
346
+ .in("name", Array.from(skillNamesNeeded));
347
+ const skillsByName = {};
348
+ for (const skill of catalogSkills || []) {
349
+ skillsByName[skill.name] = skill;
350
+ }
351
+ // Fetch agent's existing skills
352
+ const { data: existingAgentSkills } = await supabase
353
+ .from("agent_skills")
354
+ .select("skill_id")
355
+ .eq("agent_id", agentId);
356
+ const existingSkillIds = new Set((existingAgentSkills || []).map((s) => s.skill_id));
357
+ // Check daily XP cap for tool installs
358
+ const todayStart = new Date();
359
+ todayStart.setHours(0, 0, 0, 0);
360
+ const { data: todayInstalls } = await supabase
361
+ .from("xp_ledger")
362
+ .select("amount")
363
+ .eq("entity_type", "agent")
364
+ .eq("entity_id", agentId)
365
+ .eq("source_type", "skill")
366
+ .gte("created_at", todayStart.toISOString());
367
+ let dailyInstallCount = (todayInstalls || []).length;
368
+ const skillsRegistered = [];
369
+ const skillsAlreadyHad = [];
370
+ let totalXpAwarded = 0;
371
+ // Process each installed MCP
372
+ for (const mcp of installedMcps) {
373
+ const normalizedMcp = mcp.toLowerCase().replace(/[-\s]/g, "_");
374
+ const mappedSkillNames = mcpToSkillNames[normalizedMcp];
375
+ if (!mappedSkillNames)
376
+ continue;
377
+ for (const skillName of mappedSkillNames) {
378
+ const catalogSkill = skillsByName[skillName];
379
+ if (!catalogSkill)
380
+ continue;
381
+ // Already has this skill?
382
+ if (existingSkillIds.has(catalogSkill.id)) {
383
+ // Only add to already-had list once per skill
384
+ if (!skillsAlreadyHad.some((s) => s.skill_id === catalogSkill.id)) {
385
+ skillsAlreadyHad.push({ skill_name: catalogSkill.name, skill_id: catalogSkill.id });
386
+ }
387
+ continue;
388
+ }
389
+ // Already registered in this call (another MCP mapped to same skill)
390
+ if (skillsRegistered.some((s) => s.skill_id === catalogSkill.id)) {
391
+ continue;
392
+ }
393
+ if (!autoRegister) {
394
+ // Just report what would be registered
395
+ skillsRegistered.push({ skill_name: catalogSkill.name, skill_id: catalogSkill.id, matched_mcp: mcp });
396
+ continue;
397
+ }
398
+ // Insert new agent_skill via secure RPC
399
+ const { data: skillRpcResult, error: insertError } = await supabase.rpc('upsert_agent_skill_secure', {
400
+ p_caller_user_id: agent.owner_user_id,
401
+ p_agent_id: agentId,
402
+ p_skill_id: catalogSkill.id,
403
+ p_proficiency_level: 1,
404
+ p_acquired_reason: "mcp_installed",
405
+ p_usage_count: 0,
406
+ });
407
+ if (insertError || !skillRpcResult?.success) {
408
+ console.error(`[setup_wizard] Failed to insert skill ${skillName}:`, insertError?.message || skillRpcResult?.error);
409
+ continue;
410
+ }
411
+ const newSkill = skillRpcResult.agent_skill;
412
+ // Record in agent_tool_installations via secure RPC
413
+ try {
414
+ await supabase.rpc('upsert_agent_tool_secure', {
415
+ p_caller_user_id: agent.owner_user_id,
416
+ p_agent_id: agentId,
417
+ p_tool_name: catalogSkill.name,
418
+ });
419
+ }
420
+ catch (err) {
421
+ // RPC may not exist — silently skip
422
+ }
423
+ existingSkillIds.add(catalogSkill.id);
424
+ skillsRegistered.push({ skill_name: catalogSkill.name, skill_id: catalogSkill.id, matched_mcp: mcp });
425
+ // Award 20 XP per new skill (max 3 per day)
426
+ if (dailyInstallCount < 3) {
427
+ const xpResult = await awardXpViaRpc("agent", agentId, 20, "skill", `设置向导:${catalogSkill.name}(通过 ${mcp})`, newSkill.id);
428
+ if (xpResult.success) {
429
+ totalXpAwarded += 20;
430
+ dailyInstallCount++;
431
+ // Also award 5 XP to the owner user
432
+ if (agent.owner_user_id) {
433
+ await awardXpViaRpc("user", agent.owner_user_id, 5, "skill", `智能体设置:${catalogSkill.name}(通过 ${mcp})`, newSkill.id);
434
+ }
435
+ }
436
+ }
437
+ }
438
+ }
439
+ // Build suggested MCPs: MCPs not in installed list that could unlock new skills
440
+ const installedNormalized = new Set(installedMcps.map((m) => m.toLowerCase().replace(/[-\s]/g, "_")));
441
+ const suggestedMcps = [];
442
+ const mcpPurposes = {
443
+ filesystem: "本地文件读写操作",
444
+ git: "Git 版本控制操作",
445
+ github: "GitHub 议题、PR 和仓库管理",
446
+ playwright: "浏览器自动化和网页测试",
447
+ brave_search: "网页搜索和研究",
448
+ fetch: "获取网页内容和 API",
449
+ notion: "笔记、文档和项目管理",
450
+ slack: "团队聊天和消息",
451
+ gmail: "邮件阅读和发送",
452
+ google_calendar: "日历和日程管理",
453
+ google_drive: "云端文件存储和文档",
454
+ atlassian: "Jira/Confluence 项目管理",
455
+ clickup: "项目管理和工作流自动化",
456
+ terraform: "基础设施即代码",
457
+ aws: "Amazon Web Services 云管理",
458
+ cloudflare: "CDN、DNS 和边缘计算",
459
+ grafana: "指标仪表盘和告警",
460
+ docker: "容器管理和编排",
461
+ vercel: "前端部署和托管",
462
+ supabase: "数据库、认证和后端 API",
463
+ elevenlabs: "文字转语音和语音合成",
464
+ stripe: "支付处理和计费",
465
+ figma: "UI/UX 设计协作",
466
+ canva: "图形设计和视觉内容",
467
+ gamma: "AI 驱动的演示文稿和文档",
468
+ sequential_thinking: "结构化问题解决和推理",
469
+ memory: "持久化知识和上下文存储",
470
+ };
471
+ for (const [mcpName, skillNames] of Object.entries(MCP_SKILL_MAP)) {
472
+ if (installedNormalized.has(mcpName))
473
+ continue;
474
+ // Check if any of these skills are not yet on the agent
475
+ const newSkills = skillNames.filter((sn) => {
476
+ const catalog = skillsByName[sn];
477
+ // If skill not in catalog lookup, we need to check DB
478
+ // For suggestions, include all mapped skill names
479
+ return true;
480
+ });
481
+ if (newSkills.length > 0) {
482
+ suggestedMcps.push({
483
+ name: mcpName,
484
+ purpose: mcpPurposes[mcpName] || "扩展智能体能力",
485
+ skills_unlocked: newSkills,
486
+ });
487
+ }
488
+ }
489
+ // P4 FIX: Explain why XP may be 0 — daily cap or all skills already installed
490
+ let xpNote = null;
491
+ if (totalXpAwarded === 0 && skillsRegistered.length > 0) {
492
+ xpNote = `每日安装经验值上限(每个智能体每天3次)已达到。已注册 ${skillsRegistered.length} 个技能但未获得经验值。经验值明天重置。`;
493
+ }
494
+ else if (totalXpAwarded === 0 && skillsRegistered.length === 0 && skillsAlreadyHad.length > 0) {
495
+ xpNote = `该智能体已安装全部 ${skillsAlreadyHad.length} 个技能。没有新技能需要注册。`;
496
+ }
497
+ return toMcpResponse(ok({
498
+ skills_registered: skillsRegistered,
499
+ skills_already_had: skillsAlreadyHad,
500
+ xp_awarded: totalXpAwarded,
501
+ daily_install_cap: `该智能体今日已使用 ${dailyInstallCount}/3 次安装额度`,
502
+ xp_note: xpNote,
503
+ suggested_mcps: suggestedMcps,
504
+ }));
505
+ }
506
+ // ── Tool registration (backward compat) ──────────────────────
507
+ export function registerBootstrapTools(server) {
508
+ console.error("\n📋 模块:引导与设置");
509
+ // ================================================================
510
+ // Tool: levelup_bootstrap
511
+ // ================================================================
512
+ server.registerTool("levelup_bootstrap", {
513
+ title: "引导会话",
514
+ description: `无状态智能体的一次性会话状态加载器。
515
+
516
+ 返回完整的会话上下文:用户档案、智能体档案及技能、
517
+ 未完成的进行中任务、最近完成的任务以及恢复建议。
518
+
519
+ 通过环境变量、用户名查找或最近记录自动解析用户/智能体。
520
+
521
+ 参数:
522
+ - user_id(uuid,可选):已知时跳过自动检测。
523
+ - agent_id(uuid,可选):已知时跳过自动检测。
524
+ - username(string,可选):按用户名查找用户。
525
+ - platform(string,可选):"claude_web"、"claude_desktop"、"claude_code"、"custom"。
526
+
527
+ 返回:
528
+ 完整会话状态:用户、智能体(或智能体列表)、未完成任务、最近任务、恢复操作。`,
529
+ inputSchema: {
530
+ user_id: uuidSchema.optional().describe("已知时跳过自动检测"),
531
+ agent_id: uuidSchema.optional().describe("已知时跳过自动检测"),
532
+ username: z.string().min(1).max(100).optional().describe("按用户名查找用户"),
533
+ platform: z.enum(["claude_web", "claude_desktop", "claude_code", "custom"]).optional().describe("客户端平台"),
534
+ },
535
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
536
+ }, async (params) => handleBootstrap(params));
537
+ logRegistered("levelup_bootstrap");
538
+ // ================================================================
539
+ // Tool: levelup_setup_wizard
540
+ // ================================================================
541
+ server.registerTool("levelup_setup_wizard", {
542
+ title: "设置向导",
543
+ description: `一次性引导,将已安装的 MCP 映射为智能体技能。
544
+
545
+ 读取已安装的 MCP 服务器,将其映射到 升级技能,
546
+ 并自动为智能体注册新技能。每个新技能奖励 20 经验值
547
+ (每天最多3个)。同时推荐智能体尚未安装的 MCP。
548
+
549
+ 参数:
550
+ - agent_id(uuid,必填):要设置的智能体。
551
+ - installed_mcps(string[],可选):MCP 名称,如 "gmail"、"github"、"slack"、"filesystem"。
552
+ - auto_register_skills(boolean,可选):是否自动注册匹配的技能(默认 true)。
553
+
554
+ 返回:
555
+ skills_registered、skills_already_had、xp_awarded 和 suggested_mcps。`,
556
+ inputSchema: {
557
+ agent_id: uuidSchema.describe("要设置的智能体"),
558
+ installed_mcps: z.array(z.string().min(1)).optional().describe('MCP 名称,如 "gmail"、"github"、"slack"'),
559
+ auto_register_skills: z.boolean().default(true).describe("自动注册匹配的技能"),
560
+ },
561
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
562
+ }, async (params) => handleSetupWizard(params));
563
+ logRegistered("levelup_setup_wizard");
564
+ }
565
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/tools/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAdminDispatcher(server: McpServer): void;
3
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1,50 @@
1
+ // ============================================================
2
+ // dispatchers/admin.ts — Admin tools dispatcher
3
+ // ============================================================
4
+ // Combines admin, growth plan, and achievement tools into one dispatcher.
5
+ // ============================================================
6
+ import { registerDispatcher } from "../../services/dispatcher.js";
7
+ import { createTaskTypeHandler, suggestTaskTypeHandler, createSkillHandler, createSplitRuleHandler, setXpConfigHandler, } from "../admin.js";
8
+ import { growthPlanHandlers } from "../growth-plan.js";
9
+ import { getAchievementsHandler, scanAchievementsHandler, } from "../achievements.js";
10
+ export function registerAdminDispatcher(server) {
11
+ registerDispatcher(server, "levelup_admin", "管理工具 — 创建任务类型、技能、经验值配置、成长计划、成就。部分操作需要 admin_secret。", {
12
+ create_task_type: {
13
+ description: "管理员:在目录中创建新任务类型",
14
+ handler: createTaskTypeHandler,
15
+ },
16
+ suggest_task_type: {
17
+ description: "为管理员审核提议新任务类型",
18
+ handler: suggestTaskTypeHandler,
19
+ },
20
+ create_skill: {
21
+ description: "管理员:创建带有升级规则的新技能",
22
+ handler: createSkillHandler,
23
+ },
24
+ create_split_rule: {
25
+ description: "管理员:创建新的经验值分配规则",
26
+ handler: createSplitRuleHandler,
27
+ },
28
+ set_config: {
29
+ description: "管理员:更新全局经验值配置值",
30
+ handler: setXpConfigHandler,
31
+ },
32
+ get_growth_plan: {
33
+ description: "生成达到目标段位/等级的优先行动列表",
34
+ handler: async (params) => growthPlanHandlers.gp(params),
35
+ },
36
+ browse_skillsets: {
37
+ description: "浏览任意能力类别推荐的MCP和技能",
38
+ handler: async (params) => growthPlanHandlers.bs(params),
39
+ },
40
+ get_achievements: {
41
+ description: "获取用户已获得的成就和徽章",
42
+ handler: getAchievementsHandler,
43
+ },
44
+ scan_achievements: {
45
+ description: "追溯扫描并补发未授予的成就",
46
+ handler: scanAchievementsHandler,
47
+ },
48
+ });
49
+ }
50
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/tools/dispatchers/admin.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gDAAgD;AAChD,+DAA+D;AAC/D,0EAA0E;AAC1E,+DAA+D;AAG/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,kBAAkB,CAChB,MAAM,EACN,eAAe,EACf,qDAAqD,EACrD;QACE,gBAAgB,EAAE;YAChB,WAAW,EAAE,iBAAiB;YAC9B,OAAO,EAAE,qBAAqB;SAC/B;QACD,iBAAiB,EAAE;YACjB,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,sBAAsB;SAChC;QACD,YAAY,EAAE;YACZ,WAAW,EAAE,kBAAkB;YAC/B,OAAO,EAAE,kBAAkB;SAC5B;QACD,iBAAiB,EAAE;YACjB,WAAW,EAAE,iBAAiB;YAC9B,OAAO,EAAE,sBAAsB;SAChC;QACD,UAAU,EAAE;YACV,WAAW,EAAE,gBAAgB;YAC7B,OAAO,EAAE,kBAAkB;SAC5B;QACD,eAAe,EAAE;YACf,WAAW,EAAE,oBAAoB;YACjC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,CAAC;SACzD;QACD,gBAAgB,EAAE;YAChB,WAAW,EAAE,mBAAmB;YAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,CAAC;SACzD;QACD,gBAAgB,EAAE;YAChB,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,sBAAsB;SAChC;QACD,iBAAiB,EAAE;YACjB,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,uBAAuB;SACjC;KACF,CACF,CAAC;AACJ,CAAC"}