From ead76185b7d512887b3a1b7baa391a3377689f67 Mon Sep 17 00:00:00 2001 From: Huarch Date: Sat, 13 Jun 2026 11:15:59 +0800 Subject: [PATCH] refactor(agent): normalize API naming --- .opencode/tools/skill_manager.ts | 6 +++++- .opencode/tools/web_search.ts | 4 ++-- src/routes/chat.ts | 16 ++++++++-------- src/routes/chatAuxiliaryRoutes.ts | 4 ++-- src/routes/chatInteractionRoutes.ts | 12 ++++++------ src/server.ts | 18 ++++++++++++++++-- 6 files changed, 39 insertions(+), 21 deletions(-) diff --git a/.opencode/tools/skill_manager.ts b/.opencode/tools/skill_manager.ts index 740e902..82cc8e7 100644 --- a/.opencode/tools/skill_manager.ts +++ b/.opencode/tools/skill_manager.ts @@ -100,7 +100,11 @@ export const createSkillManagerTool = ( kind: "skill", decision: "accepted", detail: "skill listed", - ...result, + references: result.references, + scripts: result.scripts, + skill_path: result.skillPath, + target: result.target, + patterns: result.patterns, }); } diff --git a/.opencode/tools/web_search.ts b/.opencode/tools/web_search.ts index 98a1729..fd64c2a 100644 --- a/.opencode/tools/web_search.ts +++ b/.opencode/tools/web_search.ts @@ -13,9 +13,9 @@ export default tool({ .describe("Why web search is required for the current user request."), query: tool.schema.string().describe("Search query text."), freshness: tool.schema - .enum(["noLimit", "oneDay", "oneWeek", "oneMonth", "oneYear"]) + .enum(["no_limit", "one_day", "one_week", "one_month", "one_year"]) .optional() - .describe("Optional freshness filter. Defaults to noLimit."), + .describe("Optional freshness filter. Defaults to no_limit."), summary: tool.schema .boolean() .optional() diff --git a/src/routes/chat.ts b/src/routes/chat.ts index 9ddc9a0..a6ddeb9 100644 --- a/src/routes/chat.ts +++ b/src/routes/chat.ts @@ -194,8 +194,8 @@ export const buildChatRouter = ( }); }); - chatRouter.get("/session/:sessionId", async (req, res) => { - const sessionId = req.params.sessionId?.trim(); + chatRouter.get("/session/:session_id", async (req, res) => { + const sessionId = req.params.session_id?.trim(); const authContext = getAgentAuthContext(req); const projectId = authContext.projectId; const userId = authContext.userId; @@ -238,8 +238,8 @@ export const buildChatRouter = ( }); }); - chatRouter.get("/session/:sessionId/stream", async (req, res) => { - const sessionId = req.params.sessionId?.trim(); + chatRouter.get("/session/:session_id/stream", async (req, res) => { + const sessionId = req.params.session_id?.trim(); const authContext = getAgentAuthContext(req); const projectId = authContext.projectId; const userId = authContext.userId; @@ -303,8 +303,8 @@ export const buildChatRouter = ( res.on("close", cleanup); }); - chatRouter.patch("/session/:sessionId/title", async (req, res) => { - const sessionId = req.params.sessionId?.trim(); + chatRouter.patch("/session/:session_id/title", async (req, res) => { + const sessionId = req.params.session_id?.trim(); const title = typeof req.body?.title === "string" ? req.body.title.trim() : ""; const isTitleManuallyEdited = @@ -349,8 +349,8 @@ export const buildChatRouter = ( }); }); - chatRouter.delete("/session/:sessionId", async (req, res) => { - const sessionId = req.params.sessionId?.trim(); + chatRouter.delete("/session/:session_id", async (req, res) => { + const sessionId = req.params.session_id?.trim(); const authContext = getAgentAuthContext(req); const projectId = authContext.projectId; const userId = authContext.userId; diff --git a/src/routes/chatAuxiliaryRoutes.ts b/src/routes/chatAuxiliaryRoutes.ts index 1eb4595..2411c0b 100644 --- a/src/routes/chatAuxiliaryRoutes.ts +++ b/src/routes/chatAuxiliaryRoutes.ts @@ -45,8 +45,8 @@ export const registerChatAuxiliaryRoutes = ( sessionUiStateStore, }: RegisterAuxiliaryRoutesOptions, ) => { - chatRouter.get("/render-ref/:renderRef", async (req, res) => { - const renderRef = req.params.renderRef?.trim(); + chatRouter.get("/render-ref/:render_ref", async (req, res) => { + const renderRef = req.params.render_ref?.trim(); const authContext = getAgentAuthContext(req); const userId = authContext.userId; const projectId = authContext.projectId; diff --git a/src/routes/chatInteractionRoutes.ts b/src/routes/chatInteractionRoutes.ts index 239455f..b5b95fe 100644 --- a/src/routes/chatInteractionRoutes.ts +++ b/src/routes/chatInteractionRoutes.ts @@ -49,8 +49,8 @@ export const registerChatInteractionRoutes = ( sessionUiStateStore, }: RegisterInteractionRoutesOptions, ) => { - chatRouter.post("/permission/:requestId/reply", async (req, res) => { - const requestId = req.params.requestId?.trim(); + chatRouter.post("/permission/:request_id/reply", async (req, res) => { + const requestId = req.params.request_id?.trim(); const parsed = permissionReplyPayloadSchema.safeParse(req.body); if (!requestId) { res.status(400).json({ message: "request_id is required" }); @@ -174,8 +174,8 @@ export const registerChatInteractionRoutes = ( } }); - chatRouter.post("/question/:requestId/reply", async (req, res) => { - const requestId = req.params.requestId?.trim(); + chatRouter.post("/question/:request_id/reply", async (req, res) => { + const requestId = req.params.request_id?.trim(); const parsed = questionReplyPayloadSchema.safeParse(req.body); if (!requestId) { res.status(400).json({ message: "request_id is required" }); @@ -306,8 +306,8 @@ export const registerChatInteractionRoutes = ( } }); - chatRouter.post("/question/:requestId/reject", async (req, res) => { - const requestId = req.params.requestId?.trim(); + chatRouter.post("/question/:request_id/reject", async (req, res) => { + const requestId = req.params.request_id?.trim(); const parsed = questionRejectPayloadSchema.safeParse(req.body); if (!requestId) { res.status(400).json({ message: "request_id is required" }); diff --git a/src/server.ts b/src/server.ts index d92ef1c..8827c8d 100644 --- a/src/server.ts +++ b/src/server.ts @@ -314,6 +314,21 @@ const parseStringArray = (value: unknown) => ? value.filter((item): item is string => typeof item === "string") : undefined; +const webSearchFreshnessMap: Record = { + no_limit: "noLimit", + one_day: "oneDay", + one_week: "oneWeek", + one_month: "oneMonth", + one_year: "oneYear", +}; + +const normalizeWebSearchFreshness = (value: unknown) => { + if (typeof value !== "string") { + return undefined; + } + return webSearchFreshnessMap[value] ?? value; +}; + const AUTH_EXPIRY_SKEW_MS = 30_000; function isRuntimeAuthExpired(context: RuntimeSessionContext) { @@ -369,8 +384,7 @@ app.post("/internal/tools/web-search", async (req, res) => { : undefined; const payload = { query, - freshness: - typeof req.body?.freshness === "string" ? req.body.freshness : undefined, + freshness: normalizeWebSearchFreshness(req.body?.freshness), summary: typeof req.body?.summary === "boolean" ? req.body.summary : undefined, count,