filecat 6.48.1 → 6.49.0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "filecat",
3
- "version": "6.48.1",
3
+ "version": "6.49.0",
4
4
  "description": "File browser and server manager",
5
5
  "author": "xiaobaidadada",
6
6
  "repository": {
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunkfilecat=self.webpackChunkfilecat||[]).push([[5761,6010],{83277(e,t,n){n.d(t,{$j:()=>a,Lv:()=>o,qq:()=>i});class s{options_agent_url_list;options_agent_key_list;options_agent_model_list;options_local_file_path_prompt_list}class o{token;open=!1;note;index;url;model;request_type;json_params;sys_prompt;dotenv="";tool_mode=!1;show_options;static get_label_by_v(e,t){if(!e||!t?.length)return e;for(const n of t)if(n.value===e)return n.label;return e}static have_label_by_v(e,t){if(!e||!t?.length)return!1;for(const n of t)if(n.value===e)return!0;return!1}}class i extends s{tool_error_max=50;tool_call_max=300;allow_exec_cmd_directly=!1;proxy_url;open_pick_model;max_recent_messages=12;compress_message_count=16;max_tool_content_chars=200}const l=JSON.stringify({stream:!0,thinking:{type:"disabled"}});function a(e){return"string"==typeof e?e:Array.isArray(e)?e.map(e=>"text"===e.type?e.text:"[图片]").join("\n"):""}n.d(t,["CP",0,'\n\n# 工具报错最大尝试次数\ntool_error_max=50\n# 聊天循环最大次数\ntool_call_max=300\n# 是否允许AI直接执行命令而不需要用户确认,默认为false,需要用户手动确认,如果使用 workflow 这里等价于为 true\nallow_exec_cmd_directly=false\n\n# 可选的代理 url,如果指定了所有访问大模型的请求将会走代理\n#proxy_url=\n\n# 可选的多个url 以数组分割\n# options_agent_url_list=[{"value":"http://..","label":"openai"}]\n\n# 可选的多个 key\n# options_agent_key_list=[{"value":"sh-aaa","label":"option1"}]\n\n# 可选的多个 model\n# options_agent_model_list=[{"value":"gpt-5.5","label":"gpt"}]\n\n# 存放本地的 prompt 文件 用于每次聊天的时候自动读取并加载\n# options_local_file_path_prompt_list=["/prompt/a.txt"]\n\n# 开启切换模型 ,开启以后,你可以自己写 prompt 提供多个模型让 ai 自己根据每次聊天切换下一步调用其他模型的次数\n# open_pick_model=false\n\n# 压缩后仍然完整保留的最近消息数\nmax_recent_messages=12\n# 当单个会话累计消息条数超过该值时,触发历史消息裁剪\ncompress_message_count=16\n# 历史消息中 tool 输出的最大字符数,只保留调用形式让 AI 知道调用了就行\nmax_tool_content_chars=200\n',"cL",0,l])},77481(e,t,n){n.d(t,{S:()=>l,X:()=>i});var s=n(96540),o=n(74848);function i(e){const[t,n]=s.useState([]);return(0,s.useEffect)(()=>{e.children?n(Array.isArray(e.children)?e.children:[e.children]):n(e.rows)},[e.rows,e.children]),(0,o.jsxs)("table",{children:[(0,o.jsx)("thead",{children:(0,o.jsx)("tr",{children:e.headers?.map((e,t)=>(0,o.jsx)("th",{children:e},t))})}),(0,o.jsx)("tbody",{children:t.map((t,n)=>(0,o.jsx)("tr",{onContextMenu:()=>{e.handleContextMenu&&e.handleContextMenu(t)},children:t.map((n,s)=>(0,o.jsx)("td",{style:{width:e.width??"auto"},className:s===t.length-1?"small":"",children:n},s))},n))})]})}function l(e){return(0,o.jsx)("div",{style:{display:e.isFlex?"flex":"block"},children:e.columns.map((e,t)=>(0,o.jsx)("div",{children:e},t))})}},1038(e,t,n){n.r(t),n.d(t,{default:()=>I});var s=n(34899),o=n(96540),i=n(85997),l=n(57952),a=n(34843),r=n(82893),c=n(75725),d=n(77481),p=n(61443),_=n(70447),m=n(34299),u=n(74848);var h=n(14284),x=n(53459),j=n(62042),v=n(7523),g=n(78247),f=n(23430),y=n(76213),w=n(14944),C=n(92275),k=n(88815),b=n(45907),A=n(12721),S=n(24659),$=n(83277);function I(){const{t:e}=(0,s.Bd)(),{initUserInfo:t}=(0,o.useContext)(v.F),n=[e("编号"),e("url"),e("model类型"),e("是否开启"),e("key"),"model",e("成为tool"),e("更多属性"),e("备注")],I=function(){const{t:e}=(0,s.Bd)();return[{value:"completions",label:e("文本对话")},{value:"images",label:e("图片生成")}]}(),K=[e("编号"),e("本地目录"),e("自动加载"),e("备注")],[N,P]=(0,o.useState)([]),[O,X]=(0,o.useState)([]),[M,V]=(0,o.useState)([]),[L,F]=(0,o.useState)(null),H=(0,o.useRef)(),Y=(0,o.useRef)(!1),q=(0,o.useRef)(!1),[G,z]=(0,o.useState)([]),[B,R]=(0,o.useState)(!1),[T,D]=(0,a.fp)(r.AG.prompt_card),[E,J]=(0,a.fp)(r.AG.user_base_info),[W,Z]=(0,o.useState)(!1),U=M.filter(e=>"http"!==(e.transport??"stdio")),Q=M.filter(e=>"http"===e.transport),ee=[e("编号"),e("名称"),e("是否开启"),"command","args","cwd",e("tools|env"),e("备注")],te=[e("编号"),e("名称"),e("是否开启"),e("endpoint"),e("tools|headers"),e("备注")],ne=[e("编号"),e("提示词"),e("备注")],[se,oe]=(0,o.useState)([]),[ie,le]=(0,o.useState)(!1),ae=function(){const[e,t]=(0,a.fp)(r.AG.prompt_card);return e=>{t({open:!0,title:"信息",context_div:(0,u.jsx)("div",{children:(0,u.jsx)(m.default,{context:e})})})}}(),{check_user_auth:re}=(0,g.MH)(),[ce,de]=(0,a.fp)(r.AG.editorSetting),pe=(0,y.Zp)(),_e=(0,b.y)(),me=(0,S.K)(),ue=async()=>{const e=await h.jV.get("docs_on_get");e.code===x.m.Success&&Z(e.data)};(0,o.useEffect)(()=>{(async()=>{const e=await h.XO.get("ai_agent_setting");e.code===x.m.Success&&P(e.data.models),await w.ws.addMsg(C.HK.ai_load_info,e=>{F(e.context)});const t=await w.ws.sendData(C.HK.ai_load_info,{});t?.context&&F(t.context);const n=await h.XO.get("ai_docs_setting");n.code===x.m.Success&&(H.current=n.data.param,n.data.list?.length&&X(n.data.list));const s=await h.XO.get("ai_mcp_setting");s.code===x.m.Success&&V(s.data.list??[]),await fe(),ue();const o=await h.XO.get("ai_system_prompts");o.code===x.m.Success&&oe(o.data??[]);const i=await h.XO.get("ai_long_term_memory_setting");i.code===x.m.Success&&le(i.data?.open??!1)})()},[]);const he=(e="stdio")=>{const t="http"===e?{name:"",open:!1,note:"",transport:"http",endpoint:"",headers:"",stream:!1,timeout_ms:1e4}:{name:"",open:!1,command:"",args:"",cwd:"",env:"",note:"",transport:"stdio",timeout_ms:1e4};V([...M,t]),Y.current=!0},xe=e=>{const t=M.indexOf(e);t<0||(M.splice(t,1),V([...M]),Y.current=!0)},je=e=>{V([...M,{...e,open:!1}]),Y.current=!0},ve=async e=>{for(let e=0;e<N.length;e++)N[e].index=e;(await h.XO.post("ai_agent_setting/save",{models:e??N})).code===x.m.Success&&(0,j.SK)("保存成功")},ge=async e=>{for(let e=0;e<M.length;e++)M[e].index=e;(await h.XO.post("ai_mcp_setting/save",{list:e??M})).code===x.m.Success&&((0,j.SK)("保存成功"),Y.current=!1,await fe())},fe=async()=>{const e=await h.XO.get("ai_mcp_tools");return e.code===x.m.Success?(z(e.data??[]),e.data??[]):[]},ye=async e=>{R(!0);try{const t=await h.XO.post("ai_mcp_tools/reload",{index:e});if(t.code===x.m.Success)return await fe(),(0,j.SK)("MCP工具加载成功"),t.data??null}finally{R(!1)}return null},we=async(t,n,s,o)=>{const i=o??G.find(e=>e.index===n)??{index:n,key:`${n}`,name:t.name??"",note:t.note,transport:t.transport??"stdio",open:!!t.open,loaded:!1,tool_count:0,tools:[]},l=(i.tools??[]).map(t=>({id:t.runtime_name,title:t.tool_name,subtitle:t.description||e("无描述"),detail:t.display_name,meta:t.runtime_name}));D({open:!0,title:`${t.name||t.note||n} MCP工具`,context_div:(0,u.jsx)(A.O,{title:`${t.name||t.note||n} MCP工具`,subtitle:`${i.transport??"stdio"} | ${i.open?e("是"):e("否")} | ${i.loaded?"loaded":"idle"} | ${i.tool_count} tools`,pages:l,initialPageId:s,onRefresh:async()=>{const e=await ye(n);e&&await we(t,n,s,e)},renderPage:t=>{if(!t)return(0,u.jsx)("div",{className:"prompt-switch-page__empty",children:e("暂无工具")});const n=i.tools?.find(e=>e.runtime_name===t.id);return n?(0,u.jsxs)("div",{className:"prompt-switch-page__detail",children:[(0,u.jsx)("div",{className:"prompt-switch-page__detail-title",children:n.display_name}),(0,u.jsx)("div",{className:"prompt-switch-page__detail-desc",children:n.description||e("无描述")}),(0,u.jsxs)("div",{className:"prompt-switch-page__detail-row",children:[(0,u.jsx)("strong",{children:"runtime:"})," ",n.runtime_name]}),(0,u.jsxs)("div",{children:[(0,u.jsx)("strong",{children:"schema:"}),(0,u.jsx)("pre",{className:"prompt-switch-page__schema",children:JSON.stringify(n.input_schema??{},null,2)})]})]}):(0,u.jsx)("div",{className:"prompt-switch-page__empty",children:e("暂无工具")})}}),cancel:()=>D({open:!1})})},Ce=async e=>{for(let e=0;e<N.length;e++)N[e].index=e;let t={list:O,docs_update_tag:q.current};null!=e&&(t={param:e}),q.current=!1;(await h.XO.post("ai_docs_setting_save",t)).code===x.m.Success&&(0,j.SK)("保存成功")},ke=async()=>{for(let e=0;e<se.length;e++)se[e].index=e;(await h.XO.post("ai_system_prompts/save",{list:se})).code===x.m.Success&&(0,j.SK)("保存成功")};return(0,u.jsxs)("div",{children:[(0,u.jsx)(l.A,{children:re(f.oV.ai_agent_setting)&&(0,u.jsx)(i.rA,{icon:"arrow_back",title:e("上一页"),onClick:()=>{pe(-1)}})}),(0,u.jsx)(c.jW,{isFull:!0,more:!0,children:(0,u.jsx)(c.NN,{children:(0,u.jsxs)(c.xh,{children:[(0,u.jsx)(c.fI,{children:(0,u.jsx)(c.VP,{widthPer:100,children:(0,u.jsx)(_.uF,{self_title:(0,u.jsxs)("span",{className:" div-row ",children:[(0,u.jsx)("h2",{children:e("Model")+" "+e("设置")})," ",(0,u.jsx)(i.rA,{icon:"info",onClick:()=>{ae('\n1. 只能使用符合openai风格的ai接口,接口不能只填域名,而是类似 https://ark.cn-beijing.volces.com/api/v3/chat/completions 这样的全路径链接聊天url\n2. 对话的历史越长,消耗的大模型token费用越贵,目前不具备长期记忆简化能力,可以在系统prompt中设置一下让AI回答的简洁一点,节省tokens\n3. model请求参数json编写,里面只能编写json,来用于编写openai风格ai支持的属性,比如 temperature thinking(豆包的深度思考开关)等\n4. 可以在model请求参数中开启 "stream":true 提高响应速度\n5. 深度思考现在会影响输出速度,建议设置`{\n "thinking" : { \n "type":"disabled"\n }\n}`关闭(豆包例子)\n6. 使用AI功能来查询服务器信息,那么AI就需要能够之一些命令,需要先在用户设置中,给用户设置命令权限,建议设置 `*` 允许全部命令,在设置禁止不能执行的危险命令。\n7. 成为tool 后,该模型将会作为一个工具被加载,可以实现不同模型作为不能角色的能力。\n8. model 类型是必须要设置的,因为不同类型的 model 接口格式不同。\n')},title:"信息"})]}),titleCom:(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"add",title:e("添加"),onClick:()=>{P([...N,{note:"",open:!1,path:"",dotenv:$.CP,json_params:$.cL}])}}),(0,u.jsx)(i.rA,{icon:"save",title:e("保存"),onClick:async()=>{await ve()}})]}),children:(0,u.jsx)(d.X,{headers:n,rows:N.map((t,n)=>{const s=[(0,u.jsx)("div",{children:n}),(0,u.jsx)(p.Sm,{value:$.Lv.get_label_by_v(t.url,t.show_options?.options_agent_url_list),options:t.show_options?.options_agent_url_list,handleInputChange:e=>{t.url=e},no_border:!0}),(0,u.jsx)(p.l6,{value:t.request_type??"completions",onChange:e=>{t.request_type=e,P([...N])},options:I,no_border:!0}),(0,u.jsx)(p.l6,{value:t.open,onChange:e=>{((e,t,n)=>{const s=[];for(let e=0;e<N.length;e++)N[e].open=e===n&&t,s.push(N[e]);P(s)})(0,e,n)},options:me,no_border:!0}),(0,u.jsx)(p.Sm,{type:$.Lv.have_label_by_v(t.token,t.show_options?.options_agent_key_list)?null:"password",value:$.Lv.get_label_by_v(t.token,t.show_options?.options_agent_key_list),options:t.show_options?.options_agent_key_list,handleInputChange:e=>{t.token=e},no_border:!0}),(0,u.jsx)(p.Sm,{value:$.Lv.get_label_by_v(t.model,t.show_options?.options_agent_model_list),options:t.show_options?.options_agent_model_list,handleInputChange:e=>{t.model=e},no_border:!0}),(0,u.jsx)(p.l6,{value:t.tool_mode,onChange:n=>{t.open&&!0===n?(0,j.zN)(e("开启状态不能成为tool")):(t.tool_mode=n,P([...N]))},options:me,no_border:!0}),(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"short_text",title:"prompt",onClick:()=>{g.xK.set_value_temp(N[n].sys_prompt??""),de({model:"ace/mode/text",open:!0,fileName:"",save:async e=>{N[n].sys_prompt=e,P(N),g.xK.set_value_temp(""),ve(N)}})}}),(0,u.jsx)(i.rA,{icon:"edit_attributes",title:"model请求参数json编写",onClick:()=>{g.xK.set_value_temp(N[n].json_params),de({model:"ace/mode/json",open:!0,fileName:"",save:async e=>{N[n].json_params=e,P(N),g.xK.set_value_temp(""),ve(N)},can_format:!0})}}),(0,u.jsx)(i.rA,{icon:"settings",title:"额外参数设置",onClick:()=>{g.xK.set_value_temp(N[n].dotenv),de({model:"ace/mode/ini",open:!0,fileName:"",save:async e=>{N[n].dotenv=e,P(N),g.xK.set_value_temp(""),ve(N)}})}})]}),(0,u.jsx)(p.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{N.splice(e,1),P([...N])})(n)}),(0,u.jsx)(i.rA,{icon:"copy_all",title:e("复制"),onClick:()=>(e=>{P([...N,{...N[e],open:!1}])})(n)})]})];return s}),width:"10rem"})})})}),(0,u.jsx)(c.fI,{children:(0,u.jsx)(c.VP,{widthPer:70,children:(0,u.jsx)(_.uF,{self_title:(0,u.jsxs)("span",{className:" div-row ",children:[(0,u.jsxs)("h2",{children:[e("MCP")+" "+e("设置")," - stdio"]})," ",(0,u.jsx)(i.rA,{icon:"info",onClick:()=>{ae("\n1. 这里配置的是 MCP Client 启动参数,当前实现的是 stdio 模式,也就是通过 command + args 启动本地 MCP Server\n2. 例如可以填 npx / uvx / python 等命令,再配合对应的 MCP server 包参数\n3. 保存后会自动重新加载 MCP 工具,agent 聊天时会把这些工具一起带给模型\n4. 建议把 cwd 配到具体项目目录,避免 server 在错误目录里运行\n")},title:"信息"})]}),titleCom:(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"add",title:e("添加"),onClick:()=>he("stdio")}),(0,u.jsx)(i.rA,{icon:"save",title:e("保存"),onClick:()=>{ge()}})]}),children:(0,u.jsx)(d.X,{headers:ee,rows:U.map((t,n)=>{const s=M.indexOf(t);return[(0,u.jsx)("div",{children:n}),(0,u.jsx)(p.Sm,{value:t.name,handleInputChange:e=>{t.name=e,Y.current=!0},no_border:!0}),(0,u.jsx)(p.l6,{value:t.open,onChange:e=>{t.open=e,V([...M]),Y.current=!0},options:me,no_border:!0}),(0,u.jsx)(p.Sm,{value:t.command,handleInputChange:e=>{t.command=e,Y.current=!0},no_border:!0}),(0,u.jsx)(p.Sm,{value:t.args,handleInputChange:e=>{t.args=e,Y.current=!0},no_border:!0}),(0,u.jsx)(p.Sm,{value:t.cwd,handleInputChange:e=>{t.cwd=e,Y.current=!0},no_border:!0}),(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"visibility",title:"查看工具",onClick:()=>{we(t,s)}}),(0,u.jsx)(i.rA,{icon:"settings",title:"env",onClick:()=>{g.xK.set_value_temp(t.env??""),de({model:"ace/mode/ini",open:!0,fileName:"",save:async e=>{t.env=e,V([...M]),g.xK.set_value_temp(""),Y.current=!0,ge()}})}})]}),(0,u.jsx)(p.Sm,{value:t.note,handleInputChange:e=>{t.note=e,Y.current=!0},no_border:!0}),(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"delete",title:e("删除"),onClick:()=>xe(t)}),(0,u.jsx)(i.rA,{icon:"copy_all",title:e("复制"),onClick:()=>je(t)})]})]}),width:"10rem"})})})}),(0,u.jsx)(c.fI,{children:(0,u.jsxs)(c.VP,{widthPer:70,children:[(0,u.jsx)(_.uF,{self_title:(0,u.jsxs)("span",{className:" div-row ",children:[(0,u.jsxs)("h2",{children:[e("MCP")+" "+e("设置")," - HTTP"]})," "]}),titleCom:(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"add",title:e("添加"),onClick:()=>he("http")}),(0,u.jsx)(i.rA,{icon:"save",title:e("保存"),onClick:()=>{ge()}})]}),children:(0,u.jsx)(d.X,{headers:te,rows:Q.map((t,n)=>{const s=M.indexOf(t);return[(0,u.jsx)("div",{children:n}),(0,u.jsx)(p.Sm,{value:t.name,handleInputChange:e=>{t.name=e,Y.current=!0},no_border:!0}),(0,u.jsx)(p.l6,{value:t.open,onChange:e=>{t.open=e,V([...M]),Y.current=!0},options:me,no_border:!0}),(0,u.jsx)(p.Sm,{value:t.endpoint,handleInputChange:e=>{t.endpoint=e,Y.current=!0},no_border:!0}),(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"visibility",title:"查看工具",onClick:()=>{we(t,s)}}),(0,u.jsx)(i.rA,{icon:"settings",title:"headers",onClick:()=>{g.xK.set_value_temp(t.headers??""),de({model:"ace/mode/ini",open:!0,fileName:"",save:async e=>{t.headers=e,V([...M]),g.xK.set_value_temp(""),Y.current=!0,ge()}})}})]}),(0,u.jsx)(p.Sm,{value:t.note,handleInputChange:e=>{t.note=e,Y.current=!0},no_border:!0}),(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"delete",title:e("删除"),onClick:()=>xe(t)}),(0,u.jsx)(i.rA,{icon:"copy_all",title:e("复制"),onClick:()=>je(t)})]})]}),width:"10rem"})}),(0,u.jsx)(_.uF,{self_title:(0,u.jsxs)("span",{className:" div-row ",children:[(0,u.jsx)("h2",{children:e("系统会话提示词")})," ",(0,u.jsx)(i.rA,{icon:"info",onClick:()=>{ae('\n1. 系统会话提示词,在 AI 聊天页创建会话时可以选择,选中的提示词会自动填入聊天框作为第一条系统消息\n2. 适用于预先设定常用的会话场景模板,如"代码审查"、"翻译助手"、"运维诊断"等\n')},title:"信息"})]}),titleCom:(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"add",title:e("添加"),onClick:()=>{oe([...se,{prompt:"",note:""}])}}),(0,u.jsx)(i.rA,{icon:"save",title:e("保存"),onClick:()=>{ke()}})]}),children:(0,u.jsx)(d.X,{headers:ne,rows:se.map((t,n)=>{const s=[(0,u.jsx)("div",{children:n}),(0,u.jsx)("div",{children:(0,u.jsx)(i.rA,{icon:"short_text",title:e("提示词"),onClick:()=>{g.xK.set_value_temp(t.prompt??""),de({model:"ace/mode/text",open:!0,fileName:"",save:async e=>{t.prompt=e,oe([...se]),g.xK.set_value_temp(""),ke()}})}})}),(0,u.jsx)(p.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,u.jsx)("div",{children:(0,u.jsx)(i.rA,{icon:"delete",title:e("删除"),onClick:()=>(e=>{se.splice(e,1),oe([...se])})(n)})})];return s}),width:"10rem"})}),(0,u.jsx)(_.uF,{self_title:(0,u.jsxs)("span",{className:" div-row ",children:[(0,u.jsx)("h2",{children:e("长期记忆")})," ",(0,u.jsx)(i.rA,{icon:"info",onClick:()=>{ae(e("开启后跨会话保存记忆。四个固定文件:周/月/年/永久。每周结束自动压缩周→月,每月结束自动压缩月→年,每年结束自动压缩年→永久。编辑按钮可手动查看和修改。"))},title:"信息"})]}),titleCom:(0,u.jsx)("div",{children:(0,u.jsx)(i.Ay,{checked:ie,onChange:async t=>{le(t),await h.XO.post("ai_long_term_memory_setting/save",{open:t}),(0,j.SK)(e("长期记忆设置已保存"))},title:e("开关")})}),children:(0,u.jsx)("div",{style:{display:"flex",gap:"0.5rem",padding:"0.5rem 0",flexWrap:"wrap"},children:[{type:"week",label:e("周记忆"),tip:e("上限3000字")},{type:"month",label:e("月记忆"),tip:e("上限6000字")},{type:"year",label:e("年记忆"),tip:e("上限9000字")},{type:"forever",label:e("永久记忆"),tip:e("上限12000字")}].map(({type:t,label:n,tip:s})=>(0,u.jsx)(i.rA,{icon:"edit",title:`${e("编辑")} ${n} (${s})`,onClick:async()=>{const s=await h.XO.get(`ai_long_term_memory_bucket/${t}`),o=s.code===x.m.Success?s.data??"":"";g.xK.set_value_temp(o),de({model:"ace/mode/text",open:!0,fileName:`long_term_memory_${t}.txt`,save:async s=>{await h.XO.post(`ai_long_term_memory_bucket/${t}/save`,{data:s}),g.xK.set_value_temp(""),(0,j.SK)(`${n} ${e("已保存")}`)}})}},t))})})]})}),(0,u.jsxs)(c.fI,{children:[(0,u.jsx)(c.VP,{widthPer:50,children:(0,u.jsx)(_.uF,{self_title:(0,u.jsxs)("span",{className:" div-row ",children:[(0,u.jsx)("h2",{children:e("本地知识库")})," ",(0,u.jsx)(i.rA,{icon:"info",onClick:()=>{ae("\n1. 本地知识库用于为AI增强理解能力,或者分析本地文件,原理读取本地的文件,对文件在内存中建立全文索引,为AI提供额外数据(需要有模型开启才能使用)\n2. 该功能只能用于小型知识库,作为本地小型或者公司内部资料使用还是没有问题的\n3. 每次保存都会重新加载知识库中的文件,不会全部重新加载,而是检测哪些文件有变更\n")},title:"信息"})]}),titleCom:(0,u.jsxs)("div",{children:[(0,u.jsx)(i.Ay,{checked:W,onChange:async e=>{await h.jV.post("docs_on_set",{status:e}),ue(),t()},title:e("知识库开关")}),(0,u.jsx)(i.rA,{icon:"settings",title:"额外参数设置",onClick:()=>{g.xK.set_value_temp(H.current),de({model:"ace/mode/ini",open:!0,fileName:"",save:async e=>{H.current=e,g.xK.set_value_temp(""),Ce(H.current)}})}}),(0,u.jsx)(i.rA,{icon:"add",title:e("添加"),onClick:()=>{X([...O,{note:"",auto_load:!1,dir:""}]),q.current=!0}}),(0,u.jsx)(i.rA,{icon:"save",title:e("保存"),onClick:()=>{Ce()}})]}),children:(0,u.jsx)(d.X,{headers:K,rows:O.map((t,n)=>{const s=[(0,u.jsx)("div",{children:n}),(0,u.jsx)(p.Sm,{value:t.dir,handleInputChange:e=>{t.dir=e,q.current=!0},no_border:!0}),(0,u.jsx)(p.l6,{value:t.auto_load,onChange:e=>{t.auto_load=e,X([...O]),q.current=!0},options:me,no_border:!0}),(0,u.jsx)(p.Sm,{value:t.note,handleInputChange:e=>{t.note=e},no_border:!0}),(0,u.jsxs)("div",{children:[(0,u.jsx)(i.rA,{icon:"delete",title:e("删除记录"),onClick:()=>(e=>{O.splice(e,1),X([...O]),q.current=!0})(n)}),(0,u.jsx)(i.rA,{icon:"restore",title:e("手动加载"),onClick:()=>{_e({sub_title:"手动加载",confirm_fun:()=>{h.jV.post("ai_load_one_file",{param_path:t.dir}),(0,j.SK)("ok")}})}}),(0,u.jsx)(i.rA,{icon:"delete_forever",title:e("从索引删除"),onClick:()=>{_e({sub_title:"从索引删除",confirm_fun:()=>{h.jV.post("ai_del",{param_path:t.dir}),(0,j.SK)("ok")}})}})]})];return s}),width:"10rem"})})}),L&&(0,u.jsx)(c.VP,{widthPer:50,children:(0,u.jsxs)(_.Zp,{title:e("知识库加载信息"),children:[(0,u.jsx)(c.Yh,{left:e("最近一次加载")+","+e("加载进度"),right:L?.progress}),(0,u.jsx)(c.Yh,{left:`${e("最近一次加载")},${e("总文件数量")}`,right:L?.num}),(0,u.jsx)(c.Yh,{left:`${e("最近一次加载")},${e("总文件字符数量")}`,right:L?.char_num}),(0,u.jsx)(c.Yh,{left:`${e("最近一次加载")},${e("总文件大小")}`,right:(0,k.v7)(L?.size)}),(0,u.jsx)(c.Yh,{left:`${e("最近一次加载")},${e("总耗时")}`,right:(0,k.a3)(L?.consume_time_ms_len)}),(0,u.jsx)(c.Yh,{left:`${e("总文件数量")}`,right:L?.total_num})]})})]})]})})})]})}},34299(e,t,n){n.r(t),n.d(t,{default:()=>h});n(96540);var s=n(73557),o=n(53995),i=n(18569),l=n(77979),a=n(8263),r=n(69428),c=n.n(r),d=(n(3775),n(21499)),p=n(99214),_=n(19878),m=(n(72411),n(74848));const u=new s.A({html:!0,highlight:function(e,t){if(t&&_.A.getLanguage(t))try{return`<pre class="hljs code-block-with-copy"><code class="hljs language-${t}">${_.A.highlight(e,{language:t}).value}</code></pre>`}catch(e){}try{return`<pre class="hljs code-block-with-copy"><code class="hljs">${_.A.highlightAuto(e).value}</code></pre>`}catch(e){}return`<pre class="hljs code-block-with-copy"><code>${u.utils.escapeHtml(e)}</code></pre>`}});function h(e){return(0,p.VD)(),(0,m.jsx)("div",{dangerouslySetInnerHTML:{__html:u.render(e.context)}})}u.use(o.A).use(i.A).use(l.A).use(a.A).use(c()).use(e=>{e.renderer.rules.fence;e.renderer.rules.fence=(t,n,s,o,i)=>{const l=t[n],a=l.content.trim(),r=l.info.trim();let c="";if(r&&_.A.getLanguage(r))try{c=_.A.highlight(a,{language:r}).value}catch(t){c=e.utils.escapeHtml(a)}else try{c=_.A.highlightAuto(a).value}catch(t){c=e.utils.escapeHtml(a)}return`\n <div class="code-block-with-copy">\n <div class="code-header">\n <span class="code-language">${r||"code"}</span>\n <button class="copy-btn" data-code="${e.utils.escapeHtml(a)}">复制</button>\n </div>\n <pre><code class="hljs ${r?`language-${r}`:""}">${c}</code></pre>\n </div>`}}).use(e=>{const t=e.renderer.rules.link_open||function(e,t,n,s,o){return o.renderToken(e,t,n)};e.renderer.rules.link_open=(e,n,s,o,i)=>{const l=e[n],a=l.attrIndex("href");if(a>=0){const e=l.attrs[a][1];l.attrs[a][1]=(0,d.bi)(window.location.href,e)}return t(e,n,s,o,i)}})},45907(e,t,n){n.d(t,{y:()=>i});var s=n(34843),o=n(82893);function i(){const[e,t]=(0,s.fp)(o.AG.confirm);return({sub_title:e,confirm_fun:n,title:s,context_div:o})=>{t({open:!0,sub_title:e,handle:()=>{n(),t({open:!1,handle:null})},title:s,context_div:o})}}},24659(e,t,n){var s=n(34899);n.d(t,["K",0,()=>{const{t:e}=(0,s.Bd)();return[{title:e("是"),value:!0,color:"#28a745"},{title:e("否"),value:!1,color:"#666666"}]}])},60840(e){e.exports="data:image/svg+xml,<svg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 version=%271.1%27 aria-hidden=%27true%27><path fill-rule=%27evenodd%27 d=%27M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z%27></path></svg>"}}]);