import { tool } from "@opencode-ai/plugin/tool" import { type Plugin } from "@opencode-ai/plugin" import { app, cnb, appId } from './index.ts'; import { } from 'es-toolkit' import { Skill } from "@kevisual/router"; const routes = app.routes.filter(r => { const metadata = r.metadata as Skill if (metadata && metadata.tags && metadata.tags.includes('opencode')) { return !!metadata.skill } return false }) // opencode run "请使用 cnb-login-verify 工具验证登录信信息,检查cookie" export const CnbPlugin: Plugin = async ({ project, client, $, directory, worktree }) => { return { 'tool': { ...routes.reduce((acc, route) => { const metadata = route.metadata as Skill acc[metadata.skill!] = { name: metadata.title || metadata.skill, description: metadata.summary || '', args: metadata.args || {}, async execute(args: Record) { console.log(`Executing skill ${metadata.skill} with args:`, args); await client.app.log({ body: { service: 'cnb', level: 'info', message: `Executing skill ${metadata.skill} with args: ${JSON.stringify(args)}` } }); const res = await app.run({ path: route.path, key: route.key, payload: args }, { appId }); if (res.code === 200) { if (res.data?.content) { return res.data.content; } const str = JSON.stringify(res.data || res, null, 2); if (str.length > 5000) { return str.slice(0, 5000) + '... (truncated)'; } return str; } return `Error: ${res?.message || '无法获取结果'}`; } } return acc; }, {} as Record) }, 'tool.execute.before': async (opts) => { // console.log('CnbPlugin: tool.execute.before', opts.tool); // delete toolSkills['cnb-login-verify'] } } } const demo = { 'tool': { "cnb-login-verify": { name: "CNB 登录验证信息", description: "验证 CNB 登录信息是否有效", args: { checkToken: tool.schema.boolean().describe("是否检查 Token 的有效性").default(true), checkCookie: tool.schema.boolean().describe("是否检查 Cookie 的有效性").default(false), }, async execute(args) { const res = await app.run({ path: 'cnb', key: 'user-check', payload: { ...args } }, { appId }); if (res.code === 200) { return res.data?.output; } return '无法获取登录状态,请检查配置。'; }, }, } }