@bkm016/basalt 0.1.5 → 0.1.6
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/README.md +9 -7
- package/{chunk-gw05p4g3.js → chunk-053vb71h.js} +1 -1
- package/{chunk-3c330qna.js → chunk-063vbmtp.js} +2 -2
- package/{chunk-bgkegf0k.js → chunk-0javrjcm.js} +4 -4
- package/{chunk-pjr91g6k.js → chunk-10p3mb40.js} +1 -1
- package/{chunk-mkp28k1x.js → chunk-39vwrg8n.js} +2 -2
- package/{chunk-8xb636vr.js → chunk-6kdgk70p.js} +2 -2
- package/{chunk-9z7sdh5e.js → chunk-6ptv4g5e.js} +1 -1
- package/{chunk-zzwjt7fp.js → chunk-75434aay.js} +1 -1
- package/{chunk-ar3dbfp9.js → chunk-7hr6zw2m.js} +1 -1
- package/{chunk-h1rypb99.js → chunk-8gw5bvh3.js} +4 -4
- package/{chunk-a4b75ekk.js → chunk-8saewt61.js} +2 -2
- package/{chunk-sqaam5ak.js → chunk-8wj32837.js} +1 -1
- package/{chunk-539ekagy.js → chunk-8wv5t0w6.js} +5 -5
- package/{chunk-aw65h276.js → chunk-8x21n7y9.js} +1 -1
- package/{chunk-0n99m9m4.js → chunk-a0c989ky.js} +1 -1
- package/{chunk-srjgvdvs.js → chunk-a5apjjcn.js} +6 -6
- package/chunk-a81p46j7.js +2 -0
- package/chunk-agsfy9w7.js +2 -0
- package/{chunk-2qcpq99g.js → chunk-arcqjt91.js} +1 -1
- package/{chunk-rxj6tct8.js → chunk-bdy4jksd.js} +1 -1
- package/{chunk-zrkh5dw7.js → chunk-benrzwea.js} +1 -1
- package/chunk-bpw6q7g0.js +3 -0
- package/{chunk-36cqq0ga.js → chunk-c7rcw9fb.js} +5 -5
- package/{chunk-x89em726.js → chunk-ca982n62.js} +1 -1
- package/chunk-d20p02ny.js +2 -0
- package/{chunk-5v4g21rw.js → chunk-d6p2hgxh.js} +1 -1
- package/{chunk-t7sc0wwc.js → chunk-dnx91jrd.js} +2 -2
- package/{chunk-mat08ab1.js → chunk-dpz4hwqb.js} +2 -2
- package/{chunk-zn0g0859.js → chunk-ebpyvs1d.js} +2 -2
- package/{chunk-00gwse5r.js → chunk-ecf896fz.js} +1 -1
- package/{chunk-0stvywr8.js → chunk-ejsneb6f.js} +1 -1
- package/{chunk-7as47pcw.js → chunk-ey15ye2h.js} +1 -1
- package/{chunk-v4k3qmdm.js → chunk-f156y565.js} +1 -1
- package/{chunk-7tgqhveh.js → chunk-f544p9rh.js} +1 -1
- package/chunk-fmq3zwzk.js +2 -0
- package/{chunk-ebzkckyw.js → chunk-fx7f4m3c.js} +1 -1
- package/{chunk-3k7ejpkc.js → chunk-g0t9c3gv.js} +1 -1
- package/{chunk-7w0mefgk.js → chunk-gv7wqkey.js} +2 -2
- package/{chunk-2nkfxhef.js → chunk-hksqjts3.js} +252 -236
- package/{chunk-1xa7d5mh.js → chunk-j7yvh0ae.js} +1 -1
- package/{chunk-0j0qggej.js → chunk-n85qs7cs.js} +1 -1
- package/{chunk-7qq99360.js → chunk-n981vx1t.js} +4 -4
- package/{chunk-0fwdxd45.js → chunk-peja51xv.js} +1 -1
- package/{chunk-6dsq0fns.js → chunk-pg5nkf1y.js} +1 -1
- package/{chunk-jyrwk08p.js → chunk-prgm07j4.js} +1 -1
- package/{chunk-jvwg4rn1.js → chunk-q9dd6fhj.js} +4 -4
- package/{chunk-nxkmd29x.js → chunk-r8vvcp6c.js} +1 -1
- package/{chunk-stj493dn.js → chunk-r9aatvwm.js} +2 -2
- package/chunk-rfb85nj7.js +2 -0
- package/{chunk-980drajf.js → chunk-rfdt992v.js} +12 -12
- package/{chunk-e63c1186.js → chunk-s6dejhfj.js} +1 -1
- package/{chunk-wfyrfvfn.js → chunk-s7skpgm2.js} +1 -1
- package/{chunk-dddsrff6.js → chunk-tgfbtehh.js} +123 -121
- package/{chunk-r0jc8e7t.js → chunk-w67dvqtb.js} +2 -2
- package/{chunk-b9fqretv.js → chunk-whj87h4r.js} +2 -2
- package/{chunk-vt1anydc.js → chunk-y8dkfpmj.js} +3 -3
- package/{chunk-nx3jnbv8.js → chunk-z02sj1je.js} +2 -2
- package/{chunk-hq5ke1yp.js → chunk-zxkq9m8e.js} +1 -1
- package/compiled.js +3 -3
- package/package.json +1 -1
- package/ui-test-worker.js +27 -27
- package/web/{chunk-56krfj3b.js → chunk-03dmzvaq.js} +1 -1
- package/web/{chunk-affear07.js → chunk-0fgaepwm.js} +1 -1
- package/web/{chunk-vhzys0rr.js → chunk-0gg00f86.js} +1 -1
- package/web/chunk-0pecj6d7.js +1 -0
- package/web/chunk-0wt1dgny.js +1 -0
- package/web/{chunk-gxqaa4sv.js → chunk-12xxh71x.js} +5 -5
- package/web/chunk-1ves7sq5.js +1 -0
- package/web/chunk-1yj79b48.js +1 -0
- package/web/{chunk-x7sb3bwf.js → chunk-296hgy6k.js} +22 -22
- package/web/{chunk-jcdw85mv.js → chunk-2bmq1whf.js} +1 -1
- package/web/{chunk-1s2hp6h1.js → chunk-2wqxhqr9.js} +1 -1
- package/web/{chunk-y7jq61nv.js → chunk-30b33r2w.js} +2 -2
- package/web/{chunk-g8kkc6vz.js → chunk-30zfw7zg.js} +1 -1
- package/web/chunk-39ng8zwx.css +1 -0
- package/web/{chunk-0qr891eq.js → chunk-3de552rg.js} +1 -1
- package/web/{chunk-3hkgdw6f.js → chunk-3nbzj48p.js} +3 -3
- package/web/{chunk-12z7d0hp.js → chunk-3zebd9fq.js} +1 -1
- package/web/chunk-4r1n98zx.js +2 -0
- package/web/chunk-59678wmg.js +1 -0
- package/web/{chunk-pyg1mr80.js → chunk-5v44qv67.js} +20 -20
- package/web/chunk-5wdk97mk.js +4 -0
- package/web/{chunk-fnnrrzqa.js → chunk-64rafq66.js} +1 -1
- package/web/{chunk-qrdh9j62.js → chunk-6kkw9ptc.js} +1 -1
- package/web/{chunk-01hcjafh.js → chunk-718mr5gc.js} +1 -1
- package/web/chunk-7hs57qdr.js +1 -0
- package/web/{chunk-aqt7kc3s.js → chunk-7kp237t3.js} +1 -1
- package/web/chunk-86p42kym.js +1 -0
- package/web/chunk-8n79cqyd.js +1 -0
- package/web/{chunk-paywgcf7.js → chunk-96v2avmw.js} +2 -2
- package/web/{chunk-4a4j030b.js → chunk-9an6wcnr.js} +1 -1
- package/web/{chunk-dzg1pv80.js → chunk-9c1yt2ex.js} +3 -3
- package/web/{chunk-d60dpf69.js → chunk-a7gtb4kg.js} +1 -1
- package/web/chunk-b985y17w.js +2 -0
- package/web/{chunk-j34q5jn6.js → chunk-bz2v64xe.js} +1 -1
- package/web/{chunk-g9sqbafw.js → chunk-cb2rxtq9.js} +1 -1
- package/web/{chunk-g5jxwkdh.js → chunk-ck8rr0sr.js} +1 -1
- package/web/{chunk-zc1mk10n.js → chunk-cktmyc13.js} +2 -2
- package/web/{chunk-tcp77cp2.js → chunk-cm92fyr3.js} +1 -1
- package/web/chunk-cwtn2kdm.js +1 -0
- package/web/{chunk-ka7c5rhx.js → chunk-czq1yz51.js} +6 -6
- package/web/{chunk-qq5gh5zr.js → chunk-d4z2rgpx.js} +1 -1
- package/web/{chunk-0k9aec1s.js → chunk-d6tbw8br.js} +3 -3
- package/web/chunk-dpkyygej.js +1 -0
- package/web/{chunk-m8knte9z.js → chunk-dwajwrpk.js} +1 -1
- package/web/{chunk-7e47b1sn.js → chunk-et5ess72.js} +1 -1
- package/web/chunk-ez8b6neq.js +1 -0
- package/web/{chunk-9xgspn75.js → chunk-f5txt81n.js} +2 -2
- package/web/chunk-fd1kqwe3.js +1 -0
- package/web/chunk-fmthkpff.js +1 -0
- package/web/{chunk-h2ag4kvz.js → chunk-fp48zz2e.js} +1 -1
- package/web/{chunk-1pasbxwh.js → chunk-fx0n2g22.js} +1 -1
- package/web/{chunk-bnb9xhgw.js → chunk-fxs4nb93.js} +6 -6
- package/web/{chunk-sd22cnjy.js → chunk-g6k9z8zt.js} +1 -1
- package/web/{chunk-5shygfgb.js → chunk-g81h1e6n.js} +2 -2
- package/web/{chunk-zz397b0v.js → chunk-gsh80797.js} +1 -1
- package/web/chunk-hs5x78fb.js +1 -0
- package/web/{chunk-abhad4zj.js → chunk-ht1dzftc.js} +4 -4
- package/web/{chunk-zqht0jzx.js → chunk-hy4m34qp.js} +1 -1
- package/web/chunk-hyd5hzpa.js +1 -0
- package/web/chunk-hyt1nkaw.js +1 -0
- package/web/chunk-j6a4z530.js +1139 -0
- package/web/{chunk-h6gh63xj.js → chunk-jve1zc80.js} +1 -1
- package/web/{chunk-vttgyb5v.js → chunk-kegv14sg.js} +1 -1
- package/web/chunk-kw9emsqw.js +1 -0
- package/web/{chunk-kza0t0gj.js → chunk-kyawkpv2.js} +1 -1
- package/web/{chunk-xsrvw7dt.js → chunk-m2prjwk3.js} +1 -1
- package/web/{chunk-s24qs1bn.js → chunk-m9bzz9m0.js} +6 -6
- package/web/{chunk-c53xmf48.js → chunk-mqsyzzgt.js} +1 -1
- package/web/{chunk-26bwh1sb.js → chunk-n1jpg57t.js} +6 -6
- package/web/{chunk-yvgs6bm3.js → chunk-nyn9tghz.js} +1 -1
- package/web/{chunk-ybw6vgf6.js → chunk-nywdeb4m.js} +1 -1
- package/web/{chunk-1cfh0e2e.js → chunk-prvh9syp.js} +7 -7
- package/web/chunk-pxkhm40r.js +2 -0
- package/web/{chunk-d6ddkh6e.js → chunk-q9ekgjh6.js} +1 -1
- package/web/chunk-r3mj50zs.js +1 -0
- package/web/{chunk-2nht58dc.js → chunk-rf9dt6bg.js} +1 -1
- package/web/{chunk-4m3zdd41.js → chunk-s2920f21.js} +1 -1
- package/web/{chunk-crzseqbx.js → chunk-sc0ghp25.js} +1 -1
- package/web/{chunk-7a3c137d.js → chunk-sy7e4dmq.js} +1 -1
- package/web/{chunk-65nwc4cf.js → chunk-t74r2n8h.js} +1 -1
- package/web/{chunk-gcv91974.js → chunk-t851gdjh.js} +1 -1
- package/web/{chunk-mpfgr049.js → chunk-t9mvsgt9.js} +1 -1
- package/web/{chunk-mnzramhc.js → chunk-twdy2f67.js} +1 -1
- package/web/{chunk-advfpyb9.js → chunk-v4yqrx5y.js} +4 -4
- package/web/{chunk-z4aj066q.js → chunk-vf4vkcf9.js} +1 -1
- package/web/{chunk-6enn8p66.js → chunk-vtxw9rmr.js} +1 -1
- package/web/{chunk-k67v6dyg.js → chunk-vw1pbv1x.js} +2 -2
- package/web/chunk-x19v2sxv.js +1 -0
- package/web/{chunk-892nf39p.js → chunk-x5s7zr5f.js} +7 -7
- package/web/{chunk-f9k3xrwb.js → chunk-xc2sq3t5.js} +1 -1
- package/web/chunk-xvcfp1zh.js +2 -0
- package/web/chunk-y21zy3eh.js +1 -0
- package/web/{chunk-14bad871.js → chunk-ya3ghn3n.js} +1 -1
- package/web/chunk-yd74yxzt.js +8 -0
- package/web/{chunk-0p1nmj5n.js → chunk-z1geewdf.js} +1 -1
- package/web/chunk-z4ha8181.js +1 -0
- package/web/chunk-z8rarqe6.js +1 -0
- package/web/{chunk-xk1t58c4.js → chunk-zp3qrrkb.js} +4 -4
- package/web/{chunk-7znyd1mj.js → chunk-zsxw5fj7.js} +1 -1
- package/web/index.html +1 -1
- package/worker.js +1 -1
- package/chunk-2nb3d92s.js +0 -2
- package/chunk-2pa1z37c.js +0 -2
- package/chunk-4g5f43ea.js +0 -3
- package/chunk-eegztdzb.js +0 -2
- package/chunk-wd3z74av.js +0 -2
- package/chunk-yna8bwqc.js +0 -2
- package/web/chunk-0ytga215.js +0 -1
- package/web/chunk-1amzv4ha.js +0 -1
- package/web/chunk-2y0rc1fe.js +0 -1
- package/web/chunk-4w298aqs.js +0 -1
- package/web/chunk-6stt9d18.js +0 -1
- package/web/chunk-7pypx5h8.js +0 -2
- package/web/chunk-9dy7z3ej.js +0 -2
- package/web/chunk-9mq2cdtq.js +0 -1
- package/web/chunk-b5hah4mf.js +0 -1
- package/web/chunk-b8tfetd8.js +0 -1
- package/web/chunk-ckgpy4r4.js +0 -1
- package/web/chunk-dbnrfxt1.js +0 -8
- package/web/chunk-ddxf8e84.js +0 -1
- package/web/chunk-e8h45nyr.js +0 -1
- package/web/chunk-ej9vb61c.js +0 -1
- package/web/chunk-fjag6yg8.js +0 -2
- package/web/chunk-gxsb5tx3.js +0 -1
- package/web/chunk-jg6fmz2d.js +0 -1
- package/web/chunk-mz1dabxh.js +0 -1
- package/web/chunk-p53n0hwr.js +0 -1
- package/web/chunk-pfcnr9tw.js +0 -1
- package/web/chunk-q7xkscc5.js +0 -1
- package/web/chunk-qmbgb79a.js +0 -1139
- package/web/chunk-sfq6cw45.js +0 -2
- package/web/chunk-svqj4az8.js +0 -1
- package/web/chunk-t7jwyvvr.js +0 -1
- package/web/chunk-tf18d2dk.css +0 -1
- package/web/chunk-v0g4cqc1.js +0 -4
- package/web/chunk-vqfz99ff.js +0 -1
- package/web/chunk-zazs8p6c.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h,o,r,t,n,_,Z,
|
|
1
|
+
import{h,o,r,t,n,_,Z,ee,at,bt}from"./chunk-j6a4z530.js";import{vn}from"./chunk-kegv14sg.js";var I="/api/plugins/prompt-optimizer";function j({connection:u,onClose:x}){let{Button:g,ModelSelector:O,Select:D,SettingGroup:S,SettingRow:b,cn:C}=_(),[m,z]=r(null),[s,p]=r(null),[L,B]=r({models:[]}),[d,M]=r(!0),[N,R]=r(!1),[l,w]=r(!1),[f,a]=r(null),y=h(async(i=!1)=>{if(i)R(!0);else M(!0);a(null);try{let[e,c]=await Promise.all([u.request(`${I}/settings`),u.request("/api/models")]);z(e),p(e),B(c)}catch(e){a({type:"error",text:e instanceof Error?e.message:"读取优化插件设置失败"})}finally{M(!1),R(!1)}},[u]);o(()=>{y()},[y]);let P=s&&m?s.primaryModel?.providerID!==m.primaryModel?.providerID||s.primaryModel?.modelID!==m.primaryModel?.modelID||s.maxClarificationRounds!==m.maxClarificationRounds:!1,E=async(i)=>{if(i?.preventDefault(),!s||l||d)return;w(!0),a(null);try{let e=await u.request(`${I}/settings`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({schemaVersion:1,revision:s.revision,primaryModel:s.primaryModel,maxClarificationRounds:s.maxClarificationRounds})});z(e),p(e),a({type:"success",text:"设置已保存"})}catch(e){a({type:"error",text:e instanceof Error?e.message:"保存设置失败"})}finally{w(!1)}},T=()=>{p(m),a(null)},v=s?.primaryModel??null,q=v?`${v.providerID}/${v.modelID}`:"";return n("form",{onSubmit:E,className:"min-w-0 space-y-6",children:[t(S,{title:"模型策略",description:"提示词优化专用的改写模型配置",action:n(g,{type:"button",size:"sm",variant:"ghost",disabled:d||N||l,onClick:()=>void y(!0),className:"h-8 px-2.5 text-xs text-dim hover:text-ink",children:[t(ee,{className:C("mr-1.5 size-3.5",N&&"animate-spin")}),"刷新模型"]}),children:t(b,{vertical:!0,title:"默认优化模型",description:"优化插件必须显式绑定模型才能发起改写;未选定模型时将拒绝调用,绝不隐式自动回退。",children:t("div",{className:"pt-1",children:t(O,{variant:"field",models:L,value:q,onChange:(i)=>{let e=i.indexOf("/"),c=e<0?"":i.slice(0,e),G=e<0?i:i.slice(e+1);p((k)=>k?{...k,primaryModel:{providerID:c,modelID:G}}:null),a(null)}})})})}),t(S,{title:"交互模式",description:"控制生成过程中的意图确认与澄清策略",children:t(b,{title:"澄清提问轮数",description:"当草稿存在关键歧义无法从上下文判定时,允许模型主动提问的最大轮数",children:t("div",{className:"w-48",children:t(D,{value:String(s?.maxClarificationRounds??1),disabled:d||l,onValueChange:(i)=>{let e=i==="2"?2:1;p((c)=>c?{...c,maxClarificationRounds:e}:null),a(null)},groups:[{options:[{value:"1",label:"单轮澄清(推荐)",description:"提问一次后直接输出改写结果"},{value:"2",label:"最多两轮澄清",description:"首轮澄清后可针对残留疑问追问一次"}]}]})})})}),n("div",{className:"mt-4 flex flex-wrap items-center justify-between gap-3 px-0.5",children:[t("div",{className:"min-w-0 flex-1",children:f&&n("div",{className:C("flex items-center gap-2 text-xs",f.type==="success"?"text-success":"text-danger"),children:[f.type==="success"?t(vn,{className:"size-3.5 shrink-0"}):t(Z,{className:"size-3.5 shrink-0"}),t("span",{children:f.text})]})}),n("div",{className:"flex items-center gap-2",children:[P&&n(g,{type:"button",variant:"ghost",size:"sm",disabled:d||l,onClick:T,children:[t(at,{className:"mr-1.5 size-3.5"}),"重置"]}),n(g,{type:"submit",variant:"primary",size:"sm",disabled:d||l||!P,children:[t(bt,{className:"mr-1.5 size-3.5"}),l?"保存中…":"保存"]}),x&&t(g,{type:"button",variant:"secondary",size:"sm",onClick:x,children:"关闭"})]})]})]})}export{j as PromptOptimizerSettingsSection};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h,o,
|
|
1
|
+
import{h,o,J,i,r,y,t,n,_,Vt,tr,Ue,Pn,De,mn,pe,re}from"./chunk-j6a4z530.js";var M=[{label:"每天 9:00",cron:"0 9 * * *"},{label:"每个工作日 9:00",cron:"0 9 * * 1-5"},{label:"每周一 9:00",cron:"0 9 * * 1"},{label:"每小时",cron:"0 * * * *"},{label:"每天 18:00",cron:"0 18 * * *"},{label:"每月 1 号 9:00",cron:"0 9 1 * *"}],ae=["日","一","二","三","四","五","六","日"],ie=(a)=>a.padStart(2,"0");function X(a){let p=M.find((I)=>I.cron===a.trim());if(p)return p.label;let N=a.trim().split(/\s+/);if(N.length!==5)return a;let[u="",x="",b="",D="",c=""]=N,C=(I)=>/^\d+$/.test(I);if(D!=="*")return a;if(C(u)&&x==="*"&&b==="*"&&c==="*")return`每小时第 ${u} 分`;let P=u.match(/^\*\/(\d+)$/);if(P&&x==="*"&&b==="*"&&c==="*")return`每 ${P[1]} 分钟`;if(!C(u)||!C(x))return a;let m=`${x}:${ie(u)}`;if(b==="*"&&c==="*")return`每天 ${m}`;if(b==="*"&&c==="1-5")return`每个工作日 ${m}`;if(b==="*"&&/^[0-7](,[0-7])*$/.test(c))return`每周${c.split(",").map((I)=>ae[Number(I)]).join("、")} ${m}`;if(C(b)&&c==="*")return`每月 ${b} 号 ${m}`;return a}function Z(a){let p=Date.now()-a,N=Math.floor(Math.abs(p)/1000);if(N<60)return"刚刚";let u=Math.floor(N/60);if(u<60)return`${u} 分钟${p>0?"前":"后"}`;let x=Math.floor(u/60);if(x<24)return`${x} 小时${p>0?"前":"后"}`;return`${Math.floor(x/24)} 天${p>0?"前":"后"}`}function he(a){let{Button:p,confirm:N,PageLayout:u,Switch:x,cn:b,style:D}=_(),{connection:c,onOpen:C}=a,[P,m]=r([]),[I,U]=r([]),[T,V]=r([]),[j,R]=r(),[B,W]=r([]),[F,K]=r(!0),[O,w]=r(),[z,L]=r(),[Y,A]=r(!1),[G,f]=r({}),s=i(0),q=h(async()=>{let e=++s.current;try{let[l,d,g,v]=await Promise.all([c.request("/api/automations"),c.request("/api/projects").catch(()=>[]),c.request("/api/info").catch(()=>{return}),c.request("/api/models").catch(()=>({models:[]}))]),oe=[...new Set(l.flatMap((S)=>S.lastSessionID?[S.lastSessionID]:[]))],se=(await Promise.all(oe.map(async(S)=>c.request(`/api/sessions/${encodeURIComponent(S)}`).catch((k)=>{if(k instanceof Error&&"status"in k&&k.status===404)return;throw k})))).filter((S)=>S!==void 0);if(e!==s.current)return;if(m(l.sort((S,k)=>S.created-k.created)),U(d),V(se),R(g),v?.models)W(v.models.map((S)=>S.id));w(void 0)}catch(l){if(e===s.current)w(l instanceof Error?l.message:"加载失败")}finally{if(e===s.current)K(!1)}},[c]);o(()=>(q(),()=>{s.current++}),[q]);let E=(e)=>{L(e),A(!0)},ee=async(e)=>{f((l)=>({...l,[e.id]:!0}));try{let l=await c.request(`/api/automations/${e.id}/run`,{method:"POST"});C(l.id)}catch(l){w(l instanceof Error?l.message:"运行失败")}finally{f((l)=>({...l,[e.id]:!1}))}},te=async(e)=>{if(!await N({title:`删除自动化「${e.name}」?`,description:"已经跑出来的会话会保留。",action:"删除",danger:!0}))return;try{await c.request(`/api/automations/${e.id}`,{method:"DELETE"}),m((d)=>d.filter((g)=>g.id!==e.id))}catch(d){w(d instanceof Error?d.message:"删除失败")}},ne=async(e,l)=>{try{let d=await c.request(`/api/automations/${e.id}`,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({enabled:l})});m((g)=>g.map((v)=>v.id===e.id?d:v))}catch(d){w(d instanceof Error?d.message:"状态切换失败")}};return n(u,{title:"自动化",description:n(y,{children:["到点自动开一个新会话执行提示词,跑完的结果在会话里查看。",j?.timezone&&n("span",{className:"text-faint",children:["按服务器时区 ",j.timezone,"。"]})]}),actions:n(p,{variant:"primary",onClick:()=>E(null),children:[t(pe,{className:"size-4"}),"新建"]}),children:[O&&t("div",{className:"mb-4 rounded-lg bg-danger/10 px-3 py-2 text-xs text-danger",children:O}),F?t("div",{className:"flex justify-center py-12 text-xs text-faint",children:"正在加载自动化…"}):P.length===0?n("div",{className:D("surface.emptyDashed","animate-fade"),children:[t("div",{className:"grid size-11 place-items-center rounded-xl bg-raised text-dim",children:t(Vt,{className:"size-5"})}),n("div",{children:[t("p",{className:"text-[15px] font-medium",children:"还没有自动化"}),t("p",{className:"mt-1 text-sm text-dim",children:"比如「每个工作日 9 点总结昨天的提交」。"})]}),n(p,{size:"sm",onClick:()=>E(null),className:"mt-1",children:[t(pe,{className:"size-3.5"}),"新建自动化"]})]}):t("ul",{className:"flex animate-fade flex-col gap-3",children:P.map((e)=>{let l=e.projectID?I.find((v)=>v.id===e.projectID):void 0,d=e.lastSessionID?T.find((v)=>v.id===e.lastSessionID):void 0,g=Boolean(G[e.id]);return t("li",{children:n("article",{className:D("surface.card","group p-4 transition-[border-color,box-shadow] duration-200 hover:border-line-strong hover:shadow-composer"),children:[n("div",{className:"flex items-start gap-3",children:[n("div",{className:b("min-w-0 flex-1 transition-opacity duration-200",!e.enabled&&"opacity-55"),children:[t("h2",{className:"truncate text-[15px] font-medium",children:e.name}),n("div",{className:"mt-1 flex flex-wrap items-center gap-x-3.5 gap-y-1 text-[13px] text-dim",children:[n("span",{className:"flex items-center gap-1.5 [&_svg]:size-3.5 [&_svg]:text-faint",children:[t(Vt,{}),X(e.schedule)]}),n("span",{className:"flex items-center gap-1.5 [&_svg]:size-3.5 [&_svg]:text-faint",children:[l?t(Ue,{}):t(Pn,{}),l?l.name:"聊天"]}),e.enabled&&e.nextRun!==null&&n("span",{className:"flex items-center gap-1.5 [&_svg]:size-3.5 [&_svg]:text-faint",children:[t(tr,{}),"下次 ",Z(e.nextRun)]})]})]}),t(x,{checked:e.enabled,label:e.enabled?"停用":"启用",onCheckedChange:(v)=>ne(e,v),className:"mt-0.5"})]}),t("p",{className:b("mt-3 line-clamp-2 text-sm leading-6 whitespace-pre-wrap text-faint transition-opacity duration-200",!e.enabled&&"opacity-55"),children:e.prompt}),n("div",{className:"mt-3 -mb-1 flex items-center gap-1",children:[n(p,{size:"sm",onClick:()=>ee(e),disabled:g,children:[t(mn,{className:"size-3.5"}),g?"正在启动…":"立即运行"]}),n(p,{size:"sm",variant:"ghost",onClick:()=>E(e),children:[t(De,{className:"size-3.5"}),"编辑"]}),n(p,{size:"sm",variant:"danger-ghost",onClick:()=>te(e),children:[t(re,{className:"size-3.5"}),"删除"]}),t("div",{className:"flex-1"}),e.lastRun!==null&&n("button",{type:"button",disabled:!d,onClick:()=>d&&C(d.id),className:"rounded-md px-1.5 py-1 text-[13px] text-faint transition-colors enabled:hover:bg-raised enabled:hover:text-ink",children:["上次运行 ",Z(e.lastRun),d?.archivedAt!=null?" · 已归档":"",!d?" · 会话已删除":""]})]})]})},e.id)})}),z!==void 0&&t(le,{open:Y,onOpenChange:A,automation:z??void 0,projects:I,models:B,timezone:j?.timezone,onSaved:(e)=>{m((l)=>{let d=l.findIndex((g)=>g.id===e.id);if(d>=0){let g=[...l];return g[d]=e,g}return[...l,e].sort((g,v)=>g.created-v.created)}),A(!1)},connection:c},z?.id??"new")]})}var H="custom",Q="chat";function le(a){let{Button:p,Dialog:N,Field:u,Form:x,FormError:b,Input:D,Select:c,Textarea:C}=_(),P=J(),m=a.automation,[I,U]=r(m?.name??""),[T,V]=r(m?.prompt??""),[j,R]=r(m?.schedule??M[0]?.cron??"0 9 * * *"),[B,W]=r(()=>!M.some((f)=>f.cron===j)),[F,K]=r(m?.projectID??Q),[O,w]=r(m?.model??""),[z,L]=r(!1),[Y,A]=r();async function G(f){f.preventDefault(),L(!0),A(void 0);try{let s=F===Q?void 0:F,q={name:I,prompt:T,schedule:j,model:O||void 0},E;if(m)E=await a.connection.request(`/api/automations/${m.id}`,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({...q,projectID:s??null})});else E=await a.connection.request("/api/automations",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({...q,projectID:s})});a.onSaved(E)}catch(s){A(s instanceof Error?s.message:"保存失败")}finally{L(!1)}}return t(N,{open:a.open,onOpenChange:a.onOpenChange,title:a.automation?"编辑自动化":"新建自动化",size:"lg",footer:n(y,{children:[t("div",{className:"flex-1 max-sm:hidden"}),t(p,{onClick:()=>a.onOpenChange(!1),children:"取消"}),t(p,{type:"submit",form:P,variant:"primary",disabled:z,children:z?"正在保存…":a.automation?"保存":"创建"})]}),children:n(x,{id:P,onSubmit:G,children:[t(u,{label:"名称",children:(f)=>t(D,{id:f,autoFocus:!m,required:!0,value:I,onChange:(s)=>U(s.target.value),placeholder:"例如:每日提交总结"})}),t(u,{label:"提示词",hint:"没人盯着运行,写清楚要做什么、结果怎么汇报。",children:(f)=>t(C,{id:f,required:!0,value:T,onChange:(s)=>V(s.target.value),rows:5,placeholder:"总结昨天到现在的 git 提交,按模块分组,列出需要我关注的改动。"})}),n("div",{className:"grid gap-x-3 gap-y-4 sm:grid-cols-2",children:[t(u,{label:"时间",children:(f)=>t(c,{id:f,value:B?H:j,onValueChange:(s)=>{if(W(s===H),s!==H)R(s)},groups:[{options:M.map((s)=>({value:s.cron,label:s.label}))},{options:[{value:H,label:"自定义(cron)"}]}]})}),t(u,{label:"在哪里运行",children:(f)=>t(c,{id:f,value:F,onValueChange:K,groups:[{options:[{value:Q,label:"聊天",description:"不绑定目录",icon:t(Pn,{})}]},...a.projects.length?[{label:"项目",options:a.projects.map((s)=>({value:s.id,label:s.name,icon:t(Ue,{})}))}]:[]]})})]}),B&&t(u,{label:"cron 表达式",hint:`分 时 日 月 周,例如 30 8 * * 1-5 是工作日 8:30。${a.timezone?`按 ${a.timezone} 时间。`:""}`,children:(f)=>t(D,{id:f,required:!0,value:j,onChange:(s)=>R(s.target.value),spellCheck:!1,className:"font-mono"})}),a.models.length>0&&t(u,{label:"模型",children:(f)=>t(c,{id:f,value:O||"default",onValueChange:(s)=>w(s==="default"?"":s),groups:[{options:[{value:"default",label:"默认模型"},...a.models.map((s)=>({value:s,label:s}))]}]})}),t(b,{children:Y})]})})}export{he as AutomationsPage};
|