botmux 3.12.0 → 3.12.1
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/dist/.runtime-build-id +1 -1
- package/dist/adapters/backend/riff-backend.d.ts +18 -0
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +143 -0
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/cli/kimi.d.ts.map +1 -1
- package/dist/adapters/cli/kimi.js +22 -8
- package/dist/adapters/cli/kimi.js.map +1 -1
- package/dist/adapters/cli/pi.d.ts.map +1 -1
- package/dist/adapters/cli/pi.js +3 -1
- package/dist/adapters/cli/pi.js.map +1 -1
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +4 -1
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +65 -27
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +16 -2
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.js +1 -1
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts +17 -1
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +13 -1
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +5 -0
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/skills/cli-admin-command.d.ts.map +1 -1
- package/dist/core/skills/cli-admin-command.js +142 -3
- package/dist/core/skills/cli-admin-command.js.map +1 -1
- package/dist/core/skills/frontmatter.d.ts.map +1 -1
- package/dist/core/skills/frontmatter.js +44 -7
- package/dist/core/skills/frontmatter.js.map +1 -1
- package/dist/core/skills/im-command.d.ts +6 -0
- package/dist/core/skills/im-command.d.ts.map +1 -1
- package/dist/core/skills/im-command.js +34 -7
- package/dist/core/skills/im-command.js.map +1 -1
- package/dist/core/skills/install-command.d.ts +4 -0
- package/dist/core/skills/install-command.d.ts.map +1 -0
- package/dist/core/skills/install-command.js +89 -0
- package/dist/core/skills/install-command.js.map +1 -0
- package/dist/core/skills/package.d.ts.map +1 -1
- package/dist/core/skills/package.js +10 -3
- package/dist/core/skills/package.js.map +1 -1
- package/dist/core/skills/policy.d.ts +5 -1
- package/dist/core/skills/policy.d.ts.map +1 -1
- package/dist/core/skills/policy.js +66 -3
- package/dist/core/skills/policy.js.map +1 -1
- package/dist/core/skills/references.d.ts +9 -1
- package/dist/core/skills/references.d.ts.map +1 -1
- package/dist/core/skills/references.js +35 -2
- package/dist/core/skills/references.js.map +1 -1
- package/dist/core/skills/registry-paths.d.ts +1 -0
- package/dist/core/skills/registry-paths.d.ts.map +1 -1
- package/dist/core/skills/registry-paths.js +3 -0
- package/dist/core/skills/registry-paths.js.map +1 -1
- package/dist/core/skills/session-resolver.d.ts +2 -1
- package/dist/core/skills/session-resolver.d.ts.map +1 -1
- package/dist/core/skills/session-resolver.js +1 -0
- package/dist/core/skills/session-resolver.js.map +1 -1
- package/dist/core/skills/session-runtime.d.ts.map +1 -1
- package/dist/core/skills/session-runtime.js +2 -0
- package/dist/core/skills/session-runtime.js.map +1 -1
- package/dist/core/skills/sources.d.ts +23 -0
- package/dist/core/skills/sources.d.ts.map +1 -1
- package/dist/core/skills/sources.js +128 -12
- package/dist/core/skills/sources.js.map +1 -1
- package/dist/core/skills/types.d.ts +22 -1
- package/dist/core/skills/types.d.ts.map +1 -1
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +52 -1
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +2 -114
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts.map +1 -1
- package/dist/dashboard/connector-api.js +66 -6
- package/dist/dashboard/connector-api.js.map +1 -1
- package/dist/dashboard/public-redact.d.ts.map +1 -1
- package/dist/dashboard/public-redact.js +3 -0
- package/dist/dashboard/public-redact.js.map +1 -1
- package/dist/dashboard/skill-install-request.js +10 -11
- package/dist/dashboard/skill-install-request.js.map +1 -1
- package/dist/dashboard/skill-pack-response.d.ts +15 -0
- package/dist/dashboard/skill-pack-response.d.ts.map +1 -0
- package/dist/dashboard/skill-pack-response.js +32 -0
- package/dist/dashboard/skill-pack-response.js.map +1 -0
- package/dist/dashboard/web/connectors-page.d.ts +69 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +47 -7
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +301 -26
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/preferences.d.ts +4 -2
- package/dist/dashboard/web/preferences.d.ts.map +1 -1
- package/dist/dashboard/web/preferences.js +14 -6
- package/dist/dashboard/web/preferences.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +99 -3
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +3 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +13 -6
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/skills/bot-assignments-tab.d.ts +27 -0
- package/dist/dashboard/web/skills/bot-assignments-tab.d.ts.map +1 -0
- package/dist/dashboard/web/skills/bot-assignments-tab.js +257 -0
- package/dist/dashboard/web/skills/bot-assignments-tab.js.map +1 -0
- package/dist/dashboard/web/skills/delivery-settings-tab.d.ts +25 -0
- package/dist/dashboard/web/skills/delivery-settings-tab.d.ts.map +1 -0
- package/dist/dashboard/web/skills/delivery-settings-tab.js +20 -0
- package/dist/dashboard/web/skills/delivery-settings-tab.js.map +1 -0
- package/dist/dashboard/web/skills/shared.d.ts +86 -0
- package/dist/dashboard/web/skills/shared.d.ts.map +1 -0
- package/dist/dashboard/web/skills/shared.js +178 -0
- package/dist/dashboard/web/skills/shared.js.map +1 -0
- package/dist/dashboard/web/skills/skill-library-tab.d.ts +75 -0
- package/dist/dashboard/web/skills/skill-library-tab.d.ts.map +1 -0
- package/dist/dashboard/web/skills/skill-library-tab.js +108 -0
- package/dist/dashboard/web/skills/skill-library-tab.js.map +1 -0
- package/dist/dashboard/web/skills/skill-packs-tab.d.ts +21 -0
- package/dist/dashboard/web/skills/skill-packs-tab.d.ts.map +1 -0
- package/dist/dashboard/web/skills/skill-packs-tab.js +185 -0
- package/dist/dashboard/web/skills/skill-packs-tab.js.map +1 -0
- package/dist/dashboard/web/skills/types.d.ts +95 -0
- package/dist/dashboard/web/skills/types.d.ts.map +1 -0
- package/dist/dashboard/web/skills/types.js +2 -0
- package/dist/dashboard/web/skills/types.js.map +1 -0
- package/dist/dashboard/web/skills/use-skills-data.d.ts +31 -0
- package/dist/dashboard/web/skills/use-skills-data.d.ts.map +1 -0
- package/dist/dashboard/web/skills/use-skills-data.js +86 -0
- package/dist/dashboard/web/skills/use-skills-data.js.map +1 -0
- package/dist/dashboard/web/skills-page.d.ts +34 -31
- package/dist/dashboard/web/skills-page.d.ts.map +1 -1
- package/dist/dashboard/web/skills-page.js +321 -176
- package/dist/dashboard/web/skills-page.js.map +1 -1
- package/dist/dashboard/webhook-routes.d.ts +18 -0
- package/dist/dashboard/webhook-routes.d.ts.map +1 -1
- package/dist/dashboard/webhook-routes.js +35 -1
- package/dist/dashboard/webhook-routes.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/{bot-defaults-page-USC6EZXP.js → bot-defaults-page-HL655CNR.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-KOPISPHN.js → chunk-5PAYQ3KT.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-RXRJB5SO.js → chunk-5ZL7NLR5.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-A7VC4BXR.js → chunk-BFUTTYVK.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-ELL53D62.js +55 -0
- package/dist/dashboard-web/chunks/connectors-page-3QQACF23.js +1 -0
- package/dist/dashboard-web/chunks/{groups-page-C6NSDTIN.js → groups-page-SDZMJ7UV.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-UTOVYLLY.js → insights-page-ZZ3JEJ6L.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-UKTJYTA2.js → monitor-room-ROJ5GZ4N.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-Q3CEZIVX.js → monitoring-page-IATV7KJF.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-GYCZOOVJ.js → office-page-TYO5OIIT.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-W2VBJ6OH.js → overview-page-VJUULZF2.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-U4SHER4K.js → roles-page-7RJJKZGK.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-TNPW3N3Q.js → schedules-page-JTEJ5IXW.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-KD7HDT3U.js +8 -0
- package/dist/dashboard-web/chunks/{settings-page-VKW5ZK5K.js → settings-page-7CTTFBRS.js} +1 -1
- package/dist/dashboard-web/chunks/skills-page-57NZECJ3.js +4 -0
- package/dist/dashboard-web/chunks/{team-federation-page-OMFGGBT2.js → team-federation-page-6YYIMJG3.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-PLXWK4KO.js → v3-page-ZGKBSBK3.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-NJQOEO2P.js → whiteboards-page-AACJF6DB.js} +1 -1
- package/dist/dashboard-web/style.css +1623 -160
- package/dist/dashboard.js +200 -16
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +2 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +2 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/index-daemon.js +6 -1
- package/dist/index-daemon.js.map +1 -1
- package/dist/services/connector-store.d.ts +14 -1
- package/dist/services/connector-store.d.ts.map +1 -1
- package/dist/services/connector-store.js.map +1 -1
- package/dist/services/connector-topic-template.d.ts +7 -0
- package/dist/services/connector-topic-template.d.ts.map +1 -0
- package/dist/services/connector-topic-template.js +210 -0
- package/dist/services/connector-topic-template.js.map +1 -0
- package/dist/services/project-scanner.d.ts +33 -0
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +40 -1
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/skill-pack-store.d.ts +50 -0
- package/dist/services/skill-pack-store.d.ts.map +1 -0
- package/dist/services/skill-pack-store.js +270 -0
- package/dist/services/skill-pack-store.js.map +1 -0
- package/dist/services/skill-registry-store.d.ts +8 -0
- package/dist/services/skill-registry-store.d.ts.map +1 -1
- package/dist/services/skill-registry-store.js +100 -68
- package/dist/services/skill-registry-store.js.map +1 -1
- package/dist/services/todo-state.d.ts +74 -0
- package/dist/services/todo-state.d.ts.map +1 -0
- package/dist/services/todo-state.js +351 -0
- package/dist/services/todo-state.js.map +1 -0
- package/dist/setup/agent-preset.d.ts.map +1 -1
- package/dist/setup/agent-preset.js +2 -0
- package/dist/setup/agent-preset.js.map +1 -1
- package/dist/setup/owner-identity.d.ts +47 -0
- package/dist/setup/owner-identity.d.ts.map +1 -0
- package/dist/setup/owner-identity.js +196 -0
- package/dist/setup/owner-identity.js.map +1 -0
- package/dist/setup/register-app.d.ts +4 -3
- package/dist/setup/register-app.d.ts.map +1 -1
- package/dist/setup/register-app.js.map +1 -1
- package/dist/setup/setup-args.d.ts +1 -1
- package/dist/setup/setup-args.d.ts.map +1 -1
- package/dist/setup/setup-args.js +7 -3
- package/dist/setup/setup-args.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/child-env.d.ts +25 -0
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +47 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/worker.js +55 -16
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +44 -44
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/chunk-M6BHWQFO.js +0 -51
- package/dist/dashboard-web/chunks/connectors-page-4Z76HWRH.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-YWWDDV57.js +0 -6
- package/dist/dashboard-web/chunks/skills-page-ZCEDFGZZ.js +0 -4
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as A,b as V}from"./chunk-EVK77ASG.js";import{a as ue}from"./chunk-ZJVTGU5X.js";import{c as _}from"./chunk-KOPISPHN.js";import{a as le,c as ie,g as xe,l as M,q as de}from"./chunk-5CJMHTT4.js";import"./chunk-M6BHWQFO.js";import{a as re}from"./chunk-SYC6D5XU.js";import{a as Pe,d as ce}from"./chunk-5THX4DI2.js";import{c as j}from"./chunk-7SZRL6FY.js";var i=j(Pe(),1);var m=j(Pe(),1);var n=j(ce(),1),Be=50,Ne={total:0,ok:0,error:0,successRate:0};function Ge(t,e=Date.now()){if(t==="all")return;let s=t==="24h"?24:t==="7d"?168:720;return new Date(e-s*60*60*1e3).toISOString()}function We(t,e=0){let s=new URLSearchParams({limit:String(Be),offset:String(e)});t.connectorId&&s.set("connectorId",t.connectorId),t.status&&s.set("status",t.status);let g=Ge(t.timeWindow);return g&&s.set("since",g),t.query.trim()&&s.set("q",t.query.trim()),s}function Se(t){if(!t)return"\u2014";let e=new Date(t);return Number.isFinite(e.getTime())?e.toLocaleString():t}function ge(t){return t===void 0||!Number.isFinite(t)?"\u2014":t<1e3?`${Math.round(t)} ms`:t<6e4?`${(t/1e3).toFixed(t<1e4?1:0)} s`:`${(t/6e4).toFixed(1)} min`}function _e(t){return t===void 0?"\u2014":t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/1024/1024).toFixed(1)} MB`}function Le(t){return t.value===void 0||t.value===null?(0,n.jsx)("p",{className:"webhook-log-detail-empty",children:t.empty}):typeof t.value=="object"&&!Array.isArray(t.value)&&Object.keys(t.value).length===0?(0,n.jsx)("p",{className:"webhook-log-detail-empty",children:t.empty}):(0,n.jsx)("pre",{className:`webhook-log-json${t.fullHeight?" full-height":""}`,children:(0,n.jsx)("code",{children:JSON.stringify(t.value,null,2)})})}function Ue(t){let e=[["kind",t.value?.kind],["mode",t.value?.mode],["botId",t.value?.botId],["chatId",t.value?.chatId],["sessionId",t.value?.sessionId],["rootMessageId",t.value?.rootMessageId],["workflowId",t.value?.workflowId]].filter(([,s])=>s!=null&&s!=="");return e.length?(0,n.jsx)("dl",{className:"webhook-log-target-facts",children:e.map(([s,g])=>(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:s}),(0,n.jsx)("dd",{children:(0,n.jsx)("code",{children:String(g)})})]},s))}):(0,n.jsx)("p",{className:"webhook-log-detail-empty",children:"\u2014"})}function Ie(t){return(0,n.jsx)(de,{id:t.id,className:"webhook-log-filter-menu",ariaLabel:t.label,style:{width:"100%",minWidth:0},value:t.value,label:le(t.options,t.value),options:t.options,onChange:t.onChange})}function me(t){return(0,n.jsxs)("article",{className:`card webhook-log-metric${t.tone?` ${t.tone}`:""}`,children:[(0,n.jsx)("span",{children:t.label}),(0,n.jsx)("strong",{children:t.value}),(0,n.jsx)("small",{children:t.hint||"\xA0"})]})}function Fe(t={}){let e=_(),s=(0,m.useRef)(!1),g=(0,m.useRef)([]),[w,L]=(0,m.useState)([]),[f,I]=(0,m.useState)([]),[y,E]=(0,m.useState)(Ne),[N,O]=(0,m.useState)({connectorId:"",status:"",timeWindow:"7d",query:""}),[d,r]=(0,m.useState)(null),[R,U]=(0,m.useState)(!0),[v,J]=(0,m.useState)(!1),[$,X]=(0,m.useState)(!1),[Y,Z]=(0,m.useState)(0),[q,P]=(0,m.useState)(""),[K,ee]=(0,m.useState)(!1),T=(0,m.useMemo)(()=>new Map(w.map(c=>[c.id,c.name])),[w]),u=(0,m.useMemo)(()=>f.find(c=>c.triggerId===d)??f[0]??null,[f,d]),oe=(0,m.useMemo)(()=>[{value:"",label:e("webhookLogs.allConnectors")},...w.map(c=>({value:c.id,label:c.name}))],[w,e]),B=(0,m.useMemo)(()=>[{value:"",label:e("webhookLogs.allStatuses")},{value:"ok",label:e("webhookLogs.success")},{value:"error",label:e("webhookLogs.failed")}],[e]),fe=(0,m.useMemo)(()=>[{value:"24h",label:e("webhookLogs.last24h")},{value:"7d",label:e("webhookLogs.last7d")},{value:"30d",label:e("webhookLogs.last30d")},{value:"all",label:e("webhookLogs.allTime")}],[e]),H=(0,m.useCallback)(async(c=!1,k=!1)=>{k?J(!0):U(!0),P("");let Q=c?g.current.length:0,te=We(N,Q),h=new URLSearchParams(te);h.delete("limit"),h.delete("offset");try{let[F,ne]=await Promise.all([A(`/api/trigger-logs?${te}`),c?Promise.resolve(null):A(`/api/trigger-logs/summary?${h}`)]);if(!s.current)return;if(F.status!==200)throw new Error(String(F.body?.error||F.status));let S=Array.isArray(F.body?.logs)?F.body.logs:[],ae=c?[...g.current,...S]:S;g.current=ae,I(ae),Z(Number(F.body?.total??S.length)),X(F.body?.hasMore===!0),c||(E(ne?.status===200?ne.body?.summary??Ne:Ne),r(se=>S.some(we=>we.triggerId===se)?se:S[0]?.triggerId??null))}catch(F){s.current&&P(F?.message||e("webhookLogs.loadFailed"))}finally{s.current&&(U(!1),J(!1))}},[N,e]);(0,m.useEffect)(()=>(s.current=!0,A("/api/connectors").then(c=>{s.current&&c.status===200&&L(Array.isArray(c.body?.connectors)?c.body.connectors:[])}),()=>{s.current=!1}),[]),(0,m.useEffect)(()=>{let c=setTimeout(()=>{H(!1)},N.query?260:0);return()=>clearTimeout(c)},[N,H]),(0,m.useEffect)(()=>{let c=setInterval(()=>{H(!1,!0)},15e3);return()=>clearInterval(c)},[H]);async function ye(){!u||!await ue(JSON.stringify(u,null,2),e("webhookLogs.copyJson"))||(ee(!0),setTimeout(()=>s.current&&ee(!1),1200))}let ke=u?.request?.payloadOmittedReason==="disabled"?e("webhookLogs.payloadDisabled"):u?.request?.payloadOmittedReason==="too_large"?e("webhookLogs.payloadTooLarge"):e("webhookLogs.payloadUnavailable"),z=(0,n.jsxs)(n.Fragment,{children:[t.embedded?null:(0,n.jsxs)("div",{className:"page-heading",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{className:"eyebrow",children:e("nav.connectors")}),(0,n.jsx)("h1",{children:e("nav.webhookLogs")}),(0,n.jsx)("p",{className:"webhook-log-heading-copy",children:e("webhookLogs.subtitle")})]}),(0,n.jsxs)("div",{className:"page-heading-actions",children:[(0,n.jsxs)("span",{className:`webhook-log-live${v?" refreshing":""}`,children:[(0,n.jsx)("i",{}),e("webhookLogs.autoRefresh")]}),(0,n.jsx)("a",{className:"button page-primary-action",href:"#/connectors",children:e("webhookLogs.manage")})]})]}),(0,n.jsxs)("section",{className:"webhook-log-metrics","aria-label":e("webhookLogs.summary"),children:[(0,n.jsx)(me,{label:e("webhookLogs.total"),value:y.total,hint:e("webhookLogs.filteredRange")}),(0,n.jsx)(me,{label:e("webhookLogs.successRate"),value:`${y.successRate.toFixed(y.successRate%1?1:0)}%`,tone:"ok",hint:`${y.ok} ${e("webhookLogs.calls")}`}),(0,n.jsx)(me,{label:e("webhookLogs.failures"),value:y.error,tone:y.error?"error":void 0,hint:y.error?e("webhookLogs.needsReview"):e("webhookLogs.noFailures")}),(0,n.jsx)(me,{label:e("webhookLogs.p95"),value:ge(y.p95DurationMs),hint:`${e("webhookLogs.average")} ${ge(y.avgDurationMs)}`})]}),(0,n.jsxs)("form",{className:"filters dashboard-toolbar webhook-log-toolbar",onSubmit:c=>c.preventDefault(),children:[(0,n.jsx)("input",{type:"search",name:"q","aria-label":e("webhookLogs.search"),placeholder:e("webhookLogs.searchPlaceholder"),value:N.query,onChange:c=>{let k=c.currentTarget.value;O(Q=>({...Q,query:k}))}}),(0,n.jsx)(Ie,{id:"webhook-log-connector",label:e("webhookLogs.connector"),value:N.connectorId,options:oe,onChange:c=>O(k=>({...k,connectorId:c}))}),(0,n.jsx)(Ie,{id:"webhook-log-status",label:e("webhookLogs.status"),value:N.status,options:B,onChange:c=>O(k=>({...k,status:c}))}),(0,n.jsx)(Ie,{id:"webhook-log-window",label:e("webhookLogs.timeRange"),value:N.timeWindow,options:fe,onChange:c=>O(k=>({...k,timeWindow:c}))}),(0,n.jsx)("button",{type:"button",className:"ghost webhook-log-refresh",disabled:v,onClick:()=>{H(!1,!0)},children:e("webhookLogs.refresh")})]}),q?(0,n.jsxs)("p",{className:"err webhook-log-error",children:[e("webhookLogs.loadFailed"),": ",q]}):null,(0,n.jsxs)("section",{className:"webhook-log-workspace",children:[(0,n.jsxs)("article",{className:"card webhook-log-list-panel",children:[(0,n.jsx)("header",{className:"webhook-log-panel-head",children:(0,n.jsxs)("div",{children:[(0,n.jsx)("strong",{children:e("webhookLogs.records")}),(0,n.jsx)("span",{children:e("webhookLogs.matching",{count:Y})})]})}),R&&!f.length?(0,n.jsx)(ie,{label:e("webhookLogs.loading"),compact:!0}):null,!R&&!f.length?(0,n.jsxs)("div",{className:"webhook-log-empty",children:[(0,n.jsx)("span",{"aria-hidden":"true",children:"\u25CE"}),(0,n.jsx)("strong",{children:e("webhookLogs.empty")}),(0,n.jsx)("p",{children:e("webhookLogs.emptyHint")})]}):null,(0,n.jsx)("div",{className:"webhook-log-list",role:"listbox","aria-label":e("webhookLogs.records"),children:f.map(c=>{let k=u?.triggerId===c.triggerId;return(0,n.jsxs)("button",{type:"button",role:"option","aria-selected":k,className:`webhook-log-row${k?" active":""}`,onClick:()=>r(c.triggerId),children:[(0,n.jsx)("span",{className:`webhook-log-status-dot ${c.status}`,"aria-hidden":"true"}),(0,n.jsxs)("span",{className:"webhook-log-row-main",children:[(0,n.jsxs)("span",{className:"webhook-log-row-title",children:[(0,n.jsx)("strong",{children:T.get(c.connectorId||"")||c.connectorId||e("webhookLogs.unknownConnector")}),(0,n.jsx)("code",{children:c.request?.method||"POST"})]}),(0,n.jsxs)("span",{className:"webhook-log-row-meta",children:[(0,n.jsx)("span",{children:Se(c.createdAt)}),(0,n.jsx)("span",{children:c.errorCode||c.action})]})]}),(0,n.jsxs)("span",{className:"webhook-log-row-result",children:[(0,n.jsx)("b",{className:c.status,children:c.response?.httpStatus??(c.status==="ok"?"2xx":"ERR")}),(0,n.jsx)("small",{children:ge(c.response?.durationMs)})]})]},`${c.triggerId}-${c.createdAt}`)})}),$?(0,n.jsx)("button",{type:"button",className:"ghost webhook-log-more",disabled:R,onClick:()=>{H(!0)},children:e("webhookLogs.loadMore")}):null]}),(0,n.jsx)("article",{className:"card webhook-log-detail-panel",children:u?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("header",{className:"webhook-log-detail-head",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{className:`webhook-log-result-pill ${u.status}`,children:u.status==="ok"?e("webhookLogs.success"):e("webhookLogs.failed")}),(0,n.jsx)("h2",{children:T.get(u.connectorId||"")||u.connectorId||e("webhookLogs.unknownConnector")}),(0,n.jsxs)("p",{children:[Se(u.createdAt)," \xB7 ",u.request?.method||"POST"," ",u.request?.path||"/webhook/\u2026"]})]}),(0,n.jsx)("button",{type:"button",className:"ghost",onClick:()=>{ye()},children:e(K?"webhookLogs.copied":"webhookLogs.copyJson")})]}),u.error?(0,n.jsxs)("div",{className:"webhook-log-failure",children:[(0,n.jsx)("strong",{children:u.errorCode||e("webhookLogs.failureReason")}),(0,n.jsx)("span",{children:u.error})]}):null,(0,n.jsxs)("section",{className:"webhook-log-detail-section",children:[(0,n.jsx)("h3",{children:e("webhookLogs.overview")}),(0,n.jsxs)("dl",{className:"webhook-log-facts",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:e("webhookLogs.httpStatus")}),(0,n.jsx)("dd",{children:u.response?.httpStatus??"\u2014"})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:e("webhookLogs.duration")}),(0,n.jsx)("dd",{children:ge(u.response?.durationMs)})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:e("webhookLogs.action")}),(0,n.jsx)("dd",{children:u.action})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:e("webhookLogs.bodySize")}),(0,n.jsx)("dd",{children:_e(u.request?.bodyBytes)})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:"Trigger ID"}),(0,n.jsx)("dd",{children:(0,n.jsx)("code",{children:u.triggerId})})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:"Request ID"}),(0,n.jsx)("dd",{children:(0,n.jsx)("code",{children:u.requestId||"\u2014"})})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:e("webhookLogs.remoteAddress")}),(0,n.jsx)("dd",{children:(0,n.jsx)("code",{children:u.request?.remoteAddress||"\u2014"})})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:e("webhookLogs.target")}),(0,n.jsx)("dd",{children:(0,n.jsx)("code",{children:u.target?.chatId||u.target?.sessionId||u.response?.chatId||"\u2014"})})]})]})]}),(0,n.jsxs)("section",{className:"webhook-log-detail-section",children:[(0,n.jsx)("h3",{children:e("webhookLogs.queryParams")}),(0,n.jsx)(Le,{value:u.request?.query,empty:e("webhookLogs.none")})]}),(0,n.jsxs)("section",{className:"webhook-log-detail-section",children:[(0,n.jsxs)("h3",{children:[e("webhookLogs.headers"),(0,n.jsx)("small",{children:e("webhookLogs.redacted")})]}),(0,n.jsx)(Le,{value:u.request?.headers,empty:e("webhookLogs.headersNotStored")})]}),(0,n.jsxs)("section",{className:"webhook-log-detail-section",children:[(0,n.jsxs)("h3",{children:[e("webhookLogs.payload"),(0,n.jsx)("small",{children:e("webhookLogs.redacted")})]}),u.request?.payloadStored?(0,n.jsx)(Le,{value:u.request.payload,empty:e("webhookLogs.none")}):(0,n.jsx)("p",{className:"webhook-log-detail-empty",children:ke})]}),(0,n.jsxs)("section",{className:"webhook-log-detail-section",children:[(0,n.jsx)("h3",{children:e("webhookLogs.routeTarget")}),(0,n.jsx)(Ue,{value:u.target})]})]}):(0,n.jsx)("div",{className:"webhook-log-empty",children:(0,n.jsx)("strong",{children:e("webhookLogs.selectRecord")})})})]})]});return t.embedded?(0,n.jsx)("section",{className:"webhook-logs-content webhook-logs-panel",children:z}):(0,n.jsx)("section",{className:"page webhook-logs-content webhook-logs-page",children:z})}var o=j(ce(),1);function Je(t,e){return t.map(s=>s.id===e.id?e:s)}var Re={name:"",botId:"",kind:"turn",workflowId:"",mode:"dynamic",chatId:"",manualChat:!1,manualChatId:"",allowChats:[],deduplicate:!1,dedup:"",instruction:"",topicMessageMode:"default",topicMessageText:"",suppressFinalOutput:!1,verify:"token",secret:"",storePayload:!0};function io(t,e){return{promptEnvelope:{sourceName:t.promptEnvelope?.sourceName||t.name,instruction:e}}}function Xe(t){return[{value:"turn",label:t("connectors.kindTurn")},{value:"workflow",label:t("connectors.kindWorkflowRetiring"),disabled:!0}]}function be(t){return`${location.origin}/webhook/${encodeURIComponent(t)}`}function pe(t){return(0,o.jsx)(de,{id:t.id,className:"connector-form-menu",ariaLabel:t.label,value:t.value,label:le(t.options,t.value),options:t.options,onChange:t.onChange})}function De(t){let e=(0,i.useRef)(null),[s,g]=(0,i.useState)(!1),[w,L]=(0,i.useState)(""),f=Array.isArray(t.value)?t.value:t.value?[t.value]:[],I=(0,i.useMemo)(()=>new Set(f),[f]),y=w.trim().toLocaleLowerCase(),E=(0,i.useMemo)(()=>y?t.groups.filter(d=>`${d.name} ${d.chatId}`.toLocaleLowerCase().includes(y)):t.groups,[y,t.groups]),N=t.multiple?f.length===0?t.allLabel||t.placeholder:t.selectedCountLabel(f.length):t.groups.find(d=>d.chatId===f[0])?.name||f[0]||t.placeholder;(0,i.useEffect)(()=>{if(!s)return;let d=r=>{e.current?.contains(r.target)||g(!1)};return document.addEventListener("pointerdown",d),()=>document.removeEventListener("pointerdown",d)},[s]);function O(d){if(!t.multiple){t.onChange(d),g(!1),L("");return}t.onChange(I.has(d)?f.filter(r=>r!==d):[...f,d])}return(0,o.jsxs)("div",{ref:e,className:`connector-group-picker${s?" open":""}`,children:[(0,o.jsxs)("button",{id:t.id,type:"button",className:"connector-group-picker-trigger","aria-label":t.label,"aria-haspopup":"listbox","aria-expanded":s,onClick:()=>g(d=>!d),children:[(0,o.jsx)("span",{className:f.length||t.multiple&&t.allLabel?"":"muted",children:N}),(0,o.jsx)("span",{className:"connector-group-picker-chevron","aria-hidden":"true"})]}),s?(0,o.jsxs)("div",{className:"connector-group-picker-popover",children:[(0,o.jsxs)("label",{className:"connector-group-search",htmlFor:`${t.id}-search`,children:[(0,o.jsx)("span",{className:"connector-group-search-icon","aria-hidden":"true"}),(0,o.jsx)("input",{id:`${t.id}-search`,type:"search",autoComplete:"off",autoFocus:!0,value:w,placeholder:t.searchPlaceholder,onChange:d=>L(d.currentTarget.value),onKeyDown:d=>{d.key==="Escape"&&(d.preventDefault(),g(!1))}})]}),(0,o.jsxs)("div",{className:"connector-group-options",role:"listbox","aria-label":t.label,"aria-multiselectable":t.multiple||void 0,children:[t.multiple&&t.allLabel&&!y?(0,o.jsxs)("button",{type:"button",className:`connector-group-option connector-group-option-all${f.length===0?" selected":""}`,role:"option","aria-selected":f.length===0,onClick:()=>t.onChange([]),children:[(0,o.jsx)("span",{className:"connector-group-check","aria-hidden":"true"}),(0,o.jsxs)("span",{children:[(0,o.jsx)("b",{children:t.allLabel}),(0,o.jsx)("small",{children:t.placeholder})]})]}):null,E.map(d=>{let r=I.has(d.chatId);return(0,o.jsxs)("button",{type:"button",className:`connector-group-option${r?" selected":""}`,role:"option","aria-selected":r,onClick:()=>O(d.chatId),children:[(0,o.jsx)("span",{className:"connector-group-check","aria-hidden":"true"}),(0,o.jsxs)("span",{children:[(0,o.jsx)("b",{children:d.name||d.chatId}),d.name?(0,o.jsx)("small",{children:d.chatId}):null]})]},d.chatId)}),E.length?null:(0,o.jsx)("p",{className:"connector-group-empty",children:t.emptyLabel})]})]}):null]})}function he(t,e){return t.filter(s=>s.bots.includes(e))}function Ke(t,e){let s=t.target.chatId||"",g=s&&he(e,t.target.botId).some(w=>w.chatId===s);return{name:t.name,botId:t.target.botId,kind:t.target.kind,workflowId:t.target.workflowId||"",mode:t.target.mode,chatId:g?s:"",manualChat:!!(s&&!g),manualChatId:g?"":s,allowChats:t.target.allowChats||[],deduplicate:!!t.lifecycleExtractors?.dedupKey,dedup:t.lifecycleExtractors?.dedupKey||"",instruction:t.promptEnvelope?.instruction||"",topicMessageMode:t.topicMessage?.mode||"default",topicMessageText:t.topicMessage?.text||"",suppressFinalOutput:t.suppressFinalOutput===!0,verify:t.verify?.type||"token",secret:"",storePayload:t.loggingPolicy?.storePayload!==!1}}function je(t){let e=_(),s=t.active==="webhooks",g=t.active==="logs";return(0,o.jsxs)("nav",{className:"connectors-subnav-slot connectors-subnav insight-tabs",role:"tablist","aria-label":e("nav.connectors"),children:[(0,o.jsx)("a",{href:"#/connectors",className:`itab${s?" on":""}`,role:"tab","aria-selected":s,children:e("connectors.tabWebhooks")}),(0,o.jsx)("a",{href:"#/connectors/logs",className:`itab${g?" on":""}`,role:"tab","aria-selected":g,children:e("connectors.tabLogs")})]})}function Ee(t){let e=_(),s=(0,i.useRef)(!1),g=(0,i.useRef)(null),w=(0,i.useRef)(null),[L,f]=(0,i.useState)([]),[I,y]=(0,i.useState)([]),[E,N]=(0,i.useState)([]),[O,d]=(0,i.useState)(!0),[r,R]=(0,i.useState)(Re),[U,v]=(0,i.useState)(null),[J,$]=(0,i.useState)(null),[X,Y]=(0,i.useState)(!1),[Z,q]=(0,i.useState)(!1),[P,K]=(0,i.useState)(null),[ee,T]=(0,i.useState)(null),[u,oe]=(0,i.useState)(null),B=(0,i.useMemo)(()=>he(I,r.botId),[I,r.botId]),fe=(0,i.useMemo)(()=>L.length?L.map(a=>({value:a.larkAppId,label:a.botName})):[{value:"",label:e("connectors.noOnlineBots")}],[L,e]),H=(0,i.useMemo)(()=>Xe(e),[e]),ye=(0,i.useMemo)(()=>[{value:"dynamic",label:e("connectors.modeDynamic")},{value:"fixed",label:e("connectors.modeFixed")},{value:"new-group",label:e("connectors.modeNewGroup")}],[e]),ke=(0,i.useMemo)(()=>[{value:"token",label:e("connectors.verifyToken")},{value:"hmac-sha256",label:e("connectors.verifyHmac")}],[e]),z=(0,i.useCallback)(a=>I.find(p=>p.chatId===a)?.name||a,[I]),c=(0,i.useCallback)((a,l)=>{R(p=>{let C=p.botId&&a.some(D=>D.larkAppId===p.botId)?p.botId:a[0]?.larkAppId??"",b=he(l,C),x=p.chatId&&b.some(D=>D.chatId===p.chatId)?p.chatId:b[0]?.chatId??"",G=new Set(b.map(D=>D.chatId));return{...p,botId:C,chatId:x,allowChats:p.allowChats.filter(D=>G.has(D))}})},[]),k=(0,i.useCallback)(async()=>{d(!0);try{let[a,l,p]=await Promise.all([A("/api/bots"),A("/api/connectors"),A("/api/groups")]);if(!s.current)return;let C=(a.body?.bots||[]).map(x=>({larkAppId:x.larkAppId,botName:x.botName||x.larkAppId})),b=(p.body?.chats||[]).map(x=>({chatId:x.chatId,name:x.name||"",bots:(x.memberBots||[]).filter(G=>G.inChat).map(G=>G.larkAppId)}));f(C),y(b),N(Array.isArray(l.body?.connectors)?l.body.connectors:[]),c(C,b)}finally{s.current&&d(!1)}},[c]);(0,i.useEffect)(()=>(s.current=!0,k(),()=>{s.current=!1,g.current&&clearTimeout(g.current)}),[k]),(0,i.useEffect)(()=>{let a=new Set(B.map(l=>l.chatId));R(l=>({...l,chatId:l.chatId&&a.has(l.chatId)?l.chatId:B[0]?.chatId??"",allowChats:l.allowChats.filter(p=>a.has(p))}))},[B]),(0,i.useEffect)(()=>{let a=w.current;if(a)if(Z){if(!a.open)try{a.showModal()}catch{}let l=a.querySelector(".connector-modal-body");l&&(l.scrollTop=0)}else a.open&&a.close()},[Z]),(0,i.useEffect)(()=>()=>{let a=w.current;a?.open&&a.close()},[]);function Q(a){return e(a==="fixed"?"connectors.modeLabelFixed":a==="new-group"?"connectors.modeLabelNewGroup":"connectors.modeLabelDynamic")}function te(a){return e(a==="workflow"?"connectors.kindLabelWorkflow":"connectors.kindLabelTurn")}function h(a){R(l=>({...l,...a}))}function F(){v(null),$(null),K(null),R(a=>{let l=a.botId||L[0]?.larkAppId||"";return{...Re,botId:l,chatId:he(I,l)[0]?.chatId||""}}),q(!0)}function ne(a){v(null),$(null),T(null),K(a),R(Ke(a,I)),q(!0)}function S(){X||(q(!1),v(null),$(null),K(null))}async function ae(){v(null),$(null);let a=r.name.trim(),l=r.botId;if(!a){v({text:e("connectors.errName"),error:!0});return}if(!l){v({text:e("connectors.errBot"),error:!0});return}if(r.kind==="workflow"){v({text:e("connectors.errLegacyWorkflowRetired"),error:!0});return}let p=r.topicMessageText.trim();if(r.topicMessageMode==="custom"&&!p){v({text:e("connectors.errTopicMessage"),error:!0});return}let C={name:a,enabled:P?.enabled??!0,target:{kind:r.kind,mode:r.mode,botId:l},promptEnvelope:{sourceName:a,instruction:r.instruction.trim()},topicMessage:{mode:r.topicMessageMode,...r.topicMessageMode==="custom"?{text:p}:{}},suppressFinalOutput:r.suppressFinalOutput,verify:{type:r.verify},loggingPolicy:{storePayload:r.storePayload,storeHeaders:!0,retentionDays:14}};if(r.mode==="fixed"){let b=r.manualChat?r.manualChatId.trim():r.chatId;if(!b){v({text:e("connectors.errChat"),error:!0});return}C.target.chatId=b}else r.mode==="dynamic"&&(C.target.allowChats=r.allowChats);if(r.mode==="new-group"){let b=r.dedup.trim();if(r.deduplicate&&!b){v({text:e("connectors.errDedup"),error:!0});return}C.lifecycleExtractors=r.deduplicate?{dedupKey:b}:null}else C.lifecycleExtractors=null;r.secret.trim()&&(C.secret=r.secret.trim()),Y(!0),v({text:e(P?"connectors.saving":"connectors.creating")});try{let b=await V(P?"PUT":"POST",P?`/api/connectors/${encodeURIComponent(P.id)}`:"/api/connectors",C);if(!s.current)return;if((b.status===201||b.status===200)&&b.body?.ok){if(P){let ve=P.id,W=b.body.connector;N(Ce=>Je(Ce,W));let Te=b.body.secret??C.secret;if(Te){let Ce=b.body.webhookUrl||be(W.id),Ae=(W.verify?.type??"token")==="token",Me=W.target.mode==="dynamic",qe=Me?W.target.allowChats?.[0]||"<chatId>":"";v(null),$({name:a,mode:W.target.mode,chatId:W.target.chatId,url:Ce,secret:Te,isToken:Ae,isDynamic:Me,exampleChat:qe,rotated:!0}),await k();return}T({id:ve,text:e("connectors.updated")}),q(!1),K(null);return}let x=b.body.webhookUrl||be(b.body.connector.id),G=(b.body.connector?.verify?.type??"token")==="token",D=r.mode==="dynamic",He=D?C.target.allowChats?.[0]||"<chatId>":"";v(null),$({name:a,mode:r.mode,chatId:C.target.chatId,url:x,secret:b.body.secret,isToken:G,isDynamic:D,exampleChat:He}),R(ve=>({...ve,name:"",workflowId:"",manualChatId:"",dedup:"",secret:"",instruction:"",topicMessageMode:"default",topicMessageText:"",suppressFinalOutput:!1,allowChats:[],storePayload:!0})),await k()}else{let x=b.body?.error||b.status;v({text:e("connectors.createFailed",{error:String(x)}),error:!0})}}finally{s.current&&Y(!1)}}async function se(a){T({id:a.id,text:e(a.enabled?"connectors.disabling":"connectors.enabling")});let l=await V("PATCH",`/api/connectors/${encodeURIComponent(a.id)}`,{enabled:!a.enabled});if(s.current)if(l.status===200&&l.body?.ok)T(null),await k();else{let p=l.body?.error||l.status;T({id:a.id,text:e("connectors.toggleFailed",{error:String(p)}),error:!0})}}async function we(a){let l=a.loggingPolicy?.storePayload!==!1;T({id:a.id,text:e("connectors.saving")});let p=await V("PUT",`/api/connectors/${encodeURIComponent(a.id)}`,{loggingPolicy:{storePayload:!l,storeHeaders:a.loggingPolicy?.storeHeaders!==!1,retentionDays:a.loggingPolicy?.retentionDays??14}});if(s.current)if(p.status===200&&p.body?.ok)T(null),await k();else{let C=p.body?.error||p.status;T({id:a.id,text:e("connectors.saveFailed",{error:String(C)}),error:!0})}}async function Oe(a){if(!confirm(e("connectors.delConfirm")))return;T({id:a.id,text:e("connectors.deleting")});let l=await V("DELETE",`/api/connectors/${encodeURIComponent(a.id)}`);if(s.current)if(l.status===200&&l.body?.ok)T(null),await k();else{let p=l.body?.error||l.status;T({id:a.id,text:e("connectors.deleteFailed",{error:String(p)}),error:!0})}}function $e(a){ue(be(a.id),e("connectors.copy")).then(l=>{!l||!s.current||(oe(a.id),g.current&&clearTimeout(g.current),g.current=setTimeout(()=>{s.current&&oe(null)},1200))})}return(0,o.jsxs)("section",{className:"page connectors-page",children:[(0,o.jsxs)("div",{className:"page-heading",children:[(0,o.jsxs)("div",{children:[(0,o.jsx)("p",{className:"eyebrow",children:e("nav.connectors")}),(0,o.jsx)("h1",{children:e("nav.connectors")})]}),(0,o.jsx)("div",{className:"page-heading-actions",children:t.tab==="webhooks"?(0,o.jsx)(xe,{className:"page-primary-action connector-create-trigger",onClick:F,children:e("connectors.createTitle")}):(0,o.jsx)("a",{className:"button page-primary-action",href:"#/connectors",children:e("webhookLogs.manage")})})]}),(0,o.jsx)(je,{active:t.tab}),t.tab==="webhooks"?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("dialog",{ref:w,className:"connector-create-modal",onCancel:a=>{a.preventDefault(),S()},onClose:S,onClick:a=>{a.target===a.currentTarget&&S()},children:(0,o.jsxs)("article",{className:"connector-modal-card",children:[(0,o.jsxs)("header",{className:"connector-modal-header",children:[(0,o.jsx)("h3",{children:e(P?"connectors.editTitle":"connectors.createTitle")}),(0,o.jsx)("button",{type:"button",className:"connector-modal-close","aria-label":e("connectors.close"),title:e("connectors.close"),disabled:X,onClick:S,children:(0,o.jsx)("span",{"aria-hidden":"true",children:"\xD7"})})]}),(0,o.jsx)("div",{className:"connector-modal-body",children:J?(0,o.jsx)(ze,{created:J,groupName:z}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("div",{className:"cn-form",children:[(0,o.jsxs)("label",{className:"cn-field",htmlFor:"cn-name",children:[(0,o.jsx)(M,{children:e("connectors.fName")}),(0,o.jsx)("input",{id:"cn-name",value:r.name,onChange:a=>h({name:a.currentTarget.value}),placeholder:e("connectors.fNamePh")})]}),(0,o.jsxs)("div",{className:"cn-field",children:[(0,o.jsx)(M,{children:e("connectors.fBot")}),(0,o.jsx)(pe,{id:"cn-bot",label:e("connectors.fBot"),value:r.botId,options:fe,onChange:a=>h({botId:a})})]}),(0,o.jsxs)("div",{className:"cn-field",children:[(0,o.jsx)(M,{children:e("connectors.fKind")}),(0,o.jsx)(pe,{id:"cn-kind",label:e("connectors.fKind"),value:r.kind,options:H,onChange:a=>h({kind:a})})]}),r.kind==="workflow"?(0,o.jsxs)("label",{className:"cn-field",htmlFor:"cn-wf",children:[(0,o.jsx)(M,{children:e("connectors.fWf")}),(0,o.jsx)("input",{id:"cn-wf",value:r.workflowId,onChange:a=>h({workflowId:a.currentTarget.value}),placeholder:"workflowId"})]}):null,(0,o.jsxs)("div",{className:"cn-field",children:[(0,o.jsx)(M,{children:e("connectors.fMode")}),(0,o.jsx)(pe,{id:"cn-mode",label:e("connectors.fMode"),value:r.mode,options:ye,onChange:a=>h({mode:a})})]}),r.mode==="fixed"?(0,o.jsxs)("div",{className:"cn-field cn-field-wide",children:[(0,o.jsx)(M,{children:e("connectors.fFixedChat")}),(0,o.jsxs)("div",{className:"connector-chat-control",children:[r.manualChat?(0,o.jsx)("input",{id:"cn-chat",value:r.manualChatId,onChange:a=>h({manualChatId:a.currentTarget.value}),placeholder:e("connectors.fChatManualPh")}):(0,o.jsx)(De,{id:"cn-chat-sel",label:e("connectors.fFixedChat"),groups:B,value:r.chatId,placeholder:e("connectors.groupPickerPlaceholder"),searchPlaceholder:e("connectors.groupSearchPlaceholder"),emptyLabel:e("connectors.groupNoMatches"),selectedCountLabel:a=>e("connectors.groupSelectedCount",{count:a}),onChange:a=>h({chatId:a})}),(0,o.jsx)("button",{type:"button",className:"ghost connector-inline-link",onClick:()=>h({manualChat:!r.manualChat}),children:r.manualChat?e("connectors.chatListLink"):e("connectors.chatManualLink")})]})]}):r.mode==="dynamic"?(0,o.jsxs)("div",{className:"cn-field cn-field-wide",children:[(0,o.jsxs)(M,{help:e("connectors.allowHint"),children:[e("connectors.fAllow"),(0,o.jsx)("span",{className:"muted cn-optional",children:e("connectors.optional")})]}),(0,o.jsx)(De,{id:"cn-allow-chats",label:e("connectors.fAllow"),groups:B,value:r.allowChats,multiple:!0,allLabel:e("connectors.allowAll"),placeholder:e("connectors.allowAllHint"),searchPlaceholder:e("connectors.groupSearchPlaceholder"),emptyLabel:e("connectors.groupNoMatches"),selectedCountLabel:a=>e("connectors.groupSelectedCount",{count:a}),onChange:a=>h({allowChats:a})})]}):null,r.mode==="dynamic"?(0,o.jsx)("div",{className:"cn-field-wide",children:(0,o.jsx)("div",{className:"muted connector-form-hint",dangerouslySetInnerHTML:{__html:e("connectors.dynamicHint")}})}):null,r.mode==="new-group"?(0,o.jsxs)("div",{className:"cn-field cn-field-wide connector-new-group-config",children:[(0,o.jsx)(M,{children:e("connectors.newGroupStrategy")}),(0,o.jsxs)("div",{className:"connector-strategy-options",role:"radiogroup","aria-label":e("connectors.newGroupStrategy"),children:[(0,o.jsxs)("button",{type:"button",role:"radio","aria-checked":!r.deduplicate,className:`connector-strategy-option${r.deduplicate?"":" selected"}`,onClick:()=>h({deduplicate:!1}),children:[(0,o.jsx)("span",{className:"connector-strategy-radio","aria-hidden":"true"}),(0,o.jsxs)("span",{children:[(0,o.jsx)("b",{children:e("connectors.newGroupFresh")}),(0,o.jsx)("small",{children:e("connectors.newGroupFreshHint")})]})]}),(0,o.jsxs)("button",{type:"button",role:"radio","aria-checked":r.deduplicate,className:`connector-strategy-option${r.deduplicate?" selected":""}`,onClick:()=>h({deduplicate:!0}),children:[(0,o.jsx)("span",{className:"connector-strategy-radio","aria-hidden":"true"}),(0,o.jsxs)("span",{children:[(0,o.jsx)("b",{children:e("connectors.newGroupReuse")}),(0,o.jsx)("small",{children:e("connectors.newGroupReuseHint")})]})]})]}),r.deduplicate?(0,o.jsxs)("label",{className:"connector-dedup-field",htmlFor:"cn-dedup",children:[(0,o.jsx)(M,{help:(0,o.jsx)("span",{dangerouslySetInnerHTML:{__html:e("connectors.dedupHint")}}),children:e("connectors.fDedup")}),(0,o.jsx)("input",{id:"cn-dedup",value:r.dedup,onChange:a=>h({dedup:a.currentTarget.value}),placeholder:e("connectors.fDedupPh")})]}):null,(0,o.jsx)("p",{className:"connector-new-group-note",children:e("connectors.newGroupNotice")})]}):null,(0,o.jsxs)("label",{className:"cn-field cn-field-wide",htmlFor:"cn-instruction",children:[(0,o.jsxs)(M,{help:e("connectors.fInstructionPh"),children:[e("connectors.fInstruction"),(0,o.jsx)("span",{className:"muted cn-optional",children:e("connectors.optional")})]}),(0,o.jsx)("textarea",{id:"cn-instruction",rows:3,value:r.instruction,onChange:a=>h({instruction:a.currentTarget.value}),placeholder:e("connectors.fInstructionPh")})]}),(0,o.jsxs)("div",{className:"cn-field cn-field-wide connector-topic-message-config",children:[(0,o.jsx)(M,{help:e("connectors.topicMessageHint"),children:e("connectors.topicMessage")}),(0,o.jsx)("div",{className:"connector-topic-message-options",role:"radiogroup","aria-label":e("connectors.topicMessage"),children:["default","custom","none"].map(a=>(0,o.jsxs)("button",{type:"button",role:"radio","aria-checked":r.topicMessageMode===a,className:`connector-topic-message-option${r.topicMessageMode===a?" selected":""}`,onClick:()=>h({topicMessageMode:a}),children:[(0,o.jsx)("span",{className:"connector-strategy-radio","aria-hidden":"true"}),(0,o.jsxs)("span",{children:[(0,o.jsx)("b",{children:e(`connectors.topicMessage${a==="default"?"Default":a==="custom"?"Custom":"None"}`)}),(0,o.jsx)("small",{children:e(`connectors.topicMessage${a==="default"?"DefaultHint":a==="custom"?"CustomHint":"NoneHint"}`)})]})]},a))}),r.topicMessageMode==="custom"?(0,o.jsxs)("label",{className:"connector-topic-message-input",htmlFor:"cn-topic-message",children:[(0,o.jsx)("input",{id:"cn-topic-message",type:"text",maxLength:200,value:r.topicMessageText,onChange:a=>h({topicMessageText:a.currentTarget.value}),placeholder:e("connectors.topicMessageCustomPh")}),(0,o.jsxs)("small",{children:[e("connectors.topicMessageCustomHelp"),(0,o.jsxs)("span",{children:[Array.from(r.topicMessageText).length,"/200"]})]})]}):(0,o.jsx)("p",{className:`connector-topic-message-preview${r.topicMessageMode==="none"?" muted":""}`,children:r.topicMessageMode==="none"?e("connectors.topicMessageNonePreview"):e("connectors.topicMessagePreview",{source:r.name.trim()||e("connectors.topicMessageSourceFallback")})})]}),(0,o.jsxs)("label",{className:"connector-log-policy cn-field-wide",htmlFor:"cn-store-payload",children:[(0,o.jsx)("input",{id:"cn-store-payload",type:"checkbox",checked:r.storePayload,onChange:a=>h({storePayload:a.currentTarget.checked})}),(0,o.jsxs)("span",{children:[(0,o.jsx)("strong",{children:e("connectors.storePayload")}),(0,o.jsx)("small",{children:e("connectors.storePayloadHint")})]})]}),(0,o.jsxs)("label",{className:"connector-log-policy cn-field-wide",htmlFor:"cn-suppress-final",children:[(0,o.jsx)("input",{id:"cn-suppress-final",type:"checkbox",checked:r.suppressFinalOutput,onChange:a=>h({suppressFinalOutput:a.currentTarget.checked})}),(0,o.jsxs)("span",{children:[(0,o.jsx)("strong",{children:e("connectors.suppressFinalOutput")}),(0,o.jsx)("small",{children:e("connectors.suppressFinalOutputHint")})]})]}),(0,o.jsxs)("div",{className:"cn-field",children:[(0,o.jsx)(M,{children:e("connectors.fVerify")}),(0,o.jsx)(pe,{id:"cn-verify",label:e("connectors.fVerify"),value:r.verify,options:ke,onChange:a=>h({verify:a})})]}),(0,o.jsxs)("label",{className:"cn-field",htmlFor:"cn-secret",children:[(0,o.jsx)(M,{children:e("connectors.fSecret")}),(0,o.jsx)("input",{id:"cn-secret",value:r.secret,onChange:a=>h({secret:a.currentTarget.value}),placeholder:e(P?"connectors.fSecretEditPh":"connectors.fSecretPh")})]})]}),U?(0,o.jsx)("p",{className:`connector-create-message${U.error?" err":""}`,children:U.text}):null]})}),(0,o.jsx)("footer",{className:"connector-modal-actions",children:J?(0,o.jsx)("button",{type:"button",className:"primary",onClick:S,children:e("connectors.close")}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("button",{type:"button",disabled:X,onClick:S,children:e("connectors.cancel")}),(0,o.jsx)("button",{id:"cn-create",type:"button",className:"primary",disabled:X,onClick:()=>{ae()},children:e(P?"connectors.btnSave":"connectors.btnCreate")})]})})]})}),(0,o.jsx)("section",{className:"overview-block connector-section connector-list-section",children:(0,o.jsx)("div",{className:"card connector-list-card",children:O?(0,o.jsx)(ie,{className:"connector-list-loading",label:e("connectors.loading"),compact:!0}):(0,o.jsx)(Qe,{connectors:E,bots:L,copiedId:u,editMsg:ee,groupName:z,modeLabel:Q,kindLabel:te,onCopy:$e,onEdit:ne,onToggle:a=>{se(a)},onTogglePayloadLogging:a=>{we(a)},onDelete:a=>{Oe(a)}})})})]}):(0,o.jsx)(Fe,{embedded:!0})]})}function ze(t){let e=_(),s=t.created,g=s.isDynamic?`${s.url}?chatId=${s.exampleChat}`:s.url,w=s.exampleChat!=="<chatId>"?`\uFF08${t.groupName(s.exampleChat)}\uFF09`:"";return(0,o.jsx)("div",{className:"connector-created-wrap",children:(0,o.jsxs)("div",{className:"card connector-created-card",children:[(0,o.jsxs)("p",{className:"connector-created-title ok",children:[e(s.rotated?"connectors.rotatedPrefix":"connectors.createdPrefix",{name:s.name}),s.mode==="fixed"&&s.chatId?(0,o.jsxs)("span",{className:"muted",children:[" \xB7 ",e("connectors.createdDest",{name:t.groupName(s.chatId)})]}):null]}),(0,o.jsxs)("p",{className:"connector-created-line",children:[(0,o.jsx)("span",{className:"muted",children:e("connectors.webhookUrl")}),(0,o.jsx)("code",{children:s.url})]}),s.secret?(0,o.jsxs)("p",{className:"connector-created-line",children:[(0,o.jsxs)("span",{className:"muted",children:[s.isToken?e("connectors.tokenLabel"):e("connectors.signLabel"),e("connectors.secretOnce")]}),(0,o.jsx)("code",{children:s.secret})]}):null,s.isToken&&s.isDynamic?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{className:"muted connector-created-help",children:e("connectors.usageDynamicLede",{gn:w})}),(0,o.jsx)("pre",{children:(0,o.jsx)("code",{children:`curl -X POST '${g}' -H 'content-type: application/json' -d '{}'`})}),(0,o.jsx)("p",{className:"muted connector-created-help",dangerouslySetInnerHTML:{__html:e("connectors.usageDynamicNote")}})]}):s.isToken?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{className:"muted connector-created-help",children:e("connectors.usageTokenLede")}),(0,o.jsx)("pre",{children:(0,o.jsx)("code",{children:`curl -X POST '${g}' -H 'content-type: application/json' -d '{}'`})}),(0,o.jsx)("p",{className:"muted connector-created-help",dangerouslySetInnerHTML:{__html:e("connectors.usageTokenNote")}})]}):(0,o.jsx)("p",{className:"muted connector-created-help",dangerouslySetInnerHTML:{__html:e("connectors.usageHmac")+(s.isDynamic?e("connectors.usageHmacDynamic"):"")}})]})})}function Qe(t){let e=_();return t.connectors.length?(0,o.jsx)(o.Fragment,{children:t.connectors.map(s=>{let g=t.bots.find(N=>N.larkAppId===s.target.botId),w=be(s.id),L=(s.verify?.type??"token")==="token",f=e(L?"connectors.badgeToken":"connectors.badgeSign"),I=s.target.mode==="fixed"&&s.target.chatId?e("connectors.dest",{name:t.groupName(s.target.chatId)}):"",y=t.editMsg?.id===s.id?t.editMsg:null,E=t.copiedId===s.id;return(0,o.jsxs)("div",{className:"card connector-item-card",children:[(0,o.jsxs)("div",{className:"connector-item-head",children:[(0,o.jsxs)("div",{className:"connector-item-main",children:[(0,o.jsxs)("div",{className:"connector-item-title",children:[(0,o.jsx)("b",{children:s.name}),(0,o.jsx)("span",{className:s.enabled?"connector-status-pill ok":"connector-status-pill muted",children:s.enabled?e("connectors.enabled"):e("connectors.disabled")})]}),(0,o.jsxs)("div",{className:"connector-item-meta",children:[(0,o.jsx)("span",{children:g?.botName||s.target.botId}),(0,o.jsx)("span",{children:t.kindLabel(s.target.kind)}),(0,o.jsx)("span",{children:t.modeLabel(s.target.mode)}),I?(0,o.jsx)("span",{children:I}):null,(0,o.jsx)("span",{children:f}),(0,o.jsx)("span",{children:s.loggingPolicy?.storePayload!==!1?e("connectors.payloadLogged",{days:s.loggingPolicy?.retentionDays??14}):e("connectors.metadataOnly")})]})]}),(0,o.jsx)("button",{className:`ghost connector-copy-button${E?" copied":""}`,type:"button",onClick:()=>t.onCopy(s),children:e(E?"connectors.copied":"connectors.copy")})]}),(0,o.jsxs)("div",{className:"connector-url-row",children:[(0,o.jsx)("span",{className:"muted",children:e("connectors.webhookUrl")}),(0,o.jsxs)("code",{children:[w,L?"/<token>":""]})]}),L?(0,o.jsx)("div",{className:"muted connector-item-note",dangerouslySetInnerHTML:{__html:e("connectors.tokenHint")}}):null,s.target.kind==="workflow"?(0,o.jsx)("div",{className:"muted connector-item-note",children:e("connectors.legacyWorkflowNote")}):null,s.target.mode==="dynamic"?(0,o.jsx)("div",{className:"muted connector-item-note",dangerouslySetInnerHTML:{__html:e("connectors.dynamicReqHint")}}):null,s.promptEnvelope?.instruction?(0,o.jsxs)("div",{className:"muted connector-item-note",children:[e("connectors.instructionPrefix"),s.promptEnvelope.instruction]}):null,(0,o.jsx)("div",{className:"muted connector-item-note",children:s.topicMessage?.mode==="none"?e("connectors.topicMessageListNone"):s.topicMessage?.mode==="custom"?e("connectors.topicMessageListCustom",{text:s.topicMessage.text||""}):e("connectors.topicMessageListDefault")}),y?(0,o.jsx)("div",{className:y.error?"err connector-item-note":"muted connector-item-note",children:y.text}):null,(0,o.jsxs)("div",{className:"connector-item-actions",children:[(0,o.jsx)("button",{className:"ghost",type:"button",onClick:()=>t.onEdit(s),children:e("connectors.btnEdit")}),(0,o.jsx)("button",{className:"ghost",type:"button",onClick:()=>t.onTogglePayloadLogging(s),children:s.loggingPolicy?.storePayload!==!1?e("connectors.btnDisablePayloadLog"):e("connectors.btnEnablePayloadLog")}),(0,o.jsx)("button",{className:"ghost",type:"button",onClick:()=>t.onToggle(s),children:s.enabled?e("connectors.btnDisable"):e("connectors.btnEnable")}),(0,o.jsx)("button",{className:"ghost",type:"button",onClick:()=>t.onDelete(s),children:e("connectors.btnDel")})]})]},s.id)})}):(0,o.jsx)("p",{className:"muted connector-list-empty",children:e("connectors.empty")})}function uo(t){return re(t,(0,o.jsx)(Ee,{tab:"webhooks"}))}function go(t){return re(t,(0,o.jsx)(Ee,{tab:"logs"}))}export{io as buildConnectorInstructionUpdateBody,Xe as buildConnectorKindOptions,go as renderConnectorsLogsPage,uo as renderConnectorsPage,Je as replaceConnectorById};
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{a as Lt}from"./chunk-FDZ7WOBW.js";import{a as At,c as Pt,h as Bt}from"./chunk-XJ7BGPJH.js";import{a as $n,c as Et,f as Xe}from"./chunk-AGCPF6MT.js";import{a as Mt}from"./chunk-6ALR252E.js";import{a as bn}from"./chunk-ZJVTGU5X.js";import{a as xt,c as Rt}from"./chunk-KOPISPHN.js";import{c as We,g as Nt,q as en}from"./chunk-5CJMHTT4.js";import{B as gn,D as It,F as fe,G as Ke,H as ye,J as pn,a as Ge,f as gt,g as Bn,h as pt,i as ft,j as bt,k as ht,l as On,m as yt,n as kt,o as wt,p as Ct,q as Dn,r as vt,s as St,t as $e,u as o,v as Je,w as He,z as _e}from"./chunk-M6BHWQFO.js";import{a as Tt}from"./chunk-SYC6D5XU.js";import{a as mt,b as Fs,d as fn}from"./chunk-5THX4DI2.js";import{c as ze}from"./chunk-7SZRL6FY.js";var c=ze(mt(),1),Sn=ze(Fs(),1);var Hn=[24,72,168],Us=new Set(Hn);function _n(e){let t=e==="7d"?168:Number(e);return!Number.isFinite(t)||!Us.has(t)?null:t}function js(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function zs(e,t=Date.now()){return t-e*60*60*1e3}function Gs(e,t,s=Date.now()){if(!e.sessionId||e.status!=="idle"||e.locked||e.pendingRepo||e.tuiPromptActive||e.agentAttention)return!1;let a=js(e.lastMessageAt);return a!==null&&a<zs(t,s)}function Ot(e,t,s=Date.now()){return e.filter(a=>Gs(a,t,s))}var Dt={1:"claude-code",2:"aiden",3:"coco",4:"codex",5:"cursor",6:"gemini",7:"opencode",8:"antigravity",9:"mtr",10:"hermes",11:"codex-app",12:"mira",13:"seed",14:"traex",15:"pi",16:"copilot",17:"oh-my-pi",18:"relay",19:"mir",20:"kimi",21:"genius",22:"grok",23:"kiro-cli",24:"riff",25:"reasonix"},Go=new Set(Object.values(Dt)),Js={"claude-code":"Claude",aiden:"Aiden",coco:"CoCo",codex:"Codex",cursor:"Cursor",gemini:"Gemini",genius:"Genius",opencode:"OpenCode",antigravity:"Antigravity",mtr:"MTR",hermes:"Hermes","codex-app":"Codex App",mira:"Mira",seed:"Seed",traex:"TRAE",pi:"Pi",copilot:"Copilot","oh-my-pi":"Oh My Pi",relay:"Relay",mir:"Mir CLI",kimi:"Kimi",grok:"Grok Build","kiro-cli":"Kiro",riff:"Riff",reasonix:"Reasonix"},$t=Object.values(Dt).map(e=>({id:e,label:Js[e]??e}));function hn(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Kn(e){let t=hn(e);return t===null?"-":t.toLocaleString("en-US")}function Ht(e,t){let s=String(e??"").replace(/\s+/g," ").trim();return s?s.length>t?`${s.slice(0,t-1)}\u2026`:s:""}function _t(e,t){let s=String(e??"").replace(/\r\n?/g,`
|
|
2
|
-
`).replace(/[^\S\n]+\n/g,`
|
|
3
|
-
`).replace(/\n{3,}/g,`
|
|
4
|
-
|
|
5
|
-
`).replace(/^\n+/,"").replace(/\s+$/,"");return s?s.length>t?`${s.slice(0,t-1)}\u2026`:s:""}function Ft(e){let t=_t(e.previewUserFullText??e.previewUserText??"",4e3),s=e.previewBotState==="replied"?_t(e.previewBotFullText??e.previewBotText??"",4e3):"";return{userText:Ht(t,120),userFullText:t,botText:Ht(s,220),botFullText:s}}var Ut={open:!1,suppressFocusOpen:!1};function jt(e,t){switch(t){case"open":return{open:!0,suppressFocusOpen:!1};case"close":return{open:!1,suppressFocusOpen:!1};case"toggle":return{open:!e.open,suppressFocusOpen:!1};case"focus":return e.suppressFocusOpen?{open:e.open,suppressFocusOpen:!1}:{open:!0,suppressFocusOpen:!1};case"escape-refocus":return{open:!1,suppressFocusOpen:!0};default:return e}}var we=[...$t.map(e=>e.id),"unknown"],Fn=[{id:"needs-you",labelKey:"sessions.board.needsYou",hintKey:"sessions.board.needsYouHint"},{id:"starting",labelKey:"sessions.board.starting",hintKey:"sessions.board.startingHint"},{id:"working",labelKey:"sessions.board.working",hintKey:"sessions.board.workingHint"},{id:"idle",labelKey:"sessions.board.idle",hintKey:"sessions.board.idleHint"}];function Un(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}var zt=["starting","working","idle","dormant","analyzing","stalled","active","limited","closed"];function nn(e){let t=String(e??"unknown"),s=`sessions.status.${t}`,a=o(s);return a===s?t:a}function Gt(e){let t=0,s=0,a=0;for(let r of e)r?.status!=="closed"&&(t++,typeof r?.workerPid=="number"&&s++,r?.status==="dormant"&&a++);return{logical:t,resident:s,dormant:a}}function jn(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function Kt(e){return e?.chatType==="p2p"?o("sessions.directChat"):o("sessions.groupChat")}function Ws(e){let t=o("sessions.directChat"),s=String(e?.chatDisplayName??"").trim()||String(e?.chatId??"").trim()||o("sessions.chatUnknown"),a=fe(e);return`${t} \xB7 ${s} - ${a}`}function Fe(e){let t=String(e?.chatId??"").trim();if(e?.chatType==="p2p")return Ws(e);let s=Ke(e),a=e?.chatType==="p2p"?(()=>{let r=String(e?.botName??"").trim();return r?` \xB7 ${r}`:""})():"";return s?`${Kt(e)} \xB7 ${s}${a}`:t?`${Kt(e)} \xB7 ${t}${a}`:o("sessions.chatUnknown")}function zn(e,t=Ke){return!!String(e?.chatId??"").trim()&&!t(e)}function Gn(e){let t=Fe(e),s=String(e?.chatId??"").trim();return s&&!t.includes(s)?`${t} \xB7 ${s}`:t}function Jt(e){return`${JSON.stringify(e)} ${Fe(e)} ${Gn(e)}`.toLowerCase()}function ke(e){return typeof e=="string"?e.trim():""}function Wt(e){let t=ke(e?.chatId),s=ke(e?.rootMessageId);return e?.scope==="chat"?t?"chat":"session":t&&s?"thread":"session"}function Jn(e){let t=ke(e?.chatId),s=ke(e?.rootMessageId),a=Wt(e);return a==="thread"?`thread:${encodeURIComponent(t)}:${encodeURIComponent(s)}`:a==="chat"?`chat:${encodeURIComponent(t)}`:`session:${encodeURIComponent(ke(e?.sessionId)||"unknown")}`}function Xs(e,t){let s=[...e].sort((a,r)=>Number(a?.spawnedAt??0)-Number(r?.spawnedAt??0));for(let a of s){let r=ke(a?.title);if(r)return r}return t}function yn(e){let t=new Map;for(let a of e){let r=Jn(a),m=t.get(r);m?m.push(a):t.set(r,[a])}let s=[];for(let[a,r]of t){let m=[...r].sort((E,_)=>Number(_.lastMessageAt??0)-Number(E.lastMessageAt??0)),f=m[0]??{},l=Wt(f),g=ke(f.chatId),C=l==="thread"?ke(f.rootMessageId):"",w=new Set(m.map(E=>ke(E.larkAppId)||ke(E.botName)).filter(Boolean)),v=Math.max(1,w.size),B=m.filter(E=>E.status!=="closed").length,P=m.filter(E=>E.lastInputFromBot===!0).length,R=m.reduce((E,_)=>Math.max(E,Number(_.lastMessageAt??0)),0),M=C||g||ke(f.sessionId)||a;s.push({key:a,kind:l,chatId:g,...C?{rootMessageId:C}:{},title:Xs(m,M),rows:m,botCount:v,activeCount:B,closedCount:m.length-B,inferredBotInputCount:P,latestActivityAt:R,multiBot:w.size>1,inferredBotTriggered:P>0})}return s.sort((a,r)=>r.latestActivityAt-a.latestActivityAt||a.key.localeCompare(r.key))}var tn=At;function kn(e=$e){return e.authed?!0:(e.publicReadOnly,!1)}var j={pin:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 14.3s4.2-3.9 4.2-7.3A4.2 4.2 0 0 0 8 2.9a4.2 4.2 0 0 0-4.2 4.1C3.8 10.4 8 14.3 8 14.3z"/><circle cx="8" cy="6.9" r="1.5"/></svg>',openChat:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 2.8h3.8v3.8"/><path d="M13.2 2.8 7.3 8.7"/><path d="M11.5 9.3v2.9a1.2 1.2 0 0 1-1.2 1.2H3.8a1.2 1.2 0 0 1-1.2-1.2V5.7a1.2 1.2 0 0 1 1.2-1.2h2.9"/></svg>',details:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2.4" y="2.6" width="11.2" height="10.8" rx="2"/><path d="M5.2 5.4h5.6"/><path d="M5.2 8h5.6"/><path d="M5.2 10.6h3.2"/></svg>',terminal:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="1.8" y="2.2" width="12.4" height="10.5" rx="2"/><path d="M1.8 5h12.4"/><circle cx="4" cy="3.6" r=".45" fill="currentColor" stroke="none"/><path d="m4.2 7.3 1.8 1.6-1.8 1.6"/><path d="M8 10.6h3.4"/></svg>',key:'<svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="6" cy="6.1" r="3"/><path d="M8.1 8.2 13 13.1"/><path d="M11.3 11.4 12.6 10.1"/><path d="M12.7 12.8 13.7 11.8"/></svg>',lock:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="3" y="7" width="10" height="6.4" rx="1.8"/><path d="M5.1 7V5.4a2.9 2.9 0 0 1 5.8 0V7"/><path d="M8 9.5v1.4"/></svg>',unlock:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="3" y="7" width="10" height="6.4" rx="1.8"/><path d="M5.1 7V5.3a2.9 2.9 0 0 1 5.1-1.9"/><path d="M8 9.5v1.4"/></svg>',close:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4.2 4.2 11.8 11.8"/><path d="M11.8 4.2 4.2 11.8"/></svg>',edit:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M10.7 3.3 12.7 5.3 6.3 11.7 3.7 12.3 4.3 9.7 10.7 3.3z"/></svg>',history:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3.2 7.8a4.8 4.8 0 1 0 1.4-3.4"/><path d="M3.2 3.1v3.2h3.2"/><path d="M8 5.4v3l2.1 1.2"/></svg>',restart:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M12.7 6.5A4.8 4.8 0 1 0 13 9"/><path d="M12.7 3.3v3.2H9.5"/></svg>',feishu:'<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3 5.2a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v3.3a2 2 0 0 1-2 2H7.1L4.3 13v-2.5H5"/><path d="M9.1 3.2h3.7v3.7"/><path d="M12.8 3.2 8.5 7.5"/></svg>',copy:'<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="5.5" y="5.5" width="7.5" height="7.5" rx="1.4"/><path d="M10.5 5.5V4.1a1.4 1.4 0 0 0-1.4-1.4H4.1a1.4 1.4 0 0 0-1.4 1.4v5a1.4 1.4 0 0 0 1.4 1.4h1.4"/></svg>'};function wn(e){return e.locked?o("sessions.unlock"):o("sessions.lock")}async function Wn(e,t){let s=window.open("about:blank","_blank");s&&(s.opener=null),t&&(t.disabled=!0);try{let a=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/write-link`),r=await a.json().catch(()=>({}));if(!a.ok||r?.ok===!1||!r?.url){s?.close(),a.status!==401&&alert(`${o("sessions.writeLinkFail")}: ${r?.error??a.status}`);return}s?s.location.href=r.url:window.open(r.url,"_blank","noopener")}catch(a){s?.close(),alert(`${o("sessions.writeLinkFail")}: ${a}`)}finally{t&&(t.disabled=!1)}}async function Xt(e,t){t&&(t.disabled=!0);try{let s=await fetch(`/api/sessions/${encodeURIComponent(e.sessionId)}/spawn-command`),a=await s.json().catch(()=>({}));if(!s.ok||a?.ok===!1||!a?.command){s.status!==401&&alert(`${o("sessions.copyCommandFail")}: ${a?.error??s.status}`);return}if(await bn(a.command,o("sessions.copyCommand"))&&t){let r=t.textContent;t.textContent=o("sessions.copyCommandDone"),setTimeout(()=>{r!==null&&(t.textContent=r)},1500)}}catch(s){alert(`${o("sessions.copyCommandFail")}: ${s}`)}finally{t&&(t.disabled=!1)}}function Xn(e){let t=String(e?.senderType??"unknown"),s=t==="app"||t==="bot"?"bot":t,a=String(e?.senderId??"").trim(),r=String(e?.senderName??"").trim();return`${s}:${a||r||"unknown"}`}function Vt(e){return e.status==="closed"?null:e.pendingRepo||e.tuiPromptActive||e.agentAttention||e.status==="limited"||e.status==="stalled"?"needs-you":e.status==="starting"?"starting":e.status==="working"||e.status==="analyzing"||e.status==="active"?"working":(e.status==="dormant","idle")}function qt(e){let t=String(e.status??"unknown"),s=String(e.cliId??"unknown"),a=$e.locale==="zh"?"\uFF1A":": ";return[o("sessions.restartConfirmIntro"),"",`${o("sessions.restartConfirmStatus")}${a}${nn(t)}`,`${o("sessions.restartConfirmCli")}${a}${s}`,"",o("sessions.restartConfirmQuestion")].join(`
|
|
6
|
-
`)}function Cn(e){return e.status!=="closed"&&!e.adopt&&!e.pendingRepo&&e.cliId!=="riff"}async function Yt(){try{let e=await fetch("/api/groups");if(!e.ok)return[];let t=await e.json();return(Array.isArray(t?.bots)?t.bots:[]).filter(a=>a&&typeof a.larkAppId=="string").map(a=>({larkAppId:a.larkAppId,botName:typeof a.botName=="string"&&a.botName?a.botName:a.larkAppId}))}catch{return[]}}var sn=new Lt({html:!1,linkify:!0,breaks:!0});sn.validateLink=e=>/^(https?:|mailto:)/i.test(e.trim());var Zt=sn.renderer.rules.link_open;sn.renderer.rules.link_open=(e,t,s,a,r)=>(e[t].attrSet("target","_blank"),e[t].attrSet("rel","noopener noreferrer nofollow"),Zt?Zt(e,t,s,a,r):r.renderToken(e,t,s));sn.renderer.rules.image=(e,t)=>{let s=e[t],a=s.children?.reduce((l,g)=>l+(g.content??""),"")??"",r=Je(a.trim()||"image"),m=s.attrGet("src")??"";return/^(https?:|mailto:)/i.test(m.trim())?`<span class="session-card-exchange-img">\u{1F5BC} <a href="${Je(m)}" target="_blank" rel="noopener noreferrer nofollow">${r}</a></span>`:`<span class="session-card-exchange-img">\u{1F5BC} ${r}</span>`};function Vn(e){let t=String(e??"");if(!t.trim())return"";try{return sn.render(t).trim()||`<p>${Je(t)}</p>`}catch{return`<p>${Je(t)}</p>`}}function qn(e,t){let s=Math.max(0,Math.min(t,e.length)),r=e.slice(0,s).match(/(?:^|\s)@([^\s@]*)$/u);if(!r)return null;let m=r[1]??"";return{start:s-m.length-1,end:s,query:m}}function Qt(e,t,s){let a=`@${s} `,r=e[t.end]===" "?t.end+1:t.end;return{text:e.slice(0,t.start)+a+e.slice(r),caret:t.start+a.length}}function es(e,t){let s=t.trim().toLocaleLowerCase();return s?e.filter(a=>a.botName.toLocaleLowerCase().includes(s)||a.larkAppId.toLocaleLowerCase().includes(s)):[...e]}function ns(e,t,s,a){if(a.length===0)return{text:e,caret:Math.max(0,Math.min(t,e.length))};let r=Math.max(0,Math.min(t,e.length)),m=Math.max(r,Math.min(s,e.length)),f=e.slice(0,r),l=e.slice(m),g=f&&!/\s$/u.test(f)?" ":"",C=l&&!/^\s/u.test(l)?" ":"",w=`${g}${a.join(" ")}${C}`;return{text:f+w+l,caret:f.length+w.length}}function Vs(e,t){let s=e.indexOf(t);if(s<0)return e;let a=e.slice(0,s),r=e.slice(s+t.length);return/\s$/u.test(a)&&/^\s/u.test(r)&&(r=r.slice(1)),a+r}function ts(e,t,s,a){let r=Vs(e,t),m=s.map((f,l)=>a(l));return s.forEach((f,l)=>{let g=r.indexOf(f);g<0||f===m[l]||(r=r.slice(0,g)+m[l]+r.slice(g+f.length))}),{text:r,markers:m}}var A=ze(mt(),1);var ss=["backlog","todo","in_progress","in_review","done"];function os(e){return typeof e=="string"&&ss.includes(e)?e:null}function as(e){if(e.status==="closed")return"done";let t=os(e.kanbanColumn);return t||(e.pendingRepo||e.tuiPromptActive||e.agentAttention||e.status==="limited"||e.status==="stalled"?"in_review":e.status==="starting"||e.status==="working"||e.status==="analyzing"||e.status==="active"?"in_progress":"todo")}var qs=1e15;function Ve(e){if(typeof e.kanbanPosition=="number"&&Number.isFinite(e.kanbanPosition))return e.kanbanPosition;let t=typeof e.lastMessageAt=="number"&&Number.isFinite(e.lastMessageAt)?e.lastMessageAt:0;return qs-t}function Yn(e,t){return e!==null&&t!==null?(e+t)/2:e!==null?e+1024:t!==null?t-1024:1024}var I=ze(fn(),1),is=[{id:"backlog",labelKey:"sessions.kanban.backlog"},{id:"todo",labelKey:"sessions.kanban.todo"},{id:"in_progress",labelKey:"sessions.kanban.inProgress"},{id:"in_review",labelKey:"sessions.kanban.inReview"},{id:"done",labelKey:"sessions.kanban.done"}],Zn=50;function rs(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function Ys(e){let t=String(e??"").trim();return t?t.replace(/\\/g,"/").split("/").filter(Boolean).at(-1)??t:"-"}function Zs(e){return e.agentAttention?.reason?e.agentAttention.reason:e.agentAttention?o("sessions.board.signalAgent"):e.pendingRepo?o("sessions.board.signalRepo"):e.tuiPromptActive?o("sessions.board.signalPrompt"):e.status==="limited"?o("sessions.board.signalLimited"):e.status==="stalled"?o("sessions.board.signalStalled"):""}function Qs(e){let t=(s="")=>`<svg viewBox="0 0 14 14" aria-hidden="true"><circle cx="7" cy="7" r="5.4" fill="none" stroke="currentColor" stroke-width="1.6"${s}/>`;switch(e){case"backlog":return`${t(' stroke-dasharray="1.6 2.1"')}</svg>`;case"in_progress":return`${t()}<path d="M7,7 L7,3.6 A3.4,3.4 0 0 1 7,10.4 Z" fill="currentColor"/></svg>`;case"in_review":return`${t()}<path d="M7,7 L7,3.6 A3.4,3.4 0 1 1 3.6,7 Z" fill="currentColor"/></svg>`;case"done":return'<svg viewBox="0 0 14 14" aria-hidden="true"><circle cx="7" cy="7" r="6.2" fill="currentColor"/><path d="M4.4 7.2 6.2 9 9.7 5.4" fill="none" stroke="var(--surface)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>';default:return`${t()}</svg>`}}function Ze(e){return{__html:e}}function vn(e){return typeof e.remoteDeployment=="string"&&e.remoteDeployment.length>0}function eo(e){return ye(e.title)||e.sessionId}function ms(e){let t=[],s=new Map;for(let m of e){let f=String(m.chatId??m.sessionId),l=s.get(f);l||(l={chatId:f,rows:[]},s.set(f,l),t.push(l)),l.rows.push(m)}let a=[];return{clusters:t.map(m=>(a.push(...m.rows),m.rows.length<2?{type:"card",row:m.rows[0]}:{type:"cluster",chatId:m.chatId,rows:m.rows})),flat:a}}function ls(e){let t=new Map(is.map(a=>[a.id,[]]));for(let a of e)t.get(as(a)).push(a);return{columns:is.map(a=>{let r=(t.get(a.id)??[]).sort((g,C)=>Ve(g)-Ve(C)),m=0;a.id==="done"&&r.length>Zn&&(m=r.length-Zn,r=r.slice(0,Zn));let{clusters:f,flat:l}=ms(r);return t.set(a.id,l),{id:a.id,labelKey:a.labelKey,rows:r,clusters:f,hiddenCount:m}}),groups:t}}function no(e){let t=new Map;for(let s of e){if(s.status==="closed")continue;let a=String(s.larkAppId||s.botName||"unknown"),r=t.get(a);r||(r={name:fe(s),larkAppId:s.larkAppId,rows:[]},t.set(a,r)),r.rows.push(s)}return[...t.values()].sort((s,a)=>s.name.localeCompare(a.name)).map(s=>{let a=s.rows.sort((m,f)=>Number(f.lastMessageAt??0)-Number(m.lastMessageAt??0)),{clusters:r}=ms(a);return{key:String(s.larkAppId??s.name),name:s.name,larkAppId:s.larkAppId,rows:a,clusters:r}})}function Qn(e){return new Map(e.map(t=>[String(t.sessionId),t]))}function to(e){if(e.groupBy==="bot"){let a=e.rows.filter(r=>!vn(r));return{mode:"bot",columns:no(a),groups:new Map,rowById:Qn(a),team:null,scope:null}}if(e.groupBy==="team"){if(!e.teamsLoaded)return{mode:"loading",groups:new Map,rowById:new Map,team:null,scope:null};let a=e.teams.find(v=>v.key===e.teamKey)??e.teams[0]??null,r=e.getTeamChatIds(a??void 0),m=a?e.rows.filter(v=>r.has(String(v.chatId))):[],f=(e.teamBoardKey===a?.key?e.teamBoardData?.board:null)??{},l=(e.teamBoardKey===a?.key?e.teamBoardData?.remoteRows:null)??[],g=[...m,...l].map(v=>{let B=f[String(v.sessionId)];return B?{...v,kanbanColumn:B.column,kanbanPosition:B.position}:v}),{columns:C,groups:w}=ls(g);return{mode:"flow",columns:C,groups:w,rowById:Qn(g),team:a,scope:{chats:r.size,sessions:g.length}}}let{columns:t,groups:s}=ls(e.rows);return{mode:"flow",columns:t,groups:s,rowById:Qn(e.rows),team:null,scope:null}}function so(e){let t=new Map;return e?.querySelectorAll(".kanban-col-list").forEach(s=>{let a=s.closest(".kanban-column")?.dataset.col;a&&s.scrollTop&&t.set(a,s.scrollTop)}),t}function oo(e,t){t?.size&&e?.querySelectorAll(".kanban-col-list").forEach(s=>{let a=s.closest(".kanban-column")?.dataset.col,r=a?t.get(a):void 0;r&&(s.scrollTop=r)})}function cs(e,t){for(let s of e.querySelectorAll(".kanban-card:not(.dragging)")){if(s.closest(".kanban-cluster.dragging"))continue;let a=s.getBoundingClientRect();if(t<a.top+a.height/2)return s}return null}function Ye(e){return(0,I.jsx)("button",{type:"button",className:`card-act kanban-card-act${e.className?` ${e.className}`:""}`,"data-action":e.action,"data-tip":e.label,"aria-label":e.label,onClick:t=>{t.stopPropagation(),e.onClick(t.currentTarget)},dangerouslySetInnerHTML:Ze(e.icon)})}function ao(e){let t=ye(e.row.title)||"",[s,a]=(0,A.useState)(t),r=(0,A.useRef)(null),m=(0,A.useRef)(!1);(0,A.useLayoutEffect)(()=>{r.current?.focus(),r.current?.select()},[]);let f=(0,A.useCallback)(l=>{if(m.current)return;m.current=!0;let g=s.trim();l&&g&&g!==t&&e.onCommit(e.row,g),e.onCancel()},[t,e,s]);return(0,I.jsx)("input",{ref:r,type:"text",className:"kanban-rename-input",maxLength:200,value:s,onChange:l=>a(l.currentTarget.value),onClick:l=>l.stopPropagation(),onBlur:()=>f(!0),onKeyDown:l=>{l.stopPropagation(),l.key==="Enter"?(l.preventDefault(),f(!0)):l.key==="Escape"&&(l.preventDefault(),f(!1))}})}function ds(e){let{callbacks:t,row:s}=e,a=eo(s),r=fe(s),m=Ke(s),f=Ys(s.workingDir),l=Zs(s),g=[m,f!=="-"?f:null].filter(Boolean).join(" \xB7 "),C=String(s.status??"unknown"),w=typeof s.remoteDeployment=="string"?s.remoteDeployment:"",v=e.editingId===s.sessionId,B=t.selectedSessionIds.has(String(s.sessionId)),P=["kanban-card",B?"selected":"",w?"kanban-card-remote":"",s.locked?"locked":"",e.dragId===s.sessionId?"dragging":"",e.dropBeforeId===s.sessionId?"drop-before":""].filter(Boolean).join(" "),R=w?null:(0,I.jsxs)("span",{className:"kanban-card-actions-rail",children:[(0,I.jsx)(Ye,{action:"history",icon:t.icons.history,label:o("sessions.history.title"),onClick:()=>t.onHistory(s)}),s.webPort&&t.onOpenTerminal?(0,I.jsx)(Ye,{action:"terminal",icon:t.icons.terminal,label:o("sessions.openReadonlyTerminal"),onClick:()=>t.onOpenTerminal?.(s)}):null,s.webPort&&t.onOpenWritableTerminal?(0,I.jsx)(Ye,{action:"write-link",icon:t.icons.key,label:o("sessions.openWritableTerminal"),onClick:M=>t.onOpenWritableTerminal?.(s,M)}):null,s.feishuChatLink?(0,I.jsx)("a",{className:"card-act kanban-card-act",href:s.feishuChatLink,target:"_blank",rel:"noopener","data-tip":o("sessions.kanban.openFeishu"),"aria-label":o("sessions.kanban.openFeishu"),onClick:M=>M.stopPropagation(),dangerouslySetInnerHTML:Ze(t.icons.feishu)}):null,(0,I.jsx)(Ye,{action:"lock",className:s.locked?"locked":"",icon:s.locked?t.icons.unlock:t.icons.lock,label:t.lockActionLabel(s),onClick:M=>t.onToggleLock(s,M)}),(0,I.jsx)(Ye,{action:"details",icon:t.icons.details,label:o("sessions.details"),onClick:()=>t.onDetails(s)}),t.canRestartSession(s)?(0,I.jsx)(Ye,{action:"restart",icon:t.icons.restart,label:o("sessions.restart"),onClick:M=>t.onRestart(s,M)}):null]});return(0,I.jsxs)("article",{className:P,"data-id":s.sessionId,tabIndex:0,role:"button","aria-pressed":B,draggable:!0,onClick:M=>e.onCardClick(s,M),onKeyDown:M=>e.onCardKeyDown(s,M),onDragStart:M=>e.onDragStartCard(s,M),children:[(0,I.jsxs)("div",{className:"kanban-card-top",children:[(0,I.jsx)("span",{className:`badge cli-${rs(s.cliId)}`,children:s.cliId??"unknown"}),s.adopt?(0,I.jsx)("span",{className:"badge",children:"adopt"}):null,s.locked?(0,I.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null,w?(0,I.jsx)("span",{className:"badge kanban-remote-badge",title:o("sessions.kanban.remoteHint",{name:w}),children:w}):null,R]}),(0,I.jsx)("div",{className:"kanban-card-title-row",children:v?(0,I.jsx)(ao,{row:s,onCancel:e.onEditDone,onCommit:t.onRename}):(0,I.jsx)("p",{className:"kanban-card-title",title:String(s.title??a),onDoubleClick:M=>{M.stopPropagation(),e.cancelOpen(),w||e.onBeginEdit(s)},children:String(a).slice(0,140)})}),g||l?(0,I.jsxs)("div",{className:"kanban-card-meta-row",children:[g?(0,I.jsx)("p",{className:"kanban-card-desc",title:g,children:g}):(0,I.jsx)("span",{className:"kanban-card-desc kanban-card-desc-empty","aria-hidden":"true"}),l?(0,I.jsx)("span",{className:"session-signal",title:l,children:l}):null]}):null,(0,I.jsxs)("div",{className:"kanban-card-foot",children:[(0,I.jsx)("span",{className:"kanban-card-owner",dangerouslySetInnerHTML:Ze(`${_e({name:r,larkAppId:s.larkAppId,size:"sm"})}<span>${Je(r)}</span>`)}),(0,I.jsxs)("span",{className:"kanban-card-updated",children:[o("sessions.kanban.updated",{time:He(s.lastMessageAt)}),(0,I.jsx)("span",{className:"kanban-card-dot","data-status":rs(C),title:t.sessionStatusText(C)})]})]})]})}function us(e){let t=e.item;if(t.type==="card")return(0,I.jsx)(ds,{...e.cardProps,row:t.row});let s=Ke(t.rows[0])??t.chatId,a=e.dragCluster?.chatId===t.chatId&&e.dragCluster.col===e.columnId;return(0,I.jsxs)("div",{className:`kanban-cluster${e.expanded?" expanded":" collapsed"}${a?" dragging":""}`,"data-chat":t.chatId,children:[(0,I.jsxs)("header",{draggable:!0,title:`${s} \xB7 ${o("sessions.kanban.clusterDragHint")}`,onDragStart:r=>{e.columnId&&e.onDragStartCluster(t.chatId,e.columnId,r)},children:[(0,I.jsx)("span",{className:"kanban-cluster-avatar",dangerouslySetInnerHTML:Ze(gn({chatId:t.chatId,name:s,size:"sm"}))}),(0,I.jsx)("span",{className:"kanban-cluster-name",children:s}),(0,I.jsx)("span",{className:"kanban-cluster-count",children:t.rows.length}),(0,I.jsx)("button",{type:"button",className:"kanban-cluster-toggle","aria-expanded":e.expanded,title:o(e.expanded?"sessions.kanban.clusterCollapse":"sessions.kanban.clusterExpand"),"aria-label":o(e.expanded?"sessions.kanban.clusterCollapse":"sessions.kanban.clusterExpand"),onClick:r=>{r.stopPropagation(),e.onToggleExpanded()},children:(0,I.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,I.jsx)("path",{d:"m5.5 6.5 2.5 2.5 2.5-2.5"})})})]}),e.expanded?t.rows.map(r=>(0,I.jsx)(ds,{...e.cardProps,row:r},r.sessionId)):null]})}function gs(e){let[t,s]=(0,A.useState)(e),[a,r]=(0,A.useState)(null),[m,f]=(0,A.useState)(null),[l,g]=(0,A.useState)(null),[C,w]=(0,A.useState)(null),[v,B]=(0,A.useState)(()=>new Set),P=(0,A.useRef)(null),R=(0,A.useRef)(null),M=(0,A.useRef)(null),E=(0,A.useRef)(new Map),_=(0,A.useRef)(new Map),F=(0,A.useRef)(m),U=!!a||!!m,D=(0,A.useCallback)(()=>{M.current!==null&&(clearTimeout(M.current),M.current=null)},[]),V=(0,A.useCallback)(N=>{R.current=so(e.host),s(N)},[e.host]);(0,A.useEffect)(()=>{if(U){P.current=e;return}V(e)},[V,U,e]),(0,A.useEffect)(()=>{if(U||!P.current)return;let N=P.current;P.current=null,V(N)},[V,U]),(0,A.useLayoutEffect)(()=>{oo(e.host,R.current),R.current=null},[t,e.host]),(0,A.useEffect)(()=>{F.current=m},[m]),(0,A.useEffect)(()=>()=>D(),[D]);let K=(0,A.useMemo)(()=>to(t),[t]);(0,A.useLayoutEffect)(()=>{E.current=K.groups,_.current=K.rowById},[K]),(0,A.useEffect)(()=>{t.groupBy==="team"&&!t.teamsLoaded&&t.onNeedTeams()},[t]),(0,A.useEffect)(()=>{t.groupBy==="team"&&K.mode==="flow"&&K.team&&t.onNeedTeamBoard(K.team)},[t,K]),(0,A.useEffect)(()=>{t.onTeamScope(K.mode==="flow"?K.scope:null)},[t,K]);let re=(0,A.useCallback)(()=>{f(null),g(null),w(null)},[]),$=(0,A.useCallback)(N=>{B(S=>{let G=new Set(S);return G.has(N)?G.delete(N):G.add(N),G})},[]),Ce=(0,A.useCallback)(N=>{D(),!vn(N)&&r(N.sessionId)},[D]),Z=(0,A.useCallback)((N,S)=>{vn(N)||S.target.closest("a, button, input, label")||(D(),M.current=setTimeout(()=>{M.current=null,t.onToggleSelect(N)},220))},[D,t]),ve=(0,A.useCallback)((N,S)=>{S.key!=="Enter"&&S.key!==" "||S.target!==S.currentTarget||vn(N)||(S.preventDefault(),t.onToggleSelect(N))},[t]),Le=(0,A.useCallback)((N,S)=>{t.groupBy!=="bot"&&(D(),f({kind:"card",id:String(N.sessionId)}),S.dataTransfer&&(S.dataTransfer.effectAllowed="move",S.dataTransfer.setData("text/plain",String(N.sessionId))))},[D,t.groupBy]),Pe=(0,A.useCallback)((N,S,G)=>{t.groupBy!=="bot"&&(D(),f({kind:"cluster",chatId:N,col:S}),G.dataTransfer&&(G.dataTransfer.effectAllowed="move",G.dataTransfer.setData("text/plain",`cluster:${N}`)))},[D,t.groupBy]),z=(0,A.useCallback)((N,S)=>{!F.current||t.groupBy==="bot"||(S.preventDefault(),S.dataTransfer&&(S.dataTransfer.dropEffect="move"),g(N),w(cs(S.currentTarget,S.clientY)?.dataset.id??null))},[t.groupBy]),Ue=(0,A.useCallback)((N,S)=>{let G=F.current;if(!G||t.groupBy==="bot")return;S.preventDefault();let ue=cs(S.currentTarget,S.clientY);re();let X=E.current,me=N;if(G.kind==="cluster"){let Q=(X.get(G.col)??[]).filter(ne=>String(ne.chatId)===G.chatId).filter(ne=>!(ne.status==="closed"&&me!=="done"));if(!Q.length)return;let ge=new Set(Q.map(ne=>ne.sessionId)),ee=(X.get(me)??[]).filter(ne=>!ge.has(ne.sessionId)),oe=ue?ee.findIndex(ne=>ne.sessionId===ue.dataset.id):ee.length;oe<0&&(oe=ee.length);let Ne=oe>0?ee[oe-1]:null,xe=oe<ee.length?ee[oe]:null,Re=Yn(Ne?Ve(Ne):null,xe?Ve(xe):null);t.onMoveRows(Q.map((ne,Qe)=>({row:ne,column:me,position:Re+Qe*.001})));return}let J=_.current.get(G.id);if(!J||J.status==="closed"&&me!=="done")return;let q=(X.get(me)??[]).filter(Q=>Q.sessionId!==G.id),le=ue?q.findIndex(Q=>Q.sessionId===ue.dataset.id):q.length;le<0&&(le=q.length);let be=le>0?q[le-1]:null,Ie=le<q.length?q[le]:null,je=Yn(be?Ve(be):null,Ie?Ve(Ie):null);t.onMoveRows([{row:J,column:me,position:je}])},[re,t]),Se={dragId:m?.kind==="card"?m.id:null,dropBeforeId:C,editingId:a,groupBy:t.groupBy,callbacks:t,cancelOpen:D,onBeginEdit:Ce,onCardClick:Z,onCardKeyDown:ve,onDragStartCard:Le,onEditDone:()=>r(null)};return K.mode==="loading"?(0,I.jsx)(We,{label:o("sessions.kanban.teamLoading"),className:"kanban-loading-state"}):K.mode==="bot"?K.columns.length?(0,I.jsx)(I.Fragment,{children:K.columns.map(N=>(0,I.jsxs)("section",{className:"kanban-column kanban-bot-col","data-bot":N.key,children:[(0,I.jsxs)("header",{children:[(0,I.jsx)("span",{className:"kanban-col-avatar",dangerouslySetInnerHTML:Ze(_e({name:N.name,larkAppId:N.larkAppId,size:"sm"}))}),(0,I.jsx)("h2",{children:N.name}),(0,I.jsx)("span",{className:"kanban-col-count",children:N.rows.length})]}),(0,I.jsx)("div",{className:"kanban-col-list",onDragOver:S=>z(N.key,S),onDragEnd:re,children:N.clusters.map(S=>(0,I.jsx)(us,{item:S,dragCluster:m?.kind==="cluster"?m:null,cardProps:Se,expanded:S.type==="cluster"&&v.has(`bot:${N.key}:${S.chatId}`),onToggleExpanded:()=>{S.type==="cluster"&&$(`bot:${N.key}:${S.chatId}`)},onDragStartCluster:Pe},S.type==="card"?S.row.sessionId:S.chatId))})]},N.key))}):(0,I.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}):(0,I.jsx)(I.Fragment,{children:K.columns.map(N=>(0,I.jsxs)("section",{className:`kanban-column kanban-${N.id}${l===N.id?" drag-over":""}`,"data-col":N.id,onDragOver:S=>z(N.id,S),onDrop:S=>Ue(N.id,S),onDragEnd:re,children:[(0,I.jsxs)("header",{children:[(0,I.jsx)("span",{className:"kanban-col-icon",dangerouslySetInnerHTML:Ze(Qs(N.id))}),(0,I.jsx)("h2",{children:o(N.labelKey)}),(0,I.jsx)("span",{className:"kanban-col-count",children:N.rows.length+N.hiddenCount})]}),(0,I.jsxs)("div",{className:"kanban-col-list",children:[N.rows.length?N.clusters.map(S=>(0,I.jsx)(us,{item:S,columnId:N.id,dragCluster:m?.kind==="cluster"?m:null,cardProps:Se,expanded:S.type==="cluster"&&v.has(`${N.id}:${S.chatId}`),onToggleExpanded:()=>{S.type==="cluster"&&$(`${N.id}:${S.chatId}`)},onDragStartCluster:Pe},S.type==="card"?S.row.sessionId:S.chatId)):(0,I.jsx)("div",{className:"kanban-col-empty",children:o("sessions.board.emptyColumn")}),N.hiddenCount?(0,I.jsx)("div",{className:"kanban-col-more",children:o("sessions.kanban.moreHidden",{count:N.hiddenCount})}):null]})]},N.id))})}var n=ze(fn(),1),io=new Set(["image/png","image/jpeg","image/gif","image/webp"]),ps=8,ro=10*1024*1024,lo=25*1024*1024;function co(e){return new Promise((t,s)=>{let a=new FileReader;a.onload=()=>typeof a.result=="string"?t(a.result):s(new Error("bad_image_data")),a.onerror=()=>s(a.error??new Error("image_read_failed")),a.readAsDataURL(e)})}function uo(e){return e===168?"7d":`${e}H`}var mo=Hn.map(e=>({value:String(e),label:uo(e)}));function de(e){return{__html:e}}function ie(){return typeof window>"u"?void 0:window.localStorage}function In(e){let t=String(e.status??"unknown");return(0,n.jsx)("span",{className:`status status-${Un(t)}`,children:nn(t)})}function nt(e){return e.row.locked?(0,n.jsx)("span",{className:"session-lock-badge",title:o("sessions.locked"),children:o("sessions.locked")}):null}function Ae(e){let t=e.className??`card-act${e.kind?` ${e.kind}`:""}`;return(0,n.jsx)("button",{type:"button",id:e.id,className:t,"data-action":e.action,"data-tip":e.label,"aria-label":e.label,disabled:e.disabled,onClick:s=>{s.stopPropagation(),e.onClick(s.currentTarget)},dangerouslySetInnerHTML:de(e.icon)})}function hs(e){if(!e.url||!Xe())return null;let t=kn();return(0,n.jsxs)("span",{className:"term-pill",children:[(0,n.jsx)("a",{className:"term-btn term-open",href:e.url,target:"_blank",rel:"noopener","data-action":"terminal","data-tip":o("sessions.openReadonlyTerminal"),"aria-label":o("sessions.openReadonlyTerminal"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:de(j.terminal)}),t?(0,n.jsx)("button",{type:"button",className:"term-btn term-write","data-action":"write-link","data-tip":o("sessions.openWritableTerminal"),"aria-label":o("sessions.openWritableTerminal"),onClick:s=>{s.stopPropagation(),Wn(e.row,s.currentTarget)},dangerouslySetInnerHTML:de(j.key)}):null]})}function ys(e){let t=e.row;return t.scope!=="chat"||!t.feishuChatLink?null:(0,n.jsx)("a",{className:e.className??"card-act",href:t.feishuChatLink,target:"_blank",rel:"noopener","data-tip":o("sessions.openChat"),"aria-label":o("sessions.openChat"),onClick:s=>s.stopPropagation(),dangerouslySetInnerHTML:de(j.feishu)})}function go(e){let t=e.sortKey===e.sort;return(0,n.jsx)("th",{"data-sort":e.sort,"data-label":e.label,className:t?"sorted":void 0,"aria-sort":t?e.sortDir==="asc"?"ascending":"descending":"none",onClick:()=>e.onSort(e.sort),children:t?`${e.label} ${e.sortDir==="asc"?"\u25B2":"\u25BC"}`:e.label})}function fs(e,t){return t==="spawnedAt"||t==="lastMessageAt"?Number(e[t]??0):t==="tokenIn"?hn(e.tokenUsage?.in)??-1:t==="tokenOut"?hn(e.tokenUsage?.out)??-1:t==="adopt"?!!e.adopt:t==="chat"?Fe(e).toLowerCase():t==="cliId"?on(e).toLowerCase():String(e[t]??"").toLowerCase()}function on(e){return String(e.runtimeDisplayName??e.cliId??"unknown")}function bs(e,t,s,a){let r=fs(e,s),m=fs(t,s),f=0;return typeof r=="number"&&typeof m=="number"?f=r-m:typeof r=="boolean"&&typeof m=="boolean"?f=Number(r)-Number(m):f=String(r).localeCompare(String(m)),f===0&&(f=Number(e.lastMessageAt??0)-Number(t.lastMessageAt??0)),a==="asc"?f:-f}function po(e){return e.agentAttention?.reason?e.agentAttention.reason:e.agentAttention?o("sessions.board.signalAgent"):e.pendingRepo?o("sessions.board.signalRepo"):e.tuiPromptActive?o("sessions.board.signalPrompt"):e.status==="limited"?o("sessions.board.signalLimited"):e.status==="stalled"?o("sessions.board.signalStalled"):""}function fo(e,t,s){let a=s==="needs-you"?pn(e):Number(e.lastMessageAt??0),r=s==="needs-you"?pn(t):Number(t.lastMessageAt??0);return a!==r?s==="needs-you"?a-r:r-a:String(e.title??e.sessionId).localeCompare(String(t.title??t.sessionId))}function bo(e){if(e==null||e==="")return"";let t=Number(e),s=Number.isFinite(t)&&t>0?new Date(t):new Date(String(e));return Number.isNaN(s.getTime())?"":s.toLocaleString()}function ho(e){return e===void 0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m${Math.round(e%6e4/1e3)}s`}function tt(e,t){(0,c.useEffect)(()=>{let s=e.current;if(s)if(t){if(!s.open)try{s.showModal()}catch{}}else s.open&&s.close()},[t,e])}function et(e){let[t,s]=(0,c.useState)(!1);return(0,n.jsx)("button",{type:"button","data-copy":e.value,onClick:()=>{bn(e.value,o("sessions.copy")).then(a=>{a&&(s(!0),window.setTimeout(()=>s(!1),800))})},children:t?o("sessions.copied"):o("sessions.copy")})}function yo(e){let[t,s]=(0,c.useState)(0),[a,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let m=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(m)},[t]),(0,n.jsx)("button",{id:"locate-btn",type:"button",disabled:a||t>0,onClick:async()=>{r(!0);let m=await e.locateSession(e.row);r(!1),m&&s(30)},children:t>0?o("sessions.cooldown",{seconds:t}):a?o("sessions.locating"):o("sessions.locate")})}function ko(e){let[t,s]=(0,c.useState)(0),[a,r]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{if(t<=0)return;let m=window.setTimeout(()=>s(t-1),1e3);return()=>window.clearTimeout(m)},[t]),(0,n.jsx)(Ae,{action:"locate",icon:j.pin,label:t>0?o("sessions.cooldown",{seconds:t}):o("sessions.locate"),disabled:a||t>0,onClick:async()=>{r(!0);let m=await e.onLocate(e.row);r(!1),m&&s(30)}})}function wo(e){let t=we.filter(l=>e.selected.has(l)).length,s=(0,c.useRef)(null),[a,r]=(0,c.useState)("");(0,c.useEffect)(()=>{let l=()=>{s.current?.open&&(s.current.open=!1)},g=w=>{let v=s.current;v?.open&&!v.contains(w.target)&&l()},C=w=>{w.key==="Escape"&&l()};return document.addEventListener("pointerdown",g,!0),document.addEventListener("keydown",C),()=>{document.removeEventListener("pointerdown",g,!0),document.removeEventListener("keydown",C)}},[]);let m=a.trim().toLowerCase(),f=m?we.filter(l=>l.toLowerCase().includes(m)):we;return(0,n.jsxs)("details",{className:"filter-cli",ref:s,children:[(0,n.jsxs)("summary",{children:[o("sessions.cli")," \xB7 ",(0,n.jsx)("b",{id:"cli-filter-count",className:t===we.length?void 0:"cli-filter-active",children:t===we.length?o("common.all"):`${t}/${we.length}`})]}),(0,n.jsxs)("div",{className:"filter-cli-pop",role:"group","aria-label":o("sessions.cli"),children:[(0,n.jsxs)("div",{className:"filter-cli-head",children:[(0,n.jsx)("input",{type:"search",className:"filter-cli-search",placeholder:o("sessions.cliSearch"),value:a,autoFocus:!0,onChange:l=>r(l.currentTarget.value),onClick:l=>l.stopPropagation()}),(0,n.jsxs)("div",{className:"filter-cli-bulk",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{for(let l of we)e.selected.has(l)||e.onToggle(l,!0)},children:o("sessions.cliSelectAll")}),(0,n.jsx)("button",{type:"button",onClick:()=>{for(let l of we)e.selected.has(l)&&e.onToggle(l,!1)},children:o("sessions.cliClear")})]})]}),(0,n.jsx)("div",{className:"filter-cli-options",children:f.length===0?(0,n.jsx)("span",{className:"filter-cli-empty",children:o("sessions.cliNoMatch")}):f.map(l=>(0,n.jsxs)("label",{className:"filter-check",children:[(0,n.jsx)("input",{type:"checkbox",name:"cli",value:l,checked:e.selected.has(l),onChange:g=>e.onToggle(l,g.currentTarget.checked)}),(0,n.jsx)("span",{children:l})]},l))})]})]})}function Co(e){let t=[{value:"",label:o("sessions.anyStatus")},...zt.map(l=>({value:l,label:nn(l)}))],s=[{value:"",label:o("sessions.adoptAny")},{value:"yes",label:o("sessions.adoptYes")},{value:"no",label:o("sessions.adoptNo")}],a=t.find(l=>l.value===e.filters.status)?.label??o("sessions.anyStatus"),r=s.find(l=>l.value===e.filters.adopt)?.label??o("sessions.adoptAny"),m=[{value:"",label:o("sessions.chatAny")},...e.chatOptions],f=m.find(l=>l.value===e.filters.chat)?.label??o("sessions.chatAny");return(0,n.jsxs)("form",{id:"filters",className:"filters dashboard-toolbar sessions-filters",onSubmit:l=>l.preventDefault(),children:[(0,n.jsx)("input",{type:"search",name:"q",placeholder:o("sessions.search"),value:e.filters.q,onChange:l=>{let g=l.currentTarget.value;e.setFilters(C=>({...C,q:g}))}}),(0,n.jsx)(en,{label:a,value:e.filters.status,options:t,onChange:l=>e.setFilters(g=>({...g,status:l}))}),(0,n.jsx)(en,{label:r,value:e.filters.adopt,options:s,onChange:l=>e.setFilters(g=>({...g,adopt:l}))}),(0,n.jsx)(en,{ariaLabel:o("sessions.location"),className:"filter-chat-menu",label:f,value:e.filters.chat,options:m,searchable:!0,searchPlaceholder:o("sessions.chatSearch"),searchEmptyLabel:o("sessions.chatNoMatch"),onChange:l=>e.setFilters(g=>({...g,chat:l}))}),(0,n.jsx)(wo,{selected:e.filters.cli,onToggle:(l,g)=>{e.setFilters(C=>{let w=new Set(C.cli);return g?w.add(l):w.delete(l),{...C,cli:w}})}}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"multiBotTopics",checked:e.filters.multiBotTopics,onChange:l=>{let g=l.currentTarget.checked;e.setFilters(C=>({...C,multiBotTopics:g}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.multiBotTopics")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"botTriggeredTopics",checked:e.filters.botTriggeredTopics,onChange:l=>{let g=l.currentTarget.checked;e.setFilters(C=>({...C,botTriggeredTopics:g}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.botTriggeredTopics")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"showUnknownChats",checked:e.filters.showUnknownChats,onChange:l=>{let g=l.currentTarget.checked;kt(ie(),g),e.setFilters(C=>({...C,showUnknownChats:g}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.showUnknownChats")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsxs)("label",{className:"filter-toggle",children:[(0,n.jsx)("input",{type:"checkbox",name:"active",checked:e.filters.active,onChange:l=>{let g=l.currentTarget.checked;e.setFilters(C=>({...C,active:g}))}}),(0,n.jsx)("span",{className:"filter-toggle-label",children:o("sessions.activeOnly")}),(0,n.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,n.jsx)(So,{...e.idleCleanup})]})}function vo(e){let t=!!e.closeProgress||!!e.lockProgress,s=e.lockProgress?.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.lockSelected"),a=e.lockProgress&&!e.lockProgress.locked?`${e.lockProgress.done}/${e.lockProgress.total}`:o("sessions.unlockSelected"),r=Xe();return(0,n.jsxs)("div",{id:"bulk-bar",className:"bulk-bar",hidden:e.selectedCount===0,children:[(0,n.jsx)("span",{id:"bulk-count",children:o("sessions.selectedCount",{count:e.selectedCount})}),r?(0,n.jsx)("button",{type:"button",id:"bulk-monitor-room",disabled:t||e.selectedCount===0,onClick:e.onAddToMonitorRoom,children:e.monitorRoomText??o("sessions.addToMonitorRoom")}):null,(0,n.jsx)("button",{type:"button",id:"bulk-lock",disabled:t||e.lockDisabled,onClick:()=>e.onLock(!0),children:s}),(0,n.jsx)("button",{type:"button",id:"bulk-unlock",disabled:t||e.unlockDisabled,onClick:()=>e.onLock(!1),children:a}),(0,n.jsx)("button",{type:"button",id:"bulk-close",className:"contrast",disabled:t,onClick:e.onClose,children:e.closeProgress?`${e.closeProgress.done}/${e.closeProgress.total}`:o("sessions.closeSelected")}),(0,n.jsx)("button",{type:"button",id:"bulk-clear",disabled:t,onClick:e.onClear,children:o("sessions.clearSelection")})]})}function So(e){let[t,s]=(0,c.useState)(!1),[a,r]=(0,c.useState)(e.hours),[m,f]=(0,c.useState)(),l=(0,c.useRef)(null),g=(0,c.useRef)(null),C=(0,c.useRef)(null),w=e.countForHours(a);return(0,c.useEffect)(()=>{t?r(e.hours):f(void 0)},[t,e.hours]),(0,c.useLayoutEffect)(()=>{if(!t)return;let v=()=>{let P=g.current,R=C.current;if(!P||!R)return;let M=12,E=window.innerWidth,_=window.innerHeight,F=Math.max(0,Math.min(292,E-M*2)),U=P.getBoundingClientRect(),D=R.offsetHeight,V=Math.max(M,E-F-M),K=U.left+U.width/2-F/2,re=Math.min(Math.max(K,M),V),$=U.bottom+8,Ce=U.top-D-8,Z=$+D<=_-M||Ce<M?Math.min(Math.max($,M),Math.max(M,_-D-M)):Math.max(M,Ce);f({left:re,top:Z,width:F})},B=window.requestAnimationFrame(v);return window.addEventListener("resize",v),window.addEventListener("scroll",v,!0),()=>{window.cancelAnimationFrame(B),window.removeEventListener("resize",v),window.removeEventListener("scroll",v,!0)}},[t,e.busy,e.status]),(0,c.useEffect)(()=>{if(!t)return;let v=P=>{let R=P.target;R instanceof Node&&l.current?.contains(R)||R instanceof Node&&C.current?.contains(R)||s(!1)},B=P=>{P.key==="Escape"&&s(!1)};return document.addEventListener("pointerdown",v,!0),document.addEventListener("keydown",B),()=>{document.removeEventListener("pointerdown",v,!0),document.removeEventListener("keydown",B)}},[t]),(0,n.jsxs)("div",{id:"idle-cleanup-bar",className:`idle-cleanup-bar${w===0?" is-empty":""}${t?" is-open":""}`,ref:l,children:[(0,n.jsxs)("button",{ref:g,type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run","aria-haspopup":"dialog","aria-expanded":t,disabled:e.busy,onClick:()=>s(v=>!v),children:[(0,n.jsxs)("svg",{className:"idle-cleanup-icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,n.jsx)("path",{d:"M3.5 6.5h17"}),(0,n.jsx)("path",{d:"M9 3.5h6"}),(0,n.jsx)("path",{d:"m6.5 6.5.9 13h9.2l.9-13"}),(0,n.jsx)("path",{d:"M10 10.5v5M14 10.5v5"})]}),(0,n.jsx)("span",{children:o("sessions.idleCleanupRun")})]}),t&&typeof document<"u"?(0,Sn.createPortal)((0,n.jsxs)("div",{ref:C,className:"idle-cleanup-pop",role:"dialog","aria-label":o("sessions.idleCleanupRun"),style:m??{visibility:"hidden"},children:[(0,n.jsxs)("div",{className:"idle-cleanup-pop-head",children:[(0,n.jsx)("span",{className:"idle-cleanup-pop-title",children:o("sessions.idleCleanupRun")}),(0,n.jsxs)("span",{id:"idle-cleanup-count",className:"idle-cleanup-count",children:[(0,n.jsx)("span",{className:"idle-cleanup-dot","aria-hidden":"true"}),o("sessions.idleCleanupCount",{count:w})]})]}),(0,n.jsxs)("div",{className:"idle-cleanup-pop-field",children:[(0,n.jsx)("span",{className:"idle-cleanup-label",children:o("sessions.idleCleanupOlderThan")}),(0,n.jsx)("div",{id:"idle-cleanup-threshold",className:"idle-cleanup-threshold-options",role:"radiogroup","aria-label":o("sessions.idleCleanupThreshold"),children:mo.map(v=>{let B=_n(v.value),P=B===a;return(0,n.jsx)("button",{type:"button",className:P?"active":void 0,"aria-pressed":P?"true":"false",disabled:e.busy,onClick:()=>r(B),children:v.label},v.value)})})]}),e.busy&&e.status?(0,n.jsx)("span",{id:"idle-cleanup-status",className:"idle-cleanup-status","aria-live":"polite",children:e.status}):null,(0,n.jsxs)("div",{className:"idle-cleanup-pop-actions",children:[(0,n.jsx)("button",{type:"button",className:"idle-cleanup-cancel",disabled:e.busy,onClick:()=>s(!1),children:o("sessions.idleCleanupCancel")}),(0,n.jsx)("button",{type:"button",className:"idle-cleanup-confirm",disabled:e.busy||w===0,onClick:()=>{e.onRun(a).then(()=>s(!1))},children:o("sessions.idleCleanupApply")})]})]}),document.body):null]})}function Io(e){let t=(0,c.useRef)(null);(0,c.useLayoutEffect)(()=>{t.current&&(t.current.indeterminate=e.selectAllIndeterminate)},[e.selectAllIndeterminate]);let s=[{id:"botName",label:o("sessions.bot")},{id:"cliId",label:o("sessions.cli")},{id:"status",label:o("sessions.status")},{id:"chat",label:o("sessions.location")},{id:"tokenIn",label:o("sessions.tokenIn")},{id:"tokenOut",label:o("sessions.tokenOut")},{id:"title",label:o("sessions.titleCol")},{id:"workingDir",label:o("sessions.workingDir")},{id:"spawnedAt",label:o("sessions.created")},{id:"lastMessageAt",label:o("sessions.last")},{id:"adopt",label:o("sessions.adopt")}],a=s.filter(l=>!e.hiddenColumns.has(l.id)),r=2+a.length,m={select:o("sessions.selectSession"),botName:o("sessions.bot"),cliId:o("sessions.cli"),status:o("sessions.status"),chat:o("sessions.location"),tokenIn:o("sessions.tokenIn"),tokenOut:o("sessions.tokenOut"),title:o("sessions.titleCol"),workingDir:o("sessions.workingDir"),spawnedAt:o("sessions.created"),lastMessageAt:o("sessions.last"),adopt:o("sessions.adopt"),actions:o("sessions.actions")};function f(l,g){switch(g){case"botName":return(0,n.jsx)("td",{"data-label":m.botName,children:fe(l)});case"cliId":return(0,n.jsx)("td",{"data-label":m.cliId,children:(0,n.jsx)("span",{className:`badge cli-${Un(l.cliId)}`,title:l.runtimeId&&l.runtimeId!==l.cliId?`${l.cliId} / ${l.runtimeId}`:void 0,children:on(l)})});case"status":return(0,n.jsxs)("td",{"data-label":m.status,children:[(0,n.jsx)(In,{status:l.status}),(0,n.jsx)(nt,{row:l})]});case"chat":return(0,n.jsx)("td",{className:"session-location-cell","data-label":m.chat,title:Gn(l),children:Fe(l)});case"tokenIn":return(0,n.jsx)("td",{className:"token-cell","data-label":m.tokenIn,children:Kn(l.tokenUsage?.in)});case"tokenOut":return(0,n.jsx)("td",{className:"token-cell","data-label":m.tokenOut,children:Kn(l.tokenUsage?.out)});case"title":return(0,n.jsx)("td",{className:"sessions-table-text-cell","data-label":m.title,title:String(l.title??""),children:ye(l.title??"").slice(0,48)});case"workingDir":return(0,n.jsx)("td",{className:"sessions-table-path-cell","data-label":m.workingDir,title:l.workingDir??"",children:String(l.workingDir??"").slice(-34)});case"spawnedAt":return(0,n.jsx)("td",{"data-label":m.spawnedAt,children:He(l.spawnedAt)});case"lastMessageAt":return(0,n.jsx)("td",{"data-label":m.lastMessageAt,children:He(l.lastMessageAt)});case"adopt":return(0,n.jsx)("td",{"data-label":m.adopt,children:l.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null});default:return null}}return(0,n.jsxs)("table",{id:"sessions-table",hidden:e.hidden,children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{children:(0,n.jsx)("input",{ref:t,type:"checkbox",id:"select-all",title:o("sessions.activeOnly"),checked:e.selectAllChecked,disabled:e.selectAllDisabled,onChange:l=>e.onSelectAll(l.currentTarget.checked)})}),a.map(l=>(0,n.jsx)(go,{sort:l.id,label:l.label,sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.onSort},l.id)),(0,n.jsx)("th",{className:"session-table-columns-th",children:(0,n.jsxs)("details",{className:"session-table-columns-menu",children:[(0,n.jsxs)("summary",{title:o("sessions.columns"),children:[(0,n.jsx)("span",{className:"session-table-columns-icon","aria-hidden":"true",children:(0,n.jsx)("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:(0,n.jsx)("path",{d:"M2 4h12M2 8h12M2 12h12"})})}),o("sessions.columns")]}),(0,n.jsxs)("div",{className:"session-table-columns-dropdown",role:"menu",children:[(0,n.jsxs)("div",{className:"session-table-columns-header",children:[(0,n.jsx)("span",{children:o("sessions.columnsMenu")}),(0,n.jsx)("button",{type:"button",className:"session-table-columns-reset",onClick:e.onResetColumns,children:o("sessions.columnsReset")})]}),s.map(l=>(0,n.jsxs)("label",{className:"session-table-columns-item",children:[(0,n.jsx)("input",{type:"checkbox",checked:!e.hiddenColumns.has(l.id),onChange:()=>e.onToggleColumn(l.id)}),l.label]},l.id))]})]})})]})}),(0,n.jsx)("tbody",{children:e.rows.length?e.rows.map(l=>{let g=l.status==="closed",C=String(l.sessionId);return(0,n.jsxs)("tr",{"data-id":C,onClick:()=>e.onOpen(l),children:[(0,n.jsx)("td",{className:"sessions-table-select-cell","data-label":m.select,onClick:w=>w.stopPropagation(),children:(0,n.jsx)("input",{type:"checkbox",className:"row-select",checked:e.selected.has(C),disabled:g,onChange:w=>e.onSelect(C,w.currentTarget.checked)})}),a.map(w=>(0,n.jsx)(c.Fragment,{children:f(l,w.id)},w.id)),(0,n.jsx)("td",{className:"sessions-table-action-cell","data-label":m.actions,children:(0,n.jsx)("button",{className:"open",type:"button",children:o("sessions.details")})})]},C)}):(0,n.jsx)("tr",{children:(0,n.jsx)("td",{colSpan:r,className:"empty",children:o("sessions.empty")})})})]})}function To(e){let{exchange:t}=e,s=(0,c.useRef)(null),a=(0,c.useRef)(null),r=(0,c.useRef)(null),[m,f]=(0,c.useReducer)(jt,Ut),l=m.open,[g,C]=(0,c.useState)(null),w=`session-exchange-tooltip-${(0,c.useId)().replace(/[^a-zA-Z0-9_-]/g,"-")}`,v=(0,c.useCallback)(()=>{r.current!==null&&(window.clearTimeout(r.current),r.current=null)},[]),B=(0,c.useCallback)(()=>{v(),f("open")},[v]),P=(0,c.useCallback)(()=>{v(),f("close"),C(null)},[v]),R=(0,c.useCallback)(()=>{v(),r.current=window.setTimeout(P,120)},[v,P]),M=(0,c.useCallback)(()=>{let E=s.current,_=a.current;if(!E||!_)return;let F=E.getBoundingClientRect(),U=_.getBoundingClientRect(),D=12,V=9,K=F.top-D-V,re=window.innerHeight-F.bottom-D-V,$=K>=U.height||K>re?"top":"bottom",Ce=F.left+F.width/2-U.width/2,Z=Math.min(Math.max(Ce,D),Math.max(D,window.innerWidth-U.width-D)),ve=$==="top"?F.top-U.height-V:F.bottom+V,Le=Math.min(Math.max(ve,D),Math.max(D,window.innerHeight-U.height-D));C({left:Z,placement:$,top:Le})},[]);return(0,c.useLayoutEffect)(()=>{if(l)return M(),window.addEventListener("resize",M),window.addEventListener("scroll",M,!0),()=>{window.removeEventListener("resize",M),window.removeEventListener("scroll",M,!0)}},[t.botFullText,t.userFullText,l,M]),(0,c.useEffect)(()=>()=>v(),[v]),(0,c.useEffect)(()=>{if(!l)return;let E=F=>{let U=F.target;U instanceof Node&&(s.current?.contains(U)||a.current?.contains(U)||P())},_=F=>{F.key==="Escape"&&P()};return document.addEventListener("pointerdown",E),document.addEventListener("keydown",_),()=>{document.removeEventListener("pointerdown",E),document.removeEventListener("keydown",_)}},[P,l]),!t.userText&&!t.botText?null:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"session-card-exchange-wrap",children:(0,n.jsxs)("div",{ref:s,className:"session-card-exchange",role:"button",tabIndex:0,"aria-label":o("sessions.preview.showFull"),"aria-haspopup":"dialog","aria-controls":l?w:void 0,"aria-expanded":l,onClick:E=>{E.stopPropagation(),l?P():B()},onFocus:()=>{v(),f("focus")},onBlur:R,onPointerEnter:E=>{E.pointerType!=="touch"&&B()},onPointerLeave:E=>{E.pointerType!=="touch"&&R()},onKeyDown:E=>{E.key==="Escape"?P():(E.key==="Enter"||E.key===" ")&&(E.preventDefault(),l?P():B())},children:[t.userText?(0,n.jsxs)("div",{className:"session-card-exchange-line",children:[(0,n.jsx)("span",{children:o("sessions.history.user")}),(0,n.jsx)("p",{children:t.userText})]}):null,t.botText?(0,n.jsxs)("div",{className:"session-card-exchange-line bot",children:[(0,n.jsx)("span",{children:o("sessions.history.bot")}),(0,n.jsx)("p",{children:t.botText})]}):null]})}),l&&typeof document<"u"?(0,Sn.createPortal)((0,n.jsx)("div",{ref:a,id:w,className:"session-card-exchange-tooltip",role:"dialog","aria-label":o("sessions.preview.latestExchange"),"data-placement":g?.placement??"top",style:{left:g?.left??-1e4,top:g?.top??-1e4,visibility:g?"visible":"hidden"},onPointerEnter:v,onPointerLeave:E=>{E.pointerType!=="touch"&&R()},onFocusCapture:v,onBlur:E=>{let _=E.relatedTarget;_&&(a.current?.contains(_)||s.current?.contains(_))||R()},onKeyDown:E=>{E.key==="Escape"&&(E.stopPropagation(),v(),f("escape-refocus"),C(null),s.current?.focus())},children:(0,n.jsxs)("div",{className:"session-card-exchange-tooltip-scroll",children:[t.userFullText?(0,n.jsxs)("div",{className:"session-card-exchange-tooltip-line",children:[(0,n.jsx)("span",{children:o("sessions.history.user")}),(0,n.jsx)("div",{className:"session-card-exchange-md",dangerouslySetInnerHTML:de(Vn(t.userFullText))})]}):null,t.botFullText?(0,n.jsxs)("div",{className:"session-card-exchange-tooltip-line bot",children:[(0,n.jsx)("span",{children:o("sessions.history.bot")}),(0,n.jsx)("div",{className:"session-card-exchange-md",dangerouslySetInnerHTML:de(Vn(t.botFullText))})]}):null]})}),document.body):null]})}function ks(e){let t=e.row,s=ye(t.title)||t.sessionId,a=fe(t),r=Ke(t),m=tn(t),f=po(t),l=jn(t.workingDir),g=Ft(t),C=w=>{w.target.closest("a, button, input, label")||e.onToggleSelect(t)};return(0,n.jsxs)("article",{className:`session-card${e.selected?" selected":""}${t.locked?" locked":""}`,"data-id":t.sessionId,"aria-pressed":e.selected,onClick:C,children:[(0,n.jsxs)("div",{className:"session-card-top",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:de(_e({name:a,larkAppId:t.larkAppId,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-card-title",children:[(0,n.jsx)("strong",{title:String(t.title??s),children:String(s).slice(0,72)}),(0,n.jsxs)("span",{children:[a," \xB7 ",r??on(t)]})]}),(0,n.jsxs)("span",{className:"session-card-status-group",children:[(0,n.jsx)(In,{status:t.status}),(0,n.jsx)(nt,{row:t})]})]}),l!=="-"||t.adopt||f?(0,n.jsxs)("div",{className:"session-card-meta",children:[l!=="-"?(0,n.jsx)("span",{title:t.workingDir??"",children:l}):null,t.adopt?(0,n.jsx)("span",{className:"badge",children:"adopt"}):null,f?(0,n.jsx)("span",{className:"session-signal",title:f,children:f}):null]}):null,(0,n.jsx)(To,{exchange:g}),(0,n.jsx)("div",{className:"session-card-time",children:(0,n.jsx)("span",{children:t.agentAttention?.at?`${o("sessions.board.waiting")} ${He(pn(t))}`:`${o("sessions.last")}: ${He(t.lastMessageAt)}`})}),(0,n.jsxs)("div",{className:"session-card-actions",children:[(0,n.jsx)(ys,{row:t}),!t.feishuChatLink||t.scope!=="chat"?(0,n.jsx)(ko,{row:t,onLocate:e.onLocate}):null,(0,n.jsx)(Ae,{action:"details",icon:j.details,label:o("sessions.details"),onClick:()=>e.onOpen(t)}),Cn(t)?(0,n.jsx)(Ae,{action:"restart",icon:j.restart,label:o("sessions.restart"),onClick:w=>e.onRestart(t,w)}):null,(0,n.jsx)(hs,{row:t,url:m}),t.status!=="closed"?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(Ae,{action:"lock",icon:t.locked?j.unlock:j.lock,label:wn(t),kind:t.locked?"locked":"",onClick:w=>e.onLock(t,!t.locked,w)}),(0,n.jsx)(Ae,{action:"close",icon:j.close,label:o("sessions.close"),kind:"danger",onClick:w=>e.onClose(t,w)})]}):null]})]})}function No(e){(0,c.useEffect)(()=>{!e.hidden&&!e.animated&&e.onAnimated()},[e.animated,e.hidden,e.onAnimated]);let t=new Map(Fn.map(a=>[a.id,[]]));for(let a of e.rows){let r=Vt(a);r&&t.get(r).push(a)}let s=e.order.map(a=>Fn.find(r=>r.id===a)).filter(a=>!!a);return(0,n.jsx)("div",{id:"sessions-board",className:`sessions-board${e.animated||e.hidden?"":" board-enter"}`,hidden:e.hidden,children:s.map((a,r)=>{let m=(t.get(a.id)??[]).sort((f,l)=>fo(f,l,a.id));return(0,n.jsxs)("section",{className:`session-board-column session-board-${a.id}${e.dragColId===a.id?" dragging":""}${e.dragOverCol===a.id?" drag-over":""}`,"data-col":a.id,onDragOver:f=>{e.dragColId&&(f.preventDefault(),f.dataTransfer&&(f.dataTransfer.dropEffect="move"),e.dragColId!==a.id&&e.onDragOverCol(a.id))},onDrop:f=>{e.dragColId&&(f.preventDefault(),e.onMoveColumnTo(e.dragColId,a.id),e.onDragCol(null),e.onDragOverCol(null))},children:[(0,n.jsxs)("header",{draggable:!0,title:o("sessions.board.dragHint"),onDragStart:f=>{e.onDragCol(a.id),f.dataTransfer&&(f.dataTransfer.effectAllowed="move",f.dataTransfer.setData("text/plain",a.id))},onDragEnd:()=>{e.onDragCol(null),e.onDragOverCol(null)},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{children:o(a.labelKey)}),(0,n.jsx)("p",{children:o(a.hintKey)})]}),(0,n.jsxs)("span",{className:"session-board-head-right",children:[(0,n.jsxs)("span",{className:"session-board-move",children:[(0,n.jsx)("button",{type:"button","data-move-col":a.id,"data-dir":"-1","aria-label":o("sessions.board.moveLeft"),disabled:r===0,onClick:()=>e.onMoveColumn(a.id,-1),children:"\u2039"}),(0,n.jsx)("button",{type:"button","data-move-col":a.id,"data-dir":"1","aria-label":o("sessions.board.moveRight"),disabled:r===s.length-1,onClick:()=>e.onMoveColumn(a.id,1),children:"\u203A"})]}),(0,n.jsx)("span",{className:"session-board-count",children:m.length})]})]}),(0,n.jsx)("div",{className:"session-board-list",children:m.length?m.map(f=>(0,n.jsx)(ks,{row:f,selected:e.selected.has(f.sessionId),onToggleSelect:e.onToggleSelect,onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},f.sessionId)):(0,n.jsx)("div",{className:"session-board-empty",children:o("sessions.board.emptyColumn")})})]},a.id)})})}function xo(e){let t=ye(e.title).trim();return t||(e.kind==="thread"?o("sessions.topic.untitled"):e.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession"))}function Ro(e){let t=(0,c.useMemo)(()=>yn(e.rows),[e.rows]),s=(0,c.useMemo)(()=>new Map(yn(e.relationRows??e.rows).map(a=>[a.key,a])),[e.relationRows,e.rows]);return(0,n.jsx)("div",{id:"sessions-topics",className:"sessions-topic-view",hidden:e.hidden,children:t.length?t.map(a=>{let r=s.get(a.key)??a,m=a.rows[0],f=Fe(m),l=xo(r),g=r.rootMessageId||r.chatId;return(0,n.jsxs)("section",{className:`session-topic-group${r.multiBot?" multi-bot":""}${r.inferredBotTriggered?" inferred-bot-trigger":""}`,"data-topic-key":a.key,children:[(0,n.jsxs)("header",{children:[(0,n.jsx)("span",{className:"session-topic-avatar",dangerouslySetInnerHTML:de(gn({chatId:a.chatId,name:f,size:"sm"}))}),(0,n.jsxs)("div",{className:"session-topic-heading",children:[(0,n.jsx)("span",{className:"session-topic-location",children:f}),(0,n.jsx)("h2",{title:r.title,children:l}),(0,n.jsx)("code",{title:g,children:r.kind==="thread"?g:r.kind==="chat"?o("sessions.topic.wholeChat"):o("sessions.topic.singleSession")})]}),(0,n.jsxs)("div",{className:"session-topic-summary","aria-label":o("sessions.topic.summary"),children:[r.multiBot?(0,n.jsx)("span",{className:"topic-chip collaboration",children:o("sessions.topic.collaboration")}):null,(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.sessions",{count:r.rows.length})}),(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.bots",{count:r.botCount})}),(0,n.jsx)("span",{className:"topic-chip active",children:o("sessions.topic.active",{count:r.activeCount})}),r.closedCount?(0,n.jsx)("span",{className:"topic-chip",children:o("sessions.topic.closed",{count:r.closedCount})}):null,r.inferredBotInputCount?(0,n.jsx)("span",{className:"topic-chip inferred",title:o("sessions.topic.inferredHint"),children:o("sessions.topic.botInputs",{count:r.inferredBotInputCount})}):null,(0,n.jsxs)("span",{className:"session-topic-updated",children:[o("sessions.last"),": ",He(r.latestActivityAt)]})]})]}),(0,n.jsx)("div",{className:"session-topic-members",children:a.rows.map(C=>(0,n.jsx)(ks,{row:C,selected:e.selected.has(C.sessionId),onToggleSelect:w=>{w.status!=="closed"?e.onToggleSelect(w):e.onOpen(w)},onOpen:e.onOpen,onHistory:e.onHistory,onLocate:e.onLocate,onRestart:e.onRestart,onLock:e.onLock,onClose:e.onClose},C.sessionId))})]},a.key)}):(0,n.jsx)("div",{className:"sessions-topic-empty",children:o("sessions.topic.empty")})})}function Mo(e){let t=e.message,s=t.senderType==="user",a=t.senderType==="app"||t.senderType==="bot",r=s?t.senderName||(e.ownerOpenId&&t.senderId===e.ownerOpenId?o("sessions.history.owner"):o("sessions.history.user")):t.senderName||String(t.senderId??"").slice(0,16)||o(a?"sessions.history.bot":"sessions.history.system"),m=String(t.content??"").trim()||`[${t.msgType??"message"}]`;return(0,n.jsxs)("div",{className:`history-msg${e.groupStart?" group-start":" continuation"}`,children:[e.groupStart?s?t.senderAvatar?(0,n.jsx)("img",{className:"history-avatar-img",src:String(t.senderAvatar),alt:"",decoding:"async",referrerPolicy:"no-referrer"}):(0,n.jsx)("span",{className:"history-avatar-user","aria-hidden":"true",children:String(r).slice(0,1)}):(0,n.jsx)("span",{className:"history-avatar-bot",dangerouslySetInnerHTML:de(_e({name:r,larkAppId:t.senderBotAppId,avatarUrl:t.senderAvatar,size:"sm"}))}):(0,n.jsx)("span",{className:"history-avatar-spacer","aria-hidden":"true"}),(0,n.jsxs)("div",{className:"history-msg-main",children:[e.groupStart?(0,n.jsxs)("div",{className:"history-msg-meta",children:[(0,n.jsx)("span",{children:r}),(0,n.jsx)("time",{children:bo(t.createTime)})]}):null,(0,n.jsx)("div",{className:"history-bubble",children:m})]})]})}function Eo(e){let t=(0,c.useRef)(null);tt(t,!!e.state);let s=e.state?Ge.sessions.get(e.state.sessionId):null,a=(0,c.useRef)(null),r=!!e.state&&!e.state.loading&&!e.state.error&&e.state.messages.length>0;return(0,c.useEffect)(()=>{if(!r)return;let m=a.current;m&&(m.scrollTop=m.scrollHeight)},[r,e.state?.sessionId,e.state?.messages.length]),(0,n.jsx)("dialog",{id:"history-modal",className:"history-modal",ref:t,onClose:e.onClose,onClick:m=>{m.target===m.currentTarget&&e.onClose()},children:e.state&&s?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"term-modal-head",children:[(0,n.jsxs)("span",{className:"term-modal-title",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:de(_e({name:fe(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsx)("strong",{title:String(s.title??""),children:(ye(s.title)||s.sessionId).slice(0,60)}),(0,n.jsx)("span",{className:"history-scope-tag",children:o("sessions.history.title")})]}),(0,n.jsx)("span",{className:"term-modal-actions",children:(0,n.jsx)(Ae,{id:"history-close",icon:j.close,label:o("sessions.dismiss"),onClick:e.onClose})})]}),(0,n.jsxs)("div",{className:"history-body",ref:a,children:[e.state.loading?(0,n.jsx)(We,{label:o("sessions.history.loading"),className:"term-modal-loading",compact:!0}):null,!e.state.loading&&e.state.error?(0,n.jsxs)("div",{className:"history-error",children:[o("sessions.history.fail"),": ",e.state.error,e.state.stale?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("span",{children:o("sessions.history.staleHint")})]}):null]}):null,!e.state.loading&&!e.state.error&&e.state.messages.length===0?(0,n.jsx)("div",{className:"history-error",children:o("sessions.history.empty")}):null,!e.state.loading&&!e.state.error&&e.state.messages.length>0?(0,n.jsx)("div",{className:"history-list",children:e.state.messages.map((m,f,l)=>(0,n.jsx)(Mo,{message:m,ownerOpenId:e.state?.ownerOpenId,groupStart:f===0||Xn(l[f-1])!==Xn(m)},m.messageId??f))}):null]})]}):null})}function Ao(e){let[t,s]=(0,c.useState)(!1),[a,r]=(0,c.useState)(""),m=(0,c.useRef)(null),f=ye(e.row.title)||e.row.sessionId;(0,c.useLayoutEffect)(()=>{if(!t||!m.current)return;let g=m.current;g.focus(),g.select(),(()=>{let w=getComputedStyle(g),v=document.createElement("span");v.style.cssText="position:absolute;visibility:hidden;white-space:pre",v.style.fontSize=w.fontSize,v.style.fontFamily=w.fontFamily,v.style.fontWeight=w.fontWeight,v.style.letterSpacing=w.letterSpacing,v.textContent=g.value||" ",document.body.appendChild(v);let B=Math.round(window.innerWidth*.6);g.style.width=`${Math.min(Math.max(v.offsetWidth+22,80),B)}px`,v.remove()})()},[t,a]);let l=g=>{let C=a.trim();s(!1),g&&C&&C!==f&&e.onRename(e.row,C)};return t?(0,n.jsx)("input",{ref:m,type:"text",className:"term-modal-name-input",maxLength:200,value:a,onChange:g=>r(g.currentTarget.value),onBlur:()=>l(!0),onKeyDown:g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),l(!0)):g.key==="Escape"&&(g.preventDefault(),l(!1))}}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("strong",{className:"term-modal-name",title:String(e.row.title??f),children:String(f).slice(0,60)}),(0,n.jsx)(Ae,{id:"term-modal-edit",icon:j.edit,label:o("sessions.kanban.rename"),onClick:()=>{r(ye(e.row.title)||""),s(!0)}})]})}function Lo(e){let t=(0,c.useRef)(null);tt(t,!!e.state);let s=e.state?Ge.sessions.get(e.state.sessionId):null,a=s?tn(s):null,r=e.state?.url??a??"",m=s?on(s):"",f=s?jn(s.workingDir):"";return(0,n.jsx)("dialog",{id:"term-modal",className:"term-modal",ref:t,onClose:e.onClose,onClick:l=>{l.target===l.currentTarget&&e.onClose()},children:e.state&&s?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"term-modal-head",children:[(0,n.jsxs)("span",{className:"term-modal-title",children:[(0,n.jsx)("span",{dangerouslySetInnerHTML:de(_e({name:fe(s),larkAppId:s.larkAppId,size:"sm"}))}),(0,n.jsxs)("span",{className:"term-modal-title-copy",children:[(0,n.jsxs)("span",{className:"term-modal-title-main",children:[(0,n.jsx)(Ao,{row:s,onRename:e.onRename}),(0,n.jsx)(In,{status:s.status})]}),(0,n.jsxs)("span",{className:"term-modal-subtitle",children:[(0,n.jsx)("span",{children:fe(s)}),(0,n.jsx)("span",{children:m}),f!=="-"?(0,n.jsx)("span",{title:s.workingDir??"",children:f}):null]})]})]}),(0,n.jsxs)("span",{className:"term-modal-actions",children:[s.feishuChatLink?(0,n.jsx)("a",{className:"card-act",href:s.feishuChatLink,target:"_blank",rel:"noopener",title:o("sessions.kanban.openFeishu"),"aria-label":o("sessions.kanban.openFeishu"),dangerouslySetInnerHTML:de(j.feishu)}):null,(0,n.jsx)("a",{id:"term-modal-tab",className:"card-act",href:r,target:"_blank",rel:"noopener",title:o("sessions.kanban.openTab"),"aria-label":o("sessions.kanban.openTab"),dangerouslySetInnerHTML:de(j.terminal)}),(0,n.jsx)(Ae,{id:"term-modal-close",icon:j.close,label:o("sessions.dismiss"),onClick:e.onClose})]})]}),(0,n.jsx)("div",{className:"term-modal-body",children:(0,n.jsx)("div",{className:"term-modal-frame-shell",children:e.state.loading?(0,n.jsx)(We,{label:o("sessions.kanban.terminalLoading"),className:"term-modal-loading",compact:!0}):(0,n.jsx)("iframe",{className:"term-modal-frame",src:r,allow:"clipboard-read; clipboard-write"})})})]}):null})}function Po(e){let t=e.report;if(!t||t.status!=="ok"){let g=t?.error?.message?String(t.error.message):String(t?.status??"error");return(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",g]})}let s=t.agg??{};if(!s.totalSpans)return(0,n.jsx)("p",{children:o("sessions.insightEmpty")});let a=[t.meta?.asOf?o("sessions.insightAsOf",{asOf:String(t.meta.asOf)}):null,t.meta?.partial?o("sessions.insightPartial"):null].filter(Boolean),r=Array.isArray(t.suggestions)?t.suggestions:[],m=Array.isArray(t.spans)?t.spans:[],f=g=>g==="bad"||g==="warn"?"!":"i",l=g=>g==="error"?"!":g==="running"?"...":"ok";return(0,n.jsxs)(n.Fragment,{children:[a.length?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:a.join(" \xB7 ")}):null,(0,n.jsx)("p",{children:o("sessions.insightMetrics",{total:String(s.totalSpans??0),failed:String(s.failedSpans??0),slow:String(s.slowSpans??0),rw:s.readWriteRatio===null||s.readWriteRatio===void 0?"-":String(s.readWriteRatio),compactions:String(s.compactions??0)})}),r.length?(0,n.jsxs)("details",{open:!0,children:[(0,n.jsx)("summary",{children:o("sessions.insightSuggestions")}),(0,n.jsx)("ul",{style:{paddingLeft:18,margin:"6px 0"},children:r.map((g,C)=>(0,n.jsxs)("li",{children:[f(String(g.severity??""))," ",(0,n.jsx)("b",{children:String(g.title??"")})," - ",String(g.action??""),Array.isArray(g.evidence)&&g.evidence.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("br",{}),(0,n.jsx)("small",{style:{color:"var(--muted,#8f959e)"},children:g.evidence.join("; ")})]}):null]},C))})]}):null,m.length?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{children:[o("sessions.insightSpans")," (",m.length,")"]}),t.meta?.capped?(0,n.jsx)("p",{style:{fontSize:12,color:"var(--muted,#8f959e)"},children:o("sessions.insightCapped",{shown:String(t.meta.spansReturned??m.length),total:String(t.meta.spansTotal??m.length)})}):null,(0,n.jsx)("div",{style:{maxHeight:320,overflow:"auto"},children:(0,n.jsx)("table",{style:{width:"100%",fontSize:12},children:(0,n.jsx)("tbody",{children:[...m].sort((g,C)=>(g.relStartMs??0)-(C.relStartMs??0)).map((g,C)=>{let w=[g.inputSummary,g.outputSummary].filter(Boolean).map(String).join(" -> ");return(0,n.jsxs)("tr",{style:g.status==="error"?{color:"var(--danger,#d33)"}:void 0,children:[(0,n.jsx)("td",{children:l(String(g.status??""))}),(0,n.jsx)("td",{children:(0,n.jsx)("code",{children:String(g.tool??"")})}),(0,n.jsx)("td",{children:String(g.phase??"")}),(0,n.jsx)("td",{children:ho(g.durationMs)}),(0,n.jsxs)("td",{children:["#",String(g.turnIndex??0)]}),(0,n.jsx)("td",{children:w})]},C)})})})})]}):null]})}function Bo(e){let[t,s]=(0,c.useState)(null);if((0,c.useEffect)(()=>s(null),[e.row.sessionId]),!$e.authed)return null;let a=async()=>{s({loading:!0});try{let r=await fetch(`/api/sessions/${encodeURIComponent(e.row.sessionId)}/insight?detail=spans`),m=await r.json().catch(()=>({}));!m.ok||!m.report?s({loading:!1,error:String(m.error??r.status)}):s({loading:!1,report:m.report})}catch(r){s({loading:!1,error:String(r)})}};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{id:"insight-btn",type:"button",disabled:t?.loading,onClick:()=>{a()},children:o("sessions.insight")}),(0,n.jsxs)("div",{id:"insight-area",children:[t?.loading?(0,n.jsx)(We,{label:o("sessions.insightLoading"),compact:!0}):null,t?.error?(0,n.jsxs)("p",{children:[o("sessions.insightUnavailable"),": ",t.error]}):null,t?.report?(0,n.jsx)(Po,{report:t.report}):null]})]})}function Oo(e){let t=(0,c.useRef)(null);tt(t,!!e.row);let s=e.row,a=s?tn(s):null;return(0,n.jsx)("dialog",{id:"drawer",ref:t,onClose:e.onClose,onClick:r=>{r.target===r.currentTarget&&e.onClose()},children:s?(0,n.jsxs)("article",{children:[(0,n.jsxs)("header",{children:[(0,n.jsxs)("div",{className:"drawer-title-row",children:[(0,n.jsx)("h3",{children:ye(s.title)||s.sessionId}),(0,n.jsx)(Ae,{id:"drawer-close",className:"card-act drawer-close-btn",icon:j.close,label:o("sessions.dismiss"),onClick:e.onClose})]}),(0,n.jsxs)("span",{className:"drawer-status-line",children:[(0,n.jsx)(In,{status:s.status}),(0,n.jsx)(nt,{row:s})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("code",{children:s.sessionId})," ",(0,n.jsx)(et,{value:s.sessionId})]})]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.bot"),":"]})," ",fe(s)," \xB7 ",(0,n.jsxs)("b",{children:[o("sessions.cli"),":"]})," ",on(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.location"),":"]})," ",Fe(s)]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"chatId:"})," ",(0,n.jsx)("code",{children:s.chatId??""})," ",(0,n.jsx)(et,{value:s.chatId??""})]}),(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"rootMessageId:"})," ",(0,n.jsx)("code",{children:s.rootMessageId??""})," ",(0,n.jsx)(et,{value:s.rootMessageId??""})]}),s.threadId?(0,n.jsxs)("p",{children:[(0,n.jsx)("b",{children:"threadId:"})," ",(0,n.jsx)("code",{children:s.threadId})]}):null,(0,n.jsxs)("p",{children:[(0,n.jsxs)("b",{children:[o("sessions.workingDir"),":"]})," ",s.workingDir??"-"]}),(0,n.jsxs)("div",{className:"actions",children:[(0,n.jsx)(ys,{row:s}),!s.feishuChatLink||s.scope!=="chat"?(0,n.jsx)(yo,{row:s,locateSession:e.locateSession}):null,(0,n.jsx)("button",{id:"history-drawer-btn",type:"button",onClick:()=>e.openHistory(s),children:o("sessions.history.title")}),(0,n.jsx)(hs,{row:s,url:a}),kn()&&s.status!=="closed"?(0,n.jsx)("button",{id:"copy-cmd-btn",type:"button","data-tip":o("sessions.copyCommandHint"),onClick:r=>{Xt(s,r.currentTarget)},children:o("sessions.copyCommand")}):null,Cn(s)?(0,n.jsx)("button",{id:"restart-btn",type:"button",onClick:async r=>{await e.restartSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.restart")}):null,(0,n.jsx)("button",{id:"lock-btn",type:"button",onClick:r=>{e.setSessionLocked(s,!s.locked,r.currentTarget)},children:wn(s)}),s.queued&&s.status!=="closed"?(0,n.jsx)("button",{id:"start-btn",type:"button",className:"primary",onClick:async r=>{await e.startSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.create.start")}):null,s.status==="closed"?(0,n.jsx)("button",{id:"resume-btn",type:"button",className:"primary",onClick:async r=>{await e.resumeSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.resume")}):null,s.status!=="closed"?(0,n.jsx)("button",{id:"close-btn",type:"button",className:"contrast",onClick:async r=>{await e.closeSession(s,r.currentTarget)&&e.onClose()},children:o("sessions.close")}):null,(0,n.jsx)(Bo,{row:s})]})]}):null})}function Do(e){let t=e.state;(0,c.useEffect)(()=>{let p=e.dialog;return()=>{p.open&&p.close()}},[e.dialog]),(0,c.useEffect)(()=>{let p=e.dialog;if(t){if(!p.open)try{p.showModal()}catch{}}else p.open&&p.close()},[e.dialog,t]),(0,c.useEffect)(()=>{let p=e.dialog,T=()=>e.onClose(),x=L=>{L.target===p&&e.onClose()};return p.addEventListener("close",T),p.addEventListener("click",x),()=>{p.removeEventListener("close",T),p.removeEventListener("click",x)}},[e]);let[s,a]=(0,c.useState)(""),[r,m]=(0,c.useState)([]),[f,l]=(0,c.useState)(new Set),[g,C]=(0,c.useState)("lead"),[w,v]=(0,c.useState)(""),[B,P]=(0,c.useState)("in_progress"),[R,M]=(0,c.useState)(""),[E,_]=(0,c.useState)(""),[F,U]=(0,c.useState)(!1),[D,V]=(0,c.useState)(!1),[K,re]=(0,c.useState)(""),[$,Ce]=(0,c.useState)(()=>wt(ie())),[Z,ve]=(0,c.useState)(null),[Le,Pe]=(0,c.useState)([]),[z,Ue]=(0,c.useState)(""),[Se,N]=(0,c.useState)(""),[S,G]=(0,c.useState)(""),[ue,X]=(0,c.useState)(""),[me,J]=(0,c.useState)(!1),[q,le]=(0,c.useState)(!1),[be,Ie]=(0,c.useState)(""),[je,Q]=(0,c.useState)(""),[ge,ee]=(0,c.useState)(null),[oe,Ne]=(0,c.useState)(0),xe=(0,c.useRef)(null),Re=(0,c.useRef)(1);(0,c.useEffect)(()=>{t&&(a(""),m([]),l(new Set),C("lead"),v(""),P("in_progress"),M(""),_(""),U(!1),V(!1),re(""),ve(null),N(""),G(""),X(""),Ie(""),Q(""),ee(null),Ne(0),Re.current=1)},[t]),(0,c.useEffect)(()=>{if(!be)return;let p=!0,T=window.setInterval(()=>{fetch("/api/feed-groups").then(async x=>{let L=await x.json().catch(()=>({}));!x.ok||!L.ok||!p||(Pe(Array.isArray(L.groups)?L.groups:[]),Ue(typeof L.larkAppId=="string"?L.larkAppId:""),X(""),Ie(""),Q(""))}).catch(()=>{})},1e3);return()=>{p=!1,window.clearInterval(T)}},[be]),(0,c.useEffect)(()=>{if(!t||t.loading||t.success)return;let p=!0;return J(!0),fetch("/api/feed-groups").then(async T=>{let x=await T.json().catch(()=>({}));if(!T.ok||!x.ok)throw new Error(x.message??x.error??`HTTP ${T.status}`);p&&(Pe(Array.isArray(x.groups)?x.groups:[]),Ue(typeof x.larkAppId=="string"?x.larkAppId:""),X(""))}).catch(T=>{p&&X(T instanceof Error?T.message:String(T))}).finally(()=>{p&&J(!1)}),()=>{p=!1}},[t]);let ne=async()=>{let p=z?`?larkAppId=${encodeURIComponent(z)}`:"",T=await fetch(`/api/feed-groups/auth-url${p}`),x=await T.json().catch(()=>({}));if(!T.ok||!x.authUrl){alert(x.error??`HTTP ${T.status}`);return}Ie(String(x.authUrl)),Q("")},Qe=async p=>{le(!0);try{let T=await fetch("/api/feed-groups/oauth-callback",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({callbackUrl:p.trim()})}),x=await T.json().catch(()=>({}));if(!T.ok||!x.ok)throw new Error(x.message??x.error??`HTTP ${T.status}`);let L=await fetch("/api/feed-groups"),O=await L.json().catch(()=>({}));if(!L.ok||!O.ok)throw new Error(O.message??O.error??`HTTP ${L.status}`);Pe(Array.isArray(O.groups)?O.groups:[]),Ue(typeof O.larkAppId=="string"?O.larkAppId:""),X(""),Ie(""),Q("")}catch(T){alert(T instanceof Error?T.message:String(T))}finally{le(!1)}};if(!t)return null;if(t.success){let p=t.success,T=typeof p.shareLink=="string"&&p.shareLink?p.shareLink:"",x=Array.isArray(p.failed)?p.failed.length:0,L=Array.isArray(p.spawned)?p.spawned.length:0,O=p.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress");return(0,n.jsxs)("article",{className:"cs-card",children:[(0,n.jsx)("header",{className:"cs-header",children:(0,n.jsx)("h3",{children:o("sessions.create.doneTitle")})}),(0,n.jsxs)("p",{children:[O,"\uFF08",L,"\uFF09"]}),x>0?(0,n.jsx)("p",{className:"cs-warn",children:o("sessions.create.partialFail",{n:String(x)})}):null,T?(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:T,target:"_blank",rel:"noopener",children:o("sessions.create.openChat")})}):null,(0,n.jsx)("div",{className:"actions",children:(0,n.jsx)("button",{type:"button",id:"cs-done",className:"primary",onClick:e.onClose,children:o("sessions.create.close")})})]})}if(t.loading)return(0,n.jsxs)("article",{className:"cs-card",children:[(0,n.jsx)("header",{className:"cs-header",children:(0,n.jsx)("h3",{children:o("sessions.create.title")})}),(0,n.jsx)(We,{label:o("common.loading"),className:"cs-loading",compact:!0}),(0,n.jsx)("div",{className:"actions cs-actions",children:(0,n.jsx)("button",{type:"button",id:"cs-cancel",onClick:e.onClose,children:o("sessions.create.cancel")})})]});let Be=t.bots,Me=[...f],Ee=Me,an=p=>Be.find(T=>T.larkAppId===p)?.botName??p,Te=K.trim().toLowerCase(),rn=Te?Be.filter(p=>p.botName.toLowerCase().includes(Te)||p.larkAppId.toLowerCase().includes(Te)):Be,ce=ge?es(Be,ge.query).slice(0,8):[],ln=p=>{if(!ge)return;let T=Qt(s,ge,p.botName);a(T.text),ee(null),Ne(0),l(x=>new Set(x).add(p.larkAppId)),v(x=>x||p.larkAppId),requestAnimationFrame(()=>{let x=xe.current;x&&(x.focus(),x.setSelectionRange(T.caret,T.caret))})},cn=p=>{if(!(!ge||ce.length===0)){if(p.key==="ArrowDown"||p.key==="ArrowUp"){p.preventDefault();let T=p.key==="ArrowDown"?1:-1;Ne(x=>(x+T+ce.length)%ce.length);return}if(p.key==="Enter"||p.key==="Tab"){p.preventDefault(),ln(ce[Math.min(oe,ce.length-1)]);return}p.key==="Escape"&&(p.preventDefault(),ee(null))}},Tn=async p=>{let T=[...p.clipboardData.files].filter(Y=>Y.type.startsWith("image/"));if(T.length===0)return;p.preventDefault();let x=p.currentTarget.selectionStart??s.length,L=p.currentTarget.selectionEnd??x,O=T.filter(Y=>io.has(Y.type.toLowerCase()));if(O.length!==T.length){alert(o("sessions.create.imageUnsupported"));return}if(r.length+O.length>ps){alert(o("sessions.create.imageCountLimit",{n:String(ps)}));return}if(O.some(Y=>Y.size>ro)){alert(o("sessions.create.imageSizeLimit"));return}if(r.reduce((Y,he)=>Y+he.size,0)+O.reduce((Y,he)=>Y+he.size,0)>lo){alert(o("sessions.create.imageTotalLimit"));return}try{let Y=Re.current,he=await Promise.all(O.map(async(te,pe)=>{let qe=await co(te),xn=qe.indexOf(",");if(xn<0)throw new Error("bad_image_data");let De=Y+pe;return{id:`${Date.now()}-${pe}-${Math.random().toString(36).slice(2)}`,ordinal:De,marker:`[${o("sessions.create.imageMarker",{n:String(De)})}]`,name:te.name||`pasted-image-${r.length+pe+1}`,mimeType:te.type.toLowerCase(),size:te.size,dataBase64:qe.slice(xn+1),previewUrl:qe}}));Re.current+=he.length;let ae=ns(s,x,L,he.map(te=>te.marker));a(ae.text),m(te=>[...te,...he]),ee(null),requestAnimationFrame(()=>{let te=xe.current;te&&(te.focus(),te.setSelectionRange(ae.caret,ae.caret))})}catch{alert(o("sessions.create.imageReadFailed"))}},Nn=async p=>{p.preventDefault();let T=s.trim();if(!T){alert(o("sessions.create.errContent"));return}if(Me.length===0){alert(o("sessions.create.errNoBot"));return}let x=w||Me[0]||"";if(g==="lead"&&(!x||!Me.includes(x))){alert(o("sessions.create.errLead"));return}V(!0),ve(null);try{let L=await fetch("/api/sessions/create",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({content:T,larkAppIds:Me,mode:g,column:B,leadLarkAppId:g==="lead"?x:void 0,name:R.trim()||void 0,bindWorkingDir:E.trim()||void 0,feedGroupId:Se||void 0,newFeedGroupName:S.trim()||void 0,feedGroupAppId:Se||S.trim()?z:void 0,images:r.map(Oe=>({name:Oe.name,mimeType:Oe.mimeType,dataBase64:Oe.dataBase64}))})}),O=await L.json().catch(()=>null);L.ok&&O?.ok?$?(ve(O),a(""),m([]),Re.current=1,M("")):e.onSuccess(O):L.status!==401&&alert(`${o("sessions.create.failed")}: ${O?.error??L.status}`)}catch(L){alert(`${o("sessions.create.failed")}: ${L}`)}finally{V(!1)}};return(0,n.jsxs)("article",{className:"cs-card",children:[(0,n.jsx)("header",{className:"cs-header",children:(0,n.jsx)("h3",{children:o("sessions.create.title")})}),(0,n.jsxs)("form",{id:"cs-form",onSubmit:Nn,children:[(0,n.jsxs)("fieldset",{className:"cs-content",children:[(0,n.jsx)("legend",{children:o("sessions.create.content")}),(0,n.jsxs)("div",{className:"cs-composer",children:[(0,n.jsx)("textarea",{ref:xe,name:"content",rows:5,placeholder:o("sessions.create.contentPlaceholder"),"aria-describedby":"cs-content-help",required:!0,value:s,onChange:p=>{let T=p.currentTarget,x=T.value;a(x),ee(qn(x,T.selectionStart??x.length)),Ne(0)},onClick:p=>ee(qn(s,p.currentTarget.selectionStart??s.length)),onKeyDown:cn,onPaste:p=>{Tn(p)},onBlur:()=>setTimeout(()=>ee(null),0)}),ge?(0,n.jsx)("div",{className:"cs-mention-menu",role:"listbox","aria-label":o("sessions.create.mentionBots"),children:ce.length?ce.map((p,T)=>(0,n.jsxs)("button",{type:"button",role:"option","aria-selected":T===oe,className:T===oe?"active":void 0,onMouseDown:x=>x.preventDefault(),onClick:()=>ln(p),children:[(0,n.jsxs)("strong",{children:["@",p.botName]}),(0,n.jsx)("small",{children:p.larkAppId})]},p.larkAppId)):(0,n.jsx)("p",{children:o("sessions.create.noBotMatch")})}):null]}),(0,n.jsx)("small",{id:"cs-content-help",children:o("sessions.create.contentHelp")}),r.length?(0,n.jsx)("div",{className:"cs-image-list","aria-label":o("sessions.create.pastedImages"),children:r.map(p=>(0,n.jsxs)("figure",{className:"cs-image-item",children:[(0,n.jsx)("img",{src:p.previewUrl,alt:p.name}),(0,n.jsxs)("figcaption",{title:`${p.marker} ${p.name}`,children:[(0,n.jsx)("strong",{children:p.marker}),(0,n.jsx)("span",{children:p.name})]}),(0,n.jsx)("button",{type:"button",className:"cs-image-remove","aria-label":o("sessions.create.removeImage",{name:`${p.marker} ${p.name}`}),title:o("sessions.create.removeImage",{name:`${p.marker} ${p.name}`}),onClick:()=>{let T=r.filter(L=>L.id!==p.id),x=ts(s,p.marker,T.map(L=>L.marker),L=>`[${o("sessions.create.imageMarker",{n:String(L+1)})}]`);a(x.text),m(T.map((L,O)=>({...L,ordinal:O+1,marker:x.markers[O]}))),Re.current=T.length+1},children:(0,n.jsx)("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:(0,n.jsx)("path",{d:"M7 7l10 10M17 7 7 17"})})})]},p.id))}):null]}),(0,n.jsxs)("fieldset",{className:"cs-bots",children:[(0,n.jsx)("legend",{children:o("sessions.create.bots")}),Be.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("input",{className:"cs-bot-search",type:"search",name:"botSearch",placeholder:o("sessions.create.botSearchPlaceholder"),"aria-label":o("sessions.create.botSearchPlaceholder"),value:K,onChange:p=>re(p.currentTarget.value)}),rn.length?(0,n.jsx)("div",{className:"cs-bot-list",children:rn.map(p=>(0,n.jsxs)("label",{className:"cs-bot",children:[(0,n.jsx)("input",{type:"checkbox",name:"bot",value:p.larkAppId,checked:f.has(p.larkAppId),onChange:T=>{let x=T.currentTarget.checked;l(L=>{let O=new Set(L);return x?O.add(p.larkAppId):O.delete(p.larkAppId),O.has(w)||v(O.values().next().value??""),O})}})," ",(0,n.jsx)("span",{children:p.botName})]},p.larkAppId))}):(0,n.jsx)("p",{className:"cs-empty",children:o("sessions.create.noBotMatch")}),Me.length?(0,n.jsx)("small",{children:o("sessions.create.selectedCount",{n:String(Me.length)})}):null]}):(0,n.jsx)("p",{className:"cs-empty",children:o("sessions.create.noBots")})]}),(0,n.jsxs)("fieldset",{className:"cs-mode",children:[(0,n.jsx)("legend",{children:o("sessions.create.mode")}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"lead",checked:g==="lead",onChange:()=>C("lead")})," ",o("sessions.create.modeLead")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"mode",value:"all",checked:g==="all",onChange:()=>C("all")})," ",o("sessions.create.modeAll")]}),(0,n.jsx)("small",{children:o("sessions.create.modeHelp")})]}),be?(0,n.jsx)("div",{className:"feed-group-auth-overlay",children:(0,n.jsxs)("section",{className:"feed-group-auth-card",role:"dialog","aria-modal":"true","aria-labelledby":"session-feed-group-auth-title",children:[(0,n.jsx)("h3",{id:"session-feed-group-auth-title",children:"\u6388\u6743\u98DE\u4E66\u6807\u7B7E"}),(0,n.jsxs)("p",{children:["\u70B9\u51FB\u4E0B\u9762\u7684\u6309\u94AE\uFF0C\u5728\u98DE\u4E66\u9875\u9762\u786E\u8BA4\u6388\u6743\u3002\u5982\u679C BotMux \u4E0E\u6D4F\u89C8\u5668\u5728\u540C\u4E00\u53F0\u7535\u8111\uFF0C\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u5B8C\u6210\u6388\u6743\u3002\u5982\u679C BotMux \u8FD0\u884C\u5728\u8FDC\u7A0B\u865A\u62DF\u673A\u4E0A\uFF0C\u6D4F\u89C8\u5668\u4F1A\u56E0\u65E0\u6CD5\u8BBF\u95EE\u672C\u673A\u5730\u5740 ",(0,n.jsx)("code",{children:"127.0.0.1:9768"})," \u800C\u663E\u793A\u201C\u65E0\u6CD5\u8BBF\u95EE\u201D\uFF1B\u6B64\u65F6\u8BF7\u590D\u5236\u5730\u5740\u680F\u4E2D\u7684\u5B8C\u6574\u94FE\u63A5\u5E76\u7C98\u8D34\u5230\u4E0B\u65B9\u3002"]}),(0,n.jsx)("button",{type:"button",className:"primary feed-group-auth-open",onClick:()=>window.open(be,"_blank","noopener"),children:"\u8DF3\u8F6C\u98DE\u4E66\u6388\u6743"}),(0,n.jsxs)("label",{children:[(0,n.jsx)("span",{children:"\u8BF7\u628A\u70B9\u51FB\u6388\u6743\u540E\u7684\u5B8C\u6574\u94FE\u63A5\u7C98\u8D34\u5728\u8FD9\u91CC"}),(0,n.jsx)("input",{type:"url",value:je,placeholder:"http://127.0.0.1:9768/callback?code=\u2026&state=\u2026",onChange:p=>Q(p.currentTarget.value)})]}),(0,n.jsxs)("div",{className:"actions",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{Ie(""),Q("")},children:"\u53D6\u6D88"}),(0,n.jsx)("button",{type:"button",className:"primary",disabled:!je.trim()||q,onClick:()=>{Qe(je)},children:q?"\u6B63\u5728\u5B8C\u6210\u6388\u6743\u2026":"\u5B8C\u6210\u6388\u6743"})]})]})}):null,(0,n.jsxs)("fieldset",{className:"cs-lead-row",hidden:g!=="lead",children:[(0,n.jsx)("legend",{children:o("sessions.create.lead")}),(0,n.jsx)("select",{name:"lead",disabled:Ee.length===0,value:Ee.includes(w)?w:"",onChange:p=>v(p.currentTarget.value),children:Ee.length?Ee.map(p=>(0,n.jsx)("option",{value:p,children:an(p)},p)):(0,n.jsx)("option",{value:"",disabled:!0,children:o("sessions.create.leadPickFirst")})}),(0,n.jsx)("small",{children:o("sessions.create.leadHelp")})]}),(0,n.jsxs)("fieldset",{className:"cs-column",children:[(0,n.jsx)("legend",{children:o("sessions.create.column")}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"in_progress",checked:B==="in_progress",onChange:()=>P("in_progress")})," ",o("sessions.create.columnInProgress")]}),(0,n.jsxs)("label",{children:[(0,n.jsx)("input",{type:"radio",name:"column",value:"backlog",checked:B==="backlog",onChange:()=>P("backlog")})," ",o("sessions.create.columnBacklog")]}),(0,n.jsx)("small",{children:o("sessions.create.columnHelp")})]}),(0,n.jsxs)("fieldset",{className:`cs-advanced${F?" open":""}`,children:[(0,n.jsx)("legend",{children:(0,n.jsx)("button",{type:"button",id:"cs-advanced-title",className:"cs-advanced-title","aria-expanded":F,"aria-controls":"cs-advanced-fields",onClick:()=>U(p=>!p),children:o("sessions.create.optionalConfig")})}),F?(0,n.jsxs)("div",{id:"cs-advanced-fields",className:"cs-advanced-fields",children:[(0,n.jsxs)("label",{className:"cs-advanced-field",children:[(0,n.jsx)("span",{children:o("sessions.create.groupName")}),(0,n.jsx)("input",{className:"cs-pill-input",type:"text",name:"name",maxLength:60,placeholder:o("sessions.create.groupNamePlaceholder"),value:R,onChange:p=>M(p.currentTarget.value)})]}),(0,n.jsxs)("fieldset",{className:"cs-feed-group",children:[(0,n.jsx)("legend",{children:"\u98DE\u4E66\u6807\u7B7E\uFF08\u53EF\u9009\uFF09"}),(0,n.jsx)(Mt,{groups:Le,selectedId:Se,newName:S,disabled:me||!!ue,onChange:(p,T)=>{N(p),G(T)}}),(0,n.jsx)("small",{children:"\u5C55\u5F00\u540E\u53EF\u5728\u7B2C\u4E00\u884C\u8F93\u5165\u65B0\u6807\u7B7E\u540D\u79F0\uFF0C\u6216\u9009\u62E9\u4E0B\u65B9\u5DF2\u6709\u6807\u7B7E\u3002"}),me?(0,n.jsx)("small",{children:"\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u6807\u7B7E\u2026"}):null,ue?(0,n.jsxs)("div",{className:"cs-warn",children:[(0,n.jsx)("small",{children:ue})," ",(0,n.jsx)("button",{type:"button",disabled:q,onClick:()=>{ne()},children:q?"\u6B63\u5728\u5B8C\u6210\u6388\u6743\u2026":"\u7ACB\u5373\u6388\u6743"}),(0,n.jsx)("small",{children:" \u6388\u6743\u540E\u4F1A\u5F39\u7A97\u63D0\u793A\u4F60\u7C98\u8D34\u56DE\u8C03\u5730\u5740\u3002"})]}):null]}),(0,n.jsxs)("label",{className:"cs-advanced-field",children:[(0,n.jsx)("span",{children:o("sessions.create.workingDir")}),(0,n.jsx)("input",{className:"cs-pill-input",type:"text",name:"bindWorkingDir",placeholder:"e.g. ~/projects/foo",value:E,onChange:p=>_(p.currentTarget.value)}),(0,n.jsx)("small",{children:o("sessions.create.workingDirHelp")})]})]}):null]}),Z?(0,n.jsxs)("p",{className:"cs-keep-success",role:"status",children:[(0,n.jsxs)("span",{children:[Z.column==="backlog"?o("sessions.create.doneBacklog"):o("sessions.create.doneInProgress"),Array.isArray(Z.failed)&&Z.failed.length>0?` \xB7 ${o("sessions.create.partialFail",{n:String(Z.failed.length)})}`:""]}),typeof Z.shareLink=="string"&&Z.shareLink?(0,n.jsx)("a",{href:Z.shareLink,target:"_blank",rel:"noopener",children:o("sessions.create.openChat")}):null]}):null,(0,n.jsxs)("div",{className:"actions cs-actions",children:[(0,n.jsxs)("label",{className:"cs-keep-open",title:o("sessions.create.keepOpenHelp"),children:[(0,n.jsx)("input",{type:"checkbox",name:"keepOpen",checked:$,onChange:p=>{let T=p.currentTarget.checked;Ce(T),Ct(ie(),T)}}),(0,n.jsx)("span",{children:o("sessions.create.keepOpen")})]}),(0,n.jsx)("button",{type:"button",id:"cs-cancel",onClick:e.onClose,children:o("sessions.create.cancel")}),(0,n.jsx)("button",{type:"submit",className:"cs-submit",disabled:D||Be.length===0,children:D?o("sessions.create.submitting"):o("sessions.create.submit")})]})]})]})}function $o(){Rt();let e=xt(i=>[...i.sessions.values()]),[t,s]=(0,c.useState)(0),a=(0,c.useCallback)(()=>s(i=>i+1),[]),[r,m]=(0,c.useState)({q:"",status:"",adopt:"",chat:"",multiBotTopics:!1,botTriggeredTopics:!1,showUnknownChats:bt(ie()),active:!0,cli:new Set(we)}),[f,l]=(0,c.useState)(new Set),[g,C]=(0,c.useState)("lastMessageAt"),[w,v]=(0,c.useState)("desc"),[B,P]=(0,c.useState)(()=>new Set(gt(ie()))),[R,M]=(0,c.useState)(()=>ft(ie())),[E,_]=(0,c.useState)(()=>ht(ie())),[F,U]=(0,c.useState)(!1),[D,V]=(0,c.useState)(null),[K,re]=(0,c.useState)(null),[$,Ce]=(0,c.useState)(()=>vt(ie())),Z=`${R}:${R==="kanban"?$:"-"}`,ve=(0,c.useRef)(!0),[Le,Pe]=(0,c.useState)(0),[z,Ue]=(0,c.useState)([]),[Se,N]=(0,c.useState)(null),[S,G]=(0,c.useState)(!1),ue=(0,c.useRef)(!1),[X,me]=(0,c.useState)(()=>{try{return window.localStorage.getItem(Dn)??""}catch{return""}}),[J,q]=(0,c.useState)({data:null,key:"",fetchedAt:0}),le=(0,c.useRef)(!1),be=(0,c.useRef)(new Set),[Ie,je]=(0,c.useState)(""),[Q,ge]=(0,c.useState)(null),[ee,oe]=(0,c.useState)(null),[Ne,xe]=(0,c.useState)(null),[Re,ne]=(0,c.useState)(!1),[Qe,Be]=(0,c.useState)(24),[Me,Ee]=(0,c.useState)(""),[an,Te]=(0,c.useState)(null),[rn,ce]=(0,c.useState)(null),[ln,cn]=(0,c.useState)(null),[Tn,Nn]=(0,c.useState)(null),[p,T]=(0,c.useState)(null),[x,L]=(0,c.useState)(null),[O,Oe]=(0,c.useState)(!1),Y=(0,c.useRef)(0);(0,c.useLayoutEffect)(()=>{if(ve.current){ve.current=!1;return}Pe(i=>i+1)},[Z]),(0,c.useEffect)(()=>{T(document.getElementById("create-session-modal"))},[]),(0,c.useEffect)(()=>{It().then(a)},[a]);let he=(0,c.useMemo)(()=>{let i=new Map;for(let u of e){let d=String(u.chatId??"").trim();if(!d||!r.showUnknownChats&&zn(u))continue;let b=Fe(u),y=i.get(d);(!y||b<y)&&i.set(d,b)}return[...i.entries()].sort((u,d)=>u[1].localeCompare(d[1])).map(([u,d])=>({value:u,label:d}))},[r.showUnknownChats,t,e]);(0,c.useEffect)(()=>{r.chat&&(he.some(i=>i.value===r.chat)||m(i=>({...i,chat:""})))},[he,r.chat]);let ae=(0,c.useMemo)(()=>{let i=r.q.toLowerCase(),u=[...r.cli],d=u.length>0&&u.length<we.length,b=R==="kanban",y=r.multiBotTopics||r.botTriggeredTopics?new Set(yn(e).filter(h=>!r.multiBotTopics||h.multiBot).filter(h=>!r.botTriggeredTopics||h.inferredBotTriggered).map(h=>h.key)):null,k=e.filter(h=>!d||u.includes(h.cliId??"unknown")).filter(h=>r.showUnknownChats||!zn(h)).filter(h=>!r.status||h.status===r.status).filter(h=>!r.adopt||r.adopt==="yes"==!!h.adopt).filter(h=>!r.chat||String(h.chatId??"")===r.chat).filter(h=>!r.active||b||h.status!=="closed").filter(h=>!i||Jt(h).includes(i));return y?k.filter(h=>y.has(Jn(h))).sort((h,H)=>bs(h,H,g,w)):k.sort((h,H)=>bs(h,H,g,w))},[r,t,w,g,e,R]),te=(0,c.useMemo)(()=>Gt(e),[e]),pe=(0,c.useMemo)(()=>new Map(e.map(i=>[i.sessionId,i])),[e,t]),qe=(0,c.useMemo)(()=>ae.filter(i=>i.status!=="closed"),[ae]),De=(R==="table"||R==="topics"?ae:qe).filter(i=>i.status!=="closed"),st=[...f].map(i=>pe.get(i)).filter(i=>!!i&&i.status!=="closed"),ot=De.length>0&&De.every(i=>f.has(i.sessionId)),ws=De.some(i=>f.has(i.sessionId))&&!ot;(0,c.useEffect)(()=>{l(i=>{let u=!1,d=new Set;for(let b of i){let y=pe.get(b);y&&y.status!=="closed"?d.add(b):u=!0}return u?d:i})},[pe]);let Rn=(0,c.useCallback)(i=>{let u=new Set;if(!i)return u;for(let d of i.groupChats)u.add(d);if(Se)for(let[d,b]of Se){if(u.has(d))continue;let y=!1;for(let k of i.botIds)if(b.botIds.has(k)){y=!0;break}if(y){for(let k of b.observedNames)if(i.botNames.has(k)){u.add(d);break}}}return u},[Se]),at=(0,c.useMemo)(()=>{if(R==="kanban"&&$==="team"){let i=z.find(d=>d.key===X)??z[0],u=Rn(i);return ae.filter(d=>u.has(String(d.chatId)))}return ae},[$,X,z,ae,Rn,R]),Mn=(0,c.useCallback)(i=>Ot(at,i),[at]),En=(0,c.useCallback)(async()=>{if(!(ue.current||S)){ue.current=!0;try{let[i,u,d]=await Promise.all([fetch("/api/team/hosted").then(k=>k.json()).catch(()=>null),fetch("/api/team/remote-roster").then(k=>k.json()).catch(()=>null),fetch("/api/groups").then(k=>k.json()).catch(()=>null)]);Array.isArray(d?.chats)&&N(new Map(d.chats.map(k=>[String(k.chatId),{botIds:new Set((k.memberBots??[]).filter(h=>h.inChat).map(h=>String(h.larkAppId))),observedNames:new Set((k.observedBotNames??[]).map(h=>String(h)))}])));let b=k=>({ids:new Set(k.map(h=>String(h.larkAppId))),names:new Set(k.map(h=>String(h.name??"")).filter(Boolean))}),y=[];for(let k of i?.teams??[]){let{ids:h,names:H}=b(k.bots??[]);y.push({key:`local:${k.teamId}`,label:k.isDefault?o("team.myHostedTeam"):String(k.name??k.teamId),botIds:h,botNames:H,groupChats:new Set((k.groupChatIds??[]).map(W=>String(W)))})}for(let k of u?.memberships??[]){let{ids:h,names:H}=b(k.roster?.bots??[]);y.push({key:`${k.hubUrl}::${k.teamId}`,label:String(k.teamName??k.teamId??k.hubUrl),botIds:h,botNames:H,groupChats:new Set})}Ue(y),me(k=>y.length&&!y.some(h=>h.key===k)?y[0].key:k)}finally{G(!0),ue.current=!1}}},[S]),it=(0,c.useCallback)(async(i,u,d,b,y)=>{try{let h=i.startsWith("local:")?await fetch(`/api/team/board/local/${encodeURIComponent(i.slice(6))}/move`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:u,column:d,position:b})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:i,sessionId:u,column:d,position:b})}),H=await h.json().catch(()=>({}));(!h.ok||H?.ok===!1)&&(q(W=>{if(!W.data||W.key!==i)return W;let se={...W.data.board};return y?se[u]=y:delete se[u],{...W,data:{...W.data,board:se}}}),h.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${H?.error??h.status}`))}catch(k){q(h=>{if(!h.data||h.key!==i)return h;let H={...h.data.board};return y?H[u]=y:delete H[u],{...h,data:{...h.data,board:H}}}),alert(`${o("sessions.kanban.moveFail")}: ${k}`)}},[]),Cs=(0,c.useCallback)(async i=>{let u=J.key===i.key&&Date.now()-J.fetchedAt<3e4;if(!(le.current||u)){le.current=!0;try{let b=i.key.startsWith("local:")?`/api/team/board/local/${encodeURIComponent(i.key.slice(6))}`:`/api/team/remote-board?key=${encodeURIComponent(i.key)}`,y=await fetch(b),k=await y.json().catch(()=>({}));if(!y.ok||k?.ok===!1)return;let h=typeof k.deploymentId=="string"?k.deploymentId:null,H=[];for(let W of Array.isArray(k.reports)?k.reports:[])if(!(h&&W.deploymentId===h))for(let se of Array.isArray(W.sessions)?W.sessions:[])H.push({...se,remoteDeployment:W.deploymentName||W.deploymentId});q({key:i.key,fetchedAt:Date.now(),data:{board:k.board&&typeof k.board=="object"?k.board:{},remoteRows:H}})}finally{le.current=!1}}},[J.fetchedAt,J.key]);(0,c.useEffect)(()=>{R==="kanban"&&$==="team"&&!S&&En()},[$,S,En,R]),(0,c.useEffect)(()=>{let i=window.setInterval(()=>{R==="kanban"&&$==="team"&&(q(u=>({...u,fetchedAt:0})),a())},3e4);return()=>window.clearInterval(i)},[$,a,R]);let rt=(0,c.useCallback)(async(i,u,d,b)=>{try{let y=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/board`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({column:u,position:d})}),k=await y.json().catch(()=>({}));(!y.ok||k?.ok===!1)&&(i.kanbanColumn=b.column,i.kanbanPosition=b.position,a(),y.status!==401&&alert(`${o("sessions.kanban.moveFail")}: ${k?.error??y.status}`))}catch(y){i.kanbanColumn=b.column,i.kanbanPosition=b.position,a(),alert(`${o("sessions.kanban.moveFail")}: ${y}`)}},[a]),vs=(0,c.useCallback)(i=>{let u=!1;for(let d of i){let b=String(d.row.sessionId);if(!b||d.row.status==="closed"&&d.column!=="done")continue;if($==="team"){let h=z.find(se=>se.key===X)??z[0];if(!h)continue;let W=(J.key===h.key&&J.data?J.data.board:{})[b];q(se=>{let ut=se.key===h.key&&se.data?se.data:{board:{},remoteRows:se.data?.remoteRows??[]},Ks={...ut.board,[b]:{column:d.column,position:d.position}};return{...se,key:h.key,data:{...ut,board:Ks}}}),it(h.key,b,d.column,d.position,W),u=!0;continue}let y=Ge.sessions.get(b);if(!y)continue;let k={column:y.kanbanColumn,position:y.kanbanPosition};y.kanbanColumn=d.column,y.kanbanPosition=d.position,rt(y,d.column,d.position,k),u=!0}u&&a()},[$,X,z,J,rt,it,a]),lt=(0,c.useCallback)(async(i,u)=>{let d=i.title;i.title=u,a();try{let b=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/rename`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:u})}),y=await b.json().catch(()=>({}));(!b.ok||y?.ok===!1)&&(i.title=d,a(),b.status!==401&&alert(`${o("sessions.kanban.renameFail")}: ${y?.error??b.status}`))}catch(b){i.title=d,a(),alert(`${o("sessions.kanban.renameFail")}: ${b}`)}},[a]),An=(0,c.useCallback)(async i=>{try{let u=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/locate`,{method:"POST"}),d=await u.json();return d.ok?!0:(alert(`Locate failed: ${d.error??u.status}`),!1)}catch(u){return alert(`Locate error: ${u}`),!1}},[]),Ln=(0,c.useCallback)(async(i,u)=>{if(!confirm(o("sessions.closeConfirm")))return!1;u&&(u.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/close`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b?.ok===!1?(d.status!==401&&alert(`Close failed: ${b?.error??d.status}`),!1):(l(y=>{let k=new Set(y);return k.delete(i.sessionId),k}),a(),!0)}catch(d){return alert(`Close error: ${d}`),!1}finally{u&&(u.disabled=!1)}},[a]),dn=(0,c.useCallback)(async(i,u,d)=>{let b=!!i.locked;if(b===u)return!0;i.locked=u,a(),d&&(d.disabled=!0);try{let y=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:u})}),k=await y.json().catch(()=>({}));return!y.ok||k?.ok===!1?(i.locked=b,a(),y.status!==401&&alert(`${o("sessions.lockFailed")}: ${k?.error??y.status}`),!1):(i.locked=!!k.locked,a(),!0)}catch(y){return i.locked=b,a(),alert(`${o("sessions.lockFailed")}: ${y}`),!1}finally{d&&(d.disabled=!1)}},[a]),un=(0,c.useCallback)(async(i,u)=>{if(be.current.has(i.sessionId)||!confirm(qt(i)))return!1;u&&(u.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/restart`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b?.ok===!1?(d.status!==401&&alert(`${o("sessions.restartFailed")}: ${b?.message??b?.error??d.status}`),!1):(be.current.add(i.sessionId),window.setTimeout(()=>be.current.delete(i.sessionId),5e3),!0)}catch(d){return alert(`${o("sessions.restartFailed")}: ${d}`),!1}finally{u&&(u.disabled=!1)}},[]),Ss=(0,c.useCallback)(async(i,u)=>{u&&(u.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/resume`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b.ok===!1?(alert(`${o("sessions.resumeFailed")}: ${b?.error??d.status}`),!1):!0}catch(d){return alert(`${o("sessions.resumeFailed")}: ${d}`),!1}finally{u&&(u.disabled=!1)}},[]),Is=(0,c.useCallback)(async(i,u)=>{u&&(u.disabled=!0);try{let d=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/start`,{method:"POST"}),b=await d.json().catch(()=>({}));return!d.ok||b.ok===!1?(d.status!==401&&alert(`${o("sessions.create.startFailed")}: ${b?.error??d.status}`),!1):!0}catch(d){return alert(`${o("sessions.create.startFailed")}: ${d}`),!1}finally{u&&(u.disabled=!1)}},[]),mn=(0,c.useCallback)(i=>{ce({sessionId:i.sessionId,loading:!0,messages:[]}),(async()=>{try{let u=await fetch(`/api/sessions/${encodeURIComponent(i.sessionId)}/history?limit=80`),d=await u.json().catch(()=>({}));if(!u.ok||d?.ok===!1){let y=String(d?.error??u.status),k=y==="not_found_yet"||y==="not_found";ce(h=>h?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:y,stale:k}:h);return}let b=Array.isArray(d.messages)?d.messages:[];ce(y=>y?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:b,ownerOpenId:d.ownerOpenId}:y)}catch(u){ce(d=>d?.sessionId===i.sessionId?{sessionId:i.sessionId,loading:!1,messages:[],error:String(u)}:d)}})()},[]),Ts=(0,c.useCallback)(i=>{if(!Xe())return;let u=tn(i);if(!u){Te(i.sessionId);return}cn({sessionId:i.sessionId,url:u,loading:!1})},[]),Ns=(0,c.useCallback)((i,u)=>{Wn(i,u)},[]),xs=(0,c.useCallback)(async()=>{let i=[...f];if(i.length===0||!confirm(o("sessions.closeBulkConfirm",{count:i.length})))return;ge({done:0,total:i.length});let u=0,d=0,b=[...i];async function y(){for(;b.length;){let k=b.shift();try{let h=await fetch(`/api/sessions/${encodeURIComponent(k)}/close`,{method:"POST"}),H=await h.json().catch(()=>({}));(!h.ok||H?.ok===!1)&&(d+=1)}catch{d+=1}finally{u+=1,ge({done:u,total:i.length})}}}await Promise.all(Array.from({length:Math.min(6,i.length)},()=>y())),ge(null),l(new Set),a(),d>0&&alert(`Failed: ${d}/${i.length}`)},[a,f]),Rs=(0,c.useCallback)(async i=>{let u=[...f].map(h=>pe.get(h)).filter(h=>!!h&&h.status!=="closed"&&!!h.locked!==i);if(u.length===0)return;oe({locked:i,done:0,total:u.length});let d=0,b=0,y=[...u];async function k(){for(;y.length;){let h=y.shift(),H=!!h.locked;try{let W=await fetch(`/api/sessions/${encodeURIComponent(h.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:i})}),se=await W.json().catch(()=>({}));!W.ok||se?.ok===!1?(b+=1,h.locked=H):h.locked=!!se.locked}catch{b+=1,h.locked=H}finally{d+=1,oe({locked:i,done:d,total:u.length})}}}await Promise.all(Array.from({length:Math.min(6,u.length)},()=>k())),oe(null),a(),b>0&&alert(`${o("sessions.lockFailed")}: ${b}/${u.length}`)},[a,pe,f]),Ms=(0,c.useCallback)(()=>{let i=[...f].filter(d=>!!pe.get(d));if(i.length===0)return;let u=Pt(i);xe(o("sessions.monitorRoomAdded",{added:u.added,total:u.total})),window.setTimeout(()=>xe(null),1800)},[pe,f]),Es=(0,c.useCallback)(async i=>{let u=_n(i);if(!u)return;let d=Mn(u);if(d.length!==0){Be(u),ne(!0),Ee(o("sessions.idleCleanupRunning"));try{let b=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:u,sessionIds:d.map(k=>k.sessionId)})}),y=await b.json().catch(()=>({}));if(!b.ok){b.status!==401&&alert(`${o("sessions.idleCleanupFailed")}: ${y?.error??b.status}`),Ee("");return}l(k=>{let h=new Set(k);for(let H of y?.results??[])H?.ok&&H?.sessionId&&h.delete(String(H.sessionId));return h}),Ee(o("sessions.idleCleanupDone",{closed:Number(y?.closed??0),failed:Number(y?.failed??0)})),a()}catch(b){alert(`${o("sessions.idleCleanupFailed")}: ${b}`),Ee("")}finally{ne(!1)}}},[Mn,a]),As=i=>{let u=pt(i)??"board";u!==R&&(M(u),yt(ie(),u))},Ls=(i,u)=>{_(d=>{let b=d.indexOf(i),y=b+u;if(b<0||y<0||y>=d.length)return d;let k=[...d];return k.splice(b,1),k.splice(y,0,i),On(ie(),k),k})},Ps=(i,u)=>{i!==u&&_(d=>{let b=d.indexOf(i),y=d.indexOf(u);if(b<0||y<0)return d;let k=[...d];return k.splice(b,1),k.splice(y,0,i),On(ie(),k),k})},Bs=(0,c.useMemo)(()=>({rows:ae,groupBy:$,teams:z,teamsLoaded:S,teamKey:X,teamBoardData:J.data,teamBoardKey:J.key}),[$,X,z,S,ae,J.data,J.key]),Os=an?pe.get(an)??null:null,Pn=(0,c.useMemo)(()=>S?z.length?z.map(i=>({value:i.key,label:i.label})):[{value:"",label:o("sessions.kanban.noTeam")}]:[{value:"__loading",label:o("sessions.kanban.teamLoading")}],[z,S]),Ds=!S||z.length===0,ct=z.some(i=>i.key===X)?X:Pn[0]?.value??"",$s=Pn.find(i=>i.value===ct)?.label??o("sessions.kanban.groupTeam"),Hs=(0,c.useCallback)(()=>{Y.current+=1,Oe(!1),L(null)},[]),dt=(0,c.useCallback)(async()=>{let i=Y.current+1;Y.current=i,L({bots:[],loading:!0}),Oe(!0);try{let u=await Yt();if(Y.current!==i)return;L({bots:u})}finally{Y.current===i&&Oe(!1)}},[]),_s=(0,c.useCallback)(async()=>{let i=window.prompt(o("sessions.debugTerminalPrompt"),"");if(i===null)return;let u=i.trim(),d=window.open("about:blank","_blank");d&&(d.opener=null);try{let b=await fetch("/api/debug-terminal",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(u?{workingDir:u}:{})}),y=await b.json().catch(()=>({}));if(!b.ok||y?.ok===!1||!y?.url){d?.close(),b.status!==401&&alert(`${o("sessions.debugTerminalFail")}: ${y?.error??b.status}`);return}d?d.location.href=y.url:window.open(y.url,"_blank","noopener")}catch(b){d?.close(),alert(`${o("sessions.debugTerminalFail")}: ${b}`)}},[]);return(0,c.useEffect)(()=>{let i=()=>{Et()&&$e.authed&&dt()};return i(),window.addEventListener($n,i),()=>window.removeEventListener($n,i)},[]),(0,n.jsxs)("section",{className:"page sessions-page",children:[(0,n.jsxs)("div",{className:"page-heading",children:[(0,n.jsxs)("div",{className:"sessions-heading-main",children:[(0,n.jsx)("p",{className:"eyebrow",children:o("nav.sessions")}),(0,n.jsx)("h1",{children:o("sessions.title")}),(0,n.jsxs)("div",{className:"sessions-view-controls",children:[(0,n.jsx)("div",{className:"segmented sessions-view-toggle",role:"group","aria-label":o("sessions.viewMode"),children:[["kanban",o("sessions.viewKanban")],["board",o("sessions.viewBoard")],["topics",o("sessions.viewTopics")],["table",o("sessions.viewTable")]].map(([i,u])=>(0,n.jsx)("button",{type:"button","data-view":i,className:R===i?"active":void 0,"aria-pressed":R===i,onClick:()=>As(i),children:u},i))}),(0,n.jsx)("div",{className:`segmented kanban-groupby${R==="kanban"?" is-visible":" is-collapsed"}`,id:"kanban-groupby",role:"group","aria-label":o("sessions.kanban.groupBy"),"aria-hidden":R!=="kanban",children:[["flow",o("sessions.kanban.groupFlow")],["team",o("sessions.kanban.groupTeam")],["bot",o("sessions.kanban.groupBot")]].map(([i,u])=>(0,n.jsx)("button",{type:"button","data-groupby":i,className:$===i?"active":void 0,"aria-pressed":$===i,onClick:()=>{Ce(i),St(ie(),i)},children:u},i))}),(0,n.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!(R==="kanban"&&$==="team"&&S),children:Ie}),(0,n.jsx)(en,{id:"kanban-team",className:"kanban-team-menu",ariaLabel:o("sessions.kanban.groupTeam"),hidden:!(R==="kanban"&&$==="team"),disabled:Ds,label:$s,value:ct,options:Pn,onChange:i=>{if(z.some(u=>u.key===i)){me(i);try{window.localStorage.setItem(Dn,i)}catch{}}}})]})]}),(0,n.jsxs)("div",{className:"page-heading-actions sessions-page-actions",children:[Xe()?(0,n.jsx)("button",{type:"button",id:"monitor-room-open",className:"monitor-room-open",onClick:()=>{window.location.href=Bt()},children:o("sessions.monitorRoom")}):null,$e.authed?(0,n.jsx)("button",{type:"button",className:"debug-terminal-btn",title:o("sessions.debugTerminalHint"),onClick:()=>{_s()},children:o("sessions.debugTerminal")}):null,$e.authed?(0,n.jsx)(Nt,{className:"page-primary-action create-session-btn",disabled:O,onClick:()=>{dt()},children:o("sessions.create.button")}):null]})]}),(0,n.jsxs)("div",{className:"session-runtime-stats","aria-live":"polite",children:[(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:te.logical}),o("sessions.runtime.logical")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:te.resident}),o("sessions.runtime.resident")]}),(0,n.jsxs)("span",{children:[(0,n.jsx)("b",{children:te.dormant}),o("sessions.runtime.dormant")]})]}),(0,n.jsx)(Co,{chatOptions:he,filters:r,setFilters:m,idleCleanup:{busy:Re,hours:Qe,status:Me,countForHours:i=>Mn(i).length,onRun:Es}}),(0,n.jsx)(vo,{selectedCount:f.size,lockDisabled:!st.some(i=>!i.locked),unlockDisabled:!st.some(i=>!!i.locked),closeProgress:Q,lockProgress:ee,monitorRoomText:Ne,onClear:()=>l(new Set),onClose:()=>{xs()},onAddToMonitorRoom:Ms,onLock:i=>{Rs(i)}}),(0,n.jsxs)("div",{className:`sessions-view-stage${Le>0?" sessions-view-stage-enter":""}`,"data-view":R,"data-kanban-group":$,children:[(0,n.jsx)(Io,{rows:ae,selected:f,hidden:R!=="table",sortKey:g,sortDir:w,selectAllChecked:ot,selectAllIndeterminate:ws,selectAllDisabled:De.length===0,hiddenColumns:B,onToggleColumn:i=>{let u=!B.has(i),d=new Set(B);u?d.add(i):d.delete(i),Bn(ie(),Array.from(d)),P(d),u&&i===g&&(C("lastMessageAt"),v("desc"))},onResetColumns:()=>{P(new Set),Bn(ie(),[])},onOpen:i=>Te(i.sessionId),onSelect:(i,u)=>l(d=>{let b=new Set(d);return u?b.add(i):b.delete(i),b}),onSelectAll:i=>l(u=>{let d=new Set(u);for(let b of De)i?d.add(b.sessionId):d.delete(b.sessionId);return d}),onSort:i=>{g===i?v(w==="asc"?"desc":"asc"):(C(i),v(i==="spawnedAt"||i==="lastMessageAt"?"desc":"asc"))}}),(0,n.jsx)(No,{rows:qe,selected:f,hidden:R!=="board",order:E,animated:F,dragColId:D,dragOverCol:K,onAnimated:()=>U(!0),onMoveColumn:Ls,onMoveColumnTo:Ps,onDragCol:V,onDragOverCol:re,onToggleSelect:i=>l(u=>{let d=new Set(u);return d.has(i.sessionId)?d.delete(i.sessionId):d.add(i.sessionId),d}),onOpen:i=>Te(i.sessionId),onHistory:mn,onLocate:i=>An(i),onRestart:(i,u)=>{un(i,u)},onLock:(i,u,d)=>{dn(i,u,d)},onClose:(i,u)=>{Ln(i,u)}}),(0,n.jsx)(Ro,{rows:ae,relationRows:e,selected:f,hidden:R!=="topics",onToggleSelect:i=>l(u=>{let d=new Set(u);return d.has(i.sessionId)?d.delete(i.sessionId):d.add(i.sessionId),d}),onOpen:i=>Te(i.sessionId),onHistory:mn,onLocate:i=>An(i),onRestart:(i,u)=>{un(i,u)},onLock:(i,u,d)=>{dn(i,u,d)},onClose:(i,u)=>{Ln(i,u)}}),(0,n.jsx)("div",{id:"sessions-kanban",ref:Nn,className:`sessions-kanban${$==="bot"?" kanban-mode-bot":""}`,hidden:R!=="kanban",children:R==="kanban"?(0,n.jsx)(gs,{host:Tn,...Bs,canRestartSession:Cn,getTeamChatIds:Rn,icons:{details:j.details,feishu:j.feishu,history:j.history,key:j.key,lock:j.lock,restart:j.restart,terminal:j.terminal,unlock:j.unlock},lockActionLabel:wn,sessionStatusText:nn,onDetails:i=>Te(String(i.sessionId)),onHistory:mn,onMoveRows:vs,onNeedTeamBoard:i=>{Cs(i)},onNeedTeams:()=>{En()},onOpenTerminal:Xe()?Ts:void 0,onOpenWritableTerminal:Xe()&&kn()?Ns:void 0,onRename:(i,u)=>{let d=Ge.sessions.get(String(i.sessionId));d&<(d,u)},onRestart:(i,u)=>{let d=Ge.sessions.get(String(i.sessionId));d&&un(d,u)},onTeamScope:i=>je(i?o("sessions.kanban.teamScope",{chats:i.chats,sessions:i.sessions}):""),onToggleLock:(i,u)=>{let d=Ge.sessions.get(String(i.sessionId));d&&dn(d,!d.locked,u)},onToggleSelect:i=>l(u=>{let d=String(i.sessionId),b=new Set(u);return b.has(d)?b.delete(d):b.add(d),b}),selectedSessionIds:f}):null})]},Le),(0,n.jsx)(Oo,{row:Os,onClose:()=>Te(null),locateSession:An,openHistory:mn,resumeSession:Ss,restartSession:un,closeSession:Ln,setSessionLocked:dn,startSession:Is}),(0,n.jsx)(Lo,{state:ln,onClose:()=>cn(null),onRename:lt}),(0,n.jsx)(Eo,{state:rn,onClose:()=>ce(null)}),p?(0,Sn.createPortal)((0,n.jsx)(Do,{dialog:p,state:x,onClose:Hs,onSuccess:i=>L(u=>u&&{...u,success:i})}),p):null]})}function Na(e){return Tt(e,(0,n.jsx)($o,{}))}export{wo as CliFilterGroup,Ro as TopicGroupsView,Na as renderSessionsPage};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{c as K}from"./chunk-KOPISPHN.js";import{b as Ce,c as je,d as te,h as _e,l as de}from"./chunk-5CJMHTT4.js";import{z as we}from"./chunk-M6BHWQFO.js";import{a as He}from"./chunk-SYC6D5XU.js";import{a as bl,b as pl,d as Oe}from"./chunk-5THX4DI2.js";import{c as ce}from"./chunk-7SZRL6FY.js";var i=ce(bl(),1),qe=ce(pl(),1);var e=ce(Oe(),1),hl=2;function Sl(l,s){let o=String(l??"").replace(/\\/g,"/");return o.includes("/.codex/skills/")?s("skills.sourceCodex"):o.includes("/.claude/skills/")?s("skills.sourceClaude"):o.includes("/.trae/skills/")?s("skills.sourceTrae"):o.includes("/.cursor/skills/")?s("skills.sourceCursor"):o.includes("/.gemini/skills/")?s("skills.sourceGemini"):o.includes("/.config/opencode/skills/")?s("skills.sourceOpenCode"):null}function ze(l,s){let o=l.source??{};return o.type==="github"?`github:${o.owner}/${o.repo}/${o.path??""}`:o.type==="git"?`${o.url??"git"}#${o.path??""}`:o.type==="local-link"?Sl(o.path,s)??s("skills.sourceLocalLink"):o.type==="local-copy"?s("skills.sourceBotmuxCopy"):String(o.type??"unknown")}function ke(l){return(l?.include??[]).filter(s=>s.startsWith("skill:")).map(s=>s.slice(6))}function Nl(l){return ke(l).length}function wl(l){return ke(l).length>0}function ue(l){return`${l.cliId}
|
|
2
|
-
${l.rootDir}`}function Cl(l){return l>=1600?4:l<=620?1:l<=980?2:3}async function O(l,s){let o=await fetch(l,{...s,headers:{"content-type":"application/json",...s.headers??{}}}),k=await o.json().catch(()=>({}));if(!o.ok||k.ok===!1){let f=new Error(k?.error??`HTTP ${o.status}`);throw f.status=o.status,f.body=k,f}return k}function Re(l){return`oncall-status${l?` ${l.ok?"hint-ok":"hint-warn-inline"}`:""}`}function Ge(l){let s=l.options.find(o=>o.value===l.value);return(0,e.jsxs)("div",{className:"skills-segmented-control",children:[(0,e.jsx)("div",{className:"segmented skills-segmented",role:"group",children:l.options.map(o=>(0,e.jsx)("button",{type:"button",className:l.value===o.value?"active":"","aria-pressed":l.value===o.value?"true":"false",title:typeof o.help=="string"?o.help:void 0,disabled:l.disabled,onClick:()=>l.onChange(o.value),children:o.label},o.value))}),s?.help?(0,e.jsx)("span",{className:"skills-setting-hint",children:s.help}):null]})}function Rl(l){let s=K(),o=(0,i.useRef)(null),k=l.installCandidates??[],f=l.selectedInstallSkills??new Set,b=k.length>0&&k.every(r=>f.has(r.name)),y=l.installBusy||l.installDiscovering;return(0,i.useEffect)(()=>{let r=o.current;if(r)if(l.installSelectionOpen&&!r.open)try{r.showModal()}catch{}else!l.installSelectionOpen&&r.open&&r.close()},[l.installSelectionOpen,k.length]),(0,e.jsxs)("article",{className:"bd-card skills-install-panel",children:[l.showTitle===!1?null:(0,e.jsx)("div",{className:"skills-install-title",children:(0,e.jsx)("h3",{className:"bd-section-title",children:(0,e.jsx)(de,{help:s("skills.installInfo"),helpLabel:s("skills.installInfoLabel"),children:s("skills.install")})})}),(0,e.jsxs)("div",{className:"skills-install-grid",children:[(0,e.jsxs)("label",{className:"skills-source-label",children:[(0,e.jsx)(de,{help:(0,e.jsxs)("span",{className:"skills-source-help",children:[(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:s("skills.sourceHelpRemoteLabel")}),s("skills.sourceHelpRemote")]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:s("skills.sourceHelpLocalLabel")}),s("skills.sourceHelpLocal")]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:s("skills.sourceHelpAgentbuddyLabel")}),s("skills.sourceHelpAgentbuddy")]})]}),helpLabel:s("skills.source"),children:s("skills.source")}),(0,e.jsx)("div",{className:"skills-source-control",children:(0,e.jsx)("input",{type:"text","data-install":"source","aria-label":s("skills.source"),placeholder:s("skills.sourcePlaceholder"),value:l.installSource,onChange:r=>l.onInstallSourceChange(r.currentTarget.value)})})]}),(0,e.jsxs)("label",{className:"skills-install-field-wide skills-install-path-field",children:[(0,e.jsx)("span",{children:s("skills.path")}),(0,e.jsx)("input",{type:"text","data-install":"path",placeholder:s("skills.pathPlaceholder"),value:l.installPath,onChange:r=>l.onInstallPathChange(r.currentTarget.value)})]}),(0,e.jsxs)("label",{className:"skills-install-field-wide skills-install-ref-field",children:[(0,e.jsx)("span",{children:s("skills.ref")}),(0,e.jsx)("input",{type:"text","data-install":"ref",placeholder:s("skills.refPlaceholder"),value:l.installRef,onChange:r=>l.onInstallRefChange(r.currentTarget.value)})]}),(0,e.jsx)("div",{className:"skills-install-actions",children:(0,e.jsx)("button",{type:"button","data-action":"install",disabled:y,onClick:()=>l.onInstall(),children:l.installDiscovering?s("skills.scanning"):l.installBusy?s("skills.jobRunning"):s("skills.installSubmit")})}),(0,e.jsx)("div",{className:"skills-install-bottom-row",children:(0,e.jsxs)("div",{className:"skills-local-discovery-panel",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("strong",{children:s("skills.localDiscoverTitle")}),(0,e.jsx)("span",{children:s("skills.localDiscoverHelp")})]}),(0,e.jsx)("button",{type:"button","data-action":"open-native-skill-discovery",onClick:()=>l.onOpenNativeDiscovery(),children:s("skills.localDiscover")})]})})]}),l.installStatus?(0,e.jsx)("div",{className:"actions skills-install-status-row",children:(0,e.jsx)("span",{className:Re(l.installStatus),"data-skills-status":!0,children:l.installStatus.text})}):null,(0,e.jsx)("dialog",{className:"skills-discovery-dialog skills-install-selection-dialog","data-install-selection-dialog":!0,ref:o,onClose:()=>l.onCloseInstallSelection?.(),children:(0,e.jsxs)("article",{children:[(0,e.jsxs)("header",{children:[(0,e.jsx)("h3",{children:s("skills.installSelectionTitle")}),(0,e.jsx)("p",{children:s("skills.installSelectionHelp",{count:k.length})})]}),(0,e.jsx)("div",{className:"skills-discovery-body skills-install-selection-body",children:(0,e.jsxs)("div",{className:"skills-candidate-list","data-install-candidates":!0,children:[(0,e.jsxs)("div",{className:"skills-candidate-list-head",children:[(0,e.jsx)("span",{children:s("skills.scanFound",{count:k.length})}),l.onSelectAllInstallSkills?(0,e.jsx)("button",{type:"button","data-action":"toggle-all-source-skills",disabled:l.installBusy,onClick:()=>l.onSelectAllInstallSkills?.(!b),children:s(b?"skills.discoverClearSelection":"skills.discoverSelectAll")}):null]}),k.map(r=>(0,e.jsxs)("label",{className:"skills-candidate-row",children:[(0,e.jsx)("input",{type:"checkbox",checked:f.has(r.name),disabled:l.installBusy,onChange:()=>l.onToggleInstallSkill?.(r.name)}),(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:r.name}),(0,e.jsxs)("small",{children:[r.path,r.description?` \xB7 ${r.description}`:""]})]})]},`${r.name}:${r.path}`))]})}),(0,e.jsxs)("footer",{className:"actions",children:[(0,e.jsx)("button",{type:"button","data-action":"close-install-selection",disabled:l.installBusy,onClick:()=>l.onCloseInstallSelection?.(),children:s("skills.installSelectionCancel")}),(0,e.jsx)("button",{type:"button",className:"primary","data-action":"confirm-install-selection",disabled:l.installBusy||f.size===0,onClick:()=>l.onConfirmInstallSelection?.(),children:l.installBusy?s("skills.jobRunning"):s("skills.installSelected")})]})]})})]})}function Il(l){let s=K(),o=(0,i.useRef)(null),k=(0,i.useRef)(new Set(l.skills.map(a=>a.name))),f=(0,i.useRef)(""),b=(0,i.useRef)(!1),y=(0,i.useRef)(null),[r,p]=(0,i.useState)(""),[w,R]=(0,i.useState)(!1),[I,D]=(0,i.useState)(()=>new Set),[x,A]=(0,i.useState)(0),[M,j]=(0,i.useState)(()=>typeof window>"u"?1200:window.innerWidth),L=r.trim().toLocaleLowerCase();f.current=r,b.current=w;let h=(0,i.useMemo)(()=>L?l.skills.filter(a=>[a.name,a.displayName,a.description,...a.tags??[],ze(a,s)].filter(Boolean).join(`
|
|
3
|
-
`).toLocaleLowerCase().includes(L)):l.skills,[L,l.skills,s]),B=Cl(M)*hl,T=Math.max(1,Math.ceil(h.length/B)),F=h.slice(x*B,x*B+B),q=(0,i.useMemo)(()=>new Set(h.map(a=>a.name)),[h]),_=h.filter(a=>I.has(a.name)).length,z=Math.max(0,I.size-_),c=h.length>0&&_===h.length;(0,i.useEffect)(()=>{if(typeof window>"u")return;let a=()=>j(window.innerWidth);return window.addEventListener("resize",a),()=>window.removeEventListener("resize",a)},[]),(0,i.useEffect)(()=>A(0),[L,B]),(0,i.useEffect)(()=>{A(a=>Math.min(Math.max(0,a),T-1))},[T]),(0,i.useEffect)(()=>{let a=new Set(l.skills.map(u=>u.name)),C=[...k.current].some(u=>!a.has(u));D(u=>{let P=new Set([...u].filter(H=>a.has(H)));return P.size===u.size?u:P}),C&&(R(!1),D(new Set)),k.current=a},[l.skills]),(0,i.useEffect)(()=>{o.current&&(o.current.indeterminate=_>0&&!c)},[c,_]),(0,i.useEffect)(()=>{if(typeof document>"u")return;let a=u=>{if(u.key!=="Escape"||!b.current)return;let P=f.current;y.current=P,u.preventDefault(),u.stopPropagation(),R(!1),D(new Set),window.setTimeout(()=>{p(H=>H||P),y.current=null},50)},C=u=>{if(u.key!=="Escape"||y.current===null)return;let P=y.current;y.current=null,u.preventDefault(),u.stopPropagation(),p(P)};return document.addEventListener("keydown",a,!0),document.addEventListener("keyup",C,!0),()=>{document.removeEventListener("keydown",a,!0),document.removeEventListener("keyup",C,!0)}},[]);function g(a){D(C=>{let u=new Set(C);return u.has(a)?u.delete(a):u.add(a),u})}function S(){D(a=>{let C=new Set(a);if(c)for(let u of q)C.delete(u);else for(let u of q)C.add(u);return C})}function $(a=!1){let C=r;R(!1),D(new Set),a&&typeof window<"u"&&window.setTimeout(()=>p(C),0)}return(0,e.jsxs)("section",{className:"skills-installed-block",children:[(0,e.jsx)(te,{title:s("skills.installed"),count:s("skills.installedCount",{count:l.skills.length}),hint:s("skills.installedHelp"),children:(0,e.jsx)("div",{className:"skills-installed-header-actions",children:w?(0,e.jsx)("button",{type:"button","data-action":"cancel-installed-selection",onClick:()=>$(),children:s("skills.cancel")}):(0,e.jsx)("button",{type:"button","data-action":"select-installed-skills",disabled:l.skills.length===0,onClick:()=>R(!0),children:s("skills.select")})})}),(0,e.jsxs)("section",{className:"bd-card skills-installed-panel",children:[(0,e.jsxs)("div",{className:"skills-library-toolbar",children:[(0,e.jsxs)("label",{className:"skills-installed-search",children:[(0,e.jsx)("span",{className:"sr-only",children:s("skills.searchLabel")}),(0,e.jsx)("input",{type:"text",role:"searchbox",inputMode:"search","data-action":"search-installed-skills",placeholder:s("skills.searchPlaceholder"),value:r,onChange:a=>p(a.currentTarget.value),onKeyDown:a=>{a.key!=="Escape"||!w||(a.preventDefault(),a.stopPropagation(),$(!0))}}),r?(0,e.jsx)("button",{type:"button","data-action":"clear-installed-search","aria-label":s("skills.clearSearch"),onClick:()=>p(""),children:"\xD7"}):null]}),w?(0,e.jsxs)("label",{className:"skills-select-all-results",children:[(0,e.jsx)("input",{ref:o,type:"checkbox",checked:c,disabled:h.length===0||l.removingNames.size>0,onChange:S}),(0,e.jsx)("span",{children:L?s("skills.selectSearchResults",{count:h.length}):s("skills.selectAllSkills",{count:h.length})})]}):null,L?(0,e.jsx)("span",{className:"skills-filter-count",children:s("skills.resultCount",{count:h.length})}):null,T>1?(0,e.jsxs)("div",{className:"skills-pager",children:[(0,e.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"-1","aria-label":s("skills.prevPage"),title:s("skills.prevPage"),disabled:x===0,onClick:()=>A(a=>Math.max(0,a-1)),children:"\u2039"}),(0,e.jsx)("span",{children:s("skills.pageStatus",{page:x+1,pages:T})}),(0,e.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"1","aria-label":s("skills.nextPage"),title:s("skills.nextPage"),disabled:x>=T-1,onClick:()=>A(a=>Math.min(T-1,a+1)),children:"\u203A"})]}):null]}),(0,e.jsx)("div",{className:"skills-installed-live",role:"status","aria-live":"polite",children:l.status?(0,e.jsx)("span",{className:Re(l.status),children:l.status.text}):null}),l.skills.length===0?(0,e.jsxs)("div",{className:"skills-library-empty",children:[(0,e.jsx)("strong",{children:s("skills.emptyTitle")}),(0,e.jsx)("p",{children:s("skills.emptyHelp")})]}):h.length===0?(0,e.jsxs)("div",{className:"skills-library-empty","data-empty":"search",children:[(0,e.jsx)("strong",{children:s("skills.noResultsTitle",{query:r.trim()})}),(0,e.jsx)("p",{children:s("skills.noResultsHelp")}),(0,e.jsx)("button",{type:"button","data-action":"clear-installed-search-empty",onClick:()=>p(""),children:s("skills.clearSearch")})]}):(0,e.jsx)("div",{className:"skills-list",children:F.map(a=>{let C=I.has(a.name),u=l.removingNames.has(a.name);return(0,e.jsxs)("article",{className:`skills-row skills-installed-card${w?" is-selectable":""}${C?" is-selected":""}${u?" is-removing":""}`,"data-skill":a.name,"data-selection-mode":w?"true":void 0,"aria-busy":u||void 0,onClick:w?()=>g(a.name):void 0,children:[(0,e.jsxs)("div",{className:"skills-row-body",children:[(0,e.jsxs)("div",{className:"skills-row-title",children:[w?(0,e.jsx)("input",{type:"checkbox","aria-label":s("skills.selectNamed",{skill:a.displayName??a.name}),checked:C,disabled:u,onClick:P=>P.stopPropagation(),onChange:()=>g(a.name)}):null,(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:a.displayName??a.name}),a.displayName&&a.displayName!==a.name?(0,e.jsx)("small",{className:"skills-canonical-name",children:a.name}):null]})]}),a.description?(0,e.jsx)("p",{children:a.description}):null,(0,e.jsx)("small",{className:"skills-source-badge",children:ze(a,s)}),u?(0,e.jsx)("span",{className:"skills-removing-label",children:s("skills.removing")}):null]}),w?null:(0,e.jsxs)("div",{className:"skills-card-actions",children:[(0,e.jsx)("button",{type:"button","data-action":"update-skill",disabled:l.busySkill===`${a.name}:update`||u,onClick:()=>l.onUpdate(a.name),children:s("skills.update")}),(0,e.jsx)("button",{type:"button","data-action":"remove-skill",disabled:u,onClick:()=>l.onRequestRemove([a.name]),children:s("skills.remove")})]})]},a.name)})})]}),w?(0,e.jsxs)("div",{className:"skills-bulk-action-bar",role:"toolbar","aria-label":s("skills.bulkActions"),children:[(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:s("skills.selectedCount",{count:I.size})}),z>0?(0,e.jsx)("small",{children:s("skills.selectedHidden",{count:z})}):null]}),(0,e.jsx)("button",{type:"button",className:"danger","data-action":"remove-selected-skills",disabled:I.size===0||l.removingNames.size>0,onClick:()=>l.onRequestRemove([...I]),children:s("skills.removeSelected",{count:I.size})})]}):null]})}function Pl(l){let s=K(),o=(0,i.useRef)(null),k=l.names??[],f=l.references.length>0,b=k.slice(0,3),y=new Set(l.references.flatMap(r=>r.bots)).size;return(0,i.useEffect)(()=>{let r=o.current;if(r)if(l.names&&!r.open)try{r.showModal()}catch{}else!l.names&&r.open&&r.close()},[l.names]),(0,e.jsx)("dialog",{className:"skills-remove-dialog","data-remove-skills-dialog":!0,ref:o,onCancel:r=>{r.preventDefault(),l.busy||l.onCancel()},onClick:r=>{r.target===r.currentTarget&&!l.busy&&l.onCancel()},children:(0,e.jsxs)("article",{children:[(0,e.jsxs)("header",{children:[(0,e.jsx)("h3",{children:f?k.length===1?s("skills.removeInUseOneTitle",{skill:k[0]}):s("skills.removeInUseManyTitle",{count:k.length}):k.length===1?s("skills.removeOneTitle",{skill:k[0]}):s("skills.removeManyTitle",{count:k.length})}),(0,e.jsx)("p",{children:f?k.length===1?s("skills.removeInUseOneHelp",{count:y}):s("skills.removeInUseManyHelp",{count:y}):k.length===1?s("skills.removeOnePermanentHelp"):s("skills.removePermanentHelp")})]}),(0,e.jsxs)("div",{className:"skills-remove-dialog-body",children:[k.length>1?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("ul",{children:b.map(r=>(0,e.jsx)("li",{children:r},r))}),k.length>b.length?(0,e.jsx)("p",{children:s("skills.removeMore",{count:k.length-b.length})}):null]}):null,l.references.length>0?(0,e.jsxs)("div",{className:"skills-remove-reference-warning",role:"alert",children:[(0,e.jsx)("strong",{children:s("skills.removeReferencesDetail")}),(0,e.jsx)("ul",{children:l.references.map(r=>(0,e.jsxs)("li",{children:[(0,e.jsx)("strong",{children:r.name}),(0,e.jsx)("span",{children:r.bots.join(", ")})]},r.name))})]}):null,l.error?(0,e.jsx)("p",{className:"hint-warn",role:"alert",children:l.error}):null]}),(0,e.jsxs)("footer",{className:"actions",children:[(0,e.jsx)("button",{type:"button",autoFocus:!0,disabled:l.busy,onClick:l.onCancel,children:s("skills.cancel")}),(0,e.jsx)("button",{type:"button",className:"danger",disabled:l.busy,onClick:()=>l.onConfirm(f),children:l.busy?s("skills.removing"):f?s("skills.removeAnyway"):k.length===1?s("skills.removeOneConfirm"):s("skills.removeSelected",{count:k.length})})]})]})})}function Tl(){let l=K(),s=(0,i.useRef)(!0),o=(0,i.useRef)(new Set),k=(0,i.useRef)(null),[f,b]=(0,i.useState)([]),[y,r]=(0,i.useState)([]),[p,w]=(0,i.useState)([]),[R,I]=(0,i.useState)("off"),[D,x]=(0,i.useState)("auto"),[A,M]=(0,i.useState)(null),[j,L]=(0,i.useState)(!0),[h,B]=(0,i.useState)(""),[T,F]=(0,i.useState)(""),[q,_]=(0,i.useState)(""),[z,c]=(0,i.useState)(null),[g,S]=(0,i.useState)(!1),[$,a]=(0,i.useState)(!1),[C,u]=(0,i.useState)(!1),[P,H]=(0,i.useState)([]),[Q,W]=(0,i.useState)(()=>new Set),[U,X]=(0,i.useState)(!1),[Je,Ie]=(0,i.useState)(!1),[me,Ke]=(0,i.useState)(null),[ge,fe]=(0,i.useState)(()=>new Set),[Pe,ne]=(0,i.useState)(null),[We,Te]=(0,i.useState)(null),[Ue,De]=(0,i.useState)(null),[Fe,ve]=(0,i.useState)({}),[ye,V]=(0,i.useState)(null),[xe,be]=(0,i.useState)(null),[Qe,Y]=(0,i.useState)(!1),[Xe,ie]=(0,i.useState)([]),[Ve,ae]=(0,i.useState)(null),[Z,Ae]=(0,i.useState)(()=>new Set),ee=(0,i.useMemo)(()=>new Set(f.map(t=>t.name)),[f]),J=(0,i.useMemo)(()=>y.length===0?void 0:(me?y.find(n=>ue(n)===me):void 0)??y.find(n=>n.skills.length>0)??y[0],[me,y]),pe=J?ue(J):"",le=(0,i.useMemo)(()=>J?J.skills.filter(t=>!ee.has(t.name)).map(t=>t.rootDir??t.source?.root??"").filter(Boolean):[],[J,ee]),Me=le.length>0&&le.every(t=>ge.has(t)),Le=(0,i.useCallback)(()=>{for(let t of o.current)window.clearTimeout(t);o.current.clear()},[]),Ye=(0,i.useCallback)(t=>new Promise(n=>{let d=window.setTimeout(()=>{o.current.delete(d),n()},t);o.current.add(d)}),[]),Ee=(0,i.useCallback)(async()=>{let[t,n]=await Promise.all([fetch("/api/skills"),fetch("/api/bots")]),d=await t.json().catch(()=>({})),m=await n.json().catch(()=>({}));if(!t.ok){let v=d?.error??`skills HTTP ${t.status}`;throw new Error(v==="not_found_yet"||v==="not_found"?l("skills.apiUnavailable"):v)}if(!n.ok)throw new Error(m?.error??`bots HTTP ${n.status}`);return{skills:Array.isArray(d.skills)?d.skills:[],nativeSkillGroups:Array.isArray(d.nativeSkillGroups)?d.nativeSkillGroups:[],bots:Array.isArray(m.bots)?m.bots:[],trustProjectSkills:d.trustProjectSkills==="all"?"all":"off",delivery:d.delivery==="prompt"||d.delivery==="native"?d.delivery:"auto"}},[l]),se=(0,i.useCallback)(async()=>{L(!0);try{let t=await Ee();if(!s.current)return;b(t.skills),r(t.nativeSkillGroups),w(t.bots),I(t.trustProjectSkills),x(t.delivery),M(null),fe(n=>{let d=new Set,m=new Set(t.skills.map(v=>v.name));for(let v of t.nativeSkillGroups)for(let N of v.skills){let E=N.rootDir??N.source?.root??"";E&&!m.has(N.name)&&n.has(E)&&d.add(E)}return d})}catch(t){if(!s.current)return;M(t?.message??String(t))}finally{s.current&&L(!1)}},[Ee]);(0,i.useEffect)(()=>(s.current=!0,se(),()=>{s.current=!1,Le()}),[Le,se]),(0,i.useEffect)(()=>{if(!ye||Z.size>0)return;let t=window.setTimeout(()=>{s.current&&V(null)},6e3);return()=>window.clearTimeout(t)},[ye,Z]),(0,i.useEffect)(()=>{let t=k.current;if(t)if(U&&!t.open)try{t.showModal()}catch{}else!U&&t.open&&t.close()},[U,pe]);async function Be(t,n,d=!0){let m=t;for(n({text:l("skills.jobRunning"),ok:!0});;){if(!s.current)return;if(m.status==="succeeded"){n({text:l("skills.saved"),ok:!0}),d&&await se();return}if(m.status==="failed")throw new Error(m.error??"job_failed");if(await Ye(800),!s.current)return;let v=await O(`/api/skills/jobs/${encodeURIComponent(m.id)}`,{method:"GET"});if(!s.current)return;m=v.job}}function Ze(t){return p.filter(n=>ke(n.skills).includes(t)).map(n=>n.botName??n.larkAppId)}function oe(){H([]),W(new Set),u(!1)}function $e(){return{source:h.trim(),path:T.trim()||void 0,ref:q.trim()||void 0}}function el(t){let n=t??[...Q];return{...$e(),skillNames:n.length>0?n:void 0}}async function ll(){a(!0),c({text:l("skills.scanning"),ok:!0});try{let t=await O("/api/skills/discover",{method:"POST",body:JSON.stringify($e())});if(!s.current)return{skills:[],directInstall:!1};let n=t.discovery?.directInstall===!0,d=Array.isArray(t.discovery?.skills)?t.discovery.skills:[];return H(d),W(new Set(d.map(m=>m.name))),{skills:d,directInstall:n}}finally{s.current&&a(!1)}}function G(t){let n=t||"";return n.startsWith("skill_git_command_failed")&&/authentication failed|could not read username|repository not found|unauthor|\b401\b|\b403\b/i.test(n)?l("skills.gitNeedsAuth"):n.startsWith("agentbuddy_not_found")?l("skills.agentbuddyNotFound"):n.startsWith("agentbuddy_login_required")?l("skills.agentbuddyNeedsLogin"):n.startsWith("agentbuddy_command_failed")?/login|credential|unauthor|not logged|401|403/i.test(n)?l("skills.agentbuddyNeedsLogin"):l("skills.agentbuddyCommandFailed"):n.startsWith("agentbuddy_clear_telemetry_failed")||n.startsWith("agentbuddy_telemetry_not_stripped")?l("skills.agentbuddyTelemetryFailed"):n.startsWith("agentbuddy_no_skill_produced")?l("skills.agentbuddyNoSkill"):n.startsWith("invalid_agentbuddy")?l("skills.agentbuddyInvalid"):n}async function he(t){S(!0);try{let n=await O("/api/skills/install",{method:"POST",body:JSON.stringify(el(t))});if(!s.current)return;await Be(n.job,c),s.current&&oe()}catch(n){s.current&&c({text:`${l("skills.failed")}: ${G(n?.message??String(n))}`,ok:!1})}finally{s.current&&S(!1)}}function sl(t){W(n=>{let d=new Set(n);return d.has(t)?d.delete(t):d.add(t),d})}function tl(t){W(t?new Set(P.map(n=>n.name)):new Set)}async function nl(){if(!h.trim()){c({text:l("skills.sourceRequired"),ok:!1});return}try{u(!1);let{skills:t,directInstall:n}=await ll();if(!s.current)return;if(n){await he();return}if(t.length===0){c({text:l("skills.scanEmpty"),ok:!1});return}if(t.length===1){await he([t[0].name]);return}c({text:l("skills.scanFound",{count:t.length}),ok:!0}),u(!0)}catch(t){s.current&&c({text:`${l("skills.failed")}: ${G(t?.message??String(t))}`,ok:!1})}}async function il(){let t=[...Q];if(t.length===0){c({text:l("skills.discoverNothingSelected"),ok:!1});return}await he(t)}async function al(){let t=[...ge].filter(Boolean);if(t.length===0){c({text:l("skills.discoverNothingSelected"),ok:!1});return}Ie(!0);try{if(c({text:l("skills.discoverRegisteringBatch",{total:t.length}),ok:!0}),await O("/api/skills/install-local-links",{method:"POST",body:JSON.stringify({sources:t})}),!s.current)return;X(!1),await se(),s.current&&c({text:l("skills.saved"),ok:!0})}catch(n){s.current&&c({text:`${l("skills.failed")}: ${G(n?.message??String(n))}`,ok:!1})}finally{s.current&&Ie(!1)}}async function ol(t){if(R!==t){ne("project");try{let n=await O("/api/skills/global",{method:"PUT",body:JSON.stringify({trustProjectSkills:t})});if(!s.current)return;I(n.trustProjectSkills==="all"?"all":t)}catch(n){s.current&&window.alert(`${l("skills.failed")}: ${G(n?.message??String(n))}`)}finally{s.current&&ne(null)}}}async function rl(t){if(D!==t){ne("delivery");try{let n=await O("/api/skills/global",{method:"PUT",body:JSON.stringify({delivery:t})});if(!s.current)return;x(n.delivery==="prompt"||n.delivery==="native"?n.delivery:t)}catch(n){s.current&&window.alert(`${l("skills.failed")}: ${G(n?.message??String(n))}`)}finally{s.current&&ne(null)}}}async function cl(t){Te(`${t}:update`);try{let n=await O(`/api/skills/${encodeURIComponent(t)}/update`,{method:"POST",body:"{}"});if(!s.current)return;await Be(n.job,c)}catch(n){s.current&&window.alert(`${l("skills.failed")}: ${G(n?.message??String(n))}`)}finally{s.current&&Te(null)}}function dl(t){let n=[...new Set(t.filter(d=>ee.has(d)))];n.length!==0&&(be(n),Y(!0),ie([]),ae(null))}function ul(){Z.size>0||(Y(!1),be(null),ie([]),ae(null))}async function kl(t){let n=xe??[];if(n.length!==0){Ae(new Set(n)),Y(!1),ae(null),V({text:l("skills.removingCount",{count:n.length}),ok:!0});try{let d=await O("/api/skills",{method:"DELETE",body:JSON.stringify({names:n,force:t})});if(!s.current)return;let m=Array.isArray(d.removed)?d.removed.filter(N=>typeof N=="string"):n,v=new Set(m);b(N=>N.filter(E=>!v.has(E.name))),V({text:m.length===1?l("skills.removedOne",{skill:m[0]}):l("skills.removedMany",{count:m.length}),ok:!0}),be(null),ie([])}catch(d){if(!s.current)return;if(d?.status===409&&d?.body?.error==="skills_in_use"){let v=Array.isArray(d.body.affectedSkills)?d.body.affectedSkills.map(N=>{let E=typeof N?.name=="string"?N.name:"",Se=Array.isArray(N?.affectedBots)?N.affectedBots.map(re=>re?.botName||re?.larkAppId||"").filter(Boolean):Ze(E);return E?{name:E,bots:Se}:null}).filter(N=>N!==null):[];ie(v),Y(!0),V(null);return}let m=l("skills.removeFailed",{detail:G(d?.message??String(d))});ae(m),Y(!0),V({text:m,ok:!1})}finally{s.current&&Ae(new Set)}}}async function ml(t,n){let d=`${t}:set`;De(d),ve(m=>({...m,[t]:null}));try{let m=await O(`/api/bots/${encodeURIComponent(t)}/skills`,{method:"PUT",body:JSON.stringify({action:"set",policy:n.length>0?{include:n.map(v=>`skill:${v}`)}:null})});if(!s.current)return;w(v=>v.map(N=>N.larkAppId===t?{...N,skills:m.skills??null}:N)),ve(v=>({...v,[t]:{text:l("skills.policySaved"),ok:!0}}))}catch(m){throw s.current&&ve(v=>({...v,[t]:{text:`${l("skills.failed")}: ${G(m?.message??String(m))}`,ok:!1}})),m}finally{s.current&&De(null)}}let gl=p.filter(t=>wl(t.skills)).length,fl=p.reduce((t,n)=>t+Nl(n.skills),0),vl=(0,e.jsxs)("div",{className:"page-heading-actions skills-heading-actions",children:[(0,e.jsxs)("div",{className:"skills-metric-strip",children:[(0,e.jsxs)("span",{children:[(0,e.jsx)("small",{children:l("skills.metricInstalled")}),(0,e.jsx)("strong",{children:f.length})]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("small",{children:l("skills.metricBots")}),(0,e.jsxs)("strong",{children:[gl,"/",p.length]})]}),(0,e.jsxs)("span",{children:[(0,e.jsx)("small",{children:l("skills.metricAttached")}),(0,e.jsx)("strong",{children:fl})]})]}),(0,e.jsx)(_e,{id:"skills-refresh",label:l("skills.refresh"),busy:j,disabled:j,onClick:()=>{se()}})]}),yl=(0,e.jsx)("div",{className:"skills-page-stack",children:j?(0,e.jsx)(je,{label:l("common.loading")}):A?(0,e.jsx)("p",{className:"hint-warn",children:A}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{className:"skills-config-row",children:[(0,e.jsxs)("section",{className:"skills-config-block",children:[(0,e.jsx)(te,{title:l("skills.globalDefaults")}),(0,e.jsxs)("article",{className:"bd-card skills-defaults-panel skills-config-card",children:[(0,e.jsxs)("div",{className:"skills-control-block",children:[(0,e.jsx)("span",{className:"skills-control-label",children:l("skills.globalProject")}),(0,e.jsx)(Ge,{value:R,disabled:Pe==="project",options:[{value:"off",label:l("skills.globalProjectOff"),help:l("skills.globalProjectOffHelp")},{value:"all",label:l("skills.globalProjectAll"),help:l("skills.globalProjectAllHelp")}],onChange:t=>{ol(t)}})]}),(0,e.jsxs)("div",{className:"skills-control-block",children:[(0,e.jsx)("span",{className:"skills-control-label",children:l("skills.globalDelivery")}),(0,e.jsx)(Ge,{value:D,disabled:Pe==="delivery",options:[{value:"auto",label:l("skills.deliveryAuto"),help:l("skills.deliveryAutoHelp")},{value:"prompt",label:l("skills.deliveryPrompt"),help:l("skills.deliveryPromptHelp")},{value:"native",label:l("skills.deliveryNative"),help:l("skills.deliveryNativeHelp")}],onChange:t=>{rl(t)}})]})]})]}),(0,e.jsxs)("section",{className:"skills-config-block",children:[(0,e.jsx)(te,{title:(0,e.jsx)(de,{help:l("skills.installInfo"),helpLabel:l("skills.installInfoLabel"),children:l("skills.install")})}),(0,e.jsx)(Rl,{showTitle:!1,installSource:h,installPath:T,installRef:q,installStatus:z,installBusy:g,installDiscovering:$,installSelectionOpen:C,installCandidates:P,selectedInstallSkills:Q,onInstallSourceChange:t=>{B(t),oe()},onInstallPathChange:t=>{F(t),oe()},onInstallRefChange:t=>{_(t),oe()},onToggleInstallSkill:sl,onSelectAllInstallSkills:tl,onConfirmInstallSelection:()=>{il()},onCloseInstallSelection:()=>u(!1),onInstall:()=>{nl()},onOpenNativeDiscovery:()=>X(!0)})]}),(0,e.jsxs)("section",{className:"skills-config-block",children:[(0,e.jsx)(te,{title:l("skills.bots"),count:l("skills.botCount",{count:p.length}),hint:l("skills.botsHelp")}),(0,e.jsx)("section",{className:"bd-card skills-bots-panel skills-config-card",children:(0,e.jsx)("div",{className:"skills-bot-grid",children:p.map(t=>(0,e.jsx)(Al,{bot:t,installedNames:ee,skills:f,status:Fe[t.larkAppId]??null,busyKey:Ue,onSave:ml},t.larkAppId))})})]})]}),(0,e.jsx)(Il,{skills:f,busySkill:We,removingNames:Z,status:ye,onUpdate:t=>{cl(t)},onRequestRemove:dl}),(0,e.jsx)(Pl,{names:Qe?xe:null,references:Xe,busy:Z.size>0,error:Ve,onCancel:ul,onConfirm:t=>{kl(t)}}),(0,e.jsx)("dialog",{className:"skills-discovery-dialog",id:"skills-discovery-dialog",ref:k,onClose:()=>X(!1),onClick:t=>{t.target===t.currentTarget&&X(!1)},children:(0,e.jsxs)("article",{children:[(0,e.jsxs)("header",{children:[(0,e.jsx)("h3",{children:l("skills.discoverTitle")}),(0,e.jsx)("p",{children:l("skills.discoverHelp")}),(0,e.jsx)("button",{type:"button",className:"skills-discovery-close","data-action":"close-discovery","aria-label":l("skills.discoverClose"),title:l("skills.discoverClose"),onClick:()=>X(!1)})]}),(0,e.jsx)("div",{className:"skills-discovery-body",children:J?(0,e.jsx)(e.Fragment,{children:(0,e.jsxs)("div",{className:"skills-discovery-layout",children:[(0,e.jsx)("div",{className:"skills-discovery-tabs",role:"tablist","aria-label":l("skills.discoverTitle"),children:y.map(t=>{let n=ue(t),d=n===pe;return(0,e.jsxs)("button",{type:"button",role:"tab","data-discovery-tab":n,className:d?"selected":"","aria-selected":d?"true":"false",onClick:()=>Ke(n),children:[(0,e.jsx)("strong",{children:t.label??t.cliId}),(0,e.jsx)("small",{children:l("skills.skillCount",{count:t.skills.length})})]},n)})}),(0,e.jsxs)("div",{className:"skills-discovery-main",children:[(0,e.jsx)("div",{className:"skills-discovery-path",children:(0,e.jsx)("code",{children:J.rootDir})}),y.map(t=>{let n=ue(t);return(0,e.jsx)("section",{className:"skills-discovery-group","data-discovery-panel":n,hidden:!(n===pe),children:t.skills.length===0?(0,e.jsx)("p",{className:"empty",children:l("skills.discoverGroupEmpty")}):(0,e.jsx)("div",{className:"skills-discovery-list",children:t.skills.map(m=>{let v=ee.has(m.name),N=m.rootDir??m.source?.root??"";return(0,e.jsxs)("label",{className:`skills-discovery-row${v?" installed":""}`,children:[(0,e.jsx)("input",{type:"checkbox","data-discovered-skill":!0,value:N,disabled:v,checked:!v&&ge.has(N),onChange:E=>{let Se=E.currentTarget.checked;fe(re=>{let Ne=new Set(re);return Se?Ne.add(N):Ne.delete(N),Ne})}}),(0,e.jsxs)("span",{children:[(0,e.jsx)("strong",{children:m.name}),m.description?(0,e.jsx)("small",{children:m.description}):null]}),v?(0,e.jsx)("em",{children:l("skills.discoverRegistered")}):null]},`${m.name}:${N}`)})})},n)})]})]})}):(0,e.jsx)("p",{className:"empty",children:l("skills.discoverEmpty")})}),(0,e.jsxs)("footer",{className:"actions",children:[(0,e.jsx)("button",{type:"button","data-action":"toggle-discovered-skills",disabled:le.length===0,onClick:()=>{fe(t=>{let n=new Set(t);return Me?le.forEach(d=>n.delete(d)):le.forEach(d=>n.add(d)),n})},children:l(Me?"skills.discoverClearSelection":"skills.discoverSelectAll")}),(0,e.jsx)("button",{type:"button",className:"primary","data-action":"register-discovered-skills",disabled:Je,onClick:()=>{al()},children:l("skills.discoverRegister")})]})]})})]})});return(0,e.jsxs)("section",{className:"page skills-page",children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:l("nav.skills")}),(0,e.jsx)("h1",{children:l("skills.title")})]}),vl]}),(0,e.jsx)("div",{id:"skills-body",children:yl})]})}function Dl(l,s){return l.size===s.length&&s.every(o=>l.has(o))}function xl(l){let s=K(),o=(0,i.useRef)(null),k=(0,i.useRef)(null),f=(0,i.useRef)(null),[b,y]=(0,i.useState)(!1),[r,p]=(0,i.useState)(""),[w,R]=(0,i.useState)(()=>new Set(l.names)),[I,D]=(0,i.useState)(null),x=l.names.join(`
|
|
4
|
-
`),A=r.trim().toLocaleLowerCase(),M=(0,i.useMemo)(()=>{let c=new Map(l.skills.map(g=>[g.name,g]));for(let g of l.names)c.has(g)||c.set(g,{name:g});return[...c.values()].sort((g,S)=>g.name.localeCompare(S.name))},[l.names,l.skills]),j=(0,i.useMemo)(()=>A?M.filter(c=>`${c.name} ${c.description||""}`.toLocaleLowerCase().includes(A)):M,[A,M]),L=!Dl(w,l.names),h=(0,i.useCallback)(()=>{let c=k.current;if(!c||typeof window>"u")return;let g=c.getBoundingClientRect(),S=12,$=7,a=Math.min(370,Math.max(260,window.innerWidth-S*2)),C=Math.min(Math.max(S,g.left),Math.max(S,window.innerWidth-a-S)),u=Math.max(0,g.top-$-S),P=Math.max(0,window.innerHeight-g.bottom-$-S),H=u>P,Q=H?u:P,W=118+Math.min(M.length,5)*42,U=Math.max(180,Math.min(W,Q));D({left:C,top:H?Math.max(S,g.top-$-U):g.bottom+$,width:a,height:U})},[M.length]);(0,i.useEffect)(()=>{b||R(new Set(l.names))},[x,b]),(0,i.useEffect)(()=>{if(!b||typeof document>"u")return;let c=g=>{o.current?.contains(g.target)||f.current?.contains(g.target)||(y(!1),p(""),R(new Set(l.names)))};return document.addEventListener("pointerdown",c),window.addEventListener("resize",h),window.addEventListener("scroll",h,!0),h(),()=>{document.removeEventListener("pointerdown",c),window.removeEventListener("resize",h),window.removeEventListener("scroll",h,!0)}},[x,b,h]);function B(){R(new Set(l.names)),p(""),h(),y(!0)}function T(){R(new Set(l.names)),p(""),y(!1)}function F(c){R(g=>{let S=new Set(g);return S.has(c)?S.delete(c):S.add(c),S})}async function q(){let c=[...w].sort((g,S)=>g.localeCompare(S));try{await l.onSave(c),p(""),y(!1)}catch{}}let _=l.names.length===0?s("skills.pickerPlaceholder"):l.names.length===1?l.names[0]:s("skills.pickerSelectedCount",{count:l.names.length}),z=b?(0,e.jsxs)("div",{ref:f,className:"skills-multi-picker-popover",style:I?{left:I.left,top:I.top,width:I.width,height:I.height}:void 0,children:[(0,e.jsxs)("div",{className:"skills-multi-picker-head",children:[(0,e.jsxs)("label",{className:"skills-multi-picker-search",children:[(0,e.jsx)("span",{className:"skills-multi-picker-search-icon","aria-hidden":"true"}),(0,e.jsx)("input",{type:"search","data-action":"search-skills",autoFocus:!0,autoComplete:"off",value:r,placeholder:s("skills.pickerSearchPlaceholder"),onChange:c=>p(c.currentTarget.value),onKeyDown:c=>{c.key==="Escape"&&(c.preventDefault(),T())}})]}),(0,e.jsxs)("div",{className:"skills-multi-picker-meta",children:[(0,e.jsx)("span",{children:s("skills.pickerSelectionMeta",{selected:w.size,total:M.length})}),w.size>0?(0,e.jsx)("button",{type:"button",className:"skills-multi-picker-clear","data-action":"clear-skill-selection",onClick:()=>R(new Set),children:s("skills.pickerClear")}):null]})]}),(0,e.jsxs)("div",{className:"skills-multi-picker-options",role:"listbox","aria-label":s("skills.priority"),"aria-multiselectable":"true",children:[j.map(c=>{let g=w.has(c.name),S=!l.installedNames.has(c.name);return(0,e.jsxs)("button",{type:"button",className:`skills-multi-picker-option${g?" selected":""}${S?" dangling":""}`,role:"option","aria-selected":g,"data-skill-name":c.name,onClick:()=>F(c.name),children:[(0,e.jsx)("span",{className:"skills-multi-picker-check","aria-hidden":"true"}),(0,e.jsxs)("span",{className:"skills-multi-picker-option-copy",children:[(0,e.jsxs)("span",{children:[(0,e.jsx)("b",{children:c.name}),S?(0,e.jsx)("em",{children:s("skills.dangling")}):null]}),c.description?(0,e.jsx)("small",{children:c.description}):null]})]},c.name)}),j.length===0?(0,e.jsx)("p",{className:"skills-multi-picker-empty",children:s("skills.pickerNoResults")}):null]}),(0,e.jsxs)("footer",{className:"skills-multi-picker-actions",children:[(0,e.jsx)("button",{type:"button",className:"ghost","data-action":"cancel-skill-selection",disabled:l.busy,onClick:T,children:s("skills.cancel")}),(0,e.jsx)("button",{type:"button",className:"primary","data-action":"save-skill-selection",disabled:!L||l.busy,onClick:()=>{q()},children:l.busy?s("skills.saving"):s("skills.saveSelection")})]})]}):null;return(0,e.jsxs)("div",{ref:o,className:`skills-multi-picker${b?" open":""}`,"data-skill-picker":l.botId,children:[(0,e.jsxs)("button",{ref:k,type:"button",className:"skills-multi-picker-trigger","data-action":"open-skill-picker","aria-haspopup":"listbox","aria-expanded":b,disabled:l.busy,onClick:()=>b?T():B(),children:[(0,e.jsxs)("span",{className:"skills-multi-picker-trigger-copy",children:[(0,e.jsx)("b",{children:_}),(0,e.jsx)("small",{children:s("skills.pickerTriggerHint")})]}),(0,e.jsx)("span",{className:"skills-multi-picker-chevron","aria-hidden":"true"})]}),z&&typeof document<"u"?(0,qe.createPortal)(z,document.body):z]})}function Al(l){let s=K(),{bot:o,installedNames:k,skills:f,status:b,busyKey:y,onSave:r}=l,p=o.botName??o.larkAppId,w=ke(o.skills);return o.error?(0,e.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":o.larkAppId,children:[(0,e.jsxs)("header",{children:[(0,e.jsx)(Ce,{html:we({name:p,larkAppId:o.larkAppId,size:"sm"})}),(0,e.jsx)("strong",{children:p})]}),(0,e.jsx)("p",{className:"hint-warn-inline",children:o.error})]}):(0,e.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":o.larkAppId,children:[(0,e.jsxs)("header",{className:"skills-bot-head",children:[(0,e.jsx)(Ce,{html:we({name:p,larkAppId:o.larkAppId,size:"sm",dot:"ok"})}),(0,e.jsxs)("div",{className:"skills-bot-title-line",children:[(0,e.jsx)("strong",{children:p}),(0,e.jsx)("span",{className:"skills-count-pill",children:s("skills.skillCount",{count:w.length})})]})]}),(0,e.jsxs)("section",{className:"skills-policy-panel",children:[(0,e.jsx)("div",{className:"skills-priority-head",children:(0,e.jsx)("h3",{className:"skills-priority-title",children:s("skills.priority")})}),(0,e.jsx)(xl,{botId:o.larkAppId,names:w,installedNames:k,skills:f,busy:y===`${o.larkAppId}:set`,onSave:R=>r(o.larkAppId,R)})]}),(0,e.jsx)("span",{className:Re(b),"data-bot-status":!0,children:b?.text??""})]})}function $l(l){return He(l,(0,e.jsx)(Tl,{}))}export{Al as BotPolicyCard,Il as InstalledSkillsLibrary,Pl as RemoveSkillsDialog,xl as SkillMultiPicker,Rl as SkillsInstallPanel,$l as renderSkillsPage};
|