pikiloom 0.4.27 → 0.4.29

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.
Files changed (25) hide show
  1. package/dashboard/dist/assets/{AgentTab-DIP-y4dl.js → AgentTab-DtjuI8NU.js} +1 -1
  2. package/dashboard/dist/assets/{ConnectionModal-BCfvhkiI.js → ConnectionModal-BIx6a5o1.js} +1 -1
  3. package/dashboard/dist/assets/{DirBrowser-Dot7ua9-.js → DirBrowser-BINh_7NB.js} +1 -1
  4. package/dashboard/dist/assets/{ExtensionsTab-GioMx4S6.js → ExtensionsTab-CHpd147b.js} +1 -1
  5. package/dashboard/dist/assets/{IMAccessTab-C9_r8jJP.js → IMAccessTab-C4DbGxbG.js} +1 -1
  6. package/dashboard/dist/assets/{Modal-M1AP1sgR.js → Modal-D_PUi-5O.js} +1 -1
  7. package/dashboard/dist/assets/{Modals-CCm3UUfJ.js → Modals-BahDEMqf.js} +1 -1
  8. package/dashboard/dist/assets/{Select-YubDM16P.js → Select-Cp5VXb_2.js} +1 -1
  9. package/dashboard/dist/assets/SessionPanel-DZVNXptx.js +1 -0
  10. package/dashboard/dist/assets/{SystemTab-VgNivIe3.js → SystemTab-CLznS31f.js} +1 -1
  11. package/dashboard/dist/assets/{index-BlqvzDUL.js → index-CLGovkkw.js} +2 -2
  12. package/dashboard/dist/assets/{index-BY7l20bi.js → index-DcYOI6rL.js} +3 -3
  13. package/dashboard/dist/assets/{shared-C0SAInnT.js → shared-C8DCTJ44.js} +1 -1
  14. package/dashboard/dist/index.html +1 -1
  15. package/dist/channels/dingtalk/bot.js +0 -1
  16. package/dist/channels/discord/bot.js +0 -1
  17. package/dist/channels/feishu/bot.js +0 -1
  18. package/dist/channels/slack/bot.js +0 -1
  19. package/dist/channels/telegram/bot.js +0 -1
  20. package/dist/channels/wecom/bot.js +0 -1
  21. package/dist/channels/weixin/bot.js +0 -1
  22. package/dist/core/process-control.js +76 -29
  23. package/dist/dashboard/routes/config.js +1 -9
  24. package/package.json +1 -1
  25. package/dashboard/dist/assets/SessionPanel-Cnv9o96n.js +0 -1
