You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.6 KiB
114 lines
3.6 KiB
import { z } from "zod";
|
|
import type { JSONSchema7 } from "json-schema";
|
|
import { dbGlobal } from "drizzle-pkg/lib/db";
|
|
import { users } from "drizzle-pkg/lib/schema/auth";
|
|
import { eq } from "drizzle-orm";
|
|
import type { ToolExecutor, ToolContext, ToolResult } from "../../registry";
|
|
import type { UserInfoToolConfig } from "./config";
|
|
|
|
export const userInfoInputSchema = z.object({}).describe("无需参数,自动获取当前登录用户信息");
|
|
|
|
type UserInfoInput = z.infer<typeof userInfoInputSchema>;
|
|
|
|
export const userInfoExecutor: ToolExecutor<UserInfoToolConfig> = {
|
|
buildInputSchema(_config: UserInfoToolConfig): JSONSchema7 {
|
|
return {
|
|
type: "object",
|
|
properties: {},
|
|
description: "无需参数,自动根据当前会话获取用户信息",
|
|
};
|
|
},
|
|
|
|
buildDescription(config: UserInfoToolConfig): string {
|
|
const fields: string[] = [];
|
|
if (config.includeEmail) fields.push("邮箱");
|
|
if (config.includeAvatar) fields.push("头像");
|
|
if (config.includeRole) fields.push("角色");
|
|
if (config.includeStatus) fields.push("状态");
|
|
if (config.includeCreatedAt) fields.push("注册时间");
|
|
const fieldDesc = fields.length > 0 ? fields.join("、") : "基本信息";
|
|
return `获取当前登录用户信息(含${fieldDesc})。无需传入参数,自动从会话上下文中识别当前用户。`;
|
|
},
|
|
|
|
async execute(
|
|
input: unknown,
|
|
config: UserInfoToolConfig,
|
|
ctx: ToolContext,
|
|
): Promise<ToolResult> {
|
|
const start = Date.now();
|
|
|
|
const parsed = userInfoInputSchema.safeParse(input);
|
|
if (!parsed.success) {
|
|
return {
|
|
success: false,
|
|
data: null,
|
|
error: `输入参数校验失败: ${parsed.error.message}`,
|
|
metadata: { durationMs: Date.now() - start },
|
|
};
|
|
}
|
|
|
|
if (ctx.userId === null || ctx.userId === undefined) {
|
|
return {
|
|
success: false,
|
|
data: null,
|
|
error: "无法识别当前用户:会话上下文中缺少 userId。该工具需要在登录会话中调用。",
|
|
metadata: { durationMs: Date.now() - start },
|
|
};
|
|
}
|
|
|
|
try {
|
|
const rows = await dbGlobal
|
|
.select({
|
|
id: users.id,
|
|
username: users.username,
|
|
email: users.email,
|
|
nickname: users.nickname,
|
|
avatar: users.avatar,
|
|
role: users.role,
|
|
status: users.status,
|
|
createdAt: users.createdAt,
|
|
})
|
|
.from(users)
|
|
.where(eq(users.id, ctx.userId))
|
|
.limit(1);
|
|
|
|
const user = rows[0];
|
|
if (!user) {
|
|
return {
|
|
success: false,
|
|
data: null,
|
|
error: `未找到用户 (id=${ctx.userId})`,
|
|
metadata: { durationMs: Date.now() - start },
|
|
};
|
|
}
|
|
|
|
const data: Record<string, unknown> = {
|
|
id: user.id,
|
|
username: user.username,
|
|
nickname: user.nickname ?? null,
|
|
};
|
|
if (config.includeEmail) data.email = user.email ?? null;
|
|
if (config.includeAvatar) data.avatar = user.avatar ?? null;
|
|
if (config.includeRole) data.role = user.role;
|
|
if (config.includeStatus) data.status = user.status;
|
|
if (config.includeCreatedAt) {
|
|
data.createdAt = user.createdAt
|
|
? new Date(user.createdAt).toISOString()
|
|
: null;
|
|
}
|
|
|
|
return {
|
|
success: true,
|
|
data,
|
|
metadata: { durationMs: Date.now() - start },
|
|
};
|
|
} catch (e) {
|
|
return {
|
|
success: false,
|
|
data: null,
|
|
error: e instanceof Error ? e.message : String(e),
|
|
metadata: { durationMs: Date.now() - start },
|
|
};
|
|
}
|
|
},
|
|
};
|
|
|