Compare commits

...

7 Commits

Author SHA1 Message Date
xiongxiao
0476b24c14 fix: 修复 AssistantConfig 中 id 的赋值逻辑并更新版本号至 0.1.29 2026-03-18 19:11:39 +08:00
xiongxiao
57326c14d6 Refactor code structure for improved readability and maintainability 2026-03-18 19:08:43 +08:00
xiongxiao
c832465d57 Auto commit: 2026-03-18 00:26 2026-03-18 00:26:33 +08:00
xiongxiao
babee3f155 update 2026-03-16 03:25:30 +08:00
xiongxiao
35d3cae9f1 update 2026-03-16 03:23:40 +08:00
xiongxiao
b7e2bdcb1c feat: 添加获取 OpenCode 可用模型列表的功能,并优化创建客户端的参数 2026-03-16 02:13:51 +08:00
xiongxiao
c3bc0d2465 feat: 添加 OpenCode 会话管理功能,支持列出、获取、创建、更新和删除会话 2026-03-16 01:35:36 +08:00
13 changed files with 1738 additions and 205 deletions

1
.npmrc
View File

@@ -1,3 +1,2 @@
//npm.xiongxiao.me/:_authToken=${ME_NPM_TOKEN}
//npm.cnb.cool/kevisual/registry/-/packages/:_authToken=${CNB_API_KEY} //npm.cnb.cool/kevisual/registry/-/packages/:_authToken=${CNB_API_KEY}
//registry.npmjs.org/:_authToken=${NPM_TOKEN} //registry.npmjs.org/:_authToken=${NPM_TOKEN}

View File