@@ -1 +1 @@
1
- import{r as a,j as e}from"./react-vendor-C7Sl8SE7.js";import{u as C,d as _,L,I as P,m as D,a as F,t as Q}from"./index-BlqvzDUL.js";import{M as O,a as H}from"./Modal-M1AP1sgR.js";import{D as se}from"./DirBrowser-Dot7ua9-.js";import"./router-DHISdpPk.js";const Y="https://ilinkai.weixin.qq.com";function V(i){return i instanceof Error&&(i.name==="AbortError"||/aborted/i.test(i.message))}function $(i,h){return i instanceof Error&&/timed out/i.test(i.message)?h("modal.requestTimeout"):h("modal.networkError")}function de({open:i,onClose:h}){const p=C(d=>d.state),o=C(d=>d.toast),r=C(d=>d.reloadUntil),s=C(d=>d.locale),t=a.useMemo(()=>_(s),[s]),[w,G]=a.useState(""),[j,v]=a.useState(""),[B,S]=a.useState(!1),[y,c]=a.useState(!1),[u,n]=a.useState(null),[m,N]=a.useState(!1),T=a.useRef(null),E=a.useRef(p);E.current=p,a.useEffect(()=>{i?(G(E.current?.config.telegramBotToken||""),v(E.current?.config.telegramAllowedChatIds||""),S(!1),n(null),N(!E.current?.config.telegramBotToken)):(T.current?.abort(),T.current=null,c(!1))},[i]),a.useEffect(()=>()=>{T.current?.abort(),T.current=null},[]);const k=async()=>{if(!w.trim()){o(t("modal.inputToken"),!1);return}T.current?.abort();const d=new AbortController;T.current=d,c(!0),n(null);let b=!1;try{const f=await F.validateTelegramConfig(w.trim(),j.trim(),{signal:d.signal,timeoutMs:12e3});if(!f.ok){n({ok:!1,text:"✗ "+(f.error||t("modal.validationFailed"))});return}const l=f.normalizedAllowedChatIds??j.trim();n({ok:!0,text:"✓ @"+(f.bot?.username||"bot")+(f.bot?.displayName?" ("+f.bot.displayName+")":"")});const U=new Set((p?.setupState?.channels||[]).filter(A=>(A.ready||A.configured)&&A.channel!=="telegram").map(A=>A.channel));if(U.add("telegram"),await F.saveConfig({telegramBotToken:w.trim(),telegramAllowedChatIds:l,channels:[...U]}),!await r(A=>{const z=A.setupState?.channels?.find(g=>g.channel==="telegram");return A.config.telegramBotToken===w.trim()&&(A.config.telegramAllowedChatIds||"")===l&&!!z?.ready},{attempts:10,intervalMs:350})){n({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),o(t("modal.refreshStateFailed"),!1);return}o(t("modal.tgSaved")),b=!0}catch(f){if(V(f))return;const l=$(f,t);n({ok:!1,text:"✗ "+l}),o(l,!1)}finally{T.current===d&&(T.current=null),c(!1),b&&h()}},x=()=>{T.current?.abort(),T.current=null,h()};return e.jsxs(O,{open:i,onClose:x,children:[e.jsx(H,{title:t("modal.configureTelegram"),onClose:x}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>N(!m),children:[e.jsx("span",{children:t("modal.tgGuideTitle")}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${m?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),m&&e.jsxs("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:[e.jsx("p",{children:t("modal.tgGuideStep1")}),e.jsx("p",{children:t("modal.tgGuideStep2")}),e.jsx("p",{children:t("modal.tgGuideStep3")}),e.jsx("p",{children:t("modal.tgGuideStep4")}),e.jsx("p",{className:"mt-2 text-[11px] text-fg-5",children:t("modal.tgGuideIdTip")})]})]}),e.jsxs("div",{children:[e.jsx(L,{children:t("modal.botToken")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(P,{type:B?"text":"password",className:"flex-1 font-mono text-xs",placeholder:t("modal.pasteToken"),value:w,onChange:d=>G(d.target.value)}),e.jsx(D,{variant:"ghost",size:"sm",className:"!w-[34px] !p-0",onClick:()=>S(!B),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})})]})]}),u&&e.jsx("div",{className:"text-xs",style:{color:u.ok?"var(--th-ok)":"var(--th-err)"},children:u.text}),e.jsxs("div",{children:[e.jsxs(L,{children:[t("modal.allowedIds")," ",e.jsxs("span",{className:"text-fg-5",children:["(",t("modal.optional"),")"]})]}),e.jsx(P,{className:"font-mono text-xs",placeholder:t("modal.commaSep"),value:j,onChange:d=>v(d.target.value)})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(D,{variant:"ghost",onClick:x,children:t("modal.cancel")}),e.jsx(D,{variant:"primary",disabled:y,onClick:k,children:t(y?"modal.validating":"modal.validateSave")})]})]})}const ee=JSON.stringify({scopes:{tenant:["im:message","im:message:send_as_bot","im:message.p2p_msg:readonly","im:message.group_at_msg:readonly","im:resource"],user:[]}},null,2);function ce({open:i,onClose:h}){const p=C(k=>k.state),o=C(k=>k.toast),r=C(k=>k.reloadUntil),s=C(k=>k.locale),t=a.useMemo(()=>_(s),[s]),[w,G]=a.useState(""),[j,v]=a.useState(""),[B,S]=a.useState(!1),[y,c]=a.useState(null),[u,n]=a.useState(!1),m=a.useRef(null),N=a.useRef(p);N.current=p,a.useEffect(()=>{i?(G(N.current?.config.feishuAppId||""),v(N.current?.config.feishuAppSecret||""),c(null),n(!N.current?.config.feishuAppId)):(m.current?.abort(),m.current=null,S(!1))},[i]),a.useEffect(()=>()=>{m.current?.abort(),m.current=null},[]);const T=async()=>{if(!w.trim()){o(t("modal.inputAppId"),!1);return}m.current?.abort();const k=new AbortController;m.current=k,S(!0),c(null);let x=!1;try{const d=await F.validateFeishuConfig(w.trim(),j.trim(),{signal:k.signal,timeoutMs:2e4});if(!d.ok){c({ok:!1,text:"✗ "+(d.error||t("modal.validationFailed"))});return}c({ok:!0,text:"✓ "+(d.app?.displayName||d.app?.appId||w.trim())});const b=new Set((p?.setupState?.channels||[]).filter(l=>(l.ready||l.configured)&&l.channel!=="feishu").map(l=>l.channel));if(b.add("feishu"),await F.saveConfig({feishuAppId:w.trim(),feishuAppSecret:j.trim(),channels:[...b]}),!await r(l=>{const U=l.setupState?.channels?.find(W=>W.channel==="feishu");return l.config.feishuAppId===w.trim()&&l.config.feishuAppSecret===j.trim()&&!!U?.ready},{attempts:10,intervalMs:350})){c({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),o(t("modal.refreshStateFailed"),!1);return}o(t("modal.feishuSaved")),x=!0}catch(d){if(V(d))return;const b=$(d,t);c({ok:!1,text:"✗ "+b}),o(b,!1)}finally{m.current===k&&(m.current=null),S(!1),x&&h()}},E=()=>{m.current?.abort(),m.current=null,h()};return e.jsxs(O,{open:i,onClose:E,children:[e.jsx(H,{title:t("modal.configureFeishu"),onClose:E}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>n(!u),children:[e.jsx("span",{children:t("modal.feishuGuideTitle")}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${u?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),u&&e.jsxs("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:[e.jsx("p",{children:t("modal.feishuGuideStep1")}),e.jsx("p",{children:t("modal.feishuGuideStep2")}),e.jsx("p",{children:t("modal.feishuGuideStep3")}),e.jsx("p",{children:t("modal.feishuGuideStep4")}),e.jsxs("div",{className:"ml-3 mt-1",children:[e.jsxs("div",{className:"mb-1 flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-[11px] text-fg-5",children:t("modal.feishuGuidePerms")}),e.jsx(D,{variant:"outline",size:"sm",onClick:()=>{navigator.clipboard.writeText(ee),o(t("modal.feishuJsonCopied"))},children:t("modal.feishuCopyJson")})]}),e.jsx("pre",{className:"overflow-x-auto rounded-md border border-edge bg-inset p-2 font-mono text-[11px] leading-snug text-fg-3",children:ee}),e.jsx("p",{className:"mt-1 text-[11px] text-fg-5",children:t("modal.feishuJsonNote")})]}),e.jsx("p",{children:t("modal.feishuGuideStep5")}),e.jsx("p",{children:t("modal.feishuGuideStep6")}),e.jsx("p",{children:t("modal.feishuGuideStep7")}),e.jsx("p",{className:"mt-2 text-[11px] text-fg-5",children:t("modal.feishuGuideCardKitTip")})]})]}),e.jsxs("div",{children:[e.jsx(L,{children:t("modal.appId")}),e.jsx(P,{className:"font-mono text-xs",placeholder:t("modal.feishuPlaceholder"),value:w,onChange:k=>G(k.target.value)})]}),e.jsxs("div",{children:[e.jsx(L,{children:t("modal.appSecret")}),e.jsx(P,{type:"password",className:"font-mono text-xs",placeholder:t("modal.appSecret"),value:j,onChange:k=>v(k.target.value)})]}),y&&e.jsx("div",{className:"text-xs",style:{color:y.ok?"var(--th-ok)":"var(--th-err)"},children:y.text})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(D,{variant:"ghost",onClick:E,children:t("modal.cancel")}),e.jsx(D,{variant:"primary",disabled:B,onClick:T,children:t(B?"modal.validating":"modal.validateSave")})]})]})}function ue({open:i,onClose:h}){const p=C(x=>x.state),o=C(x=>x.toast),r=C(x=>x.reloadUntil),s=C(x=>x.locale),t=a.useMemo(()=>_(s),[s]),[w,G]=a.useState(Y),[j,v]=a.useState(!1),[B,S]=a.useState(""),[y,c]=a.useState(""),[u,n]=a.useState(null),m=a.useRef(null),N=a.useRef(p);N.current=p,a.useEffect(()=>{i?(G(N.current?.config.weixinBaseUrl||Y),v(!1),S(""),c(""),n(null)):(m.current?.abort(),m.current=null,v(!1))},[i]),a.useEffect(()=>()=>{m.current?.abort(),m.current=null},[]);const T=()=>{m.current?.abort(),m.current=null,h()},E=a.useCallback(async(x,d,b)=>{for(;!x.signal.aborted;){const f=await F.waitWeixinLogin(d,b,{signal:x.signal,timeoutMs:45e3});if(!f.ok&&!f.connected)return n({ok:!1,text:"✗ "+(f.error||f.message||t("modal.validationFailed"))}),!1;if(f.qrcodeUrl&&S(f.qrcodeUrl),f.status==="scaned"?n({ok:!0,text:t("modal.weixinScanned")}):f.status==="expired"?n({ok:!0,text:t("modal.weixinQrRefreshed")}):f.connected||n({ok:!0,text:t("modal.weixinWaitingScan")}),!f.connected)continue;n({ok:!0,text:t("modal.weixinLoginSuccess")});const l=f.baseUrl||b,U=f.botToken||"",W=f.accountId||"",A=await F.validateWeixinConfig(l,U,W,{signal:x.signal,timeoutMs:12e3});if(!A.ok)return n({ok:!1,text:"✗ "+(A.error||t("modal.validationFailed"))}),!1;const z=A.normalizedBaseUrl||l,g=new Set((N.current?.setupState?.channels||[]).filter(R=>(R.ready||R.configured)&&R.channel!=="weixin").map(R=>R.channel));return g.add("weixin"),await F.saveConfig({weixinBaseUrl:z,weixinBotToken:U,weixinAccountId:W,channels:[...g]}),await r(R=>{const I=R.setupState?.channels?.find(M=>M.channel==="weixin");return R.config.weixinBaseUrl===z&&R.config.weixinBotToken===U&&R.config.weixinAccountId===W&&!!I?.ready},{attempts:12,intervalMs:350})?(o(t("modal.weixinSaved")),!0):(n({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),o(t("modal.refreshStateFailed"),!1),!1)}return!1},[r,t,o]),k=async()=>{if(!w.trim()){o(t("modal.inputWeixinBaseUrl"),!1);return}m.current?.abort();const x=new AbortController;m.current=x,v(!0),S(""),c(""),n(null);let d=!1;try{const b=await F.startWeixinLogin(w.trim(),{signal:x.signal,timeoutMs:12e3});if(!b.ok||!b.qrcodeUrl){n({ok:!1,text:"✗ "+(b.error||b.message||t("modal.validationFailed"))});return}S(b.qrcodeUrl),c(b.sessionKey),n({ok:!0,text:t("modal.weixinWaitingScan")}),d=await E(x,b.sessionKey,w.trim())}catch(b){if(V(b))return;const f=$(b,t);n({ok:!1,text:"✗ "+f}),o(f,!1)}finally{m.current===x&&(m.current=null),v(!1),d&&h()}};return e.jsxs(O,{open:i,onClose:T,children:[e.jsx(H,{title:t("modal.configureWeixin"),onClose:T}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"text-xs leading-relaxed text-fg-4",children:t("modal.weixinScanHint")}),e.jsxs("div",{children:[e.jsx(L,{children:t("modal.weixinBaseUrl")}),e.jsx(P,{className:"font-mono text-xs",value:w,onChange:x=>G(x.target.value),placeholder:Y}),e.jsx("div",{className:"mt-1 text-[11px] text-fg-5",children:t("modal.weixinDefaultBaseUrlHint")})]}),B&&e.jsxs("div",{className:"rounded-xl border border-edge bg-panel-alt p-4",children:[e.jsx("img",{src:B,alt:t("modal.weixinQrAlt"),className:"mx-auto h-56 w-56 rounded-lg bg-white p-3 object-contain"}),y&&e.jsx("div",{className:"mt-2 truncate text-center font-mono text-[10px] text-fg-5",children:y})]}),u&&e.jsx("div",{className:"text-xs",style:{color:u.ok?"var(--th-ok)":"var(--th-err)"},children:u.text})]}),e.jsxs("div",{className:"mt-6 flex justify-end gap-2",children:[e.jsx(D,{variant:"ghost",onClick:T,children:t("modal.cancel")}),e.jsx(D,{variant:"primary",disabled:j,onClick:k,children:t(j?B?"modal.validating":"modal.weixinGeneratingQr":B?"modal.weixinRetry":"modal.weixinGenerateQr")})]})]})}function X({open:i,onClose:h,channel:p,titleKey:o,fields:r,validate:s,savedToastKey:t,guideTitleKey:w,guideStepKeys:G,guideOpenWhenEmpty:j=!0,validateTimeoutMs:v=12e3}){const B=C(g=>g.state),S=C(g=>g.toast),y=C(g=>g.reloadUntil),c=C(g=>g.locale),u=a.useMemo(()=>_(c),[c]),[n,m]=a.useState({}),[N,T]=a.useState({}),[E,k]=a.useState(!1),[x,d]=a.useState(null),[b,f]=a.useState(!1),l=a.useRef(null),U=a.useRef(B);U.current=B;const W=!!(G&&G.length);a.useEffect(()=>{if(i){const g=U.current?.config||{},K={};let R=!1;for(const I of r){const M=String(g[I.key]??"").trim();K[I.key]=M,!M&&I.required!==!1&&(R=!0)}m(K),T({}),d(null),f(W&&j&&R)}else l.current?.abort(),l.current=null,k(!1)},[i,r,W,j]),a.useEffect(()=>()=>{l.current?.abort(),l.current=null},[]);const A=()=>{l.current?.abort(),l.current=null,h()},z=async()=>{const g={};for(const I of r){const M=String(n[I.key]||"").trim();if(g[I.key]=M,I.required!==!1&&!M){S(u(I.labelKey)+": "+u("modal.fieldRequired"),!1);return}}l.current?.abort();const K=new AbortController;l.current=K,k(!0),d(null);let R=!1;try{const I=await s(g,{signal:K.signal,timeoutMs:v});if(!I.ok){d({ok:!1,text:"✗ "+(I.error||u("modal.validationFailed"))});return}d({ok:!0,text:"✓ "+(I.identity||u("modal.credentialsVerified"))});const M=new Set((B?.setupState?.channels||[]).filter(q=>(q.ready||q.configured)&&q.channel!==p).map(q=>q.channel));if(M.add(p),await F.saveConfig({...g,channels:[...M]}),!await y(q=>{const te=q.config||{};for(const J of r)if(String(te[J.key]||"").trim()!==g[J.key])return!1;return!!q.setupState?.channels?.find(J=>J.channel===p)?.ready},{attempts:10,intervalMs:350})){d({ok:!1,text:"✗ "+u("modal.refreshStateFailed")}),S(u("modal.refreshStateFailed"),!1);return}S(u(t)),R=!0}catch(I){if(V(I))return;const M=$(I,u);d({ok:!1,text:"✗ "+M}),S(M,!1)}finally{l.current===K&&(l.current=null),k(!1),R&&h()}};return e.jsxs(O,{open:i,onClose:A,children:[e.jsx(H,{title:u(o),onClose:A}),e.jsxs("div",{className:"space-y-4",children:[W&&w&&e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>f(!b),children:[e.jsx("span",{children:u(w)}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${b?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),b&&e.jsx("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:G.map(g=>e.jsx("p",{children:u(g)},g))})]}),r.map(g=>{const K=g.key,R=!!N[K],I=g.password&&!R?"password":"text";return e.jsxs("div",{children:[e.jsxs(L,{children:[u(g.labelKey),g.required===!1&&e.jsxs(e.Fragment,{children:[" ",e.jsxs("span",{className:"text-fg-5",children:["(",u("modal.optional"),")"]})]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(P,{type:I,className:"flex-1 font-mono text-xs",placeholder:g.placeholder?u(g.placeholder):"",value:n[K]||"",onChange:M=>m(Z=>({...Z,[K]:M.target.value}))}),g.password&&e.jsx(D,{variant:"ghost",size:"sm",className:"!w-[34px] !p-0",onClick:()=>T(M=>({...M,[K]:!M[K]})),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})})]})]},K)}),x&&e.jsx("div",{className:"text-xs",style:{color:x.ok?"var(--th-ok)":"var(--th-err)"},children:x.text})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(D,{variant:"ghost",onClick:A,children:u("modal.cancel")}),e.jsx(D,{variant:"primary",disabled:E,onClick:z,children:u(E?"modal.validating":"modal.validateSave")})]})]})}function me({open:i,onClose:h}){return e.jsx(X,{open:i,onClose:h,channel:"slack",titleKey:"modal.configureSlack",savedToastKey:"modal.slackSaved",guideTitleKey:"modal.slackGuideTitle",guideStepKeys:["modal.slackGuideStep1","modal.slackGuideStep2","modal.slackGuideStep3","modal.slackGuideStep4","modal.slackGuideStep5"],fields:[{key:"slackBotToken",labelKey:"modal.slackBotToken",password:!0,placeholder:"modal.slackBotTokenPlaceholder"},{key:"slackAppToken",labelKey:"modal.slackAppToken",password:!0,placeholder:"modal.slackAppTokenPlaceholder"}],validate:async(p,o)=>{const r=await F.validateSlackConfig(p.slackBotToken,p.slackAppToken,o),s=r.bot?.username?"@"+r.bot.username+(r.bot.team?" ("+r.bot.team+")":""):null;return{ok:r.ok,error:r.error,identity:s}}})}function xe({open:i,onClose:h}){return e.jsx(X,{open:i,onClose:h,channel:"discord",titleKey:"modal.configureDiscord",savedToastKey:"modal.discordSaved",guideTitleKey:"modal.discordGuideTitle",guideStepKeys:["modal.discordGuideStep1","modal.discordGuideStep2","modal.discordGuideStep3","modal.discordGuideStep4","modal.discordGuideStep5"],fields:[{key:"discordBotToken",labelKey:"modal.discordBotToken",password:!0,placeholder:"modal.discordBotTokenPlaceholder"}],validate:async(p,o)=>{const r=await F.validateDiscordConfig(p.discordBotToken,o),s=r.bot?.username?"@"+r.bot.username:null;return{ok:r.ok,error:r.error,identity:s}}})}function fe({open:i,onClose:h}){return e.jsx(X,{open:i,onClose:h,channel:"dingtalk",titleKey:"modal.configureDingtalk",savedToastKey:"modal.dingtalkSaved",guideTitleKey:"modal.dingtalkGuideTitle",guideStepKeys:["modal.dingtalkGuideStep1","modal.dingtalkGuideStep2","modal.dingtalkGuideStep3","modal.dingtalkGuideStep4","modal.dingtalkGuideStep5"],fields:[{key:"dingtalkClientId",labelKey:"modal.dingtalkClientId",placeholder:"modal.dingtalkClientIdPlaceholder"},{key:"dingtalkClientSecret",labelKey:"modal.dingtalkClientSecret",password:!0,placeholder:"modal.dingtalkClientSecretPlaceholder"}],validate:async(p,o)=>{const r=await F.validateDingtalkConfig(p.dingtalkClientId,p.dingtalkClientSecret,o),s=r.app?.clientId?r.app.clientId.length>12?r.app.clientId.slice(0,6)+"..."+r.app.clientId.slice(-4):r.app.clientId:null;return{ok:r.ok,error:r.error,identity:s}}})}function he({open:i,onClose:h}){return e.jsx(X,{open:i,onClose:h,channel:"wecom",titleKey:"modal.configureWeCom",savedToastKey:"modal.wecomSaved",guideTitleKey:"modal.wecomGuideTitle",guideStepKeys:["modal.wecomGuideStep1","modal.wecomGuideStep2","modal.wecomGuideStep3","modal.wecomGuideStep4","modal.wecomGuideNote"],fields:[{key:"wecomBotId",labelKey:"modal.wecomBotId",placeholder:"modal.wecomBotIdPlaceholder"},{key:"wecomBotSecret",labelKey:"modal.wecomBotSecret",password:!0,placeholder:"modal.wecomBotSecretPlaceholder"}],validate:async(p,o)=>{const r=await F.validateWecomConfig(p.wecomBotId,p.wecomBotSecret,o),s=r.bot?.botId?r.bot.botId:null;return{ok:r.ok,error:r.error,identity:s}}})}function pe({open:i,onClose:h}){const p=C(n=>n.state),o=C(n=>n.toast),r=C(n=>n.reload),s=C(n=>n.locale),t=a.useMemo(()=>_(s),[s]),w=p?.bot?.workdir||p?.runtimeWorkdir||"",[G,j]=a.useState(""),[v,B]=a.useState(!1),[S,y]=a.useState(0);a.useEffect(()=>{i&&(j(w),y(n=>n+1))},[i,w]);const c=a.useCallback(n=>{j(n)},[]),u=async()=>{const n=G.trim();if(!n){o(t("modal.selectDirFirst"),!1);return}B(!0);try{const m=await F.switchWorkdir(n);m.ok?(await r(),o(t("modal.switchedTo")+m.workdir),h()):o(m.error||t("modal.switchFailed"),!1)}catch{o(t("modal.switchFailed"),!1)}finally{B(!1)}};return e.jsx(O,{open:i,onClose:v?void 0:h,panelStyle:{width:"min(500px, calc(100vw - 2rem))",maxWidth:"min(500px, calc(100vw - 2rem))"},children:v?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 gap-4 animate-in",children:[e.jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",className:"animate-spin text-fg-3",style:{animationDuration:"1.2s"},children:[e.jsx("polyline",{points:"23 4 23 10 17 10"}),e.jsx("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]}),e.jsx("span",{className:"text-sm font-medium text-fg-3",children:t("modal.switching")}),e.jsx("span",{className:"text-xs text-fg-5 max-w-[280px] truncate",children:G})]}):e.jsxs(e.Fragment,{children:[e.jsx(H,{title:t("modal.switchWorkdir"),onClose:h}),e.jsx(se,{initialPath:w,onSelect:c,t},S),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(D,{variant:"ghost",onClick:h,children:t("modal.cancel")}),e.jsx(D,{variant:"primary",onClick:u,children:t("modal.selectDir")})]})]})})}function ge({open:i,onClose:h,onSaved:p}){const o=C(l=>l.toast),r=C(l=>l.locale),s=a.useMemo(()=>_(r),[r]),[t,w]=a.useState(null),[G,j]=a.useState(!1),[v,B]=a.useState(!1),[S,y]=a.useState(null);a.useEffect(()=>{i&&(j(!1),y(null),F.getBrowser().then(l=>{w(l),B(!!l.browser.enabled)}).catch(()=>w(null)))},[i]);const c=t?.browser,u=!!c?.enabled,n=!!c&&u!==v,m=c?.remoteCdpUrl||"",N=!!m&&v,T=c?.profileDir||"",E=s(N?"ext.browserRemote":"ext.profileDir"),k=N?m:T,x=!!c?.chromeInstalled&&!!c?.profileCreated,d=t?c?.enabled?N?s("ext.browserRemote"):x?s("ext.browserReady"):c?.chromeInstalled?s("ext.chromeInstalled"):s("ext.needsSetup"):s("ext.disabled"):s("status.loading"),b=t&&c?.enabled?N||x?"ok":c?.chromeInstalled?"warn":"err":"muted",f=async()=>{j(!0),y(null);let l=null;try{await F.saveConfig({browserEnabled:v}),l=await F.getBrowser(),w(l),p?.()}catch{y({ok:!1,text:"✗ "+s("ext.browserModeSaveFailed")}),o(s("ext.browserModeSaveFailed"),!1),j(!1);return}if(!v){y({ok:!0,text:"✓ "+s("ext.browserDisabledSaved")}),o(s("ext.browserDisabledSaved")),j(!1);return}if(l?.browser.remoteCdpUrl){y({ok:!0,text:"✓ "+s("ext.browserRemoteStep")}),o(s("ext.browserRemoteStep")),j(!1);return}try{const U=await F.setupBrowser();if(!U.ok){y({ok:!1,text:"✗ "+(U.error||s("ext.browserLaunchFailed"))}),o(U.error||s("ext.browserLaunchFailed"),!1);return}w(W=>W?{...W,browser:U.browser}:{browser:U.browser}),y({ok:!0,text:"✓ "+s("ext.browserEnabledLaunched")}),o(s("ext.browserEnabledLaunched")),p?.()}catch{y({ok:!1,text:"✗ "+s("ext.browserLaunchFailed")}),o(s("ext.browserLaunchFailed"),!1)}finally{j(!1)}};return e.jsxs(O,{open:i,onClose:h,children:[e.jsx(H,{title:s("ext.setupBrowser"),description:s("ext.setupBrowserDesc"),onClose:h}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(Q,{variant:b,children:d}),c&&e.jsxs(e.Fragment,{children:[e.jsx(Q,{variant:u?"accent":"muted",children:s(u?"ext.enabled":"ext.disabled")}),n&&e.jsx(Q,{variant:"warn",children:s("ext.pendingModeChange")}),c.running&&e.jsxs(Q,{variant:"accent",children:[s("ext.browserOpen"),c.pid?` · PID ${c.pid}`:""]})]})]}),e.jsxs("div",{className:"mt-3",children:[e.jsx(L,{children:E}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(P,{className:"font-mono text-xs flex-1",value:k||"—",readOnly:!0,onClick:l=>l.target.select()}),e.jsx(D,{variant:"outline",size:"sm",disabled:!k,onClick:()=>{k&&(navigator.clipboard.writeText(k),o(s("ext.step2Copied")))},children:s("ext.copyPath")})]})]}),e.jsx("div",{className:"mt-3 text-xs text-fg-5",children:s(v?"ext.profileModeDesc":"ext.browserDescDisabled")}),c?.detail&&e.jsx("div",{className:"mt-2 text-xs text-fg-5",children:c.detail}),S&&e.jsx("div",{className:"mt-3 text-xs",style:{color:S.ok?"var(--th-ok)":"var(--th-err)"},children:S.text})]}),e.jsx("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:e.jsxs("label",{className:"flex cursor-pointer items-start gap-3",children:[e.jsx("input",{type:"checkbox",checked:v,onChange:l=>B(l.target.checked),className:"mt-0.5 h-4 w-4 rounded border border-edge bg-inset"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.browserEnableToggle")}),e.jsx("div",{className:"text-xs text-fg-4",children:s("ext.browserEnableToggleDesc")})]})]})}),e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s(v?N?"ext.browserRemoteStep":"ext.step2Title":"ext.browserDisabledStepTitle")}),e.jsx("div",{className:"text-xs text-fg-4",children:s(v?N?"ext.browserRemoteStepDesc":"ext.step2Desc":"ext.browserDisabledHint")})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(D,{variant:"ghost",onClick:h,children:s("modal.cancel")}),e.jsx(D,{variant:"primary",disabled:G,onClick:f,children:s(G?"ext.launching":v?N?"ext.saveBrowserRemote":"ext.enableAndLaunchBrowser":"ext.saveBrowserDisabled")})]})]})}export{ge as BrowserSetupModal,fe as DingtalkModal,xe as DiscordModal,ce as FeishuModal,me as SlackModal,de as TelegramModal,he as WeComModal,ue as WeixinModal,pe as WorkdirModal};
1
+ import{r as a,j as e}from"./react-vendor-C7Sl8SE7.js";import{u as C,d as _,L,I as P,m as D,a as F,t as Q}from"./index-CLGovkkw.js";import{M as O,a as H}from"./Modal-D_PUi-5O.js";import{D as se}from"./DirBrowser-BINh_7NB.js";import"./router-DHISdpPk.js";const Y="https://ilinkai.weixin.qq.com";function V(i){return i instanceof Error&&(i.name==="AbortError"||/aborted/i.test(i.message))}function $(i,h){return i instanceof Error&&/timed out/i.test(i.message)?h("modal.requestTimeout"):h("modal.networkError")}function de({open:i,onClose:h}){const p=C(d=>d.state),o=C(d=>d.toast),r=C(d=>d.reloadUntil),s=C(d=>d.locale),t=a.useMemo(()=>_(s),[s]),[w,G]=a.useState(""),[j,v]=a.useState(""),[B,S]=a.useState(!1),[y,c]=a.useState(!1),[u,n]=a.useState(null),[m,N]=a.useState(!1),T=a.useRef(null),E=a.useRef(p);E.current=p,a.useEffect(()=>{i?(G(E.current?.config.telegramBotToken||""),v(E.current?.config.telegramAllowedChatIds||""),S(!1),n(null),N(!E.current?.config.telegramBotToken)):(T.current?.abort(),T.current=null,c(!1))},[i]),a.useEffect(()=>()=>{T.current?.abort(),T.current=null},[]);const k=async()=>{if(!w.trim()){o(t("modal.inputToken"),!1);return}T.current?.abort();const d=new AbortController;T.current=d,c(!0),n(null);let b=!1;try{const f=await F.validateTelegramConfig(w.trim(),j.trim(),{signal:d.signal,timeoutMs:12e3});if(!f.ok){n({ok:!1,text:"✗ "+(f.error||t("modal.validationFailed"))});return}const l=f.normalizedAllowedChatIds??j.trim();n({ok:!0,text:"✓ @"+(f.bot?.username||"bot")+(f.bot?.displayName?" ("+f.bot.displayName+")":"")});const U=new Set((p?.setupState?.channels||[]).filter(A=>(A.ready||A.configured)&&A.channel!=="telegram").map(A=>A.channel));if(U.add("telegram"),await F.saveConfig({telegramBotToken:w.trim(),telegramAllowedChatIds:l,channels:[...U]}),!await r(A=>{const z=A.setupState?.channels?.find(g=>g.channel==="telegram");return A.config.telegramBotToken===w.trim()&&(A.config.telegramAllowedChatIds||"")===l&&!!z?.ready},{attempts:10,intervalMs:350})){n({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),o(t("modal.refreshStateFailed"),!1);return}o(t("modal.tgSaved")),b=!0}catch(f){if(V(f))return;const l=$(f,t);n({ok:!1,text:"✗ "+l}),o(l,!1)}finally{T.current===d&&(T.current=null),c(!1),b&&h()}},x=()=>{T.current?.abort(),T.current=null,h()};return e.jsxs(O,{open:i,onClose:x,children:[e.jsx(H,{title:t("modal.configureTelegram"),onClose:x}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>N(!m),children:[e.jsx("span",{children:t("modal.tgGuideTitle")}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${m?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),m&&e.jsxs("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:[e.jsx("p",{children:t("modal.tgGuideStep1")}),e.jsx("p",{children:t("modal.tgGuideStep2")}),e.jsx("p",{children:t("modal.tgGuideStep3")}),e.jsx("p",{children:t("modal.tgGuideStep4")}),e.jsx("p",{className:"mt-2 text-[11px] text-fg-5",children:t("modal.tgGuideIdTip")})]})]}),e.jsxs("div",{children:[e.jsx(L,{children:t("modal.botToken")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(P,{type:B?"text":"password",className:"flex-1 font-mono text-xs",placeholder:t("modal.pasteToken"),value:w,onChange:d=>G(d.target.value)}),e.jsx(D,{variant:"ghost",size:"sm",className:"!w-[34px] !p-0",onClick:()=>S(!B),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})})]})]}),u&&e.jsx("div",{className:"text-xs",style:{color:u.ok?"var(--th-ok)":"var(--th-err)"},children:u.text}),e.jsxs("div",{children:[e.jsxs(L,{children:[t("modal.allowedIds")," ",e.jsxs("span",{className:"text-fg-5",children:["(",t("modal.optional"),")"]})]}),e.jsx(P,{className:"font-mono text-xs",placeholder:t("modal.commaSep"),value:j,onChange:d=>v(d.target.value)})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(D,{variant:"ghost",onClick:x,children:t("modal.cancel")}),e.jsx(D,{variant:"primary",disabled:y,onClick:k,children:t(y?"modal.validating":"modal.validateSave")})]})]})}const ee=JSON.stringify({scopes:{tenant:["im:message","im:message:send_as_bot","im:message.p2p_msg:readonly","im:message.group_at_msg:readonly","im:resource"],user:[]}},null,2);function ce({open:i,onClose:h}){const p=C(k=>k.state),o=C(k=>k.toast),r=C(k=>k.reloadUntil),s=C(k=>k.locale),t=a.useMemo(()=>_(s),[s]),[w,G]=a.useState(""),[j,v]=a.useState(""),[B,S]=a.useState(!1),[y,c]=a.useState(null),[u,n]=a.useState(!1),m=a.useRef(null),N=a.useRef(p);N.current=p,a.useEffect(()=>{i?(G(N.current?.config.feishuAppId||""),v(N.current?.config.feishuAppSecret||""),c(null),n(!N.current?.config.feishuAppId)):(m.current?.abort(),m.current=null,S(!1))},[i]),a.useEffect(()=>()=>{m.current?.abort(),m.current=null},[]);const T=async()=>{if(!w.trim()){o(t("modal.inputAppId"),!1);return}m.current?.abort();const k=new AbortController;m.current=k,S(!0),c(null);let x=!1;try{const d=await F.validateFeishuConfig(w.trim(),j.trim(),{signal:k.signal,timeoutMs:2e4});if(!d.ok){c({ok:!1,text:"✗ "+(d.error||t("modal.validationFailed"))});return}c({ok:!0,text:"✓ "+(d.app?.displayName||d.app?.appId||w.trim())});const b=new Set((p?.setupState?.channels||[]).filter(l=>(l.ready||l.configured)&&l.channel!=="feishu").map(l=>l.channel));if(b.add("feishu"),await F.saveConfig({feishuAppId:w.trim(),feishuAppSecret:j.trim(),channels:[...b]}),!await r(l=>{const U=l.setupState?.channels?.find(W=>W.channel==="feishu");return l.config.feishuAppId===w.trim()&&l.config.feishuAppSecret===j.trim()&&!!U?.ready},{attempts:10,intervalMs:350})){c({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),o(t("modal.refreshStateFailed"),!1);return}o(t("modal.feishuSaved")),x=!0}catch(d){if(V(d))return;const b=$(d,t);c({ok:!1,text:"✗ "+b}),o(b,!1)}finally{m.current===k&&(m.current=null),S(!1),x&&h()}},E=()=>{m.current?.abort(),m.current=null,h()};return e.jsxs(O,{open:i,onClose:E,children:[e.jsx(H,{title:t("modal.configureFeishu"),onClose:E}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>n(!u),children:[e.jsx("span",{children:t("modal.feishuGuideTitle")}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${u?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),u&&e.jsxs("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:[e.jsx("p",{children:t("modal.feishuGuideStep1")}),e.jsx("p",{children:t("modal.feishuGuideStep2")}),e.jsx("p",{children:t("modal.feishuGuideStep3")}),e.jsx("p",{children:t("modal.feishuGuideStep4")}),e.jsxs("div",{className:"ml-3 mt-1",children:[e.jsxs("div",{className:"mb-1 flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-[11px] text-fg-5",children:t("modal.feishuGuidePerms")}),e.jsx(D,{variant:"outline",size:"sm",onClick:()=>{navigator.clipboard.writeText(ee),o(t("modal.feishuJsonCopied"))},children:t("modal.feishuCopyJson")})]}),e.jsx("pre",{className:"overflow-x-auto rounded-md border border-edge bg-inset p-2 font-mono text-[11px] leading-snug text-fg-3",children:ee}),e.jsx("p",{className:"mt-1 text-[11px] text-fg-5",children:t("modal.feishuJsonNote")})]}),e.jsx("p",{children:t("modal.feishuGuideStep5")}),e.jsx("p",{children:t("modal.feishuGuideStep6")}),e.jsx("p",{children:t("modal.feishuGuideStep7")}),e.jsx("p",{className:"mt-2 text-[11px] text-fg-5",children:t("modal.feishuGuideCardKitTip")})]})]}),e.jsxs("div",{children:[e.jsx(L,{children:t("modal.appId")}),e.jsx(P,{className:"font-mono text-xs",placeholder:t("modal.feishuPlaceholder"),value:w,onChange:k=>G(k.target.value)})]}),e.jsxs("div",{children:[e.jsx(L,{children:t("modal.appSecret")}),e.jsx(P,{type:"password",className:"font-mono text-xs",placeholder:t("modal.appSecret"),value:j,onChange:k=>v(k.target.value)})]}),y&&e.jsx("div",{className:"text-xs",style:{color:y.ok?"var(--th-ok)":"var(--th-err)"},children:y.text})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(D,{variant:"ghost",onClick:E,children:t("modal.cancel")}),e.jsx(D,{variant:"primary",disabled:B,onClick:T,children:t(B?"modal.validating":"modal.validateSave")})]})]})}function ue({open:i,onClose:h}){const p=C(x=>x.state),o=C(x=>x.toast),r=C(x=>x.reloadUntil),s=C(x=>x.locale),t=a.useMemo(()=>_(s),[s]),[w,G]=a.useState(Y),[j,v]=a.useState(!1),[B,S]=a.useState(""),[y,c]=a.useState(""),[u,n]=a.useState(null),m=a.useRef(null),N=a.useRef(p);N.current=p,a.useEffect(()=>{i?(G(N.current?.config.weixinBaseUrl||Y),v(!1),S(""),c(""),n(null)):(m.current?.abort(),m.current=null,v(!1))},[i]),a.useEffect(()=>()=>{m.current?.abort(),m.current=null},[]);const T=()=>{m.current?.abort(),m.current=null,h()},E=a.useCallback(async(x,d,b)=>{for(;!x.signal.aborted;){const f=await F.waitWeixinLogin(d,b,{signal:x.signal,timeoutMs:45e3});if(!f.ok&&!f.connected)return n({ok:!1,text:"✗ "+(f.error||f.message||t("modal.validationFailed"))}),!1;if(f.qrcodeUrl&&S(f.qrcodeUrl),f.status==="scaned"?n({ok:!0,text:t("modal.weixinScanned")}):f.status==="expired"?n({ok:!0,text:t("modal.weixinQrRefreshed")}):f.connected||n({ok:!0,text:t("modal.weixinWaitingScan")}),!f.connected)continue;n({ok:!0,text:t("modal.weixinLoginSuccess")});const l=f.baseUrl||b,U=f.botToken||"",W=f.accountId||"",A=await F.validateWeixinConfig(l,U,W,{signal:x.signal,timeoutMs:12e3});if(!A.ok)return n({ok:!1,text:"✗ "+(A.error||t("modal.validationFailed"))}),!1;const z=A.normalizedBaseUrl||l,g=new Set((N.current?.setupState?.channels||[]).filter(R=>(R.ready||R.configured)&&R.channel!=="weixin").map(R=>R.channel));return g.add("weixin"),await F.saveConfig({weixinBaseUrl:z,weixinBotToken:U,weixinAccountId:W,channels:[...g]}),await r(R=>{const I=R.setupState?.channels?.find(M=>M.channel==="weixin");return R.config.weixinBaseUrl===z&&R.config.weixinBotToken===U&&R.config.weixinAccountId===W&&!!I?.ready},{attempts:12,intervalMs:350})?(o(t("modal.weixinSaved")),!0):(n({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),o(t("modal.refreshStateFailed"),!1),!1)}return!1},[r,t,o]),k=async()=>{if(!w.trim()){o(t("modal.inputWeixinBaseUrl"),!1);return}m.current?.abort();const x=new AbortController;m.current=x,v(!0),S(""),c(""),n(null);let d=!1;try{const b=await F.startWeixinLogin(w.trim(),{signal:x.signal,timeoutMs:12e3});if(!b.ok||!b.qrcodeUrl){n({ok:!1,text:"✗ "+(b.error||b.message||t("modal.validationFailed"))});return}S(b.qrcodeUrl),c(b.sessionKey),n({ok:!0,text:t("modal.weixinWaitingScan")}),d=await E(x,b.sessionKey,w.trim())}catch(b){if(V(b))return;const f=$(b,t);n({ok:!1,text:"✗ "+f}),o(f,!1)}finally{m.current===x&&(m.current=null),v(!1),d&&h()}};return e.jsxs(O,{open:i,onClose:T,children:[e.jsx(H,{title:t("modal.configureWeixin"),onClose:T}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"text-xs leading-relaxed text-fg-4",children:t("modal.weixinScanHint")}),e.jsxs("div",{children:[e.jsx(L,{children:t("modal.weixinBaseUrl")}),e.jsx(P,{className:"font-mono text-xs",value:w,onChange:x=>G(x.target.value),placeholder:Y}),e.jsx("div",{className:"mt-1 text-[11px] text-fg-5",children:t("modal.weixinDefaultBaseUrlHint")})]}),B&&e.jsxs("div",{className:"rounded-xl border border-edge bg-panel-alt p-4",children:[e.jsx("img",{src:B,alt:t("modal.weixinQrAlt"),className:"mx-auto h-56 w-56 rounded-lg bg-white p-3 object-contain"}),y&&e.jsx("div",{className:"mt-2 truncate text-center font-mono text-[10px] text-fg-5",children:y})]}),u&&e.jsx("div",{className:"text-xs",style:{color:u.ok?"var(--th-ok)":"var(--th-err)"},children:u.text})]}),e.jsxs("div",{className:"mt-6 flex justify-end gap-2",children:[e.jsx(D,{variant:"ghost",onClick:T,children:t("modal.cancel")}),e.jsx(D,{variant:"primary",disabled:j,onClick:k,children:t(j?B?"modal.validating":"modal.weixinGeneratingQr":B?"modal.weixinRetry":"modal.weixinGenerateQr")})]})]})}function X({open:i,onClose:h,channel:p,titleKey:o,fields:r,validate:s,savedToastKey:t,guideTitleKey:w,guideStepKeys:G,guideOpenWhenEmpty:j=!0,validateTimeoutMs:v=12e3}){const B=C(g=>g.state),S=C(g=>g.toast),y=C(g=>g.reloadUntil),c=C(g=>g.locale),u=a.useMemo(()=>_(c),[c]),[n,m]=a.useState({}),[N,T]=a.useState({}),[E,k]=a.useState(!1),[x,d]=a.useState(null),[b,f]=a.useState(!1),l=a.useRef(null),U=a.useRef(B);U.current=B;const W=!!(G&&G.length);a.useEffect(()=>{if(i){const g=U.current?.config||{},K={};let R=!1;for(const I of r){const M=String(g[I.key]??"").trim();K[I.key]=M,!M&&I.required!==!1&&(R=!0)}m(K),T({}),d(null),f(W&&j&&R)}else l.current?.abort(),l.current=null,k(!1)},[i,r,W,j]),a.useEffect(()=>()=>{l.current?.abort(),l.current=null},[]);const A=()=>{l.current?.abort(),l.current=null,h()},z=async()=>{const g={};for(const I of r){const M=String(n[I.key]||"").trim();if(g[I.key]=M,I.required!==!1&&!M){S(u(I.labelKey)+": "+u("modal.fieldRequired"),!1);return}}l.current?.abort();const K=new AbortController;l.current=K,k(!0),d(null);let R=!1;try{const I=await s(g,{signal:K.signal,timeoutMs:v});if(!I.ok){d({ok:!1,text:"✗ "+(I.error||u("modal.validationFailed"))});return}d({ok:!0,text:"✓ "+(I.identity||u("modal.credentialsVerified"))});const M=new Set((B?.setupState?.channels||[]).filter(q=>(q.ready||q.configured)&&q.channel!==p).map(q=>q.channel));if(M.add(p),await F.saveConfig({...g,channels:[...M]}),!await y(q=>{const te=q.config||{};for(const J of r)if(String(te[J.key]||"").trim()!==g[J.key])return!1;return!!q.setupState?.channels?.find(J=>J.channel===p)?.ready},{attempts:10,intervalMs:350})){d({ok:!1,text:"✗ "+u("modal.refreshStateFailed")}),S(u("modal.refreshStateFailed"),!1);return}S(u(t)),R=!0}catch(I){if(V(I))return;const M=$(I,u);d({ok:!1,text:"✗ "+M}),S(M,!1)}finally{l.current===K&&(l.current=null),k(!1),R&&h()}};return e.jsxs(O,{open:i,onClose:A,children:[e.jsx(H,{title:u(o),onClose:A}),e.jsxs("div",{className:"space-y-4",children:[W&&w&&e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>f(!b),children:[e.jsx("span",{children:u(w)}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${b?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),b&&e.jsx("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:G.map(g=>e.jsx("p",{children:u(g)},g))})]}),r.map(g=>{const K=g.key,R=!!N[K],I=g.password&&!R?"password":"text";return e.jsxs("div",{children:[e.jsxs(L,{children:[u(g.labelKey),g.required===!1&&e.jsxs(e.Fragment,{children:[" ",e.jsxs("span",{className:"text-fg-5",children:["(",u("modal.optional"),")"]})]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(P,{type:I,className:"flex-1 font-mono text-xs",placeholder:g.placeholder?u(g.placeholder):"",value:n[K]||"",onChange:M=>m(Z=>({...Z,[K]:M.target.value}))}),g.password&&e.jsx(D,{variant:"ghost",size:"sm",className:"!w-[34px] !p-0",onClick:()=>T(M=>({...M,[K]:!M[K]})),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})})]})]},K)}),x&&e.jsx("div",{className:"text-xs",style:{color:x.ok?"var(--th-ok)":"var(--th-err)"},children:x.text})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(D,{variant:"ghost",onClick:A,children:u("modal.cancel")}),e.jsx(D,{variant:"primary",disabled:E,onClick:z,children:u(E?"modal.validating":"modal.validateSave")})]})]})}function me({open:i,onClose:h}){return e.jsx(X,{open:i,onClose:h,channel:"slack",titleKey:"modal.configureSlack",savedToastKey:"modal.slackSaved",guideTitleKey:"modal.slackGuideTitle",guideStepKeys:["modal.slackGuideStep1","modal.slackGuideStep2","modal.slackGuideStep3","modal.slackGuideStep4","modal.slackGuideStep5"],fields:[{key:"slackBotToken",labelKey:"modal.slackBotToken",password:!0,placeholder:"modal.slackBotTokenPlaceholder"},{key:"slackAppToken",labelKey:"modal.slackAppToken",password:!0,placeholder:"modal.slackAppTokenPlaceholder"}],validate:async(p,o)=>{const r=await F.validateSlackConfig(p.slackBotToken,p.slackAppToken,o),s=r.bot?.username?"@"+r.bot.username+(r.bot.team?" ("+r.bot.team+")":""):null;return{ok:r.ok,error:r.error,identity:s}}})}function xe({open:i,onClose:h}){return e.jsx(X,{open:i,onClose:h,channel:"discord",titleKey:"modal.configureDiscord",savedToastKey:"modal.discordSaved",guideTitleKey:"modal.discordGuideTitle",guideStepKeys:["modal.discordGuideStep1","modal.discordGuideStep2","modal.discordGuideStep3","modal.discordGuideStep4","modal.discordGuideStep5"],fields:[{key:"discordBotToken",labelKey:"modal.discordBotToken",password:!0,placeholder:"modal.discordBotTokenPlaceholder"}],validate:async(p,o)=>{const r=await F.validateDiscordConfig(p.discordBotToken,o),s=r.bot?.username?"@"+r.bot.username:null;return{ok:r.ok,error:r.error,identity:s}}})}function fe({open:i,onClose:h}){return e.jsx(X,{open:i,onClose:h,channel:"dingtalk",titleKey:"modal.configureDingtalk",savedToastKey:"modal.dingtalkSaved",guideTitleKey:"modal.dingtalkGuideTitle",guideStepKeys:["modal.dingtalkGuideStep1","modal.dingtalkGuideStep2","modal.dingtalkGuideStep3","modal.dingtalkGuideStep4","modal.dingtalkGuideStep5"],fields:[{key:"dingtalkClientId",labelKey:"modal.dingtalkClientId",placeholder:"modal.dingtalkClientIdPlaceholder"},{key:"dingtalkClientSecret",labelKey:"modal.dingtalkClientSecret",password:!0,placeholder:"modal.dingtalkClientSecretPlaceholder"}],validate:async(p,o)=>{const r=await F.validateDingtalkConfig(p.dingtalkClientId,p.dingtalkClientSecret,o),s=r.app?.clientId?r.app.clientId.length>12?r.app.clientId.slice(0,6)+"..."+r.app.clientId.slice(-4):r.app.clientId:null;return{ok:r.ok,error:r.error,identity:s}}})}function he({open:i,onClose:h}){return e.jsx(X,{open:i,onClose:h,channel:"wecom",titleKey:"modal.configureWeCom",savedToastKey:"modal.wecomSaved",guideTitleKey:"modal.wecomGuideTitle",guideStepKeys:["modal.wecomGuideStep1","modal.wecomGuideStep2","modal.wecomGuideStep3","modal.wecomGuideStep4","modal.wecomGuideNote"],fields:[{key:"wecomBotId",labelKey:"modal.wecomBotId",placeholder:"modal.wecomBotIdPlaceholder"},{key:"wecomBotSecret",labelKey:"modal.wecomBotSecret",password:!0,placeholder:"modal.wecomBotSecretPlaceholder"}],validate:async(p,o)=>{const r=await F.validateWecomConfig(p.wecomBotId,p.wecomBotSecret,o),s=r.bot?.botId?r.bot.botId:null;return{ok:r.ok,error:r.error,identity:s}}})}function pe({open:i,onClose:h}){const p=C(n=>n.state),o=C(n=>n.toast),r=C(n=>n.reload),s=C(n=>n.locale),t=a.useMemo(()=>_(s),[s]),w=p?.bot?.workdir||p?.runtimeWorkdir||"",[G,j]=a.useState(""),[v,B]=a.useState(!1),[S,y]=a.useState(0);a.useEffect(()=>{i&&(j(w),y(n=>n+1))},[i,w]);const c=a.useCallback(n=>{j(n)},[]),u=async()=>{const n=G.trim();if(!n){o(t("modal.selectDirFirst"),!1);return}B(!0);try{const m=await F.switchWorkdir(n);m.ok?(await r(),o(t("modal.switchedTo")+m.workdir),h()):o(m.error||t("modal.switchFailed"),!1)}catch{o(t("modal.switchFailed"),!1)}finally{B(!1)}};return e.jsx(O,{open:i,onClose:v?void 0:h,panelStyle:{width:"min(500px, calc(100vw - 2rem))",maxWidth:"min(500px, calc(100vw - 2rem))"},children:v?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 gap-4 animate-in",children:[e.jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",className:"animate-spin text-fg-3",style:{animationDuration:"1.2s"},children:[e.jsx("polyline",{points:"23 4 23 10 17 10"}),e.jsx("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]}),e.jsx("span",{className:"text-sm font-medium text-fg-3",children:t("modal.switching")}),e.jsx("span",{className:"text-xs text-fg-5 max-w-[280px] truncate",children:G})]}):e.jsxs(e.Fragment,{children:[e.jsx(H,{title:t("modal.switchWorkdir"),onClose:h}),e.jsx(se,{initialPath:w,onSelect:c,t},S),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(D,{variant:"ghost",onClick:h,children:t("modal.cancel")}),e.jsx(D,{variant:"primary",onClick:u,children:t("modal.selectDir")})]})]})})}function ge({open:i,onClose:h,onSaved:p}){const o=C(l=>l.toast),r=C(l=>l.locale),s=a.useMemo(()=>_(r),[r]),[t,w]=a.useState(null),[G,j]=a.useState(!1),[v,B]=a.useState(!1),[S,y]=a.useState(null);a.useEffect(()=>{i&&(j(!1),y(null),F.getBrowser().then(l=>{w(l),B(!!l.browser.enabled)}).catch(()=>w(null)))},[i]);const c=t?.browser,u=!!c?.enabled,n=!!c&&u!==v,m=c?.remoteCdpUrl||"",N=!!m&&v,T=c?.profileDir||"",E=s(N?"ext.browserRemote":"ext.profileDir"),k=N?m:T,x=!!c?.chromeInstalled&&!!c?.profileCreated,d=t?c?.enabled?N?s("ext.browserRemote"):x?s("ext.browserReady"):c?.chromeInstalled?s("ext.chromeInstalled"):s("ext.needsSetup"):s("ext.disabled"):s("status.loading"),b=t&&c?.enabled?N||x?"ok":c?.chromeInstalled?"warn":"err":"muted",f=async()=>{j(!0),y(null);let l=null;try{await F.saveConfig({browserEnabled:v}),l=await F.getBrowser(),w(l),p?.()}catch{y({ok:!1,text:"✗ "+s("ext.browserModeSaveFailed")}),o(s("ext.browserModeSaveFailed"),!1),j(!1);return}if(!v){y({ok:!0,text:"✓ "+s("ext.browserDisabledSaved")}),o(s("ext.browserDisabledSaved")),j(!1);return}if(l?.browser.remoteCdpUrl){y({ok:!0,text:"✓ "+s("ext.browserRemoteStep")}),o(s("ext.browserRemoteStep")),j(!1);return}try{const U=await F.setupBrowser();if(!U.ok){y({ok:!1,text:"✗ "+(U.error||s("ext.browserLaunchFailed"))}),o(U.error||s("ext.browserLaunchFailed"),!1);return}w(W=>W?{...W,browser:U.browser}:{browser:U.browser}),y({ok:!0,text:"✓ "+s("ext.browserEnabledLaunched")}),o(s("ext.browserEnabledLaunched")),p?.()}catch{y({ok:!1,text:"✗ "+s("ext.browserLaunchFailed")}),o(s("ext.browserLaunchFailed"),!1)}finally{j(!1)}};return e.jsxs(O,{open:i,onClose:h,children:[e.jsx(H,{title:s("ext.setupBrowser"),description:s("ext.setupBrowserDesc"),onClose:h}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(Q,{variant:b,children:d}),c&&e.jsxs(e.Fragment,{children:[e.jsx(Q,{variant:u?"accent":"muted",children:s(u?"ext.enabled":"ext.disabled")}),n&&e.jsx(Q,{variant:"warn",children:s("ext.pendingModeChange")}),c.running&&e.jsxs(Q,{variant:"accent",children:[s("ext.browserOpen"),c.pid?` · PID ${c.pid}`:""]})]})]}),e.jsxs("div",{className:"mt-3",children:[e.jsx(L,{children:E}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(P,{className:"font-mono text-xs flex-1",value:k||"—",readOnly:!0,onClick:l=>l.target.select()}),e.jsx(D,{variant:"outline",size:"sm",disabled:!k,onClick:()=>{k&&(navigator.clipboard.writeText(k),o(s("ext.step2Copied")))},children:s("ext.copyPath")})]})]}),e.jsx("div",{className:"mt-3 text-xs text-fg-5",children:s(v?"ext.profileModeDesc":"ext.browserDescDisabled")}),c?.detail&&e.jsx("div",{className:"mt-2 text-xs text-fg-5",children:c.detail}),S&&e.jsx("div",{className:"mt-3 text-xs",style:{color:S.ok?"var(--th-ok)":"var(--th-err)"},children:S.text})]}),e.jsx("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:e.jsxs("label",{className:"flex cursor-pointer items-start gap-3",children:[e.jsx("input",{type:"checkbox",checked:v,onChange:l=>B(l.target.checked),className:"mt-0.5 h-4 w-4 rounded border border-edge bg-inset"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.browserEnableToggle")}),e.jsx("div",{className:"text-xs text-fg-4",children:s("ext.browserEnableToggleDesc")})]})]})}),e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s(v?N?"ext.browserRemoteStep":"ext.step2Title":"ext.browserDisabledStepTitle")}),e.jsx("div",{className:"text-xs text-fg-4",children:s(v?N?"ext.browserRemoteStepDesc":"ext.step2Desc":"ext.browserDisabledHint")})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(D,{variant:"ghost",onClick:h,children:s("modal.cancel")}),e.jsx(D,{variant:"primary",disabled:G,onClick:f,children:s(G?"ext.launching":v?N?"ext.saveBrowserRemote":"ext.enableAndLaunchBrowser":"ext.saveBrowserDisabled")})]})]})}export{ge as BrowserSetupModal,fe as DingtalkModal,xe as DiscordModal,ce as FeishuModal,me as SlackModal,de as TelegramModal,he as WeComModal,ue as WeixinModal,pe as WorkdirModal};
@@ -1 +1 @@
1
- import{r as a,j as e,a as H}from"./react-vendor-C7Sl8SE7.js";import{c}from"./index-BlqvzDUL.js";function y(u,h){return!!(u&&h instanceof Node&&u.contains(h))}function M({value:u,options:h,onChange:j,className:g,placeholder:l="—",disabled:x=!1,readOnly:f=!1}){const p=h.find(t=>t.value===u),w=f||h.length<=1,[i,m]=a.useState(!1),[o,d]=a.useState(null),n=a.useRef(null),_=a.useRef(null);if(a.useEffect(()=>{if(!i)return;const t=s=>{y(n.current,s.target)||y(_.current,s.target)||m(!1)},r=s=>{s.key==="Escape"&&(s.stopPropagation(),m(!1))};return document.addEventListener("mousedown",t),document.addEventListener("keydown",r,!0),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("keydown",r,!0)}},[i]),a.useLayoutEffect(()=>{if(!i)return;const t=()=>{const r=n.current;if(!r)return;const s=r.getBoundingClientRect(),k=window.innerHeight-s.bottom-12,E=s.top-12,N=k<220&&E>k,L=Math.max(140,Math.min(260,N?E:k));d({left:s.left,top:N?Math.max(12,s.top-L-8):s.bottom+8,width:s.width,maxHeight:L})};return t(),window.addEventListener("resize",t),window.addEventListener("scroll",t,!0),()=>{window.removeEventListener("resize",t),window.removeEventListener("scroll",t,!0)}},[i]),w)return e.jsx("div",{className:c("flex h-9 w-full items-center rounded-md border border-edge bg-panel-alt px-3 text-[13px] text-fg-5 shadow-none",x&&"cursor-not-allowed",g),children:e.jsx("span",{className:c("truncate",!p&&"text-fg-6"),children:p?.label||l})});const b=t=>{x||(j(t),m(!1))},v=i&&o?H.createPortal(e.jsx("div",{ref:_,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:o.left,top:o.top,width:o.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:o.maxHeight},children:h.map(t=>{const r=t.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":r,onClick:()=>b(t.value),className:c("flex w-full items-start gap-2 rounded-lg px-3 py-2 text-left text-[13px] transition-colors duration-200",r?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-baseline gap-2",children:[e.jsx("span",{className:"min-w-0 flex-1 truncate",children:t.label}),t.meta&&e.jsx("span",{className:"shrink-0 font-mono text-[10px] text-fg-5",children:t.meta})]}),t.description&&e.jsx("div",{className:"mt-0.5 truncate font-mono text-[10px] leading-relaxed text-fg-5",children:t.description})]}),r&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"mt-0.5 shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},t.value)})})}),document.body):null;return e.jsxs("div",{ref:n,className:c("relative",g),children:[e.jsxs("button",{type:"button",disabled:x,"aria-haspopup":"listbox","aria-expanded":i,onClick:()=>m(t=>!t),className:c("flex h-9 w-full items-center rounded-md border border-control-border bg-control px-3 pr-8 text-left text-[13px] text-fg shadow-sm","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-control-border-h hover:bg-control-h","focus-visible:border-control-border-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]","disabled:cursor-not-allowed disabled:bg-panel-alt disabled:border-edge disabled:text-fg-5","disabled:shadow-none disabled:hover:border-edge disabled:hover:bg-panel-alt",i&&"border-control-border-h bg-control-h shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[e.jsx("span",{className:c("min-w-0 flex-1 truncate",!p&&"text-fg-5"),children:p?.label||l}),e.jsx("span",{className:c("pointer-events-none absolute inset-y-0 right-3 flex items-center text-fg-4 transition-transform duration-200",i&&"rotate-180"),children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})})]}),v]})}function P({value:u,options:h,onChange:j,renderIcon:g}){const[l,x]=a.useState(!1),[f,p]=a.useState(null),w=a.useRef(null),i=a.useRef(null);a.useEffect(()=>{if(!l)return;const o=n=>{y(w.current,n.target)||y(i.current,n.target)||x(!1)},d=n=>{n.key==="Escape"&&(n.stopPropagation(),x(!1))};return document.addEventListener("mousedown",o),document.addEventListener("keydown",d,!0),()=>{document.removeEventListener("mousedown",o),document.removeEventListener("keydown",d,!0)}},[l]),a.useLayoutEffect(()=>{if(!l)return;const o=()=>{const d=w.current;if(!d)return;const n=d.getBoundingClientRect(),b=window.innerHeight-n.bottom-12,v=n.top-12,t=b<220&&v>b,r=Math.max(140,Math.min(260,t?v:b));p({left:n.left,top:t?Math.max(12,n.top-r-8):n.bottom+8,width:Math.max(n.width,160),maxHeight:r})};return o(),window.addEventListener("resize",o),window.addEventListener("scroll",o,!0),()=>{window.removeEventListener("resize",o),window.removeEventListener("scroll",o,!0)}},[l]);const m=l&&f?H.createPortal(e.jsx("div",{ref:i,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:f.left,top:f.top,width:f.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:f.maxHeight},children:h.map(o=>{const d=o.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":d,onClick:()=>{j(o.value),x(!1)},className:c("flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-left text-[13px] transition-colors duration-200",d?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[g(o.value),e.jsx("span",{className:"min-w-0 flex-1 truncate",children:o.label}),d&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},o.value)})})}),document.body):null;return e.jsxs("div",{ref:w,className:"relative shrink-0",children:[e.jsxs("button",{type:"button","aria-haspopup":"listbox","aria-expanded":l,onClick:()=>x(o=>!o),className:c("inline-flex items-center gap-1.5 rounded-lg border border-edge bg-inset px-2 py-1.5","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-edge-h hover:bg-panel","focus-visible:border-edge-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]",l&&"border-edge-h bg-panel shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[g(u),e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:c("text-fg-5 transition-transform duration-200",l&&"rotate-180"),children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),m]})}export{P as I,M as S};
1
+ import{r as a,j as e,a as H}from"./react-vendor-C7Sl8SE7.js";import{c}from"./index-CLGovkkw.js";function y(u,h){return!!(u&&h instanceof Node&&u.contains(h))}function M({value:u,options:h,onChange:j,className:g,placeholder:l="—",disabled:x=!1,readOnly:f=!1}){const p=h.find(t=>t.value===u),w=f||h.length<=1,[i,m]=a.useState(!1),[o,d]=a.useState(null),n=a.useRef(null),_=a.useRef(null);if(a.useEffect(()=>{if(!i)return;const t=s=>{y(n.current,s.target)||y(_.current,s.target)||m(!1)},r=s=>{s.key==="Escape"&&(s.stopPropagation(),m(!1))};return document.addEventListener("mousedown",t),document.addEventListener("keydown",r,!0),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("keydown",r,!0)}},[i]),a.useLayoutEffect(()=>{if(!i)return;const t=()=>{const r=n.current;if(!r)return;const s=r.getBoundingClientRect(),k=window.innerHeight-s.bottom-12,E=s.top-12,N=k<220&&E>k,L=Math.max(140,Math.min(260,N?E:k));d({left:s.left,top:N?Math.max(12,s.top-L-8):s.bottom+8,width:s.width,maxHeight:L})};return t(),window.addEventListener("resize",t),window.addEventListener("scroll",t,!0),()=>{window.removeEventListener("resize",t),window.removeEventListener("scroll",t,!0)}},[i]),w)return e.jsx("div",{className:c("flex h-9 w-full items-center rounded-md border border-edge bg-panel-alt px-3 text-[13px] text-fg-5 shadow-none",x&&"cursor-not-allowed",g),children:e.jsx("span",{className:c("truncate",!p&&"text-fg-6"),children:p?.label||l})});const b=t=>{x||(j(t),m(!1))},v=i&&o?H.createPortal(e.jsx("div",{ref:_,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:o.left,top:o.top,width:o.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:o.maxHeight},children:h.map(t=>{const r=t.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":r,onClick:()=>b(t.value),className:c("flex w-full items-start gap-2 rounded-lg px-3 py-2 text-left text-[13px] transition-colors duration-200",r?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-baseline gap-2",children:[e.jsx("span",{className:"min-w-0 flex-1 truncate",children:t.label}),t.meta&&e.jsx("span",{className:"shrink-0 font-mono text-[10px] text-fg-5",children:t.meta})]}),t.description&&e.jsx("div",{className:"mt-0.5 truncate font-mono text-[10px] leading-relaxed text-fg-5",children:t.description})]}),r&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"mt-0.5 shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},t.value)})})}),document.body):null;return e.jsxs("div",{ref:n,className:c("relative",g),children:[e.jsxs("button",{type:"button",disabled:x,"aria-haspopup":"listbox","aria-expanded":i,onClick:()=>m(t=>!t),className:c("flex h-9 w-full items-center rounded-md border border-control-border bg-control px-3 pr-8 text-left text-[13px] text-fg shadow-sm","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-control-border-h hover:bg-control-h","focus-visible:border-control-border-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]","disabled:cursor-not-allowed disabled:bg-panel-alt disabled:border-edge disabled:text-fg-5","disabled:shadow-none disabled:hover:border-edge disabled:hover:bg-panel-alt",i&&"border-control-border-h bg-control-h shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[e.jsx("span",{className:c("min-w-0 flex-1 truncate",!p&&"text-fg-5"),children:p?.label||l}),e.jsx("span",{className:c("pointer-events-none absolute inset-y-0 right-3 flex items-center text-fg-4 transition-transform duration-200",i&&"rotate-180"),children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})})]}),v]})}function P({value:u,options:h,onChange:j,renderIcon:g}){const[l,x]=a.useState(!1),[f,p]=a.useState(null),w=a.useRef(null),i=a.useRef(null);a.useEffect(()=>{if(!l)return;const o=n=>{y(w.current,n.target)||y(i.current,n.target)||x(!1)},d=n=>{n.key==="Escape"&&(n.stopPropagation(),x(!1))};return document.addEventListener("mousedown",o),document.addEventListener("keydown",d,!0),()=>{document.removeEventListener("mousedown",o),document.removeEventListener("keydown",d,!0)}},[l]),a.useLayoutEffect(()=>{if(!l)return;const o=()=>{const d=w.current;if(!d)return;const n=d.getBoundingClientRect(),b=window.innerHeight-n.bottom-12,v=n.top-12,t=b<220&&v>b,r=Math.max(140,Math.min(260,t?v:b));p({left:n.left,top:t?Math.max(12,n.top-r-8):n.bottom+8,width:Math.max(n.width,160),maxHeight:r})};return o(),window.addEventListener("resize",o),window.addEventListener("scroll",o,!0),()=>{window.removeEventListener("resize",o),window.removeEventListener("scroll",o,!0)}},[l]);const m=l&&f?H.createPortal(e.jsx("div",{ref:i,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:f.left,top:f.top,width:f.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:f.maxHeight},children:h.map(o=>{const d=o.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":d,onClick:()=>{j(o.value),x(!1)},className:c("flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-left text-[13px] transition-colors duration-200",d?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[g(o.value),e.jsx("span",{className:"min-w-0 flex-1 truncate",children:o.label}),d&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},o.value)})})}),document.body):null;return e.jsxs("div",{ref:w,className:"relative shrink-0",children:[e.jsxs("button",{type:"button","aria-haspopup":"listbox","aria-expanded":l,onClick:()=>x(o=>!o),className:c("inline-flex items-center gap-1.5 rounded-lg border border-edge bg-inset px-2 py-1.5","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-edge-h hover:bg-panel","focus-visible:border-edge-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]",l&&"border-edge-h bg-panel shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[g(u),e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:c("text-fg-5 transition-transform duration-200",l&&"rotate-180"),children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),m]})}export{P as I,M as S};
@@ -0,0 +1 @@
1
+ import{r as t,j as n}from"./react-vendor-C7Sl8SE7.js";import{c as It,I as bt,S as Ie,m as be,a as j,u as Je,d as vt,g as yt,l as Tt,e as jt,j as Rt,f as wt,s as Nt,Y as Ot}from"./index-CLGovkkw.js";import{l as Et,n as Ze,m as Ct,a as Mt,b as Lt,p as Pt,s as Se,T as qt,R as At,U as et,c as Ft,d as tt,e as Ht,L as Ut,I as Dt}from"./index-DcYOI6rL.js";import{M as nt,a as st}from"./Modal-D_PUi-5O.js";import"./router-DHISdpPk.js";import"./Select-Cp5VXb_2.js";import"./DirBrowser-BINh_7NB.js";import"./markdown-DxQYQFeH.js";import"./ExtensionsTab-CHpd147b.js";function Qt({snapshot:i}){const[r,f]=t.useState(i.currentIndex??0),[R,w]=t.useState(""),[k,p]=t.useState(!1),[V,I]=t.useState(null);t.useEffect(()=>{f(i.currentIndex??0),w(""),I(null)},[i.promptId,i.currentIndex]);const O=i.questions||[],b=O[r]||null,G=O.length,E=!!(b?.options&&b.options.length),m=E?!!b?.allowFreeform:!0,U=u=>{u&&(f(h=>h+1),w(""))},ce=async u=>{if(!k){p(!0),I(null);try{const h=await j.interactionSelectOption(i.promptId,u);if(!h.ok){I(h.error||"Failed to submit selection.");return}U(h.advanced)}catch(h){I(h?.message||"Network error.")}finally{p(!1)}}},C=async()=>{if(k)return;const u=R.trim();if(!u&&!b?.allowEmpty){I("Please enter a response.");return}p(!0),I(null);try{const h=await j.interactionSubmitText(i.promptId,u);if(!h.ok){I(h.error||"Failed to submit answer.");return}U(h.advanced)}catch(h){I(h?.message||"Network error.")}finally{p(!1)}},g=async()=>{if(!k){p(!0),I(null);try{const u=await j.interactionSkip(i.promptId);if(!u.ok){I(u.error||"Failed to skip.");return}U(u.advanced)}catch(u){I(u?.message||"Network error.")}finally{p(!1)}}},D=async()=>{if(!k){p(!0);try{await j.interactionCancel(i.promptId)}catch{}}},J=t.useMemo(()=>{const u=[];return i.hint&&u.push(i.hint),G>1&&u.push(`Question ${r+1} of ${G}`),u.join(" · ")||void 0},[i.hint,r,G]);return n.jsxs(nt,{open:!0,onClose:D,wide:E&&(b?.options?.length||0)>3,children:[n.jsx(st,{title:i.title||"Pikiloom needs your input",description:J,onClose:D}),b?n.jsxs("div",{className:"space-y-4",children:[n.jsxs("div",{children:[n.jsx("div",{className:"text-xs font-medium uppercase tracking-wide text-fg-5",children:b.header||"Question"}),n.jsx("div",{className:"mt-1 whitespace-pre-wrap text-sm leading-relaxed text-fg",children:b.prompt})]}),E&&n.jsx("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2",children:(b.options||[]).map(u=>n.jsxs("button",{type:"button",disabled:k,onClick:()=>ce(u.value||u.label),className:It("group rounded-lg border border-edge bg-panel-alt px-3 py-2 text-left text-sm transition","hover:border-control-border-h hover:bg-control-h hover:shadow-sm","focus:outline-none focus:ring-2 focus:ring-[var(--th-glow-a)]","disabled:cursor-not-allowed disabled:opacity-50"),children:[n.jsx("div",{className:"font-medium text-fg group-hover:text-fg",children:u.label}),u.description&&n.jsx("div",{className:"mt-0.5 text-xs leading-snug text-fg-4",children:u.description})]},u.value||u.label))}),m&&n.jsx("div",{children:n.jsx(bt,{value:R,onChange:u=>w(u.target.value),onKeyDown:u=>{u.key==="Enter"&&!u.shiftKey&&!k&&(u.preventDefault(),C())},placeholder:E?"Or type a custom answer…":"Type your answer…",disabled:k,autoFocus:!E})}),V&&n.jsx("div",{className:"rounded-md border border-red-300/40 bg-red-500/10 px-3 py-2 text-xs text-red-600",children:V}),n.jsxs("div",{className:"flex items-center justify-between gap-3",children:[n.jsx("div",{className:"text-xs text-fg-5",children:k?n.jsxs("span",{className:"inline-flex items-center gap-2",children:[n.jsx(Ie,{})," Submitting…"]}):n.jsxs("span",{children:["Press ",n.jsx("kbd",{className:"rounded border border-edge bg-panel-alt px-1.5 py-0.5 text-[10px] uppercase",children:"Enter"})," to send"]})}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(be,{variant:"ghost",size:"sm",onClick:g,disabled:k,children:"Skip"}),m&&n.jsx(be,{variant:"primary",size:"sm",onClick:C,disabled:k||!R.trim()&&!b.allowEmpty,children:"Submit"})]})]})]}):n.jsxs("div",{className:"py-6 text-center text-sm text-fg-5",children:[n.jsx(Ie,{className:"mr-2 inline-block"})," Waiting for the agent…"]})]})}function _t(i){const r=i.streaming||i.liveStreamPhase==="streaming",f=i.queuedTaskCount>0||i.pendingQueuedCount>0||i.streamPhase==="queued";return r||f}function $t(i){const{pendingTaskId:r,streamTaskId:f,queuedTaskIds:R}=i;return!r||r===f?!1:!!R&&R.includes(r)}const Fe=12,rt=160,Bt=96,Kt=[],Wt=[],zt=[],Yt=20,X=new Map;function Xt(i,r){return`${i}:${r}`}function Vt(i,r){for(X.delete(i),X.set(i,r);X.size>Yt;)X.delete(X.keys().next().value)}const ar=t.memo(function({session:r,workdir:f,active:R=!0,onSessionChange:w,initialPendingPrompt:k,initialPendingImageUrls:p,onPendingPromptConsumed:V}){const I=Je(e=>e.locale),O=Je(e=>e.agentStatus?.agents?.find(s=>s.agent===r.agent)??null),b=O?.selectedEffort??null,G=O?.selectedModel??null,E=O?.byokProviderName??null,m=t.useMemo(()=>vt(I),[I]),U=yt(r.agent||""),ce=Tt(r),C=!!k||!!(p&&p.length),[g,D]=t.useState(null),[J,u]=t.useState(!C),[h,He]=t.useState(!1),[d,P]=t.useState(null),[Z,ee]=t.useState(!1),[Q,ve]=t.useState(null),[lt,Ue]=t.useState(0),[at,ye]=t.useState(null),[_,ie]=t.useState([]),[ot,de]=t.useState([]),[te,Te]=t.useState([]),[x,re]=t.useState(k||null),[M,ne]=t.useState(p||[]),[ut,se]=t.useState(null),$=t.useRef(null);$.current=ut;const De=t.useRef(x);De.current=x;const[Qe,q]=t.useState([]),je=t.useRef([]);je.current=Qe;const le=t.useRef(null),[ct,_e]=t.useState(null),[fe,ae]=t.useState(null),[oe,Re]=t.useState(""),[A,we]=t.useState(!1),it=!!O?.capabilities?.fork,Ne=t.useRef(null),L=t.useRef(p||[]),N=t.useRef(d),$e=t.useRef(Z);N.current=d,$e.current=Z;const Be=t.useRef(_);Be.current=_;const Ke=t.useRef(Q);Ke.current=Q;const F=t.useRef(null),me=t.useRef(null),B=t.useRef(!0),K=t.useRef(!1),ge=t.useRef(null),Oe=t.useRef(!1),W=t.useRef(C),ue=t.useRef(!1),H=t.useRef(!1),Ee=t.useRef(!1),Ce=t.useRef(!1),We=t.useRef({model:null,effort:null}),dt=t.useCallback(e=>{We.current=e},[]);t.useEffect(()=>{Ee.current||!C||(Ee.current=!0,k&&!x&&re(k),p&&p.length&&!M.length&&(ne(p),L.current=p),u(!1),Ue(e=>e+1),V?.())},[C,V]);const y=t.useCallback(()=>{re(null),ne(e=>{for(const s of e)URL.revokeObjectURL(s);return[]}),L.current=[],se(null)},[]),z=t.useCallback(()=>{q(e=>{if(!e.length)return e;for(const s of e)for(const l of s.imageUrls)URL.revokeObjectURL(l);return[]}),le.current=null},[]),ze=t.useCallback((e,s)=>{const l=_t({streaming:$e.current,liveStreamPhase:N.current?.phase??null,streamPhase:Ke.current,queuedTaskCount:Be.current.length,pendingQueuedCount:je.current.length}),a=s||[];if(l){const o=`local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;le.current=o,q(c=>[...c,{localId:o,taskId:null,prompt:e||"",imageUrls:a}]);return}N.current?.phase==="done"&&P(null);for(const o of L.current)URL.revokeObjectURL(o);le.current=null,re(e||null),ne(a),L.current=a,se(null)},[]),ft=t.useCallback(e=>{const s=le.current;if(s){le.current=null,q(l=>{const a=l.findIndex(c=>c.localId===s);if(a<0)return l;const o=l.slice();return o[a]={...o[a],taskId:e},o});return}se(e)},[]),mt=t.useCallback(async()=>{if(!fe)return;const e=oe.trim();if(e){we(!0);try{const s=await j.forkSession(f,r.agent||"",r.sessionId,fe.atTurn,e,{});if(!s.ok||!s.sessionKey){we(!1);return}const[l,a]=s.sessionKey.split(":");ae(null),Re(""),w?.({agent:l,sessionId:a,workdir:f})}finally{we(!1)}}},[fe,oe,f,r.agent,r.sessionId,w]);Ne.current=mt;const he=t.useCallback(async(e,s={})=>{try{const l=await Et({workdir:f,agent:r.agent||"",sessionId:r.sessionId,rich:!0,turnOffset:e.turnOffset,turnLimit:e.turnLimit,lastNTurns:e.lastNTurns},{force:s.force});return l.ok?Ze(l):null}catch{return null}},[f,r.agent,r.sessionId]),T=t.useCallback(async({keepOlder:e,force:s=!1,scrollToBottom:l=!1})=>{const a=r.sessionId;if(ge.current===a)return!1;ge.current=a;try{const o=await he({turnOffset:0,turnLimit:Fe},{force:s});if(!o||r.sessionId!==a)return!1;if(l&&(K.current=!0),D(c=>!c||!e?o:Ct(c,o)),u(!1),ue.current&&(ue.current=!1,y()),H.current){const c=H.current;H.current=!1;const S=c!==!0?c.taskId:null;N.current&&(c===!0||N.current.taskId===S)&&P(null)}return!0}finally{ge.current===a&&(ge.current=null)}},[he,y,r.sessionId]),pe=t.useCallback(async()=>{if(!g?.hasOlder||Oe.current)return;const e=F.current;e&&(me.current={scrollHeight:e.scrollHeight,scrollTop:e.scrollTop}),Oe.current=!0,He(!0);try{const s=await he({turnOffset:Math.max(0,g.totalTurns-g.startTurn),turnLimit:Fe});s?D(l=>l?Mt(l,s):s):me.current=null}finally{Oe.current=!1,He(!1)}},[he,g]),xe=t.useRef(null),Y=t.useCallback(e=>{if(e?.sessionId&&e.sessionId!==r.sessionId&&(Ce.current=!0,Me.current=`${r.agent}:${e.sessionId}`,w?.({agent:r.agent||"",sessionId:e.sessionId,workdir:f})),!e){const l=xe.current;ee(!1),l==="streaming"?(ue.current=!0,H.current=!0,T({keepOlder:!0,force:!0,scrollToBottom:B.current})):P(null),W.current&&l!=="streaming"?T({keepOlder:!0,force:!0}):(l==="done"&&(y(),z()),l!==null&&(W.current=!1)),ye(null),ve(null),ie([]),de([]),Te([]),xe.current=null;return}if(ve(e.phase),ye(e.taskId||null),ie(e.queuedTaskIds&&e.queuedTaskIds.length?e.queuedTaskIds:Kt),de(e.queuedTasks&&e.queuedTasks.length?e.queuedTasks:Wt),Te(Array.isArray(e.interactions)&&e.interactions.length?e.interactions:zt),$t({pendingTaskId:$.current,streamTaskId:e.taskId||null,queuedTaskIds:e.queuedTaskIds})){const l=$.current,a=De.current||"",o=L.current;q(c=>c.some(S=>S.taskId===l)?c:[...c,{localId:`demote-${l}`,taskId:l,prompt:a,imageUrls:o}]),re(null),ne([]),L.current=[],se(null),$.current=null}if(e.phase==="streaming"){if(H.current&&N.current&&N.current.taskId!==null&&N.current.taskId!==(e.taskId||null)&&!(e.text||"").trim()||P({taskId:e.taskId||null,phase:"streaming",text:e.text||"",thinking:e.thinking||"",activity:e.activity,plan:e.plan??null,model:e.model??null,effort:e.effort??null,previewMeta:e.previewMeta??null,subAgents:e.previewMeta?.subAgents??null,generatingImages:e.previewMeta?.generatingImages??0,artifacts:e.artifacts??null,startedAt:typeof e.startedAt=="number"?e.startedAt:null,error:null,question:e.question??null}),ee(!0),e.taskId&&e.taskId!==$.current){const a=je.current,o=a.findIndex(c=>c.taskId===e.taskId);if(o>=0){const c=a[o];for(const S of L.current)URL.revokeObjectURL(S);re(c.prompt||null),ne(c.imageUrls),L.current=c.imageUrls,se(e.taskId),q(S=>S.filter((kt,St)=>St!==o))}}B.current&&(K.current=!0)}else if(e.phase==="queued")P(null),ee(!1);else if(e.phase==="done"){ee(!1),P(S=>S?{...S,phase:"done",error:e.error??null}:e.error?{taskId:e.taskId||null,phase:"done",text:"",thinking:"",activity:"",plan:null,model:e.model??null,effort:e.effort??null,previewMeta:e.previewMeta??null,subAgents:e.previewMeta?.subAgents??null,generatingImages:e.previewMeta?.generatingImages??0,artifacts:e.artifacts??null,error:e.error}:S);const l=!!e.queuedTaskIds?.length,a=N.current,o=!!a&&Lt(a),c=!!e.incomplete&&o&&!l;xe.current!=="done"&&(l||(ue.current=!0),H.current=c?!1:{taskId:e.taskId||null},T({keepOlder:!0,force:!0,scrollToBottom:B.current})),l||(W.current=!1)}const s=new Set;if(e.taskId&&s.add(e.taskId),Array.isArray(e.queuedTaskIds))for(const l of e.queuedTaskIds)s.add(l);q(l=>{let a=!1;const o=[];for(const c of l)if(!c.taskId||s.has(c.taskId))o.push(c);else{for(const S of c.imageUrls)URL.revokeObjectURL(S);a=!0}return a?o:l}),xe.current=e.phase},[y,z,T,r.sessionId,r.agent,w,f]),Ye=t.useRef(Y);Ye.current=Y;const Xe=t.useCallback(()=>{W.current=!0,Ue(e=>e+1)},[]),gt=t.useCallback(async e=>{try{await j.recallSessionMessage(e),$.current===e&&y(),q(s=>{let l=!1;const a=[];for(const o of s)if(o.taskId===e){for(const c of o.imageUrls)URL.revokeObjectURL(c);l=!0}else a.push(o);return l?a:s}),ie(s=>s.filter(l=>l!==e)),de(s=>s.filter(l=>l.taskId!==e)),ye(s=>s===e?null:s)}catch{}},[y]),ht=t.useCallback(async e=>{try{await j.steerSession(e)}catch{}},[]),pt=t.useCallback(async()=>{try{await j.stopSession(r.agent||"",r.sessionId)}catch{}},[r.agent,r.sessionId]),ke=Xt(r.agent||"",r.sessionId);t.useEffect(()=>{if(Ce.current){Ce.current=!1;let o=!1;return T({keepOlder:!0,force:!0}).finally(()=>{o||u(!1)}),()=>{o=!0}}let e=!1;const s=Pt({workdir:f,agent:r.agent||"",sessionId:r.sessionId,rich:!0,turnOffset:0,turnLimit:Fe},{allowStale:!0}),l=C&&!Ee.current,a=s?.ok?Ze(s):X.get(ke)||null;return u(l?!1:!a),D(a),P(null),ee(!1),ve(null),ie([]),de([]),Te([]),l||(y(),z(),W.current=!1,ue.current=!1,H.current=!1),B.current=!0,K.current=!0,l||T({keepOlder:!1,force:!0}).finally(()=>{e||u(!1)}),()=>{e=!0}},[T,r.agent,r.sessionId,f,ke,y,z]),t.useEffect(()=>{g&&g.turns.length>0&&Vt(ke,g)},[ke,g]),t.useEffect(()=>{R&&T({keepOlder:!0,force:!0})},[R,T]);const Me=t.useRef(`${r.agent}:${r.sessionId}`);Me.current=`${r.agent}:${r.sessionId}`,jt("stream-update",t.useCallback(e=>{e.key===Me.current&&Y(e.snapshot??null)},[Y])),t.useEffect(()=>{let e=!0;return j.getSessionStreamState(r.agent||"",r.sessionId).then(s=>{e&&Ye.current(s.state)}).catch(()=>{}),()=>{e=!1}},[r.agent,r.sessionId,lt]),Rt(t.useCallback(()=>{j.getSessionStreamState(r.agent||"",r.sessionId).then(e=>{Y(e.state)}).catch(()=>{}),T({keepOlder:!0,force:!0})},[Y,r.agent,r.sessionId,T])),t.useEffect(()=>{!W.current&&ce!=="running"&&!Z&&!d&&!Q&&_.length===0&&(y(),z())},[ce,Z,d,Q,_.length,y,z]),t.useLayoutEffect(()=>{const e=me.current,s=F.current;!e||!s||(me.current=null,s.scrollTop=e.scrollTop+(s.scrollHeight-e.scrollHeight))},[g?.turns.length]),t.useLayoutEffect(()=>{if(!K.current)return;const e=F.current;e&&(K.current=!1,e.scrollTop=e.scrollHeight,requestAnimationFrame(()=>{B.current&&(e.scrollTop=e.scrollHeight)}))},[g,d]),t.useLayoutEffect(()=>{if(!x)return;const e=F.current;e&&(e.scrollTop=e.scrollHeight)},[x]),t.useEffect(()=>{if(!g?.hasOlder||J||h)return;const e=F.current;e&&e.scrollHeight<=e.clientHeight+rt&&pe()},[g?.hasOlder,g?.turns.length,pe,J,h]);const xt=t.useCallback(()=>{const e=F.current;if(!e)return;const s=e.scrollHeight-e.scrollTop-e.clientHeight;B.current=s<=Bt,e.scrollTop<=rt&&pe()},[pe]),Le=d?.model||r.model||G||null,Pe=wt(r.agent||"",d?.effort||r.thinkingEffort||b||null,r.workflowEnabled??O?.workflowEnabled)||null,Ve=Le?Nt(Le):null,qe=Ot(r,{streaming:Z,hasLiveStream:!!d,streamPhase:Q,queuedTaskCount:_.length}),v=g?.turns||[],Ae=t.useMemo(()=>{if(!M.length||!v.length)return!1;const e=v[v.length-1];return!e.user||!Se(e.user.text,x)?!1:e.user.blocks.filter(l=>l.type==="image").length<M.length},[v,x,M.length]),Ge=t.useMemo(()=>{let e=v;if(Ae){const S=e[e.length-1];e=[...e.slice(0,-1),{...S,user:null}]}if(!d||!e.length)return e;const s=e[e.length-1];if(!s.assistant)return e;const l=x??(d.question||null),a=(d.text||"").trim(),o=s.assistant.text?.trim()||"";return(l!=null?Se(s.user?.text,l):!!o&&!!a&&(a.startsWith(o)||o.startsWith(a)))?[...e.slice(0,-1),{...s,assistant:null}]:e},[v,d,x,Ae]);return n.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[n.jsx("div",{ref:F,onScroll:xt,className:"flex-1 overflow-y-auto overscroll-contain",children:J&&!x&&!M.length&&!d?n.jsx("div",{className:"flex items-center justify-center py-20",children:n.jsx(Ie,{className:"h-5 w-5 text-fg-4"})}):Ge.length===0&&!x&&!M.length&&!d&&!qe?n.jsx("div",{className:"py-20 text-center text-[13px] text-fg-5",children:m("hub.noMessages")}):n.jsxs("div",{className:"max-w-[900px] mx-auto px-6 py-6 space-y-0",children:[(g?.hasOlder||h)&&n.jsxs("div",{className:"mb-4 flex items-center justify-center gap-2 text-[11px] text-fg-5",children:[h?n.jsx(Ie,{className:"h-3 w-3 text-fg-5"}):n.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-fg-5/35"}),n.jsx("span",{children:m(h?"hub.loadingOlderTurns":"hub.loadOlderTurnsHint")})]}),r.migratedFrom?.kind==="fork"&&r.migratedFrom.sessionId&&n.jsxs("button",{type:"button",onClick:()=>w?.({agent:r.migratedFrom.agent||r.agent||"",sessionId:r.migratedFrom.sessionId,workdir:f}),className:"mb-4 inline-flex items-center gap-1.5 rounded-md border border-edge bg-panel-alt px-2.5 py-1 text-[11px] text-fg-5 transition hover:border-edge-h hover:text-fg-2",title:`#${r.migratedFrom.sessionId.slice(0,8)}`,children:[n.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[n.jsx("circle",{cx:"6",cy:"6",r:"2"}),n.jsx("circle",{cx:"18",cy:"6",r:"2"}),n.jsx("circle",{cx:"12",cy:"20",r:"2"}),n.jsx("path",{d:"M6 8v3a3 3 0 0 0 3 3h6a3 3 0 0 0 3-3V8"}),n.jsx("path",{d:"M12 14v4"})]}),n.jsx("span",{children:m("hub.forkBadge")}),n.jsxs("span",{className:"font-mono",children:["#",r.migratedFrom.sessionId.slice(0,8)]}),typeof r.migratedFrom.forkedAtTurn=="number"&&n.jsxs("span",{className:"text-fg-5/70",children:["· ",m("hub.forkBadgeAt").replace("{turn}",String(r.migratedFrom.forkedAtTurn+1))]})]}),Ge.map((e,s)=>{const l=(g?.startTurn||0)+s;return n.jsx(qt,{turn:e,turnIndex:l,agent:r.agent||"",meta:U,model:Ve,effort:Pe,providerName:E,t:m,workdir:f,onResend:a=>{K.current=!0,ze(a);const o=We.current;j.sendSessionMessage(f,r.agent||"",r.sessionId,a,{model:o.model||Le||void 0,effort:o.effort||Pe||void 0}).then(c=>{c.ok&&Xe()}).catch(()=>{y()})},onEdit:a=>_e(a),onFork:it?a=>{Re(""),ae({atTurn:a})}:void 0},`${g?.startTurn||0}:${s}`)}),qe&&n.jsx("div",{className:"mb-5 animate-in",children:n.jsx(At,{detail:qe,t:m})}),(x||M.length>0)&&(Ae||!(x&&v.length>0&&Se(v[v.length-1]?.user?.text,x)))&&n.jsxs("div",{className:"session-turn",children:[n.jsx(et,{text:x||"",blocks:M.map(e=>({type:"image",content:e})),t:m}),!d&&n.jsx("div",{className:"mt-3 mb-5 animate-in",children:n.jsx(Ft,{className:"text-fg-5"})})]}),d&&tt(d)&&!x&&d.question&&!(v.length>0&&Se(v[v.length-1]?.user?.text,d.question))&&n.jsx("div",{className:"session-turn",children:n.jsx(et,{text:d.question,t:m})}),d&&tt(d)&&n.jsxs("div",{className:"mb-6",children:[n.jsx(Ht,{agent:r.agent||"",meta:U,model:Ve,effort:Pe,providerName:E,previewMeta:d.previewMeta,liveStartedAt:d.phase==="streaming"?d.startedAt??null:null}),n.jsx(Ut,{stream:d,t:m,workdir:f})]}),n.jsx("div",{className:"h-4"})]})}),n.jsx(Dt,{session:r,workdir:f,onStreamQueued:Xe,onSendStart:ze,onSendTaskAssigned:ft,onSessionChange:w,t:m,streamPhase:Q,streamTaskId:at,queuedTaskIds:_,queuedTasks:ot,pendingQueuedSends:Qe,onRecall:gt,onSteer:ht,onStopAll:pt,editDraft:ct,onEditDraftConsumed:()=>_e(null),onSelectionChange:dt}),fe&&n.jsxs(nt,{open:!0,onClose:()=>{A||ae(null)},children:[n.jsx(st,{title:m("hub.forkPromptTitle"),description:m("hub.forkPromptHint"),onClose:()=>{A||ae(null)}}),n.jsx("textarea",{autoFocus:!0,value:oe,disabled:A,onChange:e=>Re(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.metaKey||e.ctrlKey)&&oe.trim()&&!A&&(e.preventDefault(),Ne.current?.())},placeholder:m("hub.forkPromptPlaceholder"),className:"w-full min-h-[120px] resize-y rounded-md border border-edge bg-panel-alt px-3 py-2 text-[13px] leading-relaxed text-fg outline-none focus:border-edge-h"}),n.jsxs("div",{className:"mt-4 flex items-center justify-end gap-2",children:[n.jsx(be,{variant:"ghost",disabled:A,onClick:()=>ae(null),children:m("modal.cancel")}),n.jsx(be,{variant:"primary",disabled:A||!oe.trim(),onClick:()=>{Ne.current?.()},children:m(A?"hub.forkSubmitting":"hub.forkSubmit")})]})]}),R&&te.length>0&&n.jsx(Qt,{snapshot:te[te.length-1]},te[te.length-1].promptId)]})});export{ar as SessionPanel};
@@ -1 +1 @@
1
- import{j as e,r as f}from"./react-vendor-C7Sl8SE7.js";import{M as v,c as A,N as F,u as x,d as G,a as $,m as w,R as L,F as g,G as O}from"./index-BlqvzDUL.js";import{ClientConnectionPanel as z,ServerConfigPanel as E}from"./ConnectionModal-BCfvhkiI.js";import{S as k}from"./shared-C0SAInnT.js";import"./router-DHISdpPk.js";import"./Modal-M1AP1sgR.js";function j(s){return Number.isFinite(s??NaN)?Math.max(0,Math.min(100,Number(s))):null}function S(s){return Number.isFinite(s??NaN)?Number(s).toFixed(2):null}function W(s){return s?[s.hostName||"—",s.platform,s.arch].filter(Boolean).join(" · "):""}function q(s,r){if(!s)return[];const o=s.totalMem||0,i=s.memoryUsed||o-(s.freeMem||0),t=j(s.memoryPercent||(o>0?i/o*100:0)),a=j(s.cpuUsage?.usedPercent),d=s.loadAverage||null,c=S(d?.one),p=S(d?.five),u=S(d?.fifteen),h=j(d?d.one/Math.max(s.cpuCount||1,1)*100:null),y=[{key:"cpu",label:r("sessions.cpu"),value:a!=null?`${a.toFixed(0)}%`:`${s.cpuCount} cores`,detail:[`${s.cpuCount} cores`,s.cpuModel||""].filter(Boolean),tone:a!=null&&a>=85?"warn":"ok",progressPercent:a},...c&&p&&u?[{key:"cpu-load",label:r("system.cpuLoad"),value:`1m ${c}`,detail:[`5m ${p}`,`15m ${u}`],tone:h!=null&&h>=85?"warn":"muted",progressPercent:h}]:[],{key:"memory",label:r("sessions.memory"),value:`${F(i)} / ${F(o)}`,detail:t!=null?`${t.toFixed(0)}%`:void 0,tone:t!=null&&t>=85?"warn":"ok",progressPercent:t}];if(s.disk){const m=j(parseFloat(String(s.disk.percent).replace("%","")));y.push({key:"disk",label:r("sessions.disk"),value:`${s.disk.used} / ${s.disk.total}`,detail:s.disk.percent,tone:m!=null&&m>=85?"warn":"muted",progressPercent:m})}else if(s.battery){const m=j(parseFloat(String(s.battery.percent).replace("%","")));y.push({key:"battery",label:r("sessions.battery"),value:s.battery.percent,detail:s.battery.state,tone:m!=null&&m<=20?"warn":"muted",progressPercent:m})}return y}function B(s){return s?Array.isArray(s)?s.join(" · "):s:""}function I({items:s,loading:r,className:o}){return r?e.jsx("div",{className:A("space-y-1",o),children:Array.from({length:4},(i,t)=>e.jsxs("div",{className:"grid grid-cols-[80px_auto_1fr] items-baseline gap-x-4 py-1",children:[e.jsx(v,{className:"h-3 w-12"}),e.jsx(v,{className:"h-3 w-24"}),e.jsx(v,{className:"h-3 w-28"})]},t))}):e.jsx("div",{className:A("flex flex-wrap items-baseline gap-x-5 gap-y-1.5",o),children:s.map(i=>{const t=B(i.detail);return e.jsxs("div",{className:"inline-flex items-baseline gap-1.5 whitespace-nowrap",title:t||void 0,children:[e.jsx("span",{className:"text-[10px] font-medium uppercase tracking-[0.12em] text-fg-5",children:i.label}),e.jsx("span",{className:"font-mono text-[12px] tabular-nums text-fg-2",children:i.value}),t&&e.jsxs("span",{className:"text-[11px] text-fg-5",children:["· ",t]})]},i.key)})})}const K=[{key:"screenRecording",labelKey:"perm.screenRecording",reasonZh:"用于截图与界面分析",reasonEn:"For screenshots and UI inspection",guidePathKey:"perm.pathScreenRecording",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"4",y:"5.5",width:"11.5",height:"10",rx:"2.4"}),e.jsx("path",{d:"m17.5 8.4 2.7-1.5v7.2l-2.7-1.5"}),e.jsx("circle",{cx:"9.75",cy:"10.5",r:"1.1",fill:"currentColor",stroke:"none"})]})},{key:"fullDiskAccess",labelKey:"perm.fullDiskAccess",reasonZh:"访问桌面、下载等受保护目录",reasonEn:"Access to Desktop, Downloads and other protected folders",guidePathKey:"perm.pathFullDiskAccess",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"6.2",y:"10.1",width:"11.6",height:"8.6",rx:"2.6"}),e.jsx("path",{d:"M9 10V7.8a3 3 0 1 1 6 0V10"}),e.jsx("circle",{cx:"12",cy:"13.5",r:"0.9",fill:"currentColor",stroke:"none"}),e.jsx("path",{d:"M12 14.6v1.8"})]})}];function T(s){return s==="zh-CN"?{introWithHost:"请在 macOS 中为 {hostApp} 开启以下权限。",intro:"请在 macOS 中开启以下权限。",status:"状态",summary:"系统位置",loading:"检查中",needsGrant:"需要授权",granted:"已授权",authorize:"授权",openSettings:"前往设置",refreshState:"刷新状态",checking:"检查中...",hostGranted:"{hostApp} 已可直接使用此权限。",hostGrantedFallback:"当前宿主应用已可直接使用此权限。",needsGrantDetail:"尚未授权,可通过右侧按钮发起系统授权。",needsSettingsDetail:"需要在系统设置中手动开启此权限。"}:{introWithHost:"Grant the following permissions to {hostApp} in macOS.",intro:"Grant the following permissions in macOS.",status:"Status",summary:"System path",loading:"Checking",needsGrant:"Needs access",granted:"Granted",authorize:"Authorize",openSettings:"Open settings",refreshState:"Refresh status",checking:"Checking...",hostGranted:"{hostApp} can use this permission now.",hostGrantedFallback:"The current host app can use this permission now.",needsGrantDetail:"Access has not been granted yet. Use the button on the right to trigger the macOS prompt.",needsSettingsDetail:"This permission needs to be enabled manually in System Settings."}}function H(){const s=x(n=>n.state),r=x(n=>n.locale),o=x(n=>n.reload),i=x(n=>n.toast),t=f.useMemo(()=>G(r),[r]),a=T(r),d=s?.permissions||{},c=s?.hostApp||null,p=!s,[u,h]=f.useState(null),y=f.useMemo(()=>K.map(n=>({...n,permission:d[n.key]})),[d]),m=f.useCallback(async n=>{if(!u){h(n);try{const l=await $.requestPermission(n);if(!l.ok){i(l.error||t("perm.requestFailed"),!1);return}l.action==="already_granted"?i(t("perm.alreadyGranted")):l.action==="prompted"?i(t("perm.promptOpened")):i(t("perm.settingsOpened")),await o()}catch(l){i(l instanceof Error?l.message:t("perm.requestFailed"),!1)}finally{h(l=>l===n?null:l)}}},[o,u,t,i]),M=f.useCallback(async()=>{await o()},[o]);return e.jsxs("div",{className:"animate-in space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[e.jsx("div",{className:"min-w-0 flex-1",children:e.jsx("div",{className:"text-[13px] leading-relaxed text-fg-4",children:c?a.introWithHost.replace("{hostApp}",c):a.intro})}),e.jsx(w,{variant:"outline",size:"sm",onClick:()=>{M()},children:a.refreshState})]}),e.jsx(L,{children:y.map(n=>{const l=n.permission,b=!!l?.granted,P=!!l&&l.checkable,C=p?a.loading:b?a.granted:a.needsGrant,D=p?"idle":b?"ok":"warn",N=p?a.loading:b?c?a.hostGranted.replace("{hostApp}",c):a.hostGrantedFallback:P?a.needsGrantDetail:a.needsSettingsDetail,R=p?a.checking:P?a.authorize:a.openSettings;return e.jsxs(g,{children:[e.jsx(g.Lead,{icon:n.icon,title:t(n.labelKey),subtitle:r==="zh-CN"?n.reasonZh:n.reasonEn}),e.jsx(g.Status,{children:e.jsx(O,{state:D,label:C})}),e.jsx(g.Field,{children:t(n.guidePathKey)}),e.jsx(g.Action,{children:!b&&e.jsx(w,{variant:"primary",size:"sm",disabled:p||!!u,onClick:()=>{m(n.key)},children:u===n.key?a.checking:R})}),N&&N!==C&&e.jsx(g.Description,{children:N})]},n.key)})})]})}function X({onOpenWorkdir:s}){const r=x(c=>c.state),o=x(c=>c.host),i=x(c=>c.locale),t=f.useMemo(()=>G(i),[i]),a=r?.bot?.workdir||r?.runtimeWorkdir||r?.config.workdir||"",d=W(o);return e.jsxs("div",{className:"animate-in space-y-3",children:[e.jsx(k,{className:"!p-3.5",children:e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"flex items-baseline gap-2",children:e.jsx("span",{className:"text-[13px] font-semibold tracking-tight text-fg",children:t("config.workdir")})}),e.jsx("div",{className:"mt-0.5 break-all font-mono text-[12px] leading-relaxed text-fg-2",children:a||t("sidebar.notSet")})]}),e.jsx(w,{variant:"outline",size:"sm",onClick:s,children:t("sidebar.switchDir")})]})}),e.jsxs(k,{className:"space-y-2 !p-3.5",children:[e.jsxs("div",{className:"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5",children:[e.jsxs("div",{className:"flex items-baseline gap-2 min-w-0",children:[e.jsx("span",{className:"text-[13px] font-semibold tracking-tight text-fg",children:t("app.systemInfo")}),e.jsx("span",{className:"truncate text-[11px] text-fg-5",children:d||t("status.loading")})]}),e.jsxs("div",{className:"text-[11px] text-fg-5",children:[r?.version?`Pikiloom v${r.version}`:"Pikiloom",r?.nodeVersion?` · Node ${r.nodeVersion}`:""]})]}),e.jsx(I,{items:q(o,t),loading:!o})]}),e.jsx(k,{className:"!p-3.5",children:e.jsx(z,{})}),e.jsx(k,{className:"!p-3.5",children:e.jsx(E,{})}),e.jsxs(k,{className:"space-y-2 !p-3.5",children:[e.jsx("div",{className:"text-[13px] font-semibold tracking-tight text-fg",children:t("tab.permissions")}),e.jsx(H,{})]})]})}export{X as SystemTab};
1
+ import{j as e,r as f}from"./react-vendor-C7Sl8SE7.js";import{M as v,c as A,N as F,u as x,d as G,a as $,m as w,R as L,F as g,G as O}from"./index-CLGovkkw.js";import{ClientConnectionPanel as z,ServerConfigPanel as E}from"./ConnectionModal-BIx6a5o1.js";import{S as k}from"./shared-C8DCTJ44.js";import"./router-DHISdpPk.js";import"./Modal-D_PUi-5O.js";function j(s){return Number.isFinite(s??NaN)?Math.max(0,Math.min(100,Number(s))):null}function S(s){return Number.isFinite(s??NaN)?Number(s).toFixed(2):null}function W(s){return s?[s.hostName||"—",s.platform,s.arch].filter(Boolean).join(" · "):""}function q(s,r){if(!s)return[];const o=s.totalMem||0,i=s.memoryUsed||o-(s.freeMem||0),t=j(s.memoryPercent||(o>0?i/o*100:0)),a=j(s.cpuUsage?.usedPercent),d=s.loadAverage||null,c=S(d?.one),p=S(d?.five),u=S(d?.fifteen),h=j(d?d.one/Math.max(s.cpuCount||1,1)*100:null),y=[{key:"cpu",label:r("sessions.cpu"),value:a!=null?`${a.toFixed(0)}%`:`${s.cpuCount} cores`,detail:[`${s.cpuCount} cores`,s.cpuModel||""].filter(Boolean),tone:a!=null&&a>=85?"warn":"ok",progressPercent:a},...c&&p&&u?[{key:"cpu-load",label:r("system.cpuLoad"),value:`1m ${c}`,detail:[`5m ${p}`,`15m ${u}`],tone:h!=null&&h>=85?"warn":"muted",progressPercent:h}]:[],{key:"memory",label:r("sessions.memory"),value:`${F(i)} / ${F(o)}`,detail:t!=null?`${t.toFixed(0)}%`:void 0,tone:t!=null&&t>=85?"warn":"ok",progressPercent:t}];if(s.disk){const m=j(parseFloat(String(s.disk.percent).replace("%","")));y.push({key:"disk",label:r("sessions.disk"),value:`${s.disk.used} / ${s.disk.total}`,detail:s.disk.percent,tone:m!=null&&m>=85?"warn":"muted",progressPercent:m})}else if(s.battery){const m=j(parseFloat(String(s.battery.percent).replace("%","")));y.push({key:"battery",label:r("sessions.battery"),value:s.battery.percent,detail:s.battery.state,tone:m!=null&&m<=20?"warn":"muted",progressPercent:m})}return y}function B(s){return s?Array.isArray(s)?s.join(" · "):s:""}function I({items:s,loading:r,className:o}){return r?e.jsx("div",{className:A("space-y-1",o),children:Array.from({length:4},(i,t)=>e.jsxs("div",{className:"grid grid-cols-[80px_auto_1fr] items-baseline gap-x-4 py-1",children:[e.jsx(v,{className:"h-3 w-12"}),e.jsx(v,{className:"h-3 w-24"}),e.jsx(v,{className:"h-3 w-28"})]},t))}):e.jsx("div",{className:A("flex flex-wrap items-baseline gap-x-5 gap-y-1.5",o),children:s.map(i=>{const t=B(i.detail);return e.jsxs("div",{className:"inline-flex items-baseline gap-1.5 whitespace-nowrap",title:t||void 0,children:[e.jsx("span",{className:"text-[10px] font-medium uppercase tracking-[0.12em] text-fg-5",children:i.label}),e.jsx("span",{className:"font-mono text-[12px] tabular-nums text-fg-2",children:i.value}),t&&e.jsxs("span",{className:"text-[11px] text-fg-5",children:["· ",t]})]},i.key)})})}const K=[{key:"screenRecording",labelKey:"perm.screenRecording",reasonZh:"用于截图与界面分析",reasonEn:"For screenshots and UI inspection",guidePathKey:"perm.pathScreenRecording",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"4",y:"5.5",width:"11.5",height:"10",rx:"2.4"}),e.jsx("path",{d:"m17.5 8.4 2.7-1.5v7.2l-2.7-1.5"}),e.jsx("circle",{cx:"9.75",cy:"10.5",r:"1.1",fill:"currentColor",stroke:"none"})]})},{key:"fullDiskAccess",labelKey:"perm.fullDiskAccess",reasonZh:"访问桌面、下载等受保护目录",reasonEn:"Access to Desktop, Downloads and other protected folders",guidePathKey:"perm.pathFullDiskAccess",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"6.2",y:"10.1",width:"11.6",height:"8.6",rx:"2.6"}),e.jsx("path",{d:"M9 10V7.8a3 3 0 1 1 6 0V10"}),e.jsx("circle",{cx:"12",cy:"13.5",r:"0.9",fill:"currentColor",stroke:"none"}),e.jsx("path",{d:"M12 14.6v1.8"})]})}];function T(s){return s==="zh-CN"?{introWithHost:"请在 macOS 中为 {hostApp} 开启以下权限。",intro:"请在 macOS 中开启以下权限。",status:"状态",summary:"系统位置",loading:"检查中",needsGrant:"需要授权",granted:"已授权",authorize:"授权",openSettings:"前往设置",refreshState:"刷新状态",checking:"检查中...",hostGranted:"{hostApp} 已可直接使用此权限。",hostGrantedFallback:"当前宿主应用已可直接使用此权限。",needsGrantDetail:"尚未授权,可通过右侧按钮发起系统授权。",needsSettingsDetail:"需要在系统设置中手动开启此权限。"}:{introWithHost:"Grant the following permissions to {hostApp} in macOS.",intro:"Grant the following permissions in macOS.",status:"Status",summary:"System path",loading:"Checking",needsGrant:"Needs access",granted:"Granted",authorize:"Authorize",openSettings:"Open settings",refreshState:"Refresh status",checking:"Checking...",hostGranted:"{hostApp} can use this permission now.",hostGrantedFallback:"The current host app can use this permission now.",needsGrantDetail:"Access has not been granted yet. Use the button on the right to trigger the macOS prompt.",needsSettingsDetail:"This permission needs to be enabled manually in System Settings."}}function H(){const s=x(n=>n.state),r=x(n=>n.locale),o=x(n=>n.reload),i=x(n=>n.toast),t=f.useMemo(()=>G(r),[r]),a=T(r),d=s?.permissions||{},c=s?.hostApp||null,p=!s,[u,h]=f.useState(null),y=f.useMemo(()=>K.map(n=>({...n,permission:d[n.key]})),[d]),m=f.useCallback(async n=>{if(!u){h(n);try{const l=await $.requestPermission(n);if(!l.ok){i(l.error||t("perm.requestFailed"),!1);return}l.action==="already_granted"?i(t("perm.alreadyGranted")):l.action==="prompted"?i(t("perm.promptOpened")):i(t("perm.settingsOpened")),await o()}catch(l){i(l instanceof Error?l.message:t("perm.requestFailed"),!1)}finally{h(l=>l===n?null:l)}}},[o,u,t,i]),M=f.useCallback(async()=>{await o()},[o]);return e.jsxs("div",{className:"animate-in space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[e.jsx("div",{className:"min-w-0 flex-1",children:e.jsx("div",{className:"text-[13px] leading-relaxed text-fg-4",children:c?a.introWithHost.replace("{hostApp}",c):a.intro})}),e.jsx(w,{variant:"outline",size:"sm",onClick:()=>{M()},children:a.refreshState})]}),e.jsx(L,{children:y.map(n=>{const l=n.permission,b=!!l?.granted,P=!!l&&l.checkable,C=p?a.loading:b?a.granted:a.needsGrant,D=p?"idle":b?"ok":"warn",N=p?a.loading:b?c?a.hostGranted.replace("{hostApp}",c):a.hostGrantedFallback:P?a.needsGrantDetail:a.needsSettingsDetail,R=p?a.checking:P?a.authorize:a.openSettings;return e.jsxs(g,{children:[e.jsx(g.Lead,{icon:n.icon,title:t(n.labelKey),subtitle:r==="zh-CN"?n.reasonZh:n.reasonEn}),e.jsx(g.Status,{children:e.jsx(O,{state:D,label:C})}),e.jsx(g.Field,{children:t(n.guidePathKey)}),e.jsx(g.Action,{children:!b&&e.jsx(w,{variant:"primary",size:"sm",disabled:p||!!u,onClick:()=>{m(n.key)},children:u===n.key?a.checking:R})}),N&&N!==C&&e.jsx(g.Description,{children:N})]},n.key)})})]})}function X({onOpenWorkdir:s}){const r=x(c=>c.state),o=x(c=>c.host),i=x(c=>c.locale),t=f.useMemo(()=>G(i),[i]),a=r?.bot?.workdir||r?.runtimeWorkdir||r?.config.workdir||"",d=W(o);return e.jsxs("div",{className:"animate-in space-y-3",children:[e.jsx(k,{className:"!p-3.5",children:e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"flex items-baseline gap-2",children:e.jsx("span",{className:"text-[13px] font-semibold tracking-tight text-fg",children:t("config.workdir")})}),e.jsx("div",{className:"mt-0.5 break-all font-mono text-[12px] leading-relaxed text-fg-2",children:a||t("sidebar.notSet")})]}),e.jsx(w,{variant:"outline",size:"sm",onClick:s,children:t("sidebar.switchDir")})]})}),e.jsxs(k,{className:"space-y-2 !p-3.5",children:[e.jsxs("div",{className:"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5",children:[e.jsxs("div",{className:"flex items-baseline gap-2 min-w-0",children:[e.jsx("span",{className:"text-[13px] font-semibold tracking-tight text-fg",children:t("app.systemInfo")}),e.jsx("span",{className:"truncate text-[11px] text-fg-5",children:d||t("status.loading")})]}),e.jsxs("div",{className:"text-[11px] text-fg-5",children:[r?.version?`Pikiloom v${r.version}`:"Pikiloom",r?.nodeVersion?` · Node ${r.nodeVersion}`:""]})]}),e.jsx(I,{items:q(o,t),loading:!o})]}),e.jsx(k,{className:"!p-3.5",children:e.jsx(z,{})}),e.jsx(k,{className:"!p-3.5",children:e.jsx(E,{})}),e.jsxs(k,{className:"space-y-2 !p-3.5",children:[e.jsx("div",{className:"text-[13px] font-semibold tracking-tight text-fg",children:t("tab.permissions")}),e.jsx(H,{})]})]})}export{X as SystemTab};