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
@@ -1,2 +1,2 @@
1
- import{b as S}from"./chunk-VFCACTRF.js";import{a as J}from"./chunk-LXIK7OUJ.js";import"./chunk-BNEXMNQD.js";import{a as he,b as G,c as Y}from"./chunk-JTSE5VP6.js";import{c as V}from"./chunk-7SZRL6FY.js";var o=V(he(),1);var e=V(Y(),1),pe=["Asia/Shanghai","Asia/Hong_Kong","Asia/Tokyo","Asia/Singapore","Asia/Kolkata","UTC","Europe/London","Europe/Paris","Europe/Moscow","America/Los_Angeles","America/New_York","America/Sao_Paulo","Australia/Sydney"];function X(t){return{publicReadOnly:t?.publicReadOnly===!0,openTerminalInFeishu:t?.openTerminalInFeishu===!0,chatBotDiscovery:t?.chatBotDiscovery!==!1,vcMeetingAgent:{enabled:t?.vcMeetingAgent?.enabled!==!1,listenerBotAppId:typeof t?.vcMeetingAgent?.listenerBotAppId=="string"?t.vcMeetingAgent.listenerBotAppId:null,listenerBotOptions:Array.isArray(t?.vcMeetingAgent?.listenerBotOptions)?t.vcMeetingAgent.listenerBotOptions:[],larkCliVersion:t?.vcMeetingAgent?.larkCliVersion===void 0?void 0:t.vcMeetingAgent.larkCliVersion??null,larkCliMeetsRequirement:t?.vcMeetingAgent?.larkCliMeetsRequirement===!0,larkCliMinVersion:typeof t?.vcMeetingAgent?.larkCliMinVersion=="string"?t.vcMeetingAgent.larkCliMinVersion:void 0},repoPickerMode:t?.repoPickerMode==="repos"?"repos":"all",maintenance:t?.maintenance&&typeof t.maintenance=="object"?t.maintenance:{},localDevInstall:t?.localDevInstall===!0,whiteboard:{enabled:t?.whiteboard?.enabled===!0},remoteAccess:t?.remoteAccess===!0,scheduleTimeZone:typeof t?.scheduleTimeZone=="string"?t.scheduleTimeZone:"",hostTimeZone:typeof t?.hostTimeZone=="string"&&t.hostTimeZone?t.hostTimeZone:"UTC",effectiveScheduleTimeZone:typeof t?.effectiveScheduleTimeZone=="string"&&t.effectiveScheduleTimeZone?t.effectiveScheduleTimeZone:typeof t?.scheduleTimeZone=="string"&&t.scheduleTimeZone?t.scheduleTimeZone:typeof t?.hostTimeZone=="string"&&t.hostTimeZone?t.hostTimeZone:"UTC"}}function me(t,n){let a=t?.[n]??{};return{enabled:a.enabled===!0,time:typeof a.time=="string"?a.time:"04:00"}}function ee(t,n){return n(t==="npm-global"?"update.kindNpm":t==="source-checkout"?"update.kindSource":"update.kindUnknown")}function ve(){let t=S(),n=(0,o.useRef)(!1),a=(0,o.useRef)(new Set),[r,p]=(0,o.useState)(null),[c,g]=(0,o.useState)(!1),[R,v]=(0,o.useState)(null),[b,U]=(0,o.useState)(!0),[x,T]=(0,o.useState)(!1),[i,l]=(0,o.useState)(null),[u,C]=(0,o.useState)(null),[B,O]=(0,o.useState)(null),[F,L]=(0,o.useState)(null),[te,I]=(0,o.useState)(null),[$,N]=(0,o.useState)(null),[q,Z]=(0,o.useState)(!1),[ne,P]=(0,o.useState)(!0),[ae,W]=(0,o.useState)(!1),[ie,se]=(0,o.useState)(""),[oe,k]=(0,o.useState)(!1),[le,f]=(0,o.useState)(null),j=(0,o.useCallback)(()=>{for(let s of a.current)window.clearTimeout(s);a.current.clear()},[]),E=(0,o.useCallback)((s,d)=>{let h=window.setTimeout(()=>{a.current.delete(h),s()},d);return a.current.add(h),h},[]),D=(0,o.useCallback)(async()=>{try{let s=await fetch("/api/update/status"),d=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){L(null),I(d?.error??`HTTP ${s.status}`);return}L(d),I(null)}catch(s){if(!n.current)return;L(null),I(s instanceof Error?s.message:String(s))}},[]),Q=(0,o.useCallback)(async()=>{try{let s=await fetch("/api/settings"),d=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){p(null),v(d?.error??`HTTP ${s.status}`),g(!0);return}p(X(d.settings)),U(d.authed===!0),T(d.bound===!0),v(null),g(!0)}catch(s){if(!n.current)return;p(null),v(s instanceof Error?s.message:String(s)),g(!0)}},[]);(0,o.useEffect)(()=>(n.current=!0,Q(),()=>{n.current=!1,j()}),[j,Q]),(0,o.useEffect)(()=>{c&&(k(!1),f(null),Z(!1),b&&D())},[b,D,c]);async function re(s,d,h){if(!r)return;let m=r;p(h(r)),l(s),C({text:t("settings.saving")});try{let y=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(d)}),A=await y.json().catch(()=>({}));if(!n.current)return;if(!y.ok||A.ok===!1)throw A?.feishuLoginQr&&typeof A.feishuLoginQr=="string"&&O(A.feishuLoginQr),new Error(A?.error??`HTTP ${y.status}`);O(null);let K=X(A.settings);p(K),J.setScheduleTimeZone(K.effectiveScheduleTimeZone),C({text:t("settings.saved"),cls:"hint-ok"}),E(()=>C(z=>z?.cls==="hint-ok"?null:z),2400)}catch(y){if(!n.current)return;p(m),C({text:`${t("settings.saveFailed")}: ${y instanceof Error?y.message:String(y)}`,cls:"hint-warn-inline"})}finally{n.current&&l(null)}}async function ce(){N(null),P(!0),W(!1);try{let s=await fetch("/api/update/changelog"),d=await s.json().catch(()=>({}));if(!n.current)return;se(typeof d?.releasesUrl=="string"?d.releasesUrl:""),s.ok?(N(Array.isArray(d.releases)?d.releases:[]),P(d.ok!==!1),W(d.rateLimited===!0)):(N([]),P(!1))}catch{if(!n.current)return;N([]),P(!1)}}function de(){let s=Date.now(),d=async()=>{if(n.current){if(Date.now()-s>9e4){k(!1),f({text:t("update.restartSlow"),cls:"hint-warn-inline"});return}try{let h=await fetch("/__health",{cache:"no-store"});if(!n.current)return;if(h.ok){location.reload();return}}catch{}n.current&&E(()=>{d()},2e3)}};E(()=>{d()},3e3)}async function _(s){k(!0),f({text:t("update.restarting")});try{if(await fetch("/api/update/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s?{update:s}:{})}),!n.current)return}catch(d){if(!n.current)return;k(!1),f({text:t("update.restartFailed",{detail:d instanceof Error?d.message:String(d)}),cls:"hint-warn-inline"});return}de()}async function ue(){let s=F;if(!s)return;if(!s.node.ok){window.alert(t("update.nodeTooOldAlert",{version:s.node.version,required:s.node.required}));return}if(s.installs.multiple){let h=s.installs.entries.map(m=>`\u2022 ${m.binPath} (${ee(m.kind,t)})`).join(`
1
+ import{b as S}from"./chunk-PE6W3C2C.js";import{a as J}from"./chunk-LXIK7OUJ.js";import"./chunk-3UJYRR2Q.js";import{a as he,b as G,c as Y}from"./chunk-JTSE5VP6.js";import{c as V}from"./chunk-7SZRL6FY.js";var o=V(he(),1);var e=V(Y(),1),pe=["Asia/Shanghai","Asia/Hong_Kong","Asia/Tokyo","Asia/Singapore","Asia/Kolkata","UTC","Europe/London","Europe/Paris","Europe/Moscow","America/Los_Angeles","America/New_York","America/Sao_Paulo","Australia/Sydney"];function X(t){return{publicReadOnly:t?.publicReadOnly===!0,openTerminalInFeishu:t?.openTerminalInFeishu===!0,chatBotDiscovery:t?.chatBotDiscovery!==!1,vcMeetingAgent:{enabled:t?.vcMeetingAgent?.enabled!==!1,listenerBotAppId:typeof t?.vcMeetingAgent?.listenerBotAppId=="string"?t.vcMeetingAgent.listenerBotAppId:null,listenerBotOptions:Array.isArray(t?.vcMeetingAgent?.listenerBotOptions)?t.vcMeetingAgent.listenerBotOptions:[],larkCliVersion:t?.vcMeetingAgent?.larkCliVersion===void 0?void 0:t.vcMeetingAgent.larkCliVersion??null,larkCliMeetsRequirement:t?.vcMeetingAgent?.larkCliMeetsRequirement===!0,larkCliMinVersion:typeof t?.vcMeetingAgent?.larkCliMinVersion=="string"?t.vcMeetingAgent.larkCliMinVersion:void 0},repoPickerMode:t?.repoPickerMode==="repos"?"repos":"all",maintenance:t?.maintenance&&typeof t.maintenance=="object"?t.maintenance:{},localDevInstall:t?.localDevInstall===!0,whiteboard:{enabled:t?.whiteboard?.enabled===!0},remoteAccess:t?.remoteAccess===!0,scheduleTimeZone:typeof t?.scheduleTimeZone=="string"?t.scheduleTimeZone:"",hostTimeZone:typeof t?.hostTimeZone=="string"&&t.hostTimeZone?t.hostTimeZone:"UTC",effectiveScheduleTimeZone:typeof t?.effectiveScheduleTimeZone=="string"&&t.effectiveScheduleTimeZone?t.effectiveScheduleTimeZone:typeof t?.scheduleTimeZone=="string"&&t.scheduleTimeZone?t.scheduleTimeZone:typeof t?.hostTimeZone=="string"&&t.hostTimeZone?t.hostTimeZone:"UTC"}}function me(t,n){let a=t?.[n]??{};return{enabled:a.enabled===!0,time:typeof a.time=="string"?a.time:"04:00"}}function ee(t,n){return n(t==="npm-global"?"update.kindNpm":t==="source-checkout"?"update.kindSource":"update.kindUnknown")}function ve(){let t=S(),n=(0,o.useRef)(!1),a=(0,o.useRef)(new Set),[r,p]=(0,o.useState)(null),[c,g]=(0,o.useState)(!1),[R,v]=(0,o.useState)(null),[b,U]=(0,o.useState)(!0),[x,T]=(0,o.useState)(!1),[i,l]=(0,o.useState)(null),[u,C]=(0,o.useState)(null),[B,O]=(0,o.useState)(null),[F,L]=(0,o.useState)(null),[te,I]=(0,o.useState)(null),[$,N]=(0,o.useState)(null),[q,Z]=(0,o.useState)(!1),[ne,P]=(0,o.useState)(!0),[ae,W]=(0,o.useState)(!1),[ie,se]=(0,o.useState)(""),[oe,k]=(0,o.useState)(!1),[le,f]=(0,o.useState)(null),j=(0,o.useCallback)(()=>{for(let s of a.current)window.clearTimeout(s);a.current.clear()},[]),E=(0,o.useCallback)((s,d)=>{let h=window.setTimeout(()=>{a.current.delete(h),s()},d);return a.current.add(h),h},[]),D=(0,o.useCallback)(async()=>{try{let s=await fetch("/api/update/status"),d=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){L(null),I(d?.error??`HTTP ${s.status}`);return}L(d),I(null)}catch(s){if(!n.current)return;L(null),I(s instanceof Error?s.message:String(s))}},[]),Q=(0,o.useCallback)(async()=>{try{let s=await fetch("/api/settings"),d=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){p(null),v(d?.error??`HTTP ${s.status}`),g(!0);return}p(X(d.settings)),U(d.authed===!0),T(d.bound===!0),v(null),g(!0)}catch(s){if(!n.current)return;p(null),v(s instanceof Error?s.message:String(s)),g(!0)}},[]);(0,o.useEffect)(()=>(n.current=!0,Q(),()=>{n.current=!1,j()}),[j,Q]),(0,o.useEffect)(()=>{c&&(k(!1),f(null),Z(!1),b&&D())},[b,D,c]);async function re(s,d,h){if(!r)return;let m=r;p(h(r)),l(s),C({text:t("settings.saving")});try{let y=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(d)}),A=await y.json().catch(()=>({}));if(!n.current)return;if(!y.ok||A.ok===!1)throw A?.feishuLoginQr&&typeof A.feishuLoginQr=="string"&&O(A.feishuLoginQr),new Error(A?.error??`HTTP ${y.status}`);O(null);let K=X(A.settings);p(K),J.setScheduleTimeZone(K.effectiveScheduleTimeZone),C({text:t("settings.saved"),cls:"hint-ok"}),E(()=>C(z=>z?.cls==="hint-ok"?null:z),2400)}catch(y){if(!n.current)return;p(m),C({text:`${t("settings.saveFailed")}: ${y instanceof Error?y.message:String(y)}`,cls:"hint-warn-inline"})}finally{n.current&&l(null)}}async function ce(){N(null),P(!0),W(!1);try{let s=await fetch("/api/update/changelog"),d=await s.json().catch(()=>({}));if(!n.current)return;se(typeof d?.releasesUrl=="string"?d.releasesUrl:""),s.ok?(N(Array.isArray(d.releases)?d.releases:[]),P(d.ok!==!1),W(d.rateLimited===!0)):(N([]),P(!1))}catch{if(!n.current)return;N([]),P(!1)}}function de(){let s=Date.now(),d=async()=>{if(n.current){if(Date.now()-s>9e4){k(!1),f({text:t("update.restartSlow"),cls:"hint-warn-inline"});return}try{let h=await fetch("/__health",{cache:"no-store"});if(!n.current)return;if(h.ok){location.reload();return}}catch{}n.current&&E(()=>{d()},2e3)}};E(()=>{d()},3e3)}async function _(s){k(!0),f({text:t("update.restarting")});try{if(await fetch("/api/update/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s?{update:s}:{})}),!n.current)return}catch(d){if(!n.current)return;k(!1),f({text:t("update.restartFailed",{detail:d instanceof Error?d.message:String(d)}),cls:"hint-warn-inline"});return}de()}async function ue(){let s=F;if(!s)return;if(!s.node.ok){window.alert(t("update.nodeTooOldAlert",{version:s.node.version,required:s.node.required}));return}if(s.installs.multiple){let h=s.installs.entries.map(m=>`\u2022 ${m.binPath} (${ee(m.kind,t)})`).join(`
2
2
  `);if(!window.confirm(t("update.confirmMultiInstall",{paths:h})))return}let d=s.latest?t("update.confirmUpdate",{version:`v${s.latest}`}):t("update.confirmUpdateNoVer");if(window.confirm(d)){k(!0),f({text:t("update.updating")});try{let h=await fetch("/api/update/run",{method:"POST"}),m=await h.json().catch(()=>({}));if(!n.current)return;if(!h.ok||m.ok===!1){let y=m?.detail??m?.error??`HTTP ${h.status}`;k(!1),f({text:t("update.updateFailed",{detail:y}),cls:"hint-warn-inline"});return}m.changed?(k(!1),f({text:t("update.updatedChanged",{old:`v${m.oldVersion}`,new:`v${m.newVersion}`}),cls:"hint-ok"}),window.confirm(t("update.confirmRestart"))?await _({oldVersion:m.oldVersion,newVersion:m.newVersion}):n.current&&f({text:t("update.noRestartHint"),cls:"hint-ok"})):(k(!1),f({text:t("update.alreadyLatestRun",{version:`v${m.newVersion}`}),cls:"hint-ok"}),await D())}catch(h){if(!n.current)return;k(!1),f({text:t("update.updateFailed",{detail:h instanceof Error?h.message:String(h)}),cls:"hint-warn-inline"})}}}let ge=r?(0,e.jsx)(be,{settings:r,canWrite:b,bound:x,savingKey:i,feishuLoginQr:B,setFeishuLoginQr:O,onSave:re}):R?(0,e.jsxs)("p",{className:"hint-warn st-banner",children:[t("settings.loadFailed"),": ",R]}):(0,e.jsx)("p",{className:"empty st-banner",children:t("settings.loading")});return(0,e.jsxs)("section",{className:"page",children:[(0,e.jsx)("div",{className:"page-heading",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("nav.settings")}),(0,e.jsx)("h1",{children:t("settings.title")}),(0,e.jsx)("p",{children:t("settings.subtitle")})]})}),(0,e.jsxs)("div",{className:"settings-grid",children:[ge,(0,e.jsx)(ye,{canWrite:b,status:F,statusError:te,changelog:$,changelogOpen:q,changelogOk:ne,changelogRateLimited:ae,releasesUrl:ie,busy:oe,message:le,onCheck:()=>{L(null),N(null),Z(!1),f(null),I(null),D()},onToggleChangelog:()=>{let s=!q;Z(s),s&&$===null&&ce()},onUpdate:()=>{ue()},onRestart:()=>{window.confirm(t("update.confirmPlainRestart"))&&_(null)}})]}),u?(0,e.jsx)("div",{className:`st-status ${u.cls??""}`,"data-settings-status":!0,role:"status",children:u.text}):null]})}function fe(t){return(0,e.jsx)("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:{access:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("path",{d:"M8 1.7l5 1.9v4.1c0 3.2-2.1 5.6-5 6.6-2.9-1-5-3.4-5-6.6V3.6z"}),(0,e.jsx)("path",{d:"M5.9 8l1.5 1.5 2.7-2.8"})]}),cards:(0,e.jsx)("path",{d:"M2.2 3.2h11.6v7.4H8.3L5.1 13.2v-2.6H2.2z"}),experimental:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("path",{d:"M6.1 1.8h3.8M7 1.8v4L3.1 12.4a1.35 1.35 0 001.2 2h7.4a1.35 1.35 0 001.2-2L9 5.8v-4"}),(0,e.jsx)("path",{d:"M4.7 10.6h6.6"})]}),meeting:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("rect",{x:"1.6",y:"4.1",width:"8.9",height:"7.8",rx:"1.4"}),(0,e.jsx)("path",{d:"M10.5 7.4l3.9-2.3v5.8l-3.9-2.3"})]}),whiteboard:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("rect",{x:"1.9",y:"2.4",width:"12.2",height:"8.4",rx:"1.2"}),(0,e.jsx)("path",{d:"M4.7 8.2c1-.9 1.8-2.5 2.5-1.8.7.7-.5 2 .3 2.3.7.3 1.8-1.6 3.8-1.9"}),(0,e.jsx)("path",{d:"M5.3 13.9h5.4M8 10.8v3.1"})]}),repo:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("circle",{cx:"4.3",cy:"3.6",r:"1.7"}),(0,e.jsx)("circle",{cx:"4.3",cy:"12.4",r:"1.7"}),(0,e.jsx)("circle",{cx:"11.9",cy:"5.3",r:"1.7"}),(0,e.jsx)("path",{d:"M4.3 5.3v5.4M11.9 7c0 2.7-3.6 2.9-5.7 3.6"})]}),maintenance:(0,e.jsx)(e.Fragment,{children:(0,e.jsx)("path",{d:"M13.9 4.7a3.7 3.7 0 01-4.9 4.5l-4.4 4.4a1.6 1.6 0 01-2.2-2.2L6.8 7a3.7 3.7 0 014.5-4.9L8.9 4.5l2.6 2.6z"})}),update:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("path",{d:"M13.5 6.2A5.8 5.8 0 103 10.9"}),(0,e.jsx)("path",{d:"M13.7 2.5v3.9H9.8"}),(0,e.jsx)("path",{d:"M8 5.6v4.6M6 8.3l2 1.9 2-1.9"})]})}[t.name]})}function M(t){return(0,e.jsxs)("article",{className:"bd-card st-card","data-saving":t.saving?"":void 0,children:[(0,e.jsxs)("header",{className:"st-card-head",children:[(0,e.jsx)("span",{className:"st-chip","aria-hidden":"true",children:(0,e.jsx)(fe,{name:t.icon})}),(0,e.jsx)("h3",{children:t.title})]}),t.children]})}function H(t){let[n,a]=(0,o.useState)(!1);return(0,e.jsx)("small",{className:n?"open":void 0,onClick:r=>{r.preventDefault(),r.stopPropagation(),a(p=>!p)},children:t.text})}function be(t){let n=S(),{settings:a,canWrite:r,bound:p,savingKey:c,feishuLoginQr:g,setFeishuLoginQr:R}=t,v=!r,b=me(a.maintenance,"autoUpdate"),U=!r||a.localDevInstall,x=!r||a.maintenance.autoUpdate?.enabled!==!0,T=(i,l)=>{t.onSave(i,{[i]:l},u=>({...u,[i]:l}))};return(0,e.jsxs)(e.Fragment,{children:[r?null:(0,e.jsx)("p",{className:"hint-warn st-banner",children:n("settings.readOnlyVisitor")}),(0,e.jsxs)(M,{icon:"access",title:n("settings.sectionAccess"),saving:c==="publicReadOnly"||c==="remoteAccess",children:[(0,e.jsx)(w,{title:n("settings.publicReadOnly"),help:n("settings.publicReadOnlyHelp"),checked:a.publicReadOnly,disabled:v||c==="publicReadOnly",onChange:i=>T("publicReadOnly",i)}),p?(0,e.jsx)(w,{title:n("settings.remoteAccess"),help:n("settings.remoteAccessHelp"),checked:a.remoteAccess,disabled:v||c==="remoteAccess",onChange:i=>T("remoteAccess",i)}):null]}),(0,e.jsxs)(M,{icon:"meeting",title:n("settings.sectionVcMeetingAgent"),saving:c==="vcMeetingAgent",children:[(0,e.jsx)(w,{title:n("settings.vcMeetingAgent"),help:n("settings.vcMeetingAgentHelp"),checked:a.vcMeetingAgent.enabled,disabled:v||c==="vcMeetingAgent",onChange:i=>{t.onSave("vcMeetingAgent",{vcMeetingAgent:{enabled:i}},l=>({...l,vcMeetingAgent:{...l.vcMeetingAgent,enabled:i}}))}}),(0,e.jsxs)("label",{className:"st-field",children:[(0,e.jsx)("span",{children:n("settings.vcMeetingListenerBot")}),(0,e.jsxs)("select",{value:a.vcMeetingAgent.listenerBotAppId??"",disabled:v||c==="vcMeetingAgent",onChange:i=>{let l=i.currentTarget.value||null;t.onSave("vcMeetingAgent",{vcMeetingAgent:{listenerBotAppId:l}},u=>({...u,vcMeetingAgent:{...u.vcMeetingAgent,listenerBotAppId:l}}))},children:[(0,e.jsx)("option",{value:"",children:n("settings.vcMeetingListenerBotAuto")}),a.vcMeetingAgent.listenerBotOptions.map(i=>{let l=i.botName||i.larkAppId,u=i.cliId?` \xB7 ${i.cliId}`:"",C=[i.vcMeetingAgentEnabled===!0?void 0:n("settings.vcMeetingListenerBotDisabled"),i.hasLarkCliProfile===!0?void 0:n("settings.vcMeetingListenerBotNoProfile")].filter(Boolean),B=C.length>0?` \xB7 ${C.join(" \xB7 ")}`:"";return(0,e.jsxs)("option",{value:i.larkAppId,children:[l,u,B]},i.larkAppId)})]}),(0,e.jsx)(H,{text:n("settings.vcMeetingListenerBotHelp")})]}),typeof a.vcMeetingAgent.larkCliVersion=="string"?a.vcMeetingAgent.larkCliMeetsRequirement?(0,e.jsxs)("p",{className:"st-larkcli-ok",children:["lark-cli ",a.vcMeetingAgent.larkCliVersion," \u2713"]}):(0,e.jsxs)("p",{className:"st-larkcli-warn",children:["\u26A0\uFE0F lark-cli ",a.vcMeetingAgent.larkCliVersion," \u7248\u672C\u8FC7\u4F4E\uFF0CVC bot \u5165\u4F1A\u9700\u8981 \u2265 ",a.vcMeetingAgent.larkCliMinVersion,"\u3002\u8BF7\u8FD0\u884C ",(0,e.jsx)("code",{children:"npm i -g @larksuite/cli@latest"})," \u5347\u7EA7\u3002"]}):(0,e.jsxs)("p",{className:"st-larkcli-warn",children:["\u26A0\uFE0F \u672A\u68C0\u6D4B\u5230 lark-cli\uFF0C\u8BF7\u5148\u5B89\u88C5\uFF1A",(0,e.jsx)("code",{children:"npm i -g @larksuite/cli"})]}),g?(0,e.jsxs)("div",{className:"st-feishu-qr",children:[(0,e.jsx)("p",{className:"st-feishu-qr-hint",children:"\u9700\u8981\u98DE\u4E66\u5F00\u653E\u5E73\u53F0\u767B\u5F55\u624D\u80FD\u81EA\u52A8\u914D\u7F6E VC \u6743\u9650\uFF0C\u8BF7\u626B\u7801\uFF1A"}),(0,e.jsx)("img",{src:g,alt:"\u98DE\u4E66\u626B\u7801\u767B\u5F55",className:"st-feishu-qr-img"}),(0,e.jsx)("button",{type:"button",className:"st-btn st-btn-ghost",onClick:()=>R(null),children:"\u5173\u95ED"})]}):null]}),(0,e.jsx)(M,{icon:"cards",title:n("settings.sectionCards"),saving:c==="openTerminalInFeishu",children:(0,e.jsx)(w,{title:n("settings.openTerminalInFeishu"),help:n("settings.openTerminalInFeishuHelp"),checked:a.openTerminalInFeishu,disabled:v||c==="openTerminalInFeishu",onChange:i=>T("openTerminalInFeishu",i)})}),(0,e.jsx)(M,{icon:"experimental",title:n("settings.sectionExperimental"),saving:c==="chatBotDiscovery",children:(0,e.jsx)(w,{title:n("settings.chatBotDiscovery"),help:n("settings.chatBotDiscoveryHelp"),checked:a.chatBotDiscovery,disabled:v||c==="chatBotDiscovery",onChange:i=>T("chatBotDiscovery",i)})}),(0,e.jsx)(M,{icon:"whiteboard",title:n("settings.sectionWhiteboard"),saving:c==="whiteboard",children:(0,e.jsx)(w,{title:n("settings.whiteboardEnable"),help:n("settings.whiteboardEnableHelp"),checked:a.whiteboard.enabled,disabled:v||c==="whiteboard",onChange:i=>{t.onSave("whiteboard",{whiteboard:{enabled:i}},l=>({...l,whiteboard:{enabled:i}}))}})}),(0,e.jsx)(M,{icon:"repo",title:n("settings.sectionRepoPicker"),saving:c==="repoPickerMode",children:(0,e.jsxs)("label",{className:"st-field",children:[(0,e.jsx)("span",{children:n("settings.repoPickerMode")}),(0,e.jsxs)("select",{value:a.repoPickerMode,disabled:v||c==="repoPickerMode",onChange:i=>{let l=i.currentTarget.value==="repos"?"repos":"all";t.onSave("repoPickerMode",{repoPickerMode:l},u=>({...u,repoPickerMode:l}))},children:[(0,e.jsx)("option",{value:"all",children:n("settings.repoPickerModeAll")}),(0,e.jsx)("option",{value:"repos",children:n("settings.repoPickerModeRepos")})]}),(0,e.jsx)(H,{text:n("settings.repoPickerModeHelp")})]})}),(0,e.jsx)(M,{icon:"maintenance",title:n("settings.sectionSchedule"),saving:c==="scheduleTimeZone",children:(0,e.jsx)(ke,{value:a.scheduleTimeZone,host:a.hostTimeZone,effective:a.effectiveScheduleTimeZone,disabled:v||c==="scheduleTimeZone",onSave:i=>{t.onSave("scheduleTimeZone",{scheduleTimeZone:i},l=>({...l,scheduleTimeZone:i??""}))}})}),(0,e.jsxs)(M,{icon:"maintenance",title:n("settings.sectionMaintenance"),saving:c==="autoUpdate"||c==="autoRestart",children:[(0,e.jsx)(w,{title:n("settings.autoUpdate"),help:n("settings.autoUpdateHelp"),checked:b.enabled,disabled:U||c==="autoUpdate",onChange:i=>{let l={enabled:i,time:b.time};t.onSave("autoUpdate",{maintenance:{autoUpdate:l}},u=>({...u,maintenance:{...u.maintenance,autoUpdate:l}}))}}),(0,e.jsx)("div",{className:"st-subrow",children:(0,e.jsxs)("label",{className:"st-field",children:[(0,e.jsx)("span",{children:n("settings.maintenanceTime")}),(0,e.jsx)("input",{type:"time",value:b.time,disabled:U||c==="autoUpdate",onChange:i=>{let l={enabled:b.enabled,time:i.currentTarget.value||"04:00"};t.onSave("autoUpdate",{maintenance:{autoUpdate:l}},u=>({...u,maintenance:{...u.maintenance,autoUpdate:l}}))}})]})}),a.localDevInstall?(0,e.jsx)("p",{className:"hint-warn",children:n("settings.autoUpdateLocalDev")}):null,(0,e.jsx)(w,{title:n("settings.autoRestart"),help:n("settings.autoRestartHelp"),checked:a.maintenance.autoRestart?.enabled===!0,disabled:x||c==="autoRestart",onChange:i=>{let l={enabled:i};t.onSave("autoRestart",{maintenance:{autoRestart:l}},u=>({...u,maintenance:{...u.maintenance,autoRestart:l}}))}})]})]})}function ke(t){let n=S(),[a,r]=(0,o.useState)(t.value);(0,o.useEffect)(()=>{r(t.value)},[t.value]);let p=()=>{let g=a.trim();g!==t.value.trim()&&t.onSave(g===""?null:g)},c=t.effective||t.value.trim()||t.host;return(0,e.jsxs)("label",{className:"form-row",children:[(0,e.jsx)("span",{children:n("settings.scheduleTimeZone")}),(0,e.jsx)("input",{type:"text",list:"tz-common",value:a,placeholder:t.host,disabled:t.disabled,onChange:g=>r(g.currentTarget.value),onBlur:p,onKeyDown:g=>{g.key==="Enter"&&(g.preventDefault(),g.currentTarget.blur())}}),(0,e.jsx)("datalist",{id:"tz-common",children:pe.map(g=>(0,e.jsx)("option",{value:g},g))}),(0,e.jsx)("small",{children:n("settings.scheduleTimeZoneHelp",{host:t.host,effective:c})})]})}function w(t){return(0,e.jsxs)("label",{className:"toggle-row",children:[(0,e.jsx)("input",{type:"checkbox",checked:t.checked,disabled:t.disabled,onChange:n=>t.onChange(n.currentTarget.checked)}),(0,e.jsx)("span",{className:"switch","aria-hidden":"true"}),(0,e.jsxs)("span",{className:"toggle-tx",children:[(0,e.jsx)("strong",{children:t.title}),(0,e.jsx)(H,{text:t.help})]})]})}function ye(t){let n=S(),a;if(!t.canWrite)a=(0,e.jsx)("p",{className:"hint-warn",children:n("update.loginRequired")});else if(t.statusError)a=(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("p",{className:"hint-warn",children:[n("update.checkFailed"),": ",t.statusError]}),(0,e.jsx)("div",{className:"update-actions",children:(0,e.jsx)("button",{type:"button","data-up":"check",onClick:t.onCheck,children:n("update.btnCheck")})})]});else if(!t.status)a=(0,e.jsx)("p",{className:"empty",children:n("update.loading")});else{let r=t.status,p=r.localDevInstall||t.busy;a=(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("p",{className:"update-version",children:[(0,e.jsx)("span",{className:"st-update-label",children:n("update.current")}),(0,e.jsxs)("strong",{className:"st-update-ver",children:["v",r.current]}),(0,e.jsx)(Me,{status:r})]}),r.node.ok?null:(0,e.jsx)("p",{className:"hint-warn",children:n("update.nodeWarn",{version:r.node.version,required:r.node.required})}),r.localDevInstall?(0,e.jsx)("p",{className:"hint-warn",children:n("update.localDev")}):null,r.installs.multiple?(0,e.jsx)(Se,{entries:r.installs.entries}):null,(0,e.jsxs)("div",{className:"update-actions",children:[(0,e.jsx)("button",{type:"button","data-up":"check",disabled:t.busy,onClick:t.onCheck,children:n("update.btnCheck")}),(0,e.jsx)("button",{type:"button","data-up":"changelog",disabled:t.busy,onClick:t.onToggleChangelog,children:t.changelogOpen?n("update.btnChangelogHide"):n("update.btnChangelog")}),(0,e.jsx)("button",{type:"button",className:"primary","data-up":"update",disabled:p,onClick:t.onUpdate,children:n("update.btnUpdate")}),(0,e.jsx)("button",{type:"button","data-up":"restart",disabled:t.busy,onClick:t.onRestart,children:n("update.btnRestart")})]}),t.changelogOpen?(0,e.jsx)(we,{changelog:t.changelog,ok:t.changelogOk,rateLimited:t.changelogRateLimited,releasesUrl:t.releasesUrl}):null,t.message?(0,e.jsx)("p",{className:`oncall-status ${t.message.cls??""}`,children:t.message.text}):null]})}return(0,e.jsx)(M,{icon:"update",title:n("update.section"),children:a})}function Me(t){let n=S(),a=t.status;return a.latest?a.behind?(0,e.jsx)("span",{className:"update-badge update-badge-new",children:n("update.newAvailable",{version:`v${a.latest}`})}):(0,e.jsx)("span",{className:"update-badge update-badge-ok",children:n("update.upToDate")}):(0,e.jsx)("span",{className:"hint-warn-inline",children:n("update.checkUnavailable")})}function Se(t){let n=S();return(0,e.jsxs)("div",{className:"hint-warn",children:[(0,e.jsx)("p",{children:n("update.multiInstallWarn")}),(0,e.jsx)("ul",{className:"update-install-list",children:t.entries.map(a=>(0,e.jsxs)("li",{children:[(0,e.jsx)("code",{children:a.binPath})," \u2192 ",ee(a.kind,n)," ",(0,e.jsx)("small",{children:a.root})]},`${a.binPath}:${a.root}`))})]})}function we(t){let n=S();if(t.changelog===null)return(0,e.jsx)("p",{className:"empty",children:n("update.changelogLoading")});if(!t.ok){let a=t.rateLimited?n("update.changelogRateLimited"):n("update.changelogFailed");return(0,e.jsxs)("p",{className:"hint-warn-inline",children:[a,t.releasesUrl?(0,e.jsxs)(e.Fragment,{children:[" ",(0,e.jsx)("a",{href:t.releasesUrl,target:"_blank",rel:"noopener",children:n("update.changelogViewOnGitHub")})]}):null]})}return t.changelog.length===0?(0,e.jsx)("p",{className:"empty",children:n("update.changelogEmpty")}):(0,e.jsx)("div",{className:"update-changelog",children:t.changelog.map(a=>{let r=a.name&&a.name!==`v${a.version}`?a.name:"",p=a.publishedAt?new Date(a.publishedAt).toLocaleDateString():"";return(0,e.jsxs)("details",{className:"update-release",open:!0,children:[(0,e.jsxs)("summary",{children:[(0,e.jsxs)("strong",{children:["v",a.version]})," ",r," ",(0,e.jsx)("small",{children:p})," ",(0,e.jsx)("a",{href:a.url,target:"_blank",rel:"noopener",children:"\u2197"})]}),(0,e.jsx)("pre",{className:"update-release-body",children:a.body||""})]},a.version)})})}function Re(t){return G(t,(0,e.jsx)(ve,{}))}export{ke as TimeZoneRow,Re as renderSettingsPage};
@@ -0,0 +1,2 @@
1
+ import{b as G}from"./chunk-PE6W3C2C.js";import"./chunk-LXIK7OUJ.js";import{r as Z,y as Nl}from"./chunk-3UJYRR2Q.js";import{a as as,b as wl,c as Cl}from"./chunk-JTSE5VP6.js";import{c as Y}from"./chunk-7SZRL6FY.js";var a=Y(as(),1);var l=Y(Cl(),1),ns=2;function ll(e){let t=e.as??"span";return(0,l.jsx)(t,{style:{display:"contents"},dangerouslySetInnerHTML:{__html:e.html}})}function os(e,t){let n=String(e??"").replace(/\\/g,"/");return n.includes("/.codex/skills/")?t("skills.sourceCodex"):n.includes("/.claude/skills/")?t("skills.sourceClaude"):n.includes("/.trae/skills/")?t("skills.sourceTrae"):n.includes("/.cursor/skills/")?t("skills.sourceCursor"):n.includes("/.gemini/skills/")?t("skills.sourceGemini"):n.includes("/.config/opencode/skills/")?t("skills.sourceOpenCode"):null}function rs(e,t){let n=e.source??{};return n.type==="github"?`github:${n.owner}/${n.repo}/${n.path??""}`:n.type==="git"?`${n.url??"git"}#${n.path??""}`:n.type==="local-link"?os(n.path,t)??t("skills.sourceLocalLink"):n.type==="local-copy"?t("skills.sourceBotmuxCopy"):String(n.type??"unknown")}function q(e){return(e?.include??[]).filter(t=>t.startsWith("skill:")).map(t=>t.slice(6))}function cs(e){return q(e).length}function ds(e){return q(e).length>0}function U(e){return`${e.cliId}
2
+ ${e.rootDir}`}function us(e){return e>=1600?4:e<=620?1:e<=980?2:3}async function h(e,t){let n=await fetch(e,{...t,headers:{"content-type":"application/json",...t.headers??{}}}),k=await n.json().catch(()=>({}));if(!n.ok||k.ok===!1){let f=new Error(k?.error??`HTTP ${n.status}`);throw f.status=n.status,f.body=k,f}return k}function Il(e){return`oncall-status${e?` ${e.ok?"hint-ok":"hint-warn-inline"}`:""}`}function ks(e){let t=G(),n=(0,a.useRef)(null),k=e.installCandidates??[],f=e.selectedInstallSkills??new Set,m=k.length>0&&k.every(r=>f.has(r.name)),C=e.installBusy||e.installDiscovering;return(0,a.useEffect)(()=>{let r=n.current;if(r)if(e.installSelectionOpen&&!r.open)try{r.showModal()}catch{}else!e.installSelectionOpen&&r.open&&r.close()},[e.installSelectionOpen,k.length]),(0,l.jsxs)("article",{className:"bd-card skills-install-panel",children:[(0,l.jsxs)("div",{className:"skills-install-title",children:[(0,l.jsx)("h3",{className:"bd-section-title",children:t("skills.install")}),(0,l.jsxs)("span",{className:"skills-help-tip",children:[(0,l.jsx)("button",{type:"button",className:"help-icon-button skills-help-button","aria-label":t("skills.installInfoLabel"),children:"?"}),(0,l.jsx)("span",{className:"skills-help-popover",role:"tooltip",children:t("skills.installInfo")})]})]}),(0,l.jsxs)("div",{className:"skills-install-grid",children:[(0,l.jsxs)("label",{className:"skills-source-label",children:[(0,l.jsx)("span",{children:t("skills.source")}),(0,l.jsx)("div",{className:"skills-source-control",children:(0,l.jsx)("input",{type:"text","data-install":"source","aria-label":t("skills.source"),placeholder:t("skills.sourcePlaceholder"),value:e.installSource,onChange:r=>e.onInstallSourceChange(r.currentTarget.value)})})]}),(0,l.jsxs)("div",{className:"bd-section-note skills-install-note",children:[(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:t("skills.sourceHelpRemoteLabel")}),t("skills.sourceHelpRemote")]}),(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:t("skills.sourceHelpLocalLabel")}),t("skills.sourceHelpLocal")]})]}),(0,l.jsxs)("div",{className:"skills-install-action-row",children:[(0,l.jsxs)("details",{className:"skills-advanced-options","data-skills-advanced":!0,open:!1,children:[(0,l.jsxs)("summary",{children:[(0,l.jsx)("span",{className:"skills-advanced-marker","aria-hidden":"true"}),(0,l.jsx)("span",{children:t("skills.advanced")})]}),(0,l.jsxs)("div",{className:"skills-advanced-fields",children:[(0,l.jsxs)("label",{className:"skills-install-field-wide",children:[(0,l.jsx)("span",{children:t("skills.path")}),(0,l.jsx)("input",{type:"text","data-install":"path",placeholder:t("skills.pathPlaceholder"),value:e.installPath,onChange:r=>e.onInstallPathChange(r.currentTarget.value)})]}),(0,l.jsxs)("label",{className:"skills-install-field-wide",children:[(0,l.jsx)("span",{children:t("skills.ref")}),(0,l.jsx)("input",{type:"text","data-install":"ref",placeholder:t("skills.refPlaceholder"),value:e.installRef,onChange:r=>e.onInstallRefChange(r.currentTarget.value)})]})]})]}),(0,l.jsx)("div",{className:"skills-install-actions",children:(0,l.jsx)("button",{type:"button",className:"primary","data-action":"install",disabled:C,onClick:()=>e.onInstall(),children:e.installDiscovering?t("skills.scanning"):e.installBusy?t("skills.jobRunning"):t("skills.installSubmit")})})]}),(0,l.jsxs)("div",{className:"skills-local-discovery-panel",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:t("skills.localDiscoverTitle")}),(0,l.jsx)("span",{children:t("skills.localDiscoverHelp")})]}),(0,l.jsx)("button",{type:"button","data-action":"open-native-skill-discovery",onClick:()=>e.onOpenNativeDiscovery(),children:t("skills.localDiscover")})]})]}),(0,l.jsx)("div",{className:"actions",children:(0,l.jsx)("span",{className:Il(e.installStatus),"data-skills-status":!0,children:e.installStatus?.text??""})}),(0,l.jsx)("dialog",{className:"skills-discovery-dialog skills-install-selection-dialog","data-install-selection-dialog":!0,ref:n,onClose:()=>e.onCloseInstallSelection?.(),children:(0,l.jsxs)("article",{children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("h3",{children:t("skills.installSelectionTitle")}),(0,l.jsx)("p",{children:t("skills.installSelectionHelp",{count:k.length})})]}),(0,l.jsx)("div",{className:"skills-discovery-body skills-install-selection-body",children:(0,l.jsxs)("div",{className:"skills-candidate-list","data-install-candidates":!0,children:[(0,l.jsxs)("div",{className:"skills-candidate-list-head",children:[(0,l.jsx)("span",{children:t("skills.scanFound",{count:k.length})}),e.onSelectAllInstallSkills?(0,l.jsx)("button",{type:"button","data-action":"toggle-all-source-skills",disabled:e.installBusy,onClick:()=>e.onSelectAllInstallSkills?.(!m),children:t(m?"skills.discoverClearSelection":"skills.discoverSelectAll")}):null]}),k.map(r=>(0,l.jsxs)("label",{className:"skills-candidate-row",children:[(0,l.jsx)("input",{type:"checkbox",checked:f.has(r.name),disabled:e.installBusy,onChange:()=>e.onToggleInstallSkill?.(r.name)}),(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:r.name}),(0,l.jsxs)("small",{children:[r.path,r.description?` \xB7 ${r.description}`:""]})]})]},`${r.name}:${r.path}`))]})}),(0,l.jsxs)("footer",{className:"actions",children:[(0,l.jsx)("button",{type:"button","data-action":"close-install-selection",disabled:e.installBusy,onClick:()=>e.onCloseInstallSelection?.(),children:t("skills.installSelectionCancel")}),(0,l.jsx)("button",{type:"button",className:"primary","data-action":"confirm-install-selection",disabled:e.installBusy||f.size===0,onClick:()=>e.onConfirmInstallSelection?.(),children:e.installBusy?t("skills.jobRunning"):t("skills.installSelected")})]})]})})]})}function ps(){let e=G(),t=(0,a.useRef)(!0),n=(0,a.useRef)(new Set),k=(0,a.useRef)(null),f=(0,a.useRef)(null),[m,C]=(0,a.useState)([]),[r,I]=(0,a.useState)([]),[v,D]=(0,a.useState)([]),[b,g]=(0,a.useState)("off"),[P,u]=(0,a.useState)("auto"),[R,sl]=(0,a.useState)(null),[el,tl]=(0,a.useState)(!0),[Pl,Rl]=(0,a.useState)(()=>window.innerWidth),[J,$l]=(0,a.useState)(""),[il,Bl]=(0,a.useState)(""),[al,Tl]=(0,a.useState)(""),[Dl,y]=(0,a.useState)(null),[Al,nl]=(0,a.useState)(!1),[jl,ol]=(0,a.useState)(!1),[xl,A]=(0,a.useState)(!1),[rl,cl]=(0,a.useState)([]),[_,j]=(0,a.useState)(()=>new Set),[K,x]=(0,a.useState)(!1),[El,dl]=(0,a.useState)(!1),[z,Ml]=(0,a.useState)(null),[W,F]=(0,a.useState)(()=>new Set),[B,V]=(0,a.useState)(0),[ul,E]=(0,a.useState)(null),[kl,M]=(0,a.useState)(null),[Ll,pl]=(0,a.useState)(null),[Ol,ml]=(0,a.useState)({}),L=(0,a.useMemo)(()=>new Set(m.map(s=>s.name)),[m]),O=us(Pl)*ns,$=Math.max(1,Math.ceil(m.length/O)),Hl=m.slice(B*O,B*O+O),N=(0,a.useMemo)(()=>r.length===0?void 0:(z?r.find(i=>U(i)===z):void 0)??r.find(i=>i.skills.length>0)??r[0],[z,r]),Q=N?U(N):"",T=(0,a.useMemo)(()=>N?N.skills.filter(s=>!L.has(s.name)).map(s=>s.rootDir??s.source?.root??"").filter(Boolean):[],[N,L]),vl=T.length>0&&T.every(s=>W.has(s)),yl=(0,a.useCallback)(()=>{for(let s of n.current)window.clearTimeout(s);n.current.clear()},[]),Gl=(0,a.useCallback)(s=>new Promise(i=>{let o=window.setTimeout(()=>{n.current.delete(o),i()},s);n.current.add(o)}),[]),fl=(0,a.useCallback)(async()=>{let[s,i]=await Promise.all([fetch("/api/skills"),fetch("/api/bots")]),o=await s.json().catch(()=>({})),d=await i.json().catch(()=>({}));if(!s.ok){let c=o?.error??`skills HTTP ${s.status}`;throw new Error(c==="not_found_yet"||c==="not_found"?e("skills.apiUnavailable"):c)}if(!i.ok)throw new Error(d?.error??`bots HTTP ${i.status}`);return{skills:Array.isArray(o.skills)?o.skills:[],nativeSkillGroups:Array.isArray(o.nativeSkillGroups)?o.nativeSkillGroups:[],bots:Array.isArray(d.bots)?d.bots:[],trustProjectSkills:o.trustProjectSkills==="all"?"all":"off",delivery:o.delivery==="prompt"||o.delivery==="native"?o.delivery:"auto"}},[e]),w=(0,a.useCallback)(async()=>{tl(!0);try{let s=await fl();if(!t.current)return;C(s.skills),I(s.nativeSkillGroups),D(s.bots),g(s.trustProjectSkills),u(s.delivery),sl(null),F(i=>{let o=new Set,d=new Set(s.skills.map(c=>c.name));for(let c of s.nativeSkillGroups)for(let p of c.skills){let S=p.rootDir??p.source?.root??"";S&&!d.has(p.name)&&i.has(S)&&o.add(S)}return o})}catch(s){if(!t.current)return;sl(s?.message??String(s))}finally{t.current&&tl(!1)}},[fl]);(0,a.useEffect)(()=>{t.current=!0,w();let s=()=>Rl(window.innerWidth);return window.addEventListener("resize",s),()=>{t.current=!1,yl(),window.removeEventListener("resize",s)}},[yl,w]),(0,a.useEffect)(()=>{V(s=>Math.min(Math.max(0,s),$-1))},[$]),(0,a.useEffect)(()=>{let s=k.current;if(s)if(K&&!s.open)try{s.showModal()}catch{}else!K&&s.open&&s.close()},[K,Q]);async function gl(s,i,o=!0){let d=s;for(i({text:e("skills.jobRunning"),ok:!0});;){if(!t.current)return;if(d.status==="succeeded"){i({text:e("skills.saved"),ok:!0}),o&&await w();return}if(d.status==="failed")throw new Error(d.error??"job_failed");if(await Gl(800),!t.current)return;let c=await h(`/api/skills/jobs/${encodeURIComponent(d.id)}`,{method:"GET"});if(!t.current)return;d=c.job}}function Ul(s){return v.filter(i=>q(i.skills).includes(s)).map(i=>i.botName??i.larkAppId)}function H(){cl([]),j(new Set),A(!1)}function bl(){return{source:J.trim(),path:il.trim()||void 0,ref:al.trim()||void 0}}function ql(s){let i=s??[..._];return{...bl(),skillNames:i.length>0?i:void 0}}async function Jl(){ol(!0),y({text:e("skills.scanning"),ok:!0});try{let s=await h("/api/skills/discover",{method:"POST",body:JSON.stringify(bl())});if(!t.current)return[];let i=Array.isArray(s.discovery?.skills)?s.discovery.skills:[];return cl(i),j(new Set(i.map(o=>o.name))),i}finally{t.current&&ol(!1)}}async function hl(s){nl(!0);try{let i=await h("/api/skills/install",{method:"POST",body:JSON.stringify(ql(s))});if(!t.current)return;await gl(i.job,y),t.current&&H()}catch(i){t.current&&y({text:`${e("skills.failed")}: ${i?.message??i}`,ok:!1})}finally{t.current&&nl(!1)}}function _l(s){j(i=>{let o=new Set(i);return o.has(s)?o.delete(s):o.add(s),o})}function Kl(s){j(s?new Set(rl.map(i=>i.name)):new Set)}async function zl(){if(!J.trim()){y({text:e("skills.sourceRequired"),ok:!1});return}try{A(!1);let s=await Jl();if(!t.current)return;if(s.length===0){y({text:e("skills.scanEmpty"),ok:!1});return}if(s.length===1){await hl([s[0].name]);return}y({text:e("skills.scanFound",{count:s.length}),ok:!0}),A(!0)}catch(s){t.current&&y({text:`${e("skills.failed")}: ${s?.message??s}`,ok:!1})}}async function Wl(){let s=[..._];if(s.length===0){y({text:e("skills.discoverNothingSelected"),ok:!1});return}await hl(s)}async function Fl(){let s=[...W].filter(Boolean);if(s.length===0){y({text:e("skills.discoverNothingSelected"),ok:!1});return}dl(!0);try{if(y({text:e("skills.discoverRegisteringBatch",{total:s.length}),ok:!0}),await h("/api/skills/install-local-links",{method:"POST",body:JSON.stringify({sources:s})}),!t.current)return;x(!1),await w(),t.current&&y({text:e("skills.saved"),ok:!0})}catch(i){t.current&&y({text:`${e("skills.failed")}: ${i?.message??i}`,ok:!1})}finally{t.current&&dl(!1)}}async function Vl(s){if(b!==s){E("project");try{let i=await h("/api/skills/global",{method:"PUT",body:JSON.stringify({trustProjectSkills:s})});if(!t.current)return;g(i.trustProjectSkills==="all"?"all":s)}catch(i){t.current&&window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&E(null)}}}async function Ql(s){if(P!==s){E("delivery");try{let i=await h("/api/skills/global",{method:"PUT",body:JSON.stringify({delivery:s})});if(!t.current)return;u(i.delivery==="prompt"||i.delivery==="native"?i.delivery:s)}catch(i){t.current&&window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&E(null)}}}function Sl(s){let i=f.current,o=i?.querySelector(".skills-bot-card");if(!i||!o)return;let d=window.getComputedStyle(i),c=Number.parseFloat(d.columnGap||d.gap||"0")||0;i.scrollBy({left:s*(o.getBoundingClientRect().width+c),behavior:"smooth"})}async function Xl(s){M(`${s}:update`);try{let i=await h(`/api/skills/${encodeURIComponent(s)}/update`,{method:"POST",body:"{}"});if(!t.current)return;await gl(i.job,y)}catch(i){t.current&&window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&M(null)}}async function Yl(s){if(window.confirm(`${e("skills.remove")} ${s}?`)){M(`${s}:remove`);try{if(await h(`/api/skills/${encodeURIComponent(s)}`,{method:"DELETE",body:"{}"}),!t.current)return;await w()}catch(i){if(!t.current)return;if(i?.status===409&&i?.body?.error==="skill_in_use"){let o=Array.isArray(i.body.affectedBots)?i.body.affectedBots.map(c=>{let p=c?.botName||c?.larkAppId;return p?`${p}`:""}).filter(Boolean):Ul(s),d=[o.length?`Bot: ${o.join(", ")}`:""].filter(Boolean).join("; ")||"-";if(!window.confirm(e("skills.removeInUse",{skill:s,refs:d})))return;try{if(await h(`/api/skills/${encodeURIComponent(s)}?force=1`,{method:"DELETE",body:"{}"}),!t.current)return;await w();return}catch(c){t.current&&window.alert(`${e("skills.failed")}: ${c?.message??c}`);return}}window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&M(null)}}}async function Zl(s,i,o){let d=`${s}:${i}:${o}`;pl(d),ml(c=>({...c,[s]:null}));try{let c=await h(`/api/bots/${encodeURIComponent(s)}/skills`,{method:"PUT",body:JSON.stringify({action:i,name:o})});if(!t.current)return;D(p=>p.map(S=>S.larkAppId===s?{...S,skills:c.skills??null}:S))}catch(c){t.current&&ml(p=>({...p,[s]:{text:`${e("skills.failed")}: ${c?.message??c}`,ok:!1}}))}finally{t.current&&pl(null)}}let ls=v.filter(s=>ds(s.skills)).length,ss=v.reduce((s,i)=>s+cs(i.skills),0),es=el?(0,l.jsx)(ll,{html:Nl(),as:"div"}):R?(0,l.jsx)("p",{className:"hint-warn",children:R}):(0,l.jsxs)("div",{className:"skills-page-grid",children:[(0,l.jsxs)("aside",{className:"skills-side-rail",children:[(0,l.jsxs)("article",{className:"bd-card skills-defaults-panel",children:[(0,l.jsx)("h3",{className:"bd-section-title",children:e("skills.globalDefaults")}),(0,l.jsxs)("div",{className:"skills-control-block",children:[(0,l.jsx)("span",{className:"skills-control-label",children:e("skills.globalProject")}),(0,l.jsx)("div",{className:"skills-choice-group skills-choice-group-compact skills-project-group",children:[["off",e("skills.globalProjectOff"),e("skills.globalProjectOffHelp")],["all",e("skills.globalProjectAll"),e("skills.globalProjectAllHelp")]].map(([s,i,o])=>(0,l.jsxs)("button",{type:"button",className:`skills-choice${b===s?" selected":""}`,"data-global-project-value":s,"aria-pressed":b===s?"true":"false",disabled:ul==="project",onClick:()=>{Vl(s)},children:[(0,l.jsx)("strong",{children:i}),(0,l.jsx)("small",{children:o})]},s))})]}),(0,l.jsxs)("div",{className:"skills-control-block",children:[(0,l.jsx)("span",{className:"skills-control-label",children:e("skills.globalDelivery")}),(0,l.jsx)("div",{className:"skills-choice-group skills-delivery-group",children:[["auto",e("skills.deliveryAuto"),e("skills.deliveryAutoHelp")],["prompt",e("skills.deliveryPrompt"),e("skills.deliveryPromptHelp")],["native",e("skills.deliveryNative"),e("skills.deliveryNativeHelp")]].map(([s,i,o])=>(0,l.jsxs)("button",{type:"button",className:`skills-choice${P===s?" selected":""}`,"data-global-delivery-value":s,"aria-pressed":P===s?"true":"false",disabled:ul==="delivery",onClick:()=>{Ql(s)},children:[(0,l.jsx)("strong",{children:i}),(0,l.jsx)("small",{children:o})]},s))})]})]}),(0,l.jsx)(ks,{installSource:J,installPath:il,installRef:al,installStatus:Dl,installBusy:Al,installDiscovering:jl,installSelectionOpen:xl,installCandidates:rl,selectedInstallSkills:_,onInstallSourceChange:s=>{$l(s),H()},onInstallPathChange:s=>{Bl(s),H()},onInstallRefChange:s=>{Tl(s),H()},onToggleInstallSkill:_l,onSelectAllInstallSkills:Kl,onConfirmInstallSelection:()=>{Wl()},onCloseInstallSelection:()=>A(!1),onInstall:()=>{zl()},onOpenNativeDiscovery:()=>x(!0)})]}),(0,l.jsxs)("section",{className:"skills-main-panel",children:[(0,l.jsxs)("section",{className:"skills-overview",children:[(0,l.jsxs)("div",{className:"skills-overview-copy",children:[(0,l.jsx)("h2",{children:e("skills.overviewTitle")}),(0,l.jsx)("p",{children:e("skills.overviewBody")})]}),(0,l.jsxs)("div",{className:"skills-metric-strip",children:[(0,l.jsxs)("span",{children:[(0,l.jsx)("small",{children:e("skills.metricInstalled")}),(0,l.jsx)("strong",{children:m.length})]}),(0,l.jsxs)("span",{children:[(0,l.jsx)("small",{children:e("skills.metricBots")}),(0,l.jsxs)("strong",{children:[ls,"/",v.length]})]}),(0,l.jsxs)("span",{children:[(0,l.jsx)("small",{children:e("skills.metricAttached")}),(0,l.jsx)("strong",{children:ss})]})]})]}),(0,l.jsxs)("section",{className:"skills-bots-panel",children:[(0,l.jsxs)("div",{className:"skills-section-head skills-section-head-row",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("h2",{children:e("skills.bots")}),(0,l.jsx)("p",{children:e("skills.botsHelp")})]}),v.length>3?(0,l.jsxs)("div",{className:"skills-bot-rail-actions",children:[(0,l.jsx)("button",{type:"button",className:"skills-rail-button","data-action":"scroll-bots","data-dir":"-1","aria-label":e("skills.scrollBotsPrev"),title:e("skills.scrollBotsPrev"),onClick:()=>Sl(-1),children:"\u2039"}),(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.botCount",{count:v.length})}),(0,l.jsx)("button",{type:"button",className:"skills-rail-button","data-action":"scroll-bots","data-dir":"1","aria-label":e("skills.scrollBotsNext"),title:e("skills.scrollBotsNext"),onClick:()=>Sl(1),children:"\u203A"})]}):(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.botCount",{count:v.length})})]}),(0,l.jsx)("div",{className:"skills-bot-grid",ref:f,children:v.map(s=>(0,l.jsx)(ms,{bot:s,installedNames:L,skills:m,status:Ol[s.larkAppId]??null,busyKey:Ll,onUpdate:Zl},s.larkAppId))})]}),(0,l.jsxs)("section",{className:"bd-card skills-installed-panel",children:[(0,l.jsxs)("div",{className:"skills-section-head skills-section-head-row",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("h2",{children:e("skills.installed")}),(0,l.jsx)("p",{children:e("skills.installedHelp")})]}),$<=1?(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.skillCount",{count:m.length})}):(0,l.jsxs)("div",{className:"skills-installed-toolbar",children:[(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.skillCount",{count:m.length})}),(0,l.jsxs)("div",{className:"skills-pager",children:[(0,l.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"-1","aria-label":e("skills.prevPage"),title:e("skills.prevPage"),disabled:B===0,onClick:()=>V(s=>Math.max(0,s-1)),children:"\u2039"}),(0,l.jsx)("span",{children:e("skills.pageStatus",{page:B+1,pages:$})}),(0,l.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"1","aria-label":e("skills.nextPage"),title:e("skills.nextPage"),disabled:B>=$-1,onClick:()=>V(s=>Math.min($-1,s+1)),children:"\u203A"})]})]})]}),m.length===0?(0,l.jsx)("p",{className:"empty",children:e("skills.empty")}):(0,l.jsx)("div",{className:"skills-list",children:Hl.map(s=>(0,l.jsxs)("article",{className:"skills-row skills-installed-card","data-skill":s.name,children:[(0,l.jsxs)("div",{className:"skills-row-body",children:[(0,l.jsx)("strong",{children:s.name}),s.description?(0,l.jsx)("p",{children:s.description}):null,(0,l.jsx)("small",{className:"skills-source-badge",children:rs(s,e)})]}),(0,l.jsxs)("div",{className:"skills-card-actions",children:[(0,l.jsx)("button",{type:"button","data-action":"update-skill",disabled:kl===`${s.name}:update`,onClick:()=>{Xl(s.name)},children:e("skills.update")}),(0,l.jsx)("button",{type:"button","data-action":"remove-skill",disabled:kl===`${s.name}:remove`,onClick:()=>{Yl(s.name)},children:e("skills.remove")})]})]},s.name))})]})]}),(0,l.jsx)("dialog",{className:"skills-discovery-dialog",id:"skills-discovery-dialog",ref:k,onClose:()=>x(!1),children:(0,l.jsxs)("article",{children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("h3",{children:e("skills.discoverTitle")}),(0,l.jsx)("p",{children:e("skills.discoverHelp")})]}),(0,l.jsx)("div",{className:"skills-discovery-body",children:N?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"skills-discovery-tabs",role:"tablist","aria-label":e("skills.discoverTitle"),children:r.map(s=>{let i=U(s),o=i===Q;return(0,l.jsxs)("button",{type:"button",role:"tab","data-discovery-tab":i,className:o?"selected":"","aria-selected":o?"true":"false",onClick:()=>Ml(i),children:[(0,l.jsx)("strong",{children:s.label??s.cliId}),(0,l.jsx)("small",{children:e("skills.skillCount",{count:s.skills.length})})]},i)})}),(0,l.jsx)("div",{className:"skills-discovery-path",children:(0,l.jsx)("code",{children:N.rootDir})}),r.map(s=>{let i=U(s);return(0,l.jsx)("section",{className:"skills-discovery-group","data-discovery-panel":i,hidden:!(i===Q),children:s.skills.length===0?(0,l.jsx)("p",{className:"empty",children:e("skills.discoverGroupEmpty")}):(0,l.jsx)("div",{className:"skills-discovery-list",children:s.skills.map(d=>{let c=L.has(d.name),p=d.rootDir??d.source?.root??"";return(0,l.jsxs)("label",{className:`skills-discovery-row${c?" installed":""}`,children:[(0,l.jsx)("input",{type:"checkbox","data-discovered-skill":!0,value:p,disabled:c,checked:!c&&W.has(p),onChange:S=>{let ts=S.currentTarget.checked;F(is=>{let X=new Set(is);return ts?X.add(p):X.delete(p),X})}}),(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:d.name}),d.description?(0,l.jsx)("small",{children:d.description}):null]}),c?(0,l.jsx)("em",{children:e("skills.discoverRegistered")}):null]},`${d.name}:${p}`)})})},i)})]}):(0,l.jsx)("p",{className:"empty",children:e("skills.discoverEmpty")})}),(0,l.jsxs)("footer",{className:"actions",children:[(0,l.jsx)("button",{type:"button","data-action":"toggle-discovered-skills",disabled:T.length===0,onClick:()=>{F(s=>{let i=new Set(s);return vl?T.forEach(o=>i.delete(o)):T.forEach(o=>i.add(o)),i})},children:e(vl?"skills.discoverClearSelection":"skills.discoverSelectAll")}),(0,l.jsx)("button",{type:"button",className:"primary","data-action":"register-discovered-skills",disabled:El,onClick:()=>{Fl()},children:e("skills.discoverRegister")}),(0,l.jsx)("button",{type:"button","data-action":"close-discovery",onClick:()=>x(!1),children:e("skills.discoverClose")})]})]})})]});return(0,l.jsxs)("section",{className:"page",children:[(0,l.jsxs)("div",{className:"page-heading",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("p",{className:"eyebrow",children:e("nav.skills")}),(0,l.jsx)("h1",{children:e("skills.title")}),(0,l.jsx)("p",{children:e("skills.subtitle")})]}),(0,l.jsx)("button",{type:"button",id:"skills-refresh",disabled:el,onClick:()=>{w()},children:e("skills.refresh")})]}),(0,l.jsx)("div",{id:"skills-body",children:es})]})}function ms(e){let t=G(),{bot:n,installedNames:k,skills:f,status:m,busyKey:C,onUpdate:r}=e,I=n.botName??n.larkAppId,v=q(n.skills),D=new Set(v),b=f.filter(u=>!D.has(u.name)),[g,P]=(0,a.useState)(b[0]?.name??"");return(0,a.useEffect)(()=>{(!g||!b.some(u=>u.name===g))&&P(b[0]?.name??"")},[b,g]),n.error?(0,l.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":n.larkAppId,children:[(0,l.jsxs)("header",{children:[(0,l.jsx)(ll,{html:Z({name:I,larkAppId:n.larkAppId,size:"sm"})}),(0,l.jsx)("strong",{children:I})]}),(0,l.jsx)("p",{className:"hint-warn-inline",children:n.error})]}):(0,l.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":n.larkAppId,children:[(0,l.jsxs)("header",{className:"skills-bot-head",children:[(0,l.jsx)(ll,{html:Z({name:I,larkAppId:n.larkAppId,size:"sm",dot:"ok"})}),(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:I}),(0,l.jsx)("code",{children:n.larkAppId})]}),(0,l.jsx)("span",{className:"skills-count-pill",children:t("skills.skillCount",{count:v.length})})]}),(0,l.jsxs)("section",{className:"bd-section",children:[(0,l.jsx)("h3",{className:"bd-section-title",children:t("skills.priority")}),v.length===0?(0,l.jsx)("p",{className:"bd-section-note",children:t("skills.noPriority")}):(0,l.jsx)("div",{className:"skills-chip-list",children:v.map(u=>{let R=!k.has(u);return(0,l.jsxs)("span",{className:`skills-priority-row${R?" skills-priority-dangling":""}`,title:R?t("skills.dangling"):"",children:[(0,l.jsxs)("span",{className:"skills-priority-name",children:[u,R?(0,l.jsx)("small",{children:t("skills.dangling")}):null]}),(0,l.jsx)("button",{type:"button",className:"skills-priority-remove","data-action":"detach-skill","data-name":u,"aria-label":t("skills.detachNamed",{skill:u}),disabled:C===`${n.larkAppId}:detach:${u}`,onClick:()=>{r(n.larkAppId,"detach",u)},children:"\xD7"})]},u)})}),(0,l.jsx)("div",{className:"actions skills-attach-row",children:b.length===0?(0,l.jsx)("button",{type:"button",disabled:!0,children:t("skills.attach")}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("select",{"data-attach-picker":!0,value:g,onChange:u=>P(u.currentTarget.value),children:b.map(u=>(0,l.jsx)("option",{value:u.name,children:u.name},u.name))}),(0,l.jsx)("button",{type:"button","data-action":"attach-skill",disabled:!g||C===`${n.larkAppId}:attach:${g}`,onClick:()=>g&&void r(n.larkAppId,"attach",g),children:t("skills.attach")})]})})]}),(0,l.jsx)("span",{className:Il(m),"data-bot-status":!0,children:m?.text??""})]})}function gs(e){return wl(e,(0,l.jsx)(ps,{}))}export{ms as BotPolicyCard,ks as SkillsInstallPanel,gs as renderSkillsPage};
@@ -1,4 +1,4 @@
1
- import{b as w}from"./chunk-VFCACTRF.js";import"./chunk-LXIK7OUJ.js";import{m as n,n as d}from"./chunk-BNEXMNQD.js";import{a as V,b as R,c as P}from"./chunk-JTSE5VP6.js";import{c as N}from"./chunk-7SZRL6FY.js";var k=N(V(),1);async function E(e){let t=await fetch(e);return{status:t.status,body:await t.json().catch(()=>({}))}}async function S(e,t,o){let a=await fetch(t,{method:e,headers:{"content-type":"application/json"},body:o?JSON.stringify(o):void 0});return{status:a.status,body:await a.json().catch(()=>({}))}}var x=(e,t)=>S("POST",e,t),X=(e,t)=>S("PUT",e,t),z=[],U=[],q="",I="",A=new Map,H=new Map,$=new Set,M=new Set,y=0;function _(){return y+=1,y}function f(e){return y===e}function c(e){return document.getElementById(e)}function B(){return[...z,...U]}function T(e){let t=A.get(e);return t||(t=new Set,A.set(e,t)),t}function Y(e){return B().find(t=>t.key===e)}function Z(e){let t=(c("tf-search").value||"").trim().toLowerCase();if(t&&!((e.name||"")+" "+(e.cliId||"")+" "+(e.capability||"")).toLowerCase().includes(t))return!1;let o=c("tf-cli").value;return!(o&&e.cliId!==o||c("tf-fcap").checked&&!e.capability||c("tf-frole").checked&&!e.hasTeamRole)}function ee(e,t){let o=[...e.deployments].sort((r,s)=>r.local===s.local?0:r.local?-1:1),a="";for(let r of o){let s=t.filter(p=>p.deployment.id===r.id);if(!s.length)continue;let m=r.id===q,l=m?n("team.tagLocal"):r.stale?n("team.tagRemoteStale"):n("team.tagRemote"),u=e.kind==="local"&&!m?` <button class="tf-rmmember ghost" data-team="${d(e.teamId)}" data-dep="${d(r.id)}" data-name="${d(r.name)}" style="font-size:12px">${n("team.removeMember")}</button>`:"",g=`${e.key}::${r.id}`,b=M.has(g),v=s.filter(p=>T(e.key).has(p.larkAppId)).length;if(a+=`<div class="tf-dep-h" data-dk="${d(g)}" style="cursor:pointer;margin:10px 0 2px"><b>${b?"\u25BE":"\u25B8"} ${d(r.name)}</b> <span class="muted" style="font-size:12px">${n("team.depTag",{tag:l})} \xB7 ${n("team.depCount",{count:s.length})}${v?n("team.depSelected",{n:v}):""}</span>${u}</div>`,!!b){a+='<table style="width:100%;border-collapse:collapse;font-size:14px"><tbody>';for(let p of s){let C=d(p.larkAppId),W=T(e.key).has(p.larkAppId)?" checked":"",K=p.deployment.stale?"opacity:.55":"",J=m?`<input class="tf-cap" data-app="${C}" value="${d(p.capability||"")}" placeholder="${n("team.capPh")}" style="width:92%;padding:3px 6px">`:p.capability?d(p.capability):'<span class="muted">\u2014</span>',Q=p.hasTeamRole?m?`<button class="tf-role" data-app="${C}" data-name="${d(p.name)}">${n("team.viewRole")}</button>`:n("team.hasRoleShort"):'<span class="muted">\u2014</span>';a+=`<tr style="${K}"><td style="padding:4px 8px"><input type="checkbox" class="tf-pick" data-tk="${d(e.key)}" data-app="${C}"${W}></td><td style="padding:4px 8px">${d(p.name)}</td><td style="padding:4px 8px" class="muted">${d(p.cliId)}</td><td style="padding:4px 8px">${J}</td><td style="padding:4px 8px">${Q}</td></tr>`}a+="</tbody></table>"}}return a||(a=`<p class="muted" style="margin:8px 0 0">${n("team.noMatch")}</p>`),a+=`<div style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;align-items:center"><input class="tf-gname" data-tk="${d(e.key)}" value="${d(H.get(e.key)||"")}" placeholder="${n("team.gnamePh")}" style="min-width:200px"><button class="tf-grp primary" data-tk="${d(e.key)}">${n("team.pullGroupBtn")}</button><span class="muted" style="font-size:13px">${n("team.pullGroupHint")}</span><span class="tf-gout" data-tk="${d(e.key)}" style="font-size:13px;display:block;flex-basis:100%"></span></div>`,a}function h(){let e=c("tf-teams"),t=B();if(!t.length){e.innerHTML=`<p class="muted">${n("team.noTeams")}</p>`,c("tf-count").textContent="";return}let o="",a=new Set,r=new Set;for(let l of t){let u=l.bots.filter(Z);u.forEach(p=>a.add(p.larkAppId)),l.bots.forEach(p=>r.add(p.larkAppId));let g=new Set(u.map(p=>p.larkAppId));[...T(l.key)].forEach(p=>{g.has(p)||T(l.key).delete(p)});let b=!$.has(l.key),v=l.kind==="remote"?l.ok?` <span class="ok" style="font-size:12px">${n("team.connected")}</span>`:` <span class="err" style="font-size:12px">${n("team.connectFail",{error:d(l.error||"")})}</span>`:` <span class="muted" style="font-size:12px">${n("team.iHost")}</span>`;o+=`<div class="card" style="margin:0 0 12px;padding:12px 14px;background:var(--bg-soft,#f6f7f9)"><div class="tf-team-h" data-tk="${d(l.key)}" style="cursor:pointer;display:flex;align-items:center;gap:8px;flex-wrap:wrap"><b style="font-size:15px">${b?"\u25B8":"\u25BE"} ${d(l.label)}</b>`+(l.sub?` <span class="muted" style="font-size:12px">${d(l.sub)}</span>`:"")+v+` <span class="muted" style="font-size:12px">\xB7 ${n("team.teamMeta",{deps:l.deployments.length,bots:l.bots.length})}</span></div>`,b||(o+=l.kind==="remote"&&!l.ok?`<p class="muted" style="margin:8px 0 0">${n("team.rosterFail")}</p>`:ee(l,u)),o+="</div>"}e.innerHTML=o;let s=t.length>1?n("team.acrossTeams",{n:t.length}):"",m=a.size===r.size?`${r.size}`:`${a.size} / ${r.size}`;c("tf-count").textContent=`\xB7 ${m} ${n("team.botsWord")}${s}`,te(y)}function te(e=y){let t=c("tf-teams");t.querySelectorAll(".tf-team-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.tk;$.has(a)?$.delete(a):$.add(a),h()}}),t.querySelectorAll(".tf-dep-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.dk;M.has(a)?M.delete(a):M.add(a),h()}}),t.querySelectorAll(".tf-pick").forEach(o=>{o.onchange=()=>{let a=T(o.dataset.tk);o.checked?a.add(o.dataset.app):a.delete(o.dataset.app)}}),t.querySelectorAll(".tf-gname").forEach(o=>{o.oninput=()=>{H.set(o.dataset.tk,o.value)}}),t.querySelectorAll(".tf-cap").forEach(o=>{o.onchange=async()=>{let a=o.dataset.app,r=o.value;await X("/api/team/local-bots/"+encodeURIComponent(a)+"/capability",{capability:r}),f(e)&&B().forEach(s=>{let m=s.bots.find(l=>l.larkAppId===a);m&&(m.capability=r.trim()||null)})}}),t.querySelectorAll(".tf-role").forEach(o=>{o.onclick=()=>ne(o.dataset.app,o.dataset.name||"",e)}),t.querySelectorAll(".tf-rmmember").forEach(o=>{o.onclick=async a=>{a.stopPropagation(),confirm(n("team.removeMemberConfirm",{name:o.dataset.name||""}))&&(await S("DELETE",`/api/team/hosted/${encodeURIComponent(o.dataset.team)}/members/${encodeURIComponent(o.dataset.dep)}`),f(e)&&L(e))}}),t.querySelectorAll(".tf-grp").forEach(o=>{o.onclick=async()=>{let a=o.dataset.tk,r=Y(a);if(!r)return;let s=[...T(a)],m=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);if(!s.length){m.innerHTML=`<span class="err">${n("team.errPickBot")}</span>`;return}let l=(t.querySelector(`.tf-gname[data-tk="${CSS.escape(a)}"]`)?.value||"").trim()||n("team.defaultGroupName");m.innerHTML=`<span class="muted">${n("team.creatingGroup")}</span>`;let u=r.kind==="local"?await x("/api/team/federated-group",{name:l,larkAppIds:s,teamId:r.teamId}):await x("/api/team/remote-group",{hubUrl:r.hubUrl,teamId:r.teamId,name:l,larkAppIds:s});if(f(e)&&(ae(m,u.body,u.status),u.body?.ok)){T(a).clear(),H.delete(a);let g=m.innerHTML,b=()=>{if(!f(e))return;let v=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);v&&(v.innerHTML=g)};r.kind==="local"?L(e).then(b):(h(),b())}}})}function ae(e,t,o){if(t?.ok&&t.chatId){let a=t.shareLink||"https://applink.feishu.cn/client/chat/open?openChatId="+encodeURIComponent(t.chatId),r=(t.invalidBotIds||[]).length?` <span class="err"> \xB7 ${n("team.invalidBots",{ids:d((t.invalidBotIds||[]).join(", "))})}</span>`:"",s=(t.invalidOwnerUnionIds||[]).length?`<span class="err"> \xB7 ${n("team.invalidOwners",{n:(t.invalidOwnerUnionIds||[]).length})}</span>`:"",m=t.missingOperatorIdentity?`<span class="err"> \xB7 ${n("team.missingIdentity")}</span>`:"",l=(t.skippedNoOwner||[]).length?`<span class="err"> \xB7 ${n("team.skippedNoOwner",{n:(t.skippedNoOwner||[]).length})}</span>`:"",u=t.delegatedTo?n("team.delegatedBy",{name:d(t.delegatedTo)}):"";e.innerHTML=`<span class="ok">${n("team.groupCreated")}</span>${u} \xB7 <a href="${d(a)}" target="_blank">${n("team.openInLark")}</a>${r}${s}${m}${l}`}else{let a=t?.error||o,r=a==="no_local_online_bot"?n("team.errNoLocalBot"):a==="all_bots_skipped_no_owner"?n("team.errAllSkipped"):a==="no_creator_available"?n("team.errNoCreator"):a==="delegation_timeout"?n("team.errDelegationTimeout"):n("team.errGroupCreate",{error:String(a)});e.innerHTML=`<span class="err">${d(String(r))}</span>`}}async function ne(e,t,o=y){let a=await E("/api/team/local-bots/"+encodeURIComponent(e)+"/role");f(o)&&(c("tf-modal-title").textContent=n("team.roleModalTitleName",{name:t}),c("tf-modal-text").value=a.body?.role||"",c("tf-modal").dataset.app=e,c("tf-modal").style.display="flex")}function D(){let e=Array.from(new Set(B().flatMap(a=>a.bots.map(r=>r.cliId)).filter(Boolean))).sort(),t=c("tf-cli"),o=t.value;t.innerHTML=`<option value="">${n("team.allCli")}</option>`+e.map(a=>`<option value="${d(a)}">${d(a)}</option>`).join(""),t.value=o}async function L(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body;if(!o?.ok){z=[],h();return}q=o.deployment.deploymentId,I=o.suggestedHubUrl||"",c("tf-owner").textContent=o.deployment.ownerName||(o.deployment.ownerUnionId?n("team.bound"):n("team.unbound")),z=(o.teams||[]).map(a=>({kind:"local",key:`local:${a.teamId}`,teamId:a.teamId,label:a.isDefault?n("team.myHostedTeam"):a.name,sub:"",ok:!0,deployments:a.deployments||[],bots:a.bots||[]})),D(),h()}async function oe(e=y){let t=await E("/api/team/remote-roster");if(!f(e))return;U=(t.body?.memberships||[]).map(a=>{let r=a.roster?.deployments||[],s=r.find(l=>l.local),m=s?.name?n("team.remoteTeamLabel",{name:s.name}):a.teamName||a.teamId;return{kind:"remote",key:`${a.hubUrl}::${a.teamId}`,teamId:a.teamId,label:m,sub:a.hubUrl,ok:!!a.ok,error:a.error,hubUrl:a.hubUrl,deployments:r,bots:a.roster?.bots||[]}}),D(),h()}function O(e){let t=_(),o=[],a=(r,s,m)=>{r&&(r.addEventListener(s,m),o.push(()=>r.removeEventListener(s,m)))};return A.clear(),H.clear(),$.clear(),M.clear(),["tf-search","tf-cli","tf-fcap","tf-frole"].forEach(r=>{let s=document.getElementById(r);a(s,"input",()=>{f(t)&&h()}),a(s,"change",()=>{f(t)&&h()})}),a(document.getElementById("tf-modal-cancel"),"click",()=>{f(t)&&(c("tf-modal").style.display="none")}),se(t),L(t),oe(t),()=>{f(t)&&(y+=1);for(let s of o.splice(0))s();let r=e.querySelector("#tf-modal");r&&(r.style.display="none")}}async function j(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body,a=c("tm-list");I=o?.suggestedHubUrl||I;let r=o?.teams||[];if(!r.length){a.innerHTML=`<p class="muted">${n("team.noTeamsShort")}</p>`;return}a.innerHTML=r.map(s=>{let m=(s.deployments||[]).filter(l=>!l.local).length;return`<div class="card" style="margin:0 0 8px;padding:10px 14px;background:var(--bg-soft,#f6f7f9)">
1
+ import{b as w}from"./chunk-PE6W3C2C.js";import"./chunk-LXIK7OUJ.js";import{o as n,p as d}from"./chunk-3UJYRR2Q.js";import{a as V,b as R,c as P}from"./chunk-JTSE5VP6.js";import{c as N}from"./chunk-7SZRL6FY.js";var k=N(V(),1);async function E(e){let t=await fetch(e);return{status:t.status,body:await t.json().catch(()=>({}))}}async function S(e,t,o){let a=await fetch(t,{method:e,headers:{"content-type":"application/json"},body:o?JSON.stringify(o):void 0});return{status:a.status,body:await a.json().catch(()=>({}))}}var x=(e,t)=>S("POST",e,t),X=(e,t)=>S("PUT",e,t),z=[],U=[],q="",I="",A=new Map,H=new Map,$=new Set,M=new Set,y=0;function _(){return y+=1,y}function f(e){return y===e}function c(e){return document.getElementById(e)}function B(){return[...z,...U]}function T(e){let t=A.get(e);return t||(t=new Set,A.set(e,t)),t}function Y(e){return B().find(t=>t.key===e)}function Z(e){let t=(c("tf-search").value||"").trim().toLowerCase();if(t&&!((e.name||"")+" "+(e.cliId||"")+" "+(e.capability||"")).toLowerCase().includes(t))return!1;let o=c("tf-cli").value;return!(o&&e.cliId!==o||c("tf-fcap").checked&&!e.capability||c("tf-frole").checked&&!e.hasTeamRole)}function ee(e,t){let o=[...e.deployments].sort((r,s)=>r.local===s.local?0:r.local?-1:1),a="";for(let r of o){let s=t.filter(p=>p.deployment.id===r.id);if(!s.length)continue;let m=r.id===q,l=m?n("team.tagLocal"):r.stale?n("team.tagRemoteStale"):n("team.tagRemote"),u=e.kind==="local"&&!m?` <button class="tf-rmmember ghost" data-team="${d(e.teamId)}" data-dep="${d(r.id)}" data-name="${d(r.name)}" style="font-size:12px">${n("team.removeMember")}</button>`:"",g=`${e.key}::${r.id}`,b=M.has(g),v=s.filter(p=>T(e.key).has(p.larkAppId)).length;if(a+=`<div class="tf-dep-h" data-dk="${d(g)}" style="cursor:pointer;margin:10px 0 2px"><b>${b?"\u25BE":"\u25B8"} ${d(r.name)}</b> <span class="muted" style="font-size:12px">${n("team.depTag",{tag:l})} \xB7 ${n("team.depCount",{count:s.length})}${v?n("team.depSelected",{n:v}):""}</span>${u}</div>`,!!b){a+='<table style="width:100%;border-collapse:collapse;font-size:14px"><tbody>';for(let p of s){let C=d(p.larkAppId),W=T(e.key).has(p.larkAppId)?" checked":"",K=p.deployment.stale?"opacity:.55":"",J=m?`<input class="tf-cap" data-app="${C}" value="${d(p.capability||"")}" placeholder="${n("team.capPh")}" style="width:92%;padding:3px 6px">`:p.capability?d(p.capability):'<span class="muted">\u2014</span>',Q=p.hasTeamRole?m?`<button class="tf-role" data-app="${C}" data-name="${d(p.name)}">${n("team.viewRole")}</button>`:n("team.hasRoleShort"):'<span class="muted">\u2014</span>';a+=`<tr style="${K}"><td style="padding:4px 8px"><input type="checkbox" class="tf-pick" data-tk="${d(e.key)}" data-app="${C}"${W}></td><td style="padding:4px 8px">${d(p.name)}</td><td style="padding:4px 8px" class="muted">${d(p.cliId)}</td><td style="padding:4px 8px">${J}</td><td style="padding:4px 8px">${Q}</td></tr>`}a+="</tbody></table>"}}return a||(a=`<p class="muted" style="margin:8px 0 0">${n("team.noMatch")}</p>`),a+=`<div style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;align-items:center"><input class="tf-gname" data-tk="${d(e.key)}" value="${d(H.get(e.key)||"")}" placeholder="${n("team.gnamePh")}" style="min-width:200px"><button class="tf-grp primary" data-tk="${d(e.key)}">${n("team.pullGroupBtn")}</button><span class="muted" style="font-size:13px">${n("team.pullGroupHint")}</span><span class="tf-gout" data-tk="${d(e.key)}" style="font-size:13px;display:block;flex-basis:100%"></span></div>`,a}function h(){let e=c("tf-teams"),t=B();if(!t.length){e.innerHTML=`<p class="muted">${n("team.noTeams")}</p>`,c("tf-count").textContent="";return}let o="",a=new Set,r=new Set;for(let l of t){let u=l.bots.filter(Z);u.forEach(p=>a.add(p.larkAppId)),l.bots.forEach(p=>r.add(p.larkAppId));let g=new Set(u.map(p=>p.larkAppId));[...T(l.key)].forEach(p=>{g.has(p)||T(l.key).delete(p)});let b=!$.has(l.key),v=l.kind==="remote"?l.ok?` <span class="ok" style="font-size:12px">${n("team.connected")}</span>`:` <span class="err" style="font-size:12px">${n("team.connectFail",{error:d(l.error||"")})}</span>`:` <span class="muted" style="font-size:12px">${n("team.iHost")}</span>`;o+=`<div class="card" style="margin:0 0 12px;padding:12px 14px;background:var(--bg-soft,#f6f7f9)"><div class="tf-team-h" data-tk="${d(l.key)}" style="cursor:pointer;display:flex;align-items:center;gap:8px;flex-wrap:wrap"><b style="font-size:15px">${b?"\u25B8":"\u25BE"} ${d(l.label)}</b>`+(l.sub?` <span class="muted" style="font-size:12px">${d(l.sub)}</span>`:"")+v+` <span class="muted" style="font-size:12px">\xB7 ${n("team.teamMeta",{deps:l.deployments.length,bots:l.bots.length})}</span></div>`,b||(o+=l.kind==="remote"&&!l.ok?`<p class="muted" style="margin:8px 0 0">${n("team.rosterFail")}</p>`:ee(l,u)),o+="</div>"}e.innerHTML=o;let s=t.length>1?n("team.acrossTeams",{n:t.length}):"",m=a.size===r.size?`${r.size}`:`${a.size} / ${r.size}`;c("tf-count").textContent=`\xB7 ${m} ${n("team.botsWord")}${s}`,te(y)}function te(e=y){let t=c("tf-teams");t.querySelectorAll(".tf-team-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.tk;$.has(a)?$.delete(a):$.add(a),h()}}),t.querySelectorAll(".tf-dep-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.dk;M.has(a)?M.delete(a):M.add(a),h()}}),t.querySelectorAll(".tf-pick").forEach(o=>{o.onchange=()=>{let a=T(o.dataset.tk);o.checked?a.add(o.dataset.app):a.delete(o.dataset.app)}}),t.querySelectorAll(".tf-gname").forEach(o=>{o.oninput=()=>{H.set(o.dataset.tk,o.value)}}),t.querySelectorAll(".tf-cap").forEach(o=>{o.onchange=async()=>{let a=o.dataset.app,r=o.value;await X("/api/team/local-bots/"+encodeURIComponent(a)+"/capability",{capability:r}),f(e)&&B().forEach(s=>{let m=s.bots.find(l=>l.larkAppId===a);m&&(m.capability=r.trim()||null)})}}),t.querySelectorAll(".tf-role").forEach(o=>{o.onclick=()=>ne(o.dataset.app,o.dataset.name||"",e)}),t.querySelectorAll(".tf-rmmember").forEach(o=>{o.onclick=async a=>{a.stopPropagation(),confirm(n("team.removeMemberConfirm",{name:o.dataset.name||""}))&&(await S("DELETE",`/api/team/hosted/${encodeURIComponent(o.dataset.team)}/members/${encodeURIComponent(o.dataset.dep)}`),f(e)&&L(e))}}),t.querySelectorAll(".tf-grp").forEach(o=>{o.onclick=async()=>{let a=o.dataset.tk,r=Y(a);if(!r)return;let s=[...T(a)],m=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);if(!s.length){m.innerHTML=`<span class="err">${n("team.errPickBot")}</span>`;return}let l=(t.querySelector(`.tf-gname[data-tk="${CSS.escape(a)}"]`)?.value||"").trim()||n("team.defaultGroupName");m.innerHTML=`<span class="muted">${n("team.creatingGroup")}</span>`;let u=r.kind==="local"?await x("/api/team/federated-group",{name:l,larkAppIds:s,teamId:r.teamId}):await x("/api/team/remote-group",{hubUrl:r.hubUrl,teamId:r.teamId,name:l,larkAppIds:s});if(f(e)&&(ae(m,u.body,u.status),u.body?.ok)){T(a).clear(),H.delete(a);let g=m.innerHTML,b=()=>{if(!f(e))return;let v=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);v&&(v.innerHTML=g)};r.kind==="local"?L(e).then(b):(h(),b())}}})}function ae(e,t,o){if(t?.ok&&t.chatId){let a=t.shareLink||"https://applink.feishu.cn/client/chat/open?openChatId="+encodeURIComponent(t.chatId),r=(t.invalidBotIds||[]).length?` <span class="err"> \xB7 ${n("team.invalidBots",{ids:d((t.invalidBotIds||[]).join(", "))})}</span>`:"",s=(t.invalidOwnerUnionIds||[]).length?`<span class="err"> \xB7 ${n("team.invalidOwners",{n:(t.invalidOwnerUnionIds||[]).length})}</span>`:"",m=t.missingOperatorIdentity?`<span class="err"> \xB7 ${n("team.missingIdentity")}</span>`:"",l=(t.skippedNoOwner||[]).length?`<span class="err"> \xB7 ${n("team.skippedNoOwner",{n:(t.skippedNoOwner||[]).length})}</span>`:"",u=t.delegatedTo?n("team.delegatedBy",{name:d(t.delegatedTo)}):"";e.innerHTML=`<span class="ok">${n("team.groupCreated")}</span>${u} \xB7 <a href="${d(a)}" target="_blank">${n("team.openInLark")}</a>${r}${s}${m}${l}`}else{let a=t?.error||o,r=a==="no_local_online_bot"?n("team.errNoLocalBot"):a==="all_bots_skipped_no_owner"?n("team.errAllSkipped"):a==="no_creator_available"?n("team.errNoCreator"):a==="delegation_timeout"?n("team.errDelegationTimeout"):n("team.errGroupCreate",{error:String(a)});e.innerHTML=`<span class="err">${d(String(r))}</span>`}}async function ne(e,t,o=y){let a=await E("/api/team/local-bots/"+encodeURIComponent(e)+"/role");f(o)&&(c("tf-modal-title").textContent=n("team.roleModalTitleName",{name:t}),c("tf-modal-text").value=a.body?.role||"",c("tf-modal").dataset.app=e,c("tf-modal").style.display="flex")}function D(){let e=Array.from(new Set(B().flatMap(a=>a.bots.map(r=>r.cliId)).filter(Boolean))).sort(),t=c("tf-cli"),o=t.value;t.innerHTML=`<option value="">${n("team.allCli")}</option>`+e.map(a=>`<option value="${d(a)}">${d(a)}</option>`).join(""),t.value=o}async function L(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body;if(!o?.ok){z=[],h();return}q=o.deployment.deploymentId,I=o.suggestedHubUrl||"",c("tf-owner").textContent=o.deployment.ownerName||(o.deployment.ownerUnionId?n("team.bound"):n("team.unbound")),z=(o.teams||[]).map(a=>({kind:"local",key:`local:${a.teamId}`,teamId:a.teamId,label:a.isDefault?n("team.myHostedTeam"):a.name,sub:"",ok:!0,deployments:a.deployments||[],bots:a.bots||[]})),D(),h()}async function oe(e=y){let t=await E("/api/team/remote-roster");if(!f(e))return;U=(t.body?.memberships||[]).map(a=>{let r=a.roster?.deployments||[],s=r.find(l=>l.local),m=s?.name?n("team.remoteTeamLabel",{name:s.name}):a.teamName||a.teamId;return{kind:"remote",key:`${a.hubUrl}::${a.teamId}`,teamId:a.teamId,label:m,sub:a.hubUrl,ok:!!a.ok,error:a.error,hubUrl:a.hubUrl,deployments:r,bots:a.roster?.bots||[]}}),D(),h()}function O(e){let t=_(),o=[],a=(r,s,m)=>{r&&(r.addEventListener(s,m),o.push(()=>r.removeEventListener(s,m)))};return A.clear(),H.clear(),$.clear(),M.clear(),["tf-search","tf-cli","tf-fcap","tf-frole"].forEach(r=>{let s=document.getElementById(r);a(s,"input",()=>{f(t)&&h()}),a(s,"change",()=>{f(t)&&h()})}),a(document.getElementById("tf-modal-cancel"),"click",()=>{f(t)&&(c("tf-modal").style.display="none")}),se(t),L(t),oe(t),()=>{f(t)&&(y+=1);for(let s of o.splice(0))s();let r=e.querySelector("#tf-modal");r&&(r.style.display="none")}}async function j(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body,a=c("tm-list");I=o?.suggestedHubUrl||I;let r=o?.teams||[];if(!r.length){a.innerHTML=`<p class="muted">${n("team.noTeamsShort")}</p>`;return}a.innerHTML=r.map(s=>{let m=(s.deployments||[]).filter(l=>!l.local).length;return`<div class="card" style="margin:0 0 8px;padding:10px 14px;background:var(--bg-soft,#f6f7f9)">
2
2
  <div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap">
3
3
  <b>${d(s.name)}</b>${s.isDefault?` <span class="muted" style="font-size:12px">${n("team.default")}</span>`:""}
4
4
  <span class="muted" style="font-size:12px">\xB7 ${n("team.manageMetaDeps",{count:(s.deployments||[]).length})}${m?n("team.manageMetaRemote",{r:m}):""} \xB7 ${n("team.manageMetaBots",{count:(s.bots||[]).length})}</span>
@@ -1,4 +1,4 @@
1
- import{m as i}from"./chunk-BNEXMNQD.js";import"./chunk-7SZRL6FY.js";function Rt(){let t=[["",i("workflow.filter.nonTerminal")],["all",i("workflow.filter.all")],["pending",C("pending")],["running",C("running")],["waiting",C("waiting")],["succeeded",C("succeeded")],["failed",C("failed")],["cancelled",C("cancelled")]];return`
1
+ import{o as i}from"./chunk-3UJYRR2Q.js";import"./chunk-7SZRL6FY.js";function Rt(){let t=[["",i("workflow.filter.nonTerminal")],["all",i("workflow.filter.all")],["pending",C("pending")],["running",C("running")],["waiting",C("waiting")],["succeeded",C("succeeded")],["failed",C("failed")],["cancelled",C("cancelled")]];return`
2
2
  <nav class="wf-subnav">
3
3
  <a href="#/legacy-workflow" class="active" data-i18n="workflow.subnav.runs">${r(i("workflow.subnav.runs"))}</a>
4
4
  <a href="#/workflows" data-i18n="workflow.subnav.v3">${r(i("workflow.subnav.v3"))}</a>
@@ -22,6 +22,7 @@
22
22
  </a>
23
23
  <nav class="sidebar-nav" aria-label="Dashboard">
24
24
  <a href="#/" data-route="overview"><svg viewBox="0 0 16 16" aria-hidden="true"><rect x="1.5" y="1.5" width="5.4" height="5.4" rx="1.5"/><rect x="9.1" y="1.5" width="5.4" height="5.4" rx="1.5"/><rect x="1.5" y="9.1" width="5.4" height="5.4" rx="1.5"/><rect x="9.1" y="9.1" width="5.4" height="5.4" rx="1.5"/></svg><span data-i18n="nav.overview">总览</span></a>
25
+ <a href="#/monitoring" data-route="monitoring"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2 11.5h12M3.4 11.5V6.8M6.5 11.5V4.5M9.5 11.5V8M12.6 11.5V3.2"/></svg><span data-i18n="nav.monitoring">监控</span></a>
25
26
  <a href="#/sessions" data-route="sessions"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2 3.5h12v7H6l-3 3v-3H2z"/></svg><span data-i18n="nav.sessions">会话</span></a>
26
27
  <a href="#/insights" data-route="insights"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2 2v12h12M5 11V7M8.5 11V4.5M12 11V8.5"/></svg><span data-i18n="nav.insights">洞察</span></a>
27
28
  <a href="#/workflows" data-route="workflows"><svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="3.4" cy="3.6" r="1.9"/><circle cx="3.4" cy="12.4" r="1.9"/><circle cx="12.6" cy="8" r="1.9"/><path d="M5.2 4.4l5.6 2.8M5.2 11.6l5.6-2.8"/></svg><span data-i18n="nav.workflows">工作流</span></a>
@@ -61,7 +62,7 @@
61
62
  aria-haspopup="listbox" aria-expanded="false" aria-label="Theme"></button>
62
63
  <div class="theme-menu-pop" id="theme-menu-pop" role="listbox" hidden></div>
63
64
  </div>
64
- <a class="topbar-docs-link" href="https://github.com/deepcoldy/botmux/tree/master/docs-site/docs"
65
+ <a class="topbar-docs-link" href="https://bytedance.aiforce.cloud/app/app_4k9smq6rdxher"
65
66
  target="_blank" rel="noopener noreferrer" title="botmux 文档">
66
67
  <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 2.5h5.5a1.5 1.5 0 0 1 1.5 1.5v9M13.5 2.5H8a1.5 1.5 0 0 0-1.5 1.5v9M2.5 2.5v9.5a1 1 0 0 0 1 1H7M13.5 2.5v9.5a1 1 0 0 1-1 1H9"/></svg>
67
68
  <span data-i18n="nav.docs">文档</span>