botmux 2.98.4-canary.2 → 2.99.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +2 -2
- package/README.md +2 -2
- package/dist/adapters/cli/genius.d.ts +4 -0
- package/dist/adapters/cli/genius.d.ts.map +1 -0
- package/dist/adapters/cli/genius.js +216 -0
- package/dist/adapters/cli/genius.js.map +1 -0
- package/dist/adapters/cli/registry.d.ts +2 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +3 -1
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +1 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/core/dashboard-rows.d.ts +1 -1
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +2 -1
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/dashboard/session-card-model.d.ts +2 -2
- package/dist/dashboard/session-card-model.d.ts.map +1 -1
- package/dist/dashboard/session-card-model.js +5 -2
- package/dist/dashboard/session-card-model.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +28 -63
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +3 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -0
- package/dist/dashboard/web/bot-defaults-page.js +23 -0
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -0
- package/dist/dashboard/web/bot-defaults.d.ts +2 -1
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +30 -30
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/connectors-page.d.ts +14 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -0
- package/dist/dashboard/web/connectors-page.js +303 -0
- package/dist/dashboard/web/connectors-page.js.map +1 -0
- package/dist/dashboard/web/connectors.d.ts +1 -12
- package/dist/dashboard/web/connectors.d.ts.map +1 -1
- package/dist/dashboard/web/connectors.js +1 -325
- package/dist/dashboard/web/connectors.js.map +1 -1
- package/dist/dashboard/web/dashboard-routes.d.ts +14 -0
- package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -0
- package/dist/dashboard/web/dashboard-routes.js +176 -0
- package/dist/dashboard/web/dashboard-routes.js.map +1 -0
- package/dist/dashboard/web/groups-page.d.ts +3 -0
- package/dist/dashboard/web/groups-page.d.ts.map +1 -0
- package/dist/dashboard/web/groups-page.js +26 -0
- package/dist/dashboard/web/groups-page.js.map +1 -0
- package/dist/dashboard/web/groups.d.ts +1 -1
- package/dist/dashboard/web/groups.d.ts.map +1 -1
- package/dist/dashboard/web/groups.js +113 -52
- package/dist/dashboard/web/groups.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +18 -0
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/insights-page.d.ts +3 -0
- package/dist/dashboard/web/insights-page.d.ts.map +1 -0
- package/dist/dashboard/web/insights-page.js +26 -0
- package/dist/dashboard/web/insights-page.js.map +1 -0
- package/dist/dashboard/web/insights.d.ts +18 -1
- package/dist/dashboard/web/insights.d.ts.map +1 -1
- package/dist/dashboard/web/insights.js +25 -61
- package/dist/dashboard/web/insights.js.map +1 -1
- package/dist/dashboard/web/office-page.d.ts +3 -0
- package/dist/dashboard/web/office-page.d.ts.map +1 -0
- package/dist/dashboard/web/office-page.js +149 -0
- package/dist/dashboard/web/office-page.js.map +1 -0
- package/dist/dashboard/web/office.d.ts +1 -1
- package/dist/dashboard/web/office.d.ts.map +1 -1
- package/dist/dashboard/web/office.js +1 -139
- package/dist/dashboard/web/office.js.map +1 -1
- package/dist/dashboard/web/overview-page.d.ts +3 -0
- package/dist/dashboard/web/overview-page.d.ts.map +1 -0
- package/dist/dashboard/web/overview-page.js +149 -0
- package/dist/dashboard/web/overview-page.js.map +1 -0
- package/dist/dashboard/web/overview.d.ts +2 -2
- package/dist/dashboard/web/overview.d.ts.map +1 -1
- package/dist/dashboard/web/overview.js +14 -3
- package/dist/dashboard/web/overview.js.map +1 -1
- package/dist/dashboard/web/react-hooks.d.ts +8 -0
- package/dist/dashboard/web/react-hooks.d.ts.map +1 -0
- package/dist/dashboard/web/react-hooks.js +43 -0
- package/dist/dashboard/web/react-hooks.js.map +1 -0
- package/dist/dashboard/web/react-mount.d.ts +4 -0
- package/dist/dashboard/web/react-mount.d.ts.map +1 -0
- package/dist/dashboard/web/react-mount.js +7 -0
- package/dist/dashboard/web/react-mount.js.map +1 -0
- package/dist/dashboard/web/roles-page.d.ts +4 -0
- package/dist/dashboard/web/roles-page.d.ts.map +1 -0
- package/dist/dashboard/web/roles-page.js +26 -0
- package/dist/dashboard/web/roles-page.js.map +1 -0
- package/dist/dashboard/web/roles.d.ts +1 -2
- package/dist/dashboard/web/roles.d.ts.map +1 -1
- package/dist/dashboard/web/roles.js +189 -135
- package/dist/dashboard/web/roles.js.map +1 -1
- package/dist/dashboard/web/route-lifecycle.d.ts +14 -0
- package/dist/dashboard/web/route-lifecycle.d.ts.map +1 -0
- package/dist/dashboard/web/route-lifecycle.js +29 -0
- package/dist/dashboard/web/route-lifecycle.js.map +1 -0
- package/dist/dashboard/web/schedules-page.d.ts +14 -0
- package/dist/dashboard/web/schedules-page.d.ts.map +1 -0
- package/dist/dashboard/web/schedules-page.js +84 -0
- package/dist/dashboard/web/schedules-page.js.map +1 -0
- package/dist/dashboard/web/schedules.d.ts +1 -1
- package/dist/dashboard/web/schedules.d.ts.map +1 -1
- package/dist/dashboard/web/schedules.js +1 -115
- package/dist/dashboard/web/schedules.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts +3 -0
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -0
- package/dist/dashboard/web/sessions-page.js +28 -0
- package/dist/dashboard/web/sessions-page.js.map +1 -0
- package/dist/dashboard/web/sessions.d.ts +4 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +43 -10
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts +3 -0
- package/dist/dashboard/web/settings-page.d.ts.map +1 -0
- package/dist/dashboard/web/settings-page.js +387 -0
- package/dist/dashboard/web/settings-page.js.map +1 -0
- package/dist/dashboard/web/settings.d.ts +1 -1
- package/dist/dashboard/web/settings.d.ts.map +1 -1
- package/dist/dashboard/web/settings.js +1 -534
- package/dist/dashboard/web/settings.js.map +1 -1
- package/dist/dashboard/web/skills-page.d.ts +33 -0
- package/dist/dashboard/web/skills-page.d.ts.map +1 -0
- package/dist/dashboard/web/skills-page.js +515 -0
- package/dist/dashboard/web/skills-page.js.map +1 -0
- package/dist/dashboard/web/skills.d.ts +1 -1
- package/dist/dashboard/web/skills.d.ts.map +1 -1
- package/dist/dashboard/web/skills.js +1 -711
- package/dist/dashboard/web/skills.js.map +1 -1
- package/dist/dashboard/web/store.d.ts +9 -0
- package/dist/dashboard/web/store.d.ts.map +1 -1
- package/dist/dashboard/web/store.js +19 -2
- package/dist/dashboard/web/store.js.map +1 -1
- package/dist/dashboard/web/team-federation-page.d.ts +4 -0
- package/dist/dashboard/web/team-federation-page.d.ts.map +1 -0
- package/dist/dashboard/web/team-federation-page.js +47 -0
- package/dist/dashboard/web/team-federation-page.js.map +1 -0
- package/dist/dashboard/web/team-federation.d.ts +2 -2
- package/dist/dashboard/web/team-federation.d.ts.map +1 -1
- package/dist/dashboard/web/team-federation.js +104 -97
- package/dist/dashboard/web/team-federation.js.map +1 -1
- package/dist/dashboard/web/v3-page.d.ts +3 -0
- package/dist/dashboard/web/v3-page.d.ts.map +1 -0
- package/dist/dashboard/web/v3-page.js +27 -0
- package/dist/dashboard/web/v3-page.js.map +1 -0
- package/dist/dashboard/web/v3.d.ts +2 -1
- package/dist/dashboard/web/v3.d.ts.map +1 -1
- package/dist/dashboard/web/v3.js +18 -43
- package/dist/dashboard/web/v3.js.map +1 -1
- package/dist/dashboard/web/whiteboards-page.d.ts +3 -0
- package/dist/dashboard/web/whiteboards-page.d.ts.map +1 -0
- package/dist/dashboard/web/whiteboards-page.js +203 -0
- package/dist/dashboard/web/whiteboards-page.js.map +1 -0
- package/dist/dashboard/web/whiteboards.d.ts +1 -1
- package/dist/dashboard/web/whiteboards.d.ts.map +1 -1
- package/dist/dashboard/web/whiteboards.js +1 -275
- package/dist/dashboard/web/whiteboards.js.map +1 -1
- package/dist/dashboard-web/app.js +36 -2550
- package/dist/dashboard-web/chunks/bot-defaults-page-3EV7K6LJ.js +358 -0
- package/dist/dashboard-web/chunks/chunk-5E3MJJL4.js +1 -0
- package/dist/dashboard-web/chunks/chunk-76J7PNZI.js +1 -0
- package/dist/dashboard-web/chunks/chunk-7SZRL6FY.js +1 -0
- package/dist/dashboard-web/chunks/chunk-JTSE5VP6.js +54 -0
- package/dist/dashboard-web/chunks/chunk-JXLHRRJD.js +31 -0
- package/dist/dashboard-web/chunks/chunk-NASYW5FD.js +1 -0
- package/dist/dashboard-web/chunks/connectors-XPZKEHF6.js +1 -0
- package/dist/dashboard-web/chunks/groups-page-C54PVKYP.js +207 -0
- package/dist/dashboard-web/chunks/insights-page-BBQYR7WY.js +309 -0
- package/dist/dashboard-web/chunks/office-page-6DXYOG55.js +1 -0
- package/dist/dashboard-web/chunks/overview-page-5PJCAMID.js +1 -0
- package/dist/dashboard-web/chunks/roles-page-APUDLPVM.js +98 -0
- package/dist/dashboard-web/chunks/schedules-WG2UKHSO.js +1 -0
- package/dist/dashboard-web/chunks/sessions-page-F3U5NFPD.js +238 -0
- package/dist/dashboard-web/chunks/settings-page-OSBZNCXL.js +2 -0
- package/dist/dashboard-web/chunks/skills-page-Y3VUAOYG.js +2 -0
- package/dist/dashboard-web/chunks/team-federation-page-CRH3WZPH.js +10 -0
- package/dist/dashboard-web/chunks/v3-page-FVPUL665.js +149 -0
- package/dist/dashboard-web/chunks/whiteboards-page-HLCTYSSV.js +1 -0
- package/dist/dashboard-web/chunks/workflows-UB7OPYGI.js +184 -0
- package/dist/dashboard-web/index.html +1 -1
- package/dist/dashboard-web/style.css +82 -1
- package/dist/dashboard.js +5 -6
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +1 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +1 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +1 -0
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +7 -0
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/sessions-card.d.ts.map +1 -1
- package/dist/im/lark/sessions-card.js +4 -1
- package/dist/im/lark/sessions-card.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +16 -14
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/worker.js +1 -1
- package/dist/worker.js.map +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as k}from"./chunk-NASYW5FD.js";import"./chunk-76J7PNZI.js";import"./chunk-JXLHRRJD.js";import{a as oe,b as j,c as q}from"./chunk-JTSE5VP6.js";import{c as E}from"./chunk-7SZRL6FY.js";var i=E(oe(),1);var e=E(q(),1);function K(t){return{publicReadOnly:t?.publicReadOnly===!0,openTerminalInFeishu:t?.openTerminalInFeishu===!0,chatBotDiscovery:t?.chatBotDiscovery!==!1,repoPickerMode:t?.repoPickerMode==="repos"?"repos":"all",maintenance:t?.maintenance&&typeof t.maintenance=="object"?t.maintenance:{},localDevInstall:t?.localDevInstall===!0,whiteboard:{enabled:t?.whiteboard?.enabled===!0},remoteAccess:t?.remoteAccess===!0}}function le(t,n){let a=t?.[n]??{};return{enabled:a.enabled===!0,time:typeof a.time=="string"?a.time:"04:00"}}function _(t,n){return n(t==="npm-global"?"update.kindNpm":t==="source-checkout"?"update.kindSource":"update.kindUnknown")}function re(){let t=k(),n=(0,i.useRef)(!1),a=(0,i.useRef)(new Set),[r,p]=(0,i.useState)(null),[h,b]=(0,i.useState)(!1),[y,N]=(0,i.useState)(null),[S,U]=(0,i.useState)(!0),[l,c]=(0,i.useState)(!1),[d,x]=(0,i.useState)(null),[J,M]=(0,i.useState)(null),[L,C]=(0,i.useState)(null),[G,T]=(0,i.useState)(null),[A,R]=(0,i.useState)(null),[$,O]=(0,i.useState)(!1),[z,D]=(0,i.useState)(!0),[Q,B]=(0,i.useState)(!1),[X,Y]=(0,i.useState)(""),[Z,f]=(0,i.useState)(!1),[ee,m]=(0,i.useState)(null),F=(0,i.useCallback)(()=>{for(let s of a.current)window.clearTimeout(s);a.current.clear()},[]),H=(0,i.useCallback)((s,o)=>{let u=window.setTimeout(()=>{a.current.delete(u),s()},o);return a.current.add(u),u},[]),P=(0,i.useCallback)(async()=>{try{let s=await fetch("/api/update/status"),o=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){C(null),T(o?.error??`HTTP ${s.status}`);return}C(o),T(null)}catch(s){if(!n.current)return;C(null),T(s instanceof Error?s.message:String(s))}},[]),V=(0,i.useCallback)(async()=>{try{let s=await fetch("/api/settings"),o=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){p(null),N(o?.error??`HTTP ${s.status}`),b(!0);return}p(K(o.settings)),U(o.authed===!0),c(o.bound===!0),N(null),b(!0)}catch(s){if(!n.current)return;p(null),N(s instanceof Error?s.message:String(s)),b(!0)}},[]);(0,i.useEffect)(()=>(n.current=!0,V(),()=>{n.current=!1,F()}),[F,V]),(0,i.useEffect)(()=>{h&&(f(!1),m(null),O(!1),S&&P())},[S,P,h]);async function te(s,o,u){if(!r)return;let g=r;p(u(r)),x(s),M({text:t("settings.saving")});try{let v=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(o)}),I=await v.json().catch(()=>({}));if(!n.current)return;if(!v.ok||I.ok===!1)throw new Error(I?.error??`HTTP ${v.status}`);p(K(I.settings)),M({text:t("settings.saved"),cls:"hint-ok"})}catch(v){if(!n.current)return;p(g),M({text:`${t("settings.saveFailed")}: ${v instanceof Error?v.message:String(v)}`,cls:"hint-warn-inline"})}finally{n.current&&x(null)}}async function ne(){R(null),D(!0),B(!1);try{let s=await fetch("/api/update/changelog"),o=await s.json().catch(()=>({}));if(!n.current)return;Y(typeof o?.releasesUrl=="string"?o.releasesUrl:""),s.ok?(R(Array.isArray(o.releases)?o.releases:[]),D(o.ok!==!1),B(o.rateLimited===!0)):(R([]),D(!1))}catch{if(!n.current)return;R([]),D(!1)}}function ae(){let s=Date.now(),o=async()=>{if(n.current){if(Date.now()-s>9e4){f(!1),m({text:t("update.restartSlow"),cls:"hint-warn-inline"});return}try{let u=await fetch("/__health",{cache:"no-store"});if(!n.current)return;if(u.ok){location.reload();return}}catch{}n.current&&H(()=>{o()},2e3)}};H(()=>{o()},3e3)}async function W(s){f(!0),m({text:t("update.restarting")});try{if(await fetch("/api/update/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s?{update:s}:{})}),!n.current)return}catch(o){if(!n.current)return;f(!1),m({text:t("update.restartFailed",{detail:o instanceof Error?o.message:String(o)}),cls:"hint-warn-inline"});return}ae()}async function se(){let s=L;if(!s)return;if(!s.node.ok){window.alert(t("update.nodeTooOldAlert",{version:s.node.version,required:s.node.required}));return}if(s.installs.multiple){let u=s.installs.entries.map(g=>`\u2022 ${g.binPath} (${_(g.kind,t)})`).join(`
|
|
2
|
+
`);if(!window.confirm(t("update.confirmMultiInstall",{paths:u})))return}let o=s.latest?t("update.confirmUpdate",{version:`v${s.latest}`}):t("update.confirmUpdateNoVer");if(window.confirm(o)){f(!0),m({text:t("update.updating")});try{let u=await fetch("/api/update/run",{method:"POST"}),g=await u.json().catch(()=>({}));if(!n.current)return;if(!u.ok||g.ok===!1){let v=g?.detail??g?.error??`HTTP ${u.status}`;f(!1),m({text:t("update.updateFailed",{detail:v}),cls:"hint-warn-inline"});return}g.changed?(f(!1),m({text:t("update.updatedChanged",{old:`v${g.oldVersion}`,new:`v${g.newVersion}`}),cls:"hint-ok"}),window.confirm(t("update.confirmRestart"))?await W({oldVersion:g.oldVersion,newVersion:g.newVersion}):n.current&&m({text:t("update.noRestartHint"),cls:"hint-ok"})):(f(!1),m({text:t("update.alreadyLatestRun",{version:`v${g.newVersion}`}),cls:"hint-ok"}),await P())}catch(u){if(!n.current)return;f(!1),m({text:t("update.updateFailed",{detail:u instanceof Error?u.message:String(u)}),cls:"hint-warn-inline"})}}}let ie=r?(0,e.jsx)(ce,{settings:r,canWrite:S,bound:l,savingKey:d,message:J,onSave:te}):y?(0,e.jsxs)("p",{className:"hint-warn",children:[t("settings.loadFailed"),": ",y]}):(0,e.jsx)("p",{className:"empty",children:t("settings.loading")});return(0,e.jsxs)("section",{className:"page",children:[(0,e.jsx)("div",{className:"page-heading",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("nav.settings")}),(0,e.jsx)("h1",{children:t("settings.title")}),(0,e.jsx)("p",{children:t("settings.subtitle")})]})}),ie,(0,e.jsx)(ue,{canWrite:S,status:L,statusError:G,changelog:A,changelogOpen:$,changelogOk:z,changelogRateLimited:Q,releasesUrl:X,busy:Z,message:ee,onCheck:()=>{C(null),R(null),O(!1),m(null),T(null),P()},onToggleChangelog:()=>{let s=!$;O(s),s&&A===null&&ne()},onUpdate:()=>{se()},onRestart:()=>{window.confirm(t("update.confirmPlainRestart"))&&W(null)}})]})}function ce(t){let n=k(),{settings:a,canWrite:r,bound:p,savingKey:h}=t,b=!r,y=le(a.maintenance,"autoUpdate"),N=!r||a.localDevInstall,S=!r||a.maintenance.autoUpdate?.enabled!==!0,U=(l,c)=>{t.onSave(l,{[l]:c},d=>({...d,[l]:c}))};return(0,e.jsx)("div",{className:"settings-grid",children:(0,e.jsxs)("article",{className:"bd-card settings-card",children:[r?null:(0,e.jsx)("p",{className:"hint-warn",children:n("settings.readOnlyVisitor")}),(0,e.jsxs)("section",{className:"bd-section",children:[(0,e.jsx)("h3",{className:"bd-section-title",children:n("settings.sectionAccess")}),(0,e.jsx)(w,{title:n("settings.publicReadOnly"),help:n("settings.publicReadOnlyHelp"),checked:a.publicReadOnly,disabled:b||h==="publicReadOnly",onChange:l=>U("publicReadOnly",l)}),p?(0,e.jsx)(w,{title:n("settings.remoteAccess"),help:n("settings.remoteAccessHelp"),checked:a.remoteAccess,disabled:b||h==="remoteAccess",onChange:l=>U("remoteAccess",l)}):null]}),(0,e.jsxs)("section",{className:"bd-section",children:[(0,e.jsx)("h3",{className:"bd-section-title",children:n("settings.sectionCards")}),(0,e.jsx)(w,{title:n("settings.openTerminalInFeishu"),help:n("settings.openTerminalInFeishuHelp"),checked:a.openTerminalInFeishu,disabled:b||h==="openTerminalInFeishu",onChange:l=>U("openTerminalInFeishu",l)})]}),(0,e.jsxs)("section",{className:"bd-section",children:[(0,e.jsx)("h3",{className:"bd-section-title",children:n("settings.sectionExperimental")}),(0,e.jsx)(w,{title:n("settings.chatBotDiscovery"),help:n("settings.chatBotDiscoveryHelp"),checked:a.chatBotDiscovery,disabled:b||h==="chatBotDiscovery",onChange:l=>U("chatBotDiscovery",l)})]}),(0,e.jsxs)("section",{className:"bd-section",children:[(0,e.jsx)("h3",{className:"bd-section-title",children:"\u672C\u5730\u767D\u677F"}),(0,e.jsx)(w,{title:"\u542F\u7528\u9879\u76EE\u767D\u677F",help:"\u9ED8\u8BA4\u5173\u95ED\u3002\u5F00\u542F\u53EA\u542F\u7528\u80FD\u529B\uFF0C\u4E0D\u4F1A\u7ACB\u5373\u521B\u5EFA\u767D\u677F\uFF1B\u9996\u6B21\u9700\u8981\u65F6\u624D\u6309\u7FA4+\u9879\u76EE ensure\u3002",checked:a.whiteboard.enabled,disabled:b||h==="whiteboard",onChange:l=>{t.onSave("whiteboard",{whiteboard:{enabled:l}},c=>({...c,whiteboard:{enabled:l}}))}})]}),(0,e.jsxs)("section",{className:"bd-section",children:[(0,e.jsx)("h3",{className:"bd-section-title",children:n("settings.sectionRepoPicker")}),(0,e.jsxs)("label",{className:"form-row",children:[(0,e.jsx)("span",{children:n("settings.repoPickerMode")}),(0,e.jsxs)("select",{value:a.repoPickerMode,disabled:b||h==="repoPickerMode",onChange:l=>{let c=l.currentTarget.value==="repos"?"repos":"all";t.onSave("repoPickerMode",{repoPickerMode:c},d=>({...d,repoPickerMode:c}))},children:[(0,e.jsx)("option",{value:"all",children:n("settings.repoPickerModeAll")}),(0,e.jsx)("option",{value:"repos",children:n("settings.repoPickerModeRepos")})]}),(0,e.jsx)("small",{children:n("settings.repoPickerModeHelp")})]})]}),(0,e.jsxs)("section",{className:"bd-section",children:[(0,e.jsx)("h3",{className:"bd-section-title",children:n("settings.sectionMaintenance")}),(0,e.jsx)(w,{title:n("settings.autoUpdate"),help:n("settings.autoUpdateHelp"),checked:y.enabled,disabled:N||h==="autoUpdate",onChange:l=>{let c={enabled:l,time:y.time};t.onSave("autoUpdate",{maintenance:{autoUpdate:c}},d=>({...d,maintenance:{...d.maintenance,autoUpdate:c}}))}}),(0,e.jsx)("div",{className:"maint-time",children:(0,e.jsxs)("label",{children:[n("settings.maintenanceTime"),(0,e.jsx)("input",{type:"time",value:y.time,disabled:N||h==="autoUpdate",onChange:l=>{let c={enabled:y.enabled,time:l.currentTarget.value||"04:00"};t.onSave("autoUpdate",{maintenance:{autoUpdate:c}},d=>({...d,maintenance:{...d.maintenance,autoUpdate:c}}))}})]})}),a.localDevInstall?(0,e.jsx)("p",{className:"hint-warn",children:n("settings.autoUpdateLocalDev")}):null,(0,e.jsx)(w,{title:n("settings.autoRestart"),help:n("settings.autoRestartHelp"),checked:a.maintenance.autoRestart?.enabled===!0,disabled:S||h==="autoRestart",onChange:l=>{let c={enabled:l};t.onSave("autoRestart",{maintenance:{autoRestart:c}},d=>({...d,maintenance:{...d.maintenance,autoRestart:c}}))}})]}),(0,e.jsx)("div",{className:"actions settings-actions",children:(0,e.jsx)("span",{className:`oncall-status ${t.message?.cls??""}`,"data-settings-status":!0,children:t.message?.text??""})})]})})}function w(t){return(0,e.jsxs)("label",{className:"toggle-row",children:[(0,e.jsx)("input",{type:"checkbox",checked:t.checked,disabled:t.disabled,onChange:n=>t.onChange(n.currentTarget.checked)}),(0,e.jsx)("span",{className:"switch","aria-hidden":"true"}),(0,e.jsxs)("span",{className:"toggle-tx",children:[(0,e.jsx)("strong",{children:t.title}),(0,e.jsx)("small",{children:t.help})]})]})}function ue(t){let n=k(),a;if(!t.canWrite)a=(0,e.jsx)("p",{className:"hint-warn",children:n("update.loginRequired")});else if(t.statusError)a=(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("p",{className:"hint-warn",children:[n("update.checkFailed"),": ",t.statusError]}),(0,e.jsx)("div",{className:"update-actions",children:(0,e.jsx)("button",{type:"button","data-up":"check",onClick:t.onCheck,children:n("update.btnCheck")})})]});else if(!t.status)a=(0,e.jsx)("p",{className:"empty",children:n("update.loading")});else{let r=t.status,p=r.localDevInstall||t.busy;a=(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("p",{className:"update-version",children:[(0,e.jsxs)("span",{children:[n("update.current"),": ",(0,e.jsxs)("strong",{children:["v",r.current]})]})," ",(0,e.jsx)(de,{status:r})]}),r.node.ok?null:(0,e.jsx)("p",{className:"hint-warn",children:n("update.nodeWarn",{version:r.node.version,required:r.node.required})}),r.localDevInstall?(0,e.jsx)("p",{className:"hint-warn",children:n("update.localDev")}):null,r.installs.multiple?(0,e.jsx)(ge,{entries:r.installs.entries}):null,(0,e.jsxs)("div",{className:"update-actions",children:[(0,e.jsx)("button",{type:"button","data-up":"check",disabled:t.busy,onClick:t.onCheck,children:n("update.btnCheck")}),(0,e.jsx)("button",{type:"button","data-up":"changelog",disabled:t.busy,onClick:t.onToggleChangelog,children:t.changelogOpen?n("update.btnChangelogHide"):n("update.btnChangelog")}),(0,e.jsx)("button",{type:"button",className:"primary","data-up":"update",disabled:p,onClick:t.onUpdate,children:n("update.btnUpdate")}),(0,e.jsx)("button",{type:"button","data-up":"restart",disabled:t.busy,onClick:t.onRestart,children:n("update.btnRestart")})]}),t.changelogOpen?(0,e.jsx)(pe,{changelog:t.changelog,ok:t.changelogOk,rateLimited:t.changelogRateLimited,releasesUrl:t.releasesUrl}):null,t.message?(0,e.jsx)("p",{className:`oncall-status ${t.message.cls??""}`,children:t.message.text}):null]})}return(0,e.jsx)("div",{className:"settings-grid",children:(0,e.jsx)("article",{className:"bd-card settings-card",children:(0,e.jsxs)("section",{className:"bd-section",children:[(0,e.jsx)("h3",{className:"bd-section-title",children:n("update.section")}),a]})})})}function de(t){let n=k(),a=t.status;return a.latest?a.behind?(0,e.jsx)("span",{className:"update-badge update-badge-new",children:n("update.newAvailable",{version:`v${a.latest}`})}):(0,e.jsx)("span",{className:"update-badge update-badge-ok",children:n("update.upToDate")}):(0,e.jsx)("span",{className:"hint-warn-inline",children:n("update.checkUnavailable")})}function ge(t){let n=k();return(0,e.jsxs)("div",{className:"hint-warn",children:[(0,e.jsx)("p",{children:n("update.multiInstallWarn")}),(0,e.jsx)("ul",{className:"update-install-list",children:t.entries.map(a=>(0,e.jsxs)("li",{children:[(0,e.jsx)("code",{children:a.binPath})," \u2192 ",_(a.kind,n)," ",(0,e.jsx)("small",{children:a.root})]},`${a.binPath}:${a.root}`))})]})}function pe(t){let n=k();if(t.changelog===null)return(0,e.jsx)("p",{className:"empty",children:n("update.changelogLoading")});if(!t.ok){let a=t.rateLimited?n("update.changelogRateLimited"):n("update.changelogFailed");return(0,e.jsxs)("p",{className:"hint-warn-inline",children:[a,t.releasesUrl?(0,e.jsxs)(e.Fragment,{children:[" ",(0,e.jsx)("a",{href:t.releasesUrl,target:"_blank",rel:"noopener",children:n("update.changelogViewOnGitHub")})]}):null]})}return t.changelog.length===0?(0,e.jsx)("p",{className:"empty",children:n("update.changelogEmpty")}):(0,e.jsx)("div",{className:"update-changelog",children:t.changelog.map(a=>{let r=a.name&&a.name!==`v${a.version}`?a.name:"",p=a.publishedAt?new Date(a.publishedAt).toLocaleDateString():"";return(0,e.jsxs)("details",{className:"update-release",open:!0,children:[(0,e.jsxs)("summary",{children:[(0,e.jsxs)("strong",{children:["v",a.version]})," ",r," ",(0,e.jsx)("small",{children:p})," ",(0,e.jsx)("a",{href:a.url,target:"_blank",rel:"noopener",children:"\u2197"})]}),(0,e.jsx)("pre",{className:"update-release-body",children:a.body||""})]},a.version)})})}function fe(t){return j(t,(0,e.jsx)(re,{}))}export{fe as renderSettingsPage};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as F}from"./chunk-NASYW5FD.js";import"./chunk-76J7PNZI.js";import{p as W,w as ms}from"./chunk-JXLHRRJD.js";import{a as Js,b as ys,c as bs}from"./chunk-JTSE5VP6.js";import{c as z}from"./chunk-7SZRL6FY.js";var n=z(Js(),1);var s=z(bs(),1),qs=2;function V(e){let i=e.as??"span";return(0,s.jsx)(i,{style:{display:"contents"},dangerouslySetInnerHTML:{__html:e.html}})}function Ks(e,i){let a=String(e??"").replace(/\\/g,"/");return a.includes("/.codex/skills/")?i("skills.sourceCodex"):a.includes("/.claude/skills/")?i("skills.sourceClaude"):a.includes("/.trae/skills/")?i("skills.sourceTrae"):a.includes("/.cursor/skills/")?i("skills.sourceCursor"):a.includes("/.gemini/skills/")?i("skills.sourceGemini"):a.includes("/.config/opencode/skills/")?i("skills.sourceOpenCode"):null}function zs(e,i){let a=e.source??{};return a.type==="github"?`github:${a.owner}/${a.repo}/${a.path??""}`:a.type==="git"?`${a.url??"git"}#${a.path??""}`:a.type==="local-link"?Ks(a.path,i)??i("skills.sourceLocalLink"):a.type==="local-copy"?i("skills.sourceBotmuxCopy"):String(a.type??"unknown")}function G(e){return(e?.include??[]).filter(i=>i.startsWith("skill:")).map(i=>i.slice(6))}function Ws(e){return G(e).length}function Fs(e){return G(e).length>0}function M(e){return`${e.cliId}
|
|
2
|
+
${e.rootDir}`}function Vs(e){return e>=1600?4:e<=620?1:e<=980?2:3}async function g(e,i){let a=await fetch(e,{...i,headers:{"content-type":"application/json",...i.headers??{}}}),f=await a.json().catch(()=>({}));if(!a.ok||f.ok===!1){let h=new Error(f?.error??`HTTP ${a.status}`);throw h.status=a.status,h.body=f,h}return f}function fs(e){return`oncall-status${e?` ${e.ok?"hint-ok":"hint-warn-inline"}`:""}`}function Qs(){let e=F(),i=(0,n.useRef)(!0),a=(0,n.useRef)(new Set),f=(0,n.useRef)(null),h=(0,n.useRef)(null),[p,A]=(0,n.useState)([]),[y,P]=(0,n.useState)([]),[k,I]=(0,n.useState)([]),[b,m]=(0,n.useState)("off"),[$,d]=(0,n.useState)("auto"),[C,Q]=(0,n.useState)(null),[X,Y]=(0,n.useState)(!0),[vs,gs]=(0,n.useState)(()=>window.innerWidth),[Z,hs]=(0,n.useState)(""),[ss,Ns]=(0,n.useState)(""),[ls,Ss]=(0,n.useState)(""),[es,N]=(0,n.useState)(null),[ws,ts]=(0,n.useState)(!1),[H,D]=(0,n.useState)(!1),[Ps,is]=(0,n.useState)(!1),[O,$s]=(0,n.useState)(null),[U,_]=(0,n.useState)(()=>new Set),[T,J]=(0,n.useState)(0),[as,j]=(0,n.useState)(null),[ns,E]=(0,n.useState)(null),[Cs,os]=(0,n.useState)(null),[Rs,rs]=(0,n.useState)({}),x=(0,n.useMemo)(()=>new Set(p.map(l=>l.name)),[p]),L=Vs(vs)*qs,R=Math.max(1,Math.ceil(p.length/L)),Ts=p.slice(T*L,T*L+L),S=(0,n.useMemo)(()=>y.length===0?void 0:(O?y.find(t=>M(t)===O):void 0)??y.find(t=>t.skills.length>0)??y[0],[O,y]),q=S?M(S):"",B=(0,n.useMemo)(()=>S?S.skills.filter(l=>!x.has(l.name)).map(l=>l.rootDir??l.source?.root??"").filter(Boolean):[],[S,x]),cs=B.length>0&&B.every(l=>U.has(l)),ds=(0,n.useCallback)(()=>{for(let l of a.current)window.clearTimeout(l);a.current.clear()},[]),Bs=(0,n.useCallback)(l=>new Promise(t=>{let o=window.setTimeout(()=>{a.current.delete(o),t()},l);a.current.add(o)}),[]),us=(0,n.useCallback)(async()=>{let[l,t]=await Promise.all([fetch("/api/skills"),fetch("/api/bots")]),o=await l.json().catch(()=>({})),c=await t.json().catch(()=>({}));if(!l.ok){let r=o?.error??`skills HTTP ${l.status}`;throw new Error(r==="not_found_yet"||r==="not_found"?e("skills.apiUnavailable"):r)}if(!t.ok)throw new Error(c?.error??`bots HTTP ${t.status}`);return{skills:Array.isArray(o.skills)?o.skills:[],nativeSkillGroups:Array.isArray(o.nativeSkillGroups)?o.nativeSkillGroups:[],bots:Array.isArray(c.bots)?c.bots:[],trustProjectSkills:o.trustProjectSkills==="all"?"all":"off",delivery:o.delivery==="prompt"||o.delivery==="native"?o.delivery:"auto"}},[e]),w=(0,n.useCallback)(async()=>{Y(!0);try{let l=await us();if(!i.current)return;A(l.skills),P(l.nativeSkillGroups),I(l.bots),m(l.trustProjectSkills),d(l.delivery),Q(null),_(t=>{let o=new Set,c=new Set(l.skills.map(r=>r.name));for(let r of l.nativeSkillGroups)for(let u of r.skills){let v=u.rootDir??u.source?.root??"";v&&!c.has(u.name)&&t.has(v)&&o.add(v)}return o})}catch(l){if(!i.current)return;Q(l?.message??String(l))}finally{i.current&&Y(!1)}},[us]);(0,n.useEffect)(()=>{i.current=!0,w();let l=()=>gs(window.innerWidth);return window.addEventListener("resize",l),()=>{i.current=!1,ds(),window.removeEventListener("resize",l)}},[ds,w]),(0,n.useEffect)(()=>{J(l=>Math.min(Math.max(0,l),R-1))},[R]),(0,n.useEffect)(()=>{let l=f.current;if(l)if(H&&!l.open)try{l.showModal()}catch{}else!H&&l.open&&l.close()},[H,q]);async function ks(l,t,o=!0){let c=l;for(t({text:e("skills.jobRunning"),ok:!0});;){if(!i.current)return;if(c.status==="succeeded"){t({text:e("skills.saved"),ok:!0}),o&&await w();return}if(c.status==="failed")throw new Error(c.error??"job_failed");if(await Bs(800),!i.current)return;let r=await g(`/api/skills/jobs/${encodeURIComponent(c.id)}`,{method:"GET"});if(!i.current)return;c=r.job}}function As(l){return k.filter(t=>G(t.skills).includes(l)).map(t=>t.botName??t.larkAppId)}async function Is(){ts(!0);try{let l=await g("/api/skills/install",{method:"POST",body:JSON.stringify({source:Z.trim(),path:ss.trim()||void 0,ref:ls.trim()||void 0})});if(!i.current)return;await ks(l.job,N)}catch(l){i.current&&N({text:`${e("skills.failed")}: ${l?.message??l}`,ok:!1})}finally{i.current&&ts(!1)}}async function Ds(){let l=[...U].filter(Boolean);if(l.length===0){N({text:e("skills.discoverNothingSelected"),ok:!1});return}is(!0);try{if(N({text:e("skills.discoverRegisteringBatch",{total:l.length}),ok:!0}),await g("/api/skills/install-local-links",{method:"POST",body:JSON.stringify({sources:l})}),!i.current)return;D(!1),await w(),i.current&&N({text:e("skills.saved"),ok:!0})}catch(t){i.current&&N({text:`${e("skills.failed")}: ${t?.message??t}`,ok:!1})}finally{i.current&&is(!1)}}async function js(l){if(b!==l){j("project");try{let t=await g("/api/skills/global",{method:"PUT",body:JSON.stringify({trustProjectSkills:l})});if(!i.current)return;m(t.trustProjectSkills==="all"?"all":l)}catch(t){i.current&&window.alert(`${e("skills.failed")}: ${t?.message??t}`)}finally{i.current&&j(null)}}}async function Es(l){if($!==l){j("delivery");try{let t=await g("/api/skills/global",{method:"PUT",body:JSON.stringify({delivery:l})});if(!i.current)return;d(t.delivery==="prompt"||t.delivery==="native"?t.delivery:l)}catch(t){i.current&&window.alert(`${e("skills.failed")}: ${t?.message??t}`)}finally{i.current&&j(null)}}}function ps(l){let t=h.current,o=t?.querySelector(".skills-bot-card");if(!t||!o)return;let c=window.getComputedStyle(t),r=Number.parseFloat(c.columnGap||c.gap||"0")||0;t.scrollBy({left:l*(o.getBoundingClientRect().width+r),behavior:"smooth"})}async function xs(l){E(`${l}:update`);try{let t=await g(`/api/skills/${encodeURIComponent(l)}/update`,{method:"POST",body:"{}"});if(!i.current)return;await ks(t.job,N)}catch(t){i.current&&window.alert(`${e("skills.failed")}: ${t?.message??t}`)}finally{i.current&&E(null)}}async function Ls(l){if(window.confirm(`${e("skills.remove")} ${l}?`)){E(`${l}:remove`);try{if(await g(`/api/skills/${encodeURIComponent(l)}`,{method:"DELETE",body:"{}"}),!i.current)return;await w()}catch(t){if(!i.current)return;if(t?.status===409&&t?.body?.error==="skill_in_use"){let o=Array.isArray(t.body.affectedBots)?t.body.affectedBots.map(r=>{let u=r?.botName||r?.larkAppId;return u?`${u}`:""}).filter(Boolean):As(l),c=[o.length?`Bot: ${o.join(", ")}`:""].filter(Boolean).join("; ")||"-";if(!window.confirm(e("skills.removeInUse",{skill:l,refs:c})))return;try{if(await g(`/api/skills/${encodeURIComponent(l)}?force=1`,{method:"DELETE",body:"{}"}),!i.current)return;await w();return}catch(r){i.current&&window.alert(`${e("skills.failed")}: ${r?.message??r}`);return}}window.alert(`${e("skills.failed")}: ${t?.message??t}`)}finally{i.current&&E(null)}}}async function Ms(l,t,o){let c=`${l}:${t}:${o}`;os(c),rs(r=>({...r,[l]:null}));try{let r=await g(`/api/bots/${encodeURIComponent(l)}/skills`,{method:"PUT",body:JSON.stringify({action:t,name:o})});if(!i.current)return;I(u=>u.map(v=>v.larkAppId===l?{...v,skills:r.skills??null}:v))}catch(r){i.current&&rs(u=>({...u,[l]:{text:`${e("skills.failed")}: ${r?.message??r}`,ok:!1}}))}finally{i.current&&os(null)}}let Gs=k.filter(l=>Fs(l.skills)).length,Hs=k.reduce((l,t)=>l+Ws(t.skills),0),Os=X?(0,s.jsx)(V,{html:ms(),as:"div"}):C?(0,s.jsx)("p",{className:"hint-warn",children:C}):(0,s.jsxs)("div",{className:"skills-page-grid",children:[(0,s.jsxs)("aside",{className:"skills-side-rail",children:[(0,s.jsxs)("article",{className:"bd-card skills-defaults-panel",children:[(0,s.jsx)("h3",{className:"bd-section-title",children:e("skills.globalDefaults")}),(0,s.jsxs)("div",{className:"skills-control-block",children:[(0,s.jsx)("span",{className:"skills-control-label",children:e("skills.globalProject")}),(0,s.jsx)("div",{className:"skills-choice-group skills-choice-group-compact skills-project-group",children:[["off",e("skills.globalProjectOff"),e("skills.globalProjectOffHelp")],["all",e("skills.globalProjectAll"),e("skills.globalProjectAllHelp")]].map(([l,t,o])=>(0,s.jsxs)("button",{type:"button",className:`skills-choice${b===l?" selected":""}`,"data-global-project-value":l,"aria-pressed":b===l?"true":"false",disabled:as==="project",onClick:()=>{js(l)},children:[(0,s.jsx)("strong",{children:t}),(0,s.jsx)("small",{children:o})]},l))})]}),(0,s.jsxs)("div",{className:"skills-control-block",children:[(0,s.jsx)("span",{className:"skills-control-label",children:e("skills.globalDelivery")}),(0,s.jsx)("div",{className:"skills-choice-group skills-delivery-group",children:[["auto",e("skills.deliveryAuto"),e("skills.deliveryAutoHelp")],["prompt",e("skills.deliveryPrompt"),e("skills.deliveryPromptHelp")],["native",e("skills.deliveryNative"),e("skills.deliveryNativeHelp")]].map(([l,t,o])=>(0,s.jsxs)("button",{type:"button",className:`skills-choice${$===l?" selected":""}`,"data-global-delivery-value":l,"aria-pressed":$===l?"true":"false",disabled:as==="delivery",onClick:()=>{Es(l)},children:[(0,s.jsx)("strong",{children:t}),(0,s.jsx)("small",{children:o})]},l))})]})]}),(0,s.jsxs)("article",{className:"bd-card skills-install-panel",children:[(0,s.jsxs)("div",{className:"skills-install-title",children:[(0,s.jsx)("h3",{className:"bd-section-title",children:e("skills.install")}),(0,s.jsxs)("span",{className:"skills-help-tip",children:[(0,s.jsx)("button",{type:"button",className:"skills-help-button","aria-label":e("skills.installInfoLabel"),children:"?"}),(0,s.jsx)("span",{className:"skills-help-popover",role:"tooltip",children:e("skills.installInfo")})]})]}),(0,s.jsxs)("div",{className:"skills-install-grid",children:[(0,s.jsxs)("div",{className:"skills-source-label",children:[(0,s.jsx)("span",{children:e("skills.source")}),(0,s.jsxs)("div",{className:"skills-source-control",children:[(0,s.jsx)("input",{type:"text","data-install":"source","aria-label":e("skills.source"),placeholder:e("skills.sourcePlaceholder"),value:Z,onChange:l=>hs(l.currentTarget.value)}),(0,s.jsx)("button",{type:"button","data-action":"discover-native-skills",onClick:()=>D(!0),children:e("skills.discover")})]})]}),(0,s.jsxs)("div",{className:"bd-section-note skills-install-note",children:[(0,s.jsxs)("span",{children:[(0,s.jsx)("strong",{children:e("skills.sourceHelpRemoteLabel")}),e("skills.sourceHelpRemote")]}),(0,s.jsxs)("span",{children:[(0,s.jsx)("strong",{children:e("skills.sourceHelpLocalLabel")}),e("skills.sourceHelpLocal")]})]}),(0,s.jsxs)("label",{className:"skills-install-field-wide",children:[(0,s.jsx)("span",{children:e("skills.path")}),(0,s.jsx)("input",{type:"text","data-install":"path",placeholder:e("skills.pathPlaceholder"),value:ss,onChange:l=>Ns(l.currentTarget.value)})]}),(0,s.jsxs)("label",{className:"skills-install-field-wide",children:[(0,s.jsx)("span",{children:e("skills.ref")}),(0,s.jsx)("input",{type:"text","data-install":"ref",placeholder:e("skills.refPlaceholder"),value:ls,onChange:l=>Ss(l.currentTarget.value)})]})]}),(0,s.jsxs)("div",{className:"actions",children:[(0,s.jsx)("button",{type:"button",className:"primary","data-action":"install",disabled:ws,onClick:()=>{Is()},children:e("skills.installSubmit")}),(0,s.jsx)("span",{className:fs(es),"data-skills-status":!0,children:es?.text??""})]})]})]}),(0,s.jsxs)("section",{className:"skills-main-panel",children:[(0,s.jsxs)("section",{className:"skills-overview",children:[(0,s.jsxs)("div",{className:"skills-overview-copy",children:[(0,s.jsx)("h2",{children:e("skills.overviewTitle")}),(0,s.jsx)("p",{children:e("skills.overviewBody")})]}),(0,s.jsxs)("div",{className:"skills-metric-strip",children:[(0,s.jsxs)("span",{children:[(0,s.jsx)("small",{children:e("skills.metricInstalled")}),(0,s.jsx)("strong",{children:p.length})]}),(0,s.jsxs)("span",{children:[(0,s.jsx)("small",{children:e("skills.metricBots")}),(0,s.jsxs)("strong",{children:[Gs,"/",k.length]})]}),(0,s.jsxs)("span",{children:[(0,s.jsx)("small",{children:e("skills.metricAttached")}),(0,s.jsx)("strong",{children:Hs})]})]})]}),(0,s.jsxs)("section",{className:"skills-bots-panel",children:[(0,s.jsxs)("div",{className:"skills-section-head skills-section-head-row",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{children:e("skills.bots")}),(0,s.jsx)("p",{children:e("skills.botsHelp")})]}),k.length>3?(0,s.jsxs)("div",{className:"skills-bot-rail-actions",children:[(0,s.jsx)("button",{type:"button",className:"skills-rail-button","data-action":"scroll-bots","data-dir":"-1","aria-label":e("skills.scrollBotsPrev"),title:e("skills.scrollBotsPrev"),onClick:()=>ps(-1),children:"\u2039"}),(0,s.jsx)("span",{className:"skills-count-pill",children:e("skills.botCount",{count:k.length})}),(0,s.jsx)("button",{type:"button",className:"skills-rail-button","data-action":"scroll-bots","data-dir":"1","aria-label":e("skills.scrollBotsNext"),title:e("skills.scrollBotsNext"),onClick:()=>ps(1),children:"\u203A"})]}):(0,s.jsx)("span",{className:"skills-count-pill",children:e("skills.botCount",{count:k.length})})]}),(0,s.jsx)("div",{className:"skills-bot-grid",ref:h,children:k.map(l=>(0,s.jsx)(Xs,{bot:l,installedNames:x,skills:p,status:Rs[l.larkAppId]??null,busyKey:Cs,onUpdate:Ms},l.larkAppId))})]}),(0,s.jsxs)("section",{className:"bd-card skills-installed-panel",children:[(0,s.jsxs)("div",{className:"skills-section-head skills-section-head-row",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{children:e("skills.installed")}),(0,s.jsx)("p",{children:e("skills.installedHelp")})]}),R<=1?(0,s.jsx)("span",{className:"skills-count-pill",children:e("skills.skillCount",{count:p.length})}):(0,s.jsxs)("div",{className:"skills-installed-toolbar",children:[(0,s.jsx)("span",{className:"skills-count-pill",children:e("skills.skillCount",{count:p.length})}),(0,s.jsxs)("div",{className:"skills-pager",children:[(0,s.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"-1","aria-label":e("skills.prevPage"),title:e("skills.prevPage"),disabled:T===0,onClick:()=>J(l=>Math.max(0,l-1)),children:"\u2039"}),(0,s.jsx)("span",{children:e("skills.pageStatus",{page:T+1,pages:R})}),(0,s.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"1","aria-label":e("skills.nextPage"),title:e("skills.nextPage"),disabled:T>=R-1,onClick:()=>J(l=>Math.min(R-1,l+1)),children:"\u203A"})]})]})]}),p.length===0?(0,s.jsx)("p",{className:"empty",children:e("skills.empty")}):(0,s.jsx)("div",{className:"skills-list",children:Ts.map(l=>(0,s.jsxs)("article",{className:"skills-row skills-installed-card","data-skill":l.name,children:[(0,s.jsxs)("div",{className:"skills-row-body",children:[(0,s.jsx)("strong",{children:l.name}),l.description?(0,s.jsx)("p",{children:l.description}):null,(0,s.jsx)("small",{className:"skills-source-badge",children:zs(l,e)})]}),(0,s.jsxs)("div",{className:"skills-card-actions",children:[(0,s.jsx)("button",{type:"button","data-action":"update-skill",disabled:ns===`${l.name}:update`,onClick:()=>{xs(l.name)},children:e("skills.update")}),(0,s.jsx)("button",{type:"button","data-action":"remove-skill",disabled:ns===`${l.name}:remove`,onClick:()=>{Ls(l.name)},children:e("skills.remove")})]})]},l.name))})]})]}),(0,s.jsx)("dialog",{className:"skills-discovery-dialog",id:"skills-discovery-dialog",ref:f,onClose:()=>D(!1),children:(0,s.jsxs)("article",{children:[(0,s.jsxs)("header",{children:[(0,s.jsx)("h3",{children:e("skills.discoverTitle")}),(0,s.jsx)("p",{children:e("skills.discoverHelp")})]}),(0,s.jsx)("div",{className:"skills-discovery-body",children:S?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"skills-discovery-tabs",role:"tablist","aria-label":e("skills.discoverTitle"),children:y.map(l=>{let t=M(l),o=t===q;return(0,s.jsxs)("button",{type:"button",role:"tab","data-discovery-tab":t,className:o?"selected":"","aria-selected":o?"true":"false",onClick:()=>$s(t),children:[(0,s.jsx)("strong",{children:l.label??l.cliId}),(0,s.jsx)("small",{children:e("skills.skillCount",{count:l.skills.length})})]},t)})}),(0,s.jsx)("div",{className:"skills-discovery-path",children:(0,s.jsx)("code",{children:S.rootDir})}),y.map(l=>{let t=M(l);return(0,s.jsx)("section",{className:"skills-discovery-group","data-discovery-panel":t,hidden:!(t===q),children:l.skills.length===0?(0,s.jsx)("p",{className:"empty",children:e("skills.discoverGroupEmpty")}):(0,s.jsx)("div",{className:"skills-discovery-list",children:l.skills.map(c=>{let r=x.has(c.name),u=c.rootDir??c.source?.root??"";return(0,s.jsxs)("label",{className:`skills-discovery-row${r?" installed":""}`,children:[(0,s.jsx)("input",{type:"checkbox","data-discovered-skill":!0,value:u,disabled:r,checked:!r&&U.has(u),onChange:v=>{let Us=v.currentTarget.checked;_(_s=>{let K=new Set(_s);return Us?K.add(u):K.delete(u),K})}}),(0,s.jsxs)("span",{children:[(0,s.jsx)("strong",{children:c.name}),c.description?(0,s.jsx)("small",{children:c.description}):null]}),r?(0,s.jsx)("em",{children:e("skills.discoverRegistered")}):null]},`${c.name}:${u}`)})})},t)})]}):(0,s.jsx)("p",{className:"empty",children:e("skills.discoverEmpty")})}),(0,s.jsxs)("footer",{className:"actions",children:[(0,s.jsx)("button",{type:"button","data-action":"toggle-discovered-skills",disabled:B.length===0,onClick:()=>{_(l=>{let t=new Set(l);return cs?B.forEach(o=>t.delete(o)):B.forEach(o=>t.add(o)),t})},children:e(cs?"skills.discoverClearSelection":"skills.discoverSelectAll")}),(0,s.jsx)("button",{type:"button",className:"primary","data-action":"register-discovered-skills",disabled:Ps,onClick:()=>{Ds()},children:e("skills.discoverRegister")}),(0,s.jsx)("button",{type:"button","data-action":"close-discovery",onClick:()=>D(!1),children:e("skills.discoverClose")})]})]})})]});return(0,s.jsxs)("section",{className:"page",children:[(0,s.jsxs)("div",{className:"page-heading",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"eyebrow",children:e("nav.skills")}),(0,s.jsx)("h1",{children:e("skills.title")}),(0,s.jsx)("p",{children:e("skills.subtitle")})]}),(0,s.jsx)("button",{type:"button",id:"skills-refresh",disabled:X,onClick:()=>{w()},children:e("skills.refresh")})]}),(0,s.jsx)("div",{id:"skills-body",children:Os})]})}function Xs(e){let i=F(),{bot:a,installedNames:f,skills:h,status:p,busyKey:A,onUpdate:y}=e,P=a.botName??a.larkAppId,k=G(a.skills),I=new Set(k),b=h.filter(d=>!I.has(d.name)),[m,$]=(0,n.useState)(b[0]?.name??"");return(0,n.useEffect)(()=>{(!m||!b.some(d=>d.name===m))&&$(b[0]?.name??"")},[b,m]),a.error?(0,s.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":a.larkAppId,children:[(0,s.jsxs)("header",{children:[(0,s.jsx)(V,{html:W({name:P,larkAppId:a.larkAppId,size:"sm"})}),(0,s.jsx)("strong",{children:P})]}),(0,s.jsx)("p",{className:"hint-warn-inline",children:a.error})]}):(0,s.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":a.larkAppId,children:[(0,s.jsxs)("header",{className:"skills-bot-head",children:[(0,s.jsx)(V,{html:W({name:P,larkAppId:a.larkAppId,size:"sm",dot:"ok"})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("strong",{children:P}),(0,s.jsx)("code",{children:a.larkAppId})]}),(0,s.jsx)("span",{className:"skills-count-pill",children:i("skills.skillCount",{count:k.length})})]}),(0,s.jsxs)("section",{className:"bd-section",children:[(0,s.jsx)("h3",{className:"bd-section-title",children:i("skills.priority")}),k.length===0?(0,s.jsx)("p",{className:"bd-section-note",children:i("skills.noPriority")}):(0,s.jsx)("div",{className:"skills-chip-list",children:k.map(d=>{let C=!f.has(d);return(0,s.jsxs)("span",{className:`skills-priority-row${C?" skills-priority-dangling":""}`,title:C?i("skills.dangling"):"",children:[(0,s.jsxs)("span",{className:"skills-priority-name",children:[d,C?(0,s.jsx)("small",{children:i("skills.dangling")}):null]}),(0,s.jsx)("button",{type:"button",className:"skills-priority-remove","data-action":"detach-skill","data-name":d,"aria-label":i("skills.detachNamed",{skill:d}),disabled:A===`${a.larkAppId}:detach:${d}`,onClick:()=>{y(a.larkAppId,"detach",d)},children:"\xD7"})]},d)})}),(0,s.jsx)("div",{className:"actions skills-attach-row",children:b.length===0?(0,s.jsx)("button",{type:"button",disabled:!0,children:i("skills.attach")}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("select",{"data-attach-picker":!0,value:m,onChange:d=>$(d.currentTarget.value),children:b.map(d=>(0,s.jsx)("option",{value:d.name,children:d.name},d.name))}),(0,s.jsx)("button",{type:"button","data-action":"attach-skill",disabled:!m||A===`${a.larkAppId}:attach:${m}`,onClick:()=>m&&void y(a.larkAppId,"attach",m),children:i("skills.attach")})]})})]}),(0,s.jsx)("span",{className:fs(p),"data-bot-status":!0,children:p?.text??""})]})}function ll(e){return ys(e,(0,s.jsx)(Qs,{}))}export{Xs as BotPolicyCard,ll as renderSkillsPage};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{b as w}from"./chunk-NASYW5FD.js";import"./chunk-76J7PNZI.js";import{m as n,n as d}from"./chunk-JXLHRRJD.js";import{a as V,b as R,c as P}from"./chunk-JTSE5VP6.js";import{c as N}from"./chunk-7SZRL6FY.js";var k=N(V(),1);async function E(e){let t=await fetch(e);return{status:t.status,body:await t.json().catch(()=>({}))}}async function S(e,t,o){let a=await fetch(t,{method:e,headers:{"content-type":"application/json"},body:o?JSON.stringify(o):void 0});return{status:a.status,body:await a.json().catch(()=>({}))}}var x=(e,t)=>S("POST",e,t),X=(e,t)=>S("PUT",e,t),z=[],U=[],q="",I="",A=new Map,H=new Map,$=new Set,M=new Set,y=0;function _(){return y+=1,y}function f(e){return y===e}function c(e){return document.getElementById(e)}function B(){return[...z,...U]}function T(e){let t=A.get(e);return t||(t=new Set,A.set(e,t)),t}function Y(e){return B().find(t=>t.key===e)}function Z(e){let t=(c("tf-search").value||"").trim().toLowerCase();if(t&&!((e.name||"")+" "+(e.cliId||"")+" "+(e.capability||"")).toLowerCase().includes(t))return!1;let o=c("tf-cli").value;return!(o&&e.cliId!==o||c("tf-fcap").checked&&!e.capability||c("tf-frole").checked&&!e.hasTeamRole)}function ee(e,t){let o=[...e.deployments].sort((r,s)=>r.local===s.local?0:r.local?-1:1),a="";for(let r of o){let s=t.filter(p=>p.deployment.id===r.id);if(!s.length)continue;let m=r.id===q,l=m?n("team.tagLocal"):r.stale?n("team.tagRemoteStale"):n("team.tagRemote"),u=e.kind==="local"&&!m?` <button class="tf-rmmember ghost" data-team="${d(e.teamId)}" data-dep="${d(r.id)}" data-name="${d(r.name)}" style="font-size:12px">${n("team.removeMember")}</button>`:"",g=`${e.key}::${r.id}`,b=M.has(g),v=s.filter(p=>T(e.key).has(p.larkAppId)).length;if(a+=`<div class="tf-dep-h" data-dk="${d(g)}" style="cursor:pointer;margin:10px 0 2px"><b>${b?"\u25BE":"\u25B8"} ${d(r.name)}</b> <span class="muted" style="font-size:12px">${n("team.depTag",{tag:l})} \xB7 ${n("team.depCount",{count:s.length})}${v?n("team.depSelected",{n:v}):""}</span>${u}</div>`,!!b){a+='<table style="width:100%;border-collapse:collapse;font-size:14px"><tbody>';for(let p of s){let C=d(p.larkAppId),W=T(e.key).has(p.larkAppId)?" checked":"",K=p.deployment.stale?"opacity:.55":"",J=m?`<input class="tf-cap" data-app="${C}" value="${d(p.capability||"")}" placeholder="${n("team.capPh")}" style="width:92%;padding:3px 6px">`:p.capability?d(p.capability):'<span class="muted">\u2014</span>',Q=p.hasTeamRole?m?`<button class="tf-role" data-app="${C}" data-name="${d(p.name)}">${n("team.viewRole")}</button>`:n("team.hasRoleShort"):'<span class="muted">\u2014</span>';a+=`<tr style="${K}"><td style="padding:4px 8px"><input type="checkbox" class="tf-pick" data-tk="${d(e.key)}" data-app="${C}"${W}></td><td style="padding:4px 8px">${d(p.name)}</td><td style="padding:4px 8px" class="muted">${d(p.cliId)}</td><td style="padding:4px 8px">${J}</td><td style="padding:4px 8px">${Q}</td></tr>`}a+="</tbody></table>"}}return a||(a=`<p class="muted" style="margin:8px 0 0">${n("team.noMatch")}</p>`),a+=`<div style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;align-items:center"><input class="tf-gname" data-tk="${d(e.key)}" value="${d(H.get(e.key)||"")}" placeholder="${n("team.gnamePh")}" style="min-width:200px"><button class="tf-grp primary" data-tk="${d(e.key)}">${n("team.pullGroupBtn")}</button><span class="muted" style="font-size:13px">${n("team.pullGroupHint")}</span><span class="tf-gout" data-tk="${d(e.key)}" style="font-size:13px;display:block;flex-basis:100%"></span></div>`,a}function h(){let e=c("tf-teams"),t=B();if(!t.length){e.innerHTML=`<p class="muted">${n("team.noTeams")}</p>`,c("tf-count").textContent="";return}let o="",a=new Set,r=new Set;for(let l of t){let u=l.bots.filter(Z);u.forEach(p=>a.add(p.larkAppId)),l.bots.forEach(p=>r.add(p.larkAppId));let g=new Set(u.map(p=>p.larkAppId));[...T(l.key)].forEach(p=>{g.has(p)||T(l.key).delete(p)});let b=!$.has(l.key),v=l.kind==="remote"?l.ok?` <span class="ok" style="font-size:12px">${n("team.connected")}</span>`:` <span class="err" style="font-size:12px">${n("team.connectFail",{error:d(l.error||"")})}</span>`:` <span class="muted" style="font-size:12px">${n("team.iHost")}</span>`;o+=`<div class="card" style="margin:0 0 12px;padding:12px 14px;background:var(--bg-soft,#f6f7f9)"><div class="tf-team-h" data-tk="${d(l.key)}" style="cursor:pointer;display:flex;align-items:center;gap:8px;flex-wrap:wrap"><b style="font-size:15px">${b?"\u25B8":"\u25BE"} ${d(l.label)}</b>`+(l.sub?` <span class="muted" style="font-size:12px">${d(l.sub)}</span>`:"")+v+` <span class="muted" style="font-size:12px">\xB7 ${n("team.teamMeta",{deps:l.deployments.length,bots:l.bots.length})}</span></div>`,b||(o+=l.kind==="remote"&&!l.ok?`<p class="muted" style="margin:8px 0 0">${n("team.rosterFail")}</p>`:ee(l,u)),o+="</div>"}e.innerHTML=o;let s=t.length>1?n("team.acrossTeams",{n:t.length}):"",m=a.size===r.size?`${r.size}`:`${a.size} / ${r.size}`;c("tf-count").textContent=`\xB7 ${m} ${n("team.botsWord")}${s}`,te(y)}function te(e=y){let t=c("tf-teams");t.querySelectorAll(".tf-team-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.tk;$.has(a)?$.delete(a):$.add(a),h()}}),t.querySelectorAll(".tf-dep-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.dk;M.has(a)?M.delete(a):M.add(a),h()}}),t.querySelectorAll(".tf-pick").forEach(o=>{o.onchange=()=>{let a=T(o.dataset.tk);o.checked?a.add(o.dataset.app):a.delete(o.dataset.app)}}),t.querySelectorAll(".tf-gname").forEach(o=>{o.oninput=()=>{H.set(o.dataset.tk,o.value)}}),t.querySelectorAll(".tf-cap").forEach(o=>{o.onchange=async()=>{let a=o.dataset.app,r=o.value;await X("/api/team/local-bots/"+encodeURIComponent(a)+"/capability",{capability:r}),f(e)&&B().forEach(s=>{let m=s.bots.find(l=>l.larkAppId===a);m&&(m.capability=r.trim()||null)})}}),t.querySelectorAll(".tf-role").forEach(o=>{o.onclick=()=>ne(o.dataset.app,o.dataset.name||"",e)}),t.querySelectorAll(".tf-rmmember").forEach(o=>{o.onclick=async a=>{a.stopPropagation(),confirm(n("team.removeMemberConfirm",{name:o.dataset.name||""}))&&(await S("DELETE",`/api/team/hosted/${encodeURIComponent(o.dataset.team)}/members/${encodeURIComponent(o.dataset.dep)}`),f(e)&&L(e))}}),t.querySelectorAll(".tf-grp").forEach(o=>{o.onclick=async()=>{let a=o.dataset.tk,r=Y(a);if(!r)return;let s=[...T(a)],m=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);if(!s.length){m.innerHTML=`<span class="err">${n("team.errPickBot")}</span>`;return}let l=(t.querySelector(`.tf-gname[data-tk="${CSS.escape(a)}"]`)?.value||"").trim()||n("team.defaultGroupName");m.innerHTML=`<span class="muted">${n("team.creatingGroup")}</span>`;let u=r.kind==="local"?await x("/api/team/federated-group",{name:l,larkAppIds:s,teamId:r.teamId}):await x("/api/team/remote-group",{hubUrl:r.hubUrl,teamId:r.teamId,name:l,larkAppIds:s});if(f(e)&&(ae(m,u.body,u.status),u.body?.ok)){T(a).clear(),H.delete(a);let g=m.innerHTML,b=()=>{if(!f(e))return;let v=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);v&&(v.innerHTML=g)};r.kind==="local"?L(e).then(b):(h(),b())}}})}function ae(e,t,o){if(t?.ok&&t.chatId){let a=t.shareLink||"https://applink.feishu.cn/client/chat/open?openChatId="+encodeURIComponent(t.chatId),r=(t.invalidBotIds||[]).length?` <span class="err"> \xB7 ${n("team.invalidBots",{ids:d((t.invalidBotIds||[]).join(", "))})}</span>`:"",s=(t.invalidOwnerUnionIds||[]).length?`<span class="err"> \xB7 ${n("team.invalidOwners",{n:(t.invalidOwnerUnionIds||[]).length})}</span>`:"",m=t.missingOperatorIdentity?`<span class="err"> \xB7 ${n("team.missingIdentity")}</span>`:"",l=(t.skippedNoOwner||[]).length?`<span class="err"> \xB7 ${n("team.skippedNoOwner",{n:(t.skippedNoOwner||[]).length})}</span>`:"",u=t.delegatedTo?n("team.delegatedBy",{name:d(t.delegatedTo)}):"";e.innerHTML=`<span class="ok">${n("team.groupCreated")}</span>${u} \xB7 <a href="${d(a)}" target="_blank">${n("team.openInLark")}</a>${r}${s}${m}${l}`}else{let a=t?.error||o,r=a==="no_local_online_bot"?n("team.errNoLocalBot"):a==="all_bots_skipped_no_owner"?n("team.errAllSkipped"):a==="no_creator_available"?n("team.errNoCreator"):a==="delegation_timeout"?n("team.errDelegationTimeout"):n("team.errGroupCreate",{error:String(a)});e.innerHTML=`<span class="err">${d(String(r))}</span>`}}async function ne(e,t,o=y){let a=await E("/api/team/local-bots/"+encodeURIComponent(e)+"/role");f(o)&&(c("tf-modal-title").textContent=n("team.roleModalTitleName",{name:t}),c("tf-modal-text").value=a.body?.role||"",c("tf-modal").dataset.app=e,c("tf-modal").style.display="flex")}function D(){let e=Array.from(new Set(B().flatMap(a=>a.bots.map(r=>r.cliId)).filter(Boolean))).sort(),t=c("tf-cli"),o=t.value;t.innerHTML=`<option value="">${n("team.allCli")}</option>`+e.map(a=>`<option value="${d(a)}">${d(a)}</option>`).join(""),t.value=o}async function L(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body;if(!o?.ok){z=[],h();return}q=o.deployment.deploymentId,I=o.suggestedHubUrl||"",c("tf-owner").textContent=o.deployment.ownerName||(o.deployment.ownerUnionId?n("team.bound"):n("team.unbound")),z=(o.teams||[]).map(a=>({kind:"local",key:`local:${a.teamId}`,teamId:a.teamId,label:a.isDefault?n("team.myHostedTeam"):a.name,sub:"",ok:!0,deployments:a.deployments||[],bots:a.bots||[]})),D(),h()}async function oe(e=y){let t=await E("/api/team/remote-roster");if(!f(e))return;U=(t.body?.memberships||[]).map(a=>{let r=a.roster?.deployments||[],s=r.find(l=>l.local),m=s?.name?n("team.remoteTeamLabel",{name:s.name}):a.teamName||a.teamId;return{kind:"remote",key:`${a.hubUrl}::${a.teamId}`,teamId:a.teamId,label:m,sub:a.hubUrl,ok:!!a.ok,error:a.error,hubUrl:a.hubUrl,deployments:r,bots:a.roster?.bots||[]}}),D(),h()}function O(e){let t=_(),o=[],a=(r,s,m)=>{r&&(r.addEventListener(s,m),o.push(()=>r.removeEventListener(s,m)))};return A.clear(),H.clear(),$.clear(),M.clear(),["tf-search","tf-cli","tf-fcap","tf-frole"].forEach(r=>{let s=document.getElementById(r);a(s,"input",()=>{f(t)&&h()}),a(s,"change",()=>{f(t)&&h()})}),a(document.getElementById("tf-modal-cancel"),"click",()=>{f(t)&&(c("tf-modal").style.display="none")}),se(t),L(t),oe(t),()=>{f(t)&&(y+=1);for(let s of o.splice(0))s();let r=e.querySelector("#tf-modal");r&&(r.style.display="none")}}async function j(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body,a=c("tm-list");I=o?.suggestedHubUrl||I;let r=o?.teams||[];if(!r.length){a.innerHTML=`<p class="muted">${n("team.noTeamsShort")}</p>`;return}a.innerHTML=r.map(s=>{let m=(s.deployments||[]).filter(l=>!l.local).length;return`<div class="card" style="margin:0 0 8px;padding:10px 14px;background:var(--bg-soft,#f6f7f9)">
|
|
2
|
+
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap">
|
|
3
|
+
<b>${d(s.name)}</b>${s.isDefault?` <span class="muted" style="font-size:12px">${n("team.default")}</span>`:""}
|
|
4
|
+
<span class="muted" style="font-size:12px">\xB7 ${n("team.manageMetaDeps",{count:(s.deployments||[]).length})}${m?n("team.manageMetaRemote",{r:m}):""} \xB7 ${n("team.manageMetaBots",{count:(s.bots||[]).length})}</span>
|
|
5
|
+
<span style="margin-left:auto;display:flex;gap:6px">
|
|
6
|
+
<button class="tm-invite ghost" data-team="${d(s.teamId)}" style="font-size:12px">${n("team.genInvite")}</button>
|
|
7
|
+
${s.isDefault?"":`<button class="tm-del ghost" data-team="${d(s.teamId)}" data-name="${d(s.name)}" style="font-size:12px">${n("team.delBtn")}</button>`}
|
|
8
|
+
</span>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="tm-inv-out" data-team="${d(s.teamId)}" style="display:none;margin-top:6px;font-size:13px"></div></div>`}).join(""),a.querySelectorAll(".tm-invite").forEach(s=>{s.onclick=async()=>{let m=s.dataset.team,l=a.querySelector(`.tm-inv-out[data-team="${CSS.escape(m)}"]`);l.style.display="",l.innerHTML=`<span class="muted">${n("team.generating")}</span>`;let u=await x("/api/team/local-invite",{teamId:m});f(e)&&(u.body?.code?l.innerHTML=`${n("team.inviteResultLede")}<br>${n("team.inviteHub")}<code>${d(I)}</code><br>${n("team.inviteCode")}<code style="font-size:15px">${d(u.body.code)}</code>`:l.innerHTML=`<span class="err">${n("team.genFail")}</span>`)}}),a.querySelectorAll(".tm-del").forEach(s=>{s.onclick=async()=>{confirm(n("team.delConfirm",{name:s.dataset.name||""}))&&(await S("DELETE","/api/team/hosted/"+encodeURIComponent(s.dataset.team)),f(e)&&j(e))}})}function G(e){let t=_(),o=[],a=(r,s,m)=>{r&&(r.addEventListener(s,m),o.push(()=>r.removeEventListener(s,m)))};return a(document.getElementById("tm-create"),"click",async()=>{let r=c("tm-newname").value.trim(),s=e.querySelector(".tm-cout");if(!r){s.innerHTML=`<span class="err">${n("team.errName")}</span>`;return}s.innerHTML=`<span class="muted">${n("team.creating")}</span>`;let m=await x("/api/team/hosted",{name:r});f(t)&&(m.body?.ok?(s.innerHTML=`<span class="ok">${n("team.created")}</span>`,c("tm-newname").value="",j(t)):s.innerHTML=`<span class="err">${n("team.createFail",{error:d(String(m.body?.error||m.status))})}</span>`)}),a(document.getElementById("tm-join"),"click",async()=>{let r=c("tm-hub").value.trim(),s=c("tm-code").value.trim(),m=c("tm-join-out");if(m.style.display="",!r||!s){m.innerHTML=`<span class="err">${n("team.errHubCode")}</span>`;return}m.innerHTML=`<span class="muted">${n("team.joining")}</span>`;let l=await x("/api/team/join-remote",{hubUrl:r,inviteCode:s});if(f(t))if(l.body?.ok)m.innerHTML=`<span class="ok">${n("team.joined",{name:d(l.body.teamName||"")})}</span>`,c("tm-code").value="";else{let u=l.body?.error||l.status,g=u==="cannot_join_self"?n("team.joinErrSelf"):u==="deployment_already_joined"?n("team.joinErrAlready"):u==="hub_unreachable"?n("team.joinErrUnreachable"):u==="hub_timeout"?n("team.joinErrTimeout"):n("team.joinErrGeneric",{error:String(u)});m.innerHTML=`<span class="err">${d(String(g))}</span>`}}),j(t),()=>{f(t)&&(y+=1);for(let r of o.splice(0))r()}}function se(e=y){c("tf-autobind").onclick=async()=>{let t=c("tf-bind-out");t.style.display="",t.innerHTML=`<span class="muted">${n("team.identifying")}</span>`;let o=await x("/api/team/identity/auto-bind");if(!f(e))return;let a=o.body;if(a?.ok&&a.owner){t.innerHTML=`<span class="ok">${n("team.bound2",{name:d(a.owner.name||a.owner.unionId)})}</span>`,L(e);return}if(a?.ok&&a.needChoice&&Array.isArray(a.candidates)){let r=a.candidates.map(s=>`<button class="tf-pickowner ghost" data-union="${d(s.unionId)}" style="margin:2px">${d(s.name||s.unionId)}</button>`).join(" ");t.innerHTML=`${n("team.multiCandidate")}<br>${r}`,t.querySelectorAll(".tf-pickowner").forEach(s=>{s.onclick=async()=>{t.innerHTML=`<span class="muted">${n("team.binding")}</span>`;let m=await x("/api/team/identity/auto-bind",{unionId:s.dataset.union});if(!f(e))return;let l=m.body;l?.ok&&l.owner?(t.innerHTML=`<span class="ok">${n("team.bound2",{name:d(l.owner.name||l.owner.unionId)})}</span>`,L(e)):t.innerHTML=`<span class="err">${n("team.bindFail",{error:d(String(l?.error||"unknown"))})}</span>`}});return}if(a?.error==="no_candidates"){t.innerHTML=`<span class="err">${n("team.noCandidates")}</span>`;return}t.innerHTML=`<span class="err">${n("team.bindFail",{error:d(String(a?.error||"unknown"))})}</span>`}}var i=N(P(),1);function F(e){let t=w(),o=a=>({padding:"6px 14px",borderRadius:"8px",textDecoration:"none",fontSize:"14px",fontWeight:600,background:a?"var(--accent)":"var(--surface-muted)",color:a?"var(--on-accent)":"var(--muted)"});return(0,i.jsxs)("div",{style:{display:"flex",gap:"8px",marginBottom:"14px"},children:[(0,i.jsx)("a",{href:"#/team",style:o(e.active==="home"),children:t("team.navHome")}),(0,i.jsx)("a",{href:"#/team/manage",style:o(e.active==="manage"),children:t("team.navManage")})]})}function ie(){let e=w(),t=(0,k.useRef)(null);return(0,k.useEffect)(()=>{if(t.current)return O(t.current)},[]),(0,i.jsxs)("section",{className:"page",ref:t,children:[(0,i.jsx)("div",{className:"page-heading",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("p",{className:"eyebrow",children:e("team.eyebrow")}),(0,i.jsx)("h1",{children:e("team.homeTitle")}),(0,i.jsx)("p",{className:"tf-lede",children:e("team.homeLede")})]})}),(0,i.jsx)(F,{active:"home"}),(0,i.jsxs)("div",{className:"card",style:{marginBottom:"16px"},children:[(0,i.jsx)("h2",{style:{marginTop:0},children:e("team.localDeployTitle")}),(0,i.jsxs)("p",{children:[e("team.myIdentity"),(0,i.jsx)("b",{id:"tf-owner",children:e("team.unbound")}),(0,i.jsx)("button",{type:"button",id:"tf-autobind",className:"primary",style:{marginLeft:"8px"},children:e("team.bindBtn")}),(0,i.jsx)("span",{className:"muted",style:{fontSize:"13px"},children:e("team.bindHint")})]}),(0,i.jsx)("div",{id:"tf-bind-out",style:{display:"none",marginTop:"6px"}})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsxs)("h2",{style:{marginTop:0},children:[e("team.myTeams")," ",(0,i.jsx)("span",{className:"muted",id:"tf-count",style:{fontSize:"13px"}})]}),(0,i.jsxs)("div",{style:{display:"flex",gap:"8px",alignItems:"center",flexWrap:"wrap",marginBottom:"8px",fontSize:"13px"},children:[(0,i.jsx)("input",{id:"tf-search",placeholder:e("team.searchPh"),style:{padding:"5px 9px",minWidth:"180px"}}),(0,i.jsx)("select",{id:"tf-cli",style:{padding:"5px"},children:(0,i.jsx)("option",{value:"",children:e("team.allCli")})}),(0,i.jsxs)("label",{children:[(0,i.jsx)("input",{type:"checkbox",id:"tf-fcap"})," ",e("team.hasCap")]}),(0,i.jsxs)("label",{children:[(0,i.jsx)("input",{type:"checkbox",id:"tf-frole"})," ",e("team.hasRole")]})]}),(0,i.jsx)("p",{className:"muted",style:{fontSize:"13px",margin:"0 0 4px"},children:e("team.teamsHint")}),(0,i.jsx)("div",{id:"tf-teams",children:e("team.loading")})]}),(0,i.jsx)("div",{id:"tf-modal",style:{display:"none",position:"fixed",inset:0,background:"rgba(0,0,0,.5)",alignItems:"center",justifyContent:"center",zIndex:50},children:(0,i.jsxs)("div",{style:{background:"var(--surface)",color:"var(--fg)",border:"1px solid var(--border)",borderRadius:"10px",padding:"18px 20px",width:"min(560px,92vw)"},children:[(0,i.jsx)("h2",{id:"tf-modal-title",style:{marginTop:0},children:e("team.roleModalTitle")}),(0,i.jsx)("p",{className:"muted",style:{fontSize:"13px"},children:e("team.roleModalHint")}),(0,i.jsx)("textarea",{id:"tf-modal-text",readOnly:!0,style:{width:"100%",minHeight:"200px",font:"13px/1.5 ui-monospace,Menlo,monospace",padding:"10px",boxSizing:"border-box"}}),(0,i.jsx)("div",{style:{display:"flex",justifyContent:"flex-end",gap:"8px",marginTop:"12px"},children:(0,i.jsx)("button",{type:"button",id:"tf-modal-cancel",children:e("team.close")})})]})})]})}function re(){let e=w(),t=(0,k.useRef)(null);return(0,k.useEffect)(()=>{if(t.current)return G(t.current)},[]),(0,i.jsxs)("section",{className:"page",ref:t,children:[(0,i.jsx)("div",{className:"page-heading",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("p",{className:"eyebrow",children:e("team.eyebrow")}),(0,i.jsx)("h1",{children:e("team.manageTitle")}),(0,i.jsx)("p",{className:"tf-lede",children:e("team.manageLede")})]})}),(0,i.jsx)(F,{active:"manage"}),(0,i.jsxs)("div",{className:"card",style:{marginBottom:"16px"},children:[(0,i.jsx)("h2",{style:{marginTop:0},children:e("team.hostedTitle")}),(0,i.jsxs)("p",{style:{display:"flex",gap:"8px",flexWrap:"wrap",alignItems:"center",marginBottom:"6px"},children:[(0,i.jsx)("input",{id:"tm-newname",placeholder:e("team.newTeamPh"),style:{minWidth:"200px"}}),(0,i.jsx)("button",{type:"button",id:"tm-create",className:"primary",children:e("team.createTeamBtn")}),(0,i.jsx)("span",{className:"muted tm-cout",style:{fontSize:"13px"}})]}),(0,i.jsx)("div",{id:"tm-list",children:e("team.loading")})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("h2",{style:{marginTop:0},children:e("team.joinTitle")}),(0,i.jsxs)("p",{style:{display:"flex",gap:"8px",flexWrap:"wrap",alignItems:"center"},children:[(0,i.jsx)("input",{id:"tm-hub",placeholder:e("team.hubPh"),style:{flex:1,minWidth:"240px"}}),(0,i.jsx)("input",{id:"tm-code",placeholder:e("team.codePh"),style:{minWidth:"160px"}}),(0,i.jsx)("button",{type:"button",id:"tm-join",className:"primary",children:e("team.joinBtn")})]}),(0,i.jsx)("div",{id:"tm-join-out",style:{display:"none",marginTop:"6px"}})]})]})}function ue(e){return R(e,(0,i.jsx)(ie,{}))}function fe(e){return R(e,(0,i.jsx)(re,{}))}export{ue as renderTeamFederationPage,fe as renderTeamManagePage};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import{a as xt,b as st,c as rt}from"./chunk-JTSE5VP6.js";import{c as G}from"./chunk-7SZRL6FY.js";var _=G(xt(),1);function ot(e,n,d){e.setAttribute("data-run-id",n),e.setAttribute("data-node-id",d.id);let l=d.webTerminal;if(l?.status==="live"&&l.webPort&&l.webPort>0){bt(e,l.webPort);return}if(d.hasPtyLog){yt(e,n,d.id,l?.status==="closed");return}Lt(e,l?.status==="live"?"\u7EC8\u7AEF\u6B63\u5728\u542F\u52A8\uFF0C\u7A0D\u540E\u5237\u65B0":"\u6682\u65E0\u7EC8\u7AEF\u8BB0\u5F55")}function bt(e,n){let d=Tt(n);e.innerHTML=`<div class="v3-terminal-panel">
|
|
2
|
+
<div class="v3-terminal-head">
|
|
3
|
+
<span class="v3-terminal-dot live"></span>
|
|
4
|
+
<span>\u5B9E\u65F6\u7EC8\u7AEF\uFF08\u53EA\u8BFB\uFF09</span>
|
|
5
|
+
<span class="muted">:${n}</span>
|
|
6
|
+
<a class="btn-link" href="${W(d)}" target="_blank" rel="noopener">\u65B0\u7A97\u53E3\u6253\u5F00</a>
|
|
7
|
+
</div>
|
|
8
|
+
<iframe class="wf-terminal-frame v3-terminal-frame" src="${W(d)}" title="v3 live terminal" loading="lazy"></iframe>
|
|
9
|
+
</div>`}function yt(e,n,d,l){let b=`/api/v3/runs/${encodeURIComponent(n)}/nodes/${encodeURIComponent(d)}/pty-log`,c=Mt(b,`${n} / ${d}`);e.innerHTML=`<div class="v3-terminal-panel">
|
|
10
|
+
<div class="v3-terminal-head">
|
|
11
|
+
<span class="v3-terminal-dot ${l?"closed":"replay"}"></span>
|
|
12
|
+
<span>${l?"\u7EC8\u7AEF\u56DE\u653E":"\u7EC8\u7AEF\u8BB0\u5F55"}</span>
|
|
13
|
+
<span class="muted">PTY log</span>
|
|
14
|
+
<a class="btn-link" href="${W(b)}" target="_blank" rel="noopener">\u4E0B\u8F7D/\u6253\u5F00\u539F\u59CB\u65E5\u5FD7</a>
|
|
15
|
+
</div>
|
|
16
|
+
<iframe class="wf-terminal-frame v3-terminal-frame" srcdoc="${W(c)}" title="v3 terminal replay" loading="lazy"></iframe>
|
|
17
|
+
</div>`}function Lt(e,n){e.innerHTML=`<div class="v3-terminal-empty muted">${Y(n)}</div>`}function Tt(e){return`http://${window.location.hostname||"127.0.0.1"}:${e}/`}function Mt(e,n){let d=JSON.stringify(e);return`<!doctype html>
|
|
18
|
+
<html>
|
|
19
|
+
<head>
|
|
20
|
+
<meta charset="utf-8">
|
|
21
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.css">
|
|
22
|
+
<style>
|
|
23
|
+
html,body{margin:0;height:100%;background:#0d1117;color:#c9d1d9;font:12px ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
24
|
+
#bar{height:31px;display:flex;align-items:center;gap:10px;padding:0 10px;background:#161b22;border-bottom:1px solid #30363d;box-sizing:border-box}
|
|
25
|
+
#status{margin-left:auto;color:#8b949e;white-space:nowrap}
|
|
26
|
+
#term{height:calc(100% - 31px);padding:4px;box-sizing:border-box;overflow:auto}
|
|
27
|
+
a{color:#58a6ff;text-decoration:none}
|
|
28
|
+
</style>
|
|
29
|
+
</head>
|
|
30
|
+
<body>
|
|
31
|
+
<div id="bar"><span>${Y(n)}</span><span id="status">loading...</span></div>
|
|
32
|
+
<div id="term"></div>
|
|
33
|
+
<script src="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/lib/xterm.js"><\/script>
|
|
34
|
+
<script src="https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0.10.0/lib/addon-fit.js"><\/script>
|
|
35
|
+
<script>
|
|
36
|
+
(function(){
|
|
37
|
+
var endpoint=${d};
|
|
38
|
+
// v3 ephemeral workers spawn their PTY at DEFAULT_RENDER_COLS (=160, see
|
|
39
|
+
// worker.ts) and never adopt, so the captured stream's TUI / box-drawing
|
|
40
|
+
// is exactly 160 cols wide. Fitting it into a narrower (or oddly-measured)
|
|
41
|
+
// grid re-wraps those fixed-width lines into a stair-stepped mess and
|
|
42
|
+
// wastes the panel. So we render at the capture width and let FitAddon
|
|
43
|
+
// only size the ROW count to the iframe height (cols pinned back to 160).
|
|
44
|
+
var COLS=160;
|
|
45
|
+
var status=document.getElementById('status');
|
|
46
|
+
var termEl=document.getElementById('term');
|
|
47
|
+
if(!window.Terminal){status.textContent='xterm.js failed to load';return;}
|
|
48
|
+
var term=new Terminal({
|
|
49
|
+
cols:COLS,
|
|
50
|
+
convertEol:false,
|
|
51
|
+
scrollback:100000,
|
|
52
|
+
fontSize:13,
|
|
53
|
+
disableStdin:true,
|
|
54
|
+
theme:{background:'#0d1117',foreground:'#c9d1d9',cursor:'#c9d1d9'}
|
|
55
|
+
});
|
|
56
|
+
var fit=null;
|
|
57
|
+
if(window.FitAddon){fit=new window.FitAddon.FitAddon();term.loadAddon(fit);}
|
|
58
|
+
term.open(termEl);
|
|
59
|
+
function doFit(){
|
|
60
|
+
try{if(fit)fit.fit()}catch(_){}
|
|
61
|
+
if(term.cols!==COLS)term.resize(COLS,term.rows||24);
|
|
62
|
+
}
|
|
63
|
+
doFit(); window.addEventListener('resize',doFit);
|
|
64
|
+
fetch(endpoint,{credentials:'include'}).then(function(res){
|
|
65
|
+
if(!res.ok){
|
|
66
|
+
if(res.status===401){status.textContent='\u9700\u8981\u767B\u5F55 dashboard \u540E\u67E5\u770B\u56DE\u653E';}
|
|
67
|
+
else if(res.status===404){status.textContent='\u6CA1\u6709 PTY \u65E5\u5FD7';}
|
|
68
|
+
else{status.textContent='\u52A0\u8F7D\u5931\u8D25 HTTP '+res.status;}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
var total=Number(res.headers.get('x-botmux-log-bytes')||0);
|
|
72
|
+
var served=Number(res.headers.get('x-botmux-served-bytes')||0);
|
|
73
|
+
var truncated=res.headers.get('x-botmux-truncated')==='1';
|
|
74
|
+
status.textContent=truncated
|
|
75
|
+
? 'showing tail '+formatBytes(served)+' / '+formatBytes(total)
|
|
76
|
+
: 'loaded '+formatBytes(total);
|
|
77
|
+
return res.arrayBuffer();
|
|
78
|
+
}).then(function(buf){
|
|
79
|
+
if(!buf)return;
|
|
80
|
+
term.write(new TextDecoder().decode(buf));
|
|
81
|
+
setTimeout(doFit,0);
|
|
82
|
+
}).catch(function(err){
|
|
83
|
+
status.textContent='\u52A0\u8F7D\u5931\u8D25: '+(err&&err.message?err.message:String(err));
|
|
84
|
+
});
|
|
85
|
+
function formatBytes(n){
|
|
86
|
+
if(!Number.isFinite(n)||n<=0)return '0 B';
|
|
87
|
+
var u=['B','KiB','MiB','GiB'];var i=0;
|
|
88
|
+
while(n>=1024&&i<u.length-1){n/=1024;i++;}
|
|
89
|
+
return (i===0?String(n):n.toFixed(1))+' '+u[i];
|
|
90
|
+
}
|
|
91
|
+
})();
|
|
92
|
+
<\/script>
|
|
93
|
+
</body>
|
|
94
|
+
</html>`}function Y(e){return e.replace(/[&<>"']/g,n=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[n])}function W(e){return Y(e).replace(/`/g,"`")}function it(e,n){let d=n?`?${n}`:"";return`#/legacy-workflow/${encodeURIComponent(e)}${d}`}var ct=2e3;function at(e){return e==="succeeded"||e==="failed"}var D={pending:"\u5F85\u673A",gateWaiting:"\u7B49\u5BA1\u6279",running:"\u8FD0\u884C\u4E2D",done:"\u5B8C\u6210",skipped:"\u5DF2\u8DF3\u8FC7",cancelled:"\u5DF2\u53D6\u6D88",blocked:"\u53D7\u963B",superseded:"\u5DF2\u5237\u65B0",failed:"\u5931\u8D25"},kt={exit:"\u2713 \u901A\u8FC7",continue:"\u21BB \u7EE7\u7EED\u8FD4\u5DE5",exhausted:"\u26D4 \u8F6E\u6570\u8017\u5C3D"};function h(e){return e.replace(/[&<>"']/g,n=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[n])}function Nt(e){let n=e.webTerminal;return`${n?.status??"-"}|${n?.webPort??"-"}|${e.hasPtyLog?"1":"0"}`}function Z(e=location.hash){let n=e.match(/^#\/workflows\/([^?#]+)/);return n?decodeURIComponent(n[1]):null}function ut(e){let n=Z();return n?Ht(e,n):Rt(e)}function Rt(e){let n=e.querySelector("#v3-tbody"),d=e.querySelector("#v3-empty"),l=null,b=!1;async function c(){if(!(b||document.hidden))try{let H=await fetch("/api/v3/runs");if(b)return;let R=H.ok?await H.json():{runs:[]};if(b)return;let M=R.runs??[];d.hidden=M.length>0,n.innerHTML=M.map(S=>`<tr>
|
|
95
|
+
<td><a class="v3r-runid" href="#/workflows/${encodeURIComponent(S.runId)}">${h(S.runId)}</a></td>
|
|
96
|
+
<td><span class="v3r-pill rs-${h(S.runStatus)}">${h(S.runStatus)}</span></td>
|
|
97
|
+
<td>${S.nodeCount}</td>
|
|
98
|
+
</tr>`).join("")}catch{}}function T(){b||c().then(()=>{b||(l=window.setTimeout(T,ct))})}return T(),()=>{b=!0,l!==null&&window.clearTimeout(l)}}var O=168,K=48,z=70,lt=226,dt=30,q=26,St=8;function X(e){return e.isLoop?z:K}function Ht(e,n){let d=e.querySelector("#v3-graph"),l=e.querySelector("#v3-node-panel"),b=e.querySelector("#v3-runstatus"),c=null,T=!1,H=!1,R=null,M=null,S=null,I=null,A=null,B=!1;function pt(t){R=t,A=null,B=!1,M&&Q(M),U()}function mt(t){A=t,B=!0,U()}function ft(t){if(B&&A){let a=t.find($=>$.id===A);if(a)return a}let s=t.filter(a=>a.status==="running");return s[s.length-1]??t[t.length-1]??null}function vt(t,s,a){let f=new Map,k=v=>{if(f.has(v))return f.get(v);f.set(v,0);let p=t.find(N=>N.id===v)?.depends.filter(N=>t.some(V=>V.id===N))??[],g=p.length?1+Math.max(...p.map(k)):0;return f.set(v,g),g},i=new Map,r=new Map,u=0;for(let v of t){let p=k(v.id),g=i.get(p)??0;i.set(p,g+1),u=Math.max(u,g),r.set(v.id,{x:6+p*138,y:6+g*42})}let x=12+(f.size?Math.max(...f.values())*138+104:0),E=12+u*42+30,C=[];for(let v of t){let p=r.get(v.id);for(let g of v.depends){let N=r.get(g);if(!N)continue;let V=N.x+104,j=N.y+30/2,F=p.x,et=p.y+30/2,nt=(V+F)/2,wt=s.get(v.id)?.status==="running"?" live":"";C.push(`<path class="v3r-edge${wt}" d="M${V},${j} C${nt},${j} ${nt},${et} ${F},${et}" marker-end="url(#v3arrow-mini)"/>`)}}let P=t.map(v=>{let p=r.get(v.id),g=s.get(v.id),N=g?.status??"pending",V=g?"":" ghost",j=g&&g.id===a?" sel":"",F=g?` data-sel="${h(g.id)}"`:"";return`<g class="v3r-node v3r-mini st-${N}${j}${V}"${F}${g?' style="cursor:pointer"':""}>
|
|
99
|
+
<rect class="v3r-box" x="${p.x}" y="${p.y}" width="104" height="30" rx="8"/>
|
|
100
|
+
<circle class="v3r-mini-dot" cx="${p.x+13}" cy="${p.y+30/2}" r="3.4"/>
|
|
101
|
+
<text class="v3r-nid" x="${p.x+24}" y="${p.y+30/2+4}">${h(J(v.id,12))}</text>
|
|
102
|
+
</g>`});return`<svg class="v3r-mini-svg" width="${x}" height="${E}" viewBox="0 0 ${x} ${E}">
|
|
103
|
+
<defs><marker id="v3arrow-mini" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
|
|
104
|
+
<path d="M0,0 L10,5 L0,10 z" fill="var(--faint, #8b98aa)"/></marker></defs>
|
|
105
|
+
${C.join("")}${P.join("")}
|
|
106
|
+
</svg>`}function gt(t,s){let a=t.loopState;if(!a)return'<p class="muted">loop \u672A\u5F00\u59CB</p>';let $=a.maxIterations,m=$!==void 0?$+a.granted:void 0,L=new Map(a.decisions.map(r=>[r.iteration,r.decision])),y=(M?.nodes??[]).filter(r=>r.loop?.loopId===t.id),w=new Map;for(let r of y){let u=r.loop.iteration;(w.get(u)??w.set(u,[]).get(u)).push(r)}let f=[...w.entries()].sort((r,u)=>r[0]-u[0]).map(([r,u])=>{let x=L.get(r),E=r===a.iteration,C=$!==void 0&&r>$,P=x?`<span class="v3r-verdict vd-${x}">${kt[x]}</span>`:E&&t.status==="running"?'<span class="v3r-verdict vd-live">\u25B6 \u8FDB\u884C\u4E2D</span>':"",v=new Map(u.map(p=>[p.loop.bodyNodeId,p]));return`<div class="v3r-round${E?" cur":""}${x?` vd-${x}`:""}">
|
|
107
|
+
<div class="v3r-round-head">
|
|
108
|
+
<span class="rn">R${r}</span>
|
|
109
|
+
${C?'<span class="v3r-granted-tag">\u2795 \u8FFD\u52A0\u8F6E</span>':""}
|
|
110
|
+
${P}
|
|
111
|
+
</div>
|
|
112
|
+
${vt(a.bodyTemplate,v,s)}
|
|
113
|
+
</div>`}).join(""),k=`<div class="v3r-loop-meter">
|
|
114
|
+
<span class="num">\u7B2C <b>${a.iteration}</b>${m!==void 0?` / <b>${m}</b>`:""} \u8F6E</span>
|
|
115
|
+
${a.granted>0?`<span class="v3r-granted-tag">\u542B\u4EBA\u5DE5\u8FFD\u52A0 +${a.granted}</span>`:""}
|
|
116
|
+
${a.lastDecision==="exit"?'<span class="v3r-verdict vd-exit">\u2713 \u5DF2\u6536\u655B</span>':""}
|
|
117
|
+
</div>`,i=t.status==="blocked"?`<div class="v3r-cta">\u26A0 \u8F6E\u6570\u8017\u5C3D\uFF0C\u7B49\u4EBA\u8FFD\u52A0 \u2014 \u98DE\u4E66\u5361\u7247\u70B9\u300C\u2795 \u8FFD\u52A0 1 \u8F6E\u300D\uFF0C\u6216 <code>botmux workflow grant ${h(n)}</code></div>`:"";return`<div class="v3r-loop-sec">${k}<div class="v3r-rounds">${f}</div>${i}</div>`}function U(){let t=M?.nodes.find(w=>w.id===R)??null;if(!t){l.innerHTML='<p class="muted">\u70B9\u4E00\u4E2A\u8282\u70B9\u770B\u8BE6\u60C5\u4E0E\u7EC8\u7AEF</p>',S=null,I=null;return}S!==t.id&&(l.innerHTML=`
|
|
118
|
+
<div id="v3-node-meta"></div>
|
|
119
|
+
<div id="v3-inst-strip"></div>
|
|
120
|
+
<div id="v3-term-slot" class="v3r-term-slot"></div>`,S=t.id,I=null);let s=t,a=null;if(t.isLoop){let w=(M?.nodes??[]).filter(k=>k.loop?.loopId===t.id),f=ft(w);s=f,a=f?.id??null,A=a}let $=`<div class="v3r-panel-head">
|
|
121
|
+
${t.isLoop?'<span class="v3r-loop-mark">\u27F3</span>':""}
|
|
122
|
+
<span class="v3r-nodeid">${h(t.id)}</span>
|
|
123
|
+
<span class="v3r-pill st-${t.status}"><i class="dot"></i>${D[t.status]}</span>
|
|
124
|
+
</div>`,m=t.errorClass?`<p class="v3r-err">\u539F\u56E0\uFF1A${h(t.errorClass)}${t.errorCode?` (${h(t.errorCode)})`:""}${t.status==="blocked"&&!t.isLoop?" \u2014 \u98DE\u4E66\u5361\u7247\u6216 <code>botmux workflow retry</code> \u53EF\u91CD\u8BD5":""}</p>`:"";l.querySelector("#v3-node-meta").innerHTML=`
|
|
125
|
+
${$}
|
|
126
|
+
${t.goal?`<p class="v3r-goal">${h(t.goal)}</p>`:""}
|
|
127
|
+
${t.depends.length?`<p class="v3r-deps">\u4F9D\u8D56 ${t.depends.map(w=>`<span class="v3r-dep">${h(w)}</span>`).join("")}</p>`:""}
|
|
128
|
+
${m}${t.isLoop?gt(t,a):""}`,l.querySelector("#v3-inst-strip").innerHTML=t.isLoop&&s?`<div class="v3r-inst-strip">
|
|
129
|
+
<span class="lbl">\u5B9E\u4F8B\u7EC8\u7AEF</span>
|
|
130
|
+
<span class="v3r-nodeid sm">${h(s.id)}</span>
|
|
131
|
+
<span class="v3r-pill st-${s.status}"><i class="dot"></i>${D[s.status]}</span>
|
|
132
|
+
<span class="muted">\u7B2C ${s.loop.iteration} \u8F6E \xB7 ${h(s.loop.bodyNodeId)}${B?"":" \xB7 \u81EA\u52A8\u8DDF\u968F"}</span>
|
|
133
|
+
</div>`:"";for(let w of l.querySelectorAll("#v3-node-meta [data-sel]"))w.addEventListener("click",f=>{f.stopPropagation(),mt(w.getAttribute("data-sel"))});let L=l.querySelector("#v3-term-slot");if(!s){L.innerHTML="",I=null;return}let y=`${s.id}|${Nt(s)}`;y!==I&&(ot(L,n,s),I=y)}function ht(t,s,a,$){let m=t.loopState,L=m?.maxIterations,y=m&&L!==void 0?L+m.granted:void 0,w=m?`${D[t.status]} \xB7 \u7B2C${m.iteration}${y!==void 0?`/${y}`:""}\u8F6E`:`${D[t.status]} \xB7 loop`,f="";if(m&&y!==void 0&&y<=St){let k=a+z-13;for(let i=1;i<=y;i++){let r=s+14+(i-1)*15,u=i<m.iteration?"v3r-dot done":i===m.iteration?`v3r-dot cur${t.status==="running"?" live":""}`:"v3r-dot todo",x=L!==void 0&&i>L?" grant":"";f+=`<circle class="${u}${x}" cx="${r}" cy="${k}" r="3.6"/>`}m.lastDecision==="exit"?f+=`<text class="v3r-dots-verdict ok" x="${s+14+y*15+4}" y="${k+4}">\u2713</text>`:m.lastDecision==="exhausted"&&t.status==="blocked"&&(f+=`<text class="v3r-dots-verdict warn" x="${s+14+y*15+4}" y="${k+4}">\u26A0</text>`)}return`<g class="v3r-node v3r-loopnode st-${t.status}${$?" sel":""}" data-node="${h(t.id)}">
|
|
134
|
+
<rect class="v3r-cap" x="${s-4}" y="${a-4}" width="${O+8}" height="${z+8}" rx="14"/>
|
|
135
|
+
<rect class="v3r-box" x="${s}" y="${a}" width="${O}" height="${z}" rx="10"/>
|
|
136
|
+
<text class="v3r-spin" x="${s+14}" y="${a+21}">\u27F3</text>
|
|
137
|
+
<text class="v3r-nid" x="${s+30}" y="${a+21}">${h(J(t.id,16))}</text>
|
|
138
|
+
<text class="v3r-nstatus" x="${s+14}" y="${a+39}">${h(w)}</text>
|
|
139
|
+
${f}
|
|
140
|
+
</g>`}function Q(t){let s=t.nodes.filter(i=>!i.loop),a=Et(s),$=new Map;for(let i of s){let r=a.get(i.id)??0;($.get(r)??$.set(r,[]).get(r)).push(i)}let m=new Map,L=0;for(let[i,r]of $){let u=q;for(let x of r)m.set(x.id,{x:q+i*lt,y:u}),u+=X(x)+dt;L=Math.max(L,u-dt+q)}let y=q*2+($.size===0?0:Math.max(...$.keys())*lt+O),w=new Map(s.map(i=>[i.id,i])),f=[];for(let i of s){let r=m.get(i.id);if(r)for(let u of i.depends){let x=m.get(u),E=w.get(u);if(!x||!E)continue;let C=x.x+O,P=x.y+X(E)/2,v=r.x,p=r.y+X(i)/2,g=(C+v)/2,N=i.status==="running"?" live":"";f.push(`<path class="v3r-edge${N}" d="M${C},${P} C${g},${P} ${g},${p} ${v},${p}" marker-end="url(#v3arrow)"/>`)}}let k=s.map(i=>{let r=m.get(i.id),u=i.id===R;return i.isLoop?ht(i,r.x,r.y,u):`<g class="v3r-node st-${i.status}${u?" sel":""}" data-node="${h(i.id)}">
|
|
141
|
+
<rect class="v3r-box" x="${r.x}" y="${r.y}" width="${O}" height="${K}" rx="10"/>
|
|
142
|
+
<rect class="v3r-bar" x="${r.x}" y="${r.y+8}" width="3" height="${K-16}" rx="1.5"/>
|
|
143
|
+
<text class="v3r-nid" x="${r.x+14}" y="${r.y+20}">${h(J(i.id,18))}</text>
|
|
144
|
+
<text class="v3r-nstatus" x="${r.x+14}" y="${r.y+37}">${D[i.status]}</text>
|
|
145
|
+
</g>`});d.innerHTML=`<svg width="${y}" height="${L}" viewBox="0 0 ${y} ${L}" style="display:block">
|
|
146
|
+
<defs><marker id="v3arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
147
|
+
<path d="M0,0 L10,5 L0,10 z" fill="var(--faint, #8b98aa)"/></marker></defs>
|
|
148
|
+
${f.join("")}${k.join("")}
|
|
149
|
+
</svg>`;for(let i of d.querySelectorAll("[data-node]"))i.addEventListener("click",()=>pt(i.getAttribute("data-node")))}async function $t(){if(!(T||document.hidden))try{let t=await fetch(`/api/v3/runs/${encodeURIComponent(n)}`);if(T)return;if(!t.ok){if(t.status===404&&!H){H=!0;try{let a=await fetch(`/api/workflows/runs/${encodeURIComponent(n)}/snapshot`);if(T)return;if(a.ok){window.location.replace(it(n,location.hash.split("?")[1]));return}}catch{}}T||(b.textContent=t.status===404?"not found":`HTTP ${t.status}`);return}let s=await t.json();if(T)return;if(M=s,b.textContent=s.runStatus,b.className=`v3r-pill rs-${s.runStatus}`,R===null&&s.nodes.length&&(R=s.nodes[0].id),Q(s),U(),at(s.runStatus)){c!==null&&window.clearTimeout(c),c=null;return}}catch{}}function tt(){T||$t().then(()=>{!T&&!at(M?.runStatus)&&(c=window.setTimeout(tt,ct))})}return tt(),()=>{T=!0,c!==null&&window.clearTimeout(c)}}function Et(e){let n=new Map(e.map(c=>[c.id,c])),d=new Map,l=new Set;function b(c){if(d.has(c))return d.get(c);if(l.has(c))return 0;l.add(c);let H=(n.get(c)?.depends??[]).filter(M=>n.has(M)),R=H.length?1+Math.max(...H.map(b)):0;return l.delete(c),d.set(c,R),R}for(let c of e)b(c.id);return d}function J(e,n){return e.length>n?e.slice(0,n-1)+"\u2026":e}var o=G(rt(),1);function Ct(){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("div",{className:"page-head",children:[(0,o.jsx)("h1",{children:"\u5DE5\u4F5C\u6D41"}),(0,o.jsx)("p",{className:"muted",children:"LLM \u7F16\u6392\u7684 workflow \u8FD0\u884C \u2014 DAG \u56FE + \u6BCF\u8282\u70B9\u7EC8\u7AEF"})]}),(0,o.jsxs)("table",{className:"data-table",children:[(0,o.jsx)("thead",{children:(0,o.jsxs)("tr",{children:[(0,o.jsx)("th",{children:"Run"}),(0,o.jsx)("th",{children:"\u72B6\u6001"}),(0,o.jsx)("th",{children:"\u8282\u70B9\u6570"})]})}),(0,o.jsx)("tbody",{id:"v3-tbody"})]}),(0,o.jsxs)("div",{id:"v3-empty",className:"muted",hidden:!0,style:{padding:"1rem"},children:["\u6682\u65E0\u5DE5\u4F5C\u6D41\u8FD0\u884C\uFF08\u7528 ",(0,o.jsx)("code",{children:"/workflow new"})," \u53D1\u8D77\u4E00\u4E2A\uFF09"]})]})}function Pt(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("div",{className:"page-head",children:[(0,o.jsx)("a",{href:"#/workflows",className:"btn-link",children:"\u2190 \u5DE5\u4F5C\u6D41"}),(0,o.jsx)("h1",{className:"v3r-title",children:e.runId}),(0,o.jsx)("span",{id:"v3-runstatus",className:"v3r-pill"})]}),(0,o.jsxs)("div",{className:"v3r-wrap",children:[(0,o.jsxs)("div",{className:"v3r-graph-card",children:[(0,o.jsx)("div",{id:"v3-graph",className:"v3r-graph"}),(0,o.jsxs)("div",{className:"v3r-legend",children:[(0,o.jsx)("span",{className:"lg st-pending",children:"\u5F85\u673A"}),(0,o.jsx)("span",{className:"lg st-running",children:"\u8FD0\u884C\u4E2D"}),(0,o.jsx)("span",{className:"lg st-gateWaiting",children:"\u7B49\u5BA1\u6279"}),(0,o.jsx)("span",{className:"lg st-done",children:"\u5B8C\u6210"}),(0,o.jsx)("span",{className:"lg st-skipped",children:"\u5DF2\u8DF3\u8FC7"}),(0,o.jsx)("span",{className:"lg st-cancelled",children:"\u5DF2\u53D6\u6D88"}),(0,o.jsx)("span",{className:"lg st-blocked",children:"\u53D7\u963B"}),(0,o.jsx)("span",{className:"lg st-failed",children:"\u5931\u8D25"}),(0,o.jsx)("span",{className:"lg lg-loop",children:"\u27F3 \u5FAA\u73AF\u5BB9\u5668"})]})]}),(0,o.jsx)("div",{id:"v3-node-panel",className:"v3r-panel",children:(0,o.jsx)("p",{className:"muted",children:"\u70B9\u4E00\u4E2A\u8282\u70B9\u770B\u8BE6\u60C5\u4E0E\u7EC8\u7AEF"})})]})]})}function Vt(){let e=(0,_.useRef)(null),n=Z();return(0,_.useEffect)(()=>{if(e.current)return ut(e.current)},[]),(0,o.jsx)("section",{className:"page",ref:e,children:n?(0,o.jsx)(Pt,{runId:n}):(0,o.jsx)(Ct,{})})}function Wt(e){return st(e,(0,o.jsx)(Vt,{}))}export{Wt as renderV3RunsPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as z,b as I,c as M}from"./chunk-JTSE5VP6.js";import{c as y}from"./chunk-7SZRL6FY.js";var s=y(z(),1);var e=y(M(),1);function W(t){let a=Date.parse(t);if(!a)return t||"-";let r=Math.max(0,Math.floor((Date.now()-a)/1e3));if(r<60)return`${r}s ago`;let n=Math.floor(r/60);if(n<60)return`${n}m ago`;let o=Math.floor(n/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}function j(t){return t.chatId?.trim()||"__local__"}function D(t,a){if(t==="__local__")return"\u672A\u7ED1\u5B9A\u7FA4 / \u672C\u5730\u767D\u677F";let r=a.get(t);return r&&r!==t?`${r} (${t})`:t}function H(t,a){let r=new Map;for(let n of t){let o=j(n),c=r.get(o)??[];c.push(n),r.set(o,c)}return[...r.entries()].map(([n,o])=>({chatId:n,label:D(n,a),rows:[...o].sort((c,u)=>u.updatedAt.localeCompare(c.updatedAt))})).sort((n,o)=>n.label.localeCompare(o.label))}function _(t){return{display:"block",textDecoration:"none",color:"inherit",border:`1px solid ${t?"rgba(14,165,233,.75)":"var(--border)"}`,borderRadius:14,padding:"13px 14px",margin:"10px 0 10px 18px",background:t?"linear-gradient(135deg, rgba(14,165,233,.16), rgba(59,130,246,.08))":"var(--surface-raised)",boxShadow:t?"0 10px 24px rgba(14,165,233,.13)":"0 4px 14px rgba(15,23,42,.04)"}}function L(){return decodeURIComponent((location.hash.match(/^#\/whiteboards\/([^/]+)/)?.[1]??"").trim())}async function B(t,a){let r=await fetch(`/api/whiteboards/${encodeURIComponent(t)}`),n=await r.json().catch(()=>({}));if(r.ok)return{id:t,content:String(n.content??""),row:a.find(o=>o.id===t)}}async function F(t){let a=new Map;if(!t?.ok)return a;let r=await t.json().catch(()=>({})),n=Array.isArray(r.chats)?r.chats:[];for(let o of n)o.chatId&&a.set(String(o.chatId),String(o.name||o.chatId));return a}function U(t){let a=t.row;return(0,e.jsxs)("a",{className:`wb-item${t.active?" active":""}`,"data-whiteboard-id":a.id,href:`#/whiteboards/${encodeURIComponent(a.id)}`,style:_(t.active),onClick:r=>{r.preventDefault(),t.onSelect(a.id)},children:[(0,e.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"flex-start",justifyContent:"space-between"},children:[(0,e.jsxs)("div",{style:{minWidth:0},children:[(0,e.jsx)("strong",{style:{display:"block",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:a.title||a.id}),(0,e.jsx)("span",{style:{display:"inline-block",marginTop:4,fontSize:11,color:"var(--muted)",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace"},children:a.id})]}),(0,e.jsx)("span",{style:{fontSize:11,border:"1px solid var(--border)",borderRadius:999,padding:"2px 7px",color:"var(--muted)",whiteSpace:"nowrap"},children:a.scope})]}),(0,e.jsxs)("div",{style:{marginTop:9,display:"flex",gap:8,alignItems:"center",color:"var(--muted)",fontSize:12},children:[(0,e.jsx)("span",{children:W(a.updatedAt)}),(0,e.jsx)("span",{children:"\xB7"}),(0,e.jsxs)("span",{children:["log ",a.logCount]})]})]})}function f(t){return(0,e.jsxs)("div",{style:{border:"1px solid var(--border)",borderRadius:12,padding:"10px 12px",background:"var(--surface-raised)",minWidth:0},children:[(0,e.jsx)("div",{style:{fontSize:11,color:"var(--muted)",marginBottom:5},children:t.label}),(0,e.jsx)("div",{style:{fontSize:13,wordBreak:"break-all"},children:t.value||"-"})]})}function O(t){let a=t.selected;if(!a)return(0,e.jsx)("p",{className:"empty",children:"\u9009\u62E9\u5DE6\u4FA7\u767D\u677F\u67E5\u770B meta \u548C board.md\u3002"});let r=a.row,n=r?.chatId?D(r.chatId,t.groupNames):"\u672A\u7ED1\u5B9A\u7FA4 / \u672C\u5730\u767D\u677F";return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",gap:16,alignItems:"flex-start",marginBottom:16},children:[(0,e.jsxs)("div",{style:{minWidth:0},children:[(0,e.jsx)("p",{className:"eyebrow",style:{margin:"0 0 6px"},children:"WHITEBOARD"}),(0,e.jsx)("h2",{style:{margin:0,fontSize:22,lineHeight:1.25},children:r?.title||a.id}),(0,e.jsx)("div",{style:{marginTop:8,color:"var(--muted)",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",fontSize:12},children:a.id})]}),(0,e.jsx)("button",{type:"button",className:"danger","data-delete-whiteboard":!0,onClick:t.onDelete,children:"\u5220\u9664\u767D\u677F"})]}),(0,e.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(2,minmax(0,1fr))",gap:10,marginBottom:18},children:[(0,e.jsx)(f,{label:"\u6240\u5C5E\u7FA4",value:n}),(0,e.jsx)(f,{label:"\u8303\u56F4",value:r?.scope??"-"}),(0,e.jsx)(f,{label:"\u6700\u8FD1\u66F4\u65B0",value:r?.updatedAt?W(r.updatedAt):"-"}),(0,e.jsx)(f,{label:"\u6765\u6E90\u76EE\u5F55",value:r?.workingDir??"-"})]}),(0,e.jsxs)("details",{style:{marginBottom:18,color:"var(--muted)"},children:[(0,e.jsx)("summary",{style:{cursor:"pointer"},children:"\u7BA1\u7406\u4FE1\u606F / \u6587\u4EF6\u8DEF\u5F84"}),(0,e.jsx)("code",{style:{display:"block",marginTop:8,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:r?.path??""})]}),(0,e.jsxs)("section",{style:{border:"1px solid var(--border)",borderRadius:14,background:"var(--surface-raised)",overflow:"hidden"},children:[(0,e.jsxs)("div",{style:{padding:"12px 14px",borderBottom:"1px solid var(--border)",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,e.jsx)("strong",{children:"\u5F53\u524D\u72B6\u6001 board.md"}),(0,e.jsx)("span",{style:{color:"var(--muted)",fontSize:12},children:"read / update"})]}),(0,e.jsx)("pre",{style:{whiteSpace:"pre-wrap",maxHeight:"70vh",overflow:"auto",margin:0,padding:16,lineHeight:1.65,background:"transparent"},children:a.content||"\uFF08\u6682\u65E0\u5185\u5BB9\uFF09"})]})]})}function q(t){let a=t.selected.row?.title||t.selected.id;return(0,e.jsx)("div",{className:"wb-delete-backdrop","data-delete-modal":!0,style:{position:"fixed",inset:0,background:"rgba(0,0,0,.48)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e4,padding:20},onClick:r=>{r.target===r.currentTarget&&t.onCancel()},children:(0,e.jsxs)("div",{role:"dialog","aria-modal":"true","aria-labelledby":"wb-delete-title",style:{width:"min(520px,92vw)",background:"var(--surface)",color:"var(--fg)",border:"1px solid var(--border)",borderRadius:16,boxShadow:"0 18px 60px rgba(0,0,0,.35)",padding:"22px 24px"},children:[(0,e.jsxs)("div",{style:{display:"flex",gap:14,alignItems:"flex-start"},children:[(0,e.jsx)("div",{"aria-hidden":"true",style:{width:36,height:36,borderRadius:"50%",display:"grid",placeItems:"center",background:"rgba(220,38,38,.14)",color:"#dc2626",fontWeight:800},children:"!"}),(0,e.jsxs)("div",{style:{minWidth:0,flex:1},children:[(0,e.jsx)("h3",{id:"wb-delete-title",style:{margin:"0 0 8px",fontSize:18},children:"\u5220\u9664\u767D\u677F\uFF1F"}),(0,e.jsxs)("p",{style:{margin:0,color:"var(--muted)",lineHeight:1.6},children:["\u5C06\u5220\u9664 ",(0,e.jsx)("strong",{children:a}),"\uFF08",(0,e.jsx)("code",{children:t.selected.id}),"\uFF09\u7684 board\u3001log\u3001meta\uFF0C\u5E76\u6E05\u7406\u9ED8\u8BA4\u7ED1\u5B9A\u548C\u4F1A\u8BDD\u5F15\u7528\u3002\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"]})]})]}),(0,e.jsxs)("div",{className:"actions",style:{display:"flex",justifyContent:"flex-end",gap:10,marginTop:22},children:[(0,e.jsx)("button",{type:"button","data-delete-cancel":!0,onClick:t.onCancel,disabled:t.deleting,children:"\u53D6\u6D88"}),(0,e.jsx)("button",{type:"button",className:"danger","data-delete-confirm":!0,onClick:t.onConfirm,disabled:t.deleting,children:t.deleting?"\u5220\u9664\u4E2D...":"\u786E\u8BA4\u5220\u9664"})]})]})})}function K(){let t=(0,s.useRef)(!1),a=(0,s.useRef)(0),[r,n]=(0,s.useState)(!1),[o,c]=(0,s.useState)([]),[u,T]=(0,s.useState)(()=>new Map),[g,b]=(0,s.useState)(),[$,v]=(0,s.useState)(!0),[x,S]=(0,s.useState)(null),[p,h]=(0,s.useState)(null),[P,R]=(0,s.useState)(!1),N=(0,s.useMemo)(()=>H(o,u),[o,u]);(0,s.useEffect)(()=>{t.current=!0;let i=L();async function l(){v(!0);try{let[d,w]=await Promise.all([fetch("/api/whiteboards"),fetch("/api/groups").catch(()=>null)]),m=await d.json().catch(()=>({}));if(!d.ok)throw new Error(m?.error??`HTTP ${d.status}`);let G=await F(w),k=Array.isArray(m.whiteboards)?m.whiteboards:[],C;if(i&&(C=await B(i,k)),!t.current)return;n(m.enabled===!0),c(k),T(G),b(C),S(null)}catch(d){t.current&&S(d instanceof Error?d.message:String(d))}finally{t.current&&v(!1)}}return l(),()=>{t.current=!1,a.current+=1}},[]);async function A(i){let l=a.current+1;a.current=l;let d=await B(i,o);!t.current||a.current!==l||!d||(b(d),window.history.replaceState(null,"",`#/whiteboards/${encodeURIComponent(i)}`))}async function E(){if(p){R(!0);try{let i=await fetch(`/api/whiteboards/${encodeURIComponent(p.id)}`,{method:"DELETE"}),l=await i.json().catch(()=>({}));if(!i.ok||l.ok===!1)throw new Error(l?.error??`HTTP ${i.status}`);if(!t.current)return;c(d=>d.filter(w=>w.id!==p.id)),g?.id===p.id&&(b(void 0),window.history.replaceState(null,"","#/whiteboards")),h(null)}catch(i){t.current&&window.alert(`\u5220\u9664\u5931\u8D25\uFF1A${i instanceof Error?i.message:String(i)}`)}finally{t.current&&R(!1)}}}return x?(0,e.jsx)("section",{className:"page",children:(0,e.jsxs)("p",{className:"hint-warn",children:["\u52A0\u8F7D\u767D\u677F\u5931\u8D25\uFF1A",x]})}):$?(0,e.jsx)("div",{"data-whiteboards-host":!0,children:(0,e.jsx)("p",{className:"empty",children:"Loading whiteboards..."})}):(0,e.jsxs)("section",{className:"page",children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:"Whiteboards"}),(0,e.jsx)("h1",{children:"\u672C\u5730\u767D\u677F"}),(0,e.jsx)("p",{children:"\u6309\u7FA4\u5171\u4EAB\u7684\u672C\u5730\u6700\u65B0\u72B6\u6001\u767D\u677F\u3002\u5F00\u5173\u5173\u95ED\u65F6\u4EC5\u53EA\u8BFB\u5C55\u793A\u5386\u53F2\u767D\u677F\uFF0C\u4E0D\u6CE8\u5165 prompt\u3001\u4E0D\u5141\u8BB8 agent CLI \u8BFB\u5199\u3002"})]}),(0,e.jsx)("span",{className:`pill ${r?"ok":"warn"}`,children:r?"Enabled":"Disabled"})]}),r?null:(0,e.jsx)("p",{className:"hint-warn",children:"\u767D\u677F\u80FD\u529B\u5F53\u524D\u5173\u95ED\uFF1A\u4E0D\u4F1A\u81EA\u52A8\u521B\u5EFA/\u7ED1\u5B9A\u767D\u677F\uFF0C\u4E5F\u4E0D\u4F1A\u6CE8\u5165\u5230 agent prompt\u3002\u5386\u53F2\u767D\u677F\u4EC5\u5728 dashboard \u4E2D\u53EA\u8BFB\u53EF\u89C1\uFF0C\u53EF\u5728\u6B64\u6E05\u7406\u3002"}),(0,e.jsxs)("div",{className:"wb-split",style:{display:"grid",gridTemplateColumns:"minmax(300px,400px) minmax(0,1fr)",gap:18,alignItems:"start"},children:[(0,e.jsxs)("article",{className:"bd-card settings-card",style:{padding:18},children:[(0,e.jsx)("h3",{className:"bd-section-title",style:{marginBottom:12},children:"\u7FA4\u7EC4 / \u767D\u677F"}),N.length===0?(0,e.jsx)("p",{className:"empty",children:"\u6682\u65E0\u767D\u677F\u3002\u6253\u5F00\u80FD\u529B\u540E\uFF0C\u6BCF\u4E2A\u7FA4\u9996\u6B21\u9700\u8981\u767D\u677F\u65F6\u624D\u4F1A\u521B\u5EFA\u9ED8\u8BA4\u767D\u677F\u3002"}):N.map(i=>(0,e.jsxs)("details",{className:"wb-group",open:!0,style:{marginBottom:14},children:[(0,e.jsxs)("summary",{style:{cursor:"pointer",fontWeight:700,margin:"12px 0 8px",display:"flex",justifyContent:"space-between",gap:8,alignItems:"center"},children:[(0,e.jsx)("span",{style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:i.label}),(0,e.jsx)("small",{style:{border:"1px solid var(--border)",borderRadius:999,padding:"1px 7px",color:"var(--muted)"},children:i.rows.length})]}),i.rows.map(l=>(0,e.jsx)(U,{row:l,active:g?.id===l.id,onSelect:d=>{A(d)}},l.id))]},i.chatId))]}),(0,e.jsx)("article",{className:"bd-card settings-card",id:"whiteboard-detail",style:{padding:"20px 22px"},children:(0,e.jsx)(O,{selected:g,groupNames:u,onDelete:()=>{g&&h(g)}})})]}),p?(0,e.jsx)(q,{selected:p,deleting:P,onCancel:()=>h(null),onConfirm:()=>{E()}}):null]})}function Q(t){return I(t,(0,e.jsx)(K,{}))}export{Q as renderWhiteboardsPage};
|