botmux 2.102.0 → 2.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/cli.d.ts +9 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +141 -6
  4. package/dist/cli.js.map +1 -1
  5. package/dist/dashboard/bot-onboarding.d.ts +28 -0
  6. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  7. package/dist/dashboard/bot-onboarding.js +20 -0
  8. package/dist/dashboard/bot-onboarding.js.map +1 -1
  9. package/dist/dashboard/feishu-login.d.ts +64 -0
  10. package/dist/dashboard/feishu-login.d.ts.map +1 -0
  11. package/dist/dashboard/feishu-login.js +99 -0
  12. package/dist/dashboard/feishu-login.js.map +1 -0
  13. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  14. package/dist/dashboard/web/bot-defaults.js +108 -0
  15. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  16. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  17. package/dist/dashboard/web/bot-onboarding.js +4 -1
  18. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  19. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  20. package/dist/dashboard/web/i18n.js +22 -2
  21. package/dist/dashboard/web/i18n.js.map +1 -1
  22. package/dist/dashboard-web/app.js +6 -6
  23. package/dist/dashboard-web/chunks/bot-defaults-page-ZVBKVYIG.js +380 -0
  24. package/dist/dashboard-web/chunks/{chunk-DWFMPIAQ.js → chunk-HC7ANVX7.js} +5 -5
  25. package/dist/dashboard-web/chunks/{chunk-NC77G2OB.js → chunk-NNXPEJ7S.js} +1 -1
  26. package/dist/dashboard-web/chunks/{connectors-BW6WO7P5.js → connectors-POZADN75.js} +1 -1
  27. package/dist/dashboard-web/chunks/{groups-page-UTXUVV2M.js → groups-page-UQFQ6DRE.js} +1 -1
  28. package/dist/dashboard-web/chunks/{insights-page-IW3KNMG4.js → insights-page-ATW2W5KP.js} +1 -1
  29. package/dist/dashboard-web/chunks/{overview-page-RO6R26AZ.js → overview-page-Z7OV54XU.js} +1 -1
  30. package/dist/dashboard-web/chunks/{roles-page-5DYKR2I5.js → roles-page-4BJVXK2E.js} +1 -1
  31. package/dist/dashboard-web/chunks/{schedules-WUZP3UPF.js → schedules-XLETZ2EP.js} +1 -1
  32. package/dist/dashboard-web/chunks/{sessions-page-GWZ4GKSG.js → sessions-page-RMMQUGXJ.js} +1 -1
  33. package/dist/dashboard-web/chunks/{settings-page-HJH6HQ7D.js → settings-page-PWKI4TWF.js} +1 -1
  34. package/dist/dashboard-web/chunks/{skills-page-ATVGKR5I.js → skills-page-SH7KUD45.js} +1 -1
  35. package/dist/dashboard-web/chunks/{team-federation-page-JVC73TTF.js → team-federation-page-JAJXFLXA.js} +1 -1
  36. package/dist/dashboard-web/chunks/{workflows-YCZTOJUS.js → workflows-FRJ2DJAO.js} +1 -1
  37. package/dist/dashboard-web/style.css +57 -0
  38. package/dist/dashboard.js +78 -2
  39. package/dist/dashboard.js.map +1 -1
  40. package/dist/utils/bot-routing.d.ts +26 -3
  41. package/dist/utils/bot-routing.d.ts.map +1 -1
  42. package/dist/utils/bot-routing.js +38 -4
  43. package/dist/utils/bot-routing.js.map +1 -1
  44. package/package.json +1 -1
  45. package/dist/dashboard-web/chunks/bot-defaults-page-YAHNXFBC.js +0 -370
