botmux 2.101.0 → 2.102.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 (133) hide show
  1. package/dist/adapters/backend/sandbox.d.ts +13 -1
  2. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  3. package/dist/adapters/backend/sandbox.js +33 -12
  4. package/dist/adapters/backend/sandbox.js.map +1 -1
  5. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  6. package/dist/adapters/backend/tmux-backend.js +4 -0
  7. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  8. package/dist/adapters/cli/coco.d.ts.map +1 -1
  9. package/dist/adapters/cli/coco.js +6 -1
  10. package/dist/adapters/cli/coco.js.map +1 -1
  11. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  12. package/dist/adapters/cli/codex-app.js +3 -1
  13. package/dist/adapters/cli/codex-app.js.map +1 -1
  14. package/dist/adapters/cli/codex.d.ts.map +1 -1
  15. package/dist/adapters/cli/codex.js +7 -1
  16. package/dist/adapters/cli/codex.js.map +1 -1
  17. package/dist/adapters/cli/hermes.d.ts.map +1 -1
  18. package/dist/adapters/cli/hermes.js +5 -4
  19. package/dist/adapters/cli/hermes.js.map +1 -1
  20. package/dist/adapters/cli/mtr.d.ts.map +1 -1
  21. package/dist/adapters/cli/mtr.js +4 -1
  22. package/dist/adapters/cli/mtr.js.map +1 -1
  23. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  24. package/dist/adapters/cli/opencode.js +4 -1
  25. package/dist/adapters/cli/opencode.js.map +1 -1
  26. package/dist/adapters/cli/traex.d.ts.map +1 -1
  27. package/dist/adapters/cli/traex.js +4 -1
  28. package/dist/adapters/cli/traex.js.map +1 -1
  29. package/dist/adapters/cli/types.d.ts +4 -1
  30. package/dist/adapters/cli/types.d.ts.map +1 -1
  31. package/dist/bot-registry.d.ts +14 -0
  32. package/dist/bot-registry.d.ts.map +1 -1
  33. package/dist/bot-registry.js +9 -0
  34. package/dist/bot-registry.js.map +1 -1
  35. package/dist/core/command-handler.d.ts.map +1 -1
  36. package/dist/core/command-handler.js +22 -8
  37. package/dist/core/command-handler.js.map +1 -1
  38. package/dist/core/cost-calculator.d.ts.map +1 -1
  39. package/dist/core/cost-calculator.js +6 -0
  40. package/dist/core/cost-calculator.js.map +1 -1
  41. package/dist/core/dashboard-ipc-server.d.ts +9 -0
  42. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  43. package/dist/core/dashboard-ipc-server.js +96 -6
  44. package/dist/core/dashboard-ipc-server.js.map +1 -1
  45. package/dist/core/local-terminal-opener.d.ts +43 -0
  46. package/dist/core/local-terminal-opener.d.ts.map +1 -0
  47. package/dist/core/local-terminal-opener.js +221 -0
  48. package/dist/core/local-terminal-opener.js.map +1 -0
  49. package/dist/core/working-dir.d.ts +12 -1
  50. package/dist/core/working-dir.d.ts.map +1 -1
  51. package/dist/core/working-dir.js +20 -3
  52. package/dist/core/working-dir.js.map +1 -1
  53. package/dist/daemon.d.ts.map +1 -1
  54. package/dist/daemon.js +52 -8
  55. package/dist/daemon.js.map +1 -1
  56. package/dist/dashboard/bot-payload.d.ts +2 -0
  57. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  58. package/dist/dashboard/bot-payload.js +4 -0
  59. package/dist/dashboard/bot-payload.js.map +1 -1
  60. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  61. package/dist/dashboard/web/bot-defaults.js +135 -1
  62. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  63. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  64. package/dist/dashboard/web/i18n.js +30 -6
  65. package/dist/dashboard/web/i18n.js.map +1 -1
  66. package/dist/dashboard-web/app.js +2 -2
  67. package/dist/dashboard-web/chunks/bot-defaults-page-YAHNXFBC.js +370 -0
  68. package/dist/dashboard-web/chunks/{chunk-MR57RUVP.js → chunk-DWFMPIAQ.js} +5 -5
  69. package/dist/dashboard-web/chunks/{chunk-ECXPBQ3J.js → chunk-NC77G2OB.js} +1 -1
  70. package/dist/dashboard-web/chunks/{connectors-UGTF4Q4I.js → connectors-BW6WO7P5.js} +1 -1
  71. package/dist/dashboard-web/chunks/{groups-page-IKTCMQ4A.js → groups-page-UTXUVV2M.js} +1 -1
  72. package/dist/dashboard-web/chunks/{insights-page-7CCSHEKM.js → insights-page-IW3KNMG4.js} +1 -1
  73. package/dist/dashboard-web/chunks/{overview-page-JOJW65P5.js → overview-page-RO6R26AZ.js} +1 -1
  74. package/dist/dashboard-web/chunks/{roles-page-E2VN2DLV.js → roles-page-5DYKR2I5.js} +1 -1
  75. package/dist/dashboard-web/chunks/{schedules-6QIHJIHX.js → schedules-WUZP3UPF.js} +1 -1
  76. package/dist/dashboard-web/chunks/{sessions-page-QN2TARF2.js → sessions-page-GWZ4GKSG.js} +1 -1
  77. package/dist/dashboard-web/chunks/{settings-page-WWTXB577.js → settings-page-HJH6HQ7D.js} +1 -1
  78. package/dist/dashboard-web/chunks/{skills-page-2FAUPQ6H.js → skills-page-ATVGKR5I.js} +1 -1
  79. package/dist/dashboard-web/chunks/{team-federation-page-PTBQQSFS.js → team-federation-page-JVC73TTF.js} +1 -1
  80. package/dist/dashboard-web/chunks/{workflows-ZNBB5KFV.js → workflows-YCZTOJUS.js} +1 -1
  81. package/dist/dashboard-web/style.css +42 -0
  82. package/dist/dashboard.js +92 -15
  83. package/dist/dashboard.js.map +1 -1
  84. package/dist/i18n/en.d.ts.map +1 -1
  85. package/dist/i18n/en.js +13 -4
  86. package/dist/i18n/en.js.map +1 -1
  87. package/dist/i18n/zh.d.ts.map +1 -1
  88. package/dist/i18n/zh.js +13 -4
  89. package/dist/i18n/zh.js.map +1 -1
  90. package/dist/im/lark/card-builder.d.ts.map +1 -1
  91. package/dist/im/lark/card-builder.js +20 -0
  92. package/dist/im/lark/card-builder.js.map +1 -1
  93. package/dist/im/lark/card-handler.d.ts.map +1 -1
  94. package/dist/im/lark/card-handler.js +36 -12
  95. package/dist/im/lark/card-handler.js.map +1 -1
  96. package/dist/im/lark/client.d.ts.map +1 -1
  97. package/dist/im/lark/client.js +25 -5
  98. package/dist/im/lark/client.js.map +1 -1
  99. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  100. package/dist/im/lark/event-dispatcher.js +36 -3
  101. package/dist/im/lark/event-dispatcher.js.map +1 -1
  102. package/dist/services/bot-config-store.d.ts +4 -1
  103. package/dist/services/bot-config-store.d.ts.map +1 -1
  104. package/dist/services/bot-config-store.js +19 -1
  105. package/dist/services/bot-config-store.js.map +1 -1
  106. package/dist/services/bot-union-ids-store.d.ts +15 -0
  107. package/dist/services/bot-union-ids-store.d.ts.map +1 -1
  108. package/dist/services/bot-union-ids-store.js +25 -5
  109. package/dist/services/bot-union-ids-store.js.map +1 -1
  110. package/dist/services/open-platform-rename.d.ts +45 -0
  111. package/dist/services/open-platform-rename.d.ts.map +1 -0
  112. package/dist/services/open-platform-rename.js +182 -0
  113. package/dist/services/open-platform-rename.js.map +1 -0
  114. package/dist/services/platform-team-store.d.ts +5 -0
  115. package/dist/services/platform-team-store.d.ts.map +1 -1
  116. package/dist/services/platform-team-store.js +16 -0
  117. package/dist/services/platform-team-store.js.map +1 -1
  118. package/dist/services/sandbox-land.d.ts.map +1 -1
  119. package/dist/services/sandbox-land.js +16 -4
  120. package/dist/services/sandbox-land.js.map +1 -1
  121. package/dist/services/usage-ledger.d.ts.map +1 -1
  122. package/dist/services/usage-ledger.js +14 -2
  123. package/dist/services/usage-ledger.js.map +1 -1
  124. package/dist/setup/open-platform-automation.d.ts +8 -0
  125. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  126. package/dist/setup/open-platform-automation.js +5 -3
  127. package/dist/setup/open-platform-automation.js.map +1 -1
  128. package/dist/worker.js +30 -8
  129. package/dist/worker.js.map +1 -1
  130. package/dist/workflows/events/payloads.d.ts +6 -6
  131. package/dist/workflows/events/schema.d.ts +12 -12
  132. package/package.json +1 -1
  133. package/dist/dashboard-web/chunks/bot-defaults-page-HOGLABBC.js +0 -358
