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,605 @@
1
+ // ============================================================
2
+ // tools/system.ts — Section 13: System (3 tools)
3
+ // ============================================================
4
+ // Background operations that can be manually triggered.
5
+ // Also defines 3 Supabase cron jobs (documented, not implemented here).
6
+ // ============================================================
7
+ import { z } from "zod";
8
+ import { supabase } from "../services/supabase.js";
9
+ import { ok, fail, handleSupabaseError } from "../services/errors.js";
10
+ import { toMcpResponse, logRegistered } from "../services/register.js";
11
+ import { uuidSchema, entityTypeSchema } from "../schemas/common.js";
12
+ import { formatRankDisplay } from "../services/format.js";
13
+ import { verifyOwnership } from "../services/ownership.js";
14
+ // ── Exported handlers for dispatcher ─────────────────────────
15
+ export async function handleProcessMetrics(params) {
16
+ const batchSize = params.batch_size || 100;
17
+ const agentId = params.agent_id;
18
+ // Fetch unprocessed entries
19
+ let query = supabase
20
+ .from("metrics_log")
21
+ .select("*")
22
+ .eq("processed", false)
23
+ .order("created_at", { ascending: true })
24
+ .limit(batchSize);
25
+ if (agentId)
26
+ query = query.eq("agent_id", agentId);
27
+ const { data: entries, error } = await query;
28
+ if (error)
29
+ return toMcpResponse(handleSupabaseError(error, "process_metrics"));
30
+ let rowsProcessed = 0;
31
+ let skillsUpdated = 0;
32
+ const proficiencyChanges = [];
33
+ for (const entry of entries || []) {
34
+ // If entry has a skill_id, update usage count
35
+ if (entry.agent_id && entry.skill_id) {
36
+ const { data: agentSkill } = await supabase
37
+ .from("agent_skills")
38
+ .select("id, proficiency_level, usage_count")
39
+ .eq("agent_id", entry.agent_id)
40
+ .eq("skill_id", entry.skill_id)
41
+ .maybeSingle();
42
+ if (agentSkill) {
43
+ // Extract usage count from metrics (flexible schema)
44
+ const metrics = entry.metrics;
45
+ const usageDelta = typeof metrics.usage_count === "number" ? metrics.usage_count : 1;
46
+ const newUsageCount = agentSkill.usage_count + usageDelta;
47
+ await supabase.rpc('update_agent_skill_secure', {
48
+ p_agent_skill_id: agentSkill.id,
49
+ p_usage_count: newUsageCount,
50
+ p_last_used_at: new Date().toISOString(),
51
+ });
52
+ skillsUpdated++;
53
+ // Check if usage count triggers a proficiency level-up
54
+ const nextLevel = agentSkill.proficiency_level + 1;
55
+ const { data: rule } = await supabase
56
+ .from("skill_leveling_rules")
57
+ .select("usage_requirements")
58
+ .eq("skill_id", entry.skill_id)
59
+ .eq("proficiency_level", nextLevel)
60
+ .maybeSingle();
61
+ if (rule) {
62
+ const usageReqs = rule.usage_requirements;
63
+ const tasksNeeded = usageReqs?.tasks_completed || 0;
64
+ if (tasksNeeded > 0 && newUsageCount >= tasksNeeded) {
65
+ // Level up the skill via RPC
66
+ await supabase.rpc('update_agent_skill_secure', {
67
+ p_agent_skill_id: agentSkill.id,
68
+ p_proficiency_level: nextLevel,
69
+ });
70
+ proficiencyChanges.push({
71
+ agent_id: entry.agent_id,
72
+ skill_id: entry.skill_id,
73
+ old_level: agentSkill.proficiency_level,
74
+ new_level: nextLevel,
75
+ });
76
+ }
77
+ }
78
+ }
79
+ }
80
+ // Mark as processed
81
+ // TODO: Replace with RPC once a metrics_log update RPC is created.
82
+ // Direct update retained because no mark_metrics_processed_secure RPC exists yet.
83
+ await supabase.from("metrics_log")
84
+ .update({ processed: true, processed_at: new Date().toISOString() })
85
+ .eq("id", entry.id);
86
+ rowsProcessed++;
87
+ }
88
+ return toMcpResponse(ok({
89
+ rows_processed: rowsProcessed,
90
+ skills_updated: skillsUpdated,
91
+ proficiency_changes: proficiencyChanges,
92
+ batch_size: batchSize,
93
+ }));
94
+ }
95
+ export async function handleSnapshotAgent(params) {
96
+ const agentId = params.agent_id;
97
+ const reason = params.reason || "manual";
98
+ // Get all agent skills
99
+ const { data: skills, error: skillError } = await supabase
100
+ .from("agent_skills")
101
+ .select("skill_id, proficiency_level, usage_count, last_used_at")
102
+ .eq("agent_id", agentId);
103
+ if (skillError)
104
+ return toMcpResponse(handleSupabaseError(skillError, "snapshot_agent"));
105
+ // Get agent info
106
+ const { data: agent } = await supabase
107
+ .from("agents").select("level, xp, integrity_score").eq("id", agentId).single();
108
+ const snapshotData = {
109
+ level: agent?.level,
110
+ xp: agent?.xp,
111
+ integrity_score: agent?.integrity_score,
112
+ skills: skills || [],
113
+ timestamp: new Date().toISOString(),
114
+ };
115
+ const { data: snapshot, error } = await supabase.rpc('snapshot_agent_secure', {
116
+ p_agent_id: agentId,
117
+ p_snapshot_data: snapshotData,
118
+ p_reason: reason,
119
+ });
120
+ if (error)
121
+ return toMcpResponse(handleSupabaseError(error, "snapshot_agent"));
122
+ return toMcpResponse(ok({
123
+ snapshot_id: snapshot.id,
124
+ agent_id: agentId,
125
+ reason: reason,
126
+ skills_captured: (skills || []).length,
127
+ agent_level: agent?.level,
128
+ agent_xp: agent?.xp,
129
+ }));
130
+ }
131
+ export async function handleCheckLevelUp(params) {
132
+ const callerUserId = params.caller_user_id;
133
+ const entityType = params.entity_type;
134
+ const entityId = params.entity_id;
135
+ // Ownership check
136
+ const denied = await verifyOwnership({
137
+ caller_user_id: callerUserId,
138
+ target_user_id: entityType === "user" ? entityId : undefined,
139
+ target_agent_id: entityType === "agent" ? entityId : undefined,
140
+ });
141
+ if (denied)
142
+ return denied;
143
+ // --- BUG 2 FIX: Enforce star timegate / rank promotion cooldown ---
144
+ // Use correct config key based on entity type
145
+ const cooldownKey = entityType === "agent" ? "agent_star_cooldown_hours" : "user_star_cooldown_hours";
146
+ const promoKey = entityType === "agent" ? "agent_tier_promotion_days" : "user_tier_promotion_days";
147
+ const { data: cooldownCfg } = await supabase
148
+ .from("xp_config").select("config_value")
149
+ .eq("config_key", cooldownKey).maybeSingle();
150
+ const { data: promoCfg } = await supabase
151
+ .from("xp_config").select("config_value")
152
+ .eq("config_key", promoKey).maybeSingle();
153
+ // Get current level and last level-up timestamp
154
+ let currentLevel = 1;
155
+ let lastLeveledAt = null;
156
+ if (entityType === "user") {
157
+ const { data: user } = await supabase
158
+ .from("users").select("main_level, last_leveled_at")
159
+ .eq("id", entityId).single();
160
+ if (user) {
161
+ currentLevel = user.main_level;
162
+ lastLeveledAt = user.last_leveled_at || null;
163
+ }
164
+ }
165
+ else {
166
+ const { data: agent } = await supabase
167
+ .from("agents").select("level, last_leveled_at")
168
+ .eq("id", entityId).single();
169
+ if (agent) {
170
+ currentLevel = agent.level;
171
+ lastLeveledAt = agent.last_leveled_at || null;
172
+ }
173
+ }
174
+ // Look up current rank
175
+ const { data: rank } = await supabase
176
+ .from("rank_definitions")
177
+ .select("rank_letter, min_level, max_level")
178
+ .eq("entity_type", entityType).eq("locale", "zh")
179
+ .lte("min_level", currentLevel).gte("max_level", currentLevel)
180
+ .maybeSingle();
181
+ const rankLetter = rank?.rank_letter || "E";
182
+ // Star cooldown check (within same rank)
183
+ if (lastLeveledAt && cooldownCfg?.config_value) {
184
+ const cooldowns = cooldownCfg.config_value;
185
+ const cooldownHours = cooldowns[rankLetter] || 0;
186
+ if (cooldownHours > 0) {
187
+ const elapsed = Date.now() - new Date(lastLeveledAt).getTime();
188
+ const cooldownMs = cooldownHours * 3600_000;
189
+ if (elapsed < cooldownMs) {
190
+ const remainingHours = Math.ceil((cooldownMs - elapsed) / 3600_000);
191
+ return toMcpResponse(ok({
192
+ entity_type: entityType, entity_id: entityId,
193
+ previous_level: currentLevel, new_level: currentLevel,
194
+ leveled_up: false, levels_gained: 0,
195
+ cooldown_blocked: true, cooldown_remaining_hours: remainingHours,
196
+ message: `段位 ${rankLetter} 的星级冷却中。剩余 ${remainingHours} 小时。`,
197
+ }));
198
+ }
199
+ }
200
+ }
201
+ // Rank promotion cooldown (when at top of current rank)
202
+ if (lastLeveledAt && promoCfg?.config_value && rank) {
203
+ if (currentLevel === rank.max_level) {
204
+ const promoDays = promoCfg.config_value[rankLetter] || 0;
205
+ if (promoDays > 0) {
206
+ const elapsed = Date.now() - new Date(lastLeveledAt).getTime();
207
+ const promoMs = promoDays * 86400_000;
208
+ if (elapsed < promoMs) {
209
+ const remainingDays = Math.ceil((promoMs - elapsed) / 86400_000);
210
+ return toMcpResponse(ok({
211
+ entity_type: entityType, entity_id: entityId,
212
+ previous_level: currentLevel, new_level: currentLevel,
213
+ leveled_up: false, levels_gained: 0,
214
+ cooldown_blocked: true, promotion_cooldown_remaining_days: remainingDays,
215
+ message: `段位 ${rankLetter} 晋升冷却中。剩余 ${remainingDays} 天。`,
216
+ }));
217
+ }
218
+ }
219
+ }
220
+ }
221
+ // --- Calculate skill discount for agents ---
222
+ let skillDiscountPct = 0;
223
+ if (entityType === "agent") {
224
+ const nextLevel = currentLevel + 1;
225
+ // Get level requirements with skill discounts
226
+ const { data: req } = await supabase
227
+ .from("level_requirements")
228
+ .select("id")
229
+ .eq("level", nextLevel)
230
+ .maybeSingle();
231
+ if (req) {
232
+ // Get skill-based discounts for this level
233
+ const { data: skillDiscounts } = await supabase
234
+ .from("level_req_skills")
235
+ .select("skill_id, min_proficiency, xp_discount_pct")
236
+ .eq("level_requirement_id", req.id);
237
+ if (skillDiscounts && skillDiscounts.length > 0) {
238
+ // Check which discounts the agent qualifies for
239
+ const { data: agentSkills } = await supabase
240
+ .from("agent_skills")
241
+ .select("skill_id, proficiency_level")
242
+ .eq("agent_id", entityId);
243
+ const agentSkillMap = new Map((agentSkills || []).map((s) => [s.skill_id, s.proficiency_level]));
244
+ for (const sd of skillDiscounts) {
245
+ const proficiency = agentSkillMap.get(sd.skill_id) || 0;
246
+ if (proficiency >= sd.min_proficiency) {
247
+ skillDiscountPct += sd.xp_discount_pct;
248
+ }
249
+ }
250
+ }
251
+ }
252
+ }
253
+ // Timegate passed — call the RPC
254
+ const { data, error } = await supabase.rpc('check_and_apply_level_up', {
255
+ p_entity_type: entityType,
256
+ p_entity_id: entityId,
257
+ });
258
+ if (error)
259
+ return toMcpResponse(handleSupabaseError(error, "check_level_up"));
260
+ if (!data?.success)
261
+ return toMcpResponse(fail(data?.error || "升级检查失败"));
262
+ // Record level-up timestamp for future cooldown checks via RPC
263
+ if (data.leveled_up) {
264
+ await supabase.rpc('record_level_up_timestamp', {
265
+ p_entity_type: entityType,
266
+ p_entity_id: entityId,
267
+ });
268
+ }
269
+ // Auto-trigger achievements on level-up
270
+ const achievementsEarned = [];
271
+ if (data.leveled_up) {
272
+ const achievementChecks = [
273
+ { level: 5, key: "reach_level_5", name: "Rising Star" },
274
+ { level: 10, key: "reach_level_10", name: "Proven Performer" },
275
+ { level: 15, key: "reach_level_15", name: "Veteran" },
276
+ { level: 20, key: "reach_level_20", name: "Elite" },
277
+ { level: 25, key: "reach_level_25", name: "Transcendent" },
278
+ { level: 30, key: "reach_level_30", name: "Celestial" },
279
+ ];
280
+ for (const check of achievementChecks) {
281
+ if (data.new_level >= check.level && data.previous_level < check.level) {
282
+ const { error: achError } = await supabase.rpc('grant_achievement', {
283
+ p_user_id: entityType === "user" ? entityId : null,
284
+ p_achievement_key: check.key,
285
+ });
286
+ if (!achError) {
287
+ achievementsEarned.push({ key: check.key, name: check.name });
288
+ }
289
+ }
290
+ }
291
+ // Rank-change achievements
292
+ if (data.rank_changed) {
293
+ const rankAchievements = {
294
+ "D": { key: "reach_rank_d", name: "Rank D Achieved" },
295
+ "C": { key: "reach_rank_c", name: "Rank C Achieved" },
296
+ "B": { key: "reach_rank_b", name: "Rank B Achieved" },
297
+ "A": { key: "reach_rank_a", name: "Rank A Achieved" },
298
+ "S": { key: "reach_rank_s", name: "Rank S Achieved" },
299
+ };
300
+ const newRankLetter = data.new_rank?.rank_letter;
301
+ if (newRankLetter && rankAchievements[newRankLetter]) {
302
+ const rankAch = rankAchievements[newRankLetter];
303
+ const { error: achError } = await supabase.rpc('grant_achievement', {
304
+ p_user_id: entityType === "user" ? entityId : null,
305
+ p_achievement_key: rankAch.key,
306
+ });
307
+ if (!achError) {
308
+ achievementsEarned.push(rankAch);
309
+ }
310
+ }
311
+ }
312
+ }
313
+ // Look up rank info for stars display
314
+ const newLevel = data.new_level || data.previous_level;
315
+ const { data: rankDef } = await supabase
316
+ .from("rank_definitions")
317
+ .select("rank_name, rank_letter, min_level, max_level")
318
+ .eq("entity_type", entityType)
319
+ .eq("locale", "zh")
320
+ .lte("min_level", newLevel)
321
+ .gte("max_level", newLevel)
322
+ .maybeSingle();
323
+ const rankInfo = formatRankDisplay(newLevel, rankDef?.rank_letter || null, rankDef?.rank_name || null, rankDef?.min_level || 1, rankDef?.max_level || 5);
324
+ return toMcpResponse(ok({
325
+ entity_type: data.entity_type,
326
+ entity_id: data.entity_id,
327
+ previous_level: data.previous_level,
328
+ new_level: data.new_level,
329
+ leveled_up: data.leveled_up,
330
+ levels_gained: data.levels_gained,
331
+ current_xp: data.current_xp,
332
+ skill_discount_pct: skillDiscountPct,
333
+ previous_rank: data.previous_rank,
334
+ new_rank: data.new_rank,
335
+ rank_changed: data.rank_changed,
336
+ rank_display: rankInfo.rank_display,
337
+ stars: rankInfo.stars,
338
+ stars_earned: rankInfo.stars_earned,
339
+ stars_total: rankInfo.stars_total,
340
+ achievements_earned: achievementsEarned,
341
+ }));
342
+ }
343
+ export async function handleWhoami(params) {
344
+ const identityProvider = params.identity_provider;
345
+ const identityId = params.identity_id;
346
+ const username = params.username;
347
+ let userId = null;
348
+ let agentId = null;
349
+ // Priority 1: Environment variables
350
+ const envUserId = process.env.LEVELUP_USER_ID;
351
+ const envAgentId = process.env.LEVELUP_AGENT_ID;
352
+ if (envUserId)
353
+ userId = envUserId;
354
+ if (envAgentId)
355
+ agentId = envAgentId;
356
+ // Priority 2: Identity provider lookup
357
+ if (!userId && identityProvider && identityId) {
358
+ const { data: identity } = await supabase
359
+ .from("user_identities")
360
+ .select("user_id")
361
+ .eq("provider", identityProvider)
362
+ .eq("provider_id", identityId)
363
+ .maybeSingle();
364
+ if (identity)
365
+ userId = identity.user_id;
366
+ }
367
+ // Priority 3: Username lookup
368
+ if (!userId && username) {
369
+ const { data: userByName } = await supabase
370
+ .from("users")
371
+ .select("id")
372
+ .eq("username", username)
373
+ .maybeSingle();
374
+ if (userByName)
375
+ userId = userByName.id;
376
+ }
377
+ // Priority 4: Find most recently created user (single-user fallback)
378
+ // This works for personal setups where only one user exists
379
+ if (!userId) {
380
+ const { data: recentUser } = await supabase
381
+ .from("users")
382
+ .select("id")
383
+ .order("created_at", { ascending: false })
384
+ .limit(1)
385
+ .maybeSingle();
386
+ if (recentUser)
387
+ userId = recentUser.id;
388
+ }
389
+ // No identity found at all
390
+ if (!userId) {
391
+ return toMcpResponse(ok({
392
+ identified: false,
393
+ message: "未找到 升级用户。请使用 levelup_register_user 注册以开始使用。",
394
+ setup_tip: "注册后,将 LEVELUP_USER_ID 和 LEVELUP_AGENT_ID 添加到MCP配置的环境变量中,以实现每次对话的自动身份识别。",
395
+ }));
396
+ }
397
+ // Fetch user profile
398
+ const { data: user, error: userError } = await supabase
399
+ .from("users")
400
+ .select("id, username, handle, profile_code, main_level, main_xp, created_at")
401
+ .eq("id", userId)
402
+ .single();
403
+ if (userError)
404
+ return toMcpResponse(handleSupabaseError(userError, "whoami"));
405
+ // Fetch user rank
406
+ const { data: userRank } = await supabase
407
+ .from("rank_definitions")
408
+ .select("rank_name, rank_letter, min_level, max_level")
409
+ .eq("entity_type", "user")
410
+ .eq("locale", "zh")
411
+ .lte("min_level", user.main_level)
412
+ .gte("max_level", user.main_level)
413
+ .maybeSingle();
414
+ const userRankInfo = formatRankDisplay(user.main_level, userRank?.rank_letter || null, userRank?.rank_name || null, userRank?.min_level || 1, userRank?.max_level || 5);
415
+ // If no agent ID from env, find the user's primary agent
416
+ if (!agentId) {
417
+ const { data: agents } = await supabase
418
+ .from("agents")
419
+ .select("id")
420
+ .eq("owner_user_id", userId)
421
+ .eq("status", "active")
422
+ .order("created_at", { ascending: true })
423
+ .limit(1);
424
+ if (agents && agents.length > 0)
425
+ agentId = agents[0].id;
426
+ }
427
+ // Fetch agent profile if found
428
+ let agentProfile = null;
429
+ if (agentId) {
430
+ const { data: agent } = await supabase
431
+ .from("agents")
432
+ .select("id, name, level, xp, integrity_score, platform, status")
433
+ .eq("id", agentId)
434
+ .maybeSingle();
435
+ if (agent) {
436
+ const { data: agentRank } = await supabase
437
+ .from("rank_definitions")
438
+ .select("rank_name, rank_letter, min_level, max_level")
439
+ .eq("entity_type", "agent")
440
+ .eq("locale", "zh")
441
+ .lte("min_level", agent.level)
442
+ .gte("max_level", agent.level)
443
+ .maybeSingle();
444
+ const agentRankInfo = formatRankDisplay(agent.level, agentRank?.rank_letter || null, agentRank?.rank_name || null, agentRank?.min_level || 1, agentRank?.max_level || 5);
445
+ // Get skill count
446
+ const { count: skillCount } = await supabase
447
+ .from("agent_skills").select("id", { count: "exact", head: true })
448
+ .eq("agent_id", agentId);
449
+ agentProfile = {
450
+ agent_id: agent.id,
451
+ name: agent.name,
452
+ level: agent.level,
453
+ xp: agent.xp,
454
+ rank_display: agentRankInfo.rank_display,
455
+ stars: agentRankInfo.stars,
456
+ integrity_score: agent.integrity_score,
457
+ platform: agent.platform,
458
+ skills_count: skillCount || 0,
459
+ status: agent.status,
460
+ };
461
+ }
462
+ }
463
+ // Get recent task count
464
+ const { count: recentTasks } = await supabase
465
+ .from("tasks").select("id", { count: "exact", head: true })
466
+ .or(`user_id.eq.${userId},agent_id.eq.${agentId || "00000000-0000-0000-0000-000000000000"}`)
467
+ .eq("status", "completed")
468
+ .gte("completed_at", new Date(Date.now() - 7 * 86400_000).toISOString());
469
+ return toMcpResponse(ok({
470
+ identified: true,
471
+ user: {
472
+ user_id: user.id,
473
+ username: user.username,
474
+ handle: user.handle,
475
+ profile_code: user.profile_code,
476
+ level: user.main_level,
477
+ xp: user.main_xp,
478
+ rank_display: userRankInfo.rank_display,
479
+ stars: userRankInfo.stars,
480
+ member_since: user.created_at,
481
+ },
482
+ agent: agentProfile,
483
+ session: {
484
+ tasks_completed_this_week: recentTasks || 0,
485
+ tip: agentProfile
486
+ ? "使用 levelup_browse_skillsets 发现新技能,或使用 levelup_get_growth_plan 规划下一次升级。"
487
+ : "未找到智能体。请使用 levelup_register_agent 注册一个智能体以开始获取经验值。",
488
+ },
489
+ }));
490
+ }
491
+ // ── Tool registration (backward compat) ──────────────────────
492
+ export function registerSystemTools(server) {
493
+ console.error("\n📋 Section 13: System");
494
+ // ================================================================
495
+ // Tool 67: levelup_process_metrics
496
+ // ================================================================
497
+ server.registerTool("levelup_process_metrics", {
498
+ title: "处理指标",
499
+ description: `将未处理的 metrics_log 条目转化为技能熟练度更新和经验值。
500
+
501
+ 读取平台的原始指标,根据 skill_leveling_rules 更新 agent_skills 使用次数和
502
+ 熟练度等级。
503
+
504
+ 参数:
505
+ - batch_size (integer, 可选): 处理的条目数(默认 100)。
506
+ - agent_id (uuid, 可选): 仅处理此智能体的指标。
507
+
508
+ 返回:
509
+ 已处理行数、已更新技能数、熟练度变化。`,
510
+ inputSchema: {
511
+ batch_size: z.number().int().min(1).max(1000).default(100).describe("Entries to process"),
512
+ agent_id: uuidSchema.optional().describe("Process specific agent only"),
513
+ },
514
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
515
+ }, async (params) => handleProcessMetrics(params));
516
+ logRegistered("levelup_process_metrics");
517
+ // ================================================================
518
+ // Tool 68: levelup_snapshot_agent
519
+ // ================================================================
520
+ server.registerTool("levelup_snapshot_agent", {
521
+ title: "快照智能体",
522
+ description: `创建智能体技能和熟练度等级的时间点快照。
523
+
524
+ 用于转移前(区块链阶段)、定期历史记录或手动操作。
525
+
526
+ 参数:
527
+ - agent_id (uuid): 哪个智能体。
528
+ - reason (string, 可选): "pre_transfer"、"periodic"、"manual"(默认: "manual")。
529
+
530
+ 返回:
531
+ 包含所有当前熟练度等级的快照。`,
532
+ inputSchema: {
533
+ agent_id: uuidSchema.describe("The agent"),
534
+ reason: z.enum(["pre_transfer", "periodic", "manual"]).default("manual").describe("Reason for snapshot"),
535
+ },
536
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
537
+ }, async (params) => handleSnapshotAgent(params));
538
+ logRegistered("levelup_snapshot_agent");
539
+ // ================================================================
540
+ // Tool 69: levelup_check_level_up
541
+ // ================================================================
542
+ server.registerTool("levelup_check_level_up", {
543
+ title: "检查升级",
544
+ description: `检查用户或智能体是否有足够的经验值升级,如果满足则执行升级。
545
+
546
+ 对于智能体,还会检查基于技能的经验值折扣(降低经验值门槛)。
547
+ 升级后触发成就检查。
548
+
549
+ 参数:
550
+ - entity_type (string): "user" 或 "agent"。
551
+ - entity_id (uuid): 哪个用户或智能体。
552
+
553
+ 返回:
554
+ 之前等级、新等级(如有变化)、段位名称、解锁内容、获得的成就。`,
555
+ inputSchema: {
556
+ caller_user_id: uuidSchema.describe("Your user ID (ownership verification)"),
557
+ entity_type: entityTypeSchema,
558
+ entity_id: uuidSchema.describe("User or agent ID"),
559
+ },
560
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
561
+ }, async (params) => handleCheckLevelUp(params));
562
+ logRegistered("levelup_check_level_up");
563
+ // ---- Supabase Cron Jobs (documented, not implemented in MCP) ----
564
+ // These run directly in Supabase via pg_cron:
565
+ //
566
+ // 1. update_tdi — Daily 3am: Recalculate Task Difficulty Index
567
+ // UPDATE task_difficulty_index SET confidence = CASE WHEN task_count >= 100 THEN 'high' ...
568
+ //
569
+ // 2. update_integrity_scores — Daily 4am: Batch recalculate agent integrity
570
+ // Based on agent_integrity_log events
571
+ //
572
+ // 3. cleanup_expired — Hourly: Delete expired OTPs, link codes, old metrics
573
+ // DELETE FROM otp_codes WHERE expires_at < now();
574
+ // DELETE FROM link_codes WHERE expires_at < now() AND redeemed = false;
575
+ // ================================================================
576
+ // Tool 70: levelup_whoami
577
+ // ================================================================
578
+ server.registerTool("levelup_whoami", {
579
+ title: "我是谁",
580
+ description: `识别当前用户和智能体。在用户询问
581
+ "我是谁"、"我的资料"、"我的数据"、"我的等级"时调用,
582
+ 或在对话开始时建立身份。
583
+
584
+ 自动从环境变量、身份提供商、用户名或
585
+ 最近活跃的用户检测身份。大多数设置无需参数。
586
+
587
+ 参数(全部可选 — 省略以自动检测):
588
+ - identity_provider (string): 如 "claude"、"github"
589
+ - identity_id (string): 提供商特定ID
590
+ - username (string): 要查找的用户名
591
+
592
+ 返回:
593
+ 用户资料、智能体资料、段位、等级、经验值和会话上下文。`,
594
+ inputSchema: {
595
+ identity_provider: z.string().optional().describe("Identity provider (e.g. claude, github)"),
596
+ identity_id: z.string().optional().describe("Provider-specific identity ID"),
597
+ username: z.string().optional().describe("Username to look up"),
598
+ },
599
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
600
+ }, async (params) => handleWhoami(params));
601
+ logRegistered("levelup_whoami");
602
+ console.error(` → 4 of 4 system tools registered ✅`);
603
+ console.error(` ℹ️ 3 cron jobs documented (run in Supabase pg_cron)`);
604
+ }
605
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"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"}