@huyooo/ai-chat-tools-local 0.2.22

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.
@@ -0,0 +1 @@
1
+ import{tool as e}from"@huyooo/ai-chat-core";function r(){return e({name:"execute_command",description:"在用户机器上执行 shell 命令并返回输出。不传 cwd 则在用户当前工作目录执行。",parameters:{type:"object",properties:{command:{type:"string",description:"要执行的命令"},cwd:{type:"string",description:"执行命令的目录(不传则使用用户当前工作目录)"}},required:["command"]},execute:async(e,r)=>{const c=e.cwd||r.cwd,t=await r.executeCommand(e.command,c);return t.success?t.output||"执行成功":"操作已取消"===t.error?JSON.stringify({success:!1,error:"操作已取消",cancelled:!0}):`错误: ${t.error}`}})}export{r as executeCommandTool};
@@ -0,0 +1 @@
1
+ import{tool as e}from"@huyooo/ai-chat-core";function r(){return e({name:"get_cwd",description:"获取用户当前工作目录的绝对路径。当你需要知道用户在哪个目录下工作时使用。",parameters:{type:"object",properties:{},required:[]},execute:async(e,r)=>JSON.stringify({cwd:r.cwd})})}export{r as getCwdTool};
@@ -0,0 +1 @@
1
+ import{tool as r}from"@huyooo/ai-chat-core";function e(){return r({name:"get_platform",description:"获取操作系统信息(macOS/Windows/Linux)。当你需要确定使用哪种命令语法时调用(如 ls vs dir)。",parameters:{type:"object",properties:{},required:[]},execute:async()=>{const r=(await import("os")).default.platform(),e="darwin"===r?"macOS":"win32"===r?"Windows":"Linux",t="win32"===r?"powershell":"bash/zsh",o="win32"===r?"\\":"/";return JSON.stringify({platform:r,platformName:e,shell:t,pathSeparator:o})}})}export{e as getPlatformTool};
@@ -0,0 +1,9 @@
1
+ import { ToolPlugin } from '@huyooo/ai-chat-core';
2
+
3
+ /**
4
+ * 执行命令工具(Vite 插件风格)
5
+ */
6
+
7
+ declare function executeCommandTool(): ToolPlugin;
8
+
9
+ export { executeCommandTool };
@@ -0,0 +1 @@
1
+ import{executeCommandTool as o}from"./chunk-IVWWTRRG.js";export{o as executeCommandTool};
@@ -0,0 +1,9 @@
1
+ import { ToolPlugin } from '@huyooo/ai-chat-core';
2
+
3
+ /**
4
+ * 获取当前工作目录工具(Vite 插件风格)
5
+ */
6
+
7
+ declare function getCwdTool(): ToolPlugin;
8
+
9
+ export { getCwdTool };
@@ -0,0 +1 @@
1
+ import{getCwdTool as o}from"./chunk-PS5C76MS.js";export{o as getCwdTool};
@@ -0,0 +1,9 @@
1
+ import { ToolPlugin } from '@huyooo/ai-chat-core';
2
+
3
+ /**
4
+ * 获取平台信息工具(Vite 插件风格)
5
+ */
6
+
7
+ declare function getPlatformTool(): ToolPlugin;
8
+
9
+ export { getPlatformTool };
@@ -0,0 +1 @@
1
+ import{getPlatformTool as o}from"./chunk-QHNODTBS.js";export{o as getPlatformTool};
@@ -0,0 +1,137 @@
1
+ import * as _huyooo_ai_chat_core from '@huyooo/ai-chat-core';
2
+ import { ToolPlugin, Tool } from '@huyooo/ai-chat-core';
3
+ export { executeCommandTool } from './execute-command.js';
4
+ export { getCwdTool } from './get-cwd.js';
5
+ export { getPlatformTool } from './get-platform.js';
6
+ import { GoogleGenAI } from '@google/genai';
7
+
8
+ /**
9
+ * 获取运行环境信息(工作目录 + 平台)
10
+ *
11
+ * 合并了 get_cwd 和 get_platform,减少模型调用次数。
12
+ */
13
+
14
+ declare function getEnvironmentTool(): ToolPlugin;
15
+
16
+ /**
17
+ * update_plan 工具
18
+ *
19
+ * 让模型创建和更新执行计划。通过 resultType: 'plan' 自动渲染为 PlanPart 组件。
20
+ */
21
+
22
+ declare const UPDATE_PLAN_TOOL_NAME = "update_plan";
23
+ declare const UPDATE_PLAN_PROMPT = "## \u8BA1\u5212\u8DDF\u8E2A\uFF08update_plan\uFF09\nupdate_plan \u7528\u4E8E\u5411\u7528\u6237\u5C55\u793A\u4EFB\u52A1\u8FDB\u5EA6\uFF0C\u4E0D\u662F\u7528\u6765\"\u5236\u5B9A\u8BA1\u5212\"\u7684\uFF0C\u800C\u662F\u7528\u6765\"\u540C\u6B65\u8FDB\u5EA6\"\u7684\u3002\n\u7528\u6237\u754C\u9762\u4F1A\u6839\u636E update_plan \u7684\u8FD4\u56DE\u503C\u6E32\u67D3\u4E00\u4E2A\u8FDB\u5EA6\u5361\u7247\uFF0C\u8BA9\u7528\u6237\u5B9E\u65F6\u770B\u5230\u6BCF\u4E2A\u6B65\u9AA4\u7684\u6267\u884C\u72B6\u6001\u3002\n\n\u4F7F\u7528\u89C4\u5219\uFF1A\n- \u4F60\u51B3\u5B9A\u6267\u884C\u591A\u6B65\u9AA4\u4EFB\u52A1\u65F6\uFF0C\u5148\u8C03\u7528 update_plan \u544A\u77E5\u7528\u6237\u4F60\u7684\u6B65\u9AA4\n- \u6BCF\u6267\u884C\u5B8C\u4E00\u4E2A\u6B65\u9AA4\uFF0C\u8C03\u7528 update_plan \u66F4\u65B0\u5BF9\u5E94\u6B65\u9AA4\u7684 status\n- \u4F20\u5165\u5B8C\u6574\u6B65\u9AA4\u5217\u8868\uFF08\u5168\u91CF\u66FF\u6362\uFF09\uFF0C\u683C\u5F0F\uFF1A[{ title, status }]\n- status \u53D6\u503C\uFF1Apending / in_progress / done / failed";
24
+ declare function createUpdatePlanTool(): Tool;
25
+
26
+ /**
27
+ * 分析图片工具(Vite 插件风格)
28
+ */
29
+
30
+ declare function analyzeImageTool(): ToolPlugin;
31
+
32
+ /**
33
+ * 生成图片工具(Vite 插件风格)
34
+ */
35
+
36
+ declare function generateImageTool(): ToolPlugin;
37
+
38
+ /**
39
+ * 分析视频工具(Vite 插件风格)
40
+ */
41
+
42
+ declare function analyzeVideoTool(): ToolPlugin;
43
+
44
+ /**
45
+ * 显示 Toast 通知
46
+ */
47
+ declare function showToastTool(): ToolPlugin;
48
+
49
+ /**
50
+ * 打开确认对话框
51
+ */
52
+ declare function openConfirmDialogTool(): ToolPlugin;
53
+
54
+ /**
55
+ * 打开文件预览(由宿主 UI 消费 ui:file_preview 副作用实现)
56
+ */
57
+ declare function openFilePreviewTool(): ToolPlugin;
58
+
59
+ /**
60
+ * 跳转到指定目录(由宿主 UI 消费 ui:navigate 副作用实现)
61
+ */
62
+ declare function navigateToDirectoryTool(): ToolPlugin;
63
+
64
+ /**
65
+ * UI 动作工具集合(用于快速注入)
66
+ */
67
+ declare const uiActionTools: _huyooo_ai_chat_core.ToolPlugin[];
68
+
69
+ /**
70
+ * 文档搜索工具集成
71
+ *
72
+ * 可选依赖 @huyooo/ai-search
73
+ * 如果未安装,工具会返回友好提示
74
+ *
75
+ * 注意:这个模块使用 eval + require 来避免 tsup 打包时解析依赖
76
+ */
77
+
78
+ /**
79
+ * 搜索工具配置
80
+ */
81
+ interface SearchToolsOptions {
82
+ /** 搜索数据存储目录 */
83
+ dataDir?: string;
84
+ /** 默认索引目录(首次使用时自动索引) */
85
+ defaultDirectories?: string[];
86
+ /** 是否在初始化时自动索引 */
87
+ autoIndex?: boolean;
88
+ }
89
+ /**
90
+ * 创建文档搜索工具
91
+ *
92
+ * 如果 @huyooo/ai-search 未安装,返回占位工具(提示用户安装)
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * import { createDocumentSearchTools } from '@huyooo/ai-chat-tools-local';
97
+ *
98
+ * const searchTools = await createDocumentSearchTools({
99
+ * dataDir: './.search-data',
100
+ * defaultDirectories: ['~/Documents'],
101
+ * });
102
+ *
103
+ * const agent = new HybridAgent({
104
+ * ...config,
105
+ * tools: [...otherTools, ...searchTools],
106
+ * });
107
+ * ```
108
+ */
109
+ declare function createDocumentSearchTools(options?: SearchToolsOptions): Promise<Tool[]>;
110
+ /**
111
+ * 获取搜索插件实例(高级用法)
112
+ */
113
+ declare function getDocumentSearchInstance(dataDir?: string, workspace?: string): Promise<{
114
+ tools: Tool[];
115
+ [key: string]: unknown;
116
+ } | null>;
117
+
118
+ /**
119
+ * Gemini 媒体处理模块
120
+ *
121
+ * 负责图片分析、图片生成、视频分析
122
+ */
123
+
124
+ /**
125
+ * 分析图片
126
+ */
127
+ declare function analyzeImage(geminiClient: GoogleGenAI, imagePath: string, question?: string, signal?: AbortSignal): Promise<string>;
128
+ /**
129
+ * 生成图片
130
+ */
131
+ declare function generateImage(geminiClient: GoogleGenAI, cwd: string, prompt: string, outputPath?: string, signal?: AbortSignal): Promise<string>;
132
+ /**
133
+ * 分析视频
134
+ */
135
+ declare function analyzeVideo(geminiClient: GoogleGenAI, videoPath: string, question?: string, signal?: AbortSignal): Promise<string>;
136
+
137
+ export { type SearchToolsOptions, UPDATE_PLAN_PROMPT, UPDATE_PLAN_TOOL_NAME, analyzeImage, analyzeImageTool, analyzeVideo, analyzeVideoTool, createDocumentSearchTools, createUpdatePlanTool, generateImage, generateImageTool, getDocumentSearchInstance, getEnvironmentTool, navigateToDirectoryTool, openConfirmDialogTool, openFilePreviewTool, showToastTool, uiActionTools };
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ import{executeCommandTool as e}from"./chunk-IVWWTRRG.js";import{getCwdTool as t}from"./chunk-PS5C76MS.js";import{getPlatformTool as i}from"./chunk-QHNODTBS.js";import{tool as r}from"@huyooo/ai-chat-core";function n(){return r({name:"get_environment",description:"获取当前运行环境信息,包括工作目录和操作系统。执行目录相关命令前先调用此工具确认环境。因为用户可能切换了工作目录,所以每次调用都要确认。",parameters:{type:"object",properties:{},required:[]},execute:async(e,t)=>{const i=(await import("os")).default.platform(),r="darwin"===i?"macOS":"win32"===i?"Windows":"Linux";return JSON.stringify({cwd:t.cwd,platform:r,shell:"win32"===i?"powershell":"bash/zsh"})}})}import{DebugLogger as s}from"@huyooo/ai-chat-core";var o=s.module("UpdatePlan"),a="update_plan",c='## 计划跟踪(update_plan)\nupdate_plan 用于向用户展示任务进度,不是用来"制定计划"的,而是用来"同步进度"的。\n用户界面会根据 update_plan 的返回值渲染一个进度卡片,让用户实时看到每个步骤的执行状态。\n\n使用规则:\n- 你决定执行多步骤任务时,先调用 update_plan 告知用户你的步骤\n- 每执行完一个步骤,调用 update_plan 更新对应步骤的 status\n- 传入完整步骤列表(全量替换),格式:[{ title, status }]\n- status 取值:pending / in_progress / done / failed',p=["pending","in_progress","done","failed"];function u(e,t){if("string"==typeof e){const r=/[✓✅✔]/.test(i=e)?"done":/[❌✖]/.test(i)?"failed":"pending",n=function(e){return e.replace(/[✓✅✔❌✖]/g,"").replace(/^\s*\d+[.)、]\s*/,"").trim()}(e);return n?{id:`step-${t+1}`,title:n,status:r}:null}var i,r;if("object"!=typeof(r=e)||null===r)return null;const n=e,s="string"==typeof n.id&&n.id.trim()?n.id.trim():`step-${t+1}`,o=("string"==typeof n.title?n.title:"string"==typeof n.description?n.description:"").trim(),a=function(e){const t=String(e??"").trim().toLowerCase();return p.includes(t)?t:"pending"}(n.status);return o?{id:s,title:o,status:a}:null}function d(){return{name:a,description:"向用户界面同步任务执行进度。调用后用户会看到一个进度卡片,显示每个步骤的当前状态。每次传入完整的步骤列表(全量替换)。",parameters:{type:"object",properties:{steps:{type:"array",description:"完整的步骤列表。每个步骤包含描述。",items:{type:"object",properties:{title:{type:"string",description:"步骤的简短描述"},status:{type:"string",enum:["pending","in_progress","done","failed"],description:"当前状态:pending=待执行, in_progress=执行中, done=已完成, failed=失败"}},required:["title","status"]}}},required:["steps"]},resultType:"plan",execute:async e=>{o.debug("收到 args:",JSON.stringify(e));const t=(Array.isArray(e.steps)?e.steps:[]).map((e,t)=>u(e,t)).filter(e=>null!==e),i=t.length>0&&t.every(e=>"done"===e.status),r={steps:t,status:i?"done":"running"};return o.debug("输出:",JSON.stringify(r)),JSON.stringify(r)}}}import{tool as m}from"@huyooo/ai-chat-core";var g="gemini-2.0-flash";async function l(e,t,i,r){try{if(r?.aborted)return JSON.stringify({success:!1,error:"操作已取消",cancelled:!0});const n=await import("fs/promises"),s=await import("path"),o=(await n.readFile(t)).toString("base64"),a=function(e){return{".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".webp":"image/webp"}[e]||"image/jpeg"}(s.extname(t).toLowerCase());return(await e.models.generateContent({model:g,contents:[{role:"user",parts:[{text:i||"请详细描述这张图片的内容"},{inlineData:{mimeType:a,data:o}}]}],config:{abortSignal:r}})).text||"无法分析图片"}catch(e){return r?.aborted?JSON.stringify({success:!1,error:"操作已取消",cancelled:!0}):`图片分析失败: ${e}`}}async function f(e,t,i,r,n){try{if(n?.aborted)return JSON.stringify({success:!1,error:"操作已取消"});const s=await e.models.generateContent({model:"gemini-3-pro-image-preview",contents:[{role:"user",parts:[{text:i}]}],config:{abortSignal:n}});for(const e of s.candidates?.[0]?.content?.parts||[])if(e.inlineData){const i=Buffer.from(e.inlineData.data,"base64"),n=e.inlineData.mimeType||"image/png",s="image/jpeg"===n?".jpg":"image/webp"===n?".webp":".png",o=await import("fs/promises"),a=r||`${t}/generated_${Date.now()}${s}`;return await o.writeFile(a,i),JSON.stringify({success:!0,path:a,format:n})}return JSON.stringify({success:!1,error:"图片生成失败"})}catch(e){return n?.aborted?JSON.stringify({success:!1,error:"操作已取消",cancelled:!0}):JSON.stringify({success:!1,error:`图片生成失败: ${e}`})}}async function y(e,t,i,r){try{if(r?.aborted)return JSON.stringify({success:!1,error:"操作已取消",cancelled:!0});const n=await import("fs/promises"),s=await import("path"),o=(await n.readFile(t)).toString("base64"),a=function(e){return{".mp4":"video/mp4",".mov":"video/quicktime",".avi":"video/x-msvideo",".webm":"video/webm"}[e]||"video/mp4"}(s.extname(t).toLowerCase());return(await e.models.generateContent({model:g,contents:[{role:"user",parts:[{text:i||"请详细描述这个视频的内容"},{inlineData:{mimeType:a,data:o}}]}],config:{abortSignal:r}})).text||"无法分析视频"}catch(e){return r?.aborted?JSON.stringify({success:!1,error:"操作已取消",cancelled:!0}):`视频分析失败: ${e}`}}function h(){return m({name:"analyze_image",description:"分析图片内容(识别物体、场景、文字等)",parameters:{type:"object",properties:{imagePath:{type:"string",description:"图片文件路径"},question:{type:"string",description:"关于图片的问题(可选)"}},required:["imagePath"]},execute:async(e,t)=>t.geminiClient?await l(t.geminiClient,e.imagePath,e.question,t.signal):"错误: 未配置 Gemini API Key,无法使用图片分析功能"})}import{tool as w}from"@huyooo/ai-chat-core";function b(){return w({name:"generate_image",description:"根据文字描述生成图片并保存到本地。返回保存路径。",parameters:{type:"object",properties:{prompt:{type:"string",description:"图片描述,使用详细的英文描述效果更好"},outputPath:{type:"string",description:"保存路径(可选)"}},required:["prompt"]},sideEffects:[{type:"notification",success:!0,message:"🎨 图片生成完成"}],execute:async(e,t)=>t.geminiClient?await f(t.geminiClient,t.cwd,e.prompt,e.outputPath,t.signal):"错误: 未配置 Gemini API Key,无法使用图片生成功能"})}import{tool as v}from"@huyooo/ai-chat-core";function S(){return v({name:"analyze_video",description:"分析视频内容(识别场景、动作、物体等)",parameters:{type:"object",properties:{videoPath:{type:"string",description:"视频文件路径"},question:{type:"string",description:"关于视频的问题(可选)"}},required:["videoPath"]},execute:async(e,t)=>t.geminiClient?await y(t.geminiClient,e.videoPath,e.question,t.signal):"错误: 未配置 Gemini API Key,无法使用视频分析功能"})}import{tool as x}from"@huyooo/ai-chat-core";function _(){return x({name:"show_toast",description:"在用户界面上显示一条Toast 通知消息,用于告知用户操作结果或重要提示信息,消息会在几秒后自动消失",parameters:{type:"object",properties:{message:{type:"string",description:"要显示给用户的通知内容"}},required:["message"]},execute:async e=>{const t=function(e,t){const i=e[t];return"string"==typeof i?i:null}(e,"message");if(!t)throw new Error("参数错误:message 必须是 string");return{result:JSON.stringify({success:!0}),sideEffects:[{type:"notification",success:!0,message:t}]}}})}import{tool as j}from"@huyooo/ai-chat-core";function N(e,t){const i=e[t];return"string"==typeof i?i:null}function O(){return j({name:"open_confirm_dialog",description:"在用户界面上弹出一个模态确认对话框。",parameters:{type:"object",properties:{title:{type:"string",description:"对话框标题,简要说明确认的操作"},message:{type:"string",description:"详细描述需要用户确认的内容"},confirmText:{type:"string",description:'确认按钮文字,默认为"确认"'},cancelText:{type:"string",description:'取消按钮文字,默认为"取消"'}},required:["title","message"]},execute:async e=>{const t=N(e,"title"),i=N(e,"message");if(!t)throw new Error("参数错误:title 必须是 string");if(!i)throw new Error("参数错误:message 必须是 string");const r=N(e,"confirmText")??"确认",n=N(e,"cancelText")??"取消";return{result:JSON.stringify({success:!0}),sideEffects:[{type:"ui:confirm_dialog",success:!0,data:{title:t,message:i,confirmText:r,cancelText:n}}]}}})}import{tool as T}from"@huyooo/ai-chat-core";function q(){return T({name:"open_file_preview",description:"在用户界面上打开文件预览窗口,让用户查看指定文件的内容(宿主需处理 ui:file_preview sideEffect)。",parameters:{type:"object",properties:{path:{type:"string",description:"要预览的文件的完整路径"},mediaType:{type:"string",description:"预览类型(必填):image/video/audio。宿主不会再根据后缀推断。",enum:["image","video","audio"]}},required:["path","mediaType"]},execute:async e=>{const t=function(e,t){const i=e[t];return"string"==typeof i?i:null}(e,"path");if(!t)throw new Error("参数错误:path 必须是 string");const i=function(e,t){const i=e[t];return"image"===i||"video"===i||"audio"===i?i:null}(e,"mediaType");if(!i)throw new Error('参数错误:mediaType 必须是 "image" | "video" | "audio"');return{result:JSON.stringify({success:!0,path:t,mediaType:i}),sideEffects:[{type:"ui:file_preview",success:!0,data:{path:t,mediaType:i}}]}}})}import{tool as J}from"@huyooo/ai-chat-core";function P(){return J({name:"navigate_to_directory",description:"控制用户界面左侧的文件浏览器跳转到指定目录,让用户可以直接看到该目录下的文件列表",parameters:{type:"object",properties:{path:{type:"string",description:"要跳转到的目录的完整路径"}},required:["path"]},execute:async e=>{const t=function(e,t){const i=e[t];return"string"==typeof i?i:null}(e,"path");if(!t)throw new Error("参数错误:path 必须是 string");return{result:JSON.stringify({success:!0,path:t}),sideEffects:[{type:"ui:navigate",success:!0,data:{path:t}}]}}})}var C=[_(),O(),q(),P()],E=null;async function D(){if(E)return E;try{const e=new Function("moduleName","return import(moduleName)"),t=await e("@huyooo/ai-search");return E=t}catch{return null}}async function $(e){const t=await D();if(!t)return[{name:"search_local_documents",description:"搜索本地文档(需要安装 @huyooo/ai-search)",parameters:{type:"object",properties:{query:{type:"string",description:"搜索内容"}},required:["query"]},execute:async()=>JSON.stringify({error:"文档搜索功能未启用",solution:"请安装 @huyooo/ai-search: npm install @huyooo/ai-search"})}];const i=e?.dataDir||"./.search-data";return(await t.searchPlugin({dataDir:i,workspace:e?.autoIndex&&e?.defaultDirectories?.length?k(e.defaultDirectories[0]):void 0})).tools}function k(e){return e.startsWith("~")?e.replace("~",process.env.HOME||""):e}async function A(e="./.search-data",t){const i=await D();return i?await i.searchPlugin({dataDir:e,workspace:t}):null}export{c as UPDATE_PLAN_PROMPT,a as UPDATE_PLAN_TOOL_NAME,l as analyzeImage,h as analyzeImageTool,y as analyzeVideo,S as analyzeVideoTool,$ as createDocumentSearchTools,d as createUpdatePlanTool,e as executeCommandTool,f as generateImage,b as generateImageTool,t as getCwdTool,A as getDocumentSearchInstance,n as getEnvironmentTool,i as getPlatformTool,P as navigateToDirectoryTool,O as openConfirmDialogTool,q as openFilePreviewTool,_ as showToastTool,C as uiActionTools};
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@huyooo/ai-chat-tools-local",
3
+ "version": "0.2.22",
4
+ "description": "AI Chat 本地工具集(execute-command, get-cwd, ui-actions 等需要本地环境的工具)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "development": "./src/index.ts",
13
+ "import": "./dist/index.js"
14
+ },
15
+ "./get-cwd": {
16
+ "types": "./dist/get-cwd.d.ts",
17
+ "import": "./dist/get-cwd.js"
18
+ },
19
+ "./get-platform": {
20
+ "types": "./dist/get-platform.d.ts",
21
+ "import": "./dist/get-platform.js"
22
+ },
23
+ "./execute-command": {
24
+ "types": "./dist/execute-command.d.ts",
25
+ "import": "./dist/execute-command.js"
26
+ }
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "dev": "tsup --watch",
34
+ "typecheck": "tsc --noEmit",
35
+ "clean": "rm -rf dist",
36
+ "test": "vitest run",
37
+ "test:watch": "vitest"
38
+ },
39
+ "peerDependencies": {
40
+ "@huyooo/ai-chat-core": ">=0.3.0"
41
+ },
42
+ "dependencies": {
43
+ "@google/genai": "^1.0.0"
44
+ },
45
+ "devDependencies": {
46
+ "@huyooo/ai-chat-core": "*",
47
+ "@types/node": "^22.0.0",
48
+ "tsup": "^8.0.0",
49
+ "typescript": "^5.0.0",
50
+ "vitest": "^4.0.18"
51
+ },
52
+ "keywords": [
53
+ "ai",
54
+ "chat",
55
+ "tools",
56
+ "local",
57
+ "execute-command",
58
+ "ui-actions"
59
+ ],
60
+ "author": "huyooo",
61
+ "license": "SEE LICENSE IN LICENSE",
62
+ "publishConfig": {
63
+ "access": "public"
64
+ }
65
+ }