@@ -106,16 +106,16 @@ export declare const BotSnapshotSchema: z.ZodObject<{
106
106
  cliPathOverride: z.ZodOptional<z.ZodString>;
107
107
  }, "strip", z.ZodTypeAny, {
108
108
  larkAppId?: string | undefined;
109
+ displayName?: string | undefined;
109
110
  cliId?: string | undefined;
110
111
  cliPathOverride?: string | undefined;
111
112
  workingDir?: string | undefined;
112
- displayName?: string | undefined;
113
113
  }, {
114
114
  larkAppId?: string | undefined;
115
+ displayName?: string | undefined;
115
116
  cliId?: string | undefined;
116
117
  cliPathOverride?: string | undefined;
117
118
  workingDir?: string | undefined;
118
- displayName?: string | undefined;
119
119
  }>;
120
120
  export type BotSnapshot = z.infer<typeof BotSnapshotSchema>;
121
121
  export declare const RunCreatedPayload: z.ZodObject<{
@@ -149,16 +149,16 @@ export declare const RunCreatedPayload: z.ZodObject<{
149
149
  cliPathOverride: z.ZodOptional<z.ZodString>;
150
150
  }, "strip", z.ZodTypeAny, {
151
151
  larkAppId?: string | undefined;
152
+ displayName?: string | undefined;
152
153
  cliId?: string | undefined;
153
154
  cliPathOverride?: string | undefined;
154
155
  workingDir?: string | undefined;
155
- displayName?: string | undefined;
156
156
  }, {
157
157
  larkAppId?: string | undefined;
158
+ displayName?: string | undefined;
158
159
  cliId?: string | undefined;
159
160
  cliPathOverride?: string | undefined;
160
161
  workingDir?: string | undefined;
161
- displayName?: string | undefined;
162
162
  }>>>;
163
163
  }, "strip", z.ZodTypeAny, {
164
164
  workflowId: string;
@@ -173,10 +173,10 @@ export declare const RunCreatedPayload: z.ZodObject<{
173
173
  initiator: string;
174
174
  botSnapshots?: Record<string, {
175
175
  larkAppId?: string | undefined;
176
+ displayName?: string | undefined;
176
177
  cliId?: string | undefined;
177
178
  cliPathOverride?: string | undefined;
178
179
  workingDir?: string | undefined;
179
- displayName?: string | undefined;
180
180
  }> | undefined;
181
181
  }, {
182
182
  workflowId: string;
@@ -191,10 +191,10 @@ export declare const RunCreatedPayload: z.ZodObject<{
191
191
  initiator: string;
192
192
  botSnapshots?: Record<string, {
193
193
  larkAppId?: string | undefined;
194
+ displayName?: string | undefined;
194
195
  cliId?: string | undefined;
195
196
  cliPathOverride?: string | undefined;
196
197
  workingDir?: string | undefined;
197
- displayName?: string | undefined;
198
198
  }> | undefined;
199
199
  }>;
200
200
  export declare const RunStartedPayload: z.ZodObject<{}, "strict", z.ZodTypeAny, {}, {}>;
@@ -49,16 +49,16 @@ export declare const RunCreatedEventSchema: z.ZodObject<{
49
49
  cliPathOverride: z.ZodOptional<z.ZodString>;
50
50
  }, "strip", z.ZodTypeAny, {
51
51
  larkAppId?: string | undefined;
52
+ displayName?: string | undefined;
52
53
  cliId?: string | undefined;
53
54
  cliPathOverride?: string | undefined;
54
55
  workingDir?: string | undefined;
55
- displayName?: string | undefined;
56
56
  }, {
57
57
  larkAppId?: string | undefined;
58
+ displayName?: string | undefined;
58
59
  cliId?: string | undefined;
59
60
  cliPathOverride?: string | undefined;
60
61
  workingDir?: string | undefined;
61
- displayName?: string | undefined;
62
62
  }>>>;
63
63
  }, "strip", z.ZodTypeAny, {
64
64
  workflowId: string;
@@ -73,10 +73,10 @@ export declare const RunCreatedEventSchema: z.ZodObject<{
73
73
  initiator: string;
74
74
  botSnapshots?: Record<string, {
75
75
  larkAppId?: string | undefined;
76
+ displayName?: string | undefined;
76
77
  cliId?: string | undefined;
77
78
  cliPathOverride?: string | undefined;
78
79
  workingDir?: string | undefined;
79
- displayName?: string | undefined;
80
80
  }> | undefined;
81
81
  }, {
82
82
  workflowId: string;
@@ -91,10 +91,10 @@ export declare const RunCreatedEventSchema: z.ZodObject<{
91
91
  initiator: string;
92
92
  botSnapshots?: Record<string, {
93
93
  larkAppId?: string | undefined;
94
+ displayName?: string | undefined;
94
95
  cliId?: string | undefined;
95
96
  cliPathOverride?: string | undefined;
96
97
  workingDir?: string | undefined;
97
- displayName?: string | undefined;
98
98
  }> | undefined;
99
99
  }>, z.ZodObject<{
100
100
  ref: z.ZodString;
@@ -132,10 +132,10 @@ export declare const RunCreatedEventSchema: z.ZodObject<{
132
132
  initiator: string;
133
133
  botSnapshots?: Record<string, {
134
134
  larkAppId?: string | undefined;
135
+ displayName?: string | undefined;
135
136
  cliId?: string | undefined;
136
137
  cliPathOverride?: string | undefined;
137
138
  workingDir?: string | undefined;
138
- displayName?: string | undefined;
139
139
  }> | undefined;
140
140
  } | {
141
141
  ref: string;
@@ -163,10 +163,10 @@ export declare const RunCreatedEventSchema: z.ZodObject<{
163
163
  initiator: string;
164
164
  botSnapshots?: Record<string, {
165
165
  larkAppId?: string | undefined;
166
+ displayName?: string | undefined;
166
167
  cliId?: string | undefined;
167
168
  cliPathOverride?: string | undefined;
168
169
  workingDir?: string | undefined;
169
- displayName?: string | undefined;
170
170
  }> | undefined;
171
171
  } | {
172
172
  ref: string;
@@ -2993,16 +2993,16 @@ export declare const EventSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
2993
2993
  cliPathOverride: z.ZodOptional<z.ZodString>;
2994
2994
  }, "strip", z.ZodTypeAny, {
2995
2995
  larkAppId?: string | undefined;
2996
+ displayName?: string | undefined;
2996
2997
  cliId?: string | undefined;
2997
2998
  cliPathOverride?: string | undefined;
2998
2999
  workingDir?: string | undefined;
2999
- displayName?: string | undefined;
3000
3000
  }, {
3001
3001
  larkAppId?: string | undefined;
3002
+ displayName?: string | undefined;
3002
3003
  cliId?: string | undefined;
3003
3004
  cliPathOverride?: string | undefined;
3004
3005
  workingDir?: string | undefined;
3005
- displayName?: string | undefined;
3006
3006
  }>>>;
3007
3007
  }, "strip", z.ZodTypeAny, {
3008
3008
  workflowId: string;
@@ -3017,10 +3017,10 @@ export declare const EventSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
3017
3017
  initiator: string;
3018
3018
  botSnapshots?: Record<string, {
3019
3019
  larkAppId?: string | undefined;
3020
+ displayName?: string | undefined;
3020
3021
  cliId?: string | undefined;
3021
3022
  cliPathOverride?: string | undefined;
3022
3023
  workingDir?: string | undefined;
3023
- displayName?: string | undefined;
3024
3024
  }> | undefined;
3025
3025
  }, {
3026
3026
  workflowId: string;
@@ -3035,10 +3035,10 @@ export declare const EventSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
3035
3035
  initiator: string;
3036
3036
  botSnapshots?: Record<string, {
3037
3037
  larkAppId?: string | undefined;
3038
+ displayName?: string | undefined;
3038
3039
  cliId?: string | undefined;
3039
3040
  cliPathOverride?: string | undefined;
3040
3041
  workingDir?: string | undefined;
3041
- displayName?: string | undefined;
3042
3042
  }> | undefined;
3043
3043
  }>, z.ZodObject<{
3044
3044
  ref: z.ZodString;
@@ -3076,10 +3076,10 @@ export declare const EventSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
3076
3076
  initiator: string;
3077
3077
  botSnapshots?: Record<string, {
3078
3078
  larkAppId?: string | undefined;
3079
+ displayName?: string | undefined;
3079
3080
  cliId?: string | undefined;
3080
3081
  cliPathOverride?: string | undefined;
3081
3082
  workingDir?: string | undefined;
3082
- displayName?: string | undefined;
3083
3083
  }> | undefined;
3084
3084
  } | {
3085
3085
  ref: string;
@@ -3107,10 +3107,10 @@ export declare const EventSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
3107
3107
  initiator: string;
3108
3108
  botSnapshots?: Record<string, {
3109
3109
  larkAppId?: string | undefined;
3110
+ displayName?: string | undefined;
3110
3111
  cliId?: string | undefined;
3111
3112
  cliPathOverride?: string | undefined;
3112
3113
  workingDir?: string | undefined;
3113
- displayName?: string | undefined;
3114
3114
  }> | undefined;
3115
3115
  } | {
3116
3116
  ref: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botmux",
3
- "version": "2.101.0",
3
+ "version": "2.102.0",
4
4
  "description": "Bridge between IM platforms and AI coding CLIs — one topic, one CLI session with live streaming",
5
5
  "type": "module",
6
6
  "main": "dist/index-daemon.js",
@@ -1,358 +0,0 @@
1
- import{b as ie}from"./chunk-ECXPBQ3J.js";import{a as ne}from"./chunk-76J7PNZI.js";import{m as e,n as r,p as vt,r as se,w as St}from"./chunk-MR57RUVP.js";import{a as Oe,b as oe,c as le}from"./chunk-JTSE5VP6.js";import{c as Nt}from"./chunk-7SZRL6FY.js";var Mt=Nt(Oe(),1);var S={bots:[]},V=null,Gt=[{id:"claude-code",label:"Claude"},{id:"codex",label:"Codex"},{id:"traex",label:"traex"}],re=!1,$t="glm-5.1",jt=[],K=null;function Ot(d,u){return typeof d?.cliId=="string"&&d.cliId?d.cliId:u}var z=new Map;function ce(d){let u=null;for(let m of ne.sessions.values())m.larkAppId!==d||!m.cliId||(!u||Number(m.lastMessageAt??0)>Number(u.lastMessageAt??0))&&(u=m);return u?.cliId??""}async function de(){if(!re){re=!0;try{let d=await fetch("/api/cli-options"),u=await d.json().catch(()=>({}));d.ok&&Array.isArray(u?.options)&&(Gt=u.options.filter(m=>m&&typeof m.id=="string"&&typeof m.label=="string"),typeof u.ttadkModelDefault=="string"&&u.ttadkModelDefault.trim()&&($t=u.ttadkModelDefault.trim()),Array.isArray(u.ttadkModelSuggestions)&&(jt=u.ttadkModelSuggestions.filter(m=>typeof m=="string")))}catch{}}}function Ge(d,u){let m=typeof d?.agentSelectionKey=="string"&&d.agentSelectionKey?d.agentSelectionKey:"";return m||Ot(d,u)||"claude-code"}function Lt(d){return Gt.find(u=>u.id===d)}function je(d){return d?.gateway==="ttadk"&&d.acceptsModel!==!1?jt:[]}function Je(d,u){let m=Ge(d,u),j=Gt.map(H=>`<option value="${r(H.id)}" ${H.id===m?"selected":""}>${r(H.label)}\uFF08${r(H.id)}\uFF09</option>`).join(""),J=typeof d?.model=="string"?d.model:"",X=je(Lt(m)),at=Lt(m)?.gateway==="ttadk"&&Lt(m)?.acceptsModel===!1;return`<section class="bd-section">
2
- <h3 class="bd-section-title">${e("botDefaults.sectionAgent")}</h3>
3
- <div class="bd-row">
4
- <label>
5
- <span>${e("botDefaults.agentCli")}</span>
6
- <select data-input="agentCliId">${j}</select>
7
- </label>
8
- </div>
9
- <div class="bd-row">
10
- <label>
11
- <span>${e("botDefaults.agentModel")}</span>
12
- <input type="text" data-input="agentModel" list="agent-model-suggestions-${r(d.larkAppId)}"
13
- placeholder="${r(e("botDefaults.agentModelPlaceholder"))}"
14
- value="${r(J)}" ${at?"disabled":""}>
15
- <datalist id="agent-model-suggestions-${r(d.larkAppId)}">
16
- ${X.map(H=>`<option value="${r(H)}"></option>`).join("")}
17
- </datalist>
18
- </label>
19
- <small class="bd-help">${e("botDefaults.agentHelp")}</small>
20
- <div class="actions">
21
- <button type="button" class="primary" data-action="save-agent">${e("botDefaults.agentSave")}</button>
22
- <span class="oncall-status" data-agent-status></span>
23
- </div>
24
- </div>
25
- </section>`}async function ue(){try{let d=await fetch("/api/bots"),u=await d.json().catch(()=>({}));if(!d.ok){V=u?.error?`HTTP ${d.status}: ${u.error}${u.path?` (${u.path})`:""}`:`HTTP ${d.status}`,S={bots:[]};return}if(!u||!Array.isArray(u.bots)){V="unexpected response shape (no `bots` array)",S={bots:[]};return}V=null,S=u}catch(d){V=d?.message??String(d),S={bots:[]}}}function pe(d){if(!d)return"\u2014";let u=new Date(d);return Number.isNaN(u.getTime())?"\u2014":u.toLocaleString()}function fe(d){let u=d.querySelector("#bd-list"),m=d.querySelector("#bd-roster"),j=d.querySelector("#bd-filters"),J=d.querySelector("#bd-refresh"),X=!1,at=!1;J.onclick=async()=>{J.disabled=!0;try{z.clear(),await Promise.all([ue(),de()]),U()}finally{X||(J.disabled=!1)}};let H=t=>{let a=t.target.closest(".toggle-tx small, small.bd-help");a&&(t.preventDefault(),a.classList.toggle("open"))};u.addEventListener("click",H),u.innerHTML=St(),(async()=>(await Promise.all([ue(),de()]),at=!0,U(),await se(),U()))();function be(){let a=(new FormData(j).get("q")??"").toLowerCase(),c=S.bots.filter(b=>!a||(b.botName??"").toLowerCase().includes(a)||(b.larkAppId??"").toLowerCase().includes(a));if(V){m.innerHTML="",u.innerHTML=`<p class="hint-warn">\u65E0\u6CD5\u52A0\u8F7D bot \u5217\u8868\uFF1A${r(V)}<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(c.length===0){m.innerHTML="",u.innerHTML=`<p class="empty">${e("botDefaults.empty")}</p>`;return}(!K||!c.some(b=>b.larkAppId===K))&&(K=c[0].larkAppId),m.innerHTML=c.map(me).join(""),m.querySelectorAll(".bd-roster-item").forEach(b=>{b.onclick=()=>{K=b.dataset.appid,U()}});let p=c.find(b=>b.larkAppId===K);u.innerHTML=ge(p),Ie()}function me(t){let a=t.botName??t.larkAppId,c=Ot(t,ce(t.larkAppId)),p=t.defaultOncall?.enabled?'<span class="bd-roster-flag">oncall</span>':"";return`<div class="bd-roster-item${t.larkAppId===K?" on":""}" data-appid="${r(t.larkAppId)}" role="button" tabindex="0">
26
- ${vt({name:a,larkAppId:t.larkAppId,size:"sm"})}
27
- <div class="bd-roster-tx">
28
- <b>${r(a)}</b>
29
- <span>${r(c||t.larkAppId.slice(0,14))}</span>
30
- </div>
31
- ${p}
32
- </div>`}function ge(t){if(t.error)return`<article class="bd-card bd-profile" data-appid="${r(t.larkAppId)}">
33
- <header class="bd-profile-head">
34
- ${vt({name:t.botName??t.larkAppId,larkAppId:t.larkAppId})}
35
- <div class="bd-profile-id"><strong>${r(t.botName??t.larkAppId)}</strong>
36
- <code>${r(t.larkAppId)}</code></div>
37
- </header>
38
- <p class="hint-warn-inline">\u67E5\u8BE2\u5931\u8D25\uFF1A${r(t.error)}</p>
39
- </article>`;let a=t.defaultOncall??{enabled:!1,workingDir:"",since:0},c=a.enabled?"oncall":t.defaultWorkingDir?"default":"off",p=t.defaultWorkingDir||a.workingDir||"",b=t.botName??t.larkAppId,y=Ot(t,ce(t.larkAppId));return`<article class="bd-card bd-profile" data-appid="${r(t.larkAppId)}">
40
- <header class="bd-profile-head">
41
- ${vt({name:b,larkAppId:t.larkAppId,dot:"ok"})}
42
- <div class="bd-profile-id">
43
- <strong>${r(b)}</strong>
44
- ${y?`<span class="mate-role">${r(y)}</span>`:""}
45
- <code>${r(t.larkAppId)}</code>
46
- </div>
47
- <div class="bd-profile-meta bd-meta">
48
- <small class="bd-meta-ok">\u25CF ${e("botDefaults.metaOnline")}</small>
49
- <small data-oncall-since>${e("botDefaults.lastEnabled")}: ${r(pe(a.since??0))}</small>
50
- <small>${e("botDefaults.autobound",{count:t.autoboundChatCount??0})}</small>
51
- </div>
52
- </header>
53
- <div class="bd-body bd-grid">
54
- <section class="bd-tile">
55
- ${Je(t,y)}
56
- <section class="bd-section">
57
- <h3 class="bd-section-title">${e("botDefaults.sectionWorkingDir")}</h3>
58
- <div class="bd-row">
59
- <label>
60
- <span>${e("botDefaults.workingDirMode")}</span>
61
- <select data-input="workingDirMode">
62
- <option value="off" ${c==="off"?"selected":""}>${r(e("botDefaults.workingDirModeOff"))}</option>
63
- <option value="default" ${c==="default"?"selected":""}>${r(e("botDefaults.workingDirModeDefault"))}</option>
64
- <option value="oncall" ${c==="oncall"?"selected":""}>${r(e("botDefaults.workingDirModeOncall"))}</option>
65
- </select>
66
- </label>
67
- <small class="bd-help">${e("botDefaults.workingDirModeHelp")}</small>
68
- </div>
69
- <div class="bd-row" data-wd-dir-row ${c==="off"?"hidden":""}>
70
- <label>
71
- <span>${e("botDefaults.workingDirField")}</span>
72
- <input type="text" data-input="workingDir" placeholder="e.g. /root/iserver/botmux"
73
- value="${r(p)}">
74
- </label>
75
- </div>
76
- <div class="actions">
77
- <button type="button" class="primary" data-action="save-working-dir">${e("botDefaults.save")}</button>
78
- <span class="oncall-status" data-status></span>
79
- </div>
80
- ${Te(t)}
81
- </section>
82
- ${Ce(t)}
83
- </section>
84
- <section class="bd-tile">${ye(t)}</section>
85
- <section class="bd-tile">${Le(t)}${Se(t)}${Me(t)}${De(t)}${ke(t)}${we(t)}</section>
86
- <section class="bd-tile">${ve(t)}${$e(t)}${he(t)}</section>
87
- <section class="bd-tile">${xe(t)}</section>
88
- </div>
89
- </article>`}function ye(t){let a=typeof t.teamRole=="string";return`<section class="bd-section">
90
- <h3 class="bd-section-title">${e("botDefaults.sectionRole")}</h3>
91
- <p class="bd-section-note">${e("botDefaults.roleHelp")}</p>
92
- <textarea data-input="teamRole" rows="6"
93
- placeholder="${r(e("botDefaults.rolePlaceholder"))}"
94
- style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px"${a?"":" disabled"}>${a?r(t.teamRole):""}</textarea>
95
- <div class="actions">
96
- <button type="button" class="primary" data-action="save-role"${a?"":" disabled"}>${e("botDefaults.roleSave")}</button>
97
- <button type="button" data-action="delete-role"${a?"":" disabled"}>${e("botDefaults.roleDelete")}</button>
98
- <span class="oncall-status" data-role-status></span>
99
- </div>
100
- <div class="bd-profile-roles" data-profile-roles>
101
- <h4 class="bd-subsection-title">${e("botDefaults.profileRoles")}</h4>
102
- <p class="bd-section-note">${e("botDefaults.profileRolesHelp")}</p>
103
- <div class="bd-profile-role-list" data-profile-role-list>${Jt(t.larkAppId)}</div>
104
- </div>
105
- </section>`}function Jt(t){let a=z.get(t);return!a||a.loading?St():a.error?`<p class="hint-warn-inline">${r(e("botDefaults.profileRolesLoadFailed",{error:a.error}))}</p>`:a.items.length===0?`<p class="empty">${e("botDefaults.profileRolesEmpty")}</p>`:a.items.map(c=>`
106
- <details class="bd-profile-role-entry" data-profile-id="${r(c.profileId)}">
107
- <summary><code>${r(c.profileId)}</code></summary>
108
- <div class="bd-profile-role-content" data-profile-role-body="${r(c.profileId)}">
109
- ${Ut(c)}
110
- </div>
111
- </details>
112
- `).join("")}function Ut(t){return t.loading?St():t.error?`<p class="hint-warn-inline">${r(e("botDefaults.profileRoleDetailLoadFailed",{error:t.error}))}</p>`:t.loaded?`<pre>${r(t.content??"")}</pre>`:`<p class="empty">${e("botDefaults.profileRoleClickToLoad")}</p>`}function Wt(t){return t==null?e("botDefaults.brandStateDefault"):t.trim()===""?e("botDefaults.brandStateOff"):e("botDefaults.brandStateCustom")}function he(t){let a=t.brandLabel??null;return`<section class="bd-section">
113
- <h3 class="bd-section-title">${e("botDefaults.sectionBrand")}</h3>
114
- <div class="bd-row bd-brand">
115
- <label>
116
- <span>${e("botDefaults.brandLabel")}</span>
117
- <input type="text" data-input="brandLabel"
118
- placeholder="${r(e("botDefaults.brandLabelPlaceholder"))}"
119
- value="${r(a??"")}">
120
- </label>
121
- <small data-brand-state>${r(Wt(a))}</small>
122
- <small class="bd-help">${e("botDefaults.brandLabelHelp")}</small>
123
- <div class="actions">
124
- <button type="button" class="primary" data-action="save-brand">${e("botDefaults.brandSave")}</button>
125
- <button type="button" data-action="reset-brand">${e("botDefaults.brandReset")}</button>
126
- <span class="oncall-status" data-brand-status></span>
127
- </div>
128
- </div>
129
- </section>`}function ve(t){let a=t.disableStreamingCard===!0,c=t.silentTurnReactions===!0,p=t.writableTerminalLinkInCard===!0,b=t.privateCard===!0;return`<section class="bd-section">
130
- <h3 class="bd-section-title">${e("botDefaults.sectionCard")}</h3>
131
- <label class="toggle-row">
132
- <input type="checkbox" data-action="toggle-disable-streaming" ${a?"checked":""}>
133
- <span class="switch" aria-hidden="true"></span>
134
- <span class="toggle-tx"><strong>${e("botDefaults.disableStreaming")}</strong>
135
- <small>${e("botDefaults.disableStreamingHelp")}</small></span>
136
- </label>
137
- <label class="toggle-row">
138
- <input type="checkbox" data-action="toggle-silent-reactions" ${c?"checked":""} ${a?"":"disabled"}>
139
- <span class="switch" aria-hidden="true"></span>
140
- <span class="toggle-tx"><strong>${e("botDefaults.silentTurnReactions")}</strong>
141
- <small>${e("botDefaults.silentTurnReactionsHelp")}</small></span>
142
- </label>
143
- <label class="toggle-row">
144
- <input type="checkbox" data-action="toggle-writable-link" ${p?"checked":""} ${a?"disabled":""}>
145
- <span class="switch" aria-hidden="true"></span>
146
- <span class="toggle-tx"><strong>${e("botDefaults.writableLink")}</strong>
147
- <small>${e("botDefaults.writableLinkHelp")}</small></span>
148
- </label>
149
- <label class="toggle-row">
150
- <input type="checkbox" data-action="toggle-private-card" ${b?"checked":""}>
151
- <span class="switch" aria-hidden="true"></span>
152
- <span class="toggle-tx"><strong>${e("botDefaults.privateCard")}</strong>
153
- <small>${e("botDefaults.privateCardHelp")}</small></span>
154
- </label>
155
- <div class="actions">
156
- <small data-card-pref-moot class="hint-warn-inline" ${a?"":"hidden"}>${e("botDefaults.writableLinkMoot")}</small>
157
- <span class="oncall-status" data-card-pref-status></span>
158
- </div>
159
- </section>`}function Se(t){let a=t.botToBotSameDir!==!1;return`<section class="bd-section">
160
- <h3 class="bd-section-title">${e("botDefaults.sectionCrossBot")}</h3>
161
- <label class="toggle-row">
162
- <input type="checkbox" data-action="toggle-cross-bot-samedir" ${a?"checked":""}>
163
- <span class="switch" aria-hidden="true"></span>
164
- <span class="toggle-tx"><strong>${e("botDefaults.botToBotSameDir")}</strong>
165
- <small>${e("botDefaults.botToBotSameDirHelp")}</small></span>
166
- </label>
167
- <div class="actions"><span class="oncall-status" data-crossbot-status></span></div>
168
- </section>`}function $e(t){let a=t.summaryRange??{limit:50,sinceHours:24},c=Number.isInteger(a.limit)&&a.limit>=0?a.limit:50,p=Number.isInteger(a.sinceHours)&&a.sinceHours>=0?a.sinceHours:24;return`<section class="bd-section">
169
- <h3 class="bd-section-title">${e("botDefaults.sectionSummaryTrigger")}</h3>
170
- <div class="bd-row bd-summary-limits">
171
- <label>
172
- <span>${e("botDefaults.summaryLimit")}</span>
173
- <input type="number" min="0" step="1" data-input="summaryLimit" value="${c}">
174
- </label>
175
- <label>
176
- <span>${e("botDefaults.summarySinceHours")}</span>
177
- <input type="number" min="0" step="1" data-input="summarySinceHours" value="${p}">
178
- </label>
179
- </div>
180
- <small class="bd-help">${e("botDefaults.summaryLimitHelp")}</small>
181
- <div class="actions">
182
- <button type="button" class="primary" data-action="save-summary-trigger">${e("botDefaults.summarySave")}</button>
183
- <span class="oncall-status" data-summary-trigger-status></span>
184
- </div>
185
- </section>`}function Le(t){let a=t.p2pMode==="chat"?"chat":"thread",c=t.regularGroupReplyMode==="new-topic"||t.regularGroupReplyMode==="shared"||t.regularGroupReplyMode==="chat-topic"?t.regularGroupReplyMode:"chat",p=t.regularGroupMentionMode==="topic"||t.regularGroupMentionMode==="never"||t.regularGroupMentionMode==="ambient"?t.regularGroupMentionMode:"always",b=t.docSubscribeDefaultMode==="all"?"all":"mention-only",y=(g,E)=>`<option value="${g}" ${c===g?"selected":""}>${r(E)}</option>`,h=(g,E)=>`<option value="${g}" ${p===g?"selected":""}>${r(E)}</option>`,L=(g,E)=>`<option value="${g}" ${b===g?"selected":""}>${r(E)}</option>`;return`<section class="bd-section">
186
- <h3 class="bd-section-title">${e("botDefaults.sectionSessionMode")}</h3>
187
- <div class="bd-row">
188
- <label>
189
- <span>${e("botDefaults.p2pMode")}</span>
190
- <select data-input="p2pMode">
191
- <option value="thread" ${a==="chat"?"":"selected"}>${r(e("botDefaults.p2pThread"))}</option>
192
- <option value="chat" ${a==="chat"?"selected":""}>${r(e("botDefaults.p2pChat"))}</option>
193
- </select>
194
- </label>
195
- <small class="bd-help">${e("botDefaults.p2pHelp")}</small>
196
- <div class="actions">
197
- <span class="oncall-status" data-p2p-status></span>
198
- </div>
199
- </div>
200
- <div class="bd-row">
201
- <label>
202
- <span>${e("botDefaults.regularGroupMode")}</span>
203
- <select data-input="regularGroupMode">
204
- ${y("chat",e("botDefaults.regularGroupModeChat"))}
205
- ${y("chat-topic",e("botDefaults.regularGroupModeChatTopic"))}
206
- ${y("new-topic",e("botDefaults.regularGroupModeNewTopic"))}
207
- ${y("shared",e("botDefaults.regularGroupModeShared"))}
208
- </select>
209
- </label>
210
- <small class="bd-help">${e("botDefaults.regularGroupModeHelp")}</small>
211
- <div class="actions">
212
- <span class="oncall-status" data-regular-group-status></span>
213
- </div>
214
- </div>
215
- <div class="bd-row">
216
- <label>
217
- <span>${e("botDefaults.mentionMode")}</span>
218
- <select data-input="regularGroupMentionMode">
219
- ${h("always",e("botDefaults.mentionModeAlways"))}
220
- ${h("topic",e("botDefaults.mentionModeTopic"))}
221
- ${h("never",e("botDefaults.mentionModeNever"))}
222
- ${h("ambient",e("botDefaults.mentionModeAmbient"))}
223
- </select>
224
- </label>
225
- <small class="bd-help">${e("botDefaults.mentionModeHelp")}</small>
226
- <div class="actions">
227
- <span class="oncall-status" data-mention-mode-status></span>
228
- </div>
229
- </div>
230
- <div class="bd-row">
231
- <label>
232
- <span>${e("botDefaults.docSubscribeMode")}</span>
233
- <select data-input="docSubscribeDefaultMode">
234
- ${L("mention-only",e("botDefaults.docSubscribeModeMention"))}
235
- ${L("all",e("botDefaults.docSubscribeModeAll"))}
236
- </select>
237
- </label>
238
- <small class="bd-help">${e("botDefaults.docSubscribeModeHelp")}</small>
239
- <div class="actions">
240
- <span class="oncall-status" data-doc-subscribe-mode-status></span>
241
- </div>
242
- </div>
243
- </section>`}function Qt(t){return t==null?e("botDefaults.maxLiveWorkersStateDefault"):e("botDefaults.maxLiveWorkersStateOn",{count:t})}function Me(t){let a=typeof t.maxLiveWorkers=="number"?t.maxLiveWorkers:null;return`<div class="bd-subsection">
244
- <h4 class="bd-subsection-title">${e("botDefaults.sectionSessionCap")}</h4>
245
- <div class="bd-row bd-quota">
246
- <label>
247
- <span>${e("botDefaults.maxLiveWorkers")}</span>
248
- <input type="number" min="1" step="1" data-input="maxLiveWorkers"
249
- placeholder="${r(e("botDefaults.maxLiveWorkersPlaceholder"))}"
250
- value="${a??""}">
251
- </label>
252
- <small data-session-cap-state>${r(Qt(a))}</small>
253
- <small class="bd-help">${e("botDefaults.maxLiveWorkersHelp")}</small>
254
- <div class="actions">
255
- <button type="button" class="primary" data-action="save-session-cap">${e("botDefaults.maxLiveWorkersSave")}</button>
256
- <button type="button" data-action="off-session-cap">${e("botDefaults.maxLiveWorkersOff")}</button>
257
- <span class="oncall-status" data-session-cap-status></span>
258
- </div>
259
- </div>
260
- </div>`}function De(t){let a=typeof t.startupCommands=="string"?t.startupCommands:"";return`<div class="bd-subsection">
261
- <h4 class="bd-subsection-title">${e("botDefaults.sectionStartupCommands")}</h4>
262
- <p class="bd-section-note">${e("botDefaults.startupCommandsHelp")}</p>
263
- <textarea data-input="startupCommands" rows="3"
264
- placeholder="${r(e("botDefaults.startupCommandsPlaceholder"))}"
265
- style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px">${r(a)}</textarea>
266
- <div class="actions">
267
- <button type="button" class="primary" data-action="save-startup-commands">${e("botDefaults.startupCommandsSave")}</button>
268
- <span class="oncall-status" data-startup-commands-status></span>
269
- </div>
270
- </div>`}function ke(t){let a=typeof t.launchShell=="string"?t.launchShell:"";return`<div class="bd-subsection">
271
- <h4 class="bd-subsection-title">${e("botDefaults.sectionLaunchShell")}</h4>
272
- <p class="bd-section-note">${e("botDefaults.launchShellHelp")}</p>
273
- <input type="text" data-input="launchShell"
274
- placeholder="${r(e("botDefaults.launchShellPlaceholder"))}"
275
- value="${r(a)}"
276
- style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px">
277
- <div class="actions">
278
- <button type="button" class="primary" data-action="save-launch-shell">${e("botDefaults.launchShellSave")}</button>
279
- <span class="oncall-status" data-launch-shell-status></span>
280
- </div>
281
- </div>`}function we(t){let a=typeof t.env=="string"?t.env:"";return`<div class="bd-subsection">
282
- <h4 class="bd-subsection-title">${e("botDefaults.sectionEnv")}</h4>
283
- <p class="bd-section-note">${e("botDefaults.envHelp")}</p>
284
- <textarea data-input="env" rows="5"
285
- placeholder="${r(e("botDefaults.envPlaceholder"))}"
286
- style="width:100%;box-sizing:border-box;font:13px/1.5 ui-monospace,Menlo,monospace;padding:10px">${r(a)}</textarea>
287
- <div class="actions">
288
- <button type="button" class="primary" data-action="save-env">${e("botDefaults.envSave")}</button>
289
- <span class="oncall-status" data-env-status></span>
290
- </div>
291
- </div>`}function Ce(t){let a=t.sandbox===!0;return`<section class="bd-section">
292
- <h3 class="bd-section-title">${e("botDefaults.sectionSandbox")}</h3>
293
- <label class="toggle-row">
294
- <input type="checkbox" data-action="toggle-sandbox" ${a?"checked":""}>
295
- <span class="switch" aria-hidden="true"></span>
296
- <span class="toggle-tx"><strong>${e("botDefaults.sandboxToggle")}</strong>
297
- <small>${e("botDefaults.sandboxHelp")}</small></span>
298
- </label>
299
- <div class="actions">
300
- <span class="oncall-status" data-sandbox-status></span>
301
- </div>
302
- </section>`}function Ft(t){return t==null?e("botDefaults.quotaStateOff"):e("botDefaults.quotaStateOn",{count:t})}function xe(t){let a=t.restrictGrantCommands===!0,c=t.autoGrantRequestCards!==!1,p=typeof t.messageQuotaDefaultLimit=="number"?t.messageQuotaDefaultLimit:null;return`<section class="bd-section">
303
- <h3 class="bd-section-title">${e("botDefaults.sectionGrant")}</h3>
304
- <label class="toggle-row">
305
- <input type="checkbox" data-action="toggle-auto-grant-card" ${c?"checked":""}>
306
- <span class="switch" aria-hidden="true"></span>
307
- <span class="toggle-tx"><strong>${e("botDefaults.autoGrantCard")}</strong>
308
- <small>${e("botDefaults.autoGrantCardHelp")}</small></span>
309
- </label>
310
- <label class="toggle-row">
311
- <input type="checkbox" data-action="toggle-restrict-grant" ${a?"checked":""}>
312
- <span class="switch" aria-hidden="true"></span>
313
- <span class="toggle-tx"><strong>${e("botDefaults.restrictGrant")}</strong>
314
- <small>${e("botDefaults.restrictGrantHelp")}</small></span>
315
- </label>
316
- <div class="bd-row bd-quota">
317
- <label>
318
- <span>${e("botDefaults.quotaDefault")}</span>
319
- <input type="number" min="1" step="1" data-input="quotaLimit"
320
- placeholder="${r(e("botDefaults.quotaPlaceholder"))}"
321
- value="${p??""}">
322
- </label>
323
- <small data-quota-state>${r(Ft(p))}</small>
324
- <small class="bd-help">${e("botDefaults.quotaHelp")}</small>
325
- <div class="actions">
326
- <button type="button" class="primary" data-action="save-quota">${e("botDefaults.quotaSave")}</button>
327
- <button type="button" data-action="off-quota">${e("botDefaults.quotaOff")}</button>
328
- <span class="oncall-status" data-grant-status></span>
329
- </div>
330
- </div>
331
- </section>`}function Te(t){let a=t.autoStartOnGroupJoin===!0,c=t.autoStartOnNewTopic===!0,p=typeof t.autoStartOnGroupJoinPrompt=="string"?t.autoStartOnGroupJoinPrompt:"";return`<div class="bd-subsection">
332
- <h4 class="bd-subsection-title">${e("botDefaults.sectionAutoStart")}</h4>
333
- <label class="toggle-row">
334
- <input type="checkbox" data-action="toggle-auto-join" ${a?"checked":""}>
335
- <span class="switch" aria-hidden="true"></span>
336
- <span class="toggle-tx"><strong>${e("botDefaults.autoStartJoin")}</strong>
337
- <small>${e("botDefaults.autoStartJoinHelp")}</small></span>
338
- </label>
339
- <div class="bd-row">
340
- <label>
341
- <span>${e("botDefaults.autoStartJoinPrompt")}</span>
342
- <textarea data-input="autoJoinPrompt" rows="3"
343
- placeholder="${r(e("botDefaults.autoStartJoinPromptPlaceholder"))}">${r(p)}</textarea>
344
- </label>
345
- <div class="actions">
346
- <button type="button" class="primary" data-action="save-auto-join-prompt">${e("botDefaults.autoStartJoinPromptSave")}</button>
347
- </div>
348
- </div>
349
- <label class="toggle-row">
350
- <input type="checkbox" data-action="toggle-auto-topic" ${c?"checked":""}>
351
- <span class="switch" aria-hidden="true"></span>
352
- <span class="toggle-tx"><strong>${e("botDefaults.autoStartTopic")}</strong>
353
- <small>${e("botDefaults.autoStartTopicHelp")}</small></span>
354
- </label>
355
- <div class="actions">
356
- <span class="oncall-status" data-auto-start-status></span>
357
- </div>
358
- </div>`}function Kt(t){return u.querySelector(`.bd-card[data-appid="${CSS.escape(t)}"]`)}function Dt(t,a){let c=t?.querySelector("[data-profile-role-list]");c&&(c.innerHTML=Jt(a),He(t,a))}async function Ee(t,a){let c=z.get(t);if(c?.loaded||c?.loading){Dt(a,t);return}c={loaded:!1,loading:!0,items:[]},z.set(t,c),Dt(a,t);try{let p=await fetch("/api/role-profiles"),b=await p.json().catch(()=>({}));if(!p.ok)throw new Error(b?.error??String(p.status));let y=Array.isArray(b.profiles)?b.profiles:[];c.items=y.filter(h=>(h.botEntries??[]).some(L=>L?.larkAppId===t&&L?.hasEntry)).map(h=>({profileId:String(h.profileId)})),c.loaded=!0}catch(p){c.error=p?.message??String(p),c.loaded=!0}finally{c.loading=!1,Dt(Kt(t),t)}}function He(t,a){t.querySelectorAll("details.bd-profile-role-entry[data-profile-id]").forEach(c=>{c.addEventListener("toggle",()=>{if(!c.open)return;let p=c.dataset.profileId;p&&qe(a,p)})})}async function qe(t,a){let p=z.get(t)?.items.find(b=>b.profileId===a);if(!(!p||p.loaded||p.loading)){p.loading=!0,zt(t,a);try{let b=await fetch(`/api/role-profiles/${encodeURIComponent(a)}/${encodeURIComponent(t)}`),y=await b.json().catch(()=>({}));if(!b.ok)throw new Error(y?.error??String(b.status));p.content=y?.hasEntry?String(y.content??""):"",p.loaded=!0}catch(b){p.error=b?.message??String(b)}finally{p.loading=!1,zt(t,a)}}}function zt(t,a){let p=z.get(t)?.items.find(y=>y.profileId===a);if(!p)return;let b=Kt(t)?.querySelector(`[data-profile-role-body="${CSS.escape(a)}"]`);b&&(b.innerHTML=Ut(p))}function Ie(){u.querySelectorAll(".bd-card").forEach(t=>{let a=t.dataset.appid;Ee(a,t);let c=t.querySelector("select[data-input=workingDirMode]"),p=t.querySelector("input[data-input=workingDir]"),b=t.querySelector("[data-wd-dir-row]"),y=t.querySelector("button[data-action=save-working-dir]"),h=t.querySelector("[data-status]");if(!c||!p||!y||!h)return;let L=t.querySelector("select[data-input=agentCliId]"),g=t.querySelector("input[data-input=agentModel]"),E=t.querySelector("button[data-action=save-agent]"),q=t.querySelector("[data-agent-status]");function Vt(){if(!L||!g)return;let n=t.querySelector(`#agent-model-suggestions-${CSS.escape(a)}`),o=Lt(L.value),s=o?.gateway==="ttadk",i=s&&o.acceptsModel!==!1;if(s&&!i){n&&(n.innerHTML=""),g.value="",g.disabled=!0,g.placeholder=e("botOnboarding.modelTtadkCocoPlaceholder");return}g.disabled=!1,i?(n&&(n.innerHTML=jt.map(l=>`<option value="${r(l)}"></option>`).join("")),g.placeholder=e("botOnboarding.modelTtadkPlaceholder").replace("{model}",$t),g.value.trim()||(g.value=$t)):(n&&(n.innerHTML=""),g.placeholder=e("botDefaults.agentModelPlaceholder"),g.value.trim()===$t&&(g.value=""))}L&&g&&E&&q&&(L.addEventListener("change",Vt),E.addEventListener("click",async()=>{q.textContent="",q.className="oncall-status",E.disabled=!0,L.disabled=!0,g.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/agent`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({cliId:L.value,model:g.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){q.textContent=`\u2713 ${e("botDefaults.agentSaved")}`,q.classList.add("hint-ok");let s=S.bots.find(i=>i.larkAppId===a);s&&(s.cliId=o.cliId,s.wrapperCli=o.wrapperCli??null,s.model=o.model??"",s.agentSelectionKey=o.selectionKey??L.value)}else q.textContent=`\u2717 ${o.error??n.status}`,q.classList.add("hint-warn-inline")}catch(n){q.textContent=`\u2717 ${n?.message??n}`,q.classList.add("hint-warn-inline")}finally{E.disabled=!1,L.disabled=!1,g.disabled=!1,Vt()}})),c.addEventListener("change",()=>{let n=c.value==="off";b&&(b.hidden=n),n||p.focus()}),y.addEventListener("click",async()=>{h.textContent="",h.className="oncall-status";let n=c.value,o=p.value.trim();if(n!=="off"&&!o){h.textContent=e("botDefaults.required"),h.classList.add("hint-warn-inline");return}y.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/working-dir-mode`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({mode:n,workingDir:o})}),i=await s.json().catch(()=>({}));if(s.ok&&i.ok){let l=i.resolvedPath?` \u2192 ${i.resolvedPath}`:"";h.textContent=`\u2713 ${e("botDefaults.workingDirSaved")}${l}`,h.classList.add("hint-ok");let f=S.bots.find(T=>T.larkAppId===a);f&&(i.defaultOncall&&(f.defaultOncall=i.defaultOncall),f.defaultWorkingDir=i.defaultWorkingDir??null);let v=t.querySelector("[data-oncall-since]");v&&i.defaultOncall?.since!=null&&(v.textContent=`${e("botDefaults.lastEnabled")}: ${pe(i.defaultOncall.since)}`)}else h.textContent=`\u2717 ${i.error??s.status}`,h.classList.add("hint-warn-inline")}catch(s){h.textContent=`\u2717 ${s?.message??s}`,h.classList.add("hint-warn-inline")}finally{y.disabled=!1}});let nt=t.querySelector("input[data-input=brandLabel]"),kt=t.querySelector("button[data-action=save-brand]"),wt=t.querySelector("button[data-action=reset-brand]"),I=t.querySelector("[data-brand-status]"),Xt=t.querySelector("[data-brand-state]");async function Yt(n,o){if(I){I.textContent="",I.className="oncall-status",o.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/brand-label`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({brandLabel:n})}),i=await s.json().catch(()=>({}));if(s.ok&&i.ok){let l=i.brandLabel??null;I.textContent="\u2713",I.classList.add("hint-ok"),nt&&(nt.value=l??""),Xt&&(Xt.textContent=Wt(l));let f=S.bots.find(v=>v.larkAppId===a);f&&(f.brandLabel=l)}else I.textContent=`\u2717 ${i.error??s.status}`,I.classList.add("hint-warn-inline")}catch(s){I.textContent=`\u2717 ${s?.message??s}`,I.classList.add("hint-warn-inline")}finally{o.disabled=!1}}}nt&&kt&&kt.addEventListener("click",()=>Yt(nt.value,kt)),wt&&wt.addEventListener("click",()=>Yt(null,wt));let W=t.querySelector("input[data-action=toggle-disable-streaming]"),N=t.querySelector("input[data-action=toggle-silent-reactions]"),O=t.querySelector("input[data-action=toggle-writable-link]"),st=t.querySelector("input[data-action=toggle-private-card]"),Re=t.querySelector("[data-card-pref-status]"),Zt=t.querySelector("[data-card-pref-moot]");async function C(n,o,s=Re){if(s){s.textContent="",s.className="oncall-status",o.disabled=!0;try{let i=await fetch(`/api/bots/${encodeURIComponent(a)}/card-prefs`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(n)}),l=await i.json().catch(()=>({}));if(i.ok&&l.ok){s.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,s.classList.add("hint-ok");let f=S.bots.find(v=>v.larkAppId===a);f&&(f.disableStreamingCard=l.disableStreamingCard,f.silentTurnReactions=l.silentTurnReactions,f.writableTerminalLinkInCard=l.writableTerminalLinkInCard,f.privateCard=l.privateCard,f.botToBotSameDir=l.botToBotSameDir,f.autoStartOnGroupJoin=l.autoStartOnGroupJoin,f.autoStartOnGroupJoinPrompt=l.autoStartOnGroupJoinPrompt,f.autoStartOnNewTopic=l.autoStartOnNewTopic,f.regularGroupReplyMode=l.regularGroupReplyMode,f.regularGroupMentionMode=l.regularGroupMentionMode,f.docSubscribeDefaultMode=l.docSubscribeDefaultMode)}else s.textContent=`\u2717 ${l.error??i.status}`,s.classList.add("hint-warn-inline")}catch(i){s.textContent=`\u2717 ${i?.message??i}`,s.classList.add("hint-warn-inline")}finally{o===O?o.disabled=!!W?.checked:o===N?o.disabled=!W?.checked:o.disabled=!1}}}W&&W.addEventListener("change",()=>{let n=W.checked;O&&(O.disabled=n),N&&(N.disabled=!n),Zt&&(Zt.hidden=!n),C({disableStreamingCard:n},W)}),N&&N.addEventListener("change",()=>{C({silentTurnReactions:N.checked},N)}),O&&O.addEventListener("change",()=>{C({writableTerminalLinkInCard:O.checked},O)}),st&&st.addEventListener("change",()=>{C({privateCard:st.checked},st)});let ot=t.querySelector("input[data-action=toggle-cross-bot-samedir]"),Pe=t.querySelector("[data-crossbot-status]");ot&&ot.addEventListener("change",()=>{C({botToBotSameDir:ot.checked},ot,Pe)});let Ct=t.querySelector("input[data-input=summaryLimit]"),xt=t.querySelector("input[data-input=summarySinceHours]"),lt=t.querySelector("button[data-action=save-summary-trigger]"),x=t.querySelector("[data-summary-trigger-status]");function _t(n,o){let s=n.value.trim();return s===""?o:/^(0|[1-9]\d*)$/.test(s)?Number(s):null}Ct&&xt&&lt&&lt.addEventListener("click",async()=>{if(!x)return;x.textContent="",x.className="oncall-status";let n=_t(Ct,50),o=_t(xt,24);if(n==null||o==null){x.textContent=`\u2717 ${e("botDefaults.summaryNumberInvalid")}`,x.classList.add("hint-warn-inline");return}lt.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/summary-range`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({limit:n,sinceHours:o})}),i=await s.json().catch(()=>({}));if(s.ok&&i.ok){x.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,x.classList.add("hint-ok");let l=i.summaryRange??{limit:n,sinceHours:o};Ct.value=String(Number.isInteger(l.limit)&&l.limit>=0?l.limit:n),xt.value=String(Number.isInteger(l.sinceHours)&&l.sinceHours>=0?l.sinceHours:o);let f=S.bots.find(v=>v.larkAppId===a);f&&(f.summaryRange=l)}else x.textContent=`\u2717 ${i.error??s.status}`,x.classList.add("hint-warn-inline")}catch(s){x.textContent=`\u2717 ${s?.message??s}`,x.classList.add("hint-warn-inline")}finally{lt.disabled=!1}});let G=t.querySelector("input[data-action=toggle-sandbox]"),D=t.querySelector("[data-sandbox-status]");G&&G.addEventListener("change",async()=>{let n=G.checked;D&&(D.textContent="",D.className="oncall-status"),G.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){D&&(D.textContent=`\u2713 ${e("botDefaults.sandboxSaved")}`,D.classList.add("hint-ok"));let i=S.bots.find(l=>l.larkAppId===a);i&&(i.sandbox=s.sandbox===!0)}else D&&(D.textContent=`\u2717 ${s.error??o.status}`,D.classList.add("hint-warn-inline")),G.checked=!n}catch(o){D&&(D.textContent=`\u2717 ${o?.message??o}`,D.classList.add("hint-warn-inline")),G.checked=!n}finally{G.disabled=!1}});let it=t.querySelector("input[data-action=toggle-auto-join]"),rt=t.querySelector("input[data-action=toggle-auto-topic]"),te=t.querySelector("textarea[data-input=autoJoinPrompt]"),Tt=t.querySelector("button[data-action=save-auto-join-prompt]"),Et=t.querySelector("[data-auto-start-status]");it&&it.addEventListener("change",()=>{C({autoStartOnGroupJoin:it.checked},it,Et)}),rt&&rt.addEventListener("change",()=>{C({autoStartOnNewTopic:rt.checked},rt,Et)}),te&&Tt&&Tt.addEventListener("click",()=>{C({autoStartOnGroupJoinPrompt:te.value},Tt,Et)});let Y=t.querySelector("select[data-input=p2pMode]"),R=t.querySelector("[data-p2p-status]");Y&&R&&Y.addEventListener("change",async()=>{let n=Y.value==="chat"?"chat":"thread";R.textContent="",R.className="oncall-status",Y.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){R.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,R.classList.add("hint-ok");let i=S.bots.find(l=>l.larkAppId===a);i&&(i.p2pMode=s.p2pMode==="chat"?"chat":"thread")}else R.textContent=`\u2717 ${s.error??o.status}`,R.classList.add("hint-warn-inline")}catch(o){R.textContent=`\u2717 ${o?.message??o}`,R.classList.add("hint-warn-inline")}finally{Y.disabled=!1}});let ct=t.querySelector("select[data-input=regularGroupMode]"),Ae=t.querySelector("[data-regular-group-status]");ct&&ct.addEventListener("change",()=>{C({regularGroupReplyMode:ct.value},ct,Ae)});let dt=t.querySelector("select[data-input=regularGroupMentionMode]"),Be=t.querySelector("[data-mention-mode-status]");dt&&dt.addEventListener("change",()=>{C({regularGroupMentionMode:dt.value},dt,Be)});let ut=t.querySelector("select[data-input=docSubscribeDefaultMode]"),Ne=t.querySelector("[data-doc-subscribe-mode-status]");ut&&ut.addEventListener("change",()=>{C({docSubscribeDefaultMode:ut.value},ut,Ne)});let Ht=t.querySelector("textarea[data-input=teamRole]"),Z=t.querySelector("button[data-action=save-role]"),_=t.querySelector("button[data-action=delete-role]"),M=t.querySelector("[data-role-status]");if(Ht&&Z&&_&&M){let s=function(l){let f=u.querySelector(`.bd-card[data-appid="${CSS.escape(a)}"]`);if(!f)return;let v=f.querySelector("textarea[data-input=teamRole]"),T=f.querySelector("button[data-action=save-role]"),et=f.querySelector("button[data-action=delete-role]");v&&(v.value=l,v.disabled=!1),T&&(T.disabled=!1),et&&(et.disabled=!1)};var We=s;let n=`/api/team/local-bots/${encodeURIComponent(a)}/role`,o=S.bots.find(l=>l.larkAppId===a);o&&typeof o.teamRole!="string"&&!o.teamRoleLoading&&(o.teamRoleLoading=!0,(async()=>{try{let l=await fetch(n),f=await l.json().catch(()=>({}));l.ok&&f.ok?(o.teamRole=f.role??"",s(o.teamRole)):(M.textContent=`\u2717 ${e("botDefaults.roleLoadErr")}: ${f.error??l.status}`,M.classList.add("hint-warn-inline"))}catch(l){M.textContent=`\u2717 ${e("botDefaults.roleLoadErr")}: ${l?.message??l}`,M.classList.add("hint-warn-inline")}finally{o.teamRoleLoading=!1}})());async function i(l,f,v){if(M&&!(!o||typeof o.teamRole!="string")){M.textContent="",M.className="oncall-status",Z.disabled=!0,_.disabled=!0;try{let T=await fetch(n,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({role:l})}),et=await T.json().catch(()=>({}));T.ok&&et.ok?(o&&(o.teamRole=l.trim()),M.textContent=`\u2713 ${v?e("botDefaults.roleDeleted"):e("botDefaults.roleSaved")}`,M.classList.add("hint-ok")):(M.textContent=`\u2717 ${et.error??T.status}`,M.classList.add("hint-warn-inline"))}catch(T){M.textContent=`\u2717 ${T?.message??T}`,M.classList.add("hint-warn-inline")}finally{Z.disabled=!1,_.disabled=!1}}}Z.addEventListener("click",()=>i(Ht.value,Z,!1)),_.addEventListener("click",()=>{Ht.value="",i("",_,!0)})}let pt=t.querySelector("input[data-action=toggle-auto-grant-card]"),ft=t.querySelector("input[data-action=toggle-restrict-grant]"),Q=t.querySelector("input[data-input=quotaLimit]"),bt=t.querySelector("button[data-action=save-quota]"),qt=t.querySelector("button[data-action=off-quota]"),k=t.querySelector("[data-grant-status]"),ee=t.querySelector("[data-quota-state]");async function tt(n,o){if(k){k.textContent="",k.className="oncall-status",o.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/grant-prefs`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(n)}),i=await s.json().catch(()=>({}));if(s.ok&&i.ok){k.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,k.classList.add("hint-ok");let l=typeof i.messageQuotaDefaultLimit=="number"?i.messageQuotaDefaultLimit:null,f=S.bots.find(v=>v.larkAppId===a);f&&(f.autoGrantRequestCards=i.autoGrantRequestCards!==!1,f.restrictGrantCommands=i.restrictGrantCommands===!0,f.messageQuotaDefaultLimit=l),ee&&(ee.textContent=Ft(l)),Q&&"messageQuotaDefaultLimit"in n&&(Q.value=l==null?"":String(l))}else k.textContent=`\u2717 ${i.error??s.status}`,k.classList.add("hint-warn-inline")}catch(s){k.textContent=`\u2717 ${s?.message??s}`,k.classList.add("hint-warn-inline")}finally{o.disabled=!1}}}pt&&pt.addEventListener("change",()=>{tt({autoGrantRequestCards:pt.checked},pt)}),ft&&ft.addEventListener("change",()=>{tt({restrictGrantCommands:ft.checked},ft)}),Q&&bt&&bt.addEventListener("click",()=>{let n=Q.value.trim();if(n===""){tt({messageQuotaDefaultLimit:null},bt);return}if(!/^[1-9]\d*$/.test(n)){k&&(k.textContent=`\u2717 ${e("botDefaults.quotaInvalid")}`,k.className="oncall-status hint-warn-inline");return}tt({messageQuotaDefaultLimit:Number(n)},bt)}),Q&&qt&&qt.addEventListener("click",()=>{Q.value="",tt({messageQuotaDefaultLimit:null},qt)});let F=t.querySelector("input[data-input=maxLiveWorkers]"),mt=t.querySelector("button[data-action=save-session-cap]"),It=t.querySelector("button[data-action=off-session-cap]"),w=t.querySelector("[data-session-cap-status]"),ae=t.querySelector("[data-session-cap-state]");async function Rt(n,o){if(w){w.textContent="",w.className="oncall-status",o.disabled=!0;try{let s=await fetch(`/api/bots/${encodeURIComponent(a)}/max-live-workers`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({maxLiveWorkers:n})}),i=await s.json().catch(()=>({}));if(s.ok&&i.ok){w.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,w.classList.add("hint-ok");let l=typeof i.maxLiveWorkers=="number"?i.maxLiveWorkers:null,f=S.bots.find(v=>v.larkAppId===a);f&&(f.maxLiveWorkers=l),ae&&(ae.textContent=Qt(l)),F&&(F.value=l==null?"":String(l))}else w.textContent=`\u2717 ${i.error??s.status}`,w.classList.add("hint-warn-inline")}catch(s){w.textContent=`\u2717 ${s?.message??s}`,w.classList.add("hint-warn-inline")}finally{o.disabled=!1}}}F&&mt&&mt.addEventListener("click",()=>{let n=F.value.trim();if(n===""){Rt(null,mt);return}if(!/^[1-9]\d*$/.test(n)){w&&(w.textContent=`\u2717 ${e("botDefaults.maxLiveWorkersInvalid")}`,w.className="oncall-status hint-warn-inline");return}Rt(Number(n),mt)}),F&&It&&It.addEventListener("click",()=>{F.value="",Rt(null,It)});let Pt=t.querySelector("textarea[data-input=startupCommands]"),gt=t.querySelector("button[data-action=save-startup-commands]"),P=t.querySelector("[data-startup-commands-status]");Pt&&gt&&gt.addEventListener("click",async()=>{if(P){P.textContent="",P.className="oncall-status",gt.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/startup-commands`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({startupCommands:Pt.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){P.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,P.classList.add("hint-ok");let s=typeof o.startupCommands=="string"?o.startupCommands:"";Pt.value=s;let i=S.bots.find(l=>l.larkAppId===a);i&&(i.startupCommands=s)}else P.textContent=`\u2717 ${o.error??n.status}`,P.classList.add("hint-warn-inline")}catch(n){P.textContent=`\u2717 ${n?.message??n}`,P.classList.add("hint-warn-inline")}finally{gt.disabled=!1}}});let At=t.querySelector("input[data-input=launchShell]"),yt=t.querySelector("button[data-action=save-launch-shell]"),A=t.querySelector("[data-launch-shell-status]");At&&yt&&yt.addEventListener("click",async()=>{if(A){A.textContent="",A.className="oncall-status",yt.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/launch-shell`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({launchShell:At.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){A.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,A.classList.add("hint-ok");let s=typeof o.launchShell=="string"?o.launchShell:"";At.value=s;let i=S.bots.find(l=>l.larkAppId===a);i&&(i.launchShell=s)}else A.textContent=`\u2717 ${o.error??n.status}`,A.classList.add("hint-warn-inline")}catch(n){A.textContent=`\u2717 ${n?.message??n}`,A.classList.add("hint-warn-inline")}finally{yt.disabled=!1}}});let Bt=t.querySelector("textarea[data-input=env]"),ht=t.querySelector("button[data-action=save-env]"),B=t.querySelector("[data-env-status]");Bt&&ht&&ht.addEventListener("click",async()=>{if(B){B.textContent="",B.className="oncall-status",ht.disabled=!0;try{let n=await fetch(`/api/bots/${encodeURIComponent(a)}/env`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({env:Bt.value})}),o=await n.json().catch(()=>({}));if(n.ok&&o.ok){B.textContent=`\u2713 ${e("botDefaults.cardPrefSaved")}`,B.classList.add("hint-ok");let s=typeof o.env=="string"?o.env:"";Bt.value=s;let i=S.bots.find(l=>l.larkAppId===a);i&&(i.env=s)}else B.textContent=`\u2717 ${o.error??n.status}`,B.classList.add("hint-warn-inline")}catch(n){B.textContent=`\u2717 ${n?.message??n}`,B.classList.add("hint-warn-inline")}finally{ht.disabled=!1}}})})}function U(){!X&&at&&be()}return j.addEventListener("input",U),()=>{X=!0,J.onclick=null,j.removeEventListener("input",U),u.removeEventListener("click",H),m.replaceChildren(),u.replaceChildren()}}var $=Nt(le(),1);function Ue(){let d=ie(),u=(0,Mt.useRef)(null);return(0,Mt.useEffect)(()=>{if(u.current)return fe(u.current)},[]),(0,$.jsxs)("section",{className:"page",ref:u,children:[(0,$.jsx)("div",{className:"page-heading",children:(0,$.jsxs)("div",{children:[(0,$.jsx)("p",{className:"eyebrow",children:d("nav.botDefaults")}),(0,$.jsx)("h1",{children:d("botDefaults.title")}),(0,$.jsx)("p",{children:d("botDefaults.subtitle")})]})}),(0,$.jsxs)("form",{id:"bd-filters",className:"filters sessions-filters",children:[(0,$.jsx)("input",{type:"search",name:"q",placeholder:d("botDefaults.search")}),(0,$.jsx)("button",{type:"button",id:"bd-refresh",children:d("botDefaults.refresh")})]}),(0,$.jsxs)("div",{className:"bd-layout",children:[(0,$.jsx)("aside",{id:"bd-roster",className:"bd-roster"}),(0,$.jsx)("div",{id:"bd-list",className:"bd-detail"})]})]})}function Ye(d){return oe(d,(0,$.jsx)(Ue,{}))}export{Ye as renderBotDefaultsPage};