@@ -0,0 +1,380 @@
1
+ import{b as $e}from"./chunk-NNXPEJ7S.js";import{a as ye}from"./chunk-76J7PNZI.js";import{m as e,n as r,p as xt,r as ve,w as Ht}from"./chunk-HC7ANVX7.js";import{a as Ze,b as Se,c as Le}from"./chunk-JTSE5VP6.js";import{c as Xt}from"./chunk-7SZRL6FY.js";var Rt=Xt(Ze(),1);var S={bots:[]},st=null,te=[{id:"claude-code",label:"Claude"},{id:"codex",label:"Codex"},{id:"traex",label:"traex"}],Me=!1,qt="glm-5.1",ee=[],at=null;function Yt(u,c){return typeof u?.cliId=="string"&&u.cliId?u.cliId:c}function Xe(u){document.querySelector(".feishu-login-overlay")?.remove();let c=document.createElement("div");c.className="feishu-login-overlay",c.innerHTML=`
2
+ <div class="feishu-login-modal" role="dialog" aria-modal="true">
3
+ <button type="button" class="feishu-login-close" data-close aria-label="${r(e("feishuLogin.close"))}">\u2715</button>
4
+ <h3 class="feishu-login-title">${r(e("feishuLogin.title"))}</h3>
5
+ <p class="feishu-login-hint" data-hint>${r(e("feishuLogin.starting"))}</p>
6
+ <div class="feishu-login-qr" data-qr></div>
7
+ <div class="feishu-login-actions">
8
+ <button type="button" class="primary" data-retry hidden>${r(e("feishuLogin.retry"))}</button>
9
+ </div>
10
+ </div>`,document.body.appendChild(c);let b=c.querySelector("[data-hint]"),H=c.querySelector("[data-qr]"),w=c.querySelector("[data-retry]"),q=null,O=()=>{q!==null&&(window.clearInterval(q),q=null)},E=()=>{O(),c.remove()};c.addEventListener("click",L=>{let I=L.target;(I===c||I.closest("[data-close]"))&&E()});function dt(L){return L?L.status==="awaiting_scan"&&L.qrDataUrl?(H.innerHTML=`<img class="qr-image" src="${L.qrDataUrl}" alt="${r(e("feishuLogin.qrAlt"))}">`,b.textContent=L.message||e("feishuLogin.scanHint"),w.hidden=!0,"active"):L.status==="starting"?(b.textContent=L.message||e("feishuLogin.starting"),"active"):L.status==="success"?(O(),H.innerHTML="",b.textContent=e("feishuLogin.success"),window.setTimeout(()=>{E(),u()},900),"done"):(O(),H.innerHTML="",b.textContent=e("feishuLogin.failed",{reason:L.message||L.reason||""}),w.hidden=!1,"done"):"active"}async function Pt(){try{let I=await(await fetch("/api/feishu-login/status")).json().catch(()=>({}));dt(I.login)}catch{}}async function ut(){O(),b.textContent=e("feishuLogin.starting"),H.innerHTML="",w.hidden=!0;let L="active";try{let pt=await(await fetch("/api/feishu-login/start",{method:"POST"})).json().catch(()=>({}));L=dt(pt.login)}catch(I){b.textContent=e("feishuLogin.failed",{reason:I?.message??String(I)}),w.hidden=!1;return}L==="active"&&q===null&&(q=window.setInterval(()=>{Pt()},1500))}w.addEventListener("click",()=>{ut()}),ut()}var nt=new Map;function ke(u){let c=null;for(let b of ye.sessions.values())b.larkAppId!==u||!b.cliId||(!c||Number(b.lastMessageAt??0)>Number(c.lastMessageAt??0))&&(c=b);return c?.cliId??""}async function De(){if(!Me){Me=!0;try{let u=await fetch("/api/cli-options"),c=await u.json().catch(()=>({}));u.ok&&Array.isArray(c?.options)&&(te=c.options.filter(b=>b&&typeof b.id=="string"&&typeof b.label=="string"),typeof c.ttadkModelDefault=="string"&&c.ttadkModelDefault.trim()&&(qt=c.ttadkModelDefault.trim()),Array.isArray(c.ttadkModelSuggestions)&&(ee=c.ttadkModelSuggestions.filter(b=>typeof b=="string")))}catch{}}}function Ye(u,c){let b=typeof u?.agentSelectionKey=="string"&&u.agentSelectionKey?u.agentSelectionKey:"";return b||Yt(u,c)||"claude-code"}function It(u){return te.find(c=>c.id===u)}function ta(u){return u?.gateway==="ttadk"&&u.acceptsModel!==!1?ee:[]}function ea(u,c){let b=Ye(u,c),H=te.map(E=>`<option value="${r(E.id)}" ${E.id===b?"selected":""}>${r(E.label)}\uFF08${r(E.id)}\uFF09</option>`).join(""),w=typeof u?.model=="string"?u.model:"",q=ta(It(b)),O=It(b)?.gateway==="ttadk"&&It(b)?.acceptsModel===!1;return`<section class="bd-section">
11
+ <h3 class="bd-section-title">${e("botDefaults.sectionAgent")}</h3>
12
+ <div class="bd-row">
13
+ <label>
14
+ <span>${e("botDefaults.agentCli")}</span>
15
+ <select data-input="agentCliId">${H}</select>
16
+ </label>
17
+ </div>
18
+ <div class="bd-row">
19
+ <label>
20
+ <span>${e("botDefaults.agentModel")}</span>
21
+ <input type="text" data-input="agentModel" list="agent-model-suggestions-${r(u.larkAppId)}"
22
+ placeholder="${r(e("botDefaults.agentModelPlaceholder"))}"
23
+ value="${r(w)}" ${O?"disabled":""}>
24
+ <datalist id="agent-model-suggestions-${r(u.larkAppId)}">
25
+ ${q.map(E=>`<option value="${r(E)}"></option>`).join("")}
26
+ </datalist>
27
+ </label>
28
+ <small class="bd-help">${e("botDefaults.agentHelp")}</small>
29
+ <div class="actions">
30
+ <button type="button" class="primary" data-action="save-agent">${e("botDefaults.agentSave")}</button>
31
+ <span class="oncall-status" data-agent-status></span>
32
+ </div>
33
+ </div>
34
+ </section>`}async function we(){try{let u=await fetch("/api/bots"),c=await u.json().catch(()=>({}));if(!u.ok){st=c?.error?`HTTP ${u.status}: ${c.error}${c.path?` (${c.path})`:""}`:`HTTP ${u.status}`,S={bots:[]};return}if(!c||!Array.isArray(c.bots)){st="unexpected response shape (no `bots` array)",S={bots:[]};return}st=null,S=c}catch(u){st=u?.message??String(u),S={bots:[]}}}function Ee(u){if(!u)return"\u2014";let c=new Date(u);return Number.isNaN(c.getTime())?"\u2014":c.toLocaleString()}function Te(u){let c=u.querySelector("#bd-list"),b=u.querySelector("#bd-roster"),H=u.querySelector("#bd-filters"),w=u.querySelector("#bd-refresh"),q=!1,O=!1;w.onclick=async()=>{w.disabled=!0;try{nt.clear(),await Promise.all([we(),De()]),V()}finally{q||(w.disabled=!1)}};let E=t=>{let a=t.target.closest(".toggle-tx small, small.bd-help");a&&(t.preventDefault(),a.classList.toggle("open"))};c.addEventListener("click",E),c.innerHTML=Ht(),(async()=>(await Promise.all([we(),De()]),O=!0,V(),await ve(),V()))();function dt(){let a=(new FormData(H).get("q")??"").toLowerCase(),d=S.bots.filter(m=>!a||(m.botName??"").toLowerCase().includes(a)||(m.larkAppId??"").toLowerCase().includes(a));if(st){b.innerHTML="",c.innerHTML=`<p class="hint-warn">\u65E0\u6CD5\u52A0\u8F7D bot \u5217\u8868\uFF1A${r(st)}<br>\u5E38\u89C1\u539F\u56E0\uFF1Adashboard / daemon \u8FDB\u7A0B\u8FD8\u5728\u8DD1\u65E7\u4EE3\u7801\uFF0C\u6267\u884C <code>botmux restart</code> \u540E\u5237\u65B0\u3002</p>`;return}if(d.length===0){b.innerHTML="",c.innerHTML=`<p class="empty">${e("botDefaults.empty")}</p>`;return}(!at||!d.some(m=>m.larkAppId===at))&&(at=d[0].larkAppId),b.innerHTML=d.map(Pt).join(""),b.querySelectorAll(".bd-roster-item").forEach(m=>{m.onclick=()=>{at=m.dataset.appid,V()}});let p=d.find(m=>m.larkAppId===at);c.innerHTML=ut(p),We()}function Pt(t){let a=t.botName??t.larkAppId,d=Yt(t,ke(t.larkAppId)),p=t.defaultOncall?.enabled?'<span class="bd-roster-flag">oncall</span>':"";return`<div class="bd-roster-item${t.larkAppId===at?" on":""}" data-appid="${r(t.larkAppId)}" role="button" tabindex="0">
35
+ ${xt({name:a,larkAppId:t.larkAppId,size:"sm"})}
36
+ <div class="bd-roster-tx">
37
+ <b>${r(a)}</b>
38
+ <span>${r(d||t.larkAppId.slice(0,14))}</span>
39
+ </div>
40
+ ${p}
41
+ </div>`}function ut(t){if(t.error)return`<article class="bd-card bd-profile" data-appid="${r(t.larkAppId)}">
42
+ <header class="bd-profile-head">
43
+ ${xt({name:t.botName??t.larkAppId,larkAppId:t.larkAppId})}
44
+ <div class="bd-profile-id"><strong>${r(t.botName??t.larkAppId)}</strong>
45
+ <code>${r(t.larkAppId)}</code></div>
46
+ </header>
47
+ <p class="hint-warn-inline">\u67E5\u8BE2\u5931\u8D25\uFF1A${r(t.error)}</p>
48
+ </article>`;let a=t.defaultOncall??{enabled:!1,workingDir:"",since:0},d=a.enabled?"oncall":t.defaultWorkingDir?"default":"off",p=t.defaultWorkingDir||a.workingDir||"",m=t.botName??t.larkAppId,y=Yt(t,ke(t.larkAppId));return`<article class="bd-card bd-profile" data-appid="${r(t.larkAppId)}">
49
+ <header class="bd-profile-head">
50
+ ${xt({name:m,larkAppId:t.larkAppId,dot:"ok"})}
51
+ <div class="bd-profile-id">
52
+ <span class="bd-name-row" data-name-row>
53
+ <strong data-bot-name>${r(m)}</strong>
54
+ <button type="button" class="bd-name-edit" data-action="edit-bot-name"
55
+ title="${r(e("botDefaults.renameTitle"))}" aria-label="${r(e("botDefaults.renameTitle"))}">
56
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17 3a2.85 2.85 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"/></svg>
57
+ </button>
58
+ </span>
59
+ <span class="bd-name-editor" data-name-editor hidden>
60
+ <input type="text" class="bd-name-input" data-input="botRename" maxlength="64" value="${r(m)}">
61
+ <button type="button" class="primary" data-action="save-bot-name">${e("botDefaults.renameSave")}</button>
62
+ <button type="button" data-action="cancel-bot-name">${e("botDefaults.renameCancel")}</button>
63
+ </span>
64
+ ${y?`<span class="mate-role">${r(y)}</span>`:""}
65
+ <code>${r(t.larkAppId)}</code>
66
+ <small class="bd-name-status oncall-status" data-name-status></small>
67
+ <button type="button" class="bd-feishu-login" data-action="feishu-login" hidden>${e("feishuLogin.entry")}</button>
68
+ </div>
69
+ <div class="bd-profile-meta bd-meta">
70
+ <small class="bd-meta-ok">\u25CF ${e("botDefaults.metaOnline")}</small>
71
+ <small data-oncall-since>${e("botDefaults.lastEnabled")}: ${r(Ee(a.since??0))}</small>
72
+ <small>${e("botDefaults.autobound",{count:t.autoboundChatCount??0})}</small>
73
+ </div>
74
+ </header>
75
+ <div class="bd-body bd-grid">
76
+ <section class="bd-tile">
77
+ ${ea(t,y)}
78
+ <section class="bd-section">
79
+ <h3 class="bd-section-title">${e("botDefaults.sectionWorkingDir")}</h3>
80
+ <div class="bd-row">
81
+ <label>
82
+ <span>${e("botDefaults.workingDirMode")}</span>
83
+ <select data-input="workingDirMode">
84
+ <option value="off" ${d==="off"?"selected":""}>${r(e("botDefaults.workingDirModeOff"))}</option>
85
+ <option value="default" ${d==="default"?"selected":""}>${r(e("botDefaults.workingDirModeDefault"))}</option>
86
+ <option value="oncall" ${d==="oncall"?"selected":""}>${r(e("botDefaults.workingDirModeOncall"))}</option>
87
+ </select>
88
+ </label>
89
+ <small class="bd-help">${e("botDefaults.workingDirModeHelp")}</small>
90
+ </div>
91
+ <div class="bd-row" data-wd-dir-row ${d==="off"?"hidden":""}>
92
+ <label>
93
+ <span>${e("botDefaults.workingDirField")}</span>
94
+ <input type="text" data-input="workingDir" placeholder="e.g. /root/iserver/botmux"
95
+ value="${r(p)}">
96
+ </label>
97
+ </div>
98
+ <div class="actions">
99
+ <button type="button" class="primary" data-action="save-working-dir">${e("botDefaults.save")}</button>
100
+ <span class="oncall-status" data-status></span>
101
+ </div>
102
+ ${Ge(t)}
103
+ </section>
104
+ ${Ae(t)}
105
+ </section>
106
+ <section class="bd-tile">${L(t)}</section>
107
+ <section class="bd-tile">${Ie(t)}${He(t)}${Re(t)}${Pe(t)}${Be(t)}${Ne(t)}</section>
108
+ <section class="bd-tile">${xe(t)}${qe(t)}${Ce(t)}</section>
109
+ <section class="bd-tile">${Oe(t)}</section>
110
+ </div>
111
+ </article>`}function L(t){let a=typeof t.teamRole=="string";return`<section class="bd-section">
112
+ <h3 class="bd-section-title">${e("botDefaults.sectionRole")}</h3>
113
+ <p class="bd-section-note">${e("botDefaults.roleHelp")}</p>
114
+ <textarea data-input="teamRole" rows="6"
115
+ placeholder="${r(e("botDefaults.rolePlaceholder"))}"
116
+ style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px"${a?"":" disabled"}>${a?r(t.teamRole):""}</textarea>
117
+ <div class="actions">
118
+ <button type="button" class="primary" data-action="save-role"${a?"":" disabled"}>${e("botDefaults.roleSave")}</button>
119
+ <button type="button" data-action="delete-role"${a?"":" disabled"}>${e("botDefaults.roleDelete")}</button>
120
+ <span class="oncall-status" data-role-status></span>
121
+ </div>
122
+ <div class="bd-profile-roles" data-profile-roles>
123
+ <h4 class="bd-subsection-title">${e("botDefaults.profileRoles")}</h4>
124
+ <p class="bd-section-note">${e("botDefaults.profileRolesHelp")}</p>
125
+ <div class="bd-profile-role-list" data-profile-role-list>${I(t.larkAppId)}</div>
126
+ </div>
127
+ </section>`}function I(t){let a=nt.get(t);return!a||a.loading?Ht():a.error?`<p class="hint-warn-inline">${r(e("botDefaults.profileRolesLoadFailed",{error:a.error}))}</p>`:a.items.length===0?`<p class="empty">${e("botDefaults.profileRolesEmpty")}</p>`:a.items.map(d=>`
128
+ <details class="bd-profile-role-entry" data-profile-id="${r(d.profileId)}">
129
+ <summary><code>${r(d.profileId)}</code></summary>
130
+ <div class="bd-profile-role-content" data-profile-role-body="${r(d.profileId)}">
131
+ ${pt(d)}
132
+ </div>
133
+ </details>
134
+ `).join("")}function pt(t){return t.loading?Ht():t.error?`<p class="hint-warn-inline">${r(e("botDefaults.profileRoleDetailLoadFailed",{error:t.error}))}</p>`:t.loaded?`<pre>${r(t.content??"")}</pre>`:`<p class="empty">${e("botDefaults.profileRoleClickToLoad")}</p>`}function ae(t){return t==null?e("botDefaults.brandStateDefault"):t.trim()===""?e("botDefaults.brandStateOff"):e("botDefaults.brandStateCustom")}function Ce(t){let a=t.brandLabel??null;return`<section class="bd-section">
135
+ <h3 class="bd-section-title">${e("botDefaults.sectionBrand")}</h3>
136
+ <div class="bd-row bd-brand">
137
+ <label>
138
+ <span>${e("botDefaults.brandLabel")}</span>
139
+ <input type="text" data-input="brandLabel"
140
+ placeholder="${r(e("botDefaults.brandLabelPlaceholder"))}"
141
+ value="${r(a??"")}">
142
+ </label>
143
+ <small data-brand-state>${r(ae(a))}</small>
144
+ <small class="bd-help">${e("botDefaults.brandLabelHelp")}</small>
145
+ <div class="actions">
146
+ <button type="button" class="primary" data-action="save-brand">${e("botDefaults.brandSave")}</button>
147
+ <button type="button" data-action="reset-brand">${e("botDefaults.brandReset")}</button>
148
+ <span class="oncall-status" data-brand-status></span>
149
+ </div>
150
+ </div>
151
+ </section>`}function xe(t){let a=t.disableStreamingCard===!0,d=t.silentTurnReactions===!0,p=t.writableTerminalLinkInCard===!0,m=t.privateCard===!0;return`<section class="bd-section">
152
+ <h3 class="bd-section-title">${e("botDefaults.sectionCard")}</h3>
153
+ <label class="toggle-row">
154
+ <input type="checkbox" data-action="toggle-disable-streaming" ${a?"checked":""}>
155
+ <span class="switch" aria-hidden="true"></span>
156
+ <span class="toggle-tx"><strong>${e("botDefaults.disableStreaming")}</strong>
157
+ <small>${e("botDefaults.disableStreamingHelp")}</small></span>
158
+ </label>
159
+ <label class="toggle-row">
160
+ <input type="checkbox" data-action="toggle-silent-reactions" ${d?"checked":""} ${a?"":"disabled"}>
161
+ <span class="switch" aria-hidden="true"></span>
162
+ <span class="toggle-tx"><strong>${e("botDefaults.silentTurnReactions")}</strong>
163
+ <small>${e("botDefaults.silentTurnReactionsHelp")}</small></span>
164
+ </label>
165
+ <label class="toggle-row">
166
+ <input type="checkbox" data-action="toggle-writable-link" ${p?"checked":""} ${a?"disabled":""}>
167
+ <span class="switch" aria-hidden="true"></span>
168
+ <span class="toggle-tx"><strong>${e("botDefaults.writableLink")}</strong>
169
+ <small>${e("botDefaults.writableLinkHelp")}</small></span>
170
+ </label>
171
+ <label class="toggle-row">
172
+ <input type="checkbox" data-action="toggle-private-card" ${m?"checked":""}>
173
+ <span class="switch" aria-hidden="true"></span>
174
+ <span class="toggle-tx"><strong>${e("botDefaults.privateCard")}</strong>
175
+ <small>${e("botDefaults.privateCardHelp")}</small></span>
176
+ </label>
177
+ <div class="actions">
178
+ <small data-card-pref-moot class="hint-warn-inline" ${a?"":"hidden"}>${e("botDefaults.writableLinkMoot")}</small>
179
+ <span class="oncall-status" data-card-pref-status></span>
180
+ </div>
181
+ </section>`}function He(t){let a=t.botToBotSameDir!==!1;return`<section class="bd-section">
182
+ <h3 class="bd-section-title">${e("botDefaults.sectionCrossBot")}</h3>
183
+ <label class="toggle-row">
184
+ <input type="checkbox" data-action="toggle-cross-bot-samedir" ${a?"checked":""}>
185
+ <span class="switch" aria-hidden="true"></span>
186
+ <span class="toggle-tx"><strong>${e("botDefaults.botToBotSameDir")}</strong>
187
+ <small>${e("botDefaults.botToBotSameDirHelp")}</small></span>
188
+ </label>
189
+ <div class="actions"><span class="oncall-status" data-crossbot-status></span></div>
190
+ </section>`}function qe(t){let a=t.summaryRange??{limit:50,sinceHours:24},d=Number.isInteger(a.limit)&&a.limit>=0?a.limit:50,p=Number.isInteger(a.sinceHours)&&a.sinceHours>=0?a.sinceHours:24;return`<section class="bd-section">
191
+ <h3 class="bd-section-title">${e("botDefaults.sectionSummaryTrigger")}</h3>
192
+ <div class="bd-row bd-summary-limits">
193
+ <label>
194
+ <span>${e("botDefaults.summaryLimit")}</span>
195
+ <input type="number" min="0" step="1" data-input="summaryLimit" value="${d}">
196
+ </label>
197
+ <label>
198
+ <span>${e("botDefaults.summarySinceHours")}</span>
199
+ <input type="number" min="0" step="1" data-input="summarySinceHours" value="${p}">
200
+ </label>
201
+ </div>
202
+ <small class="bd-help">${e("botDefaults.summaryLimitHelp")}</small>
203
+ <div class="actions">
204
+ <button type="button" class="primary" data-action="save-summary-trigger">${e("botDefaults.summarySave")}</button>
205
+ <span class="oncall-status" data-summary-trigger-status></span>
206
+ </div>
207
+ </section>`}function Ie(t){let a=t.p2pMode==="chat"?"chat":"thread",d=t.regularGroupReplyMode==="new-topic"||t.regularGroupReplyMode==="shared"||t.regularGroupReplyMode==="chat-topic"?t.regularGroupReplyMode:"chat",p=t.regularGroupMentionMode==="topic"||t.regularGroupMentionMode==="never"||t.regularGroupMentionMode==="ambient"?t.regularGroupMentionMode:"always",m=t.docSubscribeDefaultMode==="all"?"all":"mention-only",y=(g,N)=>`<option value="${g}" ${d===g?"selected":""}>${r(N)}</option>`,v=(g,N)=>`<option value="${g}" ${p===g?"selected":""}>${r(N)}</option>`,k=(g,N)=>`<option value="${g}" ${m===g?"selected":""}>${r(N)}</option>`;return`<section class="bd-section">
208
+ <h3 class="bd-section-title">${e("botDefaults.sectionSessionMode")}</h3>
209
+ <div class="bd-row">
210
+ <label>
211
+ <span>${e("botDefaults.p2pMode")}</span>
212
+ <select data-input="p2pMode">
213
+ <option value="thread" ${a==="chat"?"":"selected"}>${r(e("botDefaults.p2pThread"))}</option>
214
+ <option value="chat" ${a==="chat"?"selected":""}>${r(e("botDefaults.p2pChat"))}</option>
215
+ </select>
216
+ </label>
217
+ <small class="bd-help">${e("botDefaults.p2pHelp")}</small>
218
+ <div class="actions">
219
+ <span class="oncall-status" data-p2p-status></span>
220
+ </div>
221
+ </div>
222
+ <div class="bd-row">
223
+ <label>
224
+ <span>${e("botDefaults.regularGroupMode")}</span>
225
+ <select data-input="regularGroupMode">
226
+ ${y("chat",e("botDefaults.regularGroupModeChat"))}
227
+ ${y("chat-topic",e("botDefaults.regularGroupModeChatTopic"))}
228
+ ${y("new-topic",e("botDefaults.regularGroupModeNewTopic"))}
229
+ ${y("shared",e("botDefaults.regularGroupModeShared"))}
230
+ </select>
231
+ </label>
232
+ <small class="bd-help">${e("botDefaults.regularGroupModeHelp")}</small>
233
+ <div class="actions">
234
+ <span class="oncall-status" data-regular-group-status></span>
235
+ </div>
236
+ </div>
237
+ <div class="bd-row">
238
+ <label>
239
+ <span>${e("botDefaults.mentionMode")}</span>
240
+ <select data-input="regularGroupMentionMode">
241
+ ${v("always",e("botDefaults.mentionModeAlways"))}
242
+ ${v("topic",e("botDefaults.mentionModeTopic"))}
243
+ ${v("never",e("botDefaults.mentionModeNever"))}
244
+ ${v("ambient",e("botDefaults.mentionModeAmbient"))}
245
+ </select>
246
+ </label>
247
+ <small class="bd-help">${e("botDefaults.mentionModeHelp")}</small>
248
+ <div class="actions">
249
+ <span class="oncall-status" data-mention-mode-status></span>
250
+ </div>
251
+ </div>
252
+ <div class="bd-row">
253
+ <label>
254
+ <span>${e("botDefaults.docSubscribeMode")}</span>
255
+ <select data-input="docSubscribeDefaultMode">
256
+ ${k("mention-only",e("botDefaults.docSubscribeModeMention"))}
257
+ ${k("all",e("botDefaults.docSubscribeModeAll"))}
258
+ </select>
259
+ </label>
260
+ <small class="bd-help">${e("botDefaults.docSubscribeModeHelp")}</small>
261
+ <div class="actions">
262
+ <span class="oncall-status" data-doc-subscribe-mode-status></span>
263
+ </div>
264
+ </div>
265
+ </section>`}function ne(t){return t==null?e("botDefaults.maxLiveWorkersStateDefault"):e("botDefaults.maxLiveWorkersStateOn",{count:t})}function Re(t){let a=typeof t.maxLiveWorkers=="number"?t.maxLiveWorkers:null;return`<div class="bd-subsection">
266
+ <h4 class="bd-subsection-title">${e("botDefaults.sectionSessionCap")}</h4>
267
+ <div class="bd-row bd-quota">
268
+ <label>
269
+ <span>${e("botDefaults.maxLiveWorkers")}</span>
270
+ <input type="number" min="1" step="1" data-input="maxLiveWorkers"
271
+ placeholder="${r(e("botDefaults.maxLiveWorkersPlaceholder"))}"
272
+ value="${a??""}">
273
+ </label>
274
+ <small data-session-cap-state>${r(ne(a))}</small>
275
+ <small class="bd-help">${e("botDefaults.maxLiveWorkersHelp")}</small>
276
+ <div class="actions">
277
+ <button type="button" class="primary" data-action="save-session-cap">${e("botDefaults.maxLiveWorkersSave")}</button>
278
+ <button type="button" data-action="off-session-cap">${e("botDefaults.maxLiveWorkersOff")}</button>
279
+ <span class="oncall-status" data-session-cap-status></span>
280
+ </div>
281
+ </div>
282
+ </div>`}function Pe(t){let a=typeof t.startupCommands=="string"?t.startupCommands:"";return`<div class="bd-subsection">
283
+ <h4 class="bd-subsection-title">${e("botDefaults.sectionStartupCommands")}</h4>
284
+ <p class="bd-section-note">${e("botDefaults.startupCommandsHelp")}</p>
285
+ <textarea data-input="startupCommands" rows="3"
286
+ placeholder="${r(e("botDefaults.startupCommandsPlaceholder"))}"
287
+ style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px">${r(a)}</textarea>
288
+ <div class="actions">
289
+ <button type="button" class="primary" data-action="save-startup-commands">${e("botDefaults.startupCommandsSave")}</button>
290
+ <span class="oncall-status" data-startup-commands-status></span>
291
+ </div>
292
+ </div>`}function Be(t){let a=typeof t.launchShell=="string"?t.launchShell:"";return`<div class="bd-subsection">
293
+ <h4 class="bd-subsection-title">${e("botDefaults.sectionLaunchShell")}</h4>
294
+ <p class="bd-section-note">${e("botDefaults.launchShellHelp")}</p>
295
+ <input type="text" data-input="launchShell"
296
+ placeholder="${r(e("botDefaults.launchShellPlaceholder"))}"
297
+ value="${r(a)}"
298
+ style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px">
299
+ <div class="actions">
300
+ <button type="button" class="primary" data-action="save-launch-shell">${e("botDefaults.launchShellSave")}</button>
301
+ <span class="oncall-status" data-launch-shell-status></span>
302
+ </div>
303
+ </div>`}function Ne(t){let a=typeof t.env=="string"?t.env:"";return`<div class="bd-subsection">
304
+ <h4 class="bd-subsection-title">${e("botDefaults.sectionEnv")}</h4>
305
+ <p class="bd-section-note">${e("botDefaults.envHelp")}</p>
306
+ <textarea data-input="env" rows="5"
307
+ placeholder="${r(e("botDefaults.envPlaceholder"))}"
308
+ style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px">${r(a)}</textarea>
309
+ <div class="actions">
310
+ <button type="button" class="primary" data-action="save-env">${e("botDefaults.envSave")}</button>
311
+ <span class="oncall-status" data-env-status></span>
312
+ </div>
313
+ </div>`}function Ae(t){let a=t.sandbox===!0;return`<section class="bd-section">
314
+ <h3 class="bd-section-title">${e("botDefaults.sectionSandbox")}</h3>
315
+ <label class="toggle-row">
316
+ <input type="checkbox" data-action="toggle-sandbox" ${a?"checked":""}>
317
+ <span class="switch" aria-hidden="true"></span>
318
+ <span class="toggle-tx"><strong>${e("botDefaults.sandboxToggle")}</strong>
319
+ <small>${e("botDefaults.sandboxHelp")}</small></span>
320
+ </label>
321
+ <div class="actions">
322
+ <span class="oncall-status" data-sandbox-status></span>
323
+ </div>
324
+ </section>`}function se(t){return t==null?e("botDefaults.quotaStateOff"):e("botDefaults.quotaStateOn",{count:t})}function Oe(t){let a=t.restrictGrantCommands===!0,d=t.autoGrantRequestCards!==!1,p=typeof t.messageQuotaDefaultLimit=="number"?t.messageQuotaDefaultLimit:null;return`<section class="bd-section">
325
+ <h3 class="bd-section-title">${e("botDefaults.sectionGrant")}</h3>
326
+ <label class="toggle-row">
327
+ <input type="checkbox" data-action="toggle-auto-grant-card" ${d?"checked":""}>
328
+ <span class="switch" aria-hidden="true"></span>
329
+ <span class="toggle-tx"><strong>${e("botDefaults.autoGrantCard")}</strong>
330
+ <small>${e("botDefaults.autoGrantCardHelp")}</small></span>
331
+ </label>
332
+ <label class="toggle-row">
333
+ <input type="checkbox" data-action="toggle-restrict-grant" ${a?"checked":""}>
334
+ <span class="switch" aria-hidden="true"></span>
335
+ <span class="toggle-tx"><strong>${e("botDefaults.restrictGrant")}</strong>
336
+ <small>${e("botDefaults.restrictGrantHelp")}</small></span>
337
+ </label>
338
+ <div class="bd-row bd-quota">
339
+ <label>
340
+ <span>${e("botDefaults.quotaDefault")}</span>
341
+ <input type="number" min="1" step="1" data-input="quotaLimit"
342
+ placeholder="${r(e("botDefaults.quotaPlaceholder"))}"
343
+ value="${p??""}">
344
+ </label>
345
+ <small data-quota-state>${r(se(p))}</small>
346
+ <small class="bd-help">${e("botDefaults.quotaHelp")}</small>
347
+ <div class="actions">
348
+ <button type="button" class="primary" data-action="save-quota">${e("botDefaults.quotaSave")}</button>
349
+ <button type="button" data-action="off-quota">${e("botDefaults.quotaOff")}</button>
350
+ <span class="oncall-status" data-grant-status></span>
351
+ </div>
352
+ </div>
353
+ </section>`}function Ge(t){let a=t.autoStartOnGroupJoin===!0,d=t.autoStartOnNewTopic===!0,p=typeof t.autoStartOnGroupJoinPrompt=="string"?t.autoStartOnGroupJoinPrompt:"";return`<div class="bd-subsection">
354
+ <h4 class="bd-subsection-title">${e("botDefaults.sectionAutoStart")}</h4>
355
+ <label class="toggle-row">
356
+ <input type="checkbox" data-action="toggle-auto-join" ${a?"checked":""}>
357
+ <span class="switch" aria-hidden="true"></span>
358
+ <span class="toggle-tx"><strong>${e("botDefaults.autoStartJoin")}</strong>
359
+ <small>${e("botDefaults.autoStartJoinHelp")}</small></span>
360
+ </label>
361
+ <div class="bd-row">
362
+ <label>
363
+ <span>${e("botDefaults.autoStartJoinPrompt")}</span>
364
+ <textarea data-input="autoJoinPrompt" rows="3"
365
+ placeholder="${r(e("botDefaults.autoStartJoinPromptPlaceholder"))}">${r(p)}</textarea>
366
+ </label>
367
+ <div class="actions">
368
+ <button type="button" class="primary" data-action="save-auto-join-prompt">${e("botDefaults.autoStartJoinPromptSave")}</button>
369
+ </div>
370
+ </div>
371
+ <label class="toggle-row">
372
+ <input type="checkbox" data-action="toggle-auto-topic" ${d?"checked":""}>
373
+ <span class="switch" aria-hidden="true"></span>
374
+ <span class="toggle-tx"><strong>${e("botDefaults.autoStartTopic")}</strong>
375
+ <small>${e("botDefaults.autoStartTopicHelp")}</small></span>
376
+ </label>
377
+ <div class="actions">
378
+ <span class="oncall-status" data-auto-start-status></span>
379
+ </div>
380
+ </div>`}function oe(t){return c.querySelector(`.bd-card[data-appid="${CSS.escape(t)}"]`)}function Bt(t,a){let d=t?.querySelector("[data-profile-role-list]");d&&(d.innerHTML=I(a),Je(t,a))}async function je(t,a){let d=nt.get(t);if(d?.loaded||d?.loading){Bt(a,t);return}d={loaded:!1,loading:!0,items:[]},nt.set(t,d),Bt(a,t);try{let p=await fetch("/api/role-profiles"),m=await p.json().catch(()=>({}));if(!p.ok)throw new Error(m?.error??String(p.status));let y=Array.isArray(m.profiles)?m.profiles:[];d.items=y.filter(v=>(v.botEntries??[]).some(k=>k?.larkAppId===t&&k?.hasEntry)).map(v=>({profileId:String(v.profileId)})),d.loaded=!0}catch(p){d.error=p?.message??String(p),d.loaded=!0}finally{d.loading=!1,Bt(oe(t),t)}}function Je(t,a){t.querySelectorAll("details.bd-profile-role-entry[data-profile-id]").forEach(d=>{d.addEventListener("toggle",()=>{if(!d.open)return;let p=d.dataset.profileId;p&&Ue(a,p)})})}async function Ue(t,a){let p=nt.get(t)?.items.find(m=>m.profileId===a);if(!(!p||p.loaded||p.loading)){p.loading=!0,le(t,a);try{let m=await fetch(`/api/role-profiles/${encodeURIComponent(a)}/${encodeURIComponent(t)}`),y=await m.json().catch(()=>({}));if(!m.ok)throw new Error(y?.error??String(m.status));p.content=y?.hasEntry?String(y.content??""):"",p.loaded=!0}catch(m){p.error=m?.message??String(m)}finally{p.loading=!1,le(t,a)}}}function le(t,a){let p=nt.get(t)?.items.find(y=>y.profileId===a);if(!p)return;let m=oe(t)?.querySelector(`[data-profile-role-body="${CSS.escape(a)}"]`);m&&(m.innerHTML=pt(p))}function We(){c.querySelectorAll(".bd-card").forEach(t=>{let a=t.dataset.appid;je(a,t);let d=t.querySelector("select[data-input=workingDirMode]"),p=t.querySelector("input[data-input=workingDir]"),m=t.querySelector("[data-wd-dir-row]"),y=t.querySelector("button[data-action=save-working-dir]"),v=t.querySelector("[data-status]");if(!d||!p||!y||!v)return;let k=t.querySelector("select[data-input=agentCliId]"),g=t.querySelector("input[data-input=agentModel]"),N=t.querySelector("button[data-action=save-agent]"),G=t.querySelector("[data-agent-status]");function ie(){if(!k||!g)return;let n=t.querySelector(`#agent-model-suggestions-${CSS.escape(a)}`),o=It(k.value),s=o?.gateway==="ttadk",i=s&&o.acceptsModel!==!1;if(s&&!i){n&&(n.innerHTML=""),g.value="",g.disabled=!0,g.placeholder=e("botOnboarding.modelTtadkCocoPlaceholder");return}g.disabled=!1,i?(n&&(n.innerHTML=ee.map(l=>`<option value="${r(l)}"></option>`).join("")),g.placeholder=e("botOnboarding.modelTtadkPlaceholder").replace("{model}",qt),g.value.trim()||(g.value=qt)):(n&&(n.innerHTML=""),g.placeholder=e("botDefaults.agentModelPlaceholder"),g.value.trim()===qt&&(g.value=""))}k&&g&&N&&G&&(k.addEventListener("change",ie),N.addEventListener("click",async()=>{G.textContent="",G.className="oncall-status",N.disabled=!0,k.disabled=!0,g.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/agent`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({cliId:k.value,model:g.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){G.textContent=`\u2713 ${e("botDefaults.agentSaved")}`,G.classList.add("hint-ok");let s=S.bots.find(i=>i.larkAppId===a);s&&(s.cliId=o.cliId,s.wrapperCli=o.wrapperCli??null,s.model=o.model??"",s.agentSelectionKey=o.selectionKey??k.value)}else G.textContent=`\u2717 ${o.error??n.status}`,G.classList.add("hint-warn-inline")}catch(n){G.textContent=`\u2717 ${n?.message??n}`,G.classList.add("hint-warn-inline")}finally{N.disabled=!1,k.disabled=!1,g.disabled=!1,ie()}})),d.addEventListener("change",()=>{let n=d.value==="off";m&&(m.hidden=n),n||p.focus()}),y.addEventListener("click",async()=>{v.textContent="",v.className="oncall-status";let n=d.value,o=p.value.trim();if(n!=="off"&&!o){v.textContent=e("botDefaults.required"),v.classList.add("hint-warn-inline");return}y.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/working-dir-mode`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({mode:n,workingDir:o})}),i=await s.json().catch(()=>({}));if(s.ok&&i.ok){let l=i.resolvedPath?` \u2192 ${i.resolvedPath}`:"";v.textContent=`\u2713 ${e("botDefaults.workingDirSaved")}${l}`,v.classList.add("hint-ok");let f=S.bots.find(B=>B.larkAppId===a);f&&(i.defaultOncall&&(f.defaultOncall=i.defaultOncall),f.defaultWorkingDir=i.defaultWorkingDir??null);let h=t.querySelector("[data-oncall-since]");h&&i.defaultOncall?.since!=null&&(h.textContent=`${e("botDefaults.lastEnabled")}: ${Ee(i.defaultOncall.since)}`)}else v.textContent=`\u2717 ${i.error??s.status}`,v.classList.add("hint-warn-inline")}catch(s){v.textContent=`\u2717 ${s?.message??s}`,v.classList.add("hint-warn-inline")}finally{y.disabled=!1}});let ft=t.querySelector("input[data-input=brandLabel]"),Nt=t.querySelector("button[data-action=save-brand]"),At=t.querySelector("button[data-action=reset-brand]"),j=t.querySelector("[data-brand-status]"),re=t.querySelector("[data-brand-state]");async function ce(n,o){if(j){j.textContent="",j.className="oncall-status",o.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/brand-label`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({brandLabel:n})}),i=await s.json().catch(()=>({}));if(s.ok&&i.ok){let l=i.brandLabel??null;j.textContent="\u2713",j.classList.add("hint-ok"),ft&&(ft.value=l??""),re&&(re.textContent=ae(l));let f=S.bots.find(h=>h.larkAppId===a);f&&(f.brandLabel=l)}else j.textContent=`\u2717 ${i.error??s.status}`,j.classList.add("hint-warn-inline")}catch(s){j.textContent=`\u2717 ${s?.message??s}`,j.classList.add("hint-warn-inline")}finally{o.disabled=!1}}}ft&&Nt&&Nt.addEventListener("click",()=>ce(ft.value,Nt)),At&&At.addEventListener("click",()=>ce(null,At));let de=t.querySelector("[data-name-row]"),ue=t.querySelector("[data-name-editor]"),Ot=t.querySelector("[data-bot-name]"),A=t.querySelector("input[data-input=botRename]"),pe=t.querySelector("button[data-action=edit-bot-name]"),Z=t.querySelector("button[data-action=save-bot-name]"),X=t.querySelector("button[data-action=cancel-bot-name]"),$=t.querySelector("[data-name-status]"),J=t.querySelector("button[data-action=feishu-login]");function mt(n){!de||!ue||(de.hidden=n,ue.hidden=!n,n&&A&&(A.value=Ot?.textContent??"",A.focus(),A.select()))}function Fe(n,o){let i=["no_session","session_expired","no_access","unsupported_brand"].includes(n)?e(`botDefaults.renameWarn.${n}`):o||n;return e("botDefaults.renameLocalOnly",{reason:i})}async function Gt(){if(!A||!$)return;let n=A.value.trim();if(!n){$.textContent=`\u2717 ${e("botDefaults.renameEmpty")}`,$.className="bd-name-status oncall-status hint-warn-inline";return}A.disabled=!0,Z&&(Z.disabled=!0),X&&(X.disabled=!0),$.className="bd-name-status oncall-status",$.textContent=`\u23F3 ${e("botDefaults.renaming")}`;try{let o=await fetch(`/api/bots/${encodeURIComponent(a)}/rename`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({name:n})}),s=await o.json().catch(()=>({}));if(o.ok&&s.ok){let i=typeof s.botName=="string"&&s.botName?s.botName:n,l=S.bots.find(h=>h.larkAppId===a);l&&(l.botName=i,s.mode==="feishu"?(l.larkBotName=n,l.displayName=null):l.displayName=n),Ot&&(Ot.textContent=i);let f=b.querySelector(`.bd-roster-item[data-appid="${CSS.escape(a)}"] .bd-roster-tx b`);if(f&&(f.textContent=i),mt(!1),s.mode==="feishu")$.textContent=`\u2713 ${e("botDefaults.renameOkFeishu")}`,$.classList.add("hint-ok"),J&&(J.hidden=!0);else{$.textContent=`\u26A0 ${Fe(String(s.warning??""),s.message)}`,$.classList.add("hint-warn-inline"),typeof s.message=="string"&&s.message&&($.title=s.message);let h=s.warning==="no_session"||s.warning==="session_expired";J&&(J.hidden=!h)}}else $.textContent=`\u2717 ${e("botDefaults.renameFailed",{error:String(s.error??o.status)})}`,$.classList.add("hint-warn-inline")}catch(o){$.textContent=`\u2717 ${e("botDefaults.renameFailed",{error:o?.message??String(o)})}`,$.classList.add("hint-warn-inline")}finally{A.disabled=!1,Z&&(Z.disabled=!1),X&&(X.disabled=!1)}}pe&&pe.addEventListener("click",()=>{$&&($.textContent="",$.className="bd-name-status oncall-status"),J&&(J.hidden=!0),mt(!0)}),J&&J.addEventListener("click",()=>{Xe(()=>{J.hidden=!0,Gt()})}),X&&X.addEventListener("click",()=>mt(!1)),Z&&Z.addEventListener("click",()=>{Gt()}),A&&A.addEventListener("keydown",n=>{n.key==="Enter"?(n.preventDefault(),Gt()):n.key==="Escape"&&mt(!1)});let Y=t.querySelector("input[data-action=toggle-disable-streaming]"),_=t.querySelector("input[data-action=toggle-silent-reactions]"),K=t.querySelector("input[data-action=toggle-writable-link]"),bt=t.querySelector("input[data-action=toggle-private-card]"),Qe=t.querySelector("[data-card-pref-status]"),fe=t.querySelector("[data-card-pref-moot]");async function R(n,o,s=Qe){if(s){s.textContent="",s.className="oncall-status",o.disabled=!0;try{let i=await fetch(`/api/bots/${encodeURIComponent(a)}/card-prefs`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(n)}),l=await i.json().catch(()=>({}));if(i.ok&&l.ok){s.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,s.classList.add("hint-ok");let f=S.bots.find(h=>h.larkAppId===a);f&&(f.disableStreamingCard=l.disableStreamingCard,f.silentTurnReactions=l.silentTurnReactions,f.writableTerminalLinkInCard=l.writableTerminalLinkInCard,f.privateCard=l.privateCard,f.botToBotSameDir=l.botToBotSameDir,f.autoStartOnGroupJoin=l.autoStartOnGroupJoin,f.autoStartOnGroupJoinPrompt=l.autoStartOnGroupJoinPrompt,f.autoStartOnNewTopic=l.autoStartOnNewTopic,f.regularGroupReplyMode=l.regularGroupReplyMode,f.regularGroupMentionMode=l.regularGroupMentionMode,f.docSubscribeDefaultMode=l.docSubscribeDefaultMode)}else s.textContent=`\u2717 ${l.error??i.status}`,s.classList.add("hint-warn-inline")}catch(i){s.textContent=`\u2717 ${i?.message??i}`,s.classList.add("hint-warn-inline")}finally{o===K?o.disabled=!!Y?.checked:o===_?o.disabled=!Y?.checked:o.disabled=!1}}}Y&&Y.addEventListener("change",()=>{let n=Y.checked;K&&(K.disabled=n),_&&(_.disabled=!n),fe&&(fe.hidden=!n),R({disableStreamingCard:n},Y)}),_&&_.addEventListener("change",()=>{R({silentTurnReactions:_.checked},_)}),K&&K.addEventListener("change",()=>{R({writableTerminalLinkInCard:K.checked},K)}),bt&&bt.addEventListener("change",()=>{R({privateCard:bt.checked},bt)});let gt=t.querySelector("input[data-action=toggle-cross-bot-samedir]"),_e=t.querySelector("[data-crossbot-status]");gt&&gt.addEventListener("change",()=>{R({botToBotSameDir:gt.checked},gt,_e)});let jt=t.querySelector("input[data-input=summaryLimit]"),Jt=t.querySelector("input[data-input=summarySinceHours]"),ht=t.querySelector("button[data-action=save-summary-trigger]"),P=t.querySelector("[data-summary-trigger-status]");function me(n,o){let s=n.value.trim();return s===""?o:/^(0|[1-9]\d*)$/.test(s)?Number(s):null}jt&&Jt&&ht&&ht.addEventListener("click",async()=>{if(!P)return;P.textContent="",P.className="oncall-status";let n=me(jt,50),o=me(Jt,24);if(n==null||o==null){P.textContent=`\u2717 ${e("botDefaults.summaryNumberInvalid")}`,P.classList.add("hint-warn-inline");return}ht.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/summary-range`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({limit:n,sinceHours:o})}),i=await s.json().catch(()=>({}));if(s.ok&&i.ok){P.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,P.classList.add("hint-ok");let l=i.summaryRange??{limit:n,sinceHours:o};jt.value=String(Number.isInteger(l.limit)&&l.limit>=0?l.limit:n),Jt.value=String(Number.isInteger(l.sinceHours)&&l.sinceHours>=0?l.sinceHours:o);let f=S.bots.find(h=>h.larkAppId===a);f&&(f.summaryRange=l)}else P.textContent=`\u2717 ${i.error??s.status}`,P.classList.add("hint-warn-inline")}catch(s){P.textContent=`\u2717 ${s?.message??s}`,P.classList.add("hint-warn-inline")}finally{ht.disabled=!1}});let z=t.querySelector("input[data-action=toggle-sandbox]"),T=t.querySelector("[data-sandbox-status]");z&&z.addEventListener("change",async()=>{let n=z.checked;T&&(T.textContent="",T.className="oncall-status"),z.disabled=!0;try{let o=await fetch(`/api/bots/${encodeURIComponent(a)}/sandbox`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({enabled:n})}),s=await o.json().catch(()=>({}));if(o.ok&&s.ok){T&&(T.textContent=`\u2713 ${e("botDefaults.sandboxSaved")}`,T.classList.add("hint-ok"));let i=S.bots.find(l=>l.larkAppId===a);i&&(i.sandbox=s.sandbox===!0)}else T&&(T.textContent=`\u2717 ${s.error??o.status}`,T.classList.add("hint-warn-inline")),z.checked=!n}catch(o){T&&(T.textContent=`\u2717 ${o?.message??o}`,T.classList.add("hint-warn-inline")),z.checked=!n}finally{z.disabled=!1}});let yt=t.querySelector("input[data-action=toggle-auto-join]"),vt=t.querySelector("input[data-action=toggle-auto-topic]"),be=t.querySelector("textarea[data-input=autoJoinPrompt]"),Ut=t.querySelector("button[data-action=save-auto-join-prompt]"),Wt=t.querySelector("[data-auto-start-status]");yt&&yt.addEventListener("change",()=>{R({autoStartOnGroupJoin:yt.checked},yt,Wt)}),vt&&vt.addEventListener("change",()=>{R({autoStartOnNewTopic:vt.checked},vt,Wt)}),be&&Ut&&Ut.addEventListener("click",()=>{R({autoStartOnGroupJoinPrompt:be.value},Ut,Wt)});let ot=t.querySelector("select[data-input=p2pMode]"),U=t.querySelector("[data-p2p-status]");ot&&U&&ot.addEventListener("change",async()=>{let n=ot.value==="chat"?"chat":"thread";U.textContent="",U.className="oncall-status",ot.disabled=!0;try{let o=await fetch(`/api/bots/${encodeURIComponent(a)}/p2p-mode`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({p2pMode:n})}),s=await o.json().catch(()=>({}));if(o.ok&&s.ok){U.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,U.classList.add("hint-ok");let i=S.bots.find(l=>l.larkAppId===a);i&&(i.p2pMode=s.p2pMode==="chat"?"chat":"thread")}else U.textContent=`\u2717 ${s.error??o.status}`,U.classList.add("hint-warn-inline")}catch(o){U.textContent=`\u2717 ${o?.message??o}`,U.classList.add("hint-warn-inline")}finally{ot.disabled=!1}});let St=t.querySelector("select[data-input=regularGroupMode]"),Ke=t.querySelector("[data-regular-group-status]");St&&St.addEventListener("change",()=>{R({regularGroupReplyMode:St.value},St,Ke)});let Lt=t.querySelector("select[data-input=regularGroupMentionMode]"),ze=t.querySelector("[data-mention-mode-status]");Lt&&Lt.addEventListener("change",()=>{R({regularGroupMentionMode:Lt.value},Lt,ze)});let $t=t.querySelector("select[data-input=docSubscribeDefaultMode]"),Ve=t.querySelector("[data-doc-subscribe-mode-status]");$t&&$t.addEventListener("change",()=>{R({docSubscribeDefaultMode:$t.value},$t,Ve)});let Ft=t.querySelector("textarea[data-input=teamRole]"),lt=t.querySelector("button[data-action=save-role]"),it=t.querySelector("button[data-action=delete-role]"),D=t.querySelector("[data-role-status]");if(Ft&&lt&&it&&D){let s=function(l){let f=c.querySelector(`.bd-card[data-appid="${CSS.escape(a)}"]`);if(!f)return;let h=f.querySelector("textarea[data-input=teamRole]"),B=f.querySelector("button[data-action=save-role]"),ct=f.querySelector("button[data-action=delete-role]");h&&(h.value=l,h.disabled=!1),B&&(B.disabled=!1),ct&&(ct.disabled=!1)};var na=s;let n=`/api/team/local-bots/${encodeURIComponent(a)}/role`,o=S.bots.find(l=>l.larkAppId===a);o&&typeof o.teamRole!="string"&&!o.teamRoleLoading&&(o.teamRoleLoading=!0,(async()=>{try{let l=await fetch(n),f=await l.json().catch(()=>({}));l.ok&&f.ok?(o.teamRole=f.role??"",s(o.teamRole)):(D.textContent=`\u2717 ${e("botDefaults.roleLoadErr")}: ${f.error??l.status}`,D.classList.add("hint-warn-inline"))}catch(l){D.textContent=`\u2717 ${e("botDefaults.roleLoadErr")}: ${l?.message??l}`,D.classList.add("hint-warn-inline")}finally{o.teamRoleLoading=!1}})());async function i(l,f,h){if(D&&!(!o||typeof o.teamRole!="string")){D.textContent="",D.className="oncall-status",lt.disabled=!0,it.disabled=!0;try{let B=await fetch(n,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({role:l})}),ct=await B.json().catch(()=>({}));B.ok&&ct.ok?(o&&(o.teamRole=l.trim()),D.textContent=`\u2713 ${h?e("botDefaults.roleDeleted"):e("botDefaults.roleSaved")}`,D.classList.add("hint-ok")):(D.textContent=`\u2717 ${ct.error??B.status}`,D.classList.add("hint-warn-inline"))}catch(B){D.textContent=`\u2717 ${B?.message??B}`,D.classList.add("hint-warn-inline")}finally{lt.disabled=!1,it.disabled=!1}}}lt.addEventListener("click",()=>i(Ft.value,lt,!1)),it.addEventListener("click",()=>{Ft.value="",i("",it,!0)})}let Mt=t.querySelector("input[data-action=toggle-auto-grant-card]"),kt=t.querySelector("input[data-action=toggle-restrict-grant]"),tt=t.querySelector("input[data-input=quotaLimit]"),Dt=t.querySelector("button[data-action=save-quota]"),Qt=t.querySelector("button[data-action=off-quota]"),C=t.querySelector("[data-grant-status]"),ge=t.querySelector("[data-quota-state]");async function rt(n,o){if(C){C.textContent="",C.className="oncall-status",o.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/grant-prefs`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(n)}),i=await s.json().catch(()=>({}));if(s.ok&&i.ok){C.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,C.classList.add("hint-ok");let l=typeof i.messageQuotaDefaultLimit=="number"?i.messageQuotaDefaultLimit:null,f=S.bots.find(h=>h.larkAppId===a);f&&(f.autoGrantRequestCards=i.autoGrantRequestCards!==!1,f.restrictGrantCommands=i.restrictGrantCommands===!0,f.messageQuotaDefaultLimit=l),ge&&(ge.textContent=se(l)),tt&&"messageQuotaDefaultLimit"in n&&(tt.value=l==null?"":String(l))}else C.textContent=`\u2717 ${i.error??s.status}`,C.classList.add("hint-warn-inline")}catch(s){C.textContent=`\u2717 ${s?.message??s}`,C.classList.add("hint-warn-inline")}finally{o.disabled=!1}}}Mt&&Mt.addEventListener("change",()=>{rt({autoGrantRequestCards:Mt.checked},Mt)}),kt&&kt.addEventListener("change",()=>{rt({restrictGrantCommands:kt.checked},kt)}),tt&&Dt&&Dt.addEventListener("click",()=>{let n=tt.value.trim();if(n===""){rt({messageQuotaDefaultLimit:null},Dt);return}if(!/^[1-9]\d*$/.test(n)){C&&(C.textContent=`\u2717 ${e("botDefaults.quotaInvalid")}`,C.className="oncall-status hint-warn-inline");return}rt({messageQuotaDefaultLimit:Number(n)},Dt)}),tt&&Qt&&Qt.addEventListener("click",()=>{tt.value="",rt({messageQuotaDefaultLimit:null},Qt)});let et=t.querySelector("input[data-input=maxLiveWorkers]"),wt=t.querySelector("button[data-action=save-session-cap]"),_t=t.querySelector("button[data-action=off-session-cap]"),x=t.querySelector("[data-session-cap-status]"),he=t.querySelector("[data-session-cap-state]");async function Kt(n,o){if(x){x.textContent="",x.className="oncall-status",o.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/max-live-workers`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({maxLiveWorkers:n})}),i=await s.json().catch(()=>({}));if(s.ok&&i.ok){x.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,x.classList.add("hint-ok");let l=typeof i.maxLiveWorkers=="number"?i.maxLiveWorkers:null,f=S.bots.find(h=>h.larkAppId===a);f&&(f.maxLiveWorkers=l),he&&(he.textContent=ne(l)),et&&(et.value=l==null?"":String(l))}else x.textContent=`\u2717 ${i.error??s.status}`,x.classList.add("hint-warn-inline")}catch(s){x.textContent=`\u2717 ${s?.message??s}`,x.classList.add("hint-warn-inline")}finally{o.disabled=!1}}}et&&wt&&wt.addEventListener("click",()=>{let n=et.value.trim();if(n===""){Kt(null,wt);return}if(!/^[1-9]\d*$/.test(n)){x&&(x.textContent=`\u2717 ${e("botDefaults.maxLiveWorkersInvalid")}`,x.className="oncall-status hint-warn-inline");return}Kt(Number(n),wt)}),et&&_t&&_t.addEventListener("click",()=>{et.value="",Kt(null,_t)});let zt=t.querySelector("textarea[data-input=startupCommands]"),Et=t.querySelector("button[data-action=save-startup-commands]"),W=t.querySelector("[data-startup-commands-status]");zt&&Et&&Et.addEventListener("click",async()=>{if(W){W.textContent="",W.className="oncall-status",Et.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/startup-commands`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({startupCommands:zt.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){W.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,W.classList.add("hint-ok");let s=typeof o.startupCommands=="string"?o.startupCommands:"";zt.value=s;let i=S.bots.find(l=>l.larkAppId===a);i&&(i.startupCommands=s)}else W.textContent=`\u2717 ${o.error??n.status}`,W.classList.add("hint-warn-inline")}catch(n){W.textContent=`\u2717 ${n?.message??n}`,W.classList.add("hint-warn-inline")}finally{Et.disabled=!1}}});let Vt=t.querySelector("input[data-input=launchShell]"),Tt=t.querySelector("button[data-action=save-launch-shell]"),F=t.querySelector("[data-launch-shell-status]");Vt&&Tt&&Tt.addEventListener("click",async()=>{if(F){F.textContent="",F.className="oncall-status",Tt.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/launch-shell`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({launchShell:Vt.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){F.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,F.classList.add("hint-ok");let s=typeof o.launchShell=="string"?o.launchShell:"";Vt.value=s;let i=S.bots.find(l=>l.larkAppId===a);i&&(i.launchShell=s)}else F.textContent=`\u2717 ${o.error??n.status}`,F.classList.add("hint-warn-inline")}catch(n){F.textContent=`\u2717 ${n?.message??n}`,F.classList.add("hint-warn-inline")}finally{Tt.disabled=!1}}});let Zt=t.querySelector("textarea[data-input=env]"),Ct=t.querySelector("button[data-action=save-env]"),Q=t.querySelector("[data-env-status]");Zt&&Ct&&Ct.addEventListener("click",async()=>{if(Q){Q.textContent="",Q.className="oncall-status",Ct.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/env`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({env:Zt.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){Q.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,Q.classList.add("hint-ok");let s=typeof o.env=="string"?o.env:"";Zt.value=s;let i=S.bots.find(l=>l.larkAppId===a);i&&(i.env=s)}else Q.textContent=`\u2717 ${o.error??n.status}`,Q.classList.add("hint-warn-inline")}catch(n){Q.textContent=`\u2717 ${n?.message??n}`,Q.classList.add("hint-warn-inline")}finally{Ct.disabled=!1}}})})}function V(){!q&&O&&dt()}return H.addEventListener("input",V),()=>{q=!0,w.onclick=null,H.removeEventListener("input",V),c.removeEventListener("click",E),b.replaceChildren(),c.replaceChildren()}}var M=Xt(Le(),1);function aa(){let u=$e(),c=(0,Rt.useRef)(null);return(0,Rt.useEffect)(()=>{if(c.current)return Te(c.current)},[]),(0,M.jsxs)("section",{className:"page",ref:c,children:[(0,M.jsx)("div",{className:"page-heading",children:(0,M.jsxs)("div",{children:[(0,M.jsx)("p",{className:"eyebrow",children:u("nav.botDefaults")}),(0,M.jsx)("h1",{children:u("botDefaults.title")}),(0,M.jsx)("p",{children:u("botDefaults.subtitle")})]})}),(0,M.jsxs)("form",{id:"bd-filters",className:"filters sessions-filters",children:[(0,M.jsx)("input",{type:"search",name:"q",placeholder:u("botDefaults.search")}),(0,M.jsx)("button",{type:"button",id:"bd-refresh",children:u("botDefaults.refresh")})]}),(0,M.jsxs)("div",{className:"bd-layout",children:[(0,M.jsx)("aside",{id:"bd-roster",className:"bd-roster"}),(0,M.jsx)("div",{id:"bd-list",className:"bd-detail"})]})]})}function da(u){return Se(u,(0,M.jsx)(aa,{}))}export{da as renderBotDefaultsPage};