botmux 2.106.0 → 2.107.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 (182) hide show
  1. package/dist/bot-registry.d.ts +25 -0
  2. package/dist/bot-registry.d.ts.map +1 -1
  3. package/dist/bot-registry.js +6 -0
  4. package/dist/bot-registry.js.map +1 -1
  5. package/dist/core/command-handler.d.ts.map +1 -1
  6. package/dist/core/command-handler.js +5 -0
  7. package/dist/core/command-handler.js.map +1 -1
  8. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  9. package/dist/core/dashboard-ipc-server.js +27 -1
  10. package/dist/core/dashboard-ipc-server.js.map +1 -1
  11. package/dist/core/dashboard-rows.d.ts +6 -0
  12. package/dist/core/dashboard-rows.d.ts.map +1 -1
  13. package/dist/core/dashboard-rows.js +25 -0
  14. package/dist/core/dashboard-rows.js.map +1 -1
  15. package/dist/core/pending-response.d.ts +1 -0
  16. package/dist/core/pending-response.d.ts.map +1 -1
  17. package/dist/core/pending-response.js +1 -0
  18. package/dist/core/pending-response.js.map +1 -1
  19. package/dist/core/resource-monitor/attribution.d.ts +70 -0
  20. package/dist/core/resource-monitor/attribution.d.ts.map +1 -0
  21. package/dist/core/resource-monitor/attribution.js +222 -0
  22. package/dist/core/resource-monitor/attribution.js.map +1 -0
  23. package/dist/core/resource-monitor/procfs.d.ts +22 -0
  24. package/dist/core/resource-monitor/procfs.d.ts.map +1 -0
  25. package/dist/core/resource-monitor/procfs.js +134 -0
  26. package/dist/core/resource-monitor/procfs.js.map +1 -0
  27. package/dist/core/resource-monitor/ring-buffer.d.ts +15 -0
  28. package/dist/core/resource-monitor/ring-buffer.d.ts.map +1 -0
  29. package/dist/core/resource-monitor/ring-buffer.js +61 -0
  30. package/dist/core/resource-monitor/ring-buffer.js.map +1 -0
  31. package/dist/core/resource-monitor/runtime.d.ts +31 -0
  32. package/dist/core/resource-monitor/runtime.d.ts.map +1 -0
  33. package/dist/core/resource-monitor/runtime.js +92 -0
  34. package/dist/core/resource-monitor/runtime.js.map +1 -0
  35. package/dist/core/resource-monitor/top-selector.d.ts +18 -0
  36. package/dist/core/resource-monitor/top-selector.d.ts.map +1 -0
  37. package/dist/core/resource-monitor/top-selector.js +57 -0
  38. package/dist/core/resource-monitor/top-selector.js.map +1 -0
  39. package/dist/core/resource-monitor/types.d.ts +181 -0
  40. package/dist/core/resource-monitor/types.d.ts.map +1 -0
  41. package/dist/core/resource-monitor/types.js +2 -0
  42. package/dist/core/resource-monitor/types.js.map +1 -0
  43. package/dist/core/session-manager.d.ts +3 -1
  44. package/dist/core/session-manager.d.ts.map +1 -1
  45. package/dist/core/session-manager.js +31 -1
  46. package/dist/core/session-manager.js.map +1 -1
  47. package/dist/core/types.d.ts +1 -0
  48. package/dist/core/types.d.ts.map +1 -1
  49. package/dist/core/types.js.map +1 -1
  50. package/dist/daemon.d.ts +1 -1
  51. package/dist/daemon.d.ts.map +1 -1
  52. package/dist/daemon.js +44 -22
  53. package/dist/daemon.js.map +1 -1
  54. package/dist/dashboard/bot-payload.d.ts +1 -0
  55. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  56. package/dist/dashboard/bot-payload.js +1 -0
  57. package/dist/dashboard/bot-payload.js.map +1 -1
  58. package/dist/dashboard/resource-monitor-service.d.ts +56 -0
  59. package/dist/dashboard/resource-monitor-service.d.ts.map +1 -0
  60. package/dist/dashboard/resource-monitor-service.js +446 -0
  61. package/dist/dashboard/resource-monitor-service.js.map +1 -0
  62. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  63. package/dist/dashboard/web/bot-defaults.js +160 -1
  64. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  65. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  66. package/dist/dashboard/web/dashboard-routes.js +18 -0
  67. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  68. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  69. package/dist/dashboard/web/i18n.js +274 -2
  70. package/dist/dashboard/web/i18n.js.map +1 -1
  71. package/dist/dashboard/web/monitor-room-store.d.ts +20 -0
  72. package/dist/dashboard/web/monitor-room-store.d.ts.map +1 -0
  73. package/dist/dashboard/web/monitor-room-store.js +80 -0
  74. package/dist/dashboard/web/monitor-room-store.js.map +1 -0
  75. package/dist/dashboard/web/monitor-room.d.ts +31 -0
  76. package/dist/dashboard/web/monitor-room.d.ts.map +1 -0
  77. package/dist/dashboard/web/monitor-room.js +393 -0
  78. package/dist/dashboard/web/monitor-room.js.map +1 -0
  79. package/dist/dashboard/web/monitoring-page.d.ts +155 -0
  80. package/dist/dashboard/web/monitoring-page.d.ts.map +1 -0
  81. package/dist/dashboard/web/monitoring-page.js +189 -0
  82. package/dist/dashboard/web/monitoring-page.js.map +1 -0
  83. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  84. package/dist/dashboard/web/overview-page.js +108 -1
  85. package/dist/dashboard/web/overview-page.js.map +1 -1
  86. package/dist/dashboard/web/preferences.d.ts +3 -0
  87. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  88. package/dist/dashboard/web/preferences.js +18 -0
  89. package/dist/dashboard/web/preferences.js.map +1 -1
  90. package/dist/dashboard/web/session-terminal.d.ts +7 -0
  91. package/dist/dashboard/web/session-terminal.d.ts.map +1 -0
  92. package/dist/dashboard/web/session-terminal.js +17 -0
  93. package/dist/dashboard/web/session-terminal.js.map +1 -0
  94. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  95. package/dist/dashboard/web/sessions-page.js +2 -1
  96. package/dist/dashboard/web/sessions-page.js.map +1 -1
  97. package/dist/dashboard/web/sessions.d.ts +4 -0
  98. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  99. package/dist/dashboard/web/sessions.js +98 -17
  100. package/dist/dashboard/web/sessions.js.map +1 -1
  101. package/dist/dashboard/web/skills-page.js +1 -1
  102. package/dist/dashboard/web/skills-page.js.map +1 -1
  103. package/dist/dashboard/web/substitute-targets.d.ts +30 -0
  104. package/dist/dashboard/web/substitute-targets.d.ts.map +1 -0
  105. package/dist/dashboard/web/substitute-targets.js +99 -0
  106. package/dist/dashboard/web/substitute-targets.js.map +1 -0
  107. package/dist/dashboard/web/ui.d.ts +1 -1
  108. package/dist/dashboard/web/ui.d.ts.map +1 -1
  109. package/dist/dashboard/web/ui.js +4 -1
  110. package/dist/dashboard/web/ui.js.map +1 -1
  111. package/dist/dashboard-web/app.js +3 -3
  112. package/dist/dashboard-web/chunks/bot-defaults-page-OCIHPGEU.js +438 -0
  113. package/dist/dashboard-web/chunks/chunk-3N2PPQVD.js +1 -0
  114. package/dist/dashboard-web/chunks/chunk-3UJYRR2Q.js +37 -0
  115. package/dist/dashboard-web/chunks/{chunk-VFCACTRF.js → chunk-PE6W3C2C.js} +1 -1
  116. package/dist/dashboard-web/chunks/chunk-QW54DWU3.js +325 -0
  117. package/dist/dashboard-web/chunks/{connectors-VDOAKUW3.js → connectors-IGETYWCP.js} +1 -1
  118. package/dist/dashboard-web/chunks/{groups-page-CX5AN4XG.js → groups-page-MYBS4ZYJ.js} +1 -1
  119. package/dist/dashboard-web/chunks/{insights-page-DOMRL4S6.js → insights-page-UPA32V2S.js} +1 -1
  120. package/dist/dashboard-web/chunks/monitor-room-RFX4HPS5.js +51 -0
  121. package/dist/dashboard-web/chunks/monitoring-page-7T3BESZ2.js +1 -0
  122. package/dist/dashboard-web/chunks/overview-page-LJSBCQW4.js +1 -0
  123. package/dist/dashboard-web/chunks/{roles-page-3FEAH6S4.js → roles-page-ESURTVQH.js} +1 -1
  124. package/dist/dashboard-web/chunks/{schedules-CTQEA7IE.js → schedules-LML2ISOT.js} +1 -1
  125. package/dist/dashboard-web/chunks/sessions-YB73XOTU.js +1 -0
  126. package/dist/dashboard-web/chunks/sessions-page-MCO5QR7Z.js +1 -0
  127. package/dist/dashboard-web/chunks/{settings-page-R23I3IZG.js → settings-page-OSDKNVS3.js} +1 -1
  128. package/dist/dashboard-web/chunks/skills-page-PXBZJ6P6.js +2 -0
  129. package/dist/dashboard-web/chunks/{team-federation-page-ZKL3YMGN.js → team-federation-page-TTPVHFPX.js} +1 -1
  130. package/dist/dashboard-web/chunks/{workflows-4BYQQBFP.js → workflows-FCPM4S4D.js} +1 -1
  131. package/dist/dashboard-web/index.html +2 -1
  132. package/dist/dashboard-web/style.css +818 -8
  133. package/dist/dashboard.js +37 -0
  134. package/dist/dashboard.js.map +1 -1
  135. package/dist/i18n/en.d.ts.map +1 -1
  136. package/dist/i18n/en.js +8 -0
  137. package/dist/i18n/en.js.map +1 -1
  138. package/dist/i18n/zh.d.ts.map +1 -1
  139. package/dist/i18n/zh.js +8 -0
  140. package/dist/i18n/zh.js.map +1 -1
  141. package/dist/im/lark/card-builder.d.ts.map +1 -1
  142. package/dist/im/lark/card-builder.js +18 -0
  143. package/dist/im/lark/card-builder.js.map +1 -1
  144. package/dist/im/lark/card-handler.d.ts.map +1 -1
  145. package/dist/im/lark/card-handler.js +12 -2
  146. package/dist/im/lark/card-handler.js.map +1 -1
  147. package/dist/im/lark/event-dispatcher.d.ts +3 -0
  148. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  149. package/dist/im/lark/event-dispatcher.js +59 -2
  150. package/dist/im/lark/event-dispatcher.js.map +1 -1
  151. package/dist/im/lark/message-parser.d.ts +35 -0
  152. package/dist/im/lark/message-parser.d.ts.map +1 -1
  153. package/dist/im/lark/message-parser.js +56 -0
  154. package/dist/im/lark/message-parser.js.map +1 -1
  155. package/dist/im/lark/substitute-command.d.ts +2 -0
  156. package/dist/im/lark/substitute-command.d.ts.map +1 -0
  157. package/dist/im/lark/substitute-command.js +51 -0
  158. package/dist/im/lark/substitute-command.js.map +1 -0
  159. package/dist/services/substitute-chat-toggle-store.d.ts +3 -0
  160. package/dist/services/substitute-chat-toggle-store.d.ts.map +1 -0
  161. package/dist/services/substitute-chat-toggle-store.js +58 -0
  162. package/dist/services/substitute-chat-toggle-store.js.map +1 -0
  163. package/dist/services/substitute-mode-normalize.d.ts +22 -0
  164. package/dist/services/substitute-mode-normalize.d.ts.map +1 -0
  165. package/dist/services/substitute-mode-normalize.js +56 -0
  166. package/dist/services/substitute-mode-normalize.js.map +1 -0
  167. package/dist/services/substitute-mode-store.d.ts +50 -0
  168. package/dist/services/substitute-mode-store.d.ts.map +1 -0
  169. package/dist/services/substitute-mode-store.js +115 -0
  170. package/dist/services/substitute-mode-store.js.map +1 -0
  171. package/dist/types.d.ts +14 -0
  172. package/dist/types.d.ts.map +1 -1
  173. package/dist/worker.js +20 -1
  174. package/dist/worker.js.map +1 -1
  175. package/package.json +1 -1
  176. package/dist/dashboard-web/chunks/bot-defaults-page-3OIY7N76.js +0 -409
  177. package/dist/dashboard-web/chunks/chunk-BNEXMNQD.js +0 -31
  178. package/dist/dashboard-web/chunks/chunk-DKKOGZCG.js +0 -317
  179. package/dist/dashboard-web/chunks/overview-page-AZBAXVZ7.js +0 -1
  180. package/dist/dashboard-web/chunks/sessions-LVZCXO2Z.js +0 -1
  181. package/dist/dashboard-web/chunks/sessions-page-NHBJDSBC.js +0 -1
  182. package/dist/dashboard-web/chunks/skills-page-VUG3EPWX.js +0 -2