@@ -42,17 +42,17 @@
} }
}, },
"devDependencies": { "devDependencies": {
"@inquirer/prompts": "^8.3.0", "@inquirer/prompts": "^8.3.2",
"@kevisual/ai": "^0.0.28", "@kevisual/ai": "^0.0.28",
"@kevisual/api": "^0.0.64", "@kevisual/api": "^0.0.64",
"@kevisual/load": "^0.0.6", "@kevisual/load": "^0.0.6",
"@kevisual/local-app-manager": "^0.1.32", "@kevisual/local-app-manager": "^0.1.32",
"@kevisual/logger": "^0.0.4", "@kevisual/logger": "^0.0.4",
"@kevisual/query": "0.0.53", "@kevisual/query": "0.0.53",
"@kevisual/router": "^0.1.2", "@kevisual/router": "^0.1.5",
"@kevisual/types": "^0.0.12", "@kevisual/types": "^0.0.12",
"@kevisual/use-config": "^1.0.30", "@kevisual/use-config": "^1.0.30",
"@opencode-ai/plugin": "^1.2.26", "@opencode-ai/plugin": "^1.2.27",
"@types/bun": "^1.3.10", "@types/bun": "^1.3.10",
"@types/node": "^25.5.0", "@types/node": "^25.5.0",
"@types/send": "^1.2.1", "@types/send": "^1.2.1",
@@ -63,8 +63,8 @@
"dayjs": "^1.11.20", "dayjs": "^1.11.20",
"dotenv": "^17.3.1", "dotenv": "^17.3.1",
"get-port": "^7.1.0", "get-port": "^7.1.0",
"meilisearch": "^0.55.0", "meilisearch": "^0.56.0",
"nanoid": "^5.1.6", "nanoid": "^5.1.7",
"send": "^1.2.1", "send": "^1.2.1",
"supports-color": "^10.2.2", "supports-color": "^10.2.2",
"table": "^6.9.0", "table": "^6.9.0",
@@ -77,11 +77,11 @@
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.1009.0", "@aws-sdk/client-s3": "^3.1011.0",
"@kevisual/js-filter": "^0.0.6", "@kevisual/js-filter": "^0.0.6",
"@kevisual/oss": "^0.0.20", "@kevisual/oss": "^0.0.20",
"@kevisual/video-tools": "^0.0.13", "@kevisual/video-tools": "^0.0.13",
"@opencode-ai/sdk": "^1.2.26", "@opencode-ai/sdk": "^1.2.27",
"es-toolkit": "^1.45.1", "es-toolkit": "^1.45.1",
"eventemitter3": "^5.0.4", "eventemitter3": "^5.0.4",
"lowdb": "^7.0.1", "lowdb": "^7.0.1",

View File

@@ -379,7 +379,7 @@ export class AssistantConfig {
return checkConfigDir; return checkConfigDir;
} }
protected getDefaultInitAssistantConfig() { protected getDefaultInitAssistantConfig() {
const id = randomId(); let id = randomId();
const isCNB = !!useKey('CNB'); const isCNB = !!useKey('CNB');
let kevisualUrl = 'https://kevisual.cn'; let kevisualUrl = 'https://kevisual.cn';
if (isCNB) { if (isCNB) {
@@ -390,6 +390,11 @@ export class AssistantConfig {
kevisualUrl = 'http://kevisual.cn'; kevisualUrl = 'http://kevisual.cn';
} }
} }
const routes = ["@kevisual/cnb/routes"]
if (isCNB) {
routes.push("@kevisual/project-search/routes")
id = 'cnb-dev'
}
return { return {
app: { app: {
url: kevisualUrl, url: kevisualUrl,
@@ -399,9 +404,7 @@ export class AssistantConfig {
docs: `${kevisualUrl}/root/cli/docs/`, docs: `${kevisualUrl}/root/cli/docs/`,
home: isCNB ? '/root/cli-center' : '/root/home', home: isCNB ? '/root/cli-center' : '/root/home',
proxy: [], proxy: [],
"routes": [ "routes": routes,
"@kevisual/cnb/routes"
],
share: { share: {
enabled: true, enabled: true,
url: 'https://kevisual.cn/ws/proxy', url: 'https://kevisual.cn/ws/proxy',

View File

@@ -4,6 +4,50 @@ import { getClient } from './module/client.ts';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { Session } from '@opencode-ai/sdk'; import { Session } from '@opencode-ai/sdk';
app.route({
path: 'opencode-cnb',
key: 'models',
middleware: ['auth-admin'],
description: '获取 OpenCode 可用模型列表,返回 providerID 和 modelID',
metadata: {
args: {
baseUrl: z.string().optional().describe('OpenCode 服务地址,默认为 http://localhost:4096'),
}
}
}).define(async (ctx) => {
const { baseUrl } = ctx.query;
const client = await getClient({ baseUrl });
if (!client) {
ctx.body = { content: '获取 OpenCode 客户端失败' };
return;
}
const res = await client.provider.list();
const providerData = (res as any)?.data ?? res;
const all: any[] = providerData?.all ?? [];
const connected: string[] = providerData?.connected ?? [];
const defaultModels: Record<string, string> = providerData?.default ?? {};
const models: Array<{ providerID: string; providerName: string; modelID: string; modelName: string; isDefault: boolean; isConnected: boolean }> = [];
for (const provider of all) {
const isConnected = connected.includes(provider.id);
for (const [modelKey, model] of Object.entries<any>(provider.models ?? {})) {
models.push({
providerID: provider.id,
providerName: provider.name,
modelID: modelKey,
modelName: model.name ?? modelKey,
isDefault: defaultModels[provider.id] === modelKey,
isConnected,
});
}
}
ctx.body = {
content: `${models.length} 个模型,已连接提供商: ${connected.join(', ') || '无'}`,
data: { models, connected, default: defaultModels },
};
}).addTo(app);
app.route({ app.route({
path: 'opencode-cnb', path: 'opencode-cnb',
key: 'question', key: 'question',
@@ -14,13 +58,16 @@ app.route({
question: z.string().describe('问题'), question: z.string().describe('问题'),
baseUrl: z.string().optional().describe('OpenCode 服务地址,默认为 http://localhost:4096'), baseUrl: z.string().optional().describe('OpenCode 服务地址,默认为 http://localhost:4096'),
directory: z.string().optional().describe('运行目录,默认为根目录'), directory: z.string().optional().describe('运行目录,默认为根目录'),
messageID: z.string().optional().describe('消息 ID选填'), messageId: z.string().optional().describe('消息 ID选填'),
sessionId: z.string().optional().describe('会话 ID选填'), sessionId: z.string().optional().describe('会话 ID选填'),
providerId: z.string().optional().describe('指定使用的提供商 ID默认为空表示使用默认提供商'),
modelId: z.string().optional().describe('指定使用的模型 ID默认为空表示使用默认模型'),
parts: z.array(z.any()).optional().describe('消息内容的分块,优先于 question 参数'), parts: z.array(z.any()).optional().describe('消息内容的分块,优先于 question 参数'),
awaitAnswer: z.boolean().optional().describe('是否等待回答完成,默认为 false开启后会在回答完成后返回完整回答内容')
} }
} }
}).define(async (ctx) => { }).define(async (ctx) => {
const { question, baseUrl, directory = '/workspace', messageID, sessionId, parts } = ctx.query; const { question, baseUrl, directory = '/workspace', messageId, sessionId, parts, awaitAnswer = false, providerId, modelId } = ctx.query;
const client = await getClient({ baseUrl: baseUrl }); const client = await getClient({ baseUrl: baseUrl });
if (!client) { if (!client) {
ctx.body = { content: `OpenCode 客户端获取失败` }; ctx.body = { content: `OpenCode 客户端获取失败` };
@@ -30,12 +77,7 @@ app.route({
ctx.body = { content: `问题不能为空` }; ctx.body = { content: `问题不能为空` };
return; return;
} }
// const sessionList = await client.session.list()
let session: Session | null = null; let session: Session | null = null;
// const hasSession = sessionList.data.find(s => s.directory === directory);
// if (hasSession) {
// session = hasSession;
// } else {
if (sessionId) { if (sessionId) {
try { try {
const getSession = await client.session.get({ path: { id: sessionId } }); const getSession = await client.session.get({ path: { id: sessionId } });
@@ -53,16 +95,30 @@ app.route({
session = createSession.data; session = createSession.data;
} }
let _parts: any[] = parts ?? [{ type: "text", text: question }]; let _parts: any[] = parts ?? [{ type: "text", text: question }];
const message = await client.session.prompt({ let data: any = null;
let model = null;
if (providerId && modelId) {
model = { providerID: providerId, modelID: modelId };
}
const promptPromise = client.session.prompt({
body: { body: {
messageID: messageID, messageID: messageId,
parts: _parts, parts: _parts,
...model ? { model } : {},
}, },
path: { path: {
id: sessionId || session.id, id: sessionId || session.id,
}, },
}) })
const data = message.data; if (awaitAnswer) {
const message = await promptPromise;
ctx.body = { content: `已经启动`, data }; data = message.data;
} else {
promptPromise.then(res => {
console.log(`Prompt completed with response:`, res.data.info.id);
}).catch(() => {
// 忽略错误
})
}
ctx.body = { content: awaitAnswer ? `已经完成` : `运行中`, data, sessionId: session.id };
}).addTo(app); }).addTo(app);

View File

@@ -1,2 +1,3 @@
import './ls.ts' import './ls.ts'
import './cnb.ts' import './cnb.ts'
import './session/index.ts'

View File

@@ -0,0 +1,282 @@
import { app } from '@/app.ts'
import { createSkill, tool } from '@kevisual/router';
import { opencodeManager } from '../module/open.ts';
// 查询 - 列出所有 session
app.route({
path: 'opencode-session',
key: 'list',
middleware: ['auth-admin'],
description: '列出所有 OpenCode Session',
metadata: {
tags: ['session'],
...createSkill({
skill: 'list-opencode-sessions',
title: '列出所有 Session',
summary: '列出 OpenCode 中的所有会话,可按目录过滤',
args: {
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
}
})
}
}).define(async (ctx) => {
const { port } = ctx.query;
const client = await opencodeManager.getClient({ port });
const result = await client.session.list();
ctx.body = { data: result.data, content: `${(result.data as any[])?.length ?? 0} 个 Session` };
}).addTo(app);
// 查询 - 获取单个 session
app.route({
path: 'opencode-session',
key: 'get',
middleware: ['auth-admin'],
description: '获取指定 OpenCode Session',
metadata: {
tags: ['session'],
...createSkill({
skill: 'get-opencode-session',
title: '获取 Session',
summary: '根据 ID 获取指定的 OpenCode 会话信息',
args: {
id: tool.schema.string().describe('Session ID'),
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
}
})
}
}).define(async (ctx) => {
const { id, port } = ctx.query;
if (!id) {
ctx.throw(400, 'Session ID 不能为空');
return;
}
const client = await opencodeManager.getClient({ port });
const result = await client.session.get({ path: { id } });
ctx.body = { data: result.data, content: `已获取 Session: ${id}` };
}).addTo(app);
// 查询 - 获取 session 状态
app.route({
path: 'opencode-session',
key: 'status',
middleware: ['auth-admin'],
description: '获取 OpenCode Session 状态',
metadata: {
tags: ['session'],
...createSkill({
skill: 'get-opencode-session-status',
title: '获取 Session 状态',
summary: '获取当前 OpenCode 会话的运行状态,可按目录过滤',
args: {
directory: tool.schema.string().optional().describe('工作目录'),
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
}
})
}
}).define(async (ctx) => {
const { directory, port } = ctx.query;
const client = await opencodeManager.getClient({ port });
const result = await client.session.status(directory ? { query: { directory } } : undefined);
ctx.body = { data: result.data, content: `Session 状态已获取` };
}).addTo(app);
// 查询 - 列出 session 消息
app.route({
path: 'opencode-session',
key: 'messages',
middleware: ['auth-admin'],
description: '列出 OpenCode Session 消息',
metadata: {
tags: ['session'],
...createSkill({
skill: 'list-opencode-session-messages',
title: '列出 Session 消息',
summary: '列出指定 OpenCode 会话的所有消息记录',
args: {
sessionId: tool.schema.string().describe('Session ID'),
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
}
})
}
}).define(async (ctx) => {
const { sessionId, port } = ctx.query;
if (!sessionId) {
ctx.throw(400, 'Session ID 不能为空');
return;
}
const client = await opencodeManager.getClient({ port });
const result = await client.session.messages({ path: { id: sessionId } });
ctx.body = { data: result.data, content: `Session ${sessionId}${(result.data as any[])?.length ?? 0} 条消息` };
}).addTo(app);
// 新增 - 创建 session
app.route({
path: 'opencode-session',
key: 'create',
middleware: ['auth-admin'],
description: '创建 OpenCode Session',
metadata: {
tags: ['session'],
...createSkill({
skill: 'create-opencode-session',
title: '创建 Session',
summary: '在指定目录创建一个新的 OpenCode 会话',
args: {
directory: tool.schema.string().optional().describe('工作目录,默认为 /workspace'),
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
}
})
}
}).define(async (ctx) => {
const { directory = '/workspace', port } = ctx.query;
const client = await opencodeManager.getClient({ port });
const result = await client.session.create({ query: { directory } });
ctx.body = { data: result.data, content: `Session 已创建ID: ${(result.data as any)?.id}` };
}).addTo(app);
// 修改 - 更新 session
app.route({
path: 'opencode-session',
key: 'update',
middleware: ['auth-admin'],
description: '更新 OpenCode Session',
metadata: {
tags: ['session'],
...createSkill({
skill: 'update-opencode-session',
title: '更新 Session',
summary: '更新指定 OpenCode 会话的属性,如标题',
args: {
sessionId: tool.schema.string().describe('Session ID'),
title: tool.schema.string().optional().describe('新的会话标题'),
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
}
})
}
}).define(async (ctx) => {
const { sessionId, title, port } = ctx.query;
if (!sessionId) {
ctx.throw(400, 'Session ID 不能为空');
return;
}
const client = await opencodeManager.getClient({ port });
const result = await client.session.update({ path: { id: sessionId }, body: { title } });
ctx.body = { data: result.data, content: `Session ${sessionId} 已更新` };
}).addTo(app);
// 删除 - 删除 session
app.route({
path: 'opencode-session',
key: 'delete',
middleware: ['auth-admin'],
description: '删除 OpenCode Session',
metadata: {
tags: ['session'],
...createSkill({
skill: 'delete-opencode-session',
title: '删除 Session',
summary: '根据 ID 删除指定的 OpenCode 会话及其所有数据',
args: {
sessionId: tool.schema.string().describe('Session ID'),
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
}
})
}
}).define(async (ctx) => {
const { sessionId, port } = ctx.query;
if (!sessionId) {
ctx.throw(400, 'Session ID 不能为空');
return;
}
const client = await opencodeManager.getClient({ port });
await client.session.delete({ path: { id: sessionId } });
ctx.body = { content: `Session ${sessionId} 已删除` };
}).addTo(app);
// 操作 - 中止 session
app.route({
path: 'opencode-session',
key: 'abort',
middleware: ['auth-admin'],
description: '中止 OpenCode Session',
metadata: {
tags: ['session'],
...createSkill({
skill: 'abort-opencode-session',
title: '中止 Session',
summary: '中止正在运行的 OpenCode 会话',
args: {
sessionId: tool.schema.string().describe('Session ID'),
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
}
})
}
}).define(async (ctx) => {
const { sessionId, port } = ctx.query;
if (!sessionId) {
ctx.throw(400, 'Session ID 不能为空');
return;
}
const client = await opencodeManager.getClient({ port });
await client.session.abort({ path: { id: sessionId } });
ctx.body = { content: `Session ${sessionId} 已中止` };
}).addTo(app);
// 操作 - Fork session
app.route({
path: 'opencode-session',
key: 'fork',
middleware: ['auth-admin'],
description: 'Fork OpenCode Session',
metadata: {
tags: ['session'],
...createSkill({
skill: 'fork-opencode-session',
title: 'Fork Session',
summary: '从指定消息处 Fork 一个 OpenCode 会话',
args: {
sessionId: tool.schema.string().describe('Session ID'),
messageId: tool.schema.string().describe('从该消息处开始 Fork'),
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
}
})
}
}).define(async (ctx) => {
const { sessionId, messageId, port } = ctx.query;
if (!sessionId || !messageId) {
ctx.throw(400, 'Session ID 和 messageId 不能为空');
return;
}
const client = await opencodeManager.getClient({ port });
const result = await client.session.fork({ path: { id: sessionId }, body: { messageID: messageId } });
ctx.body = { data: result.data, content: `Session ${sessionId} 已从消息 ${messageId} Fork` };
}).addTo(app);
// 操作 - 总结 session
app.route({
path: 'opencode-session',
key: 'summarize',
middleware: ['auth-admin'],
description: '总结 OpenCode Session',
metadata: {
tags: ['session'],
...createSkill({
skill: 'summarize-opencode-session',
title: '总结 Session',
summary: '对指定的 OpenCode 会话进行内容总结',
args: {
sessionId: tool.schema.string().describe('Session ID'),
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
}
})
}
}).define(async (ctx) => {
const { sessionId, port } = ctx.query;
if (!sessionId) {
ctx.throw(400, 'Session ID 不能为空');
return;
}
const client = await opencodeManager.getClient({ port });
const result = await client.session.summarize({ path: { id: sessionId } });
ctx.body = { data: result.data, content: `Session ${sessionId} 总结完成` };
}).addTo(app);

View File

@@ -1,6 +1,6 @@
export const configJson = `{ export const configJson = `{
"name": "assistant-app", "name": "assistant-app",
"version": "1.0.3", "version": "1.0.4",
"description": "assistant-app package pnpm, node pkgs projects", "description": "assistant-app package pnpm, node pkgs projects",
"type": "module", "type": "module",
"scripts": { "scripts": {
@@ -11,18 +11,21 @@ export const configJson = `{
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.1007.0", "@aws-sdk/client-s3": "^3.1011.0",
"@kevisual/cnb": "^0.0.53",
"@kevisual/oss": "^0.0.20", "@kevisual/oss": "^0.0.20",
"@kevisual/project-search": "^0.0.12",
"@kevisual/query": "^0.0.53", "@kevisual/query": "^0.0.53",
"@kevisual/router": "^0.1.1", "@kevisual/router": "^0.1.5",
"@kevisual/cnb": "^0.0.42",
"@kevisual/use-config": "^1.0.30", "@kevisual/use-config": "^1.0.30",
"dayjs": "^1.11.19", "@parcel/watcher": "^2.5.6",
"crypto-js": "^4.2.0",
"dayjs": "^1.11.20",
"dotenv": "^17.3.1", "dotenv": "^17.3.1",
"es-toolkit": "^1.45.1", "es-toolkit": "^1.45.1",
"eventemitter3": "^5.0.4", "eventemitter3": "^5.0.4",
"ioredis": "^5.10.0", "ioredis": "^5.10.0",
"node-cron": "^4.2.1", "cron": "^4.4.0",
"pg": "^8.20.0", "pg": "^8.20.0",
"pm2": "^6.0.14", "pm2": "^6.0.14",
"unstorage": "^1.17.4" "unstorage": "^1.17.4"
@@ -30,7 +33,8 @@ export const configJson = `{
"devDependencies": { "devDependencies": {
"@kevisual/types": "^0.0.12", "@kevisual/types": "^0.0.12",
"@types/bun": "^1.3.10", "@types/bun": "^1.3.10",
"@types/node": "^25.4.0", "@types/crypto-js": "^4.2.2",
"@types/node": "^25.5.0",
"semver": "^7.7.4" "semver": "^7.7.4"
} }
} }

View File

@@ -113,6 +113,10 @@ export class AssistantInit extends AssistantConfig {
`packages: `packages:
- 'apps/**/*' - 'apps/**/*'
- 'pages/**/*' - 'pages/**/*'
- 'skills/**/*'
allowBuilds:
'@parcel/watcher': true
`, `,
); );
console.log(chalk.green('助手 pnpm-workspace.yaml 文件创建成功')); console.log(chalk.green('助手 pnpm-workspace.yaml 文件创建成功'));

View File

@@ -1,6 +1,6 @@
{ {
"name": "assistant-app", "name": "assistant-app",
"version": "1.0.3", "version": "1.0.4",
"description": "assistant-app package pnpm, node pkgs projects", "description": "assistant-app package pnpm, node pkgs projects",
"type": "module", "type": "module",
"scripts": { "scripts": {
@@ -11,18 +11,21 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.1007.0", "@aws-sdk/client-s3": "^3.1011.0",
"@kevisual/cnb": "^0.0.53",
"@kevisual/oss": "^0.0.20", "@kevisual/oss": "^0.0.20",
"@kevisual/project-search": "^0.0.12",
"@kevisual/query": "^0.0.53", "@kevisual/query": "^0.0.53",
"@kevisual/router": "^0.1.1", "@kevisual/router": "^0.1.5",
"@kevisual/cnb": "^0.0.42",
"@kevisual/use-config": "^1.0.30", "@kevisual/use-config": "^1.0.30",
"dayjs": "^1.11.19", "@parcel/watcher": "^2.5.6",
"crypto-js": "^4.2.0",
"dayjs": "^1.11.20",
"dotenv": "^17.3.1", "dotenv": "^17.3.1",
"es-toolkit": "^1.45.1", "es-toolkit": "^1.45.1",
"eventemitter3": "^5.0.4", "eventemitter3": "^5.0.4",
"ioredis": "^5.10.0", "ioredis": "^5.10.0",
"node-cron": "^4.2.1", "cron": "^4.4.0",
"pg": "^8.20.0", "pg": "^8.20.0",
"pm2": "^6.0.14", "pm2": "^6.0.14",
"unstorage": "^1.17.4" "unstorage": "^1.17.4"
@@ -30,7 +33,8 @@
"devDependencies": { "devDependencies": {
"@kevisual/types": "^0.0.12", "@kevisual/types": "^0.0.12",
"@types/bun": "^1.3.10", "@types/bun": "^1.3.10",
"@types/node": "^25.4.0", "@types/crypto-js": "^4.2.2",
"@types/node": "^25.5.0",
"semver": "^7.7.4" "semver": "^7.7.4"
} }
} }

1184
bun.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "@kevisual/cli", "name": "@kevisual/cli",
"version": "0.1.25", "version": "0.1.29",
"description": "envision 命令行工具", "description": "envision 命令行工具",
"type": "module", "type": "module",
"basename": "/root/cli", "basename": "/root/cli",
@@ -41,13 +41,13 @@
], ],
"author": "abearxiong", "author": "abearxiong",
"dependencies": { "dependencies": {
"@inquirer/prompts": "^8.3.0", "@inquirer/prompts": "^8.3.2",
"@kevisual/app": "^0.0.2", "@kevisual/app": "^0.0.2",
"@kevisual/auth": "^2.0.3", "@kevisual/auth": "^2.0.3",
"@kevisual/context": "^0.0.8", "@kevisual/context": "^0.0.8",
"@kevisual/router": "^0.1.1", "@kevisual/router": "^0.1.5",
"@kevisual/use-config": "^1.0.30", "@kevisual/use-config": "^1.0.30",
"@opencode-ai/sdk": "^1.2.26", "@opencode-ai/sdk": "^1.2.27",
"@types/busboy": "^1.5.4", "@types/busboy": "^1.5.4",
"busboy": "^1.6.0", "busboy": "^1.6.0",
"eventemitter3": "^5.0.4", "eventemitter3": "^5.0.4",
@@ -55,14 +55,14 @@
"lowdb": "^7.0.1", "lowdb": "^7.0.1",
"lru-cache": "^11.2.7", "lru-cache": "^11.2.7",
"micromatch": "^4.0.8", "micromatch": "^4.0.8",
"nanoid": "^5.1.6", "nanoid": "^5.1.7",
"pm2": "latest", "pm2": "latest",
"semver": "^7.7.4", "semver": "^7.7.4",
"unstorage": "^1.17.4" "unstorage": "^1.17.4"
}, },
"devDependencies": { "devDependencies": {
"@kevisual/api": "^0.0.64", "@kevisual/api": "^0.0.64",
"@kevisual/cnb": "^0.0.46", "@kevisual/cnb": "^0.0.53",
"@kevisual/dts": "^0.0.4", "@kevisual/dts": "^0.0.4",
"@kevisual/load": "^0.0.6", "@kevisual/load": "^0.0.6",
"@kevisual/logger": "^0.0.4", "@kevisual/logger": "^0.0.4",
@@ -83,12 +83,15 @@
"jsonwebtoken": "^9.0.3", "jsonwebtoken": "^9.0.3",
"pm2": "^6.0.14", "pm2": "^6.0.14",
"tar": "^7.5.11", "tar": "^7.5.11",
"zustand": "^5.0.11" "zustand": "^5.0.12"
}, },
"engines": { "engines": {
"node": ">=22.0.0" "node": ">=22.0.0"
}, },
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
} },
"workspaces": [
"assistant"
]
} }

308
pnpm-lock.yaml generated
View File

@@ -9,8 +9,8 @@ importers:
.: .:
dependencies: dependencies:
'@inquirer/prompts': '@inquirer/prompts':
specifier: ^8.3.0 specifier: ^8.3.2
version: 8.3.0(@types/node@25.5.0) version: 8.3.2(@types/node@25.5.0)
'@kevisual/app': '@kevisual/app':
specifier: ^0.0.2 specifier: ^0.0.2
version: 0.0.2(dotenv@17.3.1) version: 0.0.2(dotenv@17.3.1)
@@ -21,14 +21,14 @@ importers:
specifier: ^0.0.8 specifier: ^0.0.8
version: 0.0.8 version: 0.0.8
'@kevisual/router': '@kevisual/router':
specifier: ^0.1.1 specifier: ^0.1.5
version: 0.1.1 version: 0.1.5
'@kevisual/use-config': '@kevisual/use-config':
specifier: ^1.0.30 specifier: ^1.0.30
version: 1.0.30(dotenv@17.3.1) version: 1.0.30(dotenv@17.3.1)
'@opencode-ai/sdk': '@opencode-ai/sdk':
specifier: ^1.2.26 specifier: ^1.2.27
version: 1.2.26 version: 1.2.27
'@types/busboy': '@types/busboy':
specifier: ^1.5.4 specifier: ^1.5.4
version: 1.5.4 version: 1.5.4
@@ -51,8 +51,8 @@ importers:
specifier: ^4.0.8 specifier: ^4.0.8
version: 4.0.8 version: 4.0.8
nanoid: nanoid:
specifier: ^5.1.6 specifier: ^5.1.7
version: 5.1.6 version: 5.1.7
pm2: pm2:
specifier: latest specifier: latest
version: 6.0.14(supports-color@10.2.2) version: 6.0.14(supports-color@10.2.2)
@@ -67,8 +67,8 @@ importers:
specifier: ^0.0.64 specifier: ^0.0.64
version: 0.0.64(react-dom@19.2.4(react@19.2.4))(react@19.2.4) version: 0.0.64(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@kevisual/cnb': '@kevisual/cnb':
specifier: ^0.0.46 specifier: ^0.0.53
version: 0.0.46(dotenv@17.3.1) version: 0.0.53(dotenv@17.3.1)
'@kevisual/dts': '@kevisual/dts':
specifier: ^0.0.4 specifier: ^0.0.4
version: 0.0.4(typescript@5.9.3) version: 0.0.4(typescript@5.9.3)
@@ -127,14 +127,14 @@ importers:
specifier: ^7.5.11 specifier: ^7.5.11
version: 7.5.11 version: 7.5.11
zustand: zustand:
specifier: ^5.0.11 specifier: ^5.0.12
version: 5.0.11(react@19.2.4) version: 5.0.12(react@19.2.4)
assistant: assistant:
dependencies: dependencies:
'@aws-sdk/client-s3': '@aws-sdk/client-s3':
specifier: ^3.1009.0 specifier: ^3.1011.0
version: 3.1009.0 version: 3.1011.0
'@kevisual/js-filter': '@kevisual/js-filter':
specifier: ^0.0.6 specifier: ^0.0.6
version: 0.0.6 version: 0.0.6
@@ -145,8 +145,8 @@ importers:
specifier: ^0.0.13 specifier: ^0.0.13
version: 0.0.13(dotenv@17.3.1)(supports-color@10.2.2) version: 0.0.13(dotenv@17.3.1)(supports-color@10.2.2)
'@opencode-ai/sdk': '@opencode-ai/sdk':
specifier: ^1.2.26 specifier: ^1.2.27
version: 1.2.26 version: 1.2.27
es-toolkit: es-toolkit:
specifier: ^1.45.1 specifier: ^1.45.1
version: 1.45.1 version: 1.45.1
@@ -170,8 +170,8 @@ importers:
version: 4.3.6 version: 4.3.6
devDependencies: devDependencies:
'@inquirer/prompts': '@inquirer/prompts':
specifier: ^8.3.0 specifier: ^8.3.2
version: 8.3.0(@types/node@25.5.0) version: 8.3.2(@types/node@25.5.0)
'@kevisual/ai': '@kevisual/ai':
specifier: ^0.0.28 specifier: ^0.0.28
version: 0.0.28 version: 0.0.28
@@ -191,8 +191,8 @@ importers:
specifier: 0.0.53 specifier: 0.0.53
version: 0.0.53 version: 0.0.53
'@kevisual/router': '@kevisual/router':
specifier: ^0.1.2 specifier: ^0.1.5
version: 0.1.2 version: 0.1.5
'@kevisual/types': '@kevisual/types':
specifier: ^0.0.12 specifier: ^0.0.12
version: 0.0.12 version: 0.0.12
@@ -200,8 +200,8 @@ importers:
specifier: ^1.0.30 specifier: ^1.0.30
version: 1.0.30(dotenv@17.3.1) version: 1.0.30(dotenv@17.3.1)
'@opencode-ai/plugin': '@opencode-ai/plugin':
specifier: ^1.2.26 specifier: ^1.2.27
version: 1.2.26 version: 1.2.27
'@types/bun': '@types/bun':
specifier: ^1.3.10 specifier: ^1.3.10
version: 1.3.10 version: 1.3.10
@@ -233,11 +233,11 @@ importers:
specifier: ^7.1.0 specifier: ^7.1.0
version: 7.1.0 version: 7.1.0
meilisearch: meilisearch:
specifier: ^0.55.0 specifier: ^0.56.0
version: 0.55.0 version: 0.56.0
nanoid: nanoid:
specifier: ^5.1.6 specifier: ^5.1.7
version: 5.1.6 version: 5.1.7
send: send:
specifier: ^1.2.1 specifier: ^1.2.1
version: 1.2.1(supports-color@10.2.2) version: 1.2.1(supports-color@10.2.2)
@@ -310,8 +310,8 @@ packages:
'@aws-crypto/util@5.2.0': '@aws-crypto/util@5.2.0':
resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
'@aws-sdk/client-s3@3.1009.0': '@aws-sdk/client-s3@3.1011.0':
resolution: {integrity: sha512-luy8CxallkoiGWTqU86ca/BbvkWJjs0oala7uIIRN1JtQxMb5i4Yl/PBZVcQFhbK9kQi0PK0GfD8gIpLkI91fw==} resolution: {integrity: sha512-jY7CGX+vfM/DSi4K8UwaZKoXnhqchmAbKFB1kIuHMfPPqW7l3jC/fUVDb95/njMsB2ymYOTusZEzoCTeUB/4qA==}
engines: {node: '>=20.0.0'} engines: {node: '>=20.0.0'}
'@aws-sdk/core@3.973.20': '@aws-sdk/core@3.973.20':
@@ -362,8 +362,8 @@ packages:
resolution: {integrity: sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==} resolution: {integrity: sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==}
engines: {node: '>=20.0.0'} engines: {node: '>=20.0.0'}
'@aws-sdk/middleware-flexible-checksums@3.973.6': '@aws-sdk/middleware-flexible-checksums@3.974.0':
resolution: {integrity: sha512-0nYEgkJH7Yt9k+nZJyllTghnkKaz17TWFcr5Mi0XMVMzYlF4ytDZADQpF2/iJo36cKL5AYSzRsvlykE4M/ErTA==} resolution: {integrity: sha512-BmdDjqvnuYaC4SY7ypHLXfCSsGYGUZkjCLSZyUAAYn1YT28vbNMJNDwhlfkvvE+hQHG5RJDlEmYuvBxcB9jX1g==}
engines: {node: '>=20.0.0'} engines: {node: '>=20.0.0'}
'@aws-sdk/middleware-host-header@3.972.8': '@aws-sdk/middleware-host-header@3.972.8':
@@ -461,12 +461,12 @@ packages:
resolution: {integrity: sha512-LyDyvpueETaZI62xbjaLa74iSrtsbib6c2uhzxML0eSYkfX553imlK5Nu9NIcwMU2+ULAsCqUCutgd0PeCumww==} resolution: {integrity: sha512-LyDyvpueETaZI62xbjaLa74iSrtsbib6c2uhzxML0eSYkfX553imlK5Nu9NIcwMU2+ULAsCqUCutgd0PeCumww==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@inquirer/ansi@2.0.3': '@inquirer/ansi@2.0.4':
resolution: {integrity: sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==} resolution: {integrity: sha512-DpcZrQObd7S0R/U3bFdkcT5ebRwbTTC4D3tCc1vsJizmgPLxNJBo+AAFmrZwe8zk30P2QzgzGWZ3Q9uJwWuhIg==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
'@inquirer/checkbox@5.1.0': '@inquirer/checkbox@5.1.2':
resolution: {integrity: sha512-/HjF1LN0a1h4/OFsbGKHNDtWICFU/dqXCdym719HFTyJo9IG7Otr+ziGWc9S0iQuohRZllh+WprSgd5UW5Fw0g==} resolution: {integrity: sha512-PubpMPO2nJgMufkoB3P2wwxNXEMUXnBIKi/ACzDUYfaoPuM7gSTmuxJeMscoLVEsR4qqrCMf5p0SiYGWnVJ8kw==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -474,8 +474,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/confirm@6.0.8': '@inquirer/confirm@6.0.10':
resolution: {integrity: sha512-Di6dgmiZ9xCSUxWUReWTqDtbhXCuG2MQm2xmgSAIruzQzBqNf49b8E07/vbCYY506kDe8BiwJbegXweG8M1klw==} resolution: {integrity: sha512-tiNyA73pgpQ0FQ7axqtoLUe4GDYjNCDcVsbgcA5anvwg2z6i+suEngLKKJrWKJolT//GFPZHwN30binDIHgSgQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -483,8 +483,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/core@11.1.5': '@inquirer/core@11.1.7':
resolution: {integrity: sha512-QQPAX+lka8GyLcZ7u7Nb1h6q72iZ/oy0blilC3IB2nSt1Qqxp7akt94Jqhi/DzARuN3Eo9QwJRvtl4tmVe4T5A==} resolution: {integrity: sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -492,8 +492,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/editor@5.0.8': '@inquirer/editor@5.0.10':
resolution: {integrity: sha512-sLcpbb9B3XqUEGrj1N66KwhDhEckzZ4nI/W6SvLXyBX8Wic3LDLENlWRvkOGpCPoserabe+MxQkpiMoI8irvyA==} resolution: {integrity: sha512-VJx4XyaKea7t8hEApTw5dxeIyMtWXre2OiyJcICCRZI4hkoHsMoCnl/KbUnJJExLbH9csLLHMVR144ZhFE1CwA==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -501,8 +501,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/expand@5.0.8': '@inquirer/expand@5.0.10':
resolution: {integrity: sha512-QieW3F1prNw3j+hxO7/NKkG1pk3oz7pOB6+5Upwu3OIwADfPX0oZVppsqlL+Vl/uBHHDSOBY0BirLctLnXwGGg==} resolution: {integrity: sha512-fC0UHJPXsTRvY2fObiwuQYaAnHrp3aDqfwKUJSdfpgv18QUG054ezGbaRNStk/BKD5IPijeMKWej8VV8O5Q/eQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -510,8 +510,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/external-editor@2.0.3': '@inquirer/external-editor@2.0.4':
resolution: {integrity: sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w==} resolution: {integrity: sha512-Prenuv9C1PHj2Itx0BcAOVBTonz02Hc2Nd2DbU67PdGUaqn0nPCnV34oDyyoaZHnmfRxkpuhh/u51ThkrO+RdA==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -519,12 +519,12 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/figures@2.0.3': '@inquirer/figures@2.0.4':
resolution: {integrity: sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g==} resolution: {integrity: sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
'@inquirer/input@5.0.8': '@inquirer/input@5.0.10':
resolution: {integrity: sha512-p0IJslw0AmedLEkOU+yrEX3Aj2RTpQq7ZOf8nc1DIhjzaxRWrrgeuE5Kyh39fVRgtcACaMXx/9WNo8+GjgBOfw==} resolution: {integrity: sha512-nvZ6qEVeX/zVtZ1dY2hTGDQpVGD3R7MYPLODPgKO8Y+RAqxkrP3i/3NwF3fZpLdaMiNuK0z2NaYIx9tPwiSegQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -532,8 +532,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/number@4.0.8': '@inquirer/number@4.0.10':
resolution: {integrity: sha512-uGLiQah9A0F9UIvJBX52m0CnqtLaym0WpT9V4YZrjZ+YRDKZdwwoEPz06N6w8ChE2lrnsdyhY9sL+Y690Kh9gQ==} resolution: {integrity: sha512-Ht8OQstxiS3APMGjHV0aYAjRAysidWdwurWEo2i8yI5xbhOBWqizT0+MU1S2GCcuhIBg+3SgWVjEoXgfhY+XaA==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -541,8 +541,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/password@5.0.8': '@inquirer/password@5.0.10':
resolution: {integrity: sha512-zt1sF4lYLdvPqvmvHdmjOzuUUjuCQ897pdUCO8RbXMUDKXJTTyOQgtn23le+jwcb+MpHl3VAFvzIdxRAf6aPlA==} resolution: {integrity: sha512-QbNyvIE8q2GTqKLYSsA8ATG+eETo+m31DSR0+AU7x3d2FhaTWzqQek80dj3JGTo743kQc6mhBR0erMjYw5jQ0A==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -550,8 +550,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/prompts@8.3.0': '@inquirer/prompts@8.3.2':
resolution: {integrity: sha512-JAj66kjdH/F1+B7LCigjARbwstt3SNUOSzMdjpsvwJmzunK88gJeXmcm95L9nw1KynvFVuY4SzXh/3Y0lvtgSg==} resolution: {integrity: sha512-yFroiSj2iiBFlm59amdTvAcQFvWS6ph5oKESls/uqPBect7rTU2GbjyZO2DqxMGuIwVA8z0P4K6ViPcd/cp+0w==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -559,8 +559,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/rawlist@5.2.4': '@inquirer/rawlist@5.2.6':
resolution: {integrity: sha512-fTuJ5Cq9W286isLxwj6GGyfTjx1Zdk4qppVEPexFuA6yioCCXS4V1zfKroQqw7QdbDPN73xs2DiIAlo55+kBqg==} resolution: {integrity: sha512-jfw0MLJ5TilNsa9zlJ6nmRM0ZFVZhhTICt4/6CU2Dv1ndY7l3sqqo1gIYZyMMDw0LvE1u1nzJNisfHEhJIxq5w==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -568,8 +568,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/search@4.1.4': '@inquirer/search@4.1.6':
resolution: {integrity: sha512-9yPTxq7LPmYjrGn3DRuaPuPbmC6u3fiWcsE9ggfLcdgO/ICHYgxq7mEy1yJ39brVvgXhtOtvDVjDh9slJxE4LQ==} resolution: {integrity: sha512-3/6kTRae98hhDevENScy7cdFEuURnSpM3JbBNg8yfXLw88HgTOl+neUuy/l9W0No5NzGsLVydhBzTIxZP7yChQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -577,8 +577,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/select@5.1.0': '@inquirer/select@5.1.2':
resolution: {integrity: sha512-OyYbKnchS1u+zRe14LpYrN8S0wH1vD0p2yKISvSsJdH2TpI87fh4eZdWnpdbrGauCRWDph3NwxRmM4Pcm/hx1Q==} resolution: {integrity: sha512-kTK8YIkHV+f02y7bWCh7E0u2/11lul5WepVTclr3UMBtBr05PgcZNWfMa7FY57ihpQFQH/spLMHTcr0rXy50tA==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -586,8 +586,8 @@ packages:
'@types/node': '@types/node':
optional: true optional: true
'@inquirer/type@4.0.3': '@inquirer/type@4.0.4':
resolution: {integrity: sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw==} resolution: {integrity: sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
peerDependencies: peerDependencies:
'@types/node': '>=18' '@types/node': '>=18'
@@ -630,8 +630,8 @@ packages:
'@kevisual/auth@2.0.3': '@kevisual/auth@2.0.3':
resolution: {integrity: sha512-4xpijaIhlCTr/DlJaV/gmkCQeg45EO1yxWpRvUX+1jCdVbuxSR0wZrF0SD9oybnjmKWMKDNPLsXyduFjMGcItA==} resolution: {integrity: sha512-4xpijaIhlCTr/DlJaV/gmkCQeg45EO1yxWpRvUX+1jCdVbuxSR0wZrF0SD9oybnjmKWMKDNPLsXyduFjMGcItA==}
'@kevisual/cnb@0.0.46': '@kevisual/cnb@0.0.53':
resolution: {integrity: sha512-D39NwnlqL5U2AQ0q5TXkKpR+E+fBEklA7gGY93dfJN1lzgOgMnzJxIbu+PFKN7u1EYE3lMGpK+s0MTcDExmkZw==} resolution: {integrity: sha512-moDiUkWNaHtOvQ2WXhILD2o7OdKv+/QW6fb4Iq8VXPBI+AYdVN4kmdBSIXR1RGulbYX82gaZcjypC/4vYDD/PQ==}
hasBin: true hasBin: true
'@kevisual/context@0.0.4': '@kevisual/context@0.0.4':
@@ -680,11 +680,8 @@ packages:
'@kevisual/router@0.0.51': '@kevisual/router@0.0.51':
resolution: {integrity: sha512-i9qYBeS/um78oC912oWJD3iElB+5NTKyTrz1Hzf4DckiUFnjLL81UPwjIh5I2l9+ul0IZ/Pxx+sFSF99fJkzKg==} resolution: {integrity: sha512-i9qYBeS/um78oC912oWJD3iElB+5NTKyTrz1Hzf4DckiUFnjLL81UPwjIh5I2l9+ul0IZ/Pxx+sFSF99fJkzKg==}
'@kevisual/router@0.1.1': '@kevisual/router@0.1.5':
resolution: {integrity: sha512-+uaJc+Bf/T1mfxyfy9PmwuxJGPOLhVqrmsli2xUPqkkFvizrFIGB1vBTITuo5XP/FnwGqxgbjsitG57AMubm3w==} resolution: {integrity: sha512-ZsHYGQ49j70wQQqEafSPLpgjD2Vv3c7wFUm+iHyVFCW1f8tHjyMZjsG2cflaDmICCJBo1vhrqq5+abuDJq/U9g==}
'@kevisual/router@0.1.2':
resolution: {integrity: sha512-GLLJMZXtv3nUQKJXyE+vJFiCuntpuBc0VT8hMQyGvxwzqN8BY8rX6yS9TNDWhSXLwLYed8BJtG+azEONDjFCpw==}
'@kevisual/types@0.0.12': '@kevisual/types@0.0.12':
resolution: {integrity: sha512-zJXH2dosir3jVrQ6QG4i0+iLQeT9gJ3H+cKXs8ReWboxBSYzUZO78XssVeVrFPsJ33iaAqo4q3DWbSS1dWGn7Q==} resolution: {integrity: sha512-zJXH2dosir3jVrQ6QG4i0+iLQeT9gJ3H+cKXs8ReWboxBSYzUZO78XssVeVrFPsJ33iaAqo4q3DWbSS1dWGn7Q==}
@@ -724,11 +721,11 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
'@opencode-ai/plugin@1.2.26': '@opencode-ai/plugin@1.2.27':
resolution: {integrity: sha512-pC71KGAI9T0+S84KpbEq9THp5pT7KOq+GmfdXkvQ7KSH5zi+iASWRhqorir73sKmEj2MQfpbe1BxdcU5qbeOwA==} resolution: {integrity: sha512-h+8Bw9v9nghMg7T+SUCTzxlIhOrsTqXW7U0HVLGQST5DjbN7uyCUM51roZWZ8LRjGxzbzFhvPnY1bj8i+ioZyw==}
'@opencode-ai/sdk@1.2.26': '@opencode-ai/sdk@1.2.27':
resolution: {integrity: sha512-HPB+0pfvTMPj2KEjNLF3oqgldKW8koTJ7ssqXwzndazqxS+gUynzvdIKIQP4+QIInNcc5nJMG9JtfLcePGgTLQ==} resolution: {integrity: sha512-Wk0o/I+Fo+wE3zgvlJDs8Fb67KlKqX0PrV8dK5adSDkANq6r4Z25zXJg2iOir+a8ntg3rAcpel1OY4FV/TwRUA==}
'@opentelemetry/api@1.9.0': '@opentelemetry/api@1.9.0':
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
@@ -1867,8 +1864,8 @@ packages:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
meilisearch@0.55.0: meilisearch@0.56.0:
resolution: {integrity: sha512-qSMeiezfDgIqciIeYzh5E4pXDZZD7CtHeWDCs43kN3trLgl5FtfmBAIkljL3huFaOx08feYtC8FfIFUpVwq6rg==} resolution: {integrity: sha512-kBXba8DcSrLWHYqopCm2JL90oBy97VdIfHkP1ii7/eHufeEEEk9Zu5Vv/IFQpNzmhEpWszVFVlGvZoI6QJeGzA==}
merge2@1.4.1: merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
@@ -1923,8 +1920,8 @@ packages:
resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==}
engines: {node: ^20.17.0 || >=22.9.0} engines: {node: ^20.17.0 || >=22.9.0}
nanoid@5.1.6: nanoid@5.1.7:
resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==}
engines: {node: ^18 || >=20} engines: {node: ^18 || >=20}
hasBin: true hasBin: true
@@ -2393,8 +2390,8 @@ packages:
zod@4.3.6: zod@4.3.6:
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
zustand@5.0.11: zustand@5.0.12:
resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} resolution: {integrity: sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==}
engines: {node: '>=12.20.0'} engines: {node: '>=12.20.0'}
peerDependencies: peerDependencies:
'@types/react': '>=18.0.0' '@types/react': '>=18.0.0'
@@ -2496,7 +2493,7 @@ snapshots:
'@smithy/util-utf8': 2.3.0 '@smithy/util-utf8': 2.3.0
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/client-s3@3.1009.0': '@aws-sdk/client-s3@3.1011.0':
dependencies: dependencies:
'@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha1-browser': 5.2.0
'@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0
@@ -2505,7 +2502,7 @@ snapshots:
'@aws-sdk/credential-provider-node': 3.972.21 '@aws-sdk/credential-provider-node': 3.972.21
'@aws-sdk/middleware-bucket-endpoint': 3.972.8 '@aws-sdk/middleware-bucket-endpoint': 3.972.8
'@aws-sdk/middleware-expect-continue': 3.972.8 '@aws-sdk/middleware-expect-continue': 3.972.8
'@aws-sdk/middleware-flexible-checksums': 3.973.6 '@aws-sdk/middleware-flexible-checksums': 3.974.0
'@aws-sdk/middleware-host-header': 3.972.8 '@aws-sdk/middleware-host-header': 3.972.8
'@aws-sdk/middleware-location-constraint': 3.972.8 '@aws-sdk/middleware-location-constraint': 3.972.8
'@aws-sdk/middleware-logger': 3.972.8 '@aws-sdk/middleware-logger': 3.972.8
@@ -2698,7 +2695,7 @@ snapshots:
'@smithy/types': 4.13.1 '@smithy/types': 4.13.1
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/middleware-flexible-checksums@3.973.6': '@aws-sdk/middleware-flexible-checksums@3.974.0':
dependencies: dependencies:
'@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32': 5.2.0
'@aws-crypto/crc32c': 5.2.0 '@aws-crypto/crc32c': 5.2.0
@@ -2909,29 +2906,29 @@ snapshots:
dependencies: dependencies:
fetch-event-stream: 0.1.6 fetch-event-stream: 0.1.6
'@inquirer/ansi@2.0.3': {} '@inquirer/ansi@2.0.4': {}
'@inquirer/checkbox@5.1.0(@types/node@25.5.0)': '@inquirer/checkbox@5.1.2(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/ansi': 2.0.3 '@inquirer/ansi': 2.0.4
'@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/core': 11.1.7(@types/node@25.5.0)
'@inquirer/figures': 2.0.3 '@inquirer/figures': 2.0.4
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/confirm@6.0.8(@types/node@25.5.0)': '@inquirer/confirm@6.0.10(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/core': 11.1.7(@types/node@25.5.0)
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/core@11.1.5(@types/node@25.5.0)': '@inquirer/core@11.1.7(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/ansi': 2.0.3 '@inquirer/ansi': 2.0.4
'@inquirer/figures': 2.0.3 '@inquirer/figures': 2.0.4
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
cli-width: 4.1.0 cli-width: 4.1.0
fast-wrap-ansi: 0.2.0 fast-wrap-ansi: 0.2.0
mute-stream: 3.0.0 mute-stream: 3.0.0
@@ -2939,92 +2936,92 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/editor@5.0.8(@types/node@25.5.0)': '@inquirer/editor@5.0.10(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/core': 11.1.7(@types/node@25.5.0)
'@inquirer/external-editor': 2.0.3(@types/node@25.5.0) '@inquirer/external-editor': 2.0.4(@types/node@25.5.0)
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/expand@5.0.8(@types/node@25.5.0)': '@inquirer/expand@5.0.10(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/core': 11.1.7(@types/node@25.5.0)
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/external-editor@2.0.3(@types/node@25.5.0)': '@inquirer/external-editor@2.0.4(@types/node@25.5.0)':
dependencies: dependencies:
chardet: 2.1.1 chardet: 2.1.1
iconv-lite: 0.7.2 iconv-lite: 0.7.2
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/figures@2.0.3': {} '@inquirer/figures@2.0.4': {}
'@inquirer/input@5.0.8(@types/node@25.5.0)': '@inquirer/input@5.0.10(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/core': 11.1.7(@types/node@25.5.0)
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/number@4.0.8(@types/node@25.5.0)': '@inquirer/number@4.0.10(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/core': 11.1.7(@types/node@25.5.0)
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/password@5.0.8(@types/node@25.5.0)': '@inquirer/password@5.0.10(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/ansi': 2.0.3 '@inquirer/ansi': 2.0.4
'@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/core': 11.1.7(@types/node@25.5.0)
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/prompts@8.3.0(@types/node@25.5.0)': '@inquirer/prompts@8.3.2(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/checkbox': 5.1.0(@types/node@25.5.0) '@inquirer/checkbox': 5.1.2(@types/node@25.5.0)
'@inquirer/confirm': 6.0.8(@types/node@25.5.0) '@inquirer/confirm': 6.0.10(@types/node@25.5.0)
'@inquirer/editor': 5.0.8(@types/node@25.5.0) '@inquirer/editor': 5.0.10(@types/node@25.5.0)
'@inquirer/expand': 5.0.8(@types/node@25.5.0) '@inquirer/expand': 5.0.10(@types/node@25.5.0)
'@inquirer/input': 5.0.8(@types/node@25.5.0) '@inquirer/input': 5.0.10(@types/node@25.5.0)
'@inquirer/number': 4.0.8(@types/node@25.5.0) '@inquirer/number': 4.0.10(@types/node@25.5.0)
'@inquirer/password': 5.0.8(@types/node@25.5.0) '@inquirer/password': 5.0.10(@types/node@25.5.0)
'@inquirer/rawlist': 5.2.4(@types/node@25.5.0) '@inquirer/rawlist': 5.2.6(@types/node@25.5.0)
'@inquirer/search': 4.1.4(@types/node@25.5.0) '@inquirer/search': 4.1.6(@types/node@25.5.0)
'@inquirer/select': 5.1.0(@types/node@25.5.0) '@inquirer/select': 5.1.2(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/rawlist@5.2.4(@types/node@25.5.0)': '@inquirer/rawlist@5.2.6(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/core': 11.1.7(@types/node@25.5.0)
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/search@4.1.4(@types/node@25.5.0)': '@inquirer/search@4.1.6(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/core': 11.1.7(@types/node@25.5.0)
'@inquirer/figures': 2.0.3 '@inquirer/figures': 2.0.4
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/select@5.1.0(@types/node@25.5.0)': '@inquirer/select@5.1.2(@types/node@25.5.0)':
dependencies: dependencies:
'@inquirer/ansi': 2.0.3 '@inquirer/ansi': 2.0.4
'@inquirer/core': 11.1.5(@types/node@25.5.0) '@inquirer/core': 11.1.7(@types/node@25.5.0)
'@inquirer/figures': 2.0.3 '@inquirer/figures': 2.0.4
'@inquirer/type': 4.0.3(@types/node@25.5.0) '@inquirer/type': 4.0.4(@types/node@25.5.0)
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
'@inquirer/type@4.0.3(@types/node@25.5.0)': '@inquirer/type@4.0.4(@types/node@25.5.0)':
optionalDependencies: optionalDependencies:
'@types/node': 25.5.0 '@types/node': 25.5.0
@@ -3078,11 +3075,11 @@ snapshots:
es-toolkit: 1.45.1 es-toolkit: 1.45.1
eventemitter3: 5.0.4 eventemitter3: 5.0.4
fuse.js: 7.1.0 fuse.js: 7.1.0
nanoid: 5.1.6 nanoid: 5.1.7
path-browserify-esm: 1.0.6 path-browserify-esm: 1.0.6
sonner: 2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) sonner: 2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
spark-md5: 3.0.2 spark-md5: 3.0.2
zustand: 5.0.11(react@19.2.4) zustand: 5.0.12(react@19.2.4)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/react' - '@types/react'
- immer - immer
@@ -3098,24 +3095,23 @@ snapshots:
'@kevisual/router': 0.0.39 '@kevisual/router': 0.0.39
'@kevisual/use-config': 1.0.30(dotenv@17.3.1) '@kevisual/use-config': 1.0.30(dotenv@17.3.1)
mitt: 3.0.1 mitt: 3.0.1
nanoid: 5.1.6 nanoid: 5.1.7
transitivePeerDependencies: transitivePeerDependencies:
- dotenv - dotenv
- supports-color - supports-color
'@kevisual/auth@2.0.3': {} '@kevisual/auth@2.0.3': {}
'@kevisual/cnb@0.0.46(dotenv@17.3.1)': '@kevisual/cnb@0.0.53(dotenv@17.3.1)':
dependencies: dependencies:
'@kevisual/query': 0.0.53 '@kevisual/query': 0.0.53
'@kevisual/router': 0.1.1 '@kevisual/router': 0.1.5
'@kevisual/use-config': 1.0.30(dotenv@17.3.1) '@kevisual/use-config': 1.0.30(dotenv@17.3.1)
'@opencode-ai/sdk': 1.2.26 '@opencode-ai/sdk': 1.2.27
es-toolkit: 1.45.1 es-toolkit: 1.45.1
nanoid: 5.1.6 nanoid: 5.1.7
unstorage: 1.17.4 unstorage: 1.17.4
ws: '@kevisual/ws@8.19.0' ws: '@kevisual/ws@8.19.0'
zod: 4.3.6
transitivePeerDependencies: transitivePeerDependencies:
- '@azure/app-configuration' - '@azure/app-configuration'
- '@azure/cosmos' - '@azure/cosmos'
@@ -3197,11 +3193,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@kevisual/router@0.1.1': '@kevisual/router@0.1.5':
dependencies:
es-toolkit: 1.45.1
'@kevisual/router@0.1.2':
dependencies: dependencies:
crypto-js: 4.2.0 crypto-js: 4.2.0
es-toolkit: 1.45.1 es-toolkit: 1.45.1
@@ -3224,7 +3216,7 @@ snapshots:
crypto-js: 4.2.0 crypto-js: 4.2.0
dayjs: 1.11.20 dayjs: 1.11.20
eventemitter3: 5.0.4 eventemitter3: 5.0.4
nanoid: 5.1.6 nanoid: 5.1.7
transitivePeerDependencies: transitivePeerDependencies:
- dotenv - dotenv
- supports-color - supports-color
@@ -3249,12 +3241,12 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5 '@nodelib/fs.scandir': 2.1.5
fastq: 1.20.1 fastq: 1.20.1
'@opencode-ai/plugin@1.2.26': '@opencode-ai/plugin@1.2.27':
dependencies: dependencies:
'@opencode-ai/sdk': 1.2.26 '@opencode-ai/sdk': 1.2.27
zod: 4.1.8 zod: 4.1.8
'@opencode-ai/sdk@1.2.26': {} '@opencode-ai/sdk@1.2.27': {}
'@opentelemetry/api@1.9.0': {} '@opentelemetry/api@1.9.0': {}
@@ -4479,7 +4471,7 @@ snapshots:
math-intrinsics@1.1.0: {} math-intrinsics@1.1.0: {}
meilisearch@0.55.0: {} meilisearch@0.56.0: {}
merge2@1.4.1: {} merge2@1.4.1: {}
@@ -4518,7 +4510,7 @@ snapshots:
mute-stream@3.0.0: {} mute-stream@3.0.0: {}
nanoid@5.1.6: {} nanoid@5.1.7: {}
needle@2.4.0(supports-color@10.2.2): needle@2.4.0(supports-color@10.2.2):
dependencies: dependencies:
@@ -4986,6 +4978,6 @@ snapshots:
zod@4.3.6: {} zod@4.3.6: {}
zustand@5.0.11(react@19.2.4): zustand@5.0.12(react@19.2.4):
optionalDependencies: optionalDependencies:
react: 19.2.4 react: 19.2.4

View File

@@ -1,5 +1,6 @@
# 一个简单的cli工具 # 一个简单的cli工具
``` ```
pnpm i
npm i -g @kevisual/cli npm i -g @kevisual/cli
``` ```