@@ -0,0 +1,438 @@
1
+ import{b as Pe}from"./chunk-PE6W3C2C.js";import{a as Ce}from"./chunk-LXIK7OUJ.js";import{o as e,p as d,r as Bt,t as He,y as Ot}from"./chunk-3UJYRR2Q.js";import{a as fa,b as Ie,c as qe}from"./chunk-JTSE5VP6.js";import{c as re}from"./chunk-7SZRL6FY.js";var Jt=re(fa(),1);var ba=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function Re(i){let r=i.trim();if(!r)return{targets:[],invalid:[]};if(r.startsWith("[")){let g;try{g=JSON.parse(r)}catch{return{targets:[],invalid:[r]}}if(!Array.isArray(g))return{targets:[],invalid:[r]};let $=[],x=[];for(let h of g){if(!h||typeof h!="object"||Array.isArray(h)){x.push(JSON.stringify(h));continue}let T=h,q={};for(let B of["openId","unionId","email","name"]){let v=T[B];typeof v=="string"&&v.trim()&&(q[B]=v.trim())}typeof T.userId=="string"&&T.userId.trim()&&(q.userId=T.userId.trim()),q.openId||q.unionId||q.email||q.userId?$.push(q):x.push(JSON.stringify(h))}return{targets:$,invalid:x}}let u=[],y=[];for(let g of r.split(/\r?\n/)){let $=g.indexOf("#"),x=$>=0?g.slice($+1).trim():"",h=($>=0?g.slice(0,$):g).trim();if(!h)continue;let T=x||void 0;h.startsWith("ou_")?u.push({openId:h,name:T}):h.startsWith("on_")?u.push({unionId:h,name:T}):ba.test(h)?u.push({email:h,name:T}):y.push(h)}return{targets:u,invalid:y}}function Ae(i){let r=Array.isArray(i?.targets)?i.targets:Array.isArray(i)?i:[],u=[];for(let y of r){if(!y||typeof y!="object")continue;let g=String(y.email??y.openId??y.unionId??y.userId??"").trim();if(!g)continue;let $=typeof y.name=="string"?y.name.trim():"";u.push($&&$!==g?`${g} # ${$}`:g)}return u.join(`
2
+ `)}var L={bots:[]},ut=null,de=[{id:"claude-code",label:"Claude"},{id:"codex",label:"Codex"},{id:"traex",label:"traex"}],je=!1,Gt="glm-5.1",ue=[],ct=null;function ce(i,r){return typeof i?.cliId=="string"&&i.cliId?i.cliId:r}function ma(i){document.querySelector(".feishu-login-overlay")?.remove();let r=document.createElement("div");r.className="feishu-login-overlay",r.innerHTML=`
3
+ <div class="feishu-login-modal" role="dialog" aria-modal="true">
4
+ <button type="button" class="feishu-login-close" data-close aria-label="${d(e("feishuLogin.close"))}">\u2715</button>
5
+ <h3 class="feishu-login-title">${d(e("feishuLogin.title"))}</h3>
6
+ <p class="feishu-login-hint" data-hint>${d(e("feishuLogin.starting"))}</p>
7
+ <div class="feishu-login-qr" data-qr></div>
8
+ <div class="feishu-login-actions">
9
+ <button type="button" class="primary" data-retry hidden>${d(e("feishuLogin.retry"))}</button>
10
+ </div>
11
+ </div>`,document.body.appendChild(r);let u=r.querySelector("[data-hint]"),y=r.querySelector("[data-qr]"),g=r.querySelector("[data-retry]"),$=null,x=()=>{$!==null&&(window.clearInterval($),$=null)},h=()=>{x(),r.remove()};r.addEventListener("click",v=>{let M=v.target;(M===r||M.closest("[data-close]"))&&h()});function T(v){return v?v.status==="awaiting_scan"&&v.qrDataUrl?(y.innerHTML=`<img class="qr-image" src="${v.qrDataUrl}" alt="${d(e("feishuLogin.qrAlt"))}">`,u.textContent=v.message||e("feishuLogin.scanHint"),g.hidden=!0,"active"):v.status==="starting"?(u.textContent=v.message||e("feishuLogin.starting"),"active"):v.status==="success"?(x(),y.innerHTML="",u.textContent=e("feishuLogin.success"),window.setTimeout(()=>{h(),i()},900),"done"):(x(),y.innerHTML="",u.textContent=e("feishuLogin.failed",{reason:v.message||v.reason||""}),g.hidden=!1,"done"):"active"}async function q(){try{let M=await(await fetch("/api/feishu-login/status")).json().catch(()=>({}));T(M.login)}catch{}}async function B(){x(),u.textContent=e("feishuLogin.starting"),y.innerHTML="",g.hidden=!0;let v="active";try{let yt=await(await fetch("/api/feishu-login/start",{method:"POST"})).json().catch(()=>({}));v=T(yt.login)}catch(M){u.textContent=e("feishuLogin.failed",{reason:M?.message??String(M)}),g.hidden=!1;return}v==="active"&&$===null&&($=window.setInterval(()=>{q()},1500))}g.addEventListener("click",()=>{B()}),B()}var dt=new Map;function Ne(i){let r=null;for(let u of Ce.sessions.values())u.larkAppId!==i||!u.cliId||(!r||Number(u.lastMessageAt??0)>Number(r.lastMessageAt??0))&&(r=u);return r?.cliId??""}async function Be(){if(!je){je=!0;try{let i=await fetch("/api/cli-options"),r=await i.json().catch(()=>({}));i.ok&&Array.isArray(r?.options)&&(de=r.options.filter(u=>u&&typeof u.id=="string"&&typeof u.label=="string"),typeof r.ttadkModelDefault=="string"&&r.ttadkModelDefault.trim()&&(Gt=r.ttadkModelDefault.trim()),Array.isArray(r.ttadkModelSuggestions)&&(ue=r.ttadkModelSuggestions.filter(u=>typeof u=="string")))}catch{}}}function ga(i,r){let u=typeof i?.agentSelectionKey=="string"&&i.agentSelectionKey?i.agentSelectionKey:"";return u||ce(i,r)||"claude-code"}function Wt(i){return de.find(r=>r.id===i)}function We(i){let r=i.name&&i.name.trim()||i.input||"",u=i.ok?"#16a34a":"#dc2626",y=i.ok?"":` \xB7 ${e("botDefaults.substituteUnresolved")}`;return`<span style="display:inline-flex;align-items:center;gap:4px;padding:2px 9px;margin:0 6px 6px 0;border-radius:12px;font-size:12px;line-height:1.6;border:1px solid ${u}40;color:${u};background:${u}14"><span>${i.ok?"\u2713":"\u2717"}</span><span>${d(r)}${d(y)}</span></span>`}function ya(i){return(Array.isArray(i?.targets)?i.targets:[]).map(u=>We({ok:!0,name:typeof u?.name=="string"&&u.name||u?.email||u?.openId||u?.unionId||u?.userId,input:u?.email||u?.openId})).join("")}function ha(i){return!Array.isArray(i)||i.length===0?"":i.map(r=>We({ok:r?.ok===!0,name:r?.name,input:r?.input})).join("")}function va(i){return Array.isArray(i)?i.map(r=>{let u=String(r?.input??"").trim();return u?r?.ok&&typeof r?.name=="string"&&r.name.trim()?`${u} # ${r.name.trim()}`:u:""}).filter(Boolean).join(`
12
+ `):""}function Sa(i){return i?.gateway==="ttadk"&&i.acceptsModel!==!1?ue:[]}function $a(i,r){let u=ga(i,r),y=de.map(M=>`<option value="${d(M.id)}" ${M.id===u?"selected":""}>${d(M.label)}\uFF08${d(M.id)}\uFF09</option>`).join(""),g=typeof i?.model=="string"?i.model:"",$=Sa(Wt(u)),x=Wt(u)?.gateway==="ttadk"&&Wt(u)?.acceptsModel===!1,h=i?.skillInjectionSupport==="dynamic"?"dynamic":i?.skillInjectionSupport==="global"?"global":"none",T=i?.skillInjection==="global"||i?.skillInjection==="prompt"||i?.skillInjection==="off"?i.skillInjection:"",q=i?.skillInjectionDefault==="global"||i?.skillInjectionDefault==="off"?i.skillInjectionDefault:"prompt",B=T||q,v=h==="none"?"":h==="dynamic"?`<div class="bd-row">
13
+ <label>
14
+ <span>${e("botDefaults.skillInjection")}</span>
15
+ <select data-input="skillInjection" disabled>
16
+ <option value="dynamic" selected>${d(e("botDefaults.skillInjectionDynamic"))}</option>
17
+ </select>
18
+ </label>
19
+ <small class="bd-help">${e("botDefaults.skillInjectionHelpDynamic")}</small>
20
+ </div>`:`<div class="bd-row">
21
+ <label>
22
+ <span>${e("botDefaults.skillInjection")}</span>
23
+ <select data-input="skillInjection">
24
+ <option value="dynamic" disabled>${d(e("botDefaults.skillInjectionDynamicUnsupported"))}</option>
25
+ <option value="prompt" ${B==="prompt"?"selected":""}>${d(e("botDefaults.skillInjectionPrompt"))}</option>
26
+ <option value="global" ${B==="global"?"selected":""}>${d(e("botDefaults.skillInjectionGlobal"))}</option>
27
+ <option value="off" ${B==="off"?"selected":""}>${d(e("botDefaults.skillInjectionOff"))}</option>
28
+ </select>
29
+ </label>
30
+ <small class="bd-help">${e("botDefaults.skillInjectionHelp")}</small>
31
+ <div class="actions">
32
+ <span class="oncall-status" data-skill-injection-status></span>
33
+ </div>
34
+ </div>`;return`<section class="bd-section">
35
+ <h3 class="bd-section-title">${e("botDefaults.sectionAgent")}</h3>
36
+ <div class="bd-row">
37
+ <label>
38
+ <span>${e("botDefaults.agentCli")}</span>
39
+ <select data-input="agentCliId">${y}</select>
40
+ </label>
41
+ </div>
42
+ <div class="bd-row">
43
+ <label>
44
+ <span>${e("botDefaults.agentModel")}</span>
45
+ <input type="text" data-input="agentModel" list="agent-model-suggestions-${d(i.larkAppId)}"
46
+ placeholder="${d(e("botDefaults.agentModelPlaceholder"))}"
47
+ value="${d(g)}" ${x?"disabled":""}>
48
+ <datalist id="agent-model-suggestions-${d(i.larkAppId)}">
49
+ ${$.map(M=>`<option value="${d(M)}"></option>`).join("")}
50
+ </datalist>
51
+ </label>
52
+ <small class="bd-help">${e("botDefaults.agentHelp")}</small>
53
+ <div class="actions">
54
+ <button type="button" class="primary" data-action="save-agent">${e("botDefaults.agentSave")}</button>
55
+ <span class="oncall-status" data-agent-status></span>
56
+ </div>
57
+ </div>
58
+ ${v}
59
+ </section>`}async function Oe(){try{let i=await fetch("/api/bots"),r=await i.json().catch(()=>({}));if(!i.ok){ut=r?.error?`HTTP ${i.status}: ${r.error}${r.path?` (${r.path})`:""}`:`HTTP ${i.status}`,L={bots:[]};return}if(!r||!Array.isArray(r.bots)){ut="unexpected response shape (no `bots` array)",L={bots:[]};return}ut=null,L=r}catch(i){ut=i?.message??String(i),L={bots:[]}}}function Ge(i){if(!i)return"\u2014";let r=new Date(i);return Number.isNaN(r.getTime())?"\u2014":r.toLocaleString()}function Je(i){let r=i.querySelector("#bd-list"),u=i.querySelector("#bd-roster"),y=i.querySelector("#bd-filters"),g=i.querySelector("#bd-refresh"),$=!1,x=!1;g.onclick=async()=>{g.disabled=!0;try{dt.clear(),await Promise.all([Oe(),Be()]),nt()}finally{$||(g.disabled=!1)}};let h=t=>{let a=t.target.closest(".toggle-tx small, small.bd-help");a&&(t.preventDefault(),a.classList.toggle("open"))};r.addEventListener("click",h),r.innerHTML=Ot(),(async()=>(await Promise.all([Oe(),Be()]),x=!0,nt(),await He(),nt()))();function T(){let a=(new FormData(y).get("q")??"").toLowerCase(),p=L.bots.filter(m=>!a||(m.botName??"").toLowerCase().includes(a)||(m.larkAppId??"").toLowerCase().includes(a));if(ut){u.innerHTML="",r.innerHTML=`<p class="hint-warn">\u65E0\u6CD5\u52A0\u8F7D bot \u5217\u8868\uFF1A${d(ut)}<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(p.length===0){u.innerHTML="",r.innerHTML=`<p class="empty">${e("botDefaults.empty")}</p>`;return}(!ct||!p.some(m=>m.larkAppId===ct))&&(ct=p[0].larkAppId),u.innerHTML=p.map(q).join(""),u.querySelectorAll(".bd-roster-item").forEach(m=>{m.onclick=()=>{ct=m.dataset.appid,nt()}});let f=p.find(m=>m.larkAppId===ct);r.innerHTML=B(f),la()}function q(t){let a=t.botName??t.larkAppId,p=ce(t,Ne(t.larkAppId)),f=t.defaultOncall?.enabled?'<span class="bd-roster-flag">oncall</span>':"";return`<div class="bd-roster-item${t.larkAppId===ct?" on":""}" data-appid="${d(t.larkAppId)}" role="button" tabindex="0">
60
+ ${Bt({name:a,larkAppId:t.larkAppId,size:"sm"})}
61
+ <div class="bd-roster-tx">
62
+ <b>${d(a)}</b>
63
+ <span>${d(p||t.larkAppId.slice(0,14))}</span>
64
+ </div>
65
+ ${f}
66
+ </div>`}function B(t){if(t.error)return`<article class="bd-card bd-profile" data-appid="${d(t.larkAppId)}">
67
+ <header class="bd-profile-head">
68
+ ${Bt({name:t.botName??t.larkAppId,larkAppId:t.larkAppId})}
69
+ <div class="bd-profile-id"><strong>${d(t.botName??t.larkAppId)}</strong>
70
+ <code>${d(t.larkAppId)}</code></div>
71
+ </header>
72
+ <p class="hint-warn-inline">\u67E5\u8BE2\u5931\u8D25\uFF1A${d(t.error)}</p>
73
+ </article>`;let a=t.defaultOncall??{enabled:!1,workingDir:"",since:0},p=a.enabled?"oncall":t.defaultWorkingDir?"default":"off",f=t.defaultWorkingDir||a.workingDir||"",m=t.botName??t.larkAppId,D=ce(t,Ne(t.larkAppId));return`<article class="bd-card bd-profile" data-appid="${d(t.larkAppId)}">
74
+ <header class="bd-profile-head">
75
+ ${Bt({name:m,larkAppId:t.larkAppId,dot:"ok"})}
76
+ <div class="bd-profile-id">
77
+ <span class="bd-name-row" data-name-row>
78
+ <strong data-bot-name>${d(m)}</strong>
79
+ <button type="button" class="bd-name-edit" data-action="edit-bot-name"
80
+ title="${d(e("botDefaults.renameTitle"))}" aria-label="${d(e("botDefaults.renameTitle"))}">
81
+ <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>
82
+ </button>
83
+ </span>
84
+ <span class="bd-name-editor" data-name-editor hidden>
85
+ <input type="text" class="bd-name-input" data-input="botRename" maxlength="64" value="${d(m)}">
86
+ <button type="button" class="primary" data-action="save-bot-name">${e("botDefaults.renameSave")}</button>
87
+ <button type="button" data-action="cancel-bot-name">${e("botDefaults.renameCancel")}</button>
88
+ </span>
89
+ ${D?`<span class="mate-role">${d(D)}</span>`:""}
90
+ <code>${d(t.larkAppId)}</code>
91
+ <small class="bd-name-status oncall-status" data-name-status></small>
92
+ <button type="button" class="bd-feishu-login" data-action="feishu-login" hidden>${e("feishuLogin.entry")}</button>
93
+ </div>
94
+ <div class="bd-profile-meta bd-meta">
95
+ <small class="bd-meta-ok">\u25CF ${e("botDefaults.metaOnline")}</small>
96
+ <small data-oncall-since>${e("botDefaults.lastEnabled")}: ${d(Ge(a.since??0))}</small>
97
+ <small>${e("botDefaults.autobound",{count:t.autoboundChatCount??0})}</small>
98
+ </div>
99
+ </header>
100
+ <div class="bd-body bd-grid">
101
+ <section class="bd-tile">
102
+ ${$a(t,D)}
103
+ <section class="bd-section">
104
+ <h3 class="bd-section-title">${e("botDefaults.sectionWorkingDir")}</h3>
105
+ <div class="bd-row">
106
+ <label>
107
+ <span>${e("botDefaults.workingDirMode")}</span>
108
+ <select data-input="workingDirMode">
109
+ <option value="off" ${p==="off"?"selected":""}>${d(e("botDefaults.workingDirModeOff"))}</option>
110
+ <option value="default" ${p==="default"?"selected":""}>${d(e("botDefaults.workingDirModeDefault"))}</option>
111
+ <option value="oncall" ${p==="oncall"?"selected":""}>${d(e("botDefaults.workingDirModeOncall"))}</option>
112
+ </select>
113
+ </label>
114
+ <small class="bd-help">${e("botDefaults.workingDirModeHelp")}</small>
115
+ </div>
116
+ <div class="bd-row" data-wd-dir-row ${p==="off"?"hidden":""}>
117
+ <label>
118
+ <span>${e("botDefaults.workingDirField")}</span>
119
+ <input type="text" data-input="workingDir" placeholder="e.g. /root/iserver/botmux"
120
+ value="${d(f)}">
121
+ </label>
122
+ </div>
123
+ <label class="toggle-row" data-wd-worktree-row ${p==="default"?"":"hidden"}>
124
+ <input type="checkbox" data-input="autoWorktree" ${t.defaultWorkingDirAutoWorktree?"checked":""}>
125
+ <span class="switch" aria-hidden="true"></span>
126
+ <span class="toggle-tx"><strong>${e("botDefaults.autoWorktree")}</strong>
127
+ <small>${e("botDefaults.autoWorktreeHelp")}</small></span>
128
+ </label>
129
+ <div class="actions">
130
+ <button type="button" class="primary" data-action="save-working-dir">${e("botDefaults.save")}</button>
131
+ <span class="oncall-status" data-status></span>
132
+ </div>
133
+ ${aa(t)}
134
+ </section>
135
+ ${ta(t)}
136
+ </section>
137
+ <section class="bd-tile">${v(t)}</section>
138
+ <section class="bd-tile">${ze(t)}${Ke(t)}${_e(t)}${Ve(t)}${Ze(t)}${Xe(t)}${Ye(t)}</section>
139
+ <section class="bd-tile">${Fe(t)}${Qe(t)}${Ue(t)}</section>
140
+ <section class="bd-tile">${ea(t)}</section>
141
+ </div>
142
+ </article>`}function v(t){let a=typeof t.teamRole=="string";return`<section class="bd-section">
143
+ <h3 class="bd-section-title">${e("botDefaults.sectionRole")}</h3>
144
+ <p class="bd-section-note">${e("botDefaults.roleHelp")}</p>
145
+ <textarea data-input="teamRole" rows="6"
146
+ placeholder="${d(e("botDefaults.rolePlaceholder"))}"
147
+ style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px"${a?"":" disabled"}>${a?d(t.teamRole):""}</textarea>
148
+ <div class="actions">
149
+ <button type="button" class="primary" data-action="save-role"${a?"":" disabled"}>${e("botDefaults.roleSave")}</button>
150
+ <button type="button" data-action="delete-role"${a?"":" disabled"}>${e("botDefaults.roleDelete")}</button>
151
+ <span class="oncall-status" data-role-status></span>
152
+ </div>
153
+ <div class="bd-profile-roles" data-profile-roles>
154
+ <h4 class="bd-subsection-title">${e("botDefaults.profileRoles")}</h4>
155
+ <p class="bd-section-note">${e("botDefaults.profileRolesHelp")}</p>
156
+ <div class="bd-profile-role-list" data-profile-role-list>${M(t.larkAppId)}</div>
157
+ </div>
158
+ </section>`}function M(t){let a=dt.get(t);return!a||a.loading?Ot():a.error?`<p class="hint-warn-inline">${d(e("botDefaults.profileRolesLoadFailed",{error:a.error}))}</p>`:a.items.length===0?`<p class="empty">${e("botDefaults.profileRolesEmpty")}</p>`:a.items.map(p=>`
159
+ <details class="bd-profile-role-entry" data-profile-id="${d(p.profileId)}">
160
+ <summary><code>${d(p.profileId)}</code></summary>
161
+ <div class="bd-profile-role-content" data-profile-role-body="${d(p.profileId)}">
162
+ ${yt(p)}
163
+ </div>
164
+ </details>
165
+ `).join("")}function yt(t){return t.loading?Ot():t.error?`<p class="hint-warn-inline">${d(e("botDefaults.profileRoleDetailLoadFailed",{error:t.error}))}</p>`:t.loaded?`<pre>${d(t.content??"")}</pre>`:`<p class="empty">${e("botDefaults.profileRoleClickToLoad")}</p>`}function pe(t){return t==null?e("botDefaults.brandStateDefault"):t.trim()===""?e("botDefaults.brandStateOff"):e("botDefaults.brandStateCustom")}function Ue(t){let a=t.brandLabel??null;return`<section class="bd-section">
166
+ <h3 class="bd-section-title">${e("botDefaults.sectionBrand")}</h3>
167
+ <div class="bd-row bd-brand">
168
+ <label>
169
+ <span>${e("botDefaults.brandLabel")}</span>
170
+ <input type="text" data-input="brandLabel"
171
+ placeholder="${d(e("botDefaults.brandLabelPlaceholder"))}"
172
+ value="${d(a??"")}">
173
+ </label>
174
+ <small data-brand-state>${d(pe(a))}</small>
175
+ <small class="bd-help">${e("botDefaults.brandLabelHelp")}</small>
176
+ <div class="actions">
177
+ <button type="button" class="primary" data-action="save-brand">${e("botDefaults.brandSave")}</button>
178
+ <button type="button" data-action="reset-brand">${e("botDefaults.brandReset")}</button>
179
+ <span class="oncall-status" data-brand-status></span>
180
+ </div>
181
+ </div>
182
+ </section>`}function Fe(t){let a=t.disableStreamingCard===!0,p=t.silentTurnReactions===!0,f=t.writableTerminalLinkInCard===!0,m=t.privateCard===!0;return`<section class="bd-section">
183
+ <h3 class="bd-section-title">${e("botDefaults.sectionCard")}</h3>
184
+ <label class="toggle-row">
185
+ <input type="checkbox" data-action="toggle-disable-streaming" ${a?"checked":""}>
186
+ <span class="switch" aria-hidden="true"></span>
187
+ <span class="toggle-tx"><strong>${e("botDefaults.disableStreaming")}</strong>
188
+ <small>${e("botDefaults.disableStreamingHelp")}</small></span>
189
+ </label>
190
+ <label class="toggle-row">
191
+ <input type="checkbox" data-action="toggle-silent-reactions" ${p?"checked":""} ${a?"":"disabled"}>
192
+ <span class="switch" aria-hidden="true"></span>
193
+ <span class="toggle-tx"><strong>${e("botDefaults.silentTurnReactions")}</strong>
194
+ <small>${e("botDefaults.silentTurnReactionsHelp")}</small></span>
195
+ </label>
196
+ <label class="toggle-row">
197
+ <input type="checkbox" data-action="toggle-writable-link" ${f?"checked":""} ${a?"disabled":""}>
198
+ <span class="switch" aria-hidden="true"></span>
199
+ <span class="toggle-tx"><strong>${e("botDefaults.writableLink")}</strong>
200
+ <small>${e("botDefaults.writableLinkHelp")}</small></span>
201
+ </label>
202
+ <label class="toggle-row">
203
+ <input type="checkbox" data-action="toggle-private-card" ${m?"checked":""}>
204
+ <span class="switch" aria-hidden="true"></span>
205
+ <span class="toggle-tx"><strong>${e("botDefaults.privateCard")}</strong>
206
+ <small>${e("botDefaults.privateCardHelp")}</small></span>
207
+ </label>
208
+ <div class="actions">
209
+ <small data-card-pref-moot class="hint-warn-inline" ${a?"":"hidden"}>${e("botDefaults.writableLinkMoot")}</small>
210
+ <span class="oncall-status" data-card-pref-status></span>
211
+ </div>
212
+ </section>`}function _e(t){let a=t.botToBotSameDir!==!1;return`<section class="bd-section">
213
+ <h3 class="bd-section-title">${e("botDefaults.sectionCrossBot")}</h3>
214
+ <label class="toggle-row">
215
+ <input type="checkbox" data-action="toggle-cross-bot-samedir" ${a?"checked":""}>
216
+ <span class="switch" aria-hidden="true"></span>
217
+ <span class="toggle-tx"><strong>${e("botDefaults.botToBotSameDir")}</strong>
218
+ <small>${e("botDefaults.botToBotSameDirHelp")}</small></span>
219
+ </label>
220
+ <div class="actions"><span class="oncall-status" data-crossbot-status></span></div>
221
+ </section>`}function Qe(t){let a=t.summaryRange??{limit:50,sinceHours:24},p=Number.isInteger(a.limit)&&a.limit>=0?a.limit:50,f=Number.isInteger(a.sinceHours)&&a.sinceHours>=0?a.sinceHours:24;return`<section class="bd-section">
222
+ <h3 class="bd-section-title">${e("botDefaults.sectionSummaryTrigger")}</h3>
223
+ <div class="bd-row bd-summary-limits">
224
+ <label>
225
+ <span>${e("botDefaults.summaryLimit")}</span>
226
+ <input type="number" min="0" step="1" data-input="summaryLimit" value="${p}">
227
+ </label>
228
+ <label>
229
+ <span>${e("botDefaults.summarySinceHours")}</span>
230
+ <input type="number" min="0" step="1" data-input="summarySinceHours" value="${f}">
231
+ </label>
232
+ </div>
233
+ <small class="bd-help">${e("botDefaults.summaryLimitHelp")}</small>
234
+ <div class="actions">
235
+ <button type="button" class="primary" data-action="save-summary-trigger">${e("botDefaults.summarySave")}</button>
236
+ <span class="oncall-status" data-summary-trigger-status></span>
237
+ </div>
238
+ </section>`}function ze(t){let a=t.p2pMode==="chat"?"chat":"thread",p=t.regularGroupReplyMode==="new-topic"||t.regularGroupReplyMode==="shared"||t.regularGroupReplyMode==="chat-topic"?t.regularGroupReplyMode:"chat",f=t.regularGroupMentionMode==="topic"||t.regularGroupMentionMode==="never"||t.regularGroupMentionMode==="ambient"?t.regularGroupMentionMode:"always",m=t.docSubscribeDefaultMode==="all"?"all":"mention-only",D=(k,H)=>`<option value="${k}" ${p===k?"selected":""}>${d(H)}</option>`,W=(k,H)=>`<option value="${k}" ${f===k?"selected":""}>${d(H)}</option>`,J=(k,H)=>`<option value="${k}" ${m===k?"selected":""}>${d(H)}</option>`;return`<section class="bd-section">
239
+ <h3 class="bd-section-title">${e("botDefaults.sectionSessionMode")}</h3>
240
+ <div class="bd-row">
241
+ <label>
242
+ <span>${e("botDefaults.p2pMode")}</span>
243
+ <select data-input="p2pMode">
244
+ <option value="thread" ${a==="chat"?"":"selected"}>${d(e("botDefaults.p2pThread"))}</option>
245
+ <option value="chat" ${a==="chat"?"selected":""}>${d(e("botDefaults.p2pChat"))}</option>
246
+ </select>
247
+ </label>
248
+ <small class="bd-help">${e("botDefaults.p2pHelp")}</small>
249
+ <div class="actions">
250
+ <span class="oncall-status" data-p2p-status></span>
251
+ </div>
252
+ </div>
253
+ <div class="bd-row">
254
+ <label>
255
+ <span>${e("botDefaults.regularGroupMode")}</span>
256
+ <select data-input="regularGroupMode">
257
+ ${D("chat",e("botDefaults.regularGroupModeChat"))}
258
+ ${D("chat-topic",e("botDefaults.regularGroupModeChatTopic"))}
259
+ ${D("new-topic",e("botDefaults.regularGroupModeNewTopic"))}
260
+ ${D("shared",e("botDefaults.regularGroupModeShared"))}
261
+ </select>
262
+ </label>
263
+ <small class="bd-help">${e("botDefaults.regularGroupModeHelp")}</small>
264
+ <div class="actions">
265
+ <span class="oncall-status" data-regular-group-status></span>
266
+ </div>
267
+ </div>
268
+ <div class="bd-row">
269
+ <label>
270
+ <span>${e("botDefaults.mentionMode")}</span>
271
+ <select data-input="regularGroupMentionMode">
272
+ ${W("always",e("botDefaults.mentionModeAlways"))}
273
+ ${W("topic",e("botDefaults.mentionModeTopic"))}
274
+ ${W("never",e("botDefaults.mentionModeNever"))}
275
+ ${W("ambient",e("botDefaults.mentionModeAmbient"))}
276
+ </select>
277
+ </label>
278
+ <small class="bd-help">${e("botDefaults.mentionModeHelp")}</small>
279
+ <div class="actions">
280
+ <span class="oncall-status" data-mention-mode-status></span>
281
+ </div>
282
+ </div>
283
+ <div class="bd-row">
284
+ <label>
285
+ <span>${e("botDefaults.docSubscribeMode")}</span>
286
+ <select data-input="docSubscribeDefaultMode">
287
+ ${J("mention-only",e("botDefaults.docSubscribeModeMention"))}
288
+ ${J("all",e("botDefaults.docSubscribeModeAll"))}
289
+ </select>
290
+ </label>
291
+ <small class="bd-help">${e("botDefaults.docSubscribeModeHelp")}</small>
292
+ <div class="actions">
293
+ <span class="oncall-status" data-doc-subscribe-mode-status></span>
294
+ </div>
295
+ </div>
296
+ </section>`}function Ke(t){let a=t.substituteMode&&typeof t.substituteMode=="object"?t.substituteMode:null,p=a?.enabled===!0,f=a?.disclosure==="none"?"none":"prefix";return`<section class="bd-section">
297
+ <h3 class="bd-section-title">${e("botDefaults.sectionSubstitute")}</h3>
298
+ <label class="toggle-row">
299
+ <input type="checkbox" data-action="toggle-substitute-mode" ${p?"checked":""}>
300
+ <span class="switch" aria-hidden="true"></span>
301
+ <span class="toggle-tx"><strong>${e("botDefaults.substituteEnabled")}</strong>
302
+ <small>${e("botDefaults.substituteHelp")}</small></span>
303
+ </label>
304
+ <div class="bd-row">
305
+ <label>
306
+ <span>${e("botDefaults.substituteDisclosure")}</span>
307
+ <select data-input="substituteDisclosure">
308
+ <option value="prefix" ${f==="prefix"?"selected":""}>${d(e("botDefaults.substituteDisclosurePrefix"))}</option>
309
+ <option value="none" ${f==="none"?"selected":""}>${d(e("botDefaults.substituteDisclosureNone"))}</option>
310
+ </select>
311
+ </label>
312
+ </div>
313
+ <textarea data-input="substituteTargets" rows="5"
314
+ placeholder="${d(e("botDefaults.substituteTargetsPlaceholder"))}"
315
+ style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px">${d(Ae(a))}</textarea>
316
+ <small class="bd-help">${e("botDefaults.substituteTargetsHelp")}</small>
317
+ <div class="substitute-chips" data-substitute-chips style="margin:6px 0 0">${ya(a)}</div>
318
+ <div class="actions">
319
+ <button type="button" class="primary" data-action="save-substitute-mode">${e("botDefaults.substituteSave")}</button>
320
+ <button type="button" data-action="off-substitute-mode">${e("botDefaults.substituteOff")}</button>
321
+ <span class="oncall-status" data-substitute-status></span>
322
+ </div>
323
+ </section>`}function fe(t){return t==null?e("botDefaults.maxLiveWorkersStateDefault"):e("botDefaults.maxLiveWorkersStateOn",{count:t})}function Ve(t){let a=typeof t.maxLiveWorkers=="number"?t.maxLiveWorkers:null;return`<div class="bd-subsection">
324
+ <h4 class="bd-subsection-title">${e("botDefaults.sectionSessionCap")}</h4>
325
+ <div class="bd-row bd-quota">
326
+ <label>
327
+ <span>${e("botDefaults.maxLiveWorkers")}</span>
328
+ <input type="number" min="1" step="1" data-input="maxLiveWorkers"
329
+ placeholder="${d(e("botDefaults.maxLiveWorkersPlaceholder"))}"
330
+ value="${a??""}">
331
+ </label>
332
+ <small data-session-cap-state>${d(fe(a))}</small>
333
+ <small class="bd-help">${e("botDefaults.maxLiveWorkersHelp")}</small>
334
+ <div class="actions">
335
+ <button type="button" class="primary" data-action="save-session-cap">${e("botDefaults.maxLiveWorkersSave")}</button>
336
+ <button type="button" data-action="off-session-cap">${e("botDefaults.maxLiveWorkersOff")}</button>
337
+ <span class="oncall-status" data-session-cap-status></span>
338
+ </div>
339
+ </div>
340
+ </div>`}function Ze(t){let a=typeof t.startupCommands=="string"?t.startupCommands:"";return`<div class="bd-subsection">
341
+ <h4 class="bd-subsection-title">${e("botDefaults.sectionStartupCommands")}</h4>
342
+ <p class="bd-section-note">${e("botDefaults.startupCommandsHelp")}</p>
343
+ <textarea data-input="startupCommands" rows="3"
344
+ placeholder="${d(e("botDefaults.startupCommandsPlaceholder"))}"
345
+ style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px">${d(a)}</textarea>
346
+ <div class="actions">
347
+ <button type="button" class="primary" data-action="save-startup-commands">${e("botDefaults.startupCommandsSave")}</button>
348
+ <span class="oncall-status" data-startup-commands-status></span>
349
+ </div>
350
+ </div>`}function Xe(t){let a=typeof t.launchShell=="string"?t.launchShell:"";return`<div class="bd-subsection">
351
+ <h4 class="bd-subsection-title">${e("botDefaults.sectionLaunchShell")}</h4>
352
+ <p class="bd-section-note">${e("botDefaults.launchShellHelp")}</p>
353
+ <input type="text" data-input="launchShell"
354
+ placeholder="${d(e("botDefaults.launchShellPlaceholder"))}"
355
+ value="${d(a)}"
356
+ style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px">
357
+ <div class="actions">
358
+ <button type="button" class="primary" data-action="save-launch-shell">${e("botDefaults.launchShellSave")}</button>
359
+ <span class="oncall-status" data-launch-shell-status></span>
360
+ </div>
361
+ </div>`}function Ye(t){let a=typeof t.env=="string"?t.env:"";return`<div class="bd-subsection">
362
+ <h4 class="bd-subsection-title">${e("botDefaults.sectionEnv")}</h4>
363
+ <p class="bd-section-note">${e("botDefaults.envHelp")}</p>
364
+ <textarea data-input="env" rows="5"
365
+ placeholder="${d(e("botDefaults.envPlaceholder"))}"
366
+ style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px">${d(a)}</textarea>
367
+ <div class="actions">
368
+ <button type="button" class="primary" data-action="save-env">${e("botDefaults.envSave")}</button>
369
+ <span class="oncall-status" data-env-status></span>
370
+ </div>
371
+ </div>`}function ta(t){let a=t.sandbox===!0;return`<section class="bd-section">
372
+ <h3 class="bd-section-title">${e("botDefaults.sectionSandbox")}</h3>
373
+ <label class="toggle-row">
374
+ <input type="checkbox" data-action="toggle-sandbox" ${a?"checked":""}>
375
+ <span class="switch" aria-hidden="true"></span>
376
+ <span class="toggle-tx"><strong>${e("botDefaults.sandboxToggle")}</strong>
377
+ <small>${e("botDefaults.sandboxHelp")}</small></span>
378
+ </label>
379
+ <div class="actions">
380
+ <span class="oncall-status" data-sandbox-status></span>
381
+ </div>
382
+ </section>`}function be(t){return t==null?e("botDefaults.quotaStateOff"):e("botDefaults.quotaStateOn",{count:t})}function ea(t){let a=t.restrictGrantCommands===!0,p=t.autoGrantRequestCards!==!1,f=typeof t.messageQuotaDefaultLimit=="number"?t.messageQuotaDefaultLimit:null;return`<section class="bd-section">
383
+ <h3 class="bd-section-title">${e("botDefaults.sectionGrant")}</h3>
384
+ <label class="toggle-row">
385
+ <input type="checkbox" data-action="toggle-auto-grant-card" ${p?"checked":""}>
386
+ <span class="switch" aria-hidden="true"></span>
387
+ <span class="toggle-tx"><strong>${e("botDefaults.autoGrantCard")}</strong>
388
+ <small>${e("botDefaults.autoGrantCardHelp")}</small></span>
389
+ </label>
390
+ <label class="toggle-row">
391
+ <input type="checkbox" data-action="toggle-restrict-grant" ${a?"checked":""}>
392
+ <span class="switch" aria-hidden="true"></span>
393
+ <span class="toggle-tx"><strong>${e("botDefaults.restrictGrant")}</strong>
394
+ <small>${e("botDefaults.restrictGrantHelp")}</small></span>
395
+ </label>
396
+ <div class="bd-row bd-quota">
397
+ <label>
398
+ <span>${e("botDefaults.quotaDefault")}</span>
399
+ <input type="number" min="1" step="1" data-input="quotaLimit"
400
+ placeholder="${d(e("botDefaults.quotaPlaceholder"))}"
401
+ value="${f??""}">
402
+ </label>
403
+ <small data-quota-state>${d(be(f))}</small>
404
+ <small class="bd-help">${e("botDefaults.quotaHelp")}</small>
405
+ <div class="actions">
406
+ <button type="button" class="primary" data-action="save-quota">${e("botDefaults.quotaSave")}</button>
407
+ <button type="button" data-action="off-quota">${e("botDefaults.quotaOff")}</button>
408
+ <span class="oncall-status" data-grant-status></span>
409
+ </div>
410
+ </div>
411
+ </section>`}function aa(t){let a=t.autoStartOnGroupJoin===!0,p=t.autoStartOnNewTopic===!0,f=typeof t.autoStartOnGroupJoinPrompt=="string"?t.autoStartOnGroupJoinPrompt:"";return`<div class="bd-subsection">
412
+ <h4 class="bd-subsection-title">${e("botDefaults.sectionAutoStart")}</h4>
413
+ <label class="toggle-row">
414
+ <input type="checkbox" data-action="toggle-auto-join" ${a?"checked":""}>
415
+ <span class="switch" aria-hidden="true"></span>
416
+ <span class="toggle-tx"><strong>${e("botDefaults.autoStartJoin")}</strong>
417
+ <small>${e("botDefaults.autoStartJoinHelp")}</small></span>
418
+ </label>
419
+ <div class="bd-row">
420
+ <label>
421
+ <span>${e("botDefaults.autoStartJoinPrompt")}</span>
422
+ <textarea data-input="autoJoinPrompt" rows="3"
423
+ placeholder="${d(e("botDefaults.autoStartJoinPromptPlaceholder"))}">${d(f)}</textarea>
424
+ </label>
425
+ <div class="actions">
426
+ <button type="button" class="primary" data-action="save-auto-join-prompt">${e("botDefaults.autoStartJoinPromptSave")}</button>
427
+ </div>
428
+ </div>
429
+ <label class="toggle-row">
430
+ <input type="checkbox" data-action="toggle-auto-topic" ${p?"checked":""}>
431
+ <span class="switch" aria-hidden="true"></span>
432
+ <span class="toggle-tx"><strong>${e("botDefaults.autoStartTopic")}</strong>
433
+ <small>${e("botDefaults.autoStartTopicHelp")}</small></span>
434
+ </label>
435
+ <div class="actions">
436
+ <span class="oncall-status" data-auto-start-status></span>
437
+ </div>
438
+ </div>`}function me(t){return r.querySelector(`.bd-card[data-appid="${CSS.escape(t)}"]`)}function Ut(t,a){let p=t?.querySelector("[data-profile-role-list]");p&&(p.innerHTML=M(a),sa(t,a))}async function na(t,a){let p=dt.get(t);if(p?.loaded||p?.loading){Ut(a,t);return}p={loaded:!1,loading:!0,items:[]},dt.set(t,p),Ut(a,t);try{let f=await fetch("/api/role-profiles"),m=await f.json().catch(()=>({}));if(!f.ok)throw new Error(m?.error??String(f.status));let D=Array.isArray(m.profiles)?m.profiles:[];p.items=D.filter(W=>(W.botEntries??[]).some(J=>J?.larkAppId===t&&J?.hasEntry)).map(W=>({profileId:String(W.profileId)})),p.loaded=!0}catch(f){p.error=f?.message??String(f),p.loaded=!0}finally{p.loading=!1,Ut(me(t),t)}}function sa(t,a){t.querySelectorAll("details.bd-profile-role-entry[data-profile-id]").forEach(p=>{p.addEventListener("toggle",()=>{if(!p.open)return;let f=p.dataset.profileId;f&&oa(a,f)})})}async function oa(t,a){let f=dt.get(t)?.items.find(m=>m.profileId===a);if(!(!f||f.loaded||f.loading)){f.loading=!0,ge(t,a);try{let m=await fetch(`/api/role-profiles/${encodeURIComponent(a)}/${encodeURIComponent(t)}`),D=await m.json().catch(()=>({}));if(!m.ok)throw new Error(D?.error??String(m.status));f.content=D?.hasEntry?String(D.content??""):"",f.loaded=!0}catch(m){f.error=m?.message??String(m)}finally{f.loading=!1,ge(t,a)}}}function ge(t,a){let f=dt.get(t)?.items.find(D=>D.profileId===a);if(!f)return;let m=me(t)?.querySelector(`[data-profile-role-body="${CSS.escape(a)}"]`);m&&(m.innerHTML=yt(f))}function la(){r.querySelectorAll(".bd-card").forEach(t=>{let a=t.dataset.appid;na(a,t);let p=t.querySelector("select[data-input=workingDirMode]"),f=t.querySelector("input[data-input=workingDir]"),m=t.querySelector("[data-wd-dir-row]"),D=t.querySelector("[data-wd-worktree-row]"),W=t.querySelector("input[data-input=autoWorktree]"),J=t.querySelector("button[data-action=save-working-dir]"),k=t.querySelector("[data-status]");if(!p||!f||!J||!k)return;let H=t.querySelector("select[data-input=agentCliId]"),E=t.querySelector("input[data-input=agentModel]"),ht=t.querySelector("button[data-action=save-agent]"),F=t.querySelector("[data-agent-status]");function ye(){if(!H||!E)return;let n=t.querySelector(`#agent-model-suggestions-${CSS.escape(a)}`),o=Wt(H.value),s=o?.gateway==="ttadk",c=s&&o.acceptsModel!==!1;if(s&&!c){n&&(n.innerHTML=""),E.value="",E.disabled=!0,E.placeholder=e("botOnboarding.modelTtadkCocoPlaceholder");return}E.disabled=!1,c?(n&&(n.innerHTML=ue.map(l=>`<option value="${d(l)}"></option>`).join("")),E.placeholder=e("botOnboarding.modelTtadkPlaceholder").replace("{model}",Gt),E.value.trim()||(E.value=Gt)):(n&&(n.innerHTML=""),E.placeholder=e("botDefaults.agentModelPlaceholder"),E.value.trim()===Gt&&(E.value=""))}H&&E&&ht&&F&&(H.addEventListener("change",ye),ht.addEventListener("click",async()=>{F.textContent="",F.className="oncall-status",ht.disabled=!0,H.disabled=!0,E.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/agent`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({cliId:H.value,model:E.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){F.textContent=`\u2713 ${e("botDefaults.agentSaved")}`,F.classList.add("hint-ok");let s=L.bots.find(c=>c.larkAppId===a);s&&(s.cliId=o.cliId,s.wrapperCli=o.wrapperCli??null,s.model=o.model??"",s.agentSelectionKey=o.selectionKey??H.value)}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{ht.disabled=!1,H.disabled=!1,E.disabled=!1,ye()}})),p.addEventListener("change",()=>{let n=p.value==="off";m&&(m.hidden=n),D&&(D.hidden=p.value!=="default"),n||f.focus()}),J.addEventListener("click",async()=>{k.textContent="",k.className="oncall-status";let n=p.value,o=f.value.trim();if(n!=="off"&&!o){k.textContent=e("botDefaults.required"),k.classList.add("hint-warn-inline");return}let s=n==="default"&&!!W?.checked;J.disabled=!0;try{let c=await fetch(`/api/bots/${encodeURIComponent(a)}/working-dir-mode`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({mode:n,workingDir:o,autoWorktree:s})}),l=await c.json().catch(()=>({}));if(c.ok&&l.ok){let b=l.resolvedPath?` \u2192 ${l.resolvedPath}`:"";k.textContent=`\u2713 ${e("botDefaults.workingDirSaved")}${b}`,k.classList.add("hint-ok");let S=L.bots.find(at=>at.larkAppId===a);S&&(l.defaultOncall&&(S.defaultOncall=l.defaultOncall),S.defaultWorkingDir=l.defaultWorkingDir??null,S.defaultWorkingDirAutoWorktree=l.defaultWorkingDirAutoWorktree===!0);let N=t.querySelector("[data-oncall-since]");N&&l.defaultOncall?.since!=null&&(N.textContent=`${e("botDefaults.lastEnabled")}: ${Ge(l.defaultOncall.since)}`)}else k.textContent=`\u2717 ${l.error??c.status}`,k.classList.add("hint-warn-inline")}catch(c){k.textContent=`\u2717 ${c?.message??c}`,k.classList.add("hint-warn-inline")}finally{J.disabled=!1}});let vt=t.querySelector("input[data-input=brandLabel]"),Ft=t.querySelector("button[data-action=save-brand]"),_t=t.querySelector("button[data-action=reset-brand]"),_=t.querySelector("[data-brand-status]"),he=t.querySelector("[data-brand-state]");async function ve(n,o){if(_){_.textContent="",_.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})}),c=await s.json().catch(()=>({}));if(s.ok&&c.ok){let l=c.brandLabel??null;_.textContent="\u2713",_.classList.add("hint-ok"),vt&&(vt.value=l??""),he&&(he.textContent=pe(l));let b=L.bots.find(S=>S.larkAppId===a);b&&(b.brandLabel=l)}else _.textContent=`\u2717 ${c.error??s.status}`,_.classList.add("hint-warn-inline")}catch(s){_.textContent=`\u2717 ${s?.message??s}`,_.classList.add("hint-warn-inline")}finally{o.disabled=!1}}}vt&&Ft&&Ft.addEventListener("click",()=>ve(vt.value,Ft)),_t&&_t.addEventListener("click",()=>ve(null,_t));let Se=t.querySelector("[data-name-row]"),$e=t.querySelector("[data-name-editor]"),Qt=t.querySelector("[data-bot-name]"),U=t.querySelector("input[data-input=botRename]"),Le=t.querySelector("button[data-action=edit-bot-name]"),st=t.querySelector("button[data-action=save-bot-name]"),ot=t.querySelector("button[data-action=cancel-bot-name]"),w=t.querySelector("[data-name-status]"),Q=t.querySelector("button[data-action=feishu-login]");function St(n){!Se||!$e||(Se.hidden=n,$e.hidden=!n,n&&U&&(U.value=Qt?.textContent??"",U.focus(),U.select()))}function ia(n,o){let c=["no_session","session_expired","no_access","unsupported_brand"].includes(n)?e(`botDefaults.renameWarn.${n}`):o||n;return e("botDefaults.renameLocalOnly",{reason:c})}async function zt(){if(!U||!w)return;let n=U.value.trim();if(!n){w.textContent=`\u2717 ${e("botDefaults.renameEmpty")}`,w.className="bd-name-status oncall-status hint-warn-inline";return}U.disabled=!0,st&&(st.disabled=!0),ot&&(ot.disabled=!0),w.className="bd-name-status oncall-status",w.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 c=typeof s.botName=="string"&&s.botName?s.botName:n,l=L.bots.find(S=>S.larkAppId===a);l&&(l.botName=c,s.mode==="feishu"?(l.larkBotName=n,l.displayName=null):l.displayName=n),Qt&&(Qt.textContent=c);let b=u.querySelector(`.bd-roster-item[data-appid="${CSS.escape(a)}"] .bd-roster-tx b`);if(b&&(b.textContent=c),St(!1),s.mode==="feishu")w.textContent=`\u2713 ${e("botDefaults.renameOkFeishu")}`,w.classList.add("hint-ok"),Q&&(Q.hidden=!0);else{w.textContent=`\u26A0 ${ia(String(s.warning??""),s.message)}`,w.classList.add("hint-warn-inline"),typeof s.message=="string"&&s.message&&(w.title=s.message);let S=s.warning==="no_session"||s.warning==="session_expired";Q&&(Q.hidden=!S)}}else w.textContent=`\u2717 ${e("botDefaults.renameFailed",{error:String(s.error??o.status)})}`,w.classList.add("hint-warn-inline")}catch(o){w.textContent=`\u2717 ${e("botDefaults.renameFailed",{error:o?.message??String(o)})}`,w.classList.add("hint-warn-inline")}finally{U.disabled=!1,st&&(st.disabled=!1),ot&&(ot.disabled=!1)}}Le&&Le.addEventListener("click",()=>{w&&(w.textContent="",w.className="bd-name-status oncall-status"),Q&&(Q.hidden=!0),St(!0)}),Q&&Q.addEventListener("click",()=>{ma(()=>{Q.hidden=!0,zt()})}),ot&&ot.addEventListener("click",()=>St(!1)),st&&st.addEventListener("click",()=>{zt()}),U&&U.addEventListener("keydown",n=>{n.key==="Enter"?(n.preventDefault(),zt()):n.key==="Escape"&&St(!1)});let lt=t.querySelector("input[data-action=toggle-disable-streaming]"),Y=t.querySelector("input[data-action=toggle-silent-reactions]"),tt=t.querySelector("input[data-action=toggle-writable-link]"),$t=t.querySelector("input[data-action=toggle-private-card]"),ra=t.querySelector("[data-card-pref-status]"),ke=t.querySelector("[data-card-pref-moot]");async function O(n,o,s=ra){if(s){s.textContent="",s.className="oncall-status",o.disabled=!0;try{let c=await fetch(`/api/bots/${encodeURIComponent(a)}/card-prefs`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(n)}),l=await c.json().catch(()=>({}));if(c.ok&&l.ok){s.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,s.classList.add("hint-ok");let b=L.bots.find(S=>S.larkAppId===a);b&&(b.disableStreamingCard=l.disableStreamingCard,b.silentTurnReactions=l.silentTurnReactions,b.writableTerminalLinkInCard=l.writableTerminalLinkInCard,b.privateCard=l.privateCard,b.botToBotSameDir=l.botToBotSameDir,b.autoStartOnGroupJoin=l.autoStartOnGroupJoin,b.autoStartOnGroupJoinPrompt=l.autoStartOnGroupJoinPrompt,b.autoStartOnNewTopic=l.autoStartOnNewTopic,b.regularGroupReplyMode=l.regularGroupReplyMode,b.regularGroupMentionMode=l.regularGroupMentionMode,b.docSubscribeDefaultMode=l.docSubscribeDefaultMode)}else s.textContent=`\u2717 ${l.error??c.status}`,s.classList.add("hint-warn-inline")}catch(c){s.textContent=`\u2717 ${c?.message??c}`,s.classList.add("hint-warn-inline")}finally{o===tt?o.disabled=!!lt?.checked:o===Y?o.disabled=!lt?.checked:o.disabled=!1}}}lt&&lt.addEventListener("change",()=>{let n=lt.checked;tt&&(tt.disabled=n),Y&&(Y.disabled=!n),ke&&(ke.hidden=!n),O({disableStreamingCard:n},lt)}),Y&&Y.addEventListener("change",()=>{O({silentTurnReactions:Y.checked},Y)}),tt&&tt.addEventListener("change",()=>{O({writableTerminalLinkInCard:tt.checked},tt)}),$t&&$t.addEventListener("change",()=>{O({privateCard:$t.checked},$t)});let Lt=t.querySelector("input[data-action=toggle-cross-bot-samedir]"),ca=t.querySelector("[data-crossbot-status]");Lt&&Lt.addEventListener("change",()=>{O({botToBotSameDir:Lt.checked},Lt,ca)});let Kt=t.querySelector("input[data-input=summaryLimit]"),Vt=t.querySelector("input[data-input=summarySinceHours]"),kt=t.querySelector("button[data-action=save-summary-trigger]"),G=t.querySelector("[data-summary-trigger-status]");function De(n,o){let s=n.value.trim();return s===""?o:/^(0|[1-9]\d*)$/.test(s)?Number(s):null}Kt&&Vt&&kt&&kt.addEventListener("click",async()=>{if(!G)return;G.textContent="",G.className="oncall-status";let n=De(Kt,50),o=De(Vt,24);if(n==null||o==null){G.textContent=`\u2717 ${e("botDefaults.summaryNumberInvalid")}`,G.classList.add("hint-warn-inline");return}kt.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})}),c=await s.json().catch(()=>({}));if(s.ok&&c.ok){G.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,G.classList.add("hint-ok");let l=c.summaryRange??{limit:n,sinceHours:o};Kt.value=String(Number.isInteger(l.limit)&&l.limit>=0?l.limit:n),Vt.value=String(Number.isInteger(l.sinceHours)&&l.sinceHours>=0?l.sinceHours:o);let b=L.bots.find(S=>S.larkAppId===a);b&&(b.summaryRange=l)}else G.textContent=`\u2717 ${c.error??s.status}`,G.classList.add("hint-warn-inline")}catch(s){G.textContent=`\u2717 ${s?.message??s}`,G.classList.add("hint-warn-inline")}finally{kt.disabled=!1}});let et=t.querySelector("input[data-action=toggle-sandbox]"),P=t.querySelector("[data-sandbox-status]");et&&et.addEventListener("change",async()=>{let n=et.checked;P&&(P.textContent="",P.className="oncall-status"),et.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){P&&(P.textContent=`\u2713 ${e("botDefaults.sandboxSaved")}`,P.classList.add("hint-ok"));let c=L.bots.find(l=>l.larkAppId===a);c&&(c.sandbox=s.sandbox===!0)}else P&&(P.textContent=`\u2717 ${s.error??o.status}`,P.classList.add("hint-warn-inline")),et.checked=!n}catch(o){P&&(P.textContent=`\u2717 ${o?.message??o}`,P.classList.add("hint-warn-inline")),et.checked=!n}finally{et.disabled=!1}});let Dt=t.querySelector("input[data-action=toggle-auto-join]"),Mt=t.querySelector("input[data-action=toggle-auto-topic]"),Me=t.querySelector("textarea[data-input=autoJoinPrompt]"),Zt=t.querySelector("button[data-action=save-auto-join-prompt]"),Xt=t.querySelector("[data-auto-start-status]");Dt&&Dt.addEventListener("change",()=>{O({autoStartOnGroupJoin:Dt.checked},Dt,Xt)}),Mt&&Mt.addEventListener("change",()=>{O({autoStartOnNewTopic:Mt.checked},Mt,Xt)}),Me&&Zt&&Zt.addEventListener("click",()=>{O({autoStartOnGroupJoinPrompt:Me.value},Zt,Xt)});let pt=t.querySelector("select[data-input=p2pMode]"),z=t.querySelector("[data-p2p-status]");pt&&z&&pt.addEventListener("change",async()=>{let n=pt.value==="chat"?"chat":"thread";z.textContent="",z.className="oncall-status",pt.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){z.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,z.classList.add("hint-ok");let c=L.bots.find(l=>l.larkAppId===a);c&&(c.p2pMode=s.p2pMode==="chat"?"chat":"thread")}else z.textContent=`\u2717 ${s.error??o.status}`,z.classList.add("hint-warn-inline")}catch(o){z.textContent=`\u2717 ${o?.message??o}`,z.classList.add("hint-warn-inline")}finally{pt.disabled=!1}});let ft=t.querySelector("select[data-input=skillInjection]"),K=t.querySelector("[data-skill-injection-status]");ft&&K&&ft.addEventListener("change",async()=>{let n=ft.value;K.textContent="",K.className="oncall-status",ft.disabled=!0;try{let o=await fetch(`/api/bots/${encodeURIComponent(a)}/skill-injection`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({skillInjection:n})}),s=await o.json().catch(()=>({}));if(o.ok&&s.ok){K.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,K.classList.add("hint-ok");let c=L.bots.find(l=>l.larkAppId===a);c&&(c.skillInjection=s.skillInjection??null)}else K.textContent=`\u2717 ${s.error??o.status}`,K.classList.add("hint-warn-inline")}catch(o){K.textContent=`\u2717 ${o?.message??o}`,K.classList.add("hint-warn-inline")}finally{ft.disabled=!1}});let wt=t.querySelector("select[data-input=regularGroupMode]"),da=t.querySelector("[data-regular-group-status]");wt&&wt.addEventListener("change",()=>{O({regularGroupReplyMode:wt.value},wt,da)});let xt=t.querySelector("select[data-input=regularGroupMentionMode]"),ua=t.querySelector("[data-mention-mode-status]");xt&&xt.addEventListener("change",()=>{O({regularGroupMentionMode:xt.value},xt,ua)});let Tt=t.querySelector("select[data-input=docSubscribeDefaultMode]"),pa=t.querySelector("[data-doc-subscribe-mode-status]");Tt&&Tt.addEventListener("change",()=>{O({docSubscribeDefaultMode:Tt.value},Tt,pa)});let Et=t.querySelector("input[data-action=toggle-substitute-mode]"),Ct=t.querySelector("select[data-input=substituteDisclosure]"),Ht=t.querySelector("textarea[data-input=substituteTargets]"),Yt=t.querySelector("button[data-action=save-substitute-mode]"),te=t.querySelector("button[data-action=off-substitute-mode]"),R=t.querySelector("[data-substitute-status]"),we=t.querySelector("[data-substitute-chips]");async function xe(n,o){if(R){R.textContent=e("botDefaults.substituteResolving"),R.className="oncall-status",o.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/substitute-mode`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(n)}),c=await s.json().catch(()=>({}));if(we&&(we.innerHTML=ha(c.resolution)),s.ok&&c.ok){R.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,R.classList.add("hint-ok");let l=L.bots.find(b=>b.larkAppId===a);l&&(l.substituteMode=c.substituteMode??null),Et&&(Et.checked=!!c.substituteMode?.enabled),Ct&&(Ct.value=c.substituteMode?.disclosure==="none"?"none":"prefix"),Ht&&(Ht.value=va(c.resolution))}else{let l=c.error==="targets_required"?e("botDefaults.substituteTargetsRequired"):c.error??s.status;R.textContent=`\u2717 ${l}`,R.classList.add("hint-warn-inline")}}catch(s){R.textContent=`\u2717 ${s?.message??s}`,R.classList.add("hint-warn-inline")}finally{o.disabled=!1}}}Yt&&Ht&&Ct&&Et&&Yt.addEventListener("click",()=>{if(!R)return;let{targets:n,invalid:o}=Re(Ht.value);if(o.length){R.textContent=`\u2717 ${e("botDefaults.substituteTargetsInvalid")}: ${o.join("; ")}`,R.className="oncall-status hint-warn-inline";return}xe({enabled:Et.checked,targets:n,disclosure:Ct.value==="none"?"none":"prefix"},Yt)}),te&&te.addEventListener("click",()=>{xe({enabled:!1,targets:[]},te)});let ee=t.querySelector("textarea[data-input=teamRole]"),bt=t.querySelector("button[data-action=save-role]"),mt=t.querySelector("button[data-action=delete-role]"),I=t.querySelector("[data-role-status]");if(ee&&bt&&mt&&I){let s=function(l){let b=r.querySelector(`.bd-card[data-appid="${CSS.escape(a)}"]`);if(!b)return;let S=b.querySelector("textarea[data-input=teamRole]"),N=b.querySelector("button[data-action=save-role]"),at=b.querySelector("button[data-action=delete-role]");S&&(S.value=l,S.disabled=!1),N&&(N.disabled=!1),at&&(at.disabled=!1)};var ka=s;let n=`/api/team/local-bots/${encodeURIComponent(a)}/role`,o=L.bots.find(l=>l.larkAppId===a);o&&typeof o.teamRole!="string"&&!o.teamRoleLoading&&(o.teamRoleLoading=!0,(async()=>{try{let l=await fetch(n),b=await l.json().catch(()=>({}));l.ok&&b.ok?(o.teamRole=b.role??"",s(o.teamRole)):(I.textContent=`\u2717 ${e("botDefaults.roleLoadErr")}: ${b.error??l.status}`,I.classList.add("hint-warn-inline"))}catch(l){I.textContent=`\u2717 ${e("botDefaults.roleLoadErr")}: ${l?.message??l}`,I.classList.add("hint-warn-inline")}finally{o.teamRoleLoading=!1}})());async function c(l,b,S){if(I&&!(!o||typeof o.teamRole!="string")){I.textContent="",I.className="oncall-status",bt.disabled=!0,mt.disabled=!0;try{let N=await fetch(n,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({role:l})}),at=await N.json().catch(()=>({}));N.ok&&at.ok?(o&&(o.teamRole=l.trim()),I.textContent=`\u2713 ${S?e("botDefaults.roleDeleted"):e("botDefaults.roleSaved")}`,I.classList.add("hint-ok")):(I.textContent=`\u2717 ${at.error??N.status}`,I.classList.add("hint-warn-inline"))}catch(N){I.textContent=`\u2717 ${N?.message??N}`,I.classList.add("hint-warn-inline")}finally{bt.disabled=!1,mt.disabled=!1}}}bt.addEventListener("click",()=>c(ee.value,bt,!1)),mt.addEventListener("click",()=>{ee.value="",c("",mt,!0)})}let It=t.querySelector("input[data-action=toggle-auto-grant-card]"),qt=t.querySelector("input[data-action=toggle-restrict-grant]"),it=t.querySelector("input[data-input=quotaLimit]"),Pt=t.querySelector("button[data-action=save-quota]"),ae=t.querySelector("button[data-action=off-quota]"),A=t.querySelector("[data-grant-status]"),Te=t.querySelector("[data-quota-state]");async function gt(n,o){if(A){A.textContent="",A.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)}),c=await s.json().catch(()=>({}));if(s.ok&&c.ok){A.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,A.classList.add("hint-ok");let l=typeof c.messageQuotaDefaultLimit=="number"?c.messageQuotaDefaultLimit:null,b=L.bots.find(S=>S.larkAppId===a);b&&(b.autoGrantRequestCards=c.autoGrantRequestCards!==!1,b.restrictGrantCommands=c.restrictGrantCommands===!0,b.messageQuotaDefaultLimit=l),Te&&(Te.textContent=be(l)),it&&"messageQuotaDefaultLimit"in n&&(it.value=l==null?"":String(l))}else A.textContent=`\u2717 ${c.error??s.status}`,A.classList.add("hint-warn-inline")}catch(s){A.textContent=`\u2717 ${s?.message??s}`,A.classList.add("hint-warn-inline")}finally{o.disabled=!1}}}It&&It.addEventListener("change",()=>{gt({autoGrantRequestCards:It.checked},It)}),qt&&qt.addEventListener("change",()=>{gt({restrictGrantCommands:qt.checked},qt)}),it&&Pt&&Pt.addEventListener("click",()=>{let n=it.value.trim();if(n===""){gt({messageQuotaDefaultLimit:null},Pt);return}if(!/^[1-9]\d*$/.test(n)){A&&(A.textContent=`\u2717 ${e("botDefaults.quotaInvalid")}`,A.className="oncall-status hint-warn-inline");return}gt({messageQuotaDefaultLimit:Number(n)},Pt)}),it&&ae&&ae.addEventListener("click",()=>{it.value="",gt({messageQuotaDefaultLimit:null},ae)});let rt=t.querySelector("input[data-input=maxLiveWorkers]"),Rt=t.querySelector("button[data-action=save-session-cap]"),ne=t.querySelector("button[data-action=off-session-cap]"),j=t.querySelector("[data-session-cap-status]"),Ee=t.querySelector("[data-session-cap-state]");async function se(n,o){if(j){j.textContent="",j.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})}),c=await s.json().catch(()=>({}));if(s.ok&&c.ok){j.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,j.classList.add("hint-ok");let l=typeof c.maxLiveWorkers=="number"?c.maxLiveWorkers:null,b=L.bots.find(S=>S.larkAppId===a);b&&(b.maxLiveWorkers=l),Ee&&(Ee.textContent=fe(l)),rt&&(rt.value=l==null?"":String(l))}else j.textContent=`\u2717 ${c.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}}}rt&&Rt&&Rt.addEventListener("click",()=>{let n=rt.value.trim();if(n===""){se(null,Rt);return}if(!/^[1-9]\d*$/.test(n)){j&&(j.textContent=`\u2717 ${e("botDefaults.maxLiveWorkersInvalid")}`,j.className="oncall-status hint-warn-inline");return}se(Number(n),Rt)}),rt&&ne&&ne.addEventListener("click",()=>{rt.value="",se(null,ne)});let oe=t.querySelector("textarea[data-input=startupCommands]"),At=t.querySelector("button[data-action=save-startup-commands]"),V=t.querySelector("[data-startup-commands-status]");oe&&At&&At.addEventListener("click",async()=>{if(V){V.textContent="",V.className="oncall-status",At.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/startup-commands`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({startupCommands:oe.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){V.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,V.classList.add("hint-ok");let s=typeof o.startupCommands=="string"?o.startupCommands:"";oe.value=s;let c=L.bots.find(l=>l.larkAppId===a);c&&(c.startupCommands=s)}else V.textContent=`\u2717 ${o.error??n.status}`,V.classList.add("hint-warn-inline")}catch(n){V.textContent=`\u2717 ${n?.message??n}`,V.classList.add("hint-warn-inline")}finally{At.disabled=!1}}});let le=t.querySelector("input[data-input=launchShell]"),jt=t.querySelector("button[data-action=save-launch-shell]"),Z=t.querySelector("[data-launch-shell-status]");le&&jt&&jt.addEventListener("click",async()=>{if(Z){Z.textContent="",Z.className="oncall-status",jt.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/launch-shell`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({launchShell:le.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){Z.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,Z.classList.add("hint-ok");let s=typeof o.launchShell=="string"?o.launchShell:"";le.value=s;let c=L.bots.find(l=>l.larkAppId===a);c&&(c.launchShell=s)}else Z.textContent=`\u2717 ${o.error??n.status}`,Z.classList.add("hint-warn-inline")}catch(n){Z.textContent=`\u2717 ${n?.message??n}`,Z.classList.add("hint-warn-inline")}finally{jt.disabled=!1}}});let ie=t.querySelector("textarea[data-input=env]"),Nt=t.querySelector("button[data-action=save-env]"),X=t.querySelector("[data-env-status]");ie&&Nt&&Nt.addEventListener("click",async()=>{if(X){X.textContent="",X.className="oncall-status",Nt.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/env`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({env:ie.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){X.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,X.classList.add("hint-ok");let s=typeof o.env=="string"?o.env:"";ie.value=s;let c=L.bots.find(l=>l.larkAppId===a);c&&(c.env=s)}else X.textContent=`\u2717 ${o.error??n.status}`,X.classList.add("hint-warn-inline")}catch(n){X.textContent=`\u2717 ${n?.message??n}`,X.classList.add("hint-warn-inline")}finally{Nt.disabled=!1}}})})}function nt(){!$&&x&&T()}return y.addEventListener("input",nt),()=>{$=!0,g.onclick=null,y.removeEventListener("input",nt),r.removeEventListener("click",h),u.replaceChildren(),r.replaceChildren()}}var C=re(qe(),1);function La(){let i=Pe(),r=(0,Jt.useRef)(null);return(0,Jt.useEffect)(()=>{if(r.current)return Je(r.current)},[]),(0,C.jsxs)("section",{className:"page",ref:r,children:[(0,C.jsx)("div",{className:"page-heading",children:(0,C.jsxs)("div",{children:[(0,C.jsx)("p",{className:"eyebrow",children:i("nav.botDefaults")}),(0,C.jsx)("h1",{children:i("botDefaults.title")}),(0,C.jsx)("p",{children:i("botDefaults.subtitle")})]})}),(0,C.jsxs)("form",{id:"bd-filters",className:"filters sessions-filters",children:[(0,C.jsx)("input",{type:"search",name:"q",placeholder:i("botDefaults.search")}),(0,C.jsx)("button",{type:"button",id:"bd-refresh",children:i("botDefaults.refresh")})]}),(0,C.jsxs)("div",{className:"bd-layout",children:[(0,C.jsx)("aside",{id:"bd-roster",className:"bd-roster"}),(0,C.jsx)("div",{id:"bd-list",className:"bd-detail"})]})]})}function Ia(i){return Ie(i,(0,C.jsx)(La,{}))}export{Ia as renderBotDefaultsPage};
@@ -0,0 +1 @@
1
+ var s="botmux.dashboard.monitorRoom.sessions.v1",u="botmux.dashboard.monitorRoom.autoActiveWhenEmpty.v1";function r(){return typeof window>"u"?null:window.localStorage}function l(t){return typeof t=="string"?t.trim():""}function c(t=r()){if(!t)return[];try{let o=t.getItem(s),n=o?JSON.parse(o):[],e=Array.isArray(n)?n.map(l).filter(Boolean):[];return[...new Set(e)]}catch{return[]}}function a(t,o=r()){let n=[...new Set(t.map(l).filter(Boolean))];if(!o)return n;try{n.length?o.setItem(s,JSON.stringify(n)):o.removeItem(s)}catch{}return n}function g(t,o=r()){let n=c(o),e=new Set(n),i=a([...n,...t],o),m=i.filter(f=>!e.has(f)).length;return{ids:i,added:m,total:i.length}}function p(t,o=r()){let n=l(t);return a(c(o).filter(e=>e!==n),o)}function S(t=r()){a([],t)}function I(t=r()){if(!t)return!1;try{return t.getItem(u)==="1"}catch{return!1}}function x(t,o=r()){if(!o)return t;try{t?o.setItem(u,"1"):o.removeItem(u)}catch{}return t}function w(t=window.location){let o=new URL(t.href);return o.hash="#/monitor-room",o.toString()}function d(){return typeof window>"u"?null:window.location}function h(t,o=d()){if(!t?.webPort||!o)return null;if(o.protocol==="https:")return t.proxyPort?`${o.origin}/s/${encodeURIComponent(t.sessionId)}`:null;let n=t.proxyPort??t.webPort,e=t.proxyPort?`/s/${encodeURIComponent(t.sessionId)}`:"";return`http://${o.hostname}:${n}${e}`}export{c as a,g as b,p as c,S as d,I as e,x as f,w as g,h};