botmux 2.96.0 → 2.97.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.
- package/dist/adapters/backend/session-backend-selector.d.ts +32 -0
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
- package/dist/adapters/backend/session-backend-selector.js +41 -0
- package/dist/adapters/backend/session-backend-selector.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +5 -0
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +32 -6
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +18 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +38 -8
- package/dist/config.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +6 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/persistent-backend.d.ts +18 -5
- package/dist/core/persistent-backend.d.ts.map +1 -1
- package/dist/core/persistent-backend.js +21 -10
- package/dist/core/persistent-backend.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +11 -0
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +2 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +6 -0
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +6 -0
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/settings.d.ts.map +1 -1
- package/dist/dashboard/web/settings.js +10 -0
- package/dist/dashboard/web/settings.js.map +1 -1
- package/dist/dashboard-web/app.js +51 -42
- package/dist/dashboard.js +1 -0
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +4 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +2 -0
- package/dist/global-config.js.map +1 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +109 -0
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +20 -5
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/platform/bind.d.ts.map +1 -1
- package/dist/platform/bind.js +6 -1
- package/dist/platform/bind.js.map +1 -1
- package/dist/platform/tunnel-client.d.ts.map +1 -1
- package/dist/platform/tunnel-client.js +7 -2
- package/dist/platform/tunnel-client.js.map +1 -1
- package/dist/services/seen-message-store.d.ts +12 -0
- package/dist/services/seen-message-store.d.ts.map +1 -0
- package/dist/services/seen-message-store.js +119 -0
- package/dist/services/seen-message-store.js.map +1 -0
- package/dist/setup/ensure-tmux.d.ts +9 -0
- package/dist/setup/ensure-tmux.d.ts.map +1 -1
- package/dist/setup/ensure-tmux.js +7 -2
- package/dist/setup/ensure-tmux.js.map +1 -1
- package/dist/setup/ensure-zellij.d.ts.map +1 -1
- package/dist/setup/ensure-zellij.js +4 -3
- package/dist/setup/ensure-zellij.js.map +1 -1
- package/dist/setup/index.d.ts +25 -0
- package/dist/setup/index.d.ts.map +1 -1
- package/dist/setup/index.js +52 -8
- package/dist/setup/index.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/worker.js +89 -23
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var xd=Object.defineProperty;var no=(e,t)=>{for(var n in t)xd(e,n,{get:t[n],enumerable:!0})};var da=class{sessions=new Map;schedules=new Map;online=!0;listeners=new Set;upsertSessions(t){for(let n of t)this.sessions.set(n.sessionId,n);this.emit()}upsertSchedules(t){for(let n of t)this.schedules.set(n.id,n);this.emit()}applySse(t,n){if(t==="session.spawned")this.sessions.set(n.session.sessionId,n.session);else if(t==="session.update"){let a=this.sessions.get(n.sessionId);a&&this.sessions.set(n.sessionId,{...a,...n.patch})}else if(t==="session.exited"){let a=this.sessions.get(n.sessionId);a&&this.sessions.set(n.sessionId,{...a,status:"closed"})}else if(t==="schedule.created")this.schedules.set(n.schedule.id,n.schedule);else if(t==="schedule.updated"){let a=this.schedules.get(n.id);a&&this.schedules.set(n.id,{...a,...n.patch})}else if(t==="schedule.deleted")this.schedules.delete(n.id);else return;this.emit()}setOnline(t){this.online!==t&&(this.online=t,this.emit())}on(t){return this.listeners.add(t),()=>this.listeners.delete(t)}emit(){for(let t of this.listeners)t()}},ke=new da;async function Hr(){let[e,t]=await Promise.all([fetch("/api/sessions").then(o=>o.json()),fetch("/api/schedules").then(o=>o.json())]);ke.upsertSessions(e.sessions??[]),ke.upsertSchedules(t.schedules??[]);let n=new EventSource("/events"),a=["session.spawned","session.update","session.exited","schedule.created","schedule.updated","schedule.deleted","schedule.fired","heartbeat"];for(let o of a)n.addEventListener(o,i=>{try{let r=JSON.parse(i.data);ke.applySse(o,r.body??r)}catch{}});n.onerror=()=>ke.setOnline(!1),n.onopen=()=>ke.setOnline(!0)}var pa="botmux.dashboard.locale",Sd={"app.name":"botmux","app.subtitle":"\u98DE\u4E66 AI CLI \u63A7\u5236\u53F0","time.secondsAgo":"{value} \u79D2\u524D","time.minutesAgo":"{value} \u5206\u949F\u524D","time.hoursAgo":"{value} \u5C0F\u65F6\u524D","nav.overview":"\u603B\u89C8","nav.sessions":"\u4F1A\u8BDD","nav.sidebarCollapse":"\u6536\u8D77\u83DC\u5355\u680F","nav.sidebarExpand":"\u5C55\u5F00\u83DC\u5355\u680F","nav.groups":"\u7FA4\u7EC4","nav.schedules":"\u5B9A\u65F6","nav.settings":"\u8BBE\u7F6E","nav.botDefaults":"Bot \u914D\u7F6E","nav.skills":"Skills","status.live":"\u5B9E\u65F6\u8FDE\u63A5","status.disconnected":"\u8FDE\u63A5\u65AD\u5F00","status.system":"\u7CFB\u7EDF","status.light":"\u6D45\u8272","status.dark":"\u6697\u9ED1","status.language":"\u8BED\u8A00","status.theme":"\u4E3B\u9898","theme.base":"\u57FA\u7840","theme.skins":"\u4E3B\u9898\u76AE\u80A4","skin.cyber":"2077","skin.genshin":"\u539F\u795E","skin.fallout":"Fallout","skin.prts":"PRTS","skin.bluearchive":"\u851A\u84DD\u6863\u6848","skin.zzz":"\u7EDD\u533A\u96F6","skin.dragonball":"\u4E03\u9F99\u73E0","skin.ikun":"ikun","botOnboarding.add":"\u6DFB\u52A0\u673A\u5668\u4EBA","botOnboarding.title":"\u6DFB\u52A0\u673A\u5668\u4EBA","botOnboarding.intro":"\u9009\u62E9 CLI \u4E0E\u5DE5\u4F5C\u76EE\u5F55\uFF0C\u626B\u7801\u521B\u5EFA PersonalAgent \u5E94\u7528\u540E\u5199\u5165\u672C\u673A bots.json\uFF0C\u5E76\u81EA\u52A8\u914D\u7F6E\u5F00\u653E\u5E73\u53F0\u6743\u9650\u3002","botOnboarding.cliLabel":"CLI \u9002\u914D\u5668","botOnboarding.dirLabel":"\u5DE5\u4F5C\u76EE\u5F55","botOnboarding.dirPlaceholder":"\u9ED8\u8BA4 ~\uFF08\u5BB6\u76EE\u5F55\uFF09\uFF0C\u9700\u4E3A daemon \u4E3B\u673A\u4E0A\u5DF2\u5B58\u5728\u7684\u76EE\u5F55","botOnboarding.modelLabel":"\u6A21\u578B\uFF08\u53EF\u9009\uFF09","botOnboarding.modelPlaceholder":"\u7559\u7A7A\u4F7F\u7528\u8BE5 CLI \u7684\u9ED8\u8BA4\u6A21\u578B","botOnboarding.modelTtadkPlaceholder":"ttadk \u7F51\u5173\u6A21\u578B\uFF0C\u9ED8\u8BA4 {model}\uFF0C\u53EF\u6539\uFF08\u968F\u65F6\u5728\u6B64\u8C03\u6574\uFF09","botOnboarding.modelTtadkCocoPlaceholder":"CoCo \u65E0\u9700\u6307\u5B9A\u6A21\u578B","botOnboarding.startScan":"\u5F00\u59CB\u626B\u7801","botOnboarding.cancel":"\u53D6\u6D88","botOnboarding.starting":"\u6B63\u5728\u751F\u6210\u4E8C\u7EF4\u7801...","botOnboarding.waiting":"\u8BF7\u7528\u98DE\u4E66 App \u626B\u7801\u786E\u8BA4\u521B\u5EFA\u5E94\u7528\u3002","botOnboarding.verifying":"\u626B\u7801\u6210\u529F\uFF0C\u6B63\u5728\u6821\u9A8C\u51ED\u8BC1...","botOnboarding.configuringPermissions":"\u6B63\u5728\u81EA\u52A8\u914D\u7F6E\u5F00\u653E\u5E73\u53F0\u6743\u9650\u2026","botOnboarding.platformScanHint":"\u8BF7\u7528\u98DE\u4E66 App \u518D\u626B\u4E00\u6B21\u7801\u767B\u5F55\u5F00\u653E\u5E73\u53F0\uFF08\u7528\u4E8E\u81EA\u52A8\u5BFC\u5165\u6743\u9650\u3001\u914D\u7F6E\u56DE\u8C03\u3001\u63D0\u4EA4\u7248\u672C\uFF09\u3002","botOnboarding.platformQrAlt":"\u5F00\u653E\u5E73\u53F0\u767B\u5F55\u4E8C\u7EF4\u7801","botOnboarding.completed":"\u673A\u5668\u4EBA\u5DF2\u6DFB\u52A0\u3002","botOnboarding.permissionOk":"\u5DF2\u81EA\u52A8\u5BFC\u5165 {count} \u9879\u6743\u9650\u3002","botOnboarding.permissionSkipped":"\uFF08\u8DF3\u8FC7 {count} \u9879\u5F53\u524D\u79DF\u6237\u76EE\u5F55\u4E2D\u6CA1\u6709\u7684\u6743\u9650\uFF09","botOnboarding.permissionVersion":"\u5DF2\u63D0\u4EA4\u53D1\u5E03\u7248\u672C {version}\u3002","botOnboarding.permissionManual":"\u6743\u9650\u672A\u80FD\u81EA\u52A8\u914D\u7F6E\uFF0C\u8BF7\u624B\u52A8\u5B8C\u6210\u4EE5\u4E0B\u6B65\u9AA4\uFF1A","botOnboarding.metaDir":"\u76EE\u5F55","botOnboarding.failed":"\u6DFB\u52A0\u5931\u8D25","botOnboarding.openLink":"\u6253\u4E0D\u5F00\u626B\u7801\uFF1F\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00","botOnboarding.close":"\u5173\u95ED","botOnboarding.restartHint":"\u5DF2\u5199\u5165 bots.json\u3002\u6267\u884C pnpm daemon:restart \u540E\u65B0\u673A\u5668\u4EBA\u751F\u6548\u3002","botOnboarding.needsOwner":"\u65E0\u6CD5\u81EA\u52A8\u786E\u8BA4\u626B\u7801\u4EBA\u8EAB\u4EFD\uFF0C\u8BF7\u624B\u52A8\u586B\u5199 owner \u540E\u518D\u5B8C\u6210\u3002","botOnboarding.ownerLabel":"Owner\uFF08\u673A\u5668\u4EBA\u7BA1\u7406\u8005\uFF09","botOnboarding.ownerPlaceholder":"\u5B8C\u6574\u90AE\u7BB1 / union_id(on_) / open_id(ou_)\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694","botOnboarding.ownerHint":"\u4E3A\u907F\u514D\u300C\u65E0\u4EBA\u662F owner \u65F6\u4EFB\u4F55\u4EBA\u90FD\u80FD\u505A\u7BA1\u7406\u64CD\u4F5C\u300D\uFF0C\u5FC5\u987B\u6307\u5B9A\u81F3\u5C11\u4E00\u4E2A owner\u3002\u5EFA\u8BAE\u7528\u672C\u4F01\u4E1A\u90AE\u7BB1\u6216 union_id(on_)\u3002","botOnboarding.ownerSubmit":"\u4FDD\u5B58 owner \u5E76\u5B8C\u6210","botOnboarding.ownerEmpty":"\u8BF7\u586B\u5199\u81F3\u5C11\u4E00\u4E2A owner\u3002","botOnboarding.ownerInvalid":"owner \u6821\u9A8C\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u540E\u91CD\u8BD5\u3002","botOnboarding.qrAlt":"\u98DE\u4E66\u626B\u7801\u6DFB\u52A0\u673A\u5668\u4EBA\u4E8C\u7EF4\u7801","overview.title":"\u5DE5\u4F5C\u53F0","overview.subtitle":"\u6570\u5B57\u5458\u5DE5\u5B9E\u65F6\u72B6\u6001 \xB7 \u540C\u6B65\u98DE\u4E66\u8BDD\u9898","overview.team":"AI \u56E2\u961F","overview.teamHint":"\u6BCF\u4F4D\u6570\u5B57\u5458\u5DE5\u7684\u5B9E\u65F6\u72B6\u6001","overview.attention":"\u9700\u8981\u4F60\u5904\u7406","overview.attentionHint":"\u5361\u4F4F\u7684\u4EFB\u52A1\uFF0C\u56DE\u4E2A\u8BDD\u5C31\u80FD\u7EE7\u7EED\u8DD1","overview.activeSessions":"\u6D3B\u8DC3\u4F1A\u8BDD","overview.activeSessionsHint":"\u6B63\u5728\u8FD0\u8F6C\u7684\u4F1A\u8BDD","overview.today":"\u6B64\u523B\u6982\u89C8","overview.todayHint":"\u6D3B\u8DC3\u4F1A\u8BDD\u5206\u5E03","overview.viewAll":"\u67E5\u770B\u5168\u90E8 \u2192","overview.botIdle":"\u5F85\u547D\u4E2D\uFF0C\u968F\u65F6\u53EF\u63A5\u65B0\u4EFB\u52A1","overview.botOffline":"\u79BB\u7EBF \u2014 daemon \u672A\u4E0A\u7EBF","overview.botBusy":"\u6267\u884C\u4E2D \xB7 {count} \u4F1A\u8BDD","overview.botNeedsYou":"\u7B49\u4F60\u56DE\u590D","overview.botReady":"\u5C31\u7EEA","overview.botOff":"\u79BB\u7EBF","overview.sessionsCount":"{count} \u4F1A\u8BDD","overview.lastActive":"{time}\u524D\u6D3B\u8DC3","overview.noAttention":"\u6CA1\u6709\u7B49\u4F60\u5904\u7406\u7684\u4E8B\u9879","overview.teamExpand":"\u5C55\u5F00\u5168\u90E8 {count} \u4F4D \u25BE","overview.teamCollapse":"\u6536\u8D77 \u25B4","strip.pending":"{count} \u4EF6\u5F85\u5904\u7406","strip.longest":"\u6700\u4E45\u5DF2\u7B49 {time} \u2014 {bot} {reason}","strip.handle":"\u7ACB\u5373\u5904\u7406","overview.openSessions":"\u6D3B\u8DC3\u4F1A\u8BDD","overview.workingSessions":"\u5DE5\u4F5C\u4E2D","overview.onlineBots":"\u5728\u7EBF Bot","overview.schedules":"\u5B9A\u65F6\u4EFB\u52A1","overview.groups":"\u7FA4\u804A\u8986\u76D6","overview.enabledSchedules":"\u5DF2\u542F\u7528","overview.total":"\u603B\u8BA1","overview.active":"\u6D3B\u8DC3","overview.daemonRegistry":"daemon \u6CE8\u518C\u8868","overview.chatMatrix":"\u7FA4\u804A\u77E9\u9635","overview.recentSessions":"\u6700\u8FD1\u4F1A\u8BDD","overview.nextSchedules":"\u5373\u5C06\u6267\u884C","overview.noSessions":"\u6682\u65E0\u4F1A\u8BDD\u3002","overview.noSchedules":"\u6682\u65E0\u5B9A\u65F6\u4EFB\u52A1\u3002","sessions.title":"\u4F1A\u8BDD\u63A7\u5236","sessions.subtitle":"\u5B9A\u4F4D\u98DE\u4E66\u8BDD\u9898\u3001\u6253\u5F00 Web Terminal\u3001\u5173\u95ED\u6216\u6062\u590D CLI \u4F1A\u8BDD\u3002","sessions.search":"\u641C\u7D22\u5DE5\u4F5C\u76EE\u5F55 / \u6807\u9898 / ID","sessions.anyStatus":"\u5168\u90E8\u72B6\u6001","sessions.adoptAny":"adopt: \u5168\u90E8","sessions.adoptYes":"adopt: \u662F","sessions.adoptNo":"adopt: \u5426","sessions.activeOnly":"\u4EC5\u6D3B\u8DC3","sessions.closeSelected":"\u5173\u95ED\u9009\u4E2D","sessions.clearSelection":"\u53D6\u6D88\u9009\u62E9","sessions.selectedCount":"\u5DF2\u9009 {count} \u4E2A\u4F1A\u8BDD","sessions.idleCleanupOlderThan":"\u7A7A\u95F2\u8D85\u8FC7","sessions.idleCleanupThreshold":"\u7A7A\u95F2\u6E05\u7406\u9608\u503C","sessions.idleCleanupRun":"\u6E05\u7406\u7A7A\u95F2","sessions.idleCleanupCount":"\u53EF\u6E05\u7406 {count} \u4E2A","sessions.idleCleanupConfirm":"\u5C06\u5173\u95ED {count} \u4E2A\u7A7A\u95F2\u8D85\u8FC7 {threshold} \u7684\u4F1A\u8BDD\uFF0C\u786E\u5B9A\u7EE7\u7EED\uFF1F","sessions.idleCleanupRunning":"\u6E05\u7406\u4E2D\u2026","sessions.idleCleanupDone":"\u5DF2\u5173\u95ED {closed} \u4E2A\uFF0C\u5931\u8D25 {failed} \u4E2A","sessions.idleCleanupFailed":"\u6E05\u7406\u5931\u8D25","sessions.lock":"\u9501\u5B9A\u4F1A\u8BDD","sessions.unlock":"\u89E3\u9501\u4F1A\u8BDD","sessions.locked":"\u9501\u5B9A","sessions.lockSelected":"\u9501\u5B9A\u9009\u4E2D","sessions.unlockSelected":"\u89E3\u9501\u9009\u4E2D","sessions.lockFailed":"\u9501\u5B9A\u72B6\u6001\u66F4\u65B0\u5931\u8D25","sessions.bot":"bot","sessions.cli":"CLI","sessions.chat":"\u7FA4\u804A","sessions.openChat":"\u6253\u5F00\u7FA4\u804A","sessions.status":"\u72B6\u6001","sessions.tokenIn":"Token In","sessions.tokenOut":"Token Out","sessions.titleCol":"\u6807\u9898","sessions.workingDir":"\u5DE5\u4F5C\u76EE\u5F55","sessions.created":"\u521B\u5EFA","sessions.last":"\u6700\u8FD1","sessions.adopt":"\u63A5\u5165","sessions.actions":"\u64CD\u4F5C","sessions.details":"\u8BE6\u60C5","sessions.copy":"\u590D\u5236","sessions.copied":"\u5DF2\u590D\u5236","sessions.locate":"\u5B9A\u4F4D\u8BDD\u9898","sessions.locating":"\u53D1\u9001\u4E2D...","sessions.cooldown":"\u51B7\u5374 {seconds}s","sessions.openTerminal":"\u7EC8\u7AEF","sessions.writeLink":"\u64CD\u4F5C\u94FE\u63A5","sessions.writeLinkHint":"\u83B7\u53D6\u53EF\u64CD\u4F5C\u7EC8\u7AEF\u94FE\u63A5\uFF08\u5E26\u5199\u6743\u9650 token\uFF0C\u65B0\u6807\u7B7E\u6253\u5F00\uFF09","sessions.writeLinkFail":"\u83B7\u53D6\u64CD\u4F5C\u94FE\u63A5\u5931\u8D25","sessions.close":"\u5173\u95ED\u4F1A\u8BDD","sessions.restart":"\u91CD\u542F CLI","sessions.restartConfirmIntro":"\u51C6\u5907\u91CD\u542F\u5F53\u524D CLI\u3002","sessions.restartConfirmStatus":"\u5F53\u524D\u72B6\u6001","sessions.restartConfirmCli":"CLI","sessions.restartConfirmQuestion":"\u786E\u8BA4\u91CD\u542F\u8FD9\u4E2A CLI\uFF1F","sessions.restartFailed":"\u91CD\u542F\u5931\u8D25","sessions.resume":"\u6062\u590D\u4F1A\u8BDD","sessions.dismiss":"\u5173\u95ED","sessions.closeConfirm":"\u5173\u95ED\u8FD9\u4E2A\u4F1A\u8BDD\uFF1F","sessions.resumeFailed":"\u6062\u590D\u5931\u8D25","sessions.land":"\u843D\u76D8","sessions.landLoading":"\u52A0\u8F7D\u6C99\u76D2 diff\u2026","sessions.landUnavailable":"\u65E0\u6CD5\u843D\u76D8","sessions.landEmpty":"\u6C99\u76D2\u526F\u672C\u6CA1\u6709\u6539\u52A8\u3002","sessions.landApply":"\u5E94\u7528\u5230\u78C1\u76D8","sessions.landDiscard":"\u4E22\u5F03","sessions.landApplied":"\u5DF2\u843D\u76D8","sessions.landFailed":"\u843D\u76D8\u5931\u8D25","sessions.landDiscarded":"\u5DF2\u4E22\u5F03\uFF08\u6C99\u76D2\u526F\u672C\u672A\u5E94\u7528\uFF09\u3002","sessions.insight":"\u6D1E\u5BDF","sessions.insightLoading":"\u5206\u6790\u4E2D\u2026","sessions.insightUnavailable":"\u65E0\u6CD5\u5206\u6790","sessions.insightEmpty":"\u672C\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u53EF\u5206\u6790\u7684\u5DE5\u5177 span\u3002","sessions.insightMetrics":"span {total} \xB7 \u5931\u8D25 {failed} \xB7 \u6162 {slow} \xB7 \u8BFB\u6539\u6BD4 {rw} \xB7 \u538B\u7F29 {compactions}","sessions.insightSuggestions":"\u5EFA\u8BAE","sessions.insightSpans":"\u52A8\u4F5C span","sessions.insightCapped":"\u4EC5\u663E\u793A\u524D {shown}/{total} \u6761","sessions.insightAsOf":"\u622A\u81F3 {asOf}","sessions.insightPartial":"\uFF08\u53EF\u80FD\u4E0D\u542B\u8FDB\u884C\u4E2D\u7684\u6700\u65B0\u4E00\u8F6E\uFF09","nav.insights":"\u6D1E\u5BDF","insights.title":"\u5DE5\u4F5C\u6D41\u6D1E\u5BDF","insights.subtitle":"\u53EA\u8BFB\u5206\u6790\u672C\u673A Claude Code / Codex \u4F1A\u8BDD\u7684\u52A8\u4F5C\u8F68\u8FF9\u3001\u5931\u8D25\u4E0E\u6469\u64E6\uFF0C\u7ED9\u51FA\u89C4\u5219\u578B\u4F18\u5316\u5EFA\u8BAE\u3002","insights.refresh":"\u5237\u65B0","insights.search":"\u641C\u7D22\u4F1A\u8BDD / bot / \u76EE\u5F55\u2026","insights.filter":"\u7B5B\u9009","insights.filterAll":"\u5168\u90E8","insights.filterReview":"\u503C\u5F97\u590D\u76D8","insights.filterFailed":"\u6709\u5931\u8D25","insights.filterSlow":"\u6709\u6162 span","insights.loading":"\u5206\u6790\u4E2D\u2026","insights.loaded":"\u5DF2\u52A0\u8F7D {count} \u4E2A\u4F1A\u8BDD","insights.unavailable":"\u52A0\u8F7D\u5931\u8D25","insights.listCount":"\u663E\u793A {shown}/{total}","insights.tabOverview":"\u603B\u89C8","insights.tabSessions":"\u4F1A\u8BDD","insights.tabDist":"\u5206\u5E03","insights.tabHot":"\u70ED\u70B9","insights.projectAll":"\u5168\u90E8\u9879\u76EE","insights.timeAll":"\u5168\u90E8\u65F6\u95F4","insights.time1d":"\u8FD1 1 \u5929","insights.time7d":"\u8FD1 7 \u5929","insights.time30d":"\u8FD1 30 \u5929","insights.clear":"\u6E05\u9664","insights.emptyAnalyzableHint":"\u52FE\u9009\u300C\u542B\u672A\u5206\u6790\u300D\u53EF\u67E5\u770B\u5176\u4F59\u4F1A\u8BDD","insights.showAll":"\u542B\u672A\u5206\u6790","insights.distHint":"\u5F53\u524D\u7B5B\u9009\u4E0B\u5404\u4F1A\u8BDD\u7684\u6307\u6807\u5206\u5E03\u2014\u2014\u770B\u8D70\u52BF\u3001\u770B\u5178\u578B\u503C\u843D\u5728\u54EA\u3002","insights.distSpans":"\u6BCF\u4F1A\u8BDD span \u6570","insights.distFailed":"\u6BCF\u4F1A\u8BDD\u5931\u8D25\u6570","insights.distSlow":"\u6BCF\u4F1A\u8BDD\u6162 span","insights.distAgentTime":"agent \u5DE5\u4F5C\u65F6\u957F","insights.distRw":"\u8BFB\u6539\u6BD4","insights.distChurn":"\u4EE3\u7801\u6539\u52A8\u884C\u6570","insights.distTrend":"\u6309\u5929\u8D8B\u52BF\uFF08\u8FD1 4 \u5468\uFF09","insights.distTrendSub":"\u6BCF\u65E5\u4F1A\u8BDD\u6570","insights.distMedian":"\u4E2D\u4F4D {v}","insights.distEmpty":"\u5F53\u524D\u7B5B\u9009\u4E0B\u6CA1\u6709\u53EF\u5206\u6790\u7684\u4F1A\u8BDD\u3002","insights.disclosure":"\u53E3\u5F84\uFF1A\u8017\u65F6\u53EA\u7B97\u5DE5\u5177\u6267\u884C\u65F6\u95F4\uFF0C\u5DF2\u5254\u9664\u7B49\u7528\u6237\u56DE\u590D\uFF08\u95EE\u7B54/\u8BA1\u5212\u786E\u8BA4\uFF09\u7684\u6302\u673A\u65F6\u957F\uFF0C\u6545\u4E0D\u53CD\u6620\u5899\u949F\u65F6\u957F\uFF1BCodex \u4F1A\u8BDD\u7684\u300C\u8BFB\u300D\u591A\u8D70 shell\uFF08exec_command\uFF09\uFF0C\u4E0D\u8BA1\u5165\u300C\u8BFB\u300D\u76F8\uFF0C\u6545\u5176\u8BFB\u6539\u6BD4\u4F1A\u504F\u4F4E\u751A\u81F3\u4E3A 0\uFF1B\u4EE3\u7801\u6539\u52A8\u6309 patch \u89E3\u6790\uFF0C\u4EC5\u53D6\u6BCF\u4F1A\u8BDD\u6700\u6D3B\u8DC3\u7684\u82E5\u5E72\u6587\u4EF6\uFF0C\u4E0E Claude \u7684\u7ED3\u6784\u5316\u7EDF\u8BA1\u53E3\u5F84\u4E0D\u540C\u3002\u8DE8\u5DE5\u5177\u7684\u5206\u5E03\u4E0E\u6BD4\u503C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u4E0D\u5B9C\u76F4\u63A5\u5BF9\u6BD4\u3002","insights.rwNote":"Codex \u8BFB\u591A\u8D70 shell\uFF0C\u672A\u8BA1\u5165\u8BFB\u76F8","insights.viewSessions":"\u6309\u4F1A\u8BDD\u67E5\u770B","insights.hotHint":"\u8DE8\u4F1A\u8BDD\u590D\u53D1\u4FE1\u53F7\u2014\u2014\u6700\u8BE5\u6536\u655B\u7684\u5730\u65B9\u3002","insights.hotToolFailures":"\u5DE5\u5177\u62A5\u9519\u70ED\u70B9","insights.hotSlowSessions":"\u6700\u6162\u7684\u4F1A\u8BDD","insights.hotProjects":"\u9879\u76EE\u5206\u5E03","insights.hotFiles":"\u6587\u4EF6\u590D\u53D1\u70ED\u70B9","insights.hotCommands":"\u547D\u4EE4\u590D\u53D1\u70ED\u70B9","insights.hotErrors":"\u62A5\u9519\u590D\u53D1\u70ED\u70B9","insights.hotComingSoon":"\u6587\u4EF6 / \u547D\u4EE4\u590D\u53D1\u70ED\u70B9\u5373\u5C06\u4E0A\u7EBF\uFF08\u9700\u7ED9\u5F15\u64CE\u52A0\u8DE8\u4F1A\u8BDD\u805A\u5408\uFF09\u3002","insights.hotSessionsCol":"\u4F1A\u8BDD","insights.hotFailsCol":"\u5931\u8D25","insights.hotSlowCol":"\u6162","insights.backToList":"\u8FD4\u56DE\u5217\u8868","insights.sortLabel":"\u6392\u5E8F","insights.sortRecent":"\u6700\u8FD1","insights.sortReview":"\u56DE\u770B\u5206","insights.sortSpans":"span \u6570","insights.sortFails":"\u5931\u8D25","insights.sortSlow":"\u6162","insights.sortAgent":"\u65F6\u957F","insights.layoutCard":"\u5361\u7247","insights.layoutTable":"\u8868\u683C","insights.colTitle":"\u4F1A\u8BDD","insights.colProject":"\u9879\u76EE","insights.colTime":"\u65F6\u95F4","insights.paletteOpen":"\u8DF3\u8F6C \u2318K","insights.palettePlaceholder":"\u8DF3\u8F6C\u5230 tab \u6216\u641C\u7D22\u4F1A\u8BDD\u2026","insights.paletteTabs":"\u89C6\u56FE","insights.paletteSessions":"\u4F1A\u8BDD","insights.paletteEmpty":"\u6CA1\u6709\u5339\u914D\u9879","insights.tabFlow":"\u884C\u4E3A\u6D41","insights.flowHint":"\u667A\u80FD\u4F53\u628A\u52A8\u4F5C\u4E0E\u65F6\u95F4\u82B1\u5728\u54EA\u4E9B\u6D3B\u52A8\u9636\u6BB5\uFF0C\u4EE5\u53CA\u5404\u4F1A\u8BDD\u7684\u8282\u594F\u5206\u5E03\u3002","insights.flowPipeline":"\u6D3B\u52A8\u9636\u6BB5\u6D41\u6C34\u7EBF","insights.flowPipeSub":"\u7814\u7A76 \u2192 \u4FEE\u6539 \u2192 \u8FD0\u884C \u2192 \u59D4\u6D3E \u2192 \u8BA8\u8BBA\uFF1B\u4E0A=\u52A8\u4F5C\u6570\uFF0C\u4E0B=\u8017\u65F6","insights.flowShares":"\u52A8\u4F5C\u5360\u6BD4 vs \u65F6\u95F4\u5360\u6BD4","insights.flowActShare":"\u52A8\u4F5C\u5360\u6BD4","insights.flowTimeShare":"\u65F6\u95F4\u5360\u6BD4","insights.flowRhythm":"\u5404\u4F1A\u8BDD\u8282\u594F\uFF08\u6309\u65F6\u957F\uFF09","insights.subagents":"\u5B50\u4EE3\u7406","insights.subagentsHint":"\u672C\u4F1A\u8BDD\u59D4\u6D3E\u51FA\u53BB\u7684\u5B50\u4EE3\u7406\uFF08Task/Agent\uFF09\uFF0C\u5404\u81EA\u505A\u4E86\u4EC0\u4E48\u3001\u8DD1\u4E86\u591A\u4E45\u3002","insights.readsShort":"\u8BFB","insights.editsShort":"\u6539","insights.durShort":"\u65F6\u957F","insights.empty":"\u6CA1\u6709\u5339\u914D\u7684\u4F1A\u8BDD\u3002","insights.selectSession":"\u4ECE\u5DE6\u4FA7\u9009\u4E00\u4E2A\u4F1A\u8BDD\uFF0C\u67E5\u770B\u52A8\u4F5C span \u4E0E\u5EFA\u8BAE\u3002","insights.detailLoading":"\u52A0\u8F7D\u4F1A\u8BDD\u8BE6\u60C5\u2026","insights.recommendations":"\u4F18\u5316\u5EFA\u8BAE","insights.recommendationsHint":"\u57FA\u4E8E\u89C4\u5219\u7684\u8DE8\u4F1A\u8BDD\u6C47\u603B\uFF0C\u6BCF\u6761\u53EF\u8FFD\u6EAF\u5230\u6307\u6807\u3002","insights.noRecommendations":"\u6682\u65E0\u5EFA\u8BAE\u3002","insights.seenInSessions":"\u51FA\u73B0\u5728 {count} \u4E2A\u4F1A\u8BDD","insights.toolFailures":"\u9AD8\u9891\u5DE5\u5177\u5931\u8D25","insights.toolFailuresHint":"\u6309\u5DE5\u5177\u6C47\u603B\u5931\u8D25 span\u3002","insights.noFailures":"\u6CA1\u6709\u5931\u8D25 span\u3002","insights.metricSessions":"\u4F1A\u8BDD","insights.metricAnalyzed":"\u5DF2\u5206\u6790 {count}","insights.metricSpans":"span","insights.metricSafe":"\u5DF2\u8131\u654F","insights.metricFailed":"\u5931\u8D25 span","insights.metricSlow":"\u6162 span","insights.metricRw":"\u8BFB\u6539\u6BD4","insights.metricCompactions":"\u538B\u7F29 {count}","insights.spansShort":"span ","insights.failedShort":"\u5931\u8D25 ","insights.slowShort":"\u6162 ","insights.rwShort":"\u8BFB\u6539 ","insights.unsupported":"\u8BE5 CLI \u6682\u4E0D\u652F\u6301","insights.noTranscript":"\u6682\u65E0 transcript","insights.parseError":"\u89E3\u6790\u5931\u8D25","insights.noSpans":"\u6682\u65E0\u53EF\u5206\u6790 span\u3002","insights.sevBad":"\u4E25\u91CD","insights.sevWarn":"\u6CE8\u610F","insights.sevInfo":"\u63D0\u793A","insights.phase.research":"\u7814\u7A76","insights.phase.edit":"\u4FEE\u6539","insights.phase.run":"\u8FD0\u884C","insights.phase.delegate":"\u59D4\u6D3E","insights.phase.discuss":"\u8BA8\u8BBA","insights.trace":"\u52A8\u4F5C span","insights.ledger":"\u9010\u8F6E\u5BF9\u8D26","insights.detailTabs":"\u89C2\u6D4B\u660E\u7EC6","insights.spanStatus":"\u72B6\u6001","insights.spanTool":"\u5DE5\u5177","insights.spanPhase":"\u9636\u6BB5","insights.spanDuration":"\u8017\u65F6","insights.spanTurn":"\u8F6E","insights.spanSummary":"\u6458\u8981","insights.ledgerMore":"\u5C55\u5F00\u53E6\u5916 {count} \u6761\u6458\u8981","insights.ledgerOmitted":"\u8FD8\u6709 {count} \u6761\u5DF2\u6298\u53E0","insights.ledgerNoContent":"\u672C\u8F6E\u6CA1\u6709\u53EF\u5C55\u793A\u7684\u8131\u654F\u6458\u8981\u3002","insights.diagShow":"\u67E5\u770B\u8BC1\u636E","insights.diagActive":"\u6B63\u5728\u67E5\u770B","insights.evMatched":"\u547D\u4E2D {count} \u6761\u8BC1\u636E","insights.evMatchedCapped":"\u547D\u4E2D {matched} \u6761\uFF0C\u663E\u793A\u524D {shown} \u6761","insights.evDefault":"\u91CD\u70B9 {shown} / \u5171 {total} \u6761","insights.evShowAll":"\u663E\u793A\u5168\u90E8 {count} \u6761","insights.evBackToEvidence":"\u53EA\u770B\u91CD\u70B9","insights.intent.run_script":"\u8FD0\u884C\u811A\u672C","insights.intent.test":"\u6D4B\u8BD5","insights.intent.typecheck":"\u7C7B\u578B\u68C0\u67E5","insights.intent.lint":"Lint","insights.intent.git":"Git","insights.intent.search":"\u641C\u7D22","insights.intent.read_file":"\u8BFB\u6587\u4EF6","insights.intent.edit_file":"\u6539\u6587\u4EF6","insights.intent.write_file":"\u5199\u6587\u4EF6","insights.intent.delegate":"\u59D4\u6D3E","insights.intent.unknown":"\u64CD\u4F5C","insights.result.ok":"\u6210\u529F","insights.result.tool_error":"\u5DE5\u5177\u62A5\u9519","insights.result.test_failed":"\u6D4B\u8BD5\u5931\u8D25","insights.result.typecheck_failed":"\u7C7B\u578B\u68C0\u67E5\u5931\u8D25","insights.result.lint_failed":"Lint \u5931\u8D25","insights.result.command_failed":"\u547D\u4EE4\u5931\u8D25","insights.result.timeout":"\u8D85\u65F6","insights.result.no_output":"\u65E0\u8F93\u51FA","insights.result.unknown":"\u672A\u77E5","insights.tag.failure":"\u5931\u8D25","insights.tag.slow":"\u6162","insights.tag.retry":"\u8FD4\u5DE5","insights.tag.read_write_imbalance":"\u8BFB\u6539\u5931\u8861","insights.tag.diagnostic":"\u8BCA\u65AD","insights.tag.normal":"\u6B63\u5E38","insights.turnHeadline.turn_has_failures":"\u672C\u8F6E {failures} \u6B21\u5931\u8D25","insights.turnHeadline.turn_has_slow_spans":"\u672C\u8F6E\u6709\u8017\u65F6\u504F\u957F\u7684\u64CD\u4F5C","insights.turnHeadline.turn_has_retries":"\u672C\u8F6E\u53CD\u590D\u91CD\u8BD5\u540C\u4E00\u64CD\u4F5C","insights.turnHeadline.turn_read_write_imbalance":"\u672C\u8F6E\u6539\u591A\u8BFB\u5C11\uFF08\u6539 {edits} / \u8BFB {reads}\uFF09","insights.evTimeline":"\u5168\u90E8 {count} \u6761 span \u65F6\u95F4\u7EBF","insights.evNoFlags":"\u6CA1\u6709\u88AB\u6807\u8BB0\u4E3A\u5931\u8D25 / \u6162 / \u8FD4\u5DE5\u7684 span","insights.turnAllNormal":"{count} \u4E2A\u8F6E\u6B21\u90FD\u6B63\u5E38\uFF0C\u6CA1\u6709\u503C\u5F97\u590D\u76D8\u7684","insights.turnEvidence":"\u67E5\u770B\u672C\u8F6E {count} \u6761\u8BC1\u636E","insights.turnHiddenNormal":"\u53E6\u6709 {count} \u4E2A\u6B63\u5E38\u8F6E\u6B21\uFF08\u5DF2\u9690\u85CF\uFF09","insights.mReads":"\u8BFB","insights.mEdits":"\u6539","insights.mRuns":"\u8DD1","insights.mFailures":"\u5931\u8D25","insights.mDur":"\u8017\u65F6","insights.turnHeadline.turn_normal":"\u6B63\u5E38","insights.rec.fix_repeated_tool_failures":"\u53CD\u590D\u5931\u8D25\u7684\u547D\u4EE4\u9700\u8981\u6536\u655B","insights.rec.split_slow_operation":"\u6162\u64CD\u4F5C\u62D6\u6162\u4E86\u6574\u4E2A\u4F1A\u8BDD","insights.rec.add_read_pass_before_edit":"\u6539\u4E4B\u524D\u8BFB\u5F97\u592A\u5C11","insights.rec.preserve_context_checkpoints":"\u4E0A\u4E0B\u6587\u88AB\u538B\u7F29\uFF0C\u6CE8\u610F\u7559\u5B58\u6863","insights.impact.impact_failed_spans":"{failedSpans} \u4E2A\u52A8\u4F5C\u5931\u8D25\uFF08\u6700\u591A\uFF1A{topTool} \xD7{topToolFailures}\uFF09","insights.impact.impact_slow_spans":"{slowSpansTotal} \u4E2A\u6162\u52A8\u4F5C\u62D6\u6162\u8FDB\u5EA6","insights.impact.impact_low_read_write_ratio":"\u6539\u4E86 {writeSpans} \u5904\uFF0C\u53EA\u8BFB\u4E86 {readSpans} \u5904","insights.impact.impact_context_compaction":"\u672C\u4F1A\u8BDD\u53D1\u751F {compactions} \u6B21\u4E0A\u4E0B\u6587\u538B\u7F29","insights.why.why_tool_failure_concentrated":"\u5931\u8D25\u96C6\u4E2D\u5728 {topTool}\uFF08\u5171 {topToolFailures} \u6B21\uFF09\uFF0C\u591A\u534A\u662F\u540C\u4E00\u7C7B\u95EE\u9898","insights.why.why_slow_span_dominates":"\u5C11\u6570\u8017\u65F6\u52A8\u4F5C\u5360\u4E86\u5927\u5934\uFF0C\u6700\u6162\u7684\u662F {slowestTool}","insights.why.why_edits_outpaced_reads":"\u8BFB\u5199\u6BD4 {readWriteRatio}\uFF0C\u6539\u5F97\u6BD4\u8BFB\u5F97\u591A\u5BB9\u6613\u8E29\u5751\u8FD4\u5DE5","insights.why.why_context_compaction_happened":"\u957F\u4F1A\u8BDD\u88AB\u538B\u7F29\uFF0C\u65E9\u671F\u7684\u51B3\u7B56/\u4E0A\u4E0B\u6587\u53EF\u80FD\u5DF2\u4E22\u5931","insights.action.inspect_failed_span_details":"\u9010\u4E2A\u770B\u5931\u8D25\u52A8\u4F5C\u7684\u8BE6\u60C5\uFF0C\u5B9A\u4F4D\u6839\u56E0","insights.action.add_preflight_or_timeout":"\u7ED9\u9AD8\u9891\u5931\u8D25\u7684\u547D\u4EE4\u52A0\u524D\u7F6E\u68C0\u67E5\u6216\u8D85\u65F6\u63A7\u5236","insights.action.narrow_or_split_slow_operation":"\u628A\u6162\u64CD\u4F5C\u6536\u7A84\u6216\u62C6\u5C0F\uFF08\u5982\u53EA\u8DD1\u5B9A\u5411\u7528\u4F8B\uFF09","insights.action.surface_timeout_or_progress":"\u66F4\u65E9\u66B4\u9732\u8D85\u65F6/\u8FDB\u5EA6\uFF0C\u522B\u8BA9\u5B83\u9ED8\u9ED8\u5361\u4F4F","insights.action.read_or_search_before_editing":"\u6539\u964C\u751F\u6587\u4EF6\u524D\u5148\u8BFB\u4E00\u904D\u6216\u641C\u4E00\u4E0B","insights.action.verify_assumptions_before_running":"\u52A8\u624B\u524D\u5148\u9A8C\u8BC1\u5047\u8BBE\uFF0C\u51CF\u5C11\u76F2\u6539","insights.action.write_checkpoints_for_long_tasks":"\u957F\u4EFB\u52A1\u628A\u51B3\u7B56\u548C\u68C0\u67E5\u70B9\u843D\u5230\u7B14\u8BB0\u91CC","insights.struct.shell":"shell \u547D\u4EE4","insights.struct.fileEdit":"\u6587\u4EF6\u7F16\u8F91","insights.struct.readSearch":"\u8BFB\u53D6/\u641C\u7D22","insights.struct.agentTask":"\u5B50 agent \u4EFB\u52A1","insights.struct.toolInput":"\u5DE5\u5177\u8F93\u5165","insights.struct.toolResult":"\u5DE5\u5177\u8F93\u51FA","insights.struct.toolError":"\u5DE5\u5177\u62A5\u9519","insights.struct.patchFailed":"\u8865\u4E01\u5931\u8D25","insights.struct.patchApplied":"\u8865\u4E01\u5DF2\u5E94\u7528","insights.struct.exit":"exit {code}","insights.spanAll":"\u5168\u90E8","insights.dDetail":"\u8BE6\u60C5","insights.dCollapse":"\u6536\u8D77","insights.dPhase":"\u9636\u6BB5","insights.dStart":"\u8D77\u59CB","insights.dDur":"\u8017\u65F6","insights.dIntent":"\u610F\u56FE","insights.dResult":"\u7ED3\u679C","insights.dIn":"\u8F93\u5165","insights.dOut":"\u8F93\u51FA","insights.dTags":"\u6807\u7B7E","insights.dTurnContext":"\u7B2C {turn} \u8F6E\u4E0A\u4E0B\u6587","insights.advice.failure":"\u{1F4A1} \u770B\u6E05\u62A5\u9519\u518D\u52A8\u624B\uFF0C\u522B\u76F2\u76EE\u91CD\u8BD5","insights.advice.retry":"\u{1F4A1} \u540C\u4E00\u6B65\u53CD\u590D\u91CD\u8BD5\u2014\u2014\u5148\u5B9A\u4F4D\u6839\u56E0\u518D\u7EE7\u7EED","insights.advice.read_write_imbalance":"\u{1F4A1} \u6539\u4E4B\u524D\u5148\u8BFB\u76F8\u5173\u6587\u4EF6\uFF0C\u51CF\u5C11\u8FD4\u5DE5","insights.advice.slow":"\u{1F4A1} \u6162\u64CD\u4F5C\uFF1A\u8003\u8651\u8DD1\u5B9A\u5411\u7528\u4F8B\u6216\u62C6\u5C0F","insights.turnPrompt":"\u7528\u6237","insights.turnExpand":"\u5C55\u5F00 {count} \u6B65","insights.turnCollapse":"\u6536\u8D77","insights.turnRail":"\u4F1A\u8BDD\u8F68\u8FF9","insights.gantt":"\u5DE5\u4F5C\u65F6\u5E8F","insights.ganttCaption":"{span} \u4E2A\u52A8\u4F5C \xB7 \u8DE8\u5EA6 {dur} \xB7 \u6D3B\u8DC3 {active}","insights.ctxCurve":"\u4E0A\u4E0B\u6587\u66F2\u7EBF","insights.ctxCaption":"\u6BCF\u8F6E\u5CF0\u503C in+cache \xB7 \u5CF0\u503C {peak} \xB7 {turns} \u8F6E","insights.ctxTurn":"\u8F6E {n}","insights.railSubagent":"\u5B50\u4EE3\u7406","insights.railSubagents":"{n} \u4E2A\u5B50\u4EE3\u7406","insights.turnPromptExpand":"\u5C55\u5F00","insights.turnPromptCollapse":"\u6536\u8D77","insights.turnPromptRaw":"\u539F\u6587","insights.turnPromptRendered":"\u6E32\u67D3","insights.srcMentions":"\u63D0\u5230","insights.senderHuman":"\u7528\u6237","insights.senderA2A":"A2A","insights.senderOther":"\u5176\u4ED6","insights.senderSystem":"\u7CFB\u7EDF","insights.turnPromptFull":"\u5168\u6587","insights.modalClose":"\u5173\u95ED","insights.promptTruncated":"\u5185\u5BB9\u8F83\u957F\uFF0C\u5DF2\u622A\u65AD","insights.replay":"\u5BF9\u8BDD\u56DE\u653E","insights.replayAgent":"agent \u64CD\u4F5C","insights.replaySearch":"\u641C\u7D22\u5BF9\u8BDD\u5185\u5BB9\u2026","insights.replayBy":"\u53D1\u8D77\u4EBA","insights.replayState":"\u72B6\u6001","insights.replayLoadMore":"\u52A0\u8F7D\u66F4\u591A\uFF08{shown}/{total}\uFF09","insights.replayAllLoaded":"\u5DF2\u5168\u90E8\u52A0\u8F7D\uFF08\u5171 {total} \u6761\uFF09","insights.replayEmpty":"\u6CA1\u6709\u5339\u914D\u7684\u6D88\u606F","insights.replayNoText":"\uFF08\u65E0\u6B63\u6587\uFF0C\u89C1\u64CD\u4F5C\uFF09","insights.replayOps":"{count} \u6B65\u64CD\u4F5C","insights.wsFiles":"\u6587\u4EF6\u6539\u52A8 \xB7 {n}","insights.wsCmds":"\u8DD1\u8FC7\u7684\u547D\u4EE4 \xB7 {n}","insights.wsReads":"\u8BFB {n}","insights.wsEdits":"\u6539 {n}","insights.wsFail":"\u5931\u8D25 {n}","insights.wsNoFiles":"\u65E0\u6587\u4EF6\u6539\u52A8","insights.wsNoCmds":"\u65E0\u547D\u4EE4\u8BB0\u5F55","insights.turnSummary":"\u5171 {total} \u8F6E \xB7 {flagged} \u8F6E\u9700\u5173\u6CE8","insights.dCommand":"\u547D\u4EE4","insights.dCmdOutput":"\u6267\u884C\u7ED3\u679C","insights.ledgerNormal":"\u6B63\u5E38\u6392\u5E8F","insights.ledgerGrouped":"\u6309\u5EFA\u8BAE\u5206\u7C7B","insights.ledgerOther":"\u5176\u4ED6\u8F6E\u6B21","insights.ledgerGroupCount":"{count} \u8F6E","insights.turnsCapped":"\u4EC5\u542B\u524D {shown}/{total} \u4E2A\u52A8\u4F5C\uFF0C\u65F6\u95F4\u7EBF\u53EF\u80FD\u4E0D\u5B8C\u6574","insights.suggestion.high_tool_failure.title":"\u5DE5\u5177\u5931\u8D25\u504F\u591A","insights.suggestion.high_tool_failure.action":"\u4F18\u5148\u770B\u5931\u8D25 span\uFF0C\u628A\u9AD8\u9891\u5931\u8D25\u547D\u4EE4\u505A\u524D\u7F6E\u68C0\u67E5\u6216\u8D85\u65F6\u63A7\u5236\u3002","insights.suggestion.tool_failure_present.title":"\u5B58\u5728\u5DE5\u5177\u8C03\u7528\u5931\u8D25","insights.suggestion.tool_failure_present.action":"\u91CD\u590D\u6267\u884C\u5DE5\u4F5C\u6D41\u524D\uFF0C\u5148\u590D\u76D8\u5931\u8D25 span\u3002","insights.suggestion.slow_span.title":"\u6162\u52A8\u4F5C\u4E3B\u5BFC\u4F1A\u8BDD","insights.suggestion.slow_span.action":"\u62C6\u5206\u6216\u9650\u5236\u6162\u64CD\u4F5C\uFF0C\u5E76\u66F4\u65E9\u66B4\u9732\u8D85\u65F6\u3001\u8FDB\u5EA6\u53CD\u9988\u3002","insights.suggestion.low_read_write_ratio.title":"\u4FEE\u6539\u591A\u4E8E\u9605\u8BFB","insights.suggestion.low_read_write_ratio.action":"\u6539\u964C\u751F\u6587\u4EF6\u524D\u5148\u8865\u4E00\u6B21\u8BFB\u53D6\u6216\u641C\u7D22\u3002","insights.suggestion.context_compaction.title":"\u53D1\u751F\u4E0A\u4E0B\u6587\u538B\u7F29","insights.suggestion.context_compaction.action":"\u957F\u4EFB\u52A1\u5EFA\u8BAE\u628A\u51B3\u7B56\u548C\u68C0\u67E5\u70B9\u843D\u5230\u6301\u4E45\u7B14\u8BB0\u6216\u62C6\u6210\u66F4\u5C0F\u5B50\u4EFB\u52A1\u3002","insights.suggestion.no_major_friction.title":"\u672A\u53D1\u73B0\u660E\u663E\u6469\u64E6","insights.suggestion.no_major_friction.action":"\u53EF\u7528\u52A8\u4F5C\u65F6\u95F4\u7EBF\u505A\u62BD\u67E5\uFF0C\u6216\u4E0E\u66F4\u6162\u7684\u4F1A\u8BDD\u5BF9\u6BD4\u3002","insights.evidence.failedSpans":"{count} \u4E2A\u5931\u8D25 span","insights.evidence.toolFailedTimes":"{tool} \u5931\u8D25 {count} \u6B21","insights.evidence.multipleToolsFailed":"\u591A\u4E2A\u5DE5\u5177\u53D1\u751F\u5931\u8D25","insights.evidence.toolRanSeconds":"{tool} \u8FD0\u884C {seconds}s","insights.evidence.readWriteRatio":"\u8BFB\u6539\u6BD4 {ratio}","insights.evidence.compactions":"\u4E0A\u4E0B\u6587\u538B\u7F29 {count} \u6B21","insights.evidence.spansAnalyzed":"\u5DF2\u5206\u6790 {count} \u4E2A span","connectors.lede":"\u8BA9\u5916\u90E8\u7CFB\u7EDF\uFF08\u76D1\u63A7\u544A\u8B66\u3001CI\u3001\u5DE5\u5355\u2026\uFF09\u901A\u8FC7\u4E00\u4E2A webhook \u89E6\u53D1\u673A\u5668\u4EBA\u5728\u7FA4\u91CC\u8BF4\u8BDD\u6216\u8DD1\u5DE5\u4F5C\u6D41\u3002","connectors.createTitle":"\u65B0\u5EFA Webhook","connectors.fName":"\u540D\u79F0","connectors.fNamePh":"\u5982\uFF1A\u7EBF\u4E0A\u544A\u8B66","connectors.fBot":"\u89E6\u53D1\u7684\u673A\u5668\u4EBA","connectors.fKind":"\u89E6\u53D1\u65B9\u5F0F","connectors.kindTurn":"\u5355\u8F6E\u5BF9\u8BDD\uFF08\u8BA9\u673A\u5668\u4EBA\u56DE\u5E94\u4E00\u6B21\uFF09","connectors.kindWorkflow":"\u5DE5\u4F5C\u6D41","connectors.fWf":"\u5DE5\u4F5C\u6D41 ID","connectors.fMode":"\u6295\u9012\u5230\u54EA\u4E2A\u7FA4","connectors.modeDynamic":"\u7531\u8BF7\u6C42\u6307\u5B9A\uFF08\u7FA4\u968F\u8BF7\u6C42\u4F20\u5165\uFF09","connectors.modeFixed":"\u56FA\u5B9A\u7FA4","connectors.modeNewGroup":"\u6BCF\u6B21\u65B0\u5EFA\u7FA4","connectors.fFixedChat":"\u6295\u9012\u5230\u7684\u7FA4","connectors.fChatManualPh":"\u624B\u52A8\u586B\u7FA4 ID\uFF1Aoc_\u2026","connectors.chatManualLink":"\u627E\u4E0D\u5230\u7FA4\uFF1F\u624B\u52A8\u586B ID \u2192","connectors.chatListLink":"\u4ECE\u7FA4\u5217\u8868\u9009\u62E9 \u2190","connectors.fAllow":"\u5141\u8BB8\u7684\u7FA4","connectors.optional":"\uFF08\u53EF\u9009\uFF09","connectors.allowHint":"\u6309\u4F4F Ctrl/\u2318 \u591A\u9009\uFF1B\u7559\u7A7A = \u4E0D\u9650\u3002\u53EA\u7528\u4E8E\u6821\u9A8C\u8BF7\u6C42\u4F20\u5165\u7684\u7FA4\u662F\u5426\u88AB\u5141\u8BB8\u3002","connectors.dynamicHint":'<b>\u52A8\u6001\u6A21\u5F0F</b>\uFF1A\u7FA4 ID \u968F\u6BCF\u6B21\u8BF7\u6C42\u4F20\u5165\uFF0C\u4E09\u9009\u4E00 \u2014\u2014 \u67E5\u8BE2\u53C2\u6570 <code>?chatId=<\u7FA4ID></code> \xB7 \u8BF7\u6C42\u5934 <code>x-botmux-chat-id: <\u7FA4ID></code> \xB7 \u8BF7\u6C42\u4F53 <code>{"chatId":"<\u7FA4ID>"}</code>\u3002<br>\u60F3"\u4E00\u4E2A URL \u76F4\u63A5\u89E6\u53D1\u3001\u4E0D\u5E26\u53C2\u6570"\uFF0C\u8BF7\u6539\u9009\u300C\u56FA\u5B9A\u7FA4\u300D\u3002',"connectors.fDedup":"\u53BB\u91CD\u5B57\u6BB5","connectors.fDedupPh":"\u5982 alert.id\uFF08\u4ECE\u4E8B\u4EF6 body \u53D6\u503C\uFF09","connectors.dedupHint":"\u586B\u4E86\uFF1A\u547D\u4E2D\u76F8\u540C\u503C\u7684\u4E8B\u4EF6\u90FD\u6295\u5230<b>\u540C\u4E00\u4E2A\u7FA4</b>\u3002\u7559\u7A7A\uFF1A\u6BCF\u4E2A\u4E8B\u4EF6<b>\u65B0\u5EFA\u4E00\u4E2A\u7FA4</b>\u3002","connectors.fInstruction":"\u5904\u7406\u6307\u4EE4","connectors.fInstructionPh":"\u4E8B\u4EF6\u89E6\u53D1\u65F6\u8BA9\u673A\u5668\u4EBA\u505A\u4EC0\u4E48\u3002\u5982\uFF1A\u603B\u7ED3\u8FD9\u6761\u544A\u8B66\u7684\u4E25\u91CD\u7A0B\u5EA6\uFF0C@\u76F8\u5173 oncall\uFF0C\u7ED9\u51FA\u6392\u67E5\u5EFA\u8BAE\u3002\u7559\u7A7A = \u53EA\u628A\u4E8B\u4EF6\u539F\u6837\u4EA4\u7ED9\u6A21\u578B\u81EA\u7531\u53D1\u6325\u3002","connectors.fVerify":"\u6821\u9A8C\u65B9\u5F0F","connectors.verifyToken":"\u4EE4\u724C\uFF08\u7B80\u5355\uFF1A\u5BC6\u94A5\u653E\u8FDB URL\uFF0C\u4E00\u6761 curl \u5C31\u80FD\u89E6\u53D1\uFF09","connectors.verifyHmac":"HMAC \u7B7E\u540D\uFF08\u9AD8\u7EA7\uFF1A\u66F4\u5B89\u5168\uFF0C\u9700\u81EA\u884C\u5BF9\u8BF7\u6C42\u7B7E\u540D\uFF09","connectors.fSecret":"\u5BC6\u94A5 / \u4EE4\u724C","connectors.fSecretPh":"\u7559\u7A7A\u81EA\u52A8\u751F\u6210\uFF08\u53EA\u663E\u793A\u4E00\u6B21\uFF09","connectors.btnCreate":"\u521B\u5EFA","connectors.listTitle":"\u5DF2\u6709 Webhook","connectors.loading":"\u52A0\u8F7D\u4E2D\u2026","connectors.noBotGroups":"\uFF08\u8BE5\u673A\u5668\u4EBA\u6682\u65E0\u53EF\u89C1\u7FA4\uFF0C\u70B9\u53F3\u4FA7\u624B\u52A8\u586B ID\uFF09","connectors.modeLabelFixed":"\u56FA\u5B9A\u7FA4","connectors.modeLabelNewGroup":"\u6BCF\u6B21\u65B0\u5EFA\u7FA4","connectors.modeLabelDynamic":"\u8BF7\u6C42\u6307\u5B9A\u7FA4","connectors.kindLabelWorkflow":"\u5DE5\u4F5C\u6D41","connectors.kindLabelTurn":"\u5355\u8F6E","connectors.count":"\xB7 {count} \u4E2A","connectors.empty":"\u8FD8\u6CA1\u6709 Webhook\u3002\u7528\u4E0A\u9762\u7684\u8868\u5355\u521B\u5EFA\u4E00\u4E2A\u3002","connectors.enabled":"\u5DF2\u542F\u7528","connectors.disabled":"\u5DF2\u505C\u7528","connectors.badgeToken":"\u4EE4\u724C","connectors.badgeSign":"\u7B7E\u540D","connectors.dest":"\u6295\u9012\u300C{name}\u300D","connectors.btnDisable":"\u505C\u7528","connectors.btnEnable":"\u542F\u7528","connectors.btnEdit":"\u7F16\u8F91","connectors.btnSave":"\u4FDD\u5B58","connectors.btnCancel":"\u53D6\u6D88","connectors.btnDel":"\u5220\u9664","connectors.webhookUrl":"Webhook URL\uFF1A","connectors.copy":"\u590D\u5236","connectors.copied":"\u5DF2\u590D\u5236","connectors.tokenHint":"\u4EE4\u724C\u6A21\u5F0F\uFF1A\u8C03\u7528\u65F6\u5728 URL \u672B\u5C3E\u8FFD\u52A0 <code>/<\u4EE4\u724C></code>\uFF08\u4EE4\u724C\u4EC5\u521B\u5EFA/\u8F6E\u6362\u65F6\u663E\u793A\u4E00\u6B21\uFF09\u3002","connectors.dynamicReqHint":'\u52A8\u6001\u6A21\u5F0F\uFF1A\u8BF7\u6C42\u9700\u5E26\u76EE\u6807\u7FA4 \u2014\u2014 <code>?chatId=<\u7FA4ID></code> \u6216\u5934 <code>x-botmux-chat-id</code> \u6216 body <code>{"chatId":"\u2026"}</code>\u3002',"connectors.instructionPrefix":"\u5904\u7406\u6307\u4EE4\uFF1A","connectors.delConfirm":"\u5220\u9664\u8FD9\u4E2A Webhook\uFF1F\u5B83\u7684 URL \u4F1A\u7ACB\u5373\u5931\u6548\u3002","connectors.errName":"\u8BF7\u586B\u540D\u79F0","connectors.errBot":"\u8BF7\u9009\u673A\u5668\u4EBA","connectors.errWf":"\u8BF7\u586B\u5DE5\u4F5C\u6D41 ID","connectors.errChat":"\u8BF7\u9009\u62E9\uFF08\u6216\u624B\u52A8\u586B\uFF09\u6295\u9012\u7684\u7FA4","connectors.creating":"\u521B\u5EFA\u4E2D\u2026","connectors.saving":"\u4FDD\u5B58\u4E2D\u2026","connectors.usageDynamicLede":"\u52A8\u6001\u6A21\u5F0F\uFF1AURL \u5DF2\u542B\u4EE4\u724C\uFF0C\u8C03\u7528\u65F6\u518D\u5E26\u4E0A\u76EE\u6807\u7FA4 ID{gn}\uFF1A","connectors.usageDynamicNote":'\u7FA4\u4E5F\u53EF\u653E\u8BF7\u6C42\u5934 <code>x-botmux-chat-id</code> \u6216 body <code>{"chatId":"\u2026"}</code>\u3002\u26A0\uFE0F URL \u5373\u51ED\u8BC1\uFF0C\u52FF\u6CC4\u6F0F\u3002',"connectors.usageTokenLede":"\u6B64 URL \u5DF2\u542B\u4EE4\u724C\u3001\u4E14\u56FA\u5B9A\u6295\u9012\u5230\u6240\u9009\u7FA4\uFF0C\u76F4\u63A5 POST \u5373\u53EF\u89E6\u53D1\uFF1A","connectors.usageTokenNote":"\u26A0\uFE0F URL \u5373\u51ED\u8BC1\uFF0C\u8BF7\u52FF\u516C\u5F00\u6CC4\u6F0F\uFF1B\u53EF\u5728\u4E0B\u65B9\u5217\u8868\u5220\u9664\u6216\u8F6E\u6362\u3002","connectors.usageHmac":"\u5916\u90E8\u7CFB\u7EDF\u9700\u5BF9 <code>timestamp.body</code> \u505A HMAC-SHA256 \u7B7E\u540D\uFF0C\u5E76\u5E26\u4E0A <code>x-botmux-timestamp</code> / <code>x-botmux-nonce</code> / <code>x-botmux-signature</code> \u5934\u8C03\u7528","connectors.usageHmacDynamic":"\uFF0C\u540C\u65F6\u6309\u4E0A\u9762\u65B9\u5F0F\u5E26\u76EE\u6807\u7FA4 ID","connectors.createdPrefix":"\u5DF2\u521B\u5EFA\u300C{name}\u300D","connectors.createdDest":"\u6295\u9012\u5230\u300C{name}\u300D","connectors.tokenLabel":"\u8BBF\u95EE\u4EE4\u724C","connectors.signLabel":"\u7B7E\u540D\u5BC6\u94A5","connectors.secretOnce":"\uFF08\u53EA\u663E\u793A\u8FD9\u4E00\u6B21\uFF0C\u8BF7\u4FDD\u5B58\uFF09\uFF1A","connectors.createFailed":"\u521B\u5EFA\u5931\u8D25\uFF1A{error}","connectors.saveFailed":"\u4FDD\u5B58\u5931\u8D25\uFF1A{error}","connectors.noOnlineBots":"\uFF08\u6CA1\u6709\u5728\u7EBF\u673A\u5668\u4EBA\uFF09","team.navHome":"\u6211\u7684\u56E2\u961F","team.navManage":"\u56E2\u961F\u7BA1\u7406","team.eyebrow":"\u56E2\u961F","team.homeTitle":"\u56E2\u961F\u534F\u4F5C\uFF08\u8DE8\u90E8\u7F72\uFF09","team.homeLede":"\u628A\u522B\u7684\u90E8\u7F72\uFF08\u540C\u4E8B\u81EA\u5DF1\u8DD1\u7684 botmux\uFF09\u9080\u8BF7\u8FDB\u540C\u4E00\u4E2A\u56E2\u961F\uFF0C\u4E92\u76F8\u53D1\u73B0\u673A\u5668\u4EBA\u3001\u534F\u4F5C\u62C9\u7FA4\u3002","team.localDeployTitle":"\u672C\u90E8\u7F72","team.myIdentity":"\u6211\u7684\u98DE\u4E66\u8EAB\u4EFD\uFF1A","team.unbound":"\u672A\u7ED1\u5B9A","team.bindBtn":"\u7ED1\u5B9A","team.bindHint":"\uFF08\u7528\u673A\u5668\u4EBA\u51ED\u8BC1\u81EA\u52A8\u8BC6\u522B\u4F60\uFF1B\u7ED1\u5B9A\u540E\u62C9\u7FA4\u4F1A\u628A\u4F60\u62C9\u8FDB\u7FA4\u3001\u673A\u5668\u4EBA\u4E5F\u5F52\u5230\u4F60\u540D\u4E0B\uFF09","team.myTeams":"\u6211\u7684\u56E2\u961F","team.searchPh":"\u641C\u7D22 \u540D\u79F0/\u80FD\u529B/CLI\u2026","team.allCli":"\u5168\u90E8 CLI","team.hasCap":"\u6709\u80FD\u529B\u6807\u7B7E","team.hasRole":"\u6709\u9ED8\u8BA4\u89D2\u8272","team.teamsHint":"\u6BCF\u4E2A\u56E2\u961F\u91CC\u52FE\u9009\u673A\u5668\u4EBA\u5373\u53EF\u5355\u72EC\u62C9\u7FA4\uFF08\u81EA\u52A8\u5E26\u4E0A\u5404\u81EA\u8D1F\u8D23\u4EBA\uFF09\u3002\u8981\u65B0\u5EFA\u56E2\u961F / \u751F\u6210\u9080\u8BF7\u7801 / \u52A0\u5165\u522B\u4EBA\u7684\u56E2\u961F\uFF0C\u53BB\u300C\u56E2\u961F\u7BA1\u7406\u300D\u3002","team.loading":"\u52A0\u8F7D\u4E2D\u2026","team.roleModalTitle":"\u9ED8\u8BA4\u89D2\u8272","team.roleModalHint":"\u8BE5\u673A\u5668\u4EBA\u7684\u9ED8\u8BA4\u4EBA\u8BBE\uFF08\u8DE8\u7FA4\u751F\u6548\uFF09\uFF0C\u6B64\u5904\u53EA\u8BFB\u3002\u5982\u9700\u4FEE\u6539\uFF0C\u8BF7\u5230\u300CBot \u914D\u7F6E\u300D\u9875\u3002","team.close":"\u5173\u95ED","team.tagLocal":"\u672C\u90E8\u7F72","team.tagRemoteStale":"\u8FDC\u7AEF\xB7\u79BB\u7EBF\uFF1F","team.tagRemote":"\u8FDC\u7AEF","team.removeMember":"\u79FB\u9664","team.depTag":"\uFF08{tag}\uFF09","team.depCount":"{count} \u4E2A","team.depSelected":"\uFF0C\u5DF2\u9009 {n}","team.capPh":"\u80FD\u529B\u6807\u7B7E\u2026","team.viewRole":"\u67E5\u770B","team.hasRoleShort":"\u6709\u89D2\u8272","team.noMatch":"\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u673A\u5668\u4EBA\u3002","team.gnamePh":"\u7FA4\u540D\uFF08\u5982\uFF1A\u8DE8\u56E2\u961F\u6392\u969C\uFF09","team.pullGroupBtn":"\u628A\u52FE\u9009\u7684\u673A\u5668\u4EBA\u62C9\u4E00\u4E2A\u7FA4","team.pullGroupHint":"\u52FE\u9009\u673A\u5668\u4EBA \u2192 \u62C9\u5230\u4E00\u4E2A\u98DE\u4E66\u7FA4\uFF08\u81EA\u52A8\u542B owner\uFF09","team.noTeams":"\u8FD8\u6CA1\u6709\u56E2\u961F\u3002\u53BB\u300C\u56E2\u961F\u7BA1\u7406\u300D\u751F\u6210\u9080\u8BF7\u7801\u8BA9\u522B\u4EBA\u52A0\u5165\u4F60\uFF0C\u6216\u52A0\u5165\u522B\u4EBA\u7684\u56E2\u961F\u3002","team.connected":"\u5DF2\u8FDE\u63A5","team.connectFail":"\u8FDE\u63A5\u5931\u8D25\uFF1A{error}","team.iHost":"\u6211\u6258\u7BA1","team.teamMeta":"{deps} \u4E2A\u90E8\u7F72 \xB7 {bots} \u4E2A\u673A\u5668\u4EBA","team.rosterFail":"\u65E0\u6CD5\u83B7\u53D6\u8BE5\u56E2\u961F\u82B1\u540D\u518C\u3002","team.acrossTeams":"\uFF08\u8DE8 {n} \u4E2A\u56E2\u961F\uFF0C\u53BB\u91CD\uFF09","team.botsWord":"\u4E2A\u673A\u5668\u4EBA","team.groupCreated":"\u7FA4\u5DF2\u521B\u5EFA","team.delegatedBy":"\uFF08\u7531\u300C{name}\u300D\u5EFA\u7FA4\uFF09","team.openInLark":"\u5728\u98DE\u4E66\u6253\u5F00","team.invalidBots":"\u672A\u52A0\u5165\u7684\u673A\u5668\u4EBA\uFF1A{ids}","team.invalidOwners":"{n} \u4E2A owner \u672A\u80FD\u62C9\u8FDB","team.missingIdentity":"\u4F60\u672A\u7ED1\u5B9A\u98DE\u4E66\u8EAB\u4EFD\uFF0C\u6CA1\u628A\u4F60\u81EA\u5DF1\u62C9\u8FDB\u7FA4\uFF08\u53BB\u300C\u6211\u7684\u56E2\u961F\u300D\u7ED1\u5B9A\uFF09","team.skippedNoOwner":"{n} \u4E2A\u673A\u5668\u4EBA\u56E0\u8D1F\u8D23\u4EBA\u672A\u7ED1\u5B9A\u8EAB\u4EFD\u88AB\u8DF3\u8FC7\uFF08\u672A\u52A0\u5165\u7FA4\uFF09","team.errNoLocalBot":"\u8BF7\u81F3\u5C11\u52FE\u9009\u4E00\u4E2A\u4F60\u81EA\u5DF1\uFF08\u672C\u90E8\u7F72\uFF09\u7684\u5728\u7EBF\u673A\u5668\u4EBA\u2014\u2014\u7FA4\u8981\u7531\u5B83\u521B\u5EFA\u5E76\u628A\u4F60\uFF08\u53D1\u8D77\u4EBA\uFF09\u62C9\u8FDB\u7FA4\u3002","team.errAllSkipped":"\u6240\u9009\u673A\u5668\u4EBA\u7684\u8D1F\u8D23\u4EBA\u90FD\u6CA1\u7ED1\u5B9A\u8EAB\u4EFD\uFF0C\u65E0\u6CD5\u62C9\u7FA4\uFF08\u673A\u5668\u4EBA\u4E0D\u80FD\u8FDB\u4E00\u4E2A owner \u4E0D\u5728\u7684\u7FA4\uFF09\u3002\u8BF7\u8BA9\u5BF9\u5E94\u90E8\u7F72\u5148\u7ED1\u5B9A\u8EAB\u4EFD\u3002","team.errNoCreator":"\u6CA1\u6709\u53EF\u7528\u7684\u5EFA\u7FA4\u53D1\u8D77\u65B9\uFF08\u76F8\u5173\u90E8\u7F72\u90FD\u6CA1\u6709\u5728\u7EBF\u673A\u5668\u4EBA\uFF0C\u6216\u4E0D\u53EF\u8FBE\uFF09","team.errDelegationTimeout":"\u59D4\u6258\u5BF9\u65B9\u90E8\u7F72\u5EFA\u7FA4\u8D85\u65F6\uFF08\u53EF\u80FD\u5DF2\u5EFA\uFF0C\u53BB\u98DE\u4E66\u786E\u8BA4\uFF0C\u52FF\u91CD\u590D\u70B9\uFF09","team.errGroupCreate":"\u5EFA\u7FA4\u5931\u8D25\uFF1A{error}","team.roleModalTitleName":"\u9ED8\u8BA4\u89D2\u8272 \xB7 {name}","team.bound":"\u5DF2\u7ED1\u5B9A","team.myHostedTeam":"\u6211\u6258\u7BA1\u7684\u56E2\u961F","team.remoteTeamLabel":"{name} \u7684\u56E2\u961F","team.manageTitle":"\u56E2\u961F\u7BA1\u7406","team.manageLede":"\u521B\u5EFA\u591A\u4E2A\u56E2\u961F\u3001\u7ED9\u6BCF\u4E2A\u56E2\u961F\u751F\u6210\u9080\u8BF7\u7801\u3001\u6216\u52A0\u5165\u522B\u4EBA\u7684\u56E2\u961F\u3002\u4E00\u4E2A\u56E2\u961F = \u4F60\u672C\u90E8\u7F72\u7684\u673A\u5668\u4EBA + \u52A0\u5165\u8BE5\u56E2\u961F\u7684\u5176\u5B83\u90E8\u7F72\u3002","team.hostedTitle":"\u6211\u6258\u7BA1\u7684\u56E2\u961F","team.newTeamPh":"\u65B0\u56E2\u961F\u540D\u79F0","team.createTeamBtn":"\u521B\u5EFA\u56E2\u961F","team.joinTitle":"\u52A0\u5165\u522B\u4EBA\u7684\u56E2\u961F","team.hubPh":"Hub \u5730\u5740\uFF0C\u5982 http://10.0.0.5:7891","team.codePh":"\u9080\u8BF7\u7801","team.joinBtn":"\u52A0\u5165","team.noTeamsShort":"\u8FD8\u6CA1\u6709\u56E2\u961F\u3002","team.default":"\u9ED8\u8BA4","team.manageMetaDeps":"{count} \u4E2A\u90E8\u7F72","team.manageMetaRemote":"\uFF08\u542B {r} \u8FDC\u7AEF\uFF09","team.manageMetaBots":"{count} \u4E2A\u673A\u5668\u4EBA","team.genInvite":"\u751F\u6210\u9080\u8BF7\u7801","team.delBtn":"\u5220\u9664","team.generating":"\u751F\u6210\u4E2D\u2026","team.inviteResultLede":"\u628A\u4E0B\u9762\u4E24\u9879\u53D1\u7ED9\u522B\u7684\u90E8\u7F72\u7684\u4EBA\uFF0824 \u5C0F\u65F6\u5185\u3001\u5355\u6B21\u6709\u6548\uFF09\uFF1A","team.inviteHub":"Hub \u5730\u5740\uFF1A","team.inviteCode":"\u9080\u8BF7\u7801\uFF1A","team.genFail":"\u751F\u6210\u5931\u8D25\u3002","team.delConfirm":"\u5220\u9664\u56E2\u961F\u300C{name}\u300D\uFF1F\u5DF2\u52A0\u5165\u5B83\u7684\u90E8\u7F72\u4F1A\u88AB\u79FB\u9664\uFF08\u4E0D\u5F71\u54CD\u4ED6\u4EEC\u81EA\u5DF1\u7684\u90E8\u7F72\uFF09\u3002","team.errName":"\u8BF7\u586B\u56E2\u961F\u540D\u79F0","team.creating":"\u521B\u5EFA\u4E2D\u2026","team.created":"\u5DF2\u521B\u5EFA","team.createFail":"\u521B\u5EFA\u5931\u8D25\uFF1A{error}","team.errHubCode":"\u8BF7\u586B Hub \u5730\u5740\u548C\u9080\u8BF7\u7801\u3002","team.joining":"\u52A0\u5165\u4E2D\u2026","team.joined":"\u5DF2\u52A0\u5165\u300C{name}\u300D\uFF0C\u53BB\u300C\u6211\u7684\u56E2\u961F\u300D\u67E5\u770B\u3002","team.joinErrSelf":"\u8FD9\u662F\u4F60\u81EA\u5DF1\u7684\u90E8\u7F72\uFF0C\u4E0D\u80FD\u52A0\u5165\u81EA\u5DF1\uFF08\u9080\u8BF7\u7801\u8981\u53D1\u7ED9\u522B\u7684\u90E8\u7F72\u7684\u4EBA\u7528\uFF09","team.joinErrAlready":"\u4F60\u7684\u90E8\u7F72\u5DF2\u7ECF\u52A0\u5165\u8FC7\u8FD9\u4E2A\u56E2\u961F\u4E86","team.joinErrUnreachable":"\u8FDE\u4E0D\u4E0A\u5BF9\u65B9 Hub\uFF08\u68C0\u67E5\u5730\u5740/\u7F51\u7EDC\uFF09","team.joinErrTimeout":"\u5BF9\u65B9 Hub \u54CD\u5E94\u8D85\u65F6","team.joinErrGeneric":"\u52A0\u5165\u5931\u8D25\uFF1A{error}","team.identifying":"\u8BC6\u522B\u4E2D\u2026","team.bound2":"\u5DF2\u7ED1\u5B9A\uFF1A{name}","team.multiCandidate":"\u8BC6\u522B\u5230\u591A\u4E2A\u5019\u9009\uFF0C\u70B9\u4F60\u81EA\u5DF1\uFF1A","team.binding":"\u7ED1\u5B9A\u4E2D\u2026","team.bindFail":"\u7ED1\u5B9A\u5931\u8D25\uFF1A{error}","team.noCandidates":"\u6CA1\u8BC6\u522B\u5230\u8EAB\u4EFD\uFF1A\u8BF7\u786E\u8BA4\u673A\u5668\u4EBA\u914D\u7F6E\u4E86 allowedUsers\uFF08\u5141\u8BB8\u4F7F\u7528\u8005\uFF09\uFF0C\u4E14\u673A\u5668\u4EBA\u6709\u901A\u8BAF\u5F55\u6743\u9650\u3002","team.removeMemberConfirm":"\u628A\u300C{name}\u300D\u79FB\u51FA\u8FD9\u4E2A\u56E2\u961F\uFF1F\u5B83\u7684\u673A\u5668\u4EBA\u5C06\u4ECE\u672C\u56E2\u961F\u82B1\u540D\u518C\u6D88\u5931\uFF08\u4E0D\u5F71\u54CD\u5BF9\u65B9\u81EA\u5DF1\u7684\u90E8\u7F72\uFF09\u3002","team.creatingGroup":"\u5EFA\u7FA4\u4E2D\u2026","team.defaultGroupName":"\u534F\u4F5C\u7FA4","team.errPickBot":"\u8BF7\u5148\u52FE\u9009\u81F3\u5C11\u4E00\u4E2A\u673A\u5668\u4EBA","sessions.closeBulkConfirm":"\u5173\u95ED\u9009\u4E2D\u7684 {count} \u4E2A\u4F1A\u8BDD\uFF1F","sessions.empty":"\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u4F1A\u8BDD\u3002","sessions.viewMode":"\u4F1A\u8BDD\u89C6\u56FE","sessions.viewKanban":"\u770B\u677F","sessions.viewBoard":"\u72B6\u6001\u677F","sessions.viewTable":"\u8868\u683C","sessions.selectSession":"\u9009\u62E9\u4F1A\u8BDD","sessions.board.needsYou":"\u9700\u8981\u4F60","sessions.board.needsYouHint":"\u7B49\u5F85\u4ED3\u5E93\u3001TUI \u9009\u62E9\u6216\u989D\u5EA6\u5904\u7406","sessions.board.starting":"\u542F\u52A8\u4E2D","sessions.board.startingHint":"CLI \u6B63\u5728\u521B\u5EFA\u6216\u6062\u590D","sessions.board.working":"\u5E72\u6D3B\u4E2D","sessions.board.workingHint":"\u6B63\u5728\u8F93\u51FA\u3001\u5206\u6790\u6216\u6267\u884C\u5DE5\u5177","sessions.board.idle":"\u7A7A\u95F2","sessions.board.idleHint":"\u53EF\u7EE7\u7EED\u5BF9\u8BDD\u6216\u63A5\u65B0\u4EFB\u52A1","sessions.board.emptyColumn":"\u6682\u65E0\u4F1A\u8BDD","sessions.board.signalRepo":"\u5F85\u9009\u4ED3\u5E93","sessions.board.signalPrompt":"\u7B49\u5F85 TUI \u9009\u62E9","sessions.board.signalLimited":"\u989D\u5EA6\u53D7\u9650","sessions.board.signalAgent":"\u9700\u8981\u4EBA\u5DE5\u4ECB\u5165","sessions.board.waiting":"\u7B49\u5F85","sessions.board.dragHint":"\u62D6\u52A8\u5217\u5934\u8C03\u6574\u5217\u987A\u5E8F","sessions.board.moveLeft":"\u5DE6\u79FB\u6B64\u5217","sessions.board.moveRight":"\u53F3\u79FB\u6B64\u5217","sessions.kanban.backlog":"\u5F85\u529E\u6C60","sessions.kanban.todo":"\u5F85\u529E","sessions.kanban.inProgress":"\u8FDB\u884C\u4E2D","sessions.kanban.inReview":"\u5F85\u786E\u8BA4","sessions.kanban.done":"\u5DF2\u5B8C\u6210","sessions.kanban.updated":"\u66F4\u65B0\u4E8E {time}","sessions.kanban.moreHidden":"\u8FD8\u6709 {count} \u4E2A\u672A\u663E\u793A","sessions.create.button":"\u521B\u5EFA\u4F1A\u8BDD","sessions.create.title":"\u521B\u5EFA\u4F1A\u8BDD","sessions.create.content":"\u5185\u5BB9","sessions.create.contentPlaceholder":"\u63CF\u8FF0\u8981\u505A\u7684\u4E8B\uFF1BLead \u5206\u914D\u6A21\u5F0F\u4E0B\u53EF\u5728\u8FD9\u91CC\u7ED9\u5404 agent \u5206\u914D\u4E0D\u540C\u7684\u5DE5\u4F5C","sessions.create.bots":"\u673A\u5668\u4EBA\uFF08\u62C9\u8FDB\u65B0\u7FA4\uFF09","sessions.create.noBots":"\u6CA1\u6709\u5728\u7EBF\u7684\u673A\u5668\u4EBA\u53EF\u9009","sessions.create.mode":"\u534F\u4F5C\u6A21\u5F0F","sessions.create.modeAll":"\u4E00\u8D77\u5F00\u5DE5","sessions.create.modeLead":"Lead \u5206\u914D\uFF08\u63A8\u8350\uFF09","sessions.create.modeHelp":"\u4E00\u8D77\u5F00\u5DE5\uFF1A\u6BCF\u4E2A\u88AB\u9009\u673A\u5668\u4EBA\u5404\u8D77\u4E00\u6761\u4F1A\u8BDD\u3001\u62FF\u540C\u4E00\u4EFD\u5185\u5BB9\u3002Lead \u5206\u914D\uFF1A\u53EA\u8D77 lead\uFF0C\u7531\u5B83\u5728\u7FA4\u91CC @ \u62C9\u8D77\u5176\u5B83\u673A\u5668\u4EBA\u5E72\u6D3B\u3002","sessions.create.lead":"Lead \u673A\u5668\u4EBA","sessions.create.leadHelp":"\u5185\u5BB9\u4F1A\u53D1\u7ED9 lead\uFF0C\u7531\u5B83\u51B3\u5B9A\u4F55\u65F6\u62C9\u8D77\u54EA\u4E2A sub bot\u3002","sessions.create.leadPickFirst":"\u8BF7\u5148\u5728\u4E0A\u65B9\u52FE\u9009\u673A\u5668\u4EBA","sessions.create.column":"\u5165\u5217","sessions.create.columnInProgress":"\u76F4\u63A5\u8FDB\u884C\u4E2D","sessions.create.columnBacklog":"\u5F85\u529E\u6C60","sessions.create.columnHelp":"\u76F4\u63A5\u8FDB\u884C\u4E2D\uFF1A\u5EFA\u5B8C\u7FA4\u7ACB\u523B\u5F00\u8DD1\u3002\u5F85\u529E\u6C60\uFF1A\u5148\u5EFA\u7FA4+\u62C9\u673A\u5668\u4EBA\u4F46\u4E0D\u8D77 CLI\uFF0C\u4E4B\u540E\u62D6\u5230\u300C\u8FDB\u884C\u4E2D\u300D\u6216\u70B9\u300C\u5F00\u59CB\u300D\u518D\u53D1\u7ED9\u673A\u5668\u4EBA\u3002","sessions.create.advanced":"\u66F4\u591A\u9009\u9879","sessions.create.groupName":"\u7FA4\u540D\u79F0","sessions.create.groupNamePlaceholder":"\u7559\u7A7A\u5219\u53D6\u5185\u5BB9\u9996\u884C","sessions.create.workingDir":"\u5DE5\u4F5C\u76EE\u5F55","sessions.create.workingDirHelp":"\u53EF\u9009\u3002\u586B\u4E86\u5219\u628A\u65B0\u7FA4\u7ED1\u5B9A\u5230\u8BE5\u76EE\u5F55\uFF08\u6240\u6709\u673A\u5668\u4EBA\u90FD\u5728\u6B64\u76EE\u5F55\u5DE5\u4F5C\uFF09\u3002\u7559\u7A7A\u5219\u673A\u5668\u4EBA\u5728\u7FA4\u91CC\u5F39 /repo \u5361\u7247\u8BA9\u4F60\u9009\u4ED3\u5E93\uFF08\u652F\u6301\u65B0\u5EFA worktree\uFF09\u3002","sessions.create.submit":"\u521B\u5EFA","sessions.create.submitting":"\u521B\u5EFA\u4E2D\u2026","sessions.create.cancel":"\u53D6\u6D88","sessions.create.start":"\u5F00\u59CB","sessions.create.errContent":"\u8BF7\u586B\u5199\u5185\u5BB9","sessions.create.errNoBot":"\u8BF7\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u673A\u5668\u4EBA","sessions.create.errLead":"Lead \u5FC5\u987B\u662F\u5DF2\u52FE\u9009\u7684\u673A\u5668\u4EBA\u4E4B\u4E00","sessions.create.failed":"\u521B\u5EFA\u5931\u8D25","sessions.create.startFailed":"\u5F00\u59CB\u5931\u8D25","sessions.create.doneTitle":"\u5DF2\u521B\u5EFA","sessions.create.doneInProgress":"\u5DF2\u5EFA\u7FA4\u5E76\u62C9\u8D77\u4F1A\u8BDD","sessions.create.doneBacklog":"\u5DF2\u5EFA\u7FA4\uFF0C\u4F1A\u8BDD\u5DF2\u5165\u5F85\u529E\u6C60","sessions.create.partialFail":"\u6709 {n} \u4E2A\u673A\u5668\u4EBA\u672A\u80FD\u62C9\u8D77\uFF0C\u53EF\u7A0D\u540E\u5728\u7FA4\u91CC @ \u91CD\u8BD5","sessions.create.openChat":"\u6253\u5F00\u98DE\u4E66\u7FA4","sessions.create.close":"\u5173\u95ED","sessions.kanban.openTab":"\u65B0\u6807\u7B7E\u9875\u6253\u5F00","sessions.kanban.openFeishu":"\u6253\u5F00\u98DE\u4E66","sessions.kanban.terminalLoading":"\u6B63\u5728\u6253\u5F00\u7EC8\u7AEF\u2026","sessions.kanban.rename":"\u91CD\u547D\u540D\uFF08\u53CC\u51FB\u6807\u9898\u4E5F\u53EF\uFF09","sessions.kanban.renameFail":"\u91CD\u547D\u540D\u5931\u8D25","sessions.kanban.moveFail":"\u79FB\u52A8\u5931\u8D25","sessions.kanban.groupBy":"\u5206\u7EC4\u7EF4\u5EA6","sessions.kanban.groupFlow":"\u5DE5\u4F5C\u6D41","sessions.kanban.groupTeam":"\u56E2\u961F","sessions.kanban.groupBot":"\u673A\u5668\u4EBA","sessions.kanban.teamLoading":"\u6B63\u5728\u52A0\u8F7D\u56E2\u961F\u2026","sessions.kanban.noTeam":"\u6682\u65E0\u56E2\u961F","sessions.kanban.teamScope":"{chats} \u4E2A\u534F\u4F5C\u7FA4 \xB7 {sessions} \u4E2A\u4F1A\u8BDD","sessions.kanban.remoteHint":"\u6765\u81EA {name} \u90E8\u7F72\u7684\u4F1A\u8BDD\uFF08\u5FEB\u7167\uFF0C\u7EC8\u7AEF/\u5386\u53F2\u5728\u5BF9\u65B9\u673A\u5668\u4E0A\uFF09","sessions.kanban.clusterDragHint":"\u62D6\u52A8\u6807\u9898\u6574\u7EC4\u79FB\u52A8","sessions.history.title":"\u4F1A\u8BDD\u5386\u53F2","sessions.history.loading":"\u6B63\u5728\u62C9\u53D6\u98DE\u4E66\u6D88\u606F\u2026","sessions.history.fail":"\u5386\u53F2\u62C9\u53D6\u5931\u8D25","sessions.history.empty":"\u6CA1\u6709\u6D88\u606F","sessions.history.user":"\u7528\u6237","sessions.history.owner":"\u521B\u5EFA\u8005","sessions.history.staleHint":"dashboard \u6216 daemon \u8FDB\u7A0B\u53EF\u80FD\u8FD8\u5728\u8DD1\u65E7\u7248\u672C\uFF0Cbotmux restart \u540E\u91CD\u8BD5","groups.title":"\u7FA4\u7EC4\u4E0E Bot","groups.subtitle":"\u67E5\u770B chat x bot \u8986\u76D6\u77E9\u9635\uFF0C\u7BA1\u7406\u62C9\u7FA4\u3001oncall\u3001\u9000\u7FA4\u548C\u89E3\u6563\u3002","groups.search":"\u641C\u7D22\u7FA4\u540D / ID / owner","groups.missingOnly":"\u4EC5\u7F3A bot","groups.refresh":"\u5237\u65B0","groups.create":"\u65B0\u5EFA\u7FA4","groups.chat":"\u7FA4\u804A","groups.actions":"\u64CD\u4F5C","groups.addBots":"\u6DFB\u52A0 bot","groups.saveAsProfile":"\u4FDD\u5B58\u4E3A Profile","groups.manage":"\u7BA1\u7406","groups.empty":"\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u7FA4\u804A\u3002","groups.profileStatusFull":"\u5B8C\u6574\u5339\u914D {name}\uFF08{matched}/{total}\uFF09","groups.profileStatusFullChat":"\u672C\u7FA4 Role \u5B8C\u6574\u5339\u914D {name}\uFF08{matched}/{total}\uFF09","groups.profileStatusPartial":"\u90E8\u5206\u5339\u914D {name}\uFF08{matched}/{total}\uFF09","groups.profileStatusUnmatched":"\u672A\u5339\u914D\u4EFB\u4F55 Profile","groups.saveProfileTitle":"\u4FDD\u5B58\u4E3A Profile","groups.saveProfileIntro":"\u5C06\u300C{name}\u300D\u91CC\u7684 {count} \u4E2A\u7FA4\u5185 bot \u914D\u7F6E\u4FDD\u5B58\u4E3A profile \u5FEB\u7167\u3002","groups.saveProfileScope":"\u4FDD\u5B58\u8303\u56F4","groups.saveProfileScopeHelp":"\u7FA4\u5185 bot \u914D\u7F6E\u5FEB\u7167","groups.saveProfileBotCount":"\u7FA4\u5185 bot","groups.saveProfileLoadFailed":"\u8BFB\u53D6\u5931\u8D25","groups.saveProfileStatus.entry":"\u751F\u6210 entry","groups.saveProfileStatus.error":"\u8BFB\u53D6\u5931\u8D25","groups.saveProfileMode":"\u4FDD\u5B58\u65B9\u5F0F","groups.saveProfileNew":"\u65B0\u5EFA Profile","groups.saveProfileNewHelp":"\u9ED8\u8BA4\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684\u5FEB\u7167\uFF1B\u5982\u679C id \u5DF2\u5B58\u5728\uFF0C\u4F1A\u8986\u76D6\u540C bot entry\u3002","groups.saveProfileOverwrite":"\u8986\u76D6\u5DF2\u6709 Profile","groups.saveProfileOverwriteHelp":"\u4ECE\u5217\u8868\u4E2D\u9009\u62E9\u4E00\u4E2A\u5DF2\u6709 profile\uFF0C\u8986\u76D6\u5176\u4E2D\u540C bot \u7684 entry\u3002","groups.saveProfileExistingMeta":"{count} \u4E2A entry","groups.saveProfileIdLabel":"Profile id","groups.saveProfileExistingLabel":"\u5DF2\u6709 Profile","groups.saveProfileExistingEmpty":"\u6682\u65E0\u5DF2\u6709 Profile","groups.saveProfileTarget":"\u76EE\u6807 Profile","groups.saveProfileTargetNew":"\u5C06\u65B0\u5EFA\u6216\u66F4\u65B0\u8FD9\u4E2A Profile \u7684\u7FA4\u5185 bot \u5FEB\u7167","groups.saveProfileTargetOverwrite":"\u5C06\u8986\u76D6\u5DF2\u6709 Profile \u4E2D\u8FD9\u4E9B bot \u7684 entry","groups.saveProfileEntrySummary":"\u5C06\u4E3A {count} \u4E2A\u7FA4\u5185 bot \u751F\u6210 profile entry\u3002","groups.saveProfileEntrySummaryWithEmpty":"\u5C06\u4E3A {count} \u4E2A\u7FA4\u5185 bot \u751F\u6210 profile entry\uFF1B\u5176\u4E2D {emptyCount} \u4E2A\u5F53\u524D\u672A\u8BFB\u5230 role \u5185\u5BB9\uFF0C\u4F1A\u4FDD\u5B58\u4E3A\u7A7A entry\u3002","groups.saveProfileFailedLoadSummary":"\u6709 {count} \u4E2A bot \u914D\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF0C\u6682\u4E0D\u4FDD\u5B58\uFF0C\u907F\u514D\u751F\u6210\u4E0D\u5B8C\u6574\u5FEB\u7167\u3002","groups.saveProfileSubmit":"\u4FDD\u5B58 Profile","groups.saveProfileOverwriteSubmit":"\u8986\u76D6\u4FDD\u5B58","groups.saveProfileInvalid":"Profile id \u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u70B9\u3001\u4E0B\u5212\u7EBF\u3001\u77ED\u6A2A\u7EBF\uFF0C\u6700\u957F 64\uFF0C\u4E14\u4E0D\u80FD\u662F . \u6216 ..","groups.saveProfileNoRoles":"\u8FD9\u4E2A\u7FA4\u91CC\u6CA1\u6709\u53EF\u4FDD\u5B58\u7684 bot \u914D\u7F6E\u3002","groups.saveProfileSaving":"\u4FDD\u5B58\u4E2D\u2026","groups.saveProfileDone":"\u5DF2\u4FDD\u5B58 {count} \u4E2A entry \u5230 {name}","groups.saveProfileFailed":"\u53EA\u4FDD\u5B58\u4E86 {saved}/{total} \u4E2A entry\uFF0C\u8BF7\u68C0\u67E5\u79BB\u7EBF bot \u6216\u6743\u9650\u3002","groups.createTitle":"\u65B0\u5EFA\u7FA4\u804A","groups.createHelp":"\u9009\u62E9\u8981\u9080\u8BF7\u7684 bot\u3002dashboard \u4F1A\u81EA\u52A8\u9009\u62E9\u5728\u7EBF daemon \u4F5C\u4E3A\u521B\u5EFA\u8005\u3002","groups.name":"\u7FA4\u540D","groups.namePlaceholder":"\u4F8B\u5982 AI ChangeLog","groups.bindDir":"\u7ED1\u5B9A\u76EE\u5F55","groups.bindDirHelp":"\u65B0\u8BDD\u9898\u76F4\u63A5\u7528\u8BE5\u76EE\u5F55\u542F\u52A8 CLI\uFF0C\u8DF3\u8FC7 repo \u9009\u62E9\u3002","groups.roleProfile":"Profile","groups.roleProfileNone":"\u4E0D\u4F7F\u7528","groups.roleProfileHelp":"\u521B\u5EFA\u540E\u5728\u65B0\u7FA4\u91CC\u53D1\u9001 profile apply bootstrap \u547D\u4EE4\u3002","groups.roleProfileBootstrapSent":"Profile\uFF1A{name}\uFF1Bbootstrap \u6D88\u606F\u5DF2\u53D1\u9001\uFF1A{messageId}","groups.roleProfileBootstrapDone":"Profile\uFF1A{name}\uFF1Bbootstrap \u5DF2\u5B8C\u6210\uFF0C\u65E0\u9700\u53D1\u9001 peer bootstrap \u6D88\u606F\u3002","groups.roleProfileBootstrapFailed":"Profile\uFF1A{name}\uFF1Bbootstrap \u5931\u8D25\uFF1A{reason}","groups.botPicker":"Bot","groups.createSubmit":"\u521B\u5EFA","groups.cancel":"\u53D6\u6D88","groups.successTitle":"\u7FA4\u521B\u5EFA\u6210\u529F","groups.openGroup":"\u6253\u5F00\u65B0\u7FA4","groups.manageTitle":"\u7BA1\u7406 {name}","groups.owner":"\u7FA4\u4E3B","groups.oncall":"Oncall \u6A21\u5F0F","groups.oncallHelp":"\u5F00\u542F\u540E\uFF0C\u7FA4\u5185\u6210\u5458\u53EF @ \u673A\u5668\u4EBA\uFF1B\u52FE\u9009\u7684 bot \u5728\u672C\u7FA4\u7684\u65B0\u8BDD\u9898\u76F4\u63A5\u4F7F\u7528\u5176\u7ED1\u5B9A\u76EE\u5F55\uFF08\u7ED1\u5B9A\u6309 bot \u8BA1\uFF0C\u53EA\u5F71\u54CD\u52FE\u9009\u7684 bot\uFF09\u3002","groups.leaveTitle":"\u9009\u62E9\u673A\u5668\u4EBA\u9000\u51FA\u7FA4\u804A","groups.leaveSelected":"\u9009\u4E2D\u673A\u5668\u4EBA\u9000\u51FA\u7FA4\u804A","groups.disband":"\u89E3\u6563\u7FA4\u804A","groups.dangerHint":"\u89E3\u6563\u4EC5\u5F53\u5728\u7FA4\u673A\u5668\u4EBA\u662F\u7FA4\u4E3B\u65F6\u624D\u4F1A\u6210\u529F\uFF0C\u5426\u5219\u5EFA\u8BAE\u4F7F\u7528\u9000\u51FA\u7FA4\u804A\u3002","groups.save":"\u4FDD\u5B58","groups.needWorkingDir":"\u8BF7\u586B\u5DE5\u4F5C\u76EE\u5F55","groups.noBotsOnline":"\u6CA1\u6709\u5728\u7EBF bot\u3002\u8BF7\u5148\u91CD\u542F daemon\u3002","schedules.title":"\u5B9A\u65F6\u4EFB\u52A1","schedules.subtitle":"\u8DE8 daemon \u67E5\u770B\u3001\u6682\u505C\u3001\u6062\u590D\u548C\u7ACB\u5373\u89E6\u53D1\u5B9A\u65F6\u4EFB\u52A1\u3002","schedules.search":"\u641C\u7D22\u540D\u79F0 / prompt / \u5DE5\u4F5C\u76EE\u5F55","schedules.anyKind":"\u5168\u90E8\u7C7B\u578B","schedules.enabledOnly":"\u4EC5\u542F\u7528","schedules.name":"\u540D\u79F0","schedules.bot":"bot","schedules.schedule":"\u89C4\u5219","schedules.next":"\u4E0B\u6B21","schedules.last":"\u4E0A\u6B21","schedules.repeat":"\u91CD\u590D","schedules.enabled":"\u542F\u7528","schedules.actions":"\u64CD\u4F5C","schedules.runNow":"\u7ACB\u5373\u8FD0\u884C","schedules.pause":"\u6682\u505C","schedules.resume":"\u6062\u590D","schedules.delivery":"\u6295\u9012","schedules.deliveryOrigin":"\u539F\u8BDD\u9898","schedules.deliveryNewTopic":"\u6BCF\u6B21\u65B0\u8BDD\u9898","schedules.deliveryLocal":"\u4EC5\u8BB0\u5F55","schedules.useNewTopic":"\u6539\u4E3A\u6BCF\u6B21\u65B0\u8BDD\u9898","schedules.useOrigin":"\u6539\u4E3A\u539F\u8BDD\u9898","schedules.empty":"\u6682\u65E0\u5B9A\u65F6\u4EFB\u52A1\u3002","settings.title":"\u5168\u5C40\u8BBE\u7F6E","settings.subtitle":"\u7BA1\u7406\u672C\u673A botmux dashboard \u4E0E\u6240\u6709 bot \u5171\u4EAB\u7684\u5168\u5C40\u884C\u4E3A\u3002","settings.loading":"\u6B63\u5728\u52A0\u8F7D\u8BBE\u7F6E\u2026","settings.loadFailed":"\u8BBE\u7F6E\u52A0\u8F7D\u5931\u8D25","settings.readOnlyVisitor":"\u5F53\u524D\u662F\u53EA\u8BFB\u8BBF\u95EE\uFF0C\u4FEE\u6539\u8BBE\u7F6E\u9700\u8981\u6388\u6743\u94FE\u63A5\uFF08\u8FD0\u884C botmux dashboard \u83B7\u53D6\uFF09","settings.sectionAccess":"\u8BBF\u95EE\u6743\u9650","settings.publicReadOnly":"\u5141\u8BB8\u65E0 token \u53EA\u8BFB\u8BBF\u95EE dashboard","settings.publicReadOnlyHelp":"\u5F00\u542F\u540E\uFF0C\u6CA1\u6709 token \u7684\u8BBF\u95EE\u8005\u53EF\u4EE5\u67E5\u770B dashboard\u3001\u4F1A\u8BDD\u3001\u5B9A\u65F6\u4EFB\u52A1\u548C SSE\uFF1B\u5173\u95ED\u3001\u6682\u505C\u3001\u5BA1\u6279\u7B49\u5199\u64CD\u4F5C\u4ECD\u5FC5\u987B\u901A\u8FC7 token \u9274\u6743\u3002\u654F\u611F\u7EC8\u7AEF\u539F\u59CB\u65E5\u5FD7\u59CB\u7EC8\u9700\u8981 token\u3002","settings.remoteAccess":"\u8FDC\u7A0B\u8BBF\u95EE\u7EC8\u7AEF","settings.remoteAccessHelp":"\u5F00\u542F\u540E\u4F1A\u8BDD Web \u7EC8\u7AEF /\u98DE\u4E66\u5361\u7247\u300C\u6253\u5F00\u7EC8\u7AEF\u300D/\u300C\u83B7\u53D6\u53EF\u64CD\u4F5C\u94FE\u63A5\u300D\u53CA webhook \u90FD\u8D70\u4E2D\u5FC3\u5316\u5E73\u53F0\u94FE\u63A5\uFF1B\u5173\u95ED\u5219\u7528\u672C\u5730\u94FE\u63A5\u3002\u9ED8\u8BA4\u5173\u95ED\u3002","settings.sectionCards":"\u98DE\u4E66\u5361\u7247","settings.openTerminalInFeishu":"\u6D41\u5F0F\u5361\u7247\u7EC8\u7AEF\u6309\u94AE\u5728\u98DE\u4E66\u4FA7\u680F\u6253\u5F00","settings.openTerminalInFeishuHelp":"\u9ED8\u8BA4\u5173\u95ED\uFF1A\u7EC8\u7AEF\u6309\u94AE\u76F4\u63A5\u6253\u5F00 Web Terminal URL\u3002\u5F00\u542F\u540E\u4F7F\u7528\u98DE\u4E66 web_url/open \u5305\u88C5\uFF0C\u5728\u98DE\u4E66 PC \u4FA7\u680F\u91CC\u6253\u5F00\uFF1B\u5199\u6743\u9650\u4ECD\u7531\u7EC8\u7AEF token \u63A7\u5236\u3002","settings.sectionRepoPicker":"\u4ED3\u5E93\u9009\u62E9","settings.repoPickerMode":"\u4ED3\u5E93\u9009\u62E9\u5361\u6A21\u5F0F","settings.repoPickerModeAll":"\u4ED3\u5E93 + worktree","settings.repoPickerModeRepos":"\u4EC5\u4E3B\u4ED3\u5E93","settings.repoPickerModeHelp":"\u9ED8\u8BA4\u663E\u793A\u4ED3\u5E93\u548C linked worktree\u3002\u9009\u62E9\u300C\u4EC5\u4E3B\u4ED3\u5E93\u300D\u540E\uFF0C\u521D\u59CB\u5316\u548C\u88F8 /repo \u7684\u9009\u62E9\u5361\u53EA\u5217\u4E3B\u4ED3\u5E93\uFF1B\u663E\u5F0F /repo /abs/path/to/worktree \u4ECD\u53EF\u76F4\u8FBE worktree\u3002","settings.saving":"\u4FDD\u5B58\u4E2D\u2026","settings.saved":"\u5DF2\u4FDD\u5B58","settings.saveFailed":"\u4FDD\u5B58\u5931\u8D25","settings.sectionMaintenance":"\u81EA\u52A8\u7EF4\u62A4","settings.autoUpdate":"\u81EA\u52A8\u66F4\u65B0","settings.autoUpdateHelp":"\u9ED8\u8BA4\u5173\u95ED\u3002\u5230\u70B9\u6267\u884C npm install -g botmux@latest \u5B89\u88C5\u6700\u65B0\u7248\u672C\uFF08\u53EA\u4E0B\u8F7D\u5B89\u88C5\u3001\u672C\u8EAB\u4E0D\u91CD\u542F\uFF09\u3002\u4EC5 npm \u5168\u5C40\u5B89\u88C5\u53EF\u7528\u3002","settings.autoRestart":"\u81EA\u52A8\u91CD\u542F","settings.autoRestartHelp":"\u9ED8\u8BA4\u5173\u95ED\uFF0C\u9700\u5148\u5F00\u542F\u81EA\u52A8\u66F4\u65B0\u3002\u81EA\u52A8\u66F4\u65B0\u88C5\u5230\u65B0\u7248\u672C\u540E\uFF0C\u82E5\u6CA1\u6709\u8FDB\u884C\u4E2D\u7684\u4F1A\u8BDD\u5219\u81EA\u52A8\u91CD\u542F\u4EE5\u751F\u6548\uFF08\u649E\u4E0A\u5FD9\u788C\u4F1A\u8BDD\u5219\u8DF3\u5230\u6B21\u65E5\uFF09\u3002","settings.autoUpdateLocalDev":"\u5F53\u524D\u4E3A\u672C\u5730\u5F00\u53D1\u5B89\u88C5\uFF08\u4ECE\u6E90\u7801\u8FD0\u884C\uFF09\uFF0C\u81EA\u52A8\u66F4\u65B0\u4E0D\u53EF\u7528\u3002","settings.maintenanceTime":"\u65F6\u95F4","update.section":"\u7248\u672C\u4E0E\u66F4\u65B0","update.loginRequired":"\u767B\u5F55\u540E\u53EF\u68C0\u67E5\u7248\u672C\u3001\u6267\u884C\u66F4\u65B0\u6216\u91CD\u542F\u3002","update.loading":"\u68C0\u67E5\u4E2D\u2026","update.checkFailed":"\u68C0\u67E5\u5931\u8D25","update.current":"\u5F53\u524D\u7248\u672C","update.upToDate":"\u5DF2\u662F\u6700\u65B0\u7248\u672C","update.newAvailable":"\u53D1\u73B0\u65B0\u7248\u672C {version}","update.checkUnavailable":"\u65E0\u6CD5\u83B7\u53D6\u6700\u65B0\u7248\u672C\uFF08\u79BB\u7EBF\u6216\u53D7\u7F51\u7EDC\u9650\u5236\uFF09","update.nodeWarn":"\u5F53\u524D Node \u7248\u672C {version} \u8FC7\u4F4E\uFF0C\u66F4\u65B0\u8981\u6C42 \u2265 {required}\uFF0C\u8BF7\u5148\u5347\u7EA7 Node\u3002","update.localDev":"\u5F53\u524D\u4E3A\u672C\u5730\u5F00\u53D1\u5B89\u88C5\uFF08\u4ECE\u6E90\u7801\u8FD0\u884C\uFF09\uFF0C\u300C\u66F4\u65B0\u5230\u6700\u65B0\u7248\u300D\u4E0D\u53EF\u7528\uFF1B\u8BF7\u7528 git pull + \u6784\u5EFA\u540E\u91CD\u542F\u3002","update.multiInstallWarn":"\u68C0\u6D4B\u5230\u591A\u4E2A botmux \u5B89\u88C5\uFF0Cnpm \u66F4\u65B0\u53EA\u4F1A\u66F4\u65B0 npm \u5168\u5C40\u90A3\u4E2A\uFF0C\u53EF\u80FD\u4E0D\u662F\u5F53\u524D\u751F\u6548\u7684\u7248\u672C\uFF1A","update.kindNpm":"npm \u5168\u5C40","update.kindSource":"\u6E90\u7801 checkout","update.kindUnknown":"\u672A\u77E5","update.btnCheck":"\u68C0\u67E5\u66F4\u65B0","update.btnChangelog":"\u67E5\u770B\u66F4\u65B0\u5185\u5BB9","update.btnChangelogHide":"\u6536\u8D77\u66F4\u65B0\u5185\u5BB9","update.btnUpdate":"\u66F4\u65B0\u5230\u6700\u65B0\u7248","update.btnRestart":"\u91CD\u542F botmux","update.changelogLoading":"\u52A0\u8F7D\u66F4\u65B0\u5185\u5BB9\u2026","update.changelogEmpty":"\u6CA1\u6709\u6BD4\u5F53\u524D\u7248\u672C\u66F4\u65B0\u7684\u53D1\u5E03\u8BF4\u660E\u3002","update.changelogFailed":"\u65E0\u6CD5\u52A0\u8F7D\u66F4\u65B0\u5185\u5BB9\uFF08\u79BB\u7EBF\u6216\u53D7\u7F51\u7EDC\u9650\u5236\uFF09\u3002","update.changelogRateLimited":"GitHub \u63A5\u53E3\u8BF7\u6C42\u8D85\u9650\uFF08\u672A\u767B\u5F55\u6BCF\u5C0F\u65F6\u6BCF IP 60 \u6B21\uFF0C\u5171\u4EAB\u7F51\u7EDC\u6613\u89E6\u53D1\uFF09\uFF0C\u6682\u65F6\u62FF\u4E0D\u5230\u66F4\u65B0\u5185\u5BB9\u3002","update.changelogViewOnGitHub":"\u524D\u5F80 GitHub Releases \u67E5\u770B","update.navBadgeTitle":"\u6709\u65B0\u7248\u672C {version}","update.confirmMultiInstall":`\u68C0\u6D4B\u5230\u591A\u4E2A botmux \u5B89\u88C5\uFF1A
|
|
1
|
+
"use strict";(()=>{var xd=Object.defineProperty;var no=(e,t)=>{for(var n in t)xd(e,n,{get:t[n],enumerable:!0})};var da=class{sessions=new Map;schedules=new Map;online=!0;listeners=new Set;upsertSessions(t){for(let n of t)this.sessions.set(n.sessionId,n);this.emit()}upsertSchedules(t){for(let n of t)this.schedules.set(n.id,n);this.emit()}applySse(t,n){if(t==="session.spawned")this.sessions.set(n.session.sessionId,n.session);else if(t==="session.update"){let a=this.sessions.get(n.sessionId);a&&this.sessions.set(n.sessionId,{...a,...n.patch})}else if(t==="session.exited"){let a=this.sessions.get(n.sessionId);a&&this.sessions.set(n.sessionId,{...a,status:"closed"})}else if(t==="schedule.created")this.schedules.set(n.schedule.id,n.schedule);else if(t==="schedule.updated"){let a=this.schedules.get(n.id);a&&this.schedules.set(n.id,{...a,...n.patch})}else if(t==="schedule.deleted")this.schedules.delete(n.id);else return;this.emit()}setOnline(t){this.online!==t&&(this.online=t,this.emit())}on(t){return this.listeners.add(t),()=>this.listeners.delete(t)}emit(){for(let t of this.listeners)t()}},ke=new da;async function Hr(){let[e,t]=await Promise.all([fetch("/api/sessions").then(o=>o.json()),fetch("/api/schedules").then(o=>o.json())]);ke.upsertSessions(e.sessions??[]),ke.upsertSchedules(t.schedules??[]);let n=new EventSource("/events"),a=["session.spawned","session.update","session.exited","schedule.created","schedule.updated","schedule.deleted","schedule.fired","heartbeat"];for(let o of a)n.addEventListener(o,i=>{try{let r=JSON.parse(i.data);ke.applySse(o,r.body??r)}catch{}});n.onerror=()=>ke.setOnline(!1),n.onopen=()=>ke.setOnline(!0)}var pa="botmux.dashboard.locale",Sd={"app.name":"botmux","app.subtitle":"\u98DE\u4E66 AI CLI \u63A7\u5236\u53F0","time.secondsAgo":"{value} \u79D2\u524D","time.minutesAgo":"{value} \u5206\u949F\u524D","time.hoursAgo":"{value} \u5C0F\u65F6\u524D","nav.overview":"\u603B\u89C8","nav.sessions":"\u4F1A\u8BDD","nav.sidebarCollapse":"\u6536\u8D77\u83DC\u5355\u680F","nav.sidebarExpand":"\u5C55\u5F00\u83DC\u5355\u680F","nav.groups":"\u7FA4\u7EC4","nav.schedules":"\u5B9A\u65F6","nav.settings":"\u8BBE\u7F6E","nav.botDefaults":"Bot \u914D\u7F6E","nav.skills":"Skills","status.live":"\u5B9E\u65F6\u8FDE\u63A5","status.disconnected":"\u8FDE\u63A5\u65AD\u5F00","status.system":"\u7CFB\u7EDF","status.light":"\u6D45\u8272","status.dark":"\u6697\u9ED1","status.language":"\u8BED\u8A00","status.theme":"\u4E3B\u9898","theme.base":"\u57FA\u7840","theme.skins":"\u4E3B\u9898\u76AE\u80A4","skin.cyber":"2077","skin.genshin":"\u539F\u795E","skin.fallout":"Fallout","skin.prts":"PRTS","skin.bluearchive":"\u851A\u84DD\u6863\u6848","skin.zzz":"\u7EDD\u533A\u96F6","skin.dragonball":"\u4E03\u9F99\u73E0","skin.ikun":"ikun","botOnboarding.add":"\u6DFB\u52A0\u673A\u5668\u4EBA","botOnboarding.title":"\u6DFB\u52A0\u673A\u5668\u4EBA","botOnboarding.intro":"\u9009\u62E9 CLI \u4E0E\u5DE5\u4F5C\u76EE\u5F55\uFF0C\u626B\u7801\u521B\u5EFA PersonalAgent \u5E94\u7528\u540E\u5199\u5165\u672C\u673A bots.json\uFF0C\u5E76\u81EA\u52A8\u914D\u7F6E\u5F00\u653E\u5E73\u53F0\u6743\u9650\u3002","botOnboarding.cliLabel":"CLI \u9002\u914D\u5668","botOnboarding.dirLabel":"\u5DE5\u4F5C\u76EE\u5F55","botOnboarding.dirPlaceholder":"\u9ED8\u8BA4 ~\uFF08\u5BB6\u76EE\u5F55\uFF09\uFF0C\u9700\u4E3A daemon \u4E3B\u673A\u4E0A\u5DF2\u5B58\u5728\u7684\u76EE\u5F55","botOnboarding.modelLabel":"\u6A21\u578B\uFF08\u53EF\u9009\uFF09","botOnboarding.modelPlaceholder":"\u7559\u7A7A\u4F7F\u7528\u8BE5 CLI \u7684\u9ED8\u8BA4\u6A21\u578B","botOnboarding.modelTtadkPlaceholder":"ttadk \u7F51\u5173\u6A21\u578B\uFF0C\u9ED8\u8BA4 {model}\uFF0C\u53EF\u6539\uFF08\u968F\u65F6\u5728\u6B64\u8C03\u6574\uFF09","botOnboarding.modelTtadkCocoPlaceholder":"CoCo \u65E0\u9700\u6307\u5B9A\u6A21\u578B","botOnboarding.startScan":"\u5F00\u59CB\u626B\u7801","botOnboarding.cancel":"\u53D6\u6D88","botOnboarding.starting":"\u6B63\u5728\u751F\u6210\u4E8C\u7EF4\u7801...","botOnboarding.waiting":"\u8BF7\u7528\u98DE\u4E66 App \u626B\u7801\u786E\u8BA4\u521B\u5EFA\u5E94\u7528\u3002","botOnboarding.verifying":"\u626B\u7801\u6210\u529F\uFF0C\u6B63\u5728\u6821\u9A8C\u51ED\u8BC1...","botOnboarding.configuringPermissions":"\u6B63\u5728\u81EA\u52A8\u914D\u7F6E\u5F00\u653E\u5E73\u53F0\u6743\u9650\u2026","botOnboarding.platformScanHint":"\u8BF7\u7528\u98DE\u4E66 App \u518D\u626B\u4E00\u6B21\u7801\u767B\u5F55\u5F00\u653E\u5E73\u53F0\uFF08\u7528\u4E8E\u81EA\u52A8\u5BFC\u5165\u6743\u9650\u3001\u914D\u7F6E\u56DE\u8C03\u3001\u63D0\u4EA4\u7248\u672C\uFF09\u3002","botOnboarding.platformQrAlt":"\u5F00\u653E\u5E73\u53F0\u767B\u5F55\u4E8C\u7EF4\u7801","botOnboarding.completed":"\u673A\u5668\u4EBA\u5DF2\u6DFB\u52A0\u3002","botOnboarding.permissionOk":"\u5DF2\u81EA\u52A8\u5BFC\u5165 {count} \u9879\u6743\u9650\u3002","botOnboarding.permissionSkipped":"\uFF08\u8DF3\u8FC7 {count} \u9879\u5F53\u524D\u79DF\u6237\u76EE\u5F55\u4E2D\u6CA1\u6709\u7684\u6743\u9650\uFF09","botOnboarding.permissionVersion":"\u5DF2\u63D0\u4EA4\u53D1\u5E03\u7248\u672C {version}\u3002","botOnboarding.permissionManual":"\u6743\u9650\u672A\u80FD\u81EA\u52A8\u914D\u7F6E\uFF0C\u8BF7\u624B\u52A8\u5B8C\u6210\u4EE5\u4E0B\u6B65\u9AA4\uFF1A","botOnboarding.metaDir":"\u76EE\u5F55","botOnboarding.failed":"\u6DFB\u52A0\u5931\u8D25","botOnboarding.openLink":"\u6253\u4E0D\u5F00\u626B\u7801\uFF1F\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00","botOnboarding.close":"\u5173\u95ED","botOnboarding.restartHint":"\u5DF2\u5199\u5165 bots.json\u3002\u6267\u884C pnpm daemon:restart \u540E\u65B0\u673A\u5668\u4EBA\u751F\u6548\u3002","botOnboarding.needsOwner":"\u65E0\u6CD5\u81EA\u52A8\u786E\u8BA4\u626B\u7801\u4EBA\u8EAB\u4EFD\uFF0C\u8BF7\u624B\u52A8\u586B\u5199 owner \u540E\u518D\u5B8C\u6210\u3002","botOnboarding.ownerLabel":"Owner\uFF08\u673A\u5668\u4EBA\u7BA1\u7406\u8005\uFF09","botOnboarding.ownerPlaceholder":"\u5B8C\u6574\u90AE\u7BB1 / union_id(on_) / open_id(ou_)\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694","botOnboarding.ownerHint":"\u4E3A\u907F\u514D\u300C\u65E0\u4EBA\u662F owner \u65F6\u4EFB\u4F55\u4EBA\u90FD\u80FD\u505A\u7BA1\u7406\u64CD\u4F5C\u300D\uFF0C\u5FC5\u987B\u6307\u5B9A\u81F3\u5C11\u4E00\u4E2A owner\u3002\u5EFA\u8BAE\u7528\u672C\u4F01\u4E1A\u90AE\u7BB1\u6216 union_id(on_)\u3002","botOnboarding.ownerSubmit":"\u4FDD\u5B58 owner \u5E76\u5B8C\u6210","botOnboarding.ownerEmpty":"\u8BF7\u586B\u5199\u81F3\u5C11\u4E00\u4E2A owner\u3002","botOnboarding.ownerInvalid":"owner \u6821\u9A8C\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u540E\u91CD\u8BD5\u3002","botOnboarding.qrAlt":"\u98DE\u4E66\u626B\u7801\u6DFB\u52A0\u673A\u5668\u4EBA\u4E8C\u7EF4\u7801","overview.title":"\u5DE5\u4F5C\u53F0","overview.subtitle":"\u6570\u5B57\u5458\u5DE5\u5B9E\u65F6\u72B6\u6001 \xB7 \u540C\u6B65\u98DE\u4E66\u8BDD\u9898","overview.team":"AI \u56E2\u961F","overview.teamHint":"\u6BCF\u4F4D\u6570\u5B57\u5458\u5DE5\u7684\u5B9E\u65F6\u72B6\u6001","overview.attention":"\u9700\u8981\u4F60\u5904\u7406","overview.attentionHint":"\u5361\u4F4F\u7684\u4EFB\u52A1\uFF0C\u56DE\u4E2A\u8BDD\u5C31\u80FD\u7EE7\u7EED\u8DD1","overview.activeSessions":"\u6D3B\u8DC3\u4F1A\u8BDD","overview.activeSessionsHint":"\u6B63\u5728\u8FD0\u8F6C\u7684\u4F1A\u8BDD","overview.today":"\u6B64\u523B\u6982\u89C8","overview.todayHint":"\u6D3B\u8DC3\u4F1A\u8BDD\u5206\u5E03","overview.viewAll":"\u67E5\u770B\u5168\u90E8 \u2192","overview.botIdle":"\u5F85\u547D\u4E2D\uFF0C\u968F\u65F6\u53EF\u63A5\u65B0\u4EFB\u52A1","overview.botOffline":"\u79BB\u7EBF \u2014 daemon \u672A\u4E0A\u7EBF","overview.botBusy":"\u6267\u884C\u4E2D \xB7 {count} \u4F1A\u8BDD","overview.botNeedsYou":"\u7B49\u4F60\u56DE\u590D","overview.botReady":"\u5C31\u7EEA","overview.botOff":"\u79BB\u7EBF","overview.sessionsCount":"{count} \u4F1A\u8BDD","overview.lastActive":"{time}\u524D\u6D3B\u8DC3","overview.noAttention":"\u6CA1\u6709\u7B49\u4F60\u5904\u7406\u7684\u4E8B\u9879","overview.teamExpand":"\u5C55\u5F00\u5168\u90E8 {count} \u4F4D \u25BE","overview.teamCollapse":"\u6536\u8D77 \u25B4","strip.pending":"{count} \u4EF6\u5F85\u5904\u7406","strip.longest":"\u6700\u4E45\u5DF2\u7B49 {time} \u2014 {bot} {reason}","strip.handle":"\u7ACB\u5373\u5904\u7406","overview.openSessions":"\u6D3B\u8DC3\u4F1A\u8BDD","overview.workingSessions":"\u5DE5\u4F5C\u4E2D","overview.onlineBots":"\u5728\u7EBF Bot","overview.schedules":"\u5B9A\u65F6\u4EFB\u52A1","overview.groups":"\u7FA4\u804A\u8986\u76D6","overview.enabledSchedules":"\u5DF2\u542F\u7528","overview.total":"\u603B\u8BA1","overview.active":"\u6D3B\u8DC3","overview.daemonRegistry":"daemon \u6CE8\u518C\u8868","overview.chatMatrix":"\u7FA4\u804A\u77E9\u9635","overview.recentSessions":"\u6700\u8FD1\u4F1A\u8BDD","overview.nextSchedules":"\u5373\u5C06\u6267\u884C","overview.noSessions":"\u6682\u65E0\u4F1A\u8BDD\u3002","overview.noSchedules":"\u6682\u65E0\u5B9A\u65F6\u4EFB\u52A1\u3002","sessions.title":"\u4F1A\u8BDD\u63A7\u5236","sessions.subtitle":"\u5B9A\u4F4D\u98DE\u4E66\u8BDD\u9898\u3001\u6253\u5F00 Web Terminal\u3001\u5173\u95ED\u6216\u6062\u590D CLI \u4F1A\u8BDD\u3002","sessions.search":"\u641C\u7D22\u5DE5\u4F5C\u76EE\u5F55 / \u6807\u9898 / ID","sessions.anyStatus":"\u5168\u90E8\u72B6\u6001","sessions.adoptAny":"adopt: \u5168\u90E8","sessions.adoptYes":"adopt: \u662F","sessions.adoptNo":"adopt: \u5426","sessions.activeOnly":"\u4EC5\u6D3B\u8DC3","sessions.closeSelected":"\u5173\u95ED\u9009\u4E2D","sessions.clearSelection":"\u53D6\u6D88\u9009\u62E9","sessions.selectedCount":"\u5DF2\u9009 {count} \u4E2A\u4F1A\u8BDD","sessions.idleCleanupOlderThan":"\u7A7A\u95F2\u8D85\u8FC7","sessions.idleCleanupThreshold":"\u7A7A\u95F2\u6E05\u7406\u9608\u503C","sessions.idleCleanupRun":"\u6E05\u7406\u7A7A\u95F2","sessions.idleCleanupCount":"\u53EF\u6E05\u7406 {count} \u4E2A","sessions.idleCleanupConfirm":"\u5C06\u5173\u95ED {count} \u4E2A\u7A7A\u95F2\u8D85\u8FC7 {threshold} \u7684\u4F1A\u8BDD\uFF0C\u786E\u5B9A\u7EE7\u7EED\uFF1F","sessions.idleCleanupRunning":"\u6E05\u7406\u4E2D\u2026","sessions.idleCleanupDone":"\u5DF2\u5173\u95ED {closed} \u4E2A\uFF0C\u5931\u8D25 {failed} \u4E2A","sessions.idleCleanupFailed":"\u6E05\u7406\u5931\u8D25","sessions.lock":"\u9501\u5B9A\u4F1A\u8BDD","sessions.unlock":"\u89E3\u9501\u4F1A\u8BDD","sessions.locked":"\u9501\u5B9A","sessions.lockSelected":"\u9501\u5B9A\u9009\u4E2D","sessions.unlockSelected":"\u89E3\u9501\u9009\u4E2D","sessions.lockFailed":"\u9501\u5B9A\u72B6\u6001\u66F4\u65B0\u5931\u8D25","sessions.bot":"bot","sessions.cli":"CLI","sessions.chat":"\u7FA4\u804A","sessions.openChat":"\u6253\u5F00\u7FA4\u804A","sessions.status":"\u72B6\u6001","sessions.tokenIn":"Token In","sessions.tokenOut":"Token Out","sessions.titleCol":"\u6807\u9898","sessions.workingDir":"\u5DE5\u4F5C\u76EE\u5F55","sessions.created":"\u521B\u5EFA","sessions.last":"\u6700\u8FD1","sessions.adopt":"\u63A5\u5165","sessions.actions":"\u64CD\u4F5C","sessions.details":"\u8BE6\u60C5","sessions.copy":"\u590D\u5236","sessions.copied":"\u5DF2\u590D\u5236","sessions.locate":"\u5B9A\u4F4D\u8BDD\u9898","sessions.locating":"\u53D1\u9001\u4E2D...","sessions.cooldown":"\u51B7\u5374 {seconds}s","sessions.openTerminal":"\u7EC8\u7AEF","sessions.writeLink":"\u64CD\u4F5C\u94FE\u63A5","sessions.writeLinkHint":"\u83B7\u53D6\u53EF\u64CD\u4F5C\u7EC8\u7AEF\u94FE\u63A5\uFF08\u5E26\u5199\u6743\u9650 token\uFF0C\u65B0\u6807\u7B7E\u6253\u5F00\uFF09","sessions.writeLinkFail":"\u83B7\u53D6\u64CD\u4F5C\u94FE\u63A5\u5931\u8D25","sessions.close":"\u5173\u95ED\u4F1A\u8BDD","sessions.restart":"\u91CD\u542F CLI","sessions.restartConfirmIntro":"\u51C6\u5907\u91CD\u542F\u5F53\u524D CLI\u3002","sessions.restartConfirmStatus":"\u5F53\u524D\u72B6\u6001","sessions.restartConfirmCli":"CLI","sessions.restartConfirmQuestion":"\u786E\u8BA4\u91CD\u542F\u8FD9\u4E2A CLI\uFF1F","sessions.restartFailed":"\u91CD\u542F\u5931\u8D25","sessions.resume":"\u6062\u590D\u4F1A\u8BDD","sessions.dismiss":"\u5173\u95ED","sessions.closeConfirm":"\u5173\u95ED\u8FD9\u4E2A\u4F1A\u8BDD\uFF1F","sessions.resumeFailed":"\u6062\u590D\u5931\u8D25","sessions.land":"\u843D\u76D8","sessions.landLoading":"\u52A0\u8F7D\u6C99\u76D2 diff\u2026","sessions.landUnavailable":"\u65E0\u6CD5\u843D\u76D8","sessions.landEmpty":"\u6C99\u76D2\u526F\u672C\u6CA1\u6709\u6539\u52A8\u3002","sessions.landApply":"\u5E94\u7528\u5230\u78C1\u76D8","sessions.landDiscard":"\u4E22\u5F03","sessions.landApplied":"\u5DF2\u843D\u76D8","sessions.landFailed":"\u843D\u76D8\u5931\u8D25","sessions.landDiscarded":"\u5DF2\u4E22\u5F03\uFF08\u6C99\u76D2\u526F\u672C\u672A\u5E94\u7528\uFF09\u3002","sessions.insight":"\u6D1E\u5BDF","sessions.insightLoading":"\u5206\u6790\u4E2D\u2026","sessions.insightUnavailable":"\u65E0\u6CD5\u5206\u6790","sessions.insightEmpty":"\u672C\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u53EF\u5206\u6790\u7684\u5DE5\u5177 span\u3002","sessions.insightMetrics":"span {total} \xB7 \u5931\u8D25 {failed} \xB7 \u6162 {slow} \xB7 \u8BFB\u6539\u6BD4 {rw} \xB7 \u538B\u7F29 {compactions}","sessions.insightSuggestions":"\u5EFA\u8BAE","sessions.insightSpans":"\u52A8\u4F5C span","sessions.insightCapped":"\u4EC5\u663E\u793A\u524D {shown}/{total} \u6761","sessions.insightAsOf":"\u622A\u81F3 {asOf}","sessions.insightPartial":"\uFF08\u53EF\u80FD\u4E0D\u542B\u8FDB\u884C\u4E2D\u7684\u6700\u65B0\u4E00\u8F6E\uFF09","nav.insights":"\u6D1E\u5BDF","insights.title":"\u5DE5\u4F5C\u6D41\u6D1E\u5BDF","insights.subtitle":"\u53EA\u8BFB\u5206\u6790\u672C\u673A Claude Code / Codex \u4F1A\u8BDD\u7684\u52A8\u4F5C\u8F68\u8FF9\u3001\u5931\u8D25\u4E0E\u6469\u64E6\uFF0C\u7ED9\u51FA\u89C4\u5219\u578B\u4F18\u5316\u5EFA\u8BAE\u3002","insights.refresh":"\u5237\u65B0","insights.search":"\u641C\u7D22\u4F1A\u8BDD / bot / \u76EE\u5F55\u2026","insights.filter":"\u7B5B\u9009","insights.filterAll":"\u5168\u90E8","insights.filterReview":"\u503C\u5F97\u590D\u76D8","insights.filterFailed":"\u6709\u5931\u8D25","insights.filterSlow":"\u6709\u6162 span","insights.loading":"\u5206\u6790\u4E2D\u2026","insights.loaded":"\u5DF2\u52A0\u8F7D {count} \u4E2A\u4F1A\u8BDD","insights.unavailable":"\u52A0\u8F7D\u5931\u8D25","insights.listCount":"\u663E\u793A {shown}/{total}","insights.tabOverview":"\u603B\u89C8","insights.tabSessions":"\u4F1A\u8BDD","insights.tabDist":"\u5206\u5E03","insights.tabHot":"\u70ED\u70B9","insights.projectAll":"\u5168\u90E8\u9879\u76EE","insights.timeAll":"\u5168\u90E8\u65F6\u95F4","insights.time1d":"\u8FD1 1 \u5929","insights.time7d":"\u8FD1 7 \u5929","insights.time30d":"\u8FD1 30 \u5929","insights.clear":"\u6E05\u9664","insights.emptyAnalyzableHint":"\u52FE\u9009\u300C\u542B\u672A\u5206\u6790\u300D\u53EF\u67E5\u770B\u5176\u4F59\u4F1A\u8BDD","insights.showAll":"\u542B\u672A\u5206\u6790","insights.distHint":"\u5F53\u524D\u7B5B\u9009\u4E0B\u5404\u4F1A\u8BDD\u7684\u6307\u6807\u5206\u5E03\u2014\u2014\u770B\u8D70\u52BF\u3001\u770B\u5178\u578B\u503C\u843D\u5728\u54EA\u3002","insights.distSpans":"\u6BCF\u4F1A\u8BDD span \u6570","insights.distFailed":"\u6BCF\u4F1A\u8BDD\u5931\u8D25\u6570","insights.distSlow":"\u6BCF\u4F1A\u8BDD\u6162 span","insights.distAgentTime":"agent \u5DE5\u4F5C\u65F6\u957F","insights.distRw":"\u8BFB\u6539\u6BD4","insights.distChurn":"\u4EE3\u7801\u6539\u52A8\u884C\u6570","insights.distTrend":"\u6309\u5929\u8D8B\u52BF\uFF08\u8FD1 4 \u5468\uFF09","insights.distTrendSub":"\u6BCF\u65E5\u4F1A\u8BDD\u6570","insights.distMedian":"\u4E2D\u4F4D {v}","insights.distEmpty":"\u5F53\u524D\u7B5B\u9009\u4E0B\u6CA1\u6709\u53EF\u5206\u6790\u7684\u4F1A\u8BDD\u3002","insights.disclosure":"\u53E3\u5F84\uFF1A\u8017\u65F6\u53EA\u7B97\u5DE5\u5177\u6267\u884C\u65F6\u95F4\uFF0C\u5DF2\u5254\u9664\u7B49\u7528\u6237\u56DE\u590D\uFF08\u95EE\u7B54/\u8BA1\u5212\u786E\u8BA4\uFF09\u7684\u6302\u673A\u65F6\u957F\uFF0C\u6545\u4E0D\u53CD\u6620\u5899\u949F\u65F6\u957F\uFF1BCodex \u4F1A\u8BDD\u7684\u300C\u8BFB\u300D\u591A\u8D70 shell\uFF08exec_command\uFF09\uFF0C\u4E0D\u8BA1\u5165\u300C\u8BFB\u300D\u76F8\uFF0C\u6545\u5176\u8BFB\u6539\u6BD4\u4F1A\u504F\u4F4E\u751A\u81F3\u4E3A 0\uFF1B\u4EE3\u7801\u6539\u52A8\u6309 patch \u89E3\u6790\uFF0C\u4EC5\u53D6\u6BCF\u4F1A\u8BDD\u6700\u6D3B\u8DC3\u7684\u82E5\u5E72\u6587\u4EF6\uFF0C\u4E0E Claude \u7684\u7ED3\u6784\u5316\u7EDF\u8BA1\u53E3\u5F84\u4E0D\u540C\u3002\u8DE8\u5DE5\u5177\u7684\u5206\u5E03\u4E0E\u6BD4\u503C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u4E0D\u5B9C\u76F4\u63A5\u5BF9\u6BD4\u3002","insights.rwNote":"Codex \u8BFB\u591A\u8D70 shell\uFF0C\u672A\u8BA1\u5165\u8BFB\u76F8","insights.viewSessions":"\u6309\u4F1A\u8BDD\u67E5\u770B","insights.hotHint":"\u8DE8\u4F1A\u8BDD\u590D\u53D1\u4FE1\u53F7\u2014\u2014\u6700\u8BE5\u6536\u655B\u7684\u5730\u65B9\u3002","insights.hotToolFailures":"\u5DE5\u5177\u62A5\u9519\u70ED\u70B9","insights.hotSlowSessions":"\u6700\u6162\u7684\u4F1A\u8BDD","insights.hotProjects":"\u9879\u76EE\u5206\u5E03","insights.hotFiles":"\u6587\u4EF6\u590D\u53D1\u70ED\u70B9","insights.hotCommands":"\u547D\u4EE4\u590D\u53D1\u70ED\u70B9","insights.hotErrors":"\u62A5\u9519\u590D\u53D1\u70ED\u70B9","insights.hotComingSoon":"\u6587\u4EF6 / \u547D\u4EE4\u590D\u53D1\u70ED\u70B9\u5373\u5C06\u4E0A\u7EBF\uFF08\u9700\u7ED9\u5F15\u64CE\u52A0\u8DE8\u4F1A\u8BDD\u805A\u5408\uFF09\u3002","insights.hotSessionsCol":"\u4F1A\u8BDD","insights.hotFailsCol":"\u5931\u8D25","insights.hotSlowCol":"\u6162","insights.backToList":"\u8FD4\u56DE\u5217\u8868","insights.sortLabel":"\u6392\u5E8F","insights.sortRecent":"\u6700\u8FD1","insights.sortReview":"\u56DE\u770B\u5206","insights.sortSpans":"span \u6570","insights.sortFails":"\u5931\u8D25","insights.sortSlow":"\u6162","insights.sortAgent":"\u65F6\u957F","insights.layoutCard":"\u5361\u7247","insights.layoutTable":"\u8868\u683C","insights.colTitle":"\u4F1A\u8BDD","insights.colProject":"\u9879\u76EE","insights.colTime":"\u65F6\u95F4","insights.paletteOpen":"\u8DF3\u8F6C \u2318K","insights.palettePlaceholder":"\u8DF3\u8F6C\u5230 tab \u6216\u641C\u7D22\u4F1A\u8BDD\u2026","insights.paletteTabs":"\u89C6\u56FE","insights.paletteSessions":"\u4F1A\u8BDD","insights.paletteEmpty":"\u6CA1\u6709\u5339\u914D\u9879","insights.tabFlow":"\u884C\u4E3A\u6D41","insights.flowHint":"\u667A\u80FD\u4F53\u628A\u52A8\u4F5C\u4E0E\u65F6\u95F4\u82B1\u5728\u54EA\u4E9B\u6D3B\u52A8\u9636\u6BB5\uFF0C\u4EE5\u53CA\u5404\u4F1A\u8BDD\u7684\u8282\u594F\u5206\u5E03\u3002","insights.flowPipeline":"\u6D3B\u52A8\u9636\u6BB5\u6D41\u6C34\u7EBF","insights.flowPipeSub":"\u7814\u7A76 \u2192 \u4FEE\u6539 \u2192 \u8FD0\u884C \u2192 \u59D4\u6D3E \u2192 \u8BA8\u8BBA\uFF1B\u4E0A=\u52A8\u4F5C\u6570\uFF0C\u4E0B=\u8017\u65F6","insights.flowShares":"\u52A8\u4F5C\u5360\u6BD4 vs \u65F6\u95F4\u5360\u6BD4","insights.flowActShare":"\u52A8\u4F5C\u5360\u6BD4","insights.flowTimeShare":"\u65F6\u95F4\u5360\u6BD4","insights.flowRhythm":"\u5404\u4F1A\u8BDD\u8282\u594F\uFF08\u6309\u65F6\u957F\uFF09","insights.subagents":"\u5B50\u4EE3\u7406","insights.subagentsHint":"\u672C\u4F1A\u8BDD\u59D4\u6D3E\u51FA\u53BB\u7684\u5B50\u4EE3\u7406\uFF08Task/Agent\uFF09\uFF0C\u5404\u81EA\u505A\u4E86\u4EC0\u4E48\u3001\u8DD1\u4E86\u591A\u4E45\u3002","insights.readsShort":"\u8BFB","insights.editsShort":"\u6539","insights.durShort":"\u65F6\u957F","insights.empty":"\u6CA1\u6709\u5339\u914D\u7684\u4F1A\u8BDD\u3002","insights.selectSession":"\u4ECE\u5DE6\u4FA7\u9009\u4E00\u4E2A\u4F1A\u8BDD\uFF0C\u67E5\u770B\u52A8\u4F5C span \u4E0E\u5EFA\u8BAE\u3002","insights.detailLoading":"\u52A0\u8F7D\u4F1A\u8BDD\u8BE6\u60C5\u2026","insights.recommendations":"\u4F18\u5316\u5EFA\u8BAE","insights.recommendationsHint":"\u57FA\u4E8E\u89C4\u5219\u7684\u8DE8\u4F1A\u8BDD\u6C47\u603B\uFF0C\u6BCF\u6761\u53EF\u8FFD\u6EAF\u5230\u6307\u6807\u3002","insights.noRecommendations":"\u6682\u65E0\u5EFA\u8BAE\u3002","insights.seenInSessions":"\u51FA\u73B0\u5728 {count} \u4E2A\u4F1A\u8BDD","insights.toolFailures":"\u9AD8\u9891\u5DE5\u5177\u5931\u8D25","insights.toolFailuresHint":"\u6309\u5DE5\u5177\u6C47\u603B\u5931\u8D25 span\u3002","insights.noFailures":"\u6CA1\u6709\u5931\u8D25 span\u3002","insights.metricSessions":"\u4F1A\u8BDD","insights.metricAnalyzed":"\u5DF2\u5206\u6790 {count}","insights.metricSpans":"span","insights.metricSafe":"\u5DF2\u8131\u654F","insights.metricFailed":"\u5931\u8D25 span","insights.metricSlow":"\u6162 span","insights.metricRw":"\u8BFB\u6539\u6BD4","insights.metricCompactions":"\u538B\u7F29 {count}","insights.spansShort":"span ","insights.failedShort":"\u5931\u8D25 ","insights.slowShort":"\u6162 ","insights.rwShort":"\u8BFB\u6539 ","insights.unsupported":"\u8BE5 CLI \u6682\u4E0D\u652F\u6301","insights.noTranscript":"\u6682\u65E0 transcript","insights.parseError":"\u89E3\u6790\u5931\u8D25","insights.noSpans":"\u6682\u65E0\u53EF\u5206\u6790 span\u3002","insights.sevBad":"\u4E25\u91CD","insights.sevWarn":"\u6CE8\u610F","insights.sevInfo":"\u63D0\u793A","insights.phase.research":"\u7814\u7A76","insights.phase.edit":"\u4FEE\u6539","insights.phase.run":"\u8FD0\u884C","insights.phase.delegate":"\u59D4\u6D3E","insights.phase.discuss":"\u8BA8\u8BBA","insights.trace":"\u52A8\u4F5C span","insights.ledger":"\u9010\u8F6E\u5BF9\u8D26","insights.detailTabs":"\u89C2\u6D4B\u660E\u7EC6","insights.spanStatus":"\u72B6\u6001","insights.spanTool":"\u5DE5\u5177","insights.spanPhase":"\u9636\u6BB5","insights.spanDuration":"\u8017\u65F6","insights.spanTurn":"\u8F6E","insights.spanSummary":"\u6458\u8981","insights.ledgerMore":"\u5C55\u5F00\u53E6\u5916 {count} \u6761\u6458\u8981","insights.ledgerOmitted":"\u8FD8\u6709 {count} \u6761\u5DF2\u6298\u53E0","insights.ledgerNoContent":"\u672C\u8F6E\u6CA1\u6709\u53EF\u5C55\u793A\u7684\u8131\u654F\u6458\u8981\u3002","insights.diagShow":"\u67E5\u770B\u8BC1\u636E","insights.diagActive":"\u6B63\u5728\u67E5\u770B","insights.evMatched":"\u547D\u4E2D {count} \u6761\u8BC1\u636E","insights.evMatchedCapped":"\u547D\u4E2D {matched} \u6761\uFF0C\u663E\u793A\u524D {shown} \u6761","insights.evDefault":"\u91CD\u70B9 {shown} / \u5171 {total} \u6761","insights.evShowAll":"\u663E\u793A\u5168\u90E8 {count} \u6761","insights.evBackToEvidence":"\u53EA\u770B\u91CD\u70B9","insights.intent.run_script":"\u8FD0\u884C\u811A\u672C","insights.intent.test":"\u6D4B\u8BD5","insights.intent.typecheck":"\u7C7B\u578B\u68C0\u67E5","insights.intent.lint":"Lint","insights.intent.git":"Git","insights.intent.search":"\u641C\u7D22","insights.intent.read_file":"\u8BFB\u6587\u4EF6","insights.intent.edit_file":"\u6539\u6587\u4EF6","insights.intent.write_file":"\u5199\u6587\u4EF6","insights.intent.delegate":"\u59D4\u6D3E","insights.intent.unknown":"\u64CD\u4F5C","insights.result.ok":"\u6210\u529F","insights.result.tool_error":"\u5DE5\u5177\u62A5\u9519","insights.result.test_failed":"\u6D4B\u8BD5\u5931\u8D25","insights.result.typecheck_failed":"\u7C7B\u578B\u68C0\u67E5\u5931\u8D25","insights.result.lint_failed":"Lint \u5931\u8D25","insights.result.command_failed":"\u547D\u4EE4\u5931\u8D25","insights.result.timeout":"\u8D85\u65F6","insights.result.no_output":"\u65E0\u8F93\u51FA","insights.result.unknown":"\u672A\u77E5","insights.tag.failure":"\u5931\u8D25","insights.tag.slow":"\u6162","insights.tag.retry":"\u8FD4\u5DE5","insights.tag.read_write_imbalance":"\u8BFB\u6539\u5931\u8861","insights.tag.diagnostic":"\u8BCA\u65AD","insights.tag.normal":"\u6B63\u5E38","insights.turnHeadline.turn_has_failures":"\u672C\u8F6E {failures} \u6B21\u5931\u8D25","insights.turnHeadline.turn_has_slow_spans":"\u672C\u8F6E\u6709\u8017\u65F6\u504F\u957F\u7684\u64CD\u4F5C","insights.turnHeadline.turn_has_retries":"\u672C\u8F6E\u53CD\u590D\u91CD\u8BD5\u540C\u4E00\u64CD\u4F5C","insights.turnHeadline.turn_read_write_imbalance":"\u672C\u8F6E\u6539\u591A\u8BFB\u5C11\uFF08\u6539 {edits} / \u8BFB {reads}\uFF09","insights.evTimeline":"\u5168\u90E8 {count} \u6761 span \u65F6\u95F4\u7EBF","insights.evNoFlags":"\u6CA1\u6709\u88AB\u6807\u8BB0\u4E3A\u5931\u8D25 / \u6162 / \u8FD4\u5DE5\u7684 span","insights.turnAllNormal":"{count} \u4E2A\u8F6E\u6B21\u90FD\u6B63\u5E38\uFF0C\u6CA1\u6709\u503C\u5F97\u590D\u76D8\u7684","insights.turnEvidence":"\u67E5\u770B\u672C\u8F6E {count} \u6761\u8BC1\u636E","insights.turnHiddenNormal":"\u53E6\u6709 {count} \u4E2A\u6B63\u5E38\u8F6E\u6B21\uFF08\u5DF2\u9690\u85CF\uFF09","insights.mReads":"\u8BFB","insights.mEdits":"\u6539","insights.mRuns":"\u8DD1","insights.mFailures":"\u5931\u8D25","insights.mDur":"\u8017\u65F6","insights.turnHeadline.turn_normal":"\u6B63\u5E38","insights.rec.fix_repeated_tool_failures":"\u53CD\u590D\u5931\u8D25\u7684\u547D\u4EE4\u9700\u8981\u6536\u655B","insights.rec.split_slow_operation":"\u6162\u64CD\u4F5C\u62D6\u6162\u4E86\u6574\u4E2A\u4F1A\u8BDD","insights.rec.add_read_pass_before_edit":"\u6539\u4E4B\u524D\u8BFB\u5F97\u592A\u5C11","insights.rec.preserve_context_checkpoints":"\u4E0A\u4E0B\u6587\u88AB\u538B\u7F29\uFF0C\u6CE8\u610F\u7559\u5B58\u6863","insights.impact.impact_failed_spans":"{failedSpans} \u4E2A\u52A8\u4F5C\u5931\u8D25\uFF08\u6700\u591A\uFF1A{topTool} \xD7{topToolFailures}\uFF09","insights.impact.impact_slow_spans":"{slowSpansTotal} \u4E2A\u6162\u52A8\u4F5C\u62D6\u6162\u8FDB\u5EA6","insights.impact.impact_low_read_write_ratio":"\u6539\u4E86 {writeSpans} \u5904\uFF0C\u53EA\u8BFB\u4E86 {readSpans} \u5904","insights.impact.impact_context_compaction":"\u672C\u4F1A\u8BDD\u53D1\u751F {compactions} \u6B21\u4E0A\u4E0B\u6587\u538B\u7F29","insights.why.why_tool_failure_concentrated":"\u5931\u8D25\u96C6\u4E2D\u5728 {topTool}\uFF08\u5171 {topToolFailures} \u6B21\uFF09\uFF0C\u591A\u534A\u662F\u540C\u4E00\u7C7B\u95EE\u9898","insights.why.why_slow_span_dominates":"\u5C11\u6570\u8017\u65F6\u52A8\u4F5C\u5360\u4E86\u5927\u5934\uFF0C\u6700\u6162\u7684\u662F {slowestTool}","insights.why.why_edits_outpaced_reads":"\u8BFB\u5199\u6BD4 {readWriteRatio}\uFF0C\u6539\u5F97\u6BD4\u8BFB\u5F97\u591A\u5BB9\u6613\u8E29\u5751\u8FD4\u5DE5","insights.why.why_context_compaction_happened":"\u957F\u4F1A\u8BDD\u88AB\u538B\u7F29\uFF0C\u65E9\u671F\u7684\u51B3\u7B56/\u4E0A\u4E0B\u6587\u53EF\u80FD\u5DF2\u4E22\u5931","insights.action.inspect_failed_span_details":"\u9010\u4E2A\u770B\u5931\u8D25\u52A8\u4F5C\u7684\u8BE6\u60C5\uFF0C\u5B9A\u4F4D\u6839\u56E0","insights.action.add_preflight_or_timeout":"\u7ED9\u9AD8\u9891\u5931\u8D25\u7684\u547D\u4EE4\u52A0\u524D\u7F6E\u68C0\u67E5\u6216\u8D85\u65F6\u63A7\u5236","insights.action.narrow_or_split_slow_operation":"\u628A\u6162\u64CD\u4F5C\u6536\u7A84\u6216\u62C6\u5C0F\uFF08\u5982\u53EA\u8DD1\u5B9A\u5411\u7528\u4F8B\uFF09","insights.action.surface_timeout_or_progress":"\u66F4\u65E9\u66B4\u9732\u8D85\u65F6/\u8FDB\u5EA6\uFF0C\u522B\u8BA9\u5B83\u9ED8\u9ED8\u5361\u4F4F","insights.action.read_or_search_before_editing":"\u6539\u964C\u751F\u6587\u4EF6\u524D\u5148\u8BFB\u4E00\u904D\u6216\u641C\u4E00\u4E0B","insights.action.verify_assumptions_before_running":"\u52A8\u624B\u524D\u5148\u9A8C\u8BC1\u5047\u8BBE\uFF0C\u51CF\u5C11\u76F2\u6539","insights.action.write_checkpoints_for_long_tasks":"\u957F\u4EFB\u52A1\u628A\u51B3\u7B56\u548C\u68C0\u67E5\u70B9\u843D\u5230\u7B14\u8BB0\u91CC","insights.struct.shell":"shell \u547D\u4EE4","insights.struct.fileEdit":"\u6587\u4EF6\u7F16\u8F91","insights.struct.readSearch":"\u8BFB\u53D6/\u641C\u7D22","insights.struct.agentTask":"\u5B50 agent \u4EFB\u52A1","insights.struct.toolInput":"\u5DE5\u5177\u8F93\u5165","insights.struct.toolResult":"\u5DE5\u5177\u8F93\u51FA","insights.struct.toolError":"\u5DE5\u5177\u62A5\u9519","insights.struct.patchFailed":"\u8865\u4E01\u5931\u8D25","insights.struct.patchApplied":"\u8865\u4E01\u5DF2\u5E94\u7528","insights.struct.exit":"exit {code}","insights.spanAll":"\u5168\u90E8","insights.dDetail":"\u8BE6\u60C5","insights.dCollapse":"\u6536\u8D77","insights.dPhase":"\u9636\u6BB5","insights.dStart":"\u8D77\u59CB","insights.dDur":"\u8017\u65F6","insights.dIntent":"\u610F\u56FE","insights.dResult":"\u7ED3\u679C","insights.dIn":"\u8F93\u5165","insights.dOut":"\u8F93\u51FA","insights.dTags":"\u6807\u7B7E","insights.dTurnContext":"\u7B2C {turn} \u8F6E\u4E0A\u4E0B\u6587","insights.advice.failure":"\u{1F4A1} \u770B\u6E05\u62A5\u9519\u518D\u52A8\u624B\uFF0C\u522B\u76F2\u76EE\u91CD\u8BD5","insights.advice.retry":"\u{1F4A1} \u540C\u4E00\u6B65\u53CD\u590D\u91CD\u8BD5\u2014\u2014\u5148\u5B9A\u4F4D\u6839\u56E0\u518D\u7EE7\u7EED","insights.advice.read_write_imbalance":"\u{1F4A1} \u6539\u4E4B\u524D\u5148\u8BFB\u76F8\u5173\u6587\u4EF6\uFF0C\u51CF\u5C11\u8FD4\u5DE5","insights.advice.slow":"\u{1F4A1} \u6162\u64CD\u4F5C\uFF1A\u8003\u8651\u8DD1\u5B9A\u5411\u7528\u4F8B\u6216\u62C6\u5C0F","insights.turnPrompt":"\u7528\u6237","insights.turnExpand":"\u5C55\u5F00 {count} \u6B65","insights.turnCollapse":"\u6536\u8D77","insights.turnRail":"\u4F1A\u8BDD\u8F68\u8FF9","insights.gantt":"\u5DE5\u4F5C\u65F6\u5E8F","insights.ganttCaption":"{span} \u4E2A\u52A8\u4F5C \xB7 \u8DE8\u5EA6 {dur} \xB7 \u6D3B\u8DC3 {active}","insights.ctxCurve":"\u4E0A\u4E0B\u6587\u66F2\u7EBF","insights.ctxCaption":"\u6BCF\u8F6E\u5CF0\u503C in+cache \xB7 \u5CF0\u503C {peak} \xB7 {turns} \u8F6E","insights.ctxTurn":"\u8F6E {n}","insights.railSubagent":"\u5B50\u4EE3\u7406","insights.railSubagents":"{n} \u4E2A\u5B50\u4EE3\u7406","insights.turnPromptExpand":"\u5C55\u5F00","insights.turnPromptCollapse":"\u6536\u8D77","insights.turnPromptRaw":"\u539F\u6587","insights.turnPromptRendered":"\u6E32\u67D3","insights.srcMentions":"\u63D0\u5230","insights.senderHuman":"\u7528\u6237","insights.senderA2A":"A2A","insights.senderOther":"\u5176\u4ED6","insights.senderSystem":"\u7CFB\u7EDF","insights.turnPromptFull":"\u5168\u6587","insights.modalClose":"\u5173\u95ED","insights.promptTruncated":"\u5185\u5BB9\u8F83\u957F\uFF0C\u5DF2\u622A\u65AD","insights.replay":"\u5BF9\u8BDD\u56DE\u653E","insights.replayAgent":"agent \u64CD\u4F5C","insights.replaySearch":"\u641C\u7D22\u5BF9\u8BDD\u5185\u5BB9\u2026","insights.replayBy":"\u53D1\u8D77\u4EBA","insights.replayState":"\u72B6\u6001","insights.replayLoadMore":"\u52A0\u8F7D\u66F4\u591A\uFF08{shown}/{total}\uFF09","insights.replayAllLoaded":"\u5DF2\u5168\u90E8\u52A0\u8F7D\uFF08\u5171 {total} \u6761\uFF09","insights.replayEmpty":"\u6CA1\u6709\u5339\u914D\u7684\u6D88\u606F","insights.replayNoText":"\uFF08\u65E0\u6B63\u6587\uFF0C\u89C1\u64CD\u4F5C\uFF09","insights.replayOps":"{count} \u6B65\u64CD\u4F5C","insights.wsFiles":"\u6587\u4EF6\u6539\u52A8 \xB7 {n}","insights.wsCmds":"\u8DD1\u8FC7\u7684\u547D\u4EE4 \xB7 {n}","insights.wsReads":"\u8BFB {n}","insights.wsEdits":"\u6539 {n}","insights.wsFail":"\u5931\u8D25 {n}","insights.wsNoFiles":"\u65E0\u6587\u4EF6\u6539\u52A8","insights.wsNoCmds":"\u65E0\u547D\u4EE4\u8BB0\u5F55","insights.turnSummary":"\u5171 {total} \u8F6E \xB7 {flagged} \u8F6E\u9700\u5173\u6CE8","insights.dCommand":"\u547D\u4EE4","insights.dCmdOutput":"\u6267\u884C\u7ED3\u679C","insights.ledgerNormal":"\u6B63\u5E38\u6392\u5E8F","insights.ledgerGrouped":"\u6309\u5EFA\u8BAE\u5206\u7C7B","insights.ledgerOther":"\u5176\u4ED6\u8F6E\u6B21","insights.ledgerGroupCount":"{count} \u8F6E","insights.turnsCapped":"\u4EC5\u542B\u524D {shown}/{total} \u4E2A\u52A8\u4F5C\uFF0C\u65F6\u95F4\u7EBF\u53EF\u80FD\u4E0D\u5B8C\u6574","insights.suggestion.high_tool_failure.title":"\u5DE5\u5177\u5931\u8D25\u504F\u591A","insights.suggestion.high_tool_failure.action":"\u4F18\u5148\u770B\u5931\u8D25 span\uFF0C\u628A\u9AD8\u9891\u5931\u8D25\u547D\u4EE4\u505A\u524D\u7F6E\u68C0\u67E5\u6216\u8D85\u65F6\u63A7\u5236\u3002","insights.suggestion.tool_failure_present.title":"\u5B58\u5728\u5DE5\u5177\u8C03\u7528\u5931\u8D25","insights.suggestion.tool_failure_present.action":"\u91CD\u590D\u6267\u884C\u5DE5\u4F5C\u6D41\u524D\uFF0C\u5148\u590D\u76D8\u5931\u8D25 span\u3002","insights.suggestion.slow_span.title":"\u6162\u52A8\u4F5C\u4E3B\u5BFC\u4F1A\u8BDD","insights.suggestion.slow_span.action":"\u62C6\u5206\u6216\u9650\u5236\u6162\u64CD\u4F5C\uFF0C\u5E76\u66F4\u65E9\u66B4\u9732\u8D85\u65F6\u3001\u8FDB\u5EA6\u53CD\u9988\u3002","insights.suggestion.low_read_write_ratio.title":"\u4FEE\u6539\u591A\u4E8E\u9605\u8BFB","insights.suggestion.low_read_write_ratio.action":"\u6539\u964C\u751F\u6587\u4EF6\u524D\u5148\u8865\u4E00\u6B21\u8BFB\u53D6\u6216\u641C\u7D22\u3002","insights.suggestion.context_compaction.title":"\u53D1\u751F\u4E0A\u4E0B\u6587\u538B\u7F29","insights.suggestion.context_compaction.action":"\u957F\u4EFB\u52A1\u5EFA\u8BAE\u628A\u51B3\u7B56\u548C\u68C0\u67E5\u70B9\u843D\u5230\u6301\u4E45\u7B14\u8BB0\u6216\u62C6\u6210\u66F4\u5C0F\u5B50\u4EFB\u52A1\u3002","insights.suggestion.no_major_friction.title":"\u672A\u53D1\u73B0\u660E\u663E\u6469\u64E6","insights.suggestion.no_major_friction.action":"\u53EF\u7528\u52A8\u4F5C\u65F6\u95F4\u7EBF\u505A\u62BD\u67E5\uFF0C\u6216\u4E0E\u66F4\u6162\u7684\u4F1A\u8BDD\u5BF9\u6BD4\u3002","insights.evidence.failedSpans":"{count} \u4E2A\u5931\u8D25 span","insights.evidence.toolFailedTimes":"{tool} \u5931\u8D25 {count} \u6B21","insights.evidence.multipleToolsFailed":"\u591A\u4E2A\u5DE5\u5177\u53D1\u751F\u5931\u8D25","insights.evidence.toolRanSeconds":"{tool} \u8FD0\u884C {seconds}s","insights.evidence.readWriteRatio":"\u8BFB\u6539\u6BD4 {ratio}","insights.evidence.compactions":"\u4E0A\u4E0B\u6587\u538B\u7F29 {count} \u6B21","insights.evidence.spansAnalyzed":"\u5DF2\u5206\u6790 {count} \u4E2A span","connectors.lede":"\u8BA9\u5916\u90E8\u7CFB\u7EDF\uFF08\u76D1\u63A7\u544A\u8B66\u3001CI\u3001\u5DE5\u5355\u2026\uFF09\u901A\u8FC7\u4E00\u4E2A webhook \u89E6\u53D1\u673A\u5668\u4EBA\u5728\u7FA4\u91CC\u8BF4\u8BDD\u6216\u8DD1\u5DE5\u4F5C\u6D41\u3002","connectors.createTitle":"\u65B0\u5EFA Webhook","connectors.fName":"\u540D\u79F0","connectors.fNamePh":"\u5982\uFF1A\u7EBF\u4E0A\u544A\u8B66","connectors.fBot":"\u89E6\u53D1\u7684\u673A\u5668\u4EBA","connectors.fKind":"\u89E6\u53D1\u65B9\u5F0F","connectors.kindTurn":"\u5355\u8F6E\u5BF9\u8BDD\uFF08\u8BA9\u673A\u5668\u4EBA\u56DE\u5E94\u4E00\u6B21\uFF09","connectors.kindWorkflow":"\u5DE5\u4F5C\u6D41","connectors.fWf":"\u5DE5\u4F5C\u6D41 ID","connectors.fMode":"\u6295\u9012\u5230\u54EA\u4E2A\u7FA4","connectors.modeDynamic":"\u7531\u8BF7\u6C42\u6307\u5B9A\uFF08\u7FA4\u968F\u8BF7\u6C42\u4F20\u5165\uFF09","connectors.modeFixed":"\u56FA\u5B9A\u7FA4","connectors.modeNewGroup":"\u6BCF\u6B21\u65B0\u5EFA\u7FA4","connectors.fFixedChat":"\u6295\u9012\u5230\u7684\u7FA4","connectors.fChatManualPh":"\u624B\u52A8\u586B\u7FA4 ID\uFF1Aoc_\u2026","connectors.chatManualLink":"\u627E\u4E0D\u5230\u7FA4\uFF1F\u624B\u52A8\u586B ID \u2192","connectors.chatListLink":"\u4ECE\u7FA4\u5217\u8868\u9009\u62E9 \u2190","connectors.fAllow":"\u5141\u8BB8\u7684\u7FA4","connectors.optional":"\uFF08\u53EF\u9009\uFF09","connectors.allowHint":"\u6309\u4F4F Ctrl/\u2318 \u591A\u9009\uFF1B\u7559\u7A7A = \u4E0D\u9650\u3002\u53EA\u7528\u4E8E\u6821\u9A8C\u8BF7\u6C42\u4F20\u5165\u7684\u7FA4\u662F\u5426\u88AB\u5141\u8BB8\u3002","connectors.dynamicHint":'<b>\u52A8\u6001\u6A21\u5F0F</b>\uFF1A\u7FA4 ID \u968F\u6BCF\u6B21\u8BF7\u6C42\u4F20\u5165\uFF0C\u4E09\u9009\u4E00 \u2014\u2014 \u67E5\u8BE2\u53C2\u6570 <code>?chatId=<\u7FA4ID></code> \xB7 \u8BF7\u6C42\u5934 <code>x-botmux-chat-id: <\u7FA4ID></code> \xB7 \u8BF7\u6C42\u4F53 <code>{"chatId":"<\u7FA4ID>"}</code>\u3002<br>\u60F3"\u4E00\u4E2A URL \u76F4\u63A5\u89E6\u53D1\u3001\u4E0D\u5E26\u53C2\u6570"\uFF0C\u8BF7\u6539\u9009\u300C\u56FA\u5B9A\u7FA4\u300D\u3002',"connectors.fDedup":"\u53BB\u91CD\u5B57\u6BB5","connectors.fDedupPh":"\u5982 alert.id\uFF08\u4ECE\u4E8B\u4EF6 body \u53D6\u503C\uFF09","connectors.dedupHint":"\u586B\u4E86\uFF1A\u547D\u4E2D\u76F8\u540C\u503C\u7684\u4E8B\u4EF6\u90FD\u6295\u5230<b>\u540C\u4E00\u4E2A\u7FA4</b>\u3002\u7559\u7A7A\uFF1A\u6BCF\u4E2A\u4E8B\u4EF6<b>\u65B0\u5EFA\u4E00\u4E2A\u7FA4</b>\u3002","connectors.fInstruction":"\u5904\u7406\u6307\u4EE4","connectors.fInstructionPh":"\u4E8B\u4EF6\u89E6\u53D1\u65F6\u8BA9\u673A\u5668\u4EBA\u505A\u4EC0\u4E48\u3002\u5982\uFF1A\u603B\u7ED3\u8FD9\u6761\u544A\u8B66\u7684\u4E25\u91CD\u7A0B\u5EA6\uFF0C@\u76F8\u5173 oncall\uFF0C\u7ED9\u51FA\u6392\u67E5\u5EFA\u8BAE\u3002\u7559\u7A7A = \u53EA\u628A\u4E8B\u4EF6\u539F\u6837\u4EA4\u7ED9\u6A21\u578B\u81EA\u7531\u53D1\u6325\u3002","connectors.fVerify":"\u6821\u9A8C\u65B9\u5F0F","connectors.verifyToken":"\u4EE4\u724C\uFF08\u7B80\u5355\uFF1A\u5BC6\u94A5\u653E\u8FDB URL\uFF0C\u4E00\u6761 curl \u5C31\u80FD\u89E6\u53D1\uFF09","connectors.verifyHmac":"HMAC \u7B7E\u540D\uFF08\u9AD8\u7EA7\uFF1A\u66F4\u5B89\u5168\uFF0C\u9700\u81EA\u884C\u5BF9\u8BF7\u6C42\u7B7E\u540D\uFF09","connectors.fSecret":"\u5BC6\u94A5 / \u4EE4\u724C","connectors.fSecretPh":"\u7559\u7A7A\u81EA\u52A8\u751F\u6210\uFF08\u53EA\u663E\u793A\u4E00\u6B21\uFF09","connectors.btnCreate":"\u521B\u5EFA","connectors.listTitle":"\u5DF2\u6709 Webhook","connectors.loading":"\u52A0\u8F7D\u4E2D\u2026","connectors.noBotGroups":"\uFF08\u8BE5\u673A\u5668\u4EBA\u6682\u65E0\u53EF\u89C1\u7FA4\uFF0C\u70B9\u53F3\u4FA7\u624B\u52A8\u586B ID\uFF09","connectors.modeLabelFixed":"\u56FA\u5B9A\u7FA4","connectors.modeLabelNewGroup":"\u6BCF\u6B21\u65B0\u5EFA\u7FA4","connectors.modeLabelDynamic":"\u8BF7\u6C42\u6307\u5B9A\u7FA4","connectors.kindLabelWorkflow":"\u5DE5\u4F5C\u6D41","connectors.kindLabelTurn":"\u5355\u8F6E","connectors.count":"\xB7 {count} \u4E2A","connectors.empty":"\u8FD8\u6CA1\u6709 Webhook\u3002\u7528\u4E0A\u9762\u7684\u8868\u5355\u521B\u5EFA\u4E00\u4E2A\u3002","connectors.enabled":"\u5DF2\u542F\u7528","connectors.disabled":"\u5DF2\u505C\u7528","connectors.badgeToken":"\u4EE4\u724C","connectors.badgeSign":"\u7B7E\u540D","connectors.dest":"\u6295\u9012\u300C{name}\u300D","connectors.btnDisable":"\u505C\u7528","connectors.btnEnable":"\u542F\u7528","connectors.btnEdit":"\u7F16\u8F91","connectors.btnSave":"\u4FDD\u5B58","connectors.btnCancel":"\u53D6\u6D88","connectors.btnDel":"\u5220\u9664","connectors.webhookUrl":"Webhook URL\uFF1A","connectors.copy":"\u590D\u5236","connectors.copied":"\u5DF2\u590D\u5236","connectors.tokenHint":"\u4EE4\u724C\u6A21\u5F0F\uFF1A\u8C03\u7528\u65F6\u5728 URL \u672B\u5C3E\u8FFD\u52A0 <code>/<\u4EE4\u724C></code>\uFF08\u4EE4\u724C\u4EC5\u521B\u5EFA/\u8F6E\u6362\u65F6\u663E\u793A\u4E00\u6B21\uFF09\u3002","connectors.dynamicReqHint":'\u52A8\u6001\u6A21\u5F0F\uFF1A\u8BF7\u6C42\u9700\u5E26\u76EE\u6807\u7FA4 \u2014\u2014 <code>?chatId=<\u7FA4ID></code> \u6216\u5934 <code>x-botmux-chat-id</code> \u6216 body <code>{"chatId":"\u2026"}</code>\u3002',"connectors.instructionPrefix":"\u5904\u7406\u6307\u4EE4\uFF1A","connectors.delConfirm":"\u5220\u9664\u8FD9\u4E2A Webhook\uFF1F\u5B83\u7684 URL \u4F1A\u7ACB\u5373\u5931\u6548\u3002","connectors.errName":"\u8BF7\u586B\u540D\u79F0","connectors.errBot":"\u8BF7\u9009\u673A\u5668\u4EBA","connectors.errWf":"\u8BF7\u586B\u5DE5\u4F5C\u6D41 ID","connectors.errChat":"\u8BF7\u9009\u62E9\uFF08\u6216\u624B\u52A8\u586B\uFF09\u6295\u9012\u7684\u7FA4","connectors.creating":"\u521B\u5EFA\u4E2D\u2026","connectors.saving":"\u4FDD\u5B58\u4E2D\u2026","connectors.usageDynamicLede":"\u52A8\u6001\u6A21\u5F0F\uFF1AURL \u5DF2\u542B\u4EE4\u724C\uFF0C\u8C03\u7528\u65F6\u518D\u5E26\u4E0A\u76EE\u6807\u7FA4 ID{gn}\uFF1A","connectors.usageDynamicNote":'\u7FA4\u4E5F\u53EF\u653E\u8BF7\u6C42\u5934 <code>x-botmux-chat-id</code> \u6216 body <code>{"chatId":"\u2026"}</code>\u3002\u26A0\uFE0F URL \u5373\u51ED\u8BC1\uFF0C\u52FF\u6CC4\u6F0F\u3002',"connectors.usageTokenLede":"\u6B64 URL \u5DF2\u542B\u4EE4\u724C\u3001\u4E14\u56FA\u5B9A\u6295\u9012\u5230\u6240\u9009\u7FA4\uFF0C\u76F4\u63A5 POST \u5373\u53EF\u89E6\u53D1\uFF1A","connectors.usageTokenNote":"\u26A0\uFE0F URL \u5373\u51ED\u8BC1\uFF0C\u8BF7\u52FF\u516C\u5F00\u6CC4\u6F0F\uFF1B\u53EF\u5728\u4E0B\u65B9\u5217\u8868\u5220\u9664\u6216\u8F6E\u6362\u3002","connectors.usageHmac":"\u5916\u90E8\u7CFB\u7EDF\u9700\u5BF9 <code>timestamp.body</code> \u505A HMAC-SHA256 \u7B7E\u540D\uFF0C\u5E76\u5E26\u4E0A <code>x-botmux-timestamp</code> / <code>x-botmux-nonce</code> / <code>x-botmux-signature</code> \u5934\u8C03\u7528","connectors.usageHmacDynamic":"\uFF0C\u540C\u65F6\u6309\u4E0A\u9762\u65B9\u5F0F\u5E26\u76EE\u6807\u7FA4 ID","connectors.createdPrefix":"\u5DF2\u521B\u5EFA\u300C{name}\u300D","connectors.createdDest":"\u6295\u9012\u5230\u300C{name}\u300D","connectors.tokenLabel":"\u8BBF\u95EE\u4EE4\u724C","connectors.signLabel":"\u7B7E\u540D\u5BC6\u94A5","connectors.secretOnce":"\uFF08\u53EA\u663E\u793A\u8FD9\u4E00\u6B21\uFF0C\u8BF7\u4FDD\u5B58\uFF09\uFF1A","connectors.createFailed":"\u521B\u5EFA\u5931\u8D25\uFF1A{error}","connectors.saveFailed":"\u4FDD\u5B58\u5931\u8D25\uFF1A{error}","connectors.noOnlineBots":"\uFF08\u6CA1\u6709\u5728\u7EBF\u673A\u5668\u4EBA\uFF09","team.navHome":"\u6211\u7684\u56E2\u961F","team.navManage":"\u56E2\u961F\u7BA1\u7406","team.eyebrow":"\u56E2\u961F","team.homeTitle":"\u56E2\u961F\u534F\u4F5C\uFF08\u8DE8\u90E8\u7F72\uFF09","team.homeLede":"\u628A\u522B\u7684\u90E8\u7F72\uFF08\u540C\u4E8B\u81EA\u5DF1\u8DD1\u7684 botmux\uFF09\u9080\u8BF7\u8FDB\u540C\u4E00\u4E2A\u56E2\u961F\uFF0C\u4E92\u76F8\u53D1\u73B0\u673A\u5668\u4EBA\u3001\u534F\u4F5C\u62C9\u7FA4\u3002","team.localDeployTitle":"\u672C\u90E8\u7F72","team.myIdentity":"\u6211\u7684\u98DE\u4E66\u8EAB\u4EFD\uFF1A","team.unbound":"\u672A\u7ED1\u5B9A","team.bindBtn":"\u7ED1\u5B9A","team.bindHint":"\uFF08\u7528\u673A\u5668\u4EBA\u51ED\u8BC1\u81EA\u52A8\u8BC6\u522B\u4F60\uFF1B\u7ED1\u5B9A\u540E\u62C9\u7FA4\u4F1A\u628A\u4F60\u62C9\u8FDB\u7FA4\u3001\u673A\u5668\u4EBA\u4E5F\u5F52\u5230\u4F60\u540D\u4E0B\uFF09","team.myTeams":"\u6211\u7684\u56E2\u961F","team.searchPh":"\u641C\u7D22 \u540D\u79F0/\u80FD\u529B/CLI\u2026","team.allCli":"\u5168\u90E8 CLI","team.hasCap":"\u6709\u80FD\u529B\u6807\u7B7E","team.hasRole":"\u6709\u9ED8\u8BA4\u89D2\u8272","team.teamsHint":"\u6BCF\u4E2A\u56E2\u961F\u91CC\u52FE\u9009\u673A\u5668\u4EBA\u5373\u53EF\u5355\u72EC\u62C9\u7FA4\uFF08\u81EA\u52A8\u5E26\u4E0A\u5404\u81EA\u8D1F\u8D23\u4EBA\uFF09\u3002\u8981\u65B0\u5EFA\u56E2\u961F / \u751F\u6210\u9080\u8BF7\u7801 / \u52A0\u5165\u522B\u4EBA\u7684\u56E2\u961F\uFF0C\u53BB\u300C\u56E2\u961F\u7BA1\u7406\u300D\u3002","team.loading":"\u52A0\u8F7D\u4E2D\u2026","team.roleModalTitle":"\u9ED8\u8BA4\u89D2\u8272","team.roleModalHint":"\u8BE5\u673A\u5668\u4EBA\u7684\u9ED8\u8BA4\u4EBA\u8BBE\uFF08\u8DE8\u7FA4\u751F\u6548\uFF09\uFF0C\u6B64\u5904\u53EA\u8BFB\u3002\u5982\u9700\u4FEE\u6539\uFF0C\u8BF7\u5230\u300CBot \u914D\u7F6E\u300D\u9875\u3002","team.close":"\u5173\u95ED","team.tagLocal":"\u672C\u90E8\u7F72","team.tagRemoteStale":"\u8FDC\u7AEF\xB7\u79BB\u7EBF\uFF1F","team.tagRemote":"\u8FDC\u7AEF","team.removeMember":"\u79FB\u9664","team.depTag":"\uFF08{tag}\uFF09","team.depCount":"{count} \u4E2A","team.depSelected":"\uFF0C\u5DF2\u9009 {n}","team.capPh":"\u80FD\u529B\u6807\u7B7E\u2026","team.viewRole":"\u67E5\u770B","team.hasRoleShort":"\u6709\u89D2\u8272","team.noMatch":"\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u673A\u5668\u4EBA\u3002","team.gnamePh":"\u7FA4\u540D\uFF08\u5982\uFF1A\u8DE8\u56E2\u961F\u6392\u969C\uFF09","team.pullGroupBtn":"\u628A\u52FE\u9009\u7684\u673A\u5668\u4EBA\u62C9\u4E00\u4E2A\u7FA4","team.pullGroupHint":"\u52FE\u9009\u673A\u5668\u4EBA \u2192 \u62C9\u5230\u4E00\u4E2A\u98DE\u4E66\u7FA4\uFF08\u81EA\u52A8\u542B owner\uFF09","team.noTeams":"\u8FD8\u6CA1\u6709\u56E2\u961F\u3002\u53BB\u300C\u56E2\u961F\u7BA1\u7406\u300D\u751F\u6210\u9080\u8BF7\u7801\u8BA9\u522B\u4EBA\u52A0\u5165\u4F60\uFF0C\u6216\u52A0\u5165\u522B\u4EBA\u7684\u56E2\u961F\u3002","team.connected":"\u5DF2\u8FDE\u63A5","team.connectFail":"\u8FDE\u63A5\u5931\u8D25\uFF1A{error}","team.iHost":"\u6211\u6258\u7BA1","team.teamMeta":"{deps} \u4E2A\u90E8\u7F72 \xB7 {bots} \u4E2A\u673A\u5668\u4EBA","team.rosterFail":"\u65E0\u6CD5\u83B7\u53D6\u8BE5\u56E2\u961F\u82B1\u540D\u518C\u3002","team.acrossTeams":"\uFF08\u8DE8 {n} \u4E2A\u56E2\u961F\uFF0C\u53BB\u91CD\uFF09","team.botsWord":"\u4E2A\u673A\u5668\u4EBA","team.groupCreated":"\u7FA4\u5DF2\u521B\u5EFA","team.delegatedBy":"\uFF08\u7531\u300C{name}\u300D\u5EFA\u7FA4\uFF09","team.openInLark":"\u5728\u98DE\u4E66\u6253\u5F00","team.invalidBots":"\u672A\u52A0\u5165\u7684\u673A\u5668\u4EBA\uFF1A{ids}","team.invalidOwners":"{n} \u4E2A owner \u672A\u80FD\u62C9\u8FDB","team.missingIdentity":"\u4F60\u672A\u7ED1\u5B9A\u98DE\u4E66\u8EAB\u4EFD\uFF0C\u6CA1\u628A\u4F60\u81EA\u5DF1\u62C9\u8FDB\u7FA4\uFF08\u53BB\u300C\u6211\u7684\u56E2\u961F\u300D\u7ED1\u5B9A\uFF09","team.skippedNoOwner":"{n} \u4E2A\u673A\u5668\u4EBA\u56E0\u8D1F\u8D23\u4EBA\u672A\u7ED1\u5B9A\u8EAB\u4EFD\u88AB\u8DF3\u8FC7\uFF08\u672A\u52A0\u5165\u7FA4\uFF09","team.errNoLocalBot":"\u8BF7\u81F3\u5C11\u52FE\u9009\u4E00\u4E2A\u4F60\u81EA\u5DF1\uFF08\u672C\u90E8\u7F72\uFF09\u7684\u5728\u7EBF\u673A\u5668\u4EBA\u2014\u2014\u7FA4\u8981\u7531\u5B83\u521B\u5EFA\u5E76\u628A\u4F60\uFF08\u53D1\u8D77\u4EBA\uFF09\u62C9\u8FDB\u7FA4\u3002","team.errAllSkipped":"\u6240\u9009\u673A\u5668\u4EBA\u7684\u8D1F\u8D23\u4EBA\u90FD\u6CA1\u7ED1\u5B9A\u8EAB\u4EFD\uFF0C\u65E0\u6CD5\u62C9\u7FA4\uFF08\u673A\u5668\u4EBA\u4E0D\u80FD\u8FDB\u4E00\u4E2A owner \u4E0D\u5728\u7684\u7FA4\uFF09\u3002\u8BF7\u8BA9\u5BF9\u5E94\u90E8\u7F72\u5148\u7ED1\u5B9A\u8EAB\u4EFD\u3002","team.errNoCreator":"\u6CA1\u6709\u53EF\u7528\u7684\u5EFA\u7FA4\u53D1\u8D77\u65B9\uFF08\u76F8\u5173\u90E8\u7F72\u90FD\u6CA1\u6709\u5728\u7EBF\u673A\u5668\u4EBA\uFF0C\u6216\u4E0D\u53EF\u8FBE\uFF09","team.errDelegationTimeout":"\u59D4\u6258\u5BF9\u65B9\u90E8\u7F72\u5EFA\u7FA4\u8D85\u65F6\uFF08\u53EF\u80FD\u5DF2\u5EFA\uFF0C\u53BB\u98DE\u4E66\u786E\u8BA4\uFF0C\u52FF\u91CD\u590D\u70B9\uFF09","team.errGroupCreate":"\u5EFA\u7FA4\u5931\u8D25\uFF1A{error}","team.roleModalTitleName":"\u9ED8\u8BA4\u89D2\u8272 \xB7 {name}","team.bound":"\u5DF2\u7ED1\u5B9A","team.myHostedTeam":"\u6211\u6258\u7BA1\u7684\u56E2\u961F","team.remoteTeamLabel":"{name} \u7684\u56E2\u961F","team.manageTitle":"\u56E2\u961F\u7BA1\u7406","team.manageLede":"\u521B\u5EFA\u591A\u4E2A\u56E2\u961F\u3001\u7ED9\u6BCF\u4E2A\u56E2\u961F\u751F\u6210\u9080\u8BF7\u7801\u3001\u6216\u52A0\u5165\u522B\u4EBA\u7684\u56E2\u961F\u3002\u4E00\u4E2A\u56E2\u961F = \u4F60\u672C\u90E8\u7F72\u7684\u673A\u5668\u4EBA + \u52A0\u5165\u8BE5\u56E2\u961F\u7684\u5176\u5B83\u90E8\u7F72\u3002","team.hostedTitle":"\u6211\u6258\u7BA1\u7684\u56E2\u961F","team.newTeamPh":"\u65B0\u56E2\u961F\u540D\u79F0","team.createTeamBtn":"\u521B\u5EFA\u56E2\u961F","team.joinTitle":"\u52A0\u5165\u522B\u4EBA\u7684\u56E2\u961F","team.hubPh":"Hub \u5730\u5740\uFF0C\u5982 http://10.0.0.5:7891","team.codePh":"\u9080\u8BF7\u7801","team.joinBtn":"\u52A0\u5165","team.noTeamsShort":"\u8FD8\u6CA1\u6709\u56E2\u961F\u3002","team.default":"\u9ED8\u8BA4","team.manageMetaDeps":"{count} \u4E2A\u90E8\u7F72","team.manageMetaRemote":"\uFF08\u542B {r} \u8FDC\u7AEF\uFF09","team.manageMetaBots":"{count} \u4E2A\u673A\u5668\u4EBA","team.genInvite":"\u751F\u6210\u9080\u8BF7\u7801","team.delBtn":"\u5220\u9664","team.generating":"\u751F\u6210\u4E2D\u2026","team.inviteResultLede":"\u628A\u4E0B\u9762\u4E24\u9879\u53D1\u7ED9\u522B\u7684\u90E8\u7F72\u7684\u4EBA\uFF0824 \u5C0F\u65F6\u5185\u3001\u5355\u6B21\u6709\u6548\uFF09\uFF1A","team.inviteHub":"Hub \u5730\u5740\uFF1A","team.inviteCode":"\u9080\u8BF7\u7801\uFF1A","team.genFail":"\u751F\u6210\u5931\u8D25\u3002","team.delConfirm":"\u5220\u9664\u56E2\u961F\u300C{name}\u300D\uFF1F\u5DF2\u52A0\u5165\u5B83\u7684\u90E8\u7F72\u4F1A\u88AB\u79FB\u9664\uFF08\u4E0D\u5F71\u54CD\u4ED6\u4EEC\u81EA\u5DF1\u7684\u90E8\u7F72\uFF09\u3002","team.errName":"\u8BF7\u586B\u56E2\u961F\u540D\u79F0","team.creating":"\u521B\u5EFA\u4E2D\u2026","team.created":"\u5DF2\u521B\u5EFA","team.createFail":"\u521B\u5EFA\u5931\u8D25\uFF1A{error}","team.errHubCode":"\u8BF7\u586B Hub \u5730\u5740\u548C\u9080\u8BF7\u7801\u3002","team.joining":"\u52A0\u5165\u4E2D\u2026","team.joined":"\u5DF2\u52A0\u5165\u300C{name}\u300D\uFF0C\u53BB\u300C\u6211\u7684\u56E2\u961F\u300D\u67E5\u770B\u3002","team.joinErrSelf":"\u8FD9\u662F\u4F60\u81EA\u5DF1\u7684\u90E8\u7F72\uFF0C\u4E0D\u80FD\u52A0\u5165\u81EA\u5DF1\uFF08\u9080\u8BF7\u7801\u8981\u53D1\u7ED9\u522B\u7684\u90E8\u7F72\u7684\u4EBA\u7528\uFF09","team.joinErrAlready":"\u4F60\u7684\u90E8\u7F72\u5DF2\u7ECF\u52A0\u5165\u8FC7\u8FD9\u4E2A\u56E2\u961F\u4E86","team.joinErrUnreachable":"\u8FDE\u4E0D\u4E0A\u5BF9\u65B9 Hub\uFF08\u68C0\u67E5\u5730\u5740/\u7F51\u7EDC\uFF09","team.joinErrTimeout":"\u5BF9\u65B9 Hub \u54CD\u5E94\u8D85\u65F6","team.joinErrGeneric":"\u52A0\u5165\u5931\u8D25\uFF1A{error}","team.identifying":"\u8BC6\u522B\u4E2D\u2026","team.bound2":"\u5DF2\u7ED1\u5B9A\uFF1A{name}","team.multiCandidate":"\u8BC6\u522B\u5230\u591A\u4E2A\u5019\u9009\uFF0C\u70B9\u4F60\u81EA\u5DF1\uFF1A","team.binding":"\u7ED1\u5B9A\u4E2D\u2026","team.bindFail":"\u7ED1\u5B9A\u5931\u8D25\uFF1A{error}","team.noCandidates":"\u6CA1\u8BC6\u522B\u5230\u8EAB\u4EFD\uFF1A\u8BF7\u786E\u8BA4\u673A\u5668\u4EBA\u914D\u7F6E\u4E86 allowedUsers\uFF08\u5141\u8BB8\u4F7F\u7528\u8005\uFF09\uFF0C\u4E14\u673A\u5668\u4EBA\u6709\u901A\u8BAF\u5F55\u6743\u9650\u3002","team.removeMemberConfirm":"\u628A\u300C{name}\u300D\u79FB\u51FA\u8FD9\u4E2A\u56E2\u961F\uFF1F\u5B83\u7684\u673A\u5668\u4EBA\u5C06\u4ECE\u672C\u56E2\u961F\u82B1\u540D\u518C\u6D88\u5931\uFF08\u4E0D\u5F71\u54CD\u5BF9\u65B9\u81EA\u5DF1\u7684\u90E8\u7F72\uFF09\u3002","team.creatingGroup":"\u5EFA\u7FA4\u4E2D\u2026","team.defaultGroupName":"\u534F\u4F5C\u7FA4","team.errPickBot":"\u8BF7\u5148\u52FE\u9009\u81F3\u5C11\u4E00\u4E2A\u673A\u5668\u4EBA","sessions.closeBulkConfirm":"\u5173\u95ED\u9009\u4E2D\u7684 {count} \u4E2A\u4F1A\u8BDD\uFF1F","sessions.empty":"\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u4F1A\u8BDD\u3002","sessions.viewMode":"\u4F1A\u8BDD\u89C6\u56FE","sessions.viewKanban":"\u770B\u677F","sessions.viewBoard":"\u72B6\u6001\u677F","sessions.viewTable":"\u8868\u683C","sessions.selectSession":"\u9009\u62E9\u4F1A\u8BDD","sessions.board.needsYou":"\u9700\u8981\u4F60","sessions.board.needsYouHint":"\u7B49\u5F85\u4ED3\u5E93\u3001TUI \u9009\u62E9\u6216\u989D\u5EA6\u5904\u7406","sessions.board.starting":"\u542F\u52A8\u4E2D","sessions.board.startingHint":"CLI \u6B63\u5728\u521B\u5EFA\u6216\u6062\u590D","sessions.board.working":"\u5E72\u6D3B\u4E2D","sessions.board.workingHint":"\u6B63\u5728\u8F93\u51FA\u3001\u5206\u6790\u6216\u6267\u884C\u5DE5\u5177","sessions.board.idle":"\u7A7A\u95F2","sessions.board.idleHint":"\u53EF\u7EE7\u7EED\u5BF9\u8BDD\u6216\u63A5\u65B0\u4EFB\u52A1","sessions.board.emptyColumn":"\u6682\u65E0\u4F1A\u8BDD","sessions.board.signalRepo":"\u5F85\u9009\u4ED3\u5E93","sessions.board.signalPrompt":"\u7B49\u5F85 TUI \u9009\u62E9","sessions.board.signalLimited":"\u989D\u5EA6\u53D7\u9650","sessions.board.signalAgent":"\u9700\u8981\u4EBA\u5DE5\u4ECB\u5165","sessions.board.waiting":"\u7B49\u5F85","sessions.board.dragHint":"\u62D6\u52A8\u5217\u5934\u8C03\u6574\u5217\u987A\u5E8F","sessions.board.moveLeft":"\u5DE6\u79FB\u6B64\u5217","sessions.board.moveRight":"\u53F3\u79FB\u6B64\u5217","sessions.kanban.backlog":"\u5F85\u529E\u6C60","sessions.kanban.todo":"\u5F85\u529E","sessions.kanban.inProgress":"\u8FDB\u884C\u4E2D","sessions.kanban.inReview":"\u5F85\u786E\u8BA4","sessions.kanban.done":"\u5DF2\u5B8C\u6210","sessions.kanban.updated":"\u66F4\u65B0\u4E8E {time}","sessions.kanban.moreHidden":"\u8FD8\u6709 {count} \u4E2A\u672A\u663E\u793A","sessions.create.button":"\u521B\u5EFA\u4F1A\u8BDD","sessions.create.title":"\u521B\u5EFA\u4F1A\u8BDD","sessions.create.content":"\u5185\u5BB9","sessions.create.contentPlaceholder":"\u63CF\u8FF0\u8981\u505A\u7684\u4E8B\uFF1BLead \u5206\u914D\u6A21\u5F0F\u4E0B\u53EF\u5728\u8FD9\u91CC\u7ED9\u5404 agent \u5206\u914D\u4E0D\u540C\u7684\u5DE5\u4F5C","sessions.create.bots":"\u673A\u5668\u4EBA\uFF08\u62C9\u8FDB\u65B0\u7FA4\uFF09","sessions.create.noBots":"\u6CA1\u6709\u5728\u7EBF\u7684\u673A\u5668\u4EBA\u53EF\u9009","sessions.create.mode":"\u534F\u4F5C\u6A21\u5F0F","sessions.create.modeAll":"\u4E00\u8D77\u5F00\u5DE5","sessions.create.modeLead":"Lead \u5206\u914D\uFF08\u63A8\u8350\uFF09","sessions.create.modeHelp":"\u4E00\u8D77\u5F00\u5DE5\uFF1A\u6BCF\u4E2A\u88AB\u9009\u673A\u5668\u4EBA\u5404\u8D77\u4E00\u6761\u4F1A\u8BDD\u3001\u62FF\u540C\u4E00\u4EFD\u5185\u5BB9\u3002Lead \u5206\u914D\uFF1A\u53EA\u8D77 lead\uFF0C\u7531\u5B83\u5728\u7FA4\u91CC @ \u62C9\u8D77\u5176\u5B83\u673A\u5668\u4EBA\u5E72\u6D3B\u3002","sessions.create.lead":"Lead \u673A\u5668\u4EBA","sessions.create.leadHelp":"\u5185\u5BB9\u4F1A\u53D1\u7ED9 lead\uFF0C\u7531\u5B83\u51B3\u5B9A\u4F55\u65F6\u62C9\u8D77\u54EA\u4E2A sub bot\u3002","sessions.create.leadPickFirst":"\u8BF7\u5148\u5728\u4E0A\u65B9\u52FE\u9009\u673A\u5668\u4EBA","sessions.create.column":"\u5165\u5217","sessions.create.columnInProgress":"\u76F4\u63A5\u8FDB\u884C\u4E2D","sessions.create.columnBacklog":"\u5F85\u529E\u6C60","sessions.create.columnHelp":"\u76F4\u63A5\u8FDB\u884C\u4E2D\uFF1A\u5EFA\u5B8C\u7FA4\u7ACB\u523B\u5F00\u8DD1\u3002\u5F85\u529E\u6C60\uFF1A\u5148\u5EFA\u7FA4+\u62C9\u673A\u5668\u4EBA\u4F46\u4E0D\u8D77 CLI\uFF0C\u4E4B\u540E\u62D6\u5230\u300C\u8FDB\u884C\u4E2D\u300D\u6216\u70B9\u300C\u5F00\u59CB\u300D\u518D\u53D1\u7ED9\u673A\u5668\u4EBA\u3002","sessions.create.advanced":"\u66F4\u591A\u9009\u9879","sessions.create.groupName":"\u7FA4\u540D\u79F0","sessions.create.groupNamePlaceholder":"\u7559\u7A7A\u5219\u53D6\u5185\u5BB9\u9996\u884C","sessions.create.workingDir":"\u5DE5\u4F5C\u76EE\u5F55","sessions.create.workingDirHelp":"\u53EF\u9009\u3002\u586B\u4E86\u5219\u628A\u65B0\u7FA4\u7ED1\u5B9A\u5230\u8BE5\u76EE\u5F55\uFF08\u6240\u6709\u673A\u5668\u4EBA\u90FD\u5728\u6B64\u76EE\u5F55\u5DE5\u4F5C\uFF09\u3002\u7559\u7A7A\u5219\u673A\u5668\u4EBA\u5728\u7FA4\u91CC\u5F39 /repo \u5361\u7247\u8BA9\u4F60\u9009\u4ED3\u5E93\uFF08\u652F\u6301\u65B0\u5EFA worktree\uFF09\u3002","sessions.create.submit":"\u521B\u5EFA","sessions.create.submitting":"\u521B\u5EFA\u4E2D\u2026","sessions.create.cancel":"\u53D6\u6D88","sessions.create.start":"\u5F00\u59CB","sessions.create.errContent":"\u8BF7\u586B\u5199\u5185\u5BB9","sessions.create.errNoBot":"\u8BF7\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u673A\u5668\u4EBA","sessions.create.errLead":"Lead \u5FC5\u987B\u662F\u5DF2\u52FE\u9009\u7684\u673A\u5668\u4EBA\u4E4B\u4E00","sessions.create.failed":"\u521B\u5EFA\u5931\u8D25","sessions.create.startFailed":"\u5F00\u59CB\u5931\u8D25","sessions.create.doneTitle":"\u5DF2\u521B\u5EFA","sessions.create.doneInProgress":"\u5DF2\u5EFA\u7FA4\u5E76\u62C9\u8D77\u4F1A\u8BDD","sessions.create.doneBacklog":"\u5DF2\u5EFA\u7FA4\uFF0C\u4F1A\u8BDD\u5DF2\u5165\u5F85\u529E\u6C60","sessions.create.partialFail":"\u6709 {n} \u4E2A\u673A\u5668\u4EBA\u672A\u80FD\u62C9\u8D77\uFF0C\u53EF\u7A0D\u540E\u5728\u7FA4\u91CC @ \u91CD\u8BD5","sessions.create.openChat":"\u6253\u5F00\u98DE\u4E66\u7FA4","sessions.create.close":"\u5173\u95ED","sessions.kanban.openTab":"\u65B0\u6807\u7B7E\u9875\u6253\u5F00","sessions.kanban.openFeishu":"\u6253\u5F00\u98DE\u4E66","sessions.kanban.terminalLoading":"\u6B63\u5728\u6253\u5F00\u7EC8\u7AEF\u2026","sessions.kanban.rename":"\u91CD\u547D\u540D\uFF08\u53CC\u51FB\u6807\u9898\u4E5F\u53EF\uFF09","sessions.kanban.renameFail":"\u91CD\u547D\u540D\u5931\u8D25","sessions.kanban.moveFail":"\u79FB\u52A8\u5931\u8D25","sessions.kanban.groupBy":"\u5206\u7EC4\u7EF4\u5EA6","sessions.kanban.groupFlow":"\u5DE5\u4F5C\u6D41","sessions.kanban.groupTeam":"\u56E2\u961F","sessions.kanban.groupBot":"\u673A\u5668\u4EBA","sessions.kanban.teamLoading":"\u6B63\u5728\u52A0\u8F7D\u56E2\u961F\u2026","sessions.kanban.noTeam":"\u6682\u65E0\u56E2\u961F","sessions.kanban.teamScope":"{chats} \u4E2A\u534F\u4F5C\u7FA4 \xB7 {sessions} \u4E2A\u4F1A\u8BDD","sessions.kanban.remoteHint":"\u6765\u81EA {name} \u90E8\u7F72\u7684\u4F1A\u8BDD\uFF08\u5FEB\u7167\uFF0C\u7EC8\u7AEF/\u5386\u53F2\u5728\u5BF9\u65B9\u673A\u5668\u4E0A\uFF09","sessions.kanban.clusterDragHint":"\u62D6\u52A8\u6807\u9898\u6574\u7EC4\u79FB\u52A8","sessions.history.title":"\u4F1A\u8BDD\u5386\u53F2","sessions.history.loading":"\u6B63\u5728\u62C9\u53D6\u98DE\u4E66\u6D88\u606F\u2026","sessions.history.fail":"\u5386\u53F2\u62C9\u53D6\u5931\u8D25","sessions.history.empty":"\u6CA1\u6709\u6D88\u606F","sessions.history.user":"\u7528\u6237","sessions.history.owner":"\u521B\u5EFA\u8005","sessions.history.staleHint":"dashboard \u6216 daemon \u8FDB\u7A0B\u53EF\u80FD\u8FD8\u5728\u8DD1\u65E7\u7248\u672C\uFF0Cbotmux restart \u540E\u91CD\u8BD5","groups.title":"\u7FA4\u7EC4\u4E0E Bot","groups.subtitle":"\u67E5\u770B chat x bot \u8986\u76D6\u77E9\u9635\uFF0C\u7BA1\u7406\u62C9\u7FA4\u3001oncall\u3001\u9000\u7FA4\u548C\u89E3\u6563\u3002","groups.search":"\u641C\u7D22\u7FA4\u540D / ID / owner","groups.missingOnly":"\u4EC5\u7F3A bot","groups.refresh":"\u5237\u65B0","groups.create":"\u65B0\u5EFA\u7FA4","groups.chat":"\u7FA4\u804A","groups.actions":"\u64CD\u4F5C","groups.addBots":"\u6DFB\u52A0 bot","groups.saveAsProfile":"\u4FDD\u5B58\u4E3A Profile","groups.manage":"\u7BA1\u7406","groups.empty":"\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u7FA4\u804A\u3002","groups.profileStatusFull":"\u5B8C\u6574\u5339\u914D {name}\uFF08{matched}/{total}\uFF09","groups.profileStatusFullChat":"\u672C\u7FA4 Role \u5B8C\u6574\u5339\u914D {name}\uFF08{matched}/{total}\uFF09","groups.profileStatusPartial":"\u90E8\u5206\u5339\u914D {name}\uFF08{matched}/{total}\uFF09","groups.profileStatusUnmatched":"\u672A\u5339\u914D\u4EFB\u4F55 Profile","groups.saveProfileTitle":"\u4FDD\u5B58\u4E3A Profile","groups.saveProfileIntro":"\u5C06\u300C{name}\u300D\u91CC\u7684 {count} \u4E2A\u7FA4\u5185 bot \u914D\u7F6E\u4FDD\u5B58\u4E3A profile \u5FEB\u7167\u3002","groups.saveProfileScope":"\u4FDD\u5B58\u8303\u56F4","groups.saveProfileScopeHelp":"\u7FA4\u5185 bot \u914D\u7F6E\u5FEB\u7167","groups.saveProfileBotCount":"\u7FA4\u5185 bot","groups.saveProfileLoadFailed":"\u8BFB\u53D6\u5931\u8D25","groups.saveProfileStatus.entry":"\u751F\u6210 entry","groups.saveProfileStatus.error":"\u8BFB\u53D6\u5931\u8D25","groups.saveProfileMode":"\u4FDD\u5B58\u65B9\u5F0F","groups.saveProfileNew":"\u65B0\u5EFA Profile","groups.saveProfileNewHelp":"\u9ED8\u8BA4\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684\u5FEB\u7167\uFF1B\u5982\u679C id \u5DF2\u5B58\u5728\uFF0C\u4F1A\u8986\u76D6\u540C bot entry\u3002","groups.saveProfileOverwrite":"\u8986\u76D6\u5DF2\u6709 Profile","groups.saveProfileOverwriteHelp":"\u4ECE\u5217\u8868\u4E2D\u9009\u62E9\u4E00\u4E2A\u5DF2\u6709 profile\uFF0C\u8986\u76D6\u5176\u4E2D\u540C bot \u7684 entry\u3002","groups.saveProfileExistingMeta":"{count} \u4E2A entry","groups.saveProfileIdLabel":"Profile id","groups.saveProfileExistingLabel":"\u5DF2\u6709 Profile","groups.saveProfileExistingEmpty":"\u6682\u65E0\u5DF2\u6709 Profile","groups.saveProfileTarget":"\u76EE\u6807 Profile","groups.saveProfileTargetNew":"\u5C06\u65B0\u5EFA\u6216\u66F4\u65B0\u8FD9\u4E2A Profile \u7684\u7FA4\u5185 bot \u5FEB\u7167","groups.saveProfileTargetOverwrite":"\u5C06\u8986\u76D6\u5DF2\u6709 Profile \u4E2D\u8FD9\u4E9B bot \u7684 entry","groups.saveProfileEntrySummary":"\u5C06\u4E3A {count} \u4E2A\u7FA4\u5185 bot \u751F\u6210 profile entry\u3002","groups.saveProfileEntrySummaryWithEmpty":"\u5C06\u4E3A {count} \u4E2A\u7FA4\u5185 bot \u751F\u6210 profile entry\uFF1B\u5176\u4E2D {emptyCount} \u4E2A\u5F53\u524D\u672A\u8BFB\u5230 role \u5185\u5BB9\uFF0C\u4F1A\u4FDD\u5B58\u4E3A\u7A7A entry\u3002","groups.saveProfileFailedLoadSummary":"\u6709 {count} \u4E2A bot \u914D\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF0C\u6682\u4E0D\u4FDD\u5B58\uFF0C\u907F\u514D\u751F\u6210\u4E0D\u5B8C\u6574\u5FEB\u7167\u3002","groups.saveProfileSubmit":"\u4FDD\u5B58 Profile","groups.saveProfileOverwriteSubmit":"\u8986\u76D6\u4FDD\u5B58","groups.saveProfileInvalid":"Profile id \u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u70B9\u3001\u4E0B\u5212\u7EBF\u3001\u77ED\u6A2A\u7EBF\uFF0C\u6700\u957F 64\uFF0C\u4E14\u4E0D\u80FD\u662F . \u6216 ..","groups.saveProfileNoRoles":"\u8FD9\u4E2A\u7FA4\u91CC\u6CA1\u6709\u53EF\u4FDD\u5B58\u7684 bot \u914D\u7F6E\u3002","groups.saveProfileSaving":"\u4FDD\u5B58\u4E2D\u2026","groups.saveProfileDone":"\u5DF2\u4FDD\u5B58 {count} \u4E2A entry \u5230 {name}","groups.saveProfileFailed":"\u53EA\u4FDD\u5B58\u4E86 {saved}/{total} \u4E2A entry\uFF0C\u8BF7\u68C0\u67E5\u79BB\u7EBF bot \u6216\u6743\u9650\u3002","groups.createTitle":"\u65B0\u5EFA\u7FA4\u804A","groups.createHelp":"\u9009\u62E9\u8981\u9080\u8BF7\u7684 bot\u3002dashboard \u4F1A\u81EA\u52A8\u9009\u62E9\u5728\u7EBF daemon \u4F5C\u4E3A\u521B\u5EFA\u8005\u3002","groups.name":"\u7FA4\u540D","groups.namePlaceholder":"\u4F8B\u5982 AI ChangeLog","groups.bindDir":"\u7ED1\u5B9A\u76EE\u5F55","groups.bindDirHelp":"\u65B0\u8BDD\u9898\u76F4\u63A5\u7528\u8BE5\u76EE\u5F55\u542F\u52A8 CLI\uFF0C\u8DF3\u8FC7 repo \u9009\u62E9\u3002","groups.roleProfile":"Profile","groups.roleProfileNone":"\u4E0D\u4F7F\u7528","groups.roleProfileHelp":"\u521B\u5EFA\u540E\u5728\u65B0\u7FA4\u91CC\u53D1\u9001 profile apply bootstrap \u547D\u4EE4\u3002","groups.roleProfileBootstrapSent":"Profile\uFF1A{name}\uFF1Bbootstrap \u6D88\u606F\u5DF2\u53D1\u9001\uFF1A{messageId}","groups.roleProfileBootstrapDone":"Profile\uFF1A{name}\uFF1Bbootstrap \u5DF2\u5B8C\u6210\uFF0C\u65E0\u9700\u53D1\u9001 peer bootstrap \u6D88\u606F\u3002","groups.roleProfileBootstrapFailed":"Profile\uFF1A{name}\uFF1Bbootstrap \u5931\u8D25\uFF1A{reason}","groups.botPicker":"Bot","groups.createSubmit":"\u521B\u5EFA","groups.cancel":"\u53D6\u6D88","groups.successTitle":"\u7FA4\u521B\u5EFA\u6210\u529F","groups.openGroup":"\u6253\u5F00\u65B0\u7FA4","groups.manageTitle":"\u7BA1\u7406 {name}","groups.owner":"\u7FA4\u4E3B","groups.oncall":"Oncall \u6A21\u5F0F","groups.oncallHelp":"\u5F00\u542F\u540E\uFF0C\u7FA4\u5185\u6210\u5458\u53EF @ \u673A\u5668\u4EBA\uFF1B\u52FE\u9009\u7684 bot \u5728\u672C\u7FA4\u7684\u65B0\u8BDD\u9898\u76F4\u63A5\u4F7F\u7528\u5176\u7ED1\u5B9A\u76EE\u5F55\uFF08\u7ED1\u5B9A\u6309 bot \u8BA1\uFF0C\u53EA\u5F71\u54CD\u52FE\u9009\u7684 bot\uFF09\u3002","groups.leaveTitle":"\u9009\u62E9\u673A\u5668\u4EBA\u9000\u51FA\u7FA4\u804A","groups.leaveSelected":"\u9009\u4E2D\u673A\u5668\u4EBA\u9000\u51FA\u7FA4\u804A","groups.disband":"\u89E3\u6563\u7FA4\u804A","groups.dangerHint":"\u89E3\u6563\u4EC5\u5F53\u5728\u7FA4\u673A\u5668\u4EBA\u662F\u7FA4\u4E3B\u65F6\u624D\u4F1A\u6210\u529F\uFF0C\u5426\u5219\u5EFA\u8BAE\u4F7F\u7528\u9000\u51FA\u7FA4\u804A\u3002","groups.save":"\u4FDD\u5B58","groups.needWorkingDir":"\u8BF7\u586B\u5DE5\u4F5C\u76EE\u5F55","groups.noBotsOnline":"\u6CA1\u6709\u5728\u7EBF bot\u3002\u8BF7\u5148\u91CD\u542F daemon\u3002","schedules.title":"\u5B9A\u65F6\u4EFB\u52A1","schedules.subtitle":"\u8DE8 daemon \u67E5\u770B\u3001\u6682\u505C\u3001\u6062\u590D\u548C\u7ACB\u5373\u89E6\u53D1\u5B9A\u65F6\u4EFB\u52A1\u3002","schedules.search":"\u641C\u7D22\u540D\u79F0 / prompt / \u5DE5\u4F5C\u76EE\u5F55","schedules.anyKind":"\u5168\u90E8\u7C7B\u578B","schedules.enabledOnly":"\u4EC5\u542F\u7528","schedules.name":"\u540D\u79F0","schedules.bot":"bot","schedules.schedule":"\u89C4\u5219","schedules.next":"\u4E0B\u6B21","schedules.last":"\u4E0A\u6B21","schedules.repeat":"\u91CD\u590D","schedules.enabled":"\u542F\u7528","schedules.actions":"\u64CD\u4F5C","schedules.runNow":"\u7ACB\u5373\u8FD0\u884C","schedules.pause":"\u6682\u505C","schedules.resume":"\u6062\u590D","schedules.delivery":"\u6295\u9012","schedules.deliveryOrigin":"\u539F\u8BDD\u9898","schedules.deliveryNewTopic":"\u6BCF\u6B21\u65B0\u8BDD\u9898","schedules.deliveryLocal":"\u4EC5\u8BB0\u5F55","schedules.useNewTopic":"\u6539\u4E3A\u6BCF\u6B21\u65B0\u8BDD\u9898","schedules.useOrigin":"\u6539\u4E3A\u539F\u8BDD\u9898","schedules.empty":"\u6682\u65E0\u5B9A\u65F6\u4EFB\u52A1\u3002","settings.title":"\u5168\u5C40\u8BBE\u7F6E","settings.subtitle":"\u7BA1\u7406\u672C\u673A botmux dashboard \u4E0E\u6240\u6709 bot \u5171\u4EAB\u7684\u5168\u5C40\u884C\u4E3A\u3002","settings.loading":"\u6B63\u5728\u52A0\u8F7D\u8BBE\u7F6E\u2026","settings.loadFailed":"\u8BBE\u7F6E\u52A0\u8F7D\u5931\u8D25","settings.readOnlyVisitor":"\u5F53\u524D\u662F\u53EA\u8BFB\u8BBF\u95EE\uFF0C\u4FEE\u6539\u8BBE\u7F6E\u9700\u8981\u6388\u6743\u94FE\u63A5\uFF08\u8FD0\u884C botmux dashboard \u83B7\u53D6\uFF09","settings.sectionAccess":"\u8BBF\u95EE\u6743\u9650","settings.publicReadOnly":"\u5141\u8BB8\u65E0 token \u53EA\u8BFB\u8BBF\u95EE dashboard","settings.publicReadOnlyHelp":"\u5F00\u542F\u540E\uFF0C\u6CA1\u6709 token \u7684\u8BBF\u95EE\u8005\u53EF\u4EE5\u67E5\u770B dashboard\u3001\u4F1A\u8BDD\u3001\u5B9A\u65F6\u4EFB\u52A1\u548C SSE\uFF1B\u5173\u95ED\u3001\u6682\u505C\u3001\u5BA1\u6279\u7B49\u5199\u64CD\u4F5C\u4ECD\u5FC5\u987B\u901A\u8FC7 token \u9274\u6743\u3002\u654F\u611F\u7EC8\u7AEF\u539F\u59CB\u65E5\u5FD7\u59CB\u7EC8\u9700\u8981 token\u3002","settings.remoteAccess":"\u8FDC\u7A0B\u8BBF\u95EE\u7EC8\u7AEF","settings.remoteAccessHelp":"\u5F00\u542F\u540E\u4F1A\u8BDD Web \u7EC8\u7AEF /\u98DE\u4E66\u5361\u7247\u300C\u6253\u5F00\u7EC8\u7AEF\u300D/\u300C\u83B7\u53D6\u53EF\u64CD\u4F5C\u94FE\u63A5\u300D\u53CA webhook \u90FD\u8D70\u4E2D\u5FC3\u5316\u5E73\u53F0\u94FE\u63A5\uFF1B\u5173\u95ED\u5219\u7528\u672C\u5730\u94FE\u63A5\u3002\u9ED8\u8BA4\u5173\u95ED\u3002","settings.sectionCards":"\u98DE\u4E66\u5361\u7247","settings.openTerminalInFeishu":"\u6D41\u5F0F\u5361\u7247\u7EC8\u7AEF\u6309\u94AE\u5728\u98DE\u4E66\u4FA7\u680F\u6253\u5F00","settings.openTerminalInFeishuHelp":"\u9ED8\u8BA4\u5173\u95ED\uFF1A\u7EC8\u7AEF\u6309\u94AE\u76F4\u63A5\u6253\u5F00 Web Terminal URL\u3002\u5F00\u542F\u540E\u4F7F\u7528\u98DE\u4E66 web_url/open \u5305\u88C5\uFF0C\u5728\u98DE\u4E66 PC \u4FA7\u680F\u91CC\u6253\u5F00\uFF1B\u5199\u6743\u9650\u4ECD\u7531\u7EC8\u7AEF token \u63A7\u5236\u3002","settings.sectionExperimental":"\u5B9E\u9A8C\u6027\u914D\u7F6E","settings.chatBotDiscovery":"\u7FA4\u5185\u673A\u5668\u4EBA\u53D1\u73B0\uFF08\u98DE\u4E66 /members/bots\uFF09","settings.chatBotDiscoveryHelp":"\u5F00\u542F\u540E\u7528\u98DE\u4E66 /members/bots \u63A5\u53E3\u5B9E\u65F6\u8BFB\u53D6\u5F53\u524D\u7FA4\u91CC\u7684\u673A\u5668\u4EBA\u6210\u5458\uFF0C\u8BA9\u591A\u4E2A\u673A\u5668\u4EBA\u4E4B\u95F4\u80FD\u53EF\u9760\u5730\u4E92\u76F8 @\uFF08\u9996\u6761\u6D88\u606F\u5C31\u80FD\u8BC6\u522B\uFF0C\u65E0\u9700\u7B49\u5386\u53F2 @ \u8BB0\u5F55\u79EF\u7D2F\uFF09\uFF0C\u591A\u673A\u5668\u4EBA\u534F\u4F5C\u66F4\u7A33\u3002\u8BE5\u63A5\u53E3\u662F\u98DE\u4E66\u672A\u516C\u5F00 API\uFF1A\u9ED8\u8BA4\u5F00\u542F\uFF0C\u8C03\u7528\u5931\u8D25\u4F1A\u81EA\u52A8\u56DE\u9000\u5230\u65E7\u7684\u53D1\u73B0\u65B9\u5F0F\uFF08\u6309\u914D\u7F6E\u7684 bot \u9010\u4E2A\u63A2\u6D4B + \u5386\u53F2 @ \u8BB0\u5F55\uFF09\u3002\u4EC5\u5728\u4EE5\u4E0B\u60C5\u51B5\u9700\u8981\u5173\u95ED\u5B83\uFF08\u5F3A\u5236\u8D70\u65E7\u903B\u8F91\uFF09\uFF1A\u4F60\u7684\u79DF\u6237/\u7F51\u5173\u4E0D\u652F\u6301\u8BE5\u63A5\u53E3\u3001\u6216\u5B83\u8FD4\u56DE\u7684\u7FA4\u6210\u5458\u4E0D\u51C6\u5BFC\u81F4 @ \u9519\u4EBA/@ \u4E0D\u5230\u3001\u6216\u98DE\u4E66\u6539\u52A8\u8BE5\u63A5\u53E3\u540E\u884C\u4E3A\u5F02\u5E38\u3002","settings.sectionRepoPicker":"\u4ED3\u5E93\u9009\u62E9","settings.repoPickerMode":"\u4ED3\u5E93\u9009\u62E9\u5361\u6A21\u5F0F","settings.repoPickerModeAll":"\u4ED3\u5E93 + worktree","settings.repoPickerModeRepos":"\u4EC5\u4E3B\u4ED3\u5E93","settings.repoPickerModeHelp":"\u9ED8\u8BA4\u663E\u793A\u4ED3\u5E93\u548C linked worktree\u3002\u9009\u62E9\u300C\u4EC5\u4E3B\u4ED3\u5E93\u300D\u540E\uFF0C\u521D\u59CB\u5316\u548C\u88F8 /repo \u7684\u9009\u62E9\u5361\u53EA\u5217\u4E3B\u4ED3\u5E93\uFF1B\u663E\u5F0F /repo /abs/path/to/worktree \u4ECD\u53EF\u76F4\u8FBE worktree\u3002","settings.saving":"\u4FDD\u5B58\u4E2D\u2026","settings.saved":"\u5DF2\u4FDD\u5B58","settings.saveFailed":"\u4FDD\u5B58\u5931\u8D25","settings.sectionMaintenance":"\u81EA\u52A8\u7EF4\u62A4","settings.autoUpdate":"\u81EA\u52A8\u66F4\u65B0","settings.autoUpdateHelp":"\u9ED8\u8BA4\u5173\u95ED\u3002\u5230\u70B9\u6267\u884C npm install -g botmux@latest \u5B89\u88C5\u6700\u65B0\u7248\u672C\uFF08\u53EA\u4E0B\u8F7D\u5B89\u88C5\u3001\u672C\u8EAB\u4E0D\u91CD\u542F\uFF09\u3002\u4EC5 npm \u5168\u5C40\u5B89\u88C5\u53EF\u7528\u3002","settings.autoRestart":"\u81EA\u52A8\u91CD\u542F","settings.autoRestartHelp":"\u9ED8\u8BA4\u5173\u95ED\uFF0C\u9700\u5148\u5F00\u542F\u81EA\u52A8\u66F4\u65B0\u3002\u81EA\u52A8\u66F4\u65B0\u88C5\u5230\u65B0\u7248\u672C\u540E\uFF0C\u82E5\u6CA1\u6709\u8FDB\u884C\u4E2D\u7684\u4F1A\u8BDD\u5219\u81EA\u52A8\u91CD\u542F\u4EE5\u751F\u6548\uFF08\u649E\u4E0A\u5FD9\u788C\u4F1A\u8BDD\u5219\u8DF3\u5230\u6B21\u65E5\uFF09\u3002","settings.autoUpdateLocalDev":"\u5F53\u524D\u4E3A\u672C\u5730\u5F00\u53D1\u5B89\u88C5\uFF08\u4ECE\u6E90\u7801\u8FD0\u884C\uFF09\uFF0C\u81EA\u52A8\u66F4\u65B0\u4E0D\u53EF\u7528\u3002","settings.maintenanceTime":"\u65F6\u95F4","update.section":"\u7248\u672C\u4E0E\u66F4\u65B0","update.loginRequired":"\u767B\u5F55\u540E\u53EF\u68C0\u67E5\u7248\u672C\u3001\u6267\u884C\u66F4\u65B0\u6216\u91CD\u542F\u3002","update.loading":"\u68C0\u67E5\u4E2D\u2026","update.checkFailed":"\u68C0\u67E5\u5931\u8D25","update.current":"\u5F53\u524D\u7248\u672C","update.upToDate":"\u5DF2\u662F\u6700\u65B0\u7248\u672C","update.newAvailable":"\u53D1\u73B0\u65B0\u7248\u672C {version}","update.checkUnavailable":"\u65E0\u6CD5\u83B7\u53D6\u6700\u65B0\u7248\u672C\uFF08\u79BB\u7EBF\u6216\u53D7\u7F51\u7EDC\u9650\u5236\uFF09","update.nodeWarn":"\u5F53\u524D Node \u7248\u672C {version} \u8FC7\u4F4E\uFF0C\u66F4\u65B0\u8981\u6C42 \u2265 {required}\uFF0C\u8BF7\u5148\u5347\u7EA7 Node\u3002","update.localDev":"\u5F53\u524D\u4E3A\u672C\u5730\u5F00\u53D1\u5B89\u88C5\uFF08\u4ECE\u6E90\u7801\u8FD0\u884C\uFF09\uFF0C\u300C\u66F4\u65B0\u5230\u6700\u65B0\u7248\u300D\u4E0D\u53EF\u7528\uFF1B\u8BF7\u7528 git pull + \u6784\u5EFA\u540E\u91CD\u542F\u3002","update.multiInstallWarn":"\u68C0\u6D4B\u5230\u591A\u4E2A botmux \u5B89\u88C5\uFF0Cnpm \u66F4\u65B0\u53EA\u4F1A\u66F4\u65B0 npm \u5168\u5C40\u90A3\u4E2A\uFF0C\u53EF\u80FD\u4E0D\u662F\u5F53\u524D\u751F\u6548\u7684\u7248\u672C\uFF1A","update.kindNpm":"npm \u5168\u5C40","update.kindSource":"\u6E90\u7801 checkout","update.kindUnknown":"\u672A\u77E5","update.btnCheck":"\u68C0\u67E5\u66F4\u65B0","update.btnChangelog":"\u67E5\u770B\u66F4\u65B0\u5185\u5BB9","update.btnChangelogHide":"\u6536\u8D77\u66F4\u65B0\u5185\u5BB9","update.btnUpdate":"\u66F4\u65B0\u5230\u6700\u65B0\u7248","update.btnRestart":"\u91CD\u542F botmux","update.changelogLoading":"\u52A0\u8F7D\u66F4\u65B0\u5185\u5BB9\u2026","update.changelogEmpty":"\u6CA1\u6709\u6BD4\u5F53\u524D\u7248\u672C\u66F4\u65B0\u7684\u53D1\u5E03\u8BF4\u660E\u3002","update.changelogFailed":"\u65E0\u6CD5\u52A0\u8F7D\u66F4\u65B0\u5185\u5BB9\uFF08\u79BB\u7EBF\u6216\u53D7\u7F51\u7EDC\u9650\u5236\uFF09\u3002","update.changelogRateLimited":"GitHub \u63A5\u53E3\u8BF7\u6C42\u8D85\u9650\uFF08\u672A\u767B\u5F55\u6BCF\u5C0F\u65F6\u6BCF IP 60 \u6B21\uFF0C\u5171\u4EAB\u7F51\u7EDC\u6613\u89E6\u53D1\uFF09\uFF0C\u6682\u65F6\u62FF\u4E0D\u5230\u66F4\u65B0\u5185\u5BB9\u3002","update.changelogViewOnGitHub":"\u524D\u5F80 GitHub Releases \u67E5\u770B","update.navBadgeTitle":"\u6709\u65B0\u7248\u672C {version}","update.confirmMultiInstall":`\u68C0\u6D4B\u5230\u591A\u4E2A botmux \u5B89\u88C5\uFF1A
|
|
2
2
|
{paths}
|
|
3
3
|
|
|
4
4
|
npm \u66F4\u65B0\u53EA\u4F1A\u66F4\u65B0 npm \u5168\u5C40\u90A3\u4E2A\uFF0C\u53EF\u80FD\u4E0D\u662F\u5F53\u524D\u751F\u6548\u7684\u7248\u672C\u3002\u4ECD\u8981\u7EE7\u7EED\uFF1F`,"update.confirmUpdate":"\u5C06\u8FD0\u884C npm install -g botmux@latest\uFF0C\u66F4\u65B0\u5230 {version}\u3002\u786E\u8BA4\u7EE7\u7EED\uFF1F","update.confirmUpdateNoVer":"\u5C06\u8FD0\u884C npm install -g botmux@latest \u66F4\u65B0\u5230\u6700\u65B0\u7248\u3002\u786E\u8BA4\u7EE7\u7EED\uFF1F","update.nodeTooOldAlert":"\u5F53\u524D Node \u7248\u672C {version} \u8FC7\u4F4E\uFF08\u8981\u6C42 \u2265 {required}\uFF09\uFF0C\u8BF7\u5148\u5347\u7EA7 Node \u518D\u66F4\u65B0\u3002","update.updating":"\u6B63\u5728\u66F4\u65B0\uFF08npm install -g botmux@latest\uFF09\uFF0C\u8BF7\u7A0D\u5019\u2026","update.updatedChanged":"\u5DF2\u66F4\u65B0 {old} \u2192 {new}\u3002","update.confirmRestart":"\u9700\u8981\u91CD\u542F botmux \u4EE5\u5E94\u7528\u65B0\u7248\u672C\u3002\u73B0\u5728\u91CD\u542F\uFF1F\uFF08\u6240\u6709\u4F1A\u8BDD\u4F1A\u51B7\u6062\u590D\uFF0C\u4EEA\u8868\u76D8\u4F1A\u77ED\u6682\u65AD\u5F00\u5E76\u81EA\u52A8\u91CD\u8FDE\uFF09","update.alreadyLatestRun":"\u5DF2\u662F\u6700\u65B0\u7248\u672C\uFF08{version}\uFF09\uFF0C\u65E0\u9700\u66F4\u65B0\u3002","update.updateFailed":"\u66F4\u65B0\u5931\u8D25\uFF1A{detail}","update.noRestartHint":"\u66F4\u65B0\u5B8C\u6210\u3002\u7A0D\u540E\u8BF7\u624B\u52A8\u91CD\u542F\uFF08botmux restart\uFF09\u4EE5\u5E94\u7528\u65B0\u7248\u672C\u3002","update.confirmPlainRestart":"\u91CD\u542F botmux\uFF1F\u6240\u6709\u4F1A\u8BDD\u4F1A\u51B7\u6062\u590D\uFF0C\u4EEA\u8868\u76D8\u4F1A\u77ED\u6682\u65AD\u5F00\u5E76\u81EA\u52A8\u91CD\u8FDE\u3002","update.restarting":"\u6B63\u5728\u91CD\u542F botmux\uFF0C\u7B49\u5F85\u91CD\u8FDE\u2026","update.restartSlow":"\u91CD\u542F\u8017\u65F6\u8F83\u957F\uFF0C\u8BF7\u7A0D\u540E\u624B\u52A8\u5237\u65B0\u9875\u9762\u3002","update.restartFailed":"\u91CD\u542F\u5931\u8D25\uFF1A{detail}","skills.title":"Skill \u7BA1\u7406","skills.subtitle":"\u7BA1\u7406 botmux \u7684 CLI \u65E0\u5173 Skill \u8D44\u4EA7\uFF0C\u5E76\u6309 bot \u9009\u62E9\u4F18\u5148\u62AB\u9732\u3002","skills.installed":"\u5DF2\u5B89\u88C5 Skills","skills.installedHelp":"\u672C\u673A registry \u4E2D\u53EF\u88AB bot \u4F18\u5148\u62AB\u9732\u7684 Skill \u8D44\u4EA7\u3002","skills.overviewTitle":"\u6309 Bot \u7EC4\u7EC7 Skill \u8D44\u4EA7","skills.overviewBody":"\u5168\u5C40 Skill \u6CE8\u5165\u914D\u7F6E\u63A7\u5236\u4F1A\u8BDD\u6CE8\u5165\u7B56\u7565\uFF1B\u6BCF\u4E2A bot \u53EA\u7EF4\u62A4\u81EA\u5DF1\u7684\u4F18\u5148\u62AB\u9732\u5217\u8868\u3002","skills.metricInstalled":"\u5DF2\u5B89\u88C5 Skills","skills.metricBots":"\u5DF2\u914D\u7F6E Bot","skills.metricAttached":"\u4F18\u5148\u5F15\u7528","skills.install":"\u5B89\u88C5 Skill","skills.installInfoLabel":"\u5B89\u88C5\u4F4D\u7F6E\u8BF4\u660E","skills.installInfo":`\u6CE8\u518C: ~/.botmux/skills/registry.json
|
|
@@ -13,7 +13,7 @@ npm \u66F4\u65B0\u53EA\u4F1A\u66F4\u65B0 npm \u5168\u5C40\u90A3\u4E2A\uFF0C\u53E
|
|
|
13
13
|
{total} \u4E2A\u60AC\u6302\u9879\u4F1A\u7531 cancel recovery \u5904\u7406\u3002
|
|
14
14
|
effects={effects}, activities={activities}, waits={waits}, cancels={cancels}`,"workflow.detail.writeAccessCancel":"\u9700\u8981\u5199\u6743\u9650\uFF1A\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C `botmux dashboard` \u83B7\u53D6\u4E00\u6B21\u6027 URL\uFF0C\u6253\u5F00\u540E\u5199\u5165 cookie\uFF0C\u518D\u56DE\u6765\u70B9\u51FB\u53D6\u6D88\u3002","workflow.detail.cancelHttp":"cancel HTTP {status}","workflow.detail.cancelPending":"\u53D6\u6D88\u5DF2\u63D0\u4EA4\uFF1B\u7B49\u5F85\u8FD0\u884C\u4E2D\u7684 activity \u6536\u655B","workflow.detail.writeAccessApproval":"\u9700\u8981\u5199\u6743\u9650\uFF1A\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C `botmux dashboard` \u83B7\u53D6\u4E00\u6B21\u6027 URL\uFF0C\u6253\u5F00\u540E\u5199\u5165 cookie\uFF0C\u518D\u56DE\u6765\u5BA1\u6279\u3002","workflow.detail.actionHttp":"{action} HTTP {status}","workflow.detail.approved":"\u5DF2\u901A\u8FC7","workflow.detail.rejected":"\u5DF2\u62D2\u7EDD","workflow.detail.alreadyTerminal":"\u8FD0\u884C\u5DF2\u7EC8\u6001\uFF1B\u672A\u5E94\u7528\u201C{label}\u201D\u3002","workflow.detail.workflowContinue":"{label}\uFF1B\u7B49\u5F85\u5DE5\u4F5C\u6D41\u7EE7\u7EED\u6267\u884C\u3002","workflow.detail.workflowRefreshing":"{label}\uFF1B\u6B63\u5728\u5237\u65B0\u5DE5\u4F5C\u6D41\u72B6\u6001\u3002","workflow.detail.eventsLoaded":"\u5DF2\u52A0\u8F7D {loaded}/{total} \u4E2A\u4E8B\u4EF6","workflow.detail.dangling":"\u60AC\u6302\u9879","workflow.detail.noDangling":"\u6CA1\u6709\u60AC\u6302\u5DE5\u4F5C\u3002","workflow.detail.none":"\u65E0","workflow.detail.noNodes":"\u8FD8\u6CA1\u6709\u8282\u70B9\u3002","workflow.detail.idle":"\u7A7A\u95F2","workflow.detail.noNodeIO":"\u8FD8\u6CA1\u6709\u8282\u70B9\u8F93\u5165\u8F93\u51FA\u3002","workflow.detail.notDispatched":"\u5C1A\u672A\u6D3E\u53D1","workflow.detail.noAttempt":"\u8FD8\u6CA1\u6709\u5C1D\u8BD5","workflow.detail.attempt":"\u5C1D\u8BD5","workflow.detail.authoredInput":"\u539F\u59CB\u8F93\u5165","workflow.detail.resolvedInput":"\u89E3\u6790\u540E\u8F93\u5165","workflow.detail.output":"\u8F93\u51FA","workflow.detail.executionLog":"\u6267\u884C\u65E5\u5FD7","workflow.detail.liveTerminal":"\u5B9E\u65F6\u7EC8\u7AEF","workflow.detail.terminalLive":"\u5728\u7EBF","workflow.detail.terminalClosedShort":"\u5DF2\u5173\u95ED","workflow.detail.terminalClosed":"\u7EC8\u7AEF\u5DF2\u5173\u95ED\u3002\u8BF7\u67E5\u770B\u4E0B\u65B9\u6267\u884C\u65E5\u5FD7\u83B7\u53D6\u6700\u7EC8\u8BB0\u5F55\u3002","workflow.detail.openTerminalNewTab":"\u5728\u65B0\u6807\u7B7E\u9875\u6253\u5F00\u7EC8\u7AEF","workflow.detail.terminalReplay":"\u7EC8\u7AEF\u56DE\u653E","workflow.detail.openReplayNewTab":"\u5728\u65B0\u6807\u7B7E\u9875\u6253\u5F00\u56DE\u653E","workflow.detail.downloadFullLog":"\u4E0B\u8F7D\u5B8C\u6574\u65E5\u5FD7","workflow.detail.terminalResume":"\u8C03\u8BD5\u4F1A\u8BDD","workflow.detail.openResumeNewTab":"\u5728\u65B0\u6807\u7B7E\u9875\u6253\u5F00\u8C03\u8BD5\u4F1A\u8BDD","workflow.detail.resumeSession":"\u7EE7\u7EED\u4F1A\u8BDD","workflow.detail.resumeStarting":"\u6B63\u5728\u542F\u52A8\u2026","workflow.detail.endResumeSession":"\u7ED3\u675F\u8C03\u8BD5\u4F1A\u8BDD","workflow.detail.resumeEnding":"\u7ED3\u675F\u4E2D\u2026","workflow.detail.resumeUnsupportedCli":"{cliId} CLI \u4E0D\u652F\u6301 resume","workflow.detail.resumeMissingCliSession":"\u7F3A\u5C11 cliSessionId\uFF0C\u65E0\u6CD5 resume","workflow.detail.resumeStartFailed":"\u542F\u52A8\u8C03\u8BD5\u4F1A\u8BDD\u5931\u8D25 (HTTP {status})","workflow.detail.resumeEndFailed":"\u7ED3\u675F\u8C03\u8BD5\u4F1A\u8BDD\u5931\u8D25 (HTTP {status})","workflow.detail.writeAccessResume":"\u9700\u8981\u5199\u5165\u6743\u9650\u624D\u80FD resume \u4F1A\u8BDD\u3002","workflow.detail.waitPrompt":"\u7B49\u5F85\u63D0\u793A","workflow.detail.approvalComment":"\u5BA1\u6279\u5907\u6CE8","workflow.detail.optionalComment":"\u53EF\u9009\u5907\u6CE8","workflow.detail.approve":"\u901A\u8FC7","workflow.detail.reject":"\u62D2\u7EDD","workflow.detail.submitting":"\u63D0\u4EA4\u4E2D...","workflow.detail.empty":"\u7A7A","workflow.detail.truncated":"\u5DF2\u622A\u65AD","workflow.detail.noData":"\u6CA1\u6709\u6570\u636E\u3002","workflow.detail.noPreview":"\u6CA1\u6709\u9884\u89C8\u3002","workflow.detail.open":"\u6253\u5F00","workflow.detail.deadline":"\u622A\u6B62","workflow.detail.effect":"\u526F\u4F5C\u7528","workflow.detail.wait":"\u7B49\u5F85","workflow.detail.noEvents":"\u8FD8\u6CA1\u6709\u4E8B\u4EF6\u3002","workflow.summary.workflow":"\u5DE5\u4F5C\u6D41","workflow.summary.status":"\u72B6\u6001","workflow.summary.lastSeq":"\u6700\u540E\u5E8F\u53F7","workflow.summary.updated":"\u66F4\u65B0\u65F6\u95F4","workflow.summary.revision":"\u4FEE\u8BA2","workflow.summary.initiator":"\u53D1\u8D77\u4EBA","workflow.summary.failedNode":"\u5931\u8D25\u8282\u70B9","workflow.summary.cancelOrigin":"\u53D6\u6D88\u6765\u6E90","workflow.summary.chat":"\u7FA4\u804A","workflow.summary.app":"\u5E94\u7528","workflow.dangling.activities":"Activities","workflow.dangling.effects":"Effects","workflow.dangling.waits":"Waits","workflow.dangling.cancels":"Cancels","catalog.title":"\u5DE5\u4F5C\u6D41\u76EE\u5F55","catalog.subtitle":"\u4ECE\u5DF2\u4FDD\u5B58\u7684 workflow \u5B9A\u4E49\u521B\u5EFA\u4E00\u6B21\u8FD0\u884C\u3002","catalog.searchPlaceholder":"\u641C\u7D22 workflowId / \u8DEF\u5F84","catalog.refresh":"\u5237\u65B0","catalog.loading":"\u6B63\u5728\u52A0\u8F7D\u76EE\u5F55...","catalog.loadFailed":"\u76EE\u5F55\u52A0\u8F7D\u5931\u8D25\uFF1A{error}","catalog.noDefinitions":"\u6CA1\u6709\u627E\u5230 workflow \u5B9A\u4E49\u3002","catalog.noFilterMatch":"\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684\u5B9A\u4E49\u3002","catalog.table.workflow":"\u5DE5\u4F5C\u6D41","catalog.table.version":"\u7248\u672C","catalog.table.params":"\u53C2\u6570","catalog.table.nodes":"\u8282\u70B9","catalog.table.revision":"\u4FEE\u8BA2","catalog.table.path":"\u8DEF\u5F84","catalog.paramSummary":"{required}/{total} \u5FC5\u586B","catalog.back":"\u8FD4\u56DE\u76EE\u5F55","catalog.detailTitle":"\u5DE5\u4F5C\u6D41\u5B9A\u4E49","catalog.definitionLoadFailed":"\u5B9A\u4E49\u52A0\u8F7D\u5931\u8D25\uFF1A{error}","catalog.summary":"\u6458\u8981","catalog.paramsSchema":"\u53C2\u6570 Schema","catalog.definitionJson":"\u5B9A\u4E49 JSON","catalog.runPanel":"\u8FD0\u884C\u5DE5\u4F5C\u6D41","catalog.paramsJson":"\u53C2\u6570 JSON","catalog.paramsPlaceholder":`{
|
|
15
15
|
"city": "\u5317\u4EAC"
|
|
16
|
-
}`,"catalog.chatId":"\u7FA4\u804A ID","catalog.larkAppId":"\u98DE\u4E66\u5E94\u7528 ID","catalog.chatBindingHint":"\u5FC5\u586B\uFF0C\u7528\u4E8E\u786E\u5B9A humanGate \u5361\u7247\u53D1\u9001\u5230\u54EA\u4E2A\u98DE\u4E66\u7FA4\uFF0C\u4EE5\u53CA\u53D6\u6D88\u8DEF\u7531\u5F52\u5C5E\u3002","catalog.run":"\u8FD0\u884C","catalog.running":"\u542F\u52A8\u4E2D...","catalog.badParamsJson":"\u53C2\u6570\u5FC5\u987B\u662F JSON object\u3002","catalog.writeAccess":"\u9700\u8981\u5199\u6743\u9650\uFF1A\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C `botmux dashboard` \u83B7\u53D6\u4E00\u6B21\u6027 URL\uFF0C\u6253\u5F00\u540E\u5199\u5165 cookie\uFF0C\u518D\u56DE\u6765\u8FD0\u884C\u3002","catalog.runHttp":"run HTTP {status}","catalog.runStarted":"\u8FD0\u884C\u5DF2\u542F\u52A8\uFF1B\u6B63\u5728\u6253\u5F00\u8BE6\u60C5\u9875...","catalog.invalidParams":"\u53C2\u6570\u65E0\u6548","catalog.issue":"{path}: {message}","catalog.noParams":"\u6CA1\u6709\u58F0\u660E\u53C2\u6570\u3002","catalog.required":"\u5FC5\u586B","catalog.optional":"\u53EF\u9009","catalog.default":"\u9ED8\u8BA4\u503C","catalog.description":"\u8BF4\u660E","catalog.path":"\u8DEF\u5F84","catalog.revision":"\u4FEE\u8BA2","catalog.nodeCount":"\u8282\u70B9\u6570"},Ed={"app.name":"botmux","app.subtitle":"Feishu AI CLI Control","time.secondsAgo":"{value}s ago","time.minutesAgo":"{value}m ago","time.hoursAgo":"{value}h ago","nav.overview":"Overview","nav.sessions":"Sessions","nav.sidebarCollapse":"Collapse sidebar","nav.sidebarExpand":"Expand sidebar","nav.groups":"Groups","nav.schedules":"Schedules","nav.settings":"Settings","nav.botDefaults":"Bot Defaults","nav.skills":"Skills","status.live":"Live","status.disconnected":"Disconnected","status.system":"System","status.light":"Light","status.dark":"Dark","status.language":"Language","status.theme":"Theme","theme.base":"Basic","theme.skins":"Skins","skin.cyber":"2077","skin.genshin":"Genshin","skin.fallout":"Fallout","skin.prts":"PRTS","skin.bluearchive":"Blue Archive","skin.zzz":"ZZZ","skin.dragonball":"Dragon Ball","skin.ikun":"ikun","botOnboarding.add":"Add Bot","botOnboarding.title":"Add Bot","botOnboarding.intro":"Pick a CLI and working directory, scan to create a PersonalAgent app \u2014 the dashboard writes it to local bots.json and auto-configures Open Platform permissions.","botOnboarding.cliLabel":"CLI adapter","botOnboarding.dirLabel":"Working directory","botOnboarding.dirPlaceholder":"Default ~ (home); must exist on the daemon host","botOnboarding.modelLabel":"Model (optional)","botOnboarding.modelPlaceholder":"Leave empty for the CLI default model","botOnboarding.modelTtadkPlaceholder":"ttadk gateway model, default {model}, editable anytime","botOnboarding.modelTtadkCocoPlaceholder":"CoCo needs no model","botOnboarding.startScan":"Start scan","botOnboarding.cancel":"Cancel","botOnboarding.starting":"Generating QR code...","botOnboarding.waiting":"Scan with the Feishu app to create the app.","botOnboarding.verifying":"Scan accepted. Verifying credentials...","botOnboarding.configuringPermissions":"Auto-configuring Open Platform permissions\u2026","botOnboarding.platformScanHint":"Scan once more with the Feishu app to sign in to the Open Platform (to auto-import permissions, set the callback, and submit a version).","botOnboarding.platformQrAlt":"Open Platform login QR code","botOnboarding.completed":"Bot added.","botOnboarding.permissionOk":"Auto-imported {count} permissions.","botOnboarding.permissionSkipped":"({count} skipped \u2014 not in the tenant catalog)","botOnboarding.permissionVersion":"Submitted version {version}.","botOnboarding.permissionManual":"Permissions could not be auto-configured. Complete these steps manually:","botOnboarding.metaDir":"Dir","botOnboarding.failed":"Add failed","botOnboarding.openLink":"Open scan link in browser","botOnboarding.close":"Close","botOnboarding.restartHint":"bots.json has been updated. Run pnpm daemon:restart for the new bot to take effect.","botOnboarding.needsOwner":"Could not auto-confirm the scanner identity. Enter an owner manually to finish.","botOnboarding.ownerLabel":"Owner (bot administrator)","botOnboarding.ownerPlaceholder":"Full email / union_id (on_) / open_id (ou_), comma-separated","botOnboarding.ownerHint":"An owner is required so the bot is not left open for anyone to run admin actions. Prefer a company email or union_id (on_).","botOnboarding.ownerSubmit":"Save owner & finish","botOnboarding.ownerEmpty":"Enter at least one owner.","botOnboarding.ownerInvalid":"Owner validation failed. Please check and retry.","botOnboarding.qrAlt":"Feishu bot onboarding QR code","overview.title":"Workbench","overview.subtitle":"Live status of your AI teammates \xB7 synced with Feishu topics","overview.team":"AI Team","overview.teamHint":"Live status of every digital teammate","overview.attention":"Needs You","overview.attentionHint":"Blocked tasks \u2014 one reply gets them moving again","overview.activeSessions":"Active Sessions","overview.activeSessionsHint":"Sessions currently running","overview.today":"Right Now","overview.todayHint":"Active session distribution","overview.viewAll":"View all \u2192","overview.botIdle":"Standing by, ready for new tasks","overview.botOffline":"Offline \u2014 daemon not running","overview.botBusy":"Working \xB7 {count} sessions","overview.botNeedsYou":"Waiting on you","overview.botReady":"Ready","overview.botOff":"Offline","overview.sessionsCount":"{count} sessions","overview.lastActive":"active {time} ago","overview.noAttention":"Nothing waiting on you","overview.teamExpand":"Show all {count} \u25BE","overview.teamCollapse":"Collapse \u25B4","strip.pending":"{count} pending","strip.longest":"waiting {time} \u2014 {bot} {reason}","strip.handle":"Handle now","overview.openSessions":"Active Sessions","overview.workingSessions":"Working","overview.onlineBots":"Online Bots","overview.schedules":"Schedules","overview.groups":"Groups Seen","overview.enabledSchedules":"Enabled","overview.total":"total","overview.active":"active","overview.daemonRegistry":"daemon registry","overview.chatMatrix":"chat matrix","overview.recentSessions":"Recent Sessions","overview.nextSchedules":"Next Runs","overview.noSessions":"No sessions yet.","overview.noSchedules":"No schedules yet.","sessions.title":"Session Control","sessions.subtitle":"Locate Feishu topics, open Web Terminal, close or resume CLI sessions.","sessions.search":"Search working dir / title / IDs","sessions.anyStatus":"Any status","sessions.adoptAny":"adopt: any","sessions.adoptYes":"adopt: yes","sessions.adoptNo":"adopt: no","sessions.activeOnly":"Active only","sessions.closeSelected":"Close selected","sessions.clearSelection":"Clear","sessions.selectedCount":"{count} sessions selected","sessions.idleCleanupOlderThan":"Idle over","sessions.idleCleanupThreshold":"Idle cleanup threshold","sessions.idleCleanupRun":"Clean idle","sessions.idleCleanupCount":"{count} cleanable","sessions.idleCleanupConfirm":"Close {count} sessions idle for more than {threshold}?","sessions.idleCleanupRunning":"Cleaning\u2026","sessions.idleCleanupDone":"Closed {closed}, failed {failed}","sessions.idleCleanupFailed":"Cleanup failed","sessions.lock":"Lock session","sessions.unlock":"Unlock session","sessions.locked":"Locked","sessions.lockSelected":"Lock selected","sessions.unlockSelected":"Unlock selected","sessions.lockFailed":"Failed to update lock state","sessions.bot":"Bot","sessions.cli":"CLI","sessions.chat":"Chat","sessions.openChat":"Open chat","sessions.status":"Status","sessions.tokenIn":"Token In","sessions.tokenOut":"Token Out","sessions.titleCol":"Title","sessions.workingDir":"Working Dir","sessions.created":"Created","sessions.last":"Last","sessions.adopt":"Adopt","sessions.actions":"Actions","sessions.details":"Details","sessions.copy":"Copy","sessions.copied":"Copied","sessions.locate":"Locate Topic","sessions.locating":"Sending...","sessions.cooldown":"Cooldown {seconds}s","sessions.openTerminal":"Terminal","sessions.writeLink":"Write Link","sessions.writeLinkHint":"Get a writable terminal link (carries a write-access token; opens in a new tab)","sessions.writeLinkFail":"Failed to get write link","sessions.close":"Close Session","sessions.restart":"Restart CLI","sessions.restartConfirmIntro":"You are about to restart this CLI.","sessions.restartConfirmStatus":"Current status","sessions.restartConfirmCli":"CLI","sessions.restartConfirmQuestion":"Restart this CLI?","sessions.restartFailed":"Restart failed","sessions.resume":"Resume Session","sessions.dismiss":"Close","sessions.closeConfirm":"Close this session?","sessions.resumeFailed":"Resume failed","sessions.land":"Land","sessions.landLoading":"Loading sandbox diff\u2026","sessions.landUnavailable":"Cannot land","sessions.landEmpty":"No changes in the sandbox clone.","sessions.landApply":"Apply to disk","sessions.landDiscard":"Discard","sessions.landApplied":"Landed","sessions.landFailed":"Land failed","sessions.landDiscarded":"Discarded (sandbox clone not applied).","sessions.insight":"Insight","sessions.insightLoading":"Analyzing\u2026","sessions.insightUnavailable":"Insight unavailable","sessions.insightEmpty":"No analyzable tool spans in this session yet.","sessions.insightMetrics":"spans {total} \xB7 failed {failed} \xB7 slow {slow} \xB7 read/write {rw} \xB7 compactions {compactions}","sessions.insightSuggestions":"Suggestions","sessions.insightSpans":"Action spans","sessions.insightCapped":"showing first {shown}/{total}","sessions.insightAsOf":"as of {asOf}","sessions.insightPartial":"(may exclude the in-flight latest turn)","nav.insights":"Insight","insights.title":"Workflow Insight","insights.subtitle":"Read-only analysis of local Claude Code / Codex sessions \u2014 action trace, failures, friction, with rule-based optimization tips.","insights.refresh":"Refresh","insights.search":"Search session / bot / dir\u2026","insights.filter":"Filter","insights.filterAll":"All","insights.filterReview":"Worth review","insights.filterFailed":"Has failures","insights.filterSlow":"Has slow spans","insights.loading":"Analyzing\u2026","insights.loaded":"Loaded {count} sessions","insights.unavailable":"Load failed","insights.listCount":"showing {shown}/{total}","insights.tabOverview":"Overview","insights.tabSessions":"Sessions","insights.tabDist":"Distribution","insights.tabHot":"Hotspots","insights.projectAll":"All projects","insights.timeAll":"All time","insights.time1d":"Last 1d","insights.time7d":"Last 7d","insights.time30d":"Last 30d","insights.clear":"Clear","insights.emptyAnalyzableHint":"Check \u201CIncl. unanalyzed\u201D to see the remaining sessions.","insights.showAll":"Incl. unanalyzed","insights.distHint":"Metric distribution across the currently filtered sessions \u2014 see the shape and where typical values land.","insights.distSpans":"Spans per session","insights.distFailed":"Failures per session","insights.distSlow":"Slow spans per session","insights.distAgentTime":"Agent working time","insights.distRw":"Read/write ratio","insights.distChurn":"Code churn (lines)","insights.distTrend":"Trend by day (last 4 weeks)","insights.distTrendSub":"sessions / day","insights.distMedian":"median {v}","insights.distEmpty":"No analyzable sessions under the current filter.","insights.disclosure":`Measurement note: durations count tool-execution time only and exclude time spent waiting for a user reply (question / plan approval), so they do not reflect wall-clock; Codex reads files mostly via shell (exec_command), not counted as "read", so its read/write ratio runs low or 0; code churn is parsed from patches and covers only each session's most active files. Cross-tool distributions and ratios are indicative only, not directly comparable.`,"insights.rwNote":"Codex reads mostly via shell, not counted as reads","insights.viewSessions":"View sessions","insights.hotHint":"Cross-session recurrence \u2014 where it pays to converge.","insights.hotToolFailures":"Tool failure hotspots","insights.hotSlowSessions":"Slowest sessions","insights.hotProjects":"Projects","insights.hotFiles":"File recurrence","insights.hotCommands":"Command recurrence","insights.hotErrors":"Error recurrence","insights.hotComingSoon":"File / command recurrence hotspots coming soon (needs cross-session engine aggregation).","insights.hotSessionsCol":"sessions","insights.hotFailsCol":"fails","insights.hotSlowCol":"slow","insights.backToList":"Back to list","insights.sortLabel":"Sort","insights.sortRecent":"Recent","insights.sortReview":"Review","insights.sortSpans":"Spans","insights.sortFails":"Failures","insights.sortSlow":"Slow","insights.sortAgent":"Duration","insights.layoutCard":"Cards","insights.layoutTable":"Table","insights.colTitle":"Session","insights.colProject":"Project","insights.colTime":"Time","insights.paletteOpen":"Jump \u2318K","insights.palettePlaceholder":"Jump to a tab or search sessions\u2026","insights.paletteTabs":"Views","insights.paletteSessions":"Sessions","insights.paletteEmpty":"No matches","insights.tabFlow":"Flow","insights.flowHint":"Where the agent spends its actions and time across activity phases, and each session\u2019s rhythm.","insights.flowPipeline":"Activity-phase pipeline","insights.flowPipeSub":"research \u2192 edit \u2192 run \u2192 delegate \u2192 discuss; top = actions, bottom = time","insights.flowShares":"Action share vs time share","insights.flowActShare":"Action share","insights.flowTimeShare":"Time share","insights.flowRhythm":"Per-session rhythm (by duration)","insights.subagents":"Sub-agents","insights.subagentsHint":"Sub-agents this session delegated to (Task/Agent) \u2014 what each did and how long it ran.","insights.readsShort":"read","insights.editsShort":"edit","insights.durShort":"dur","insights.empty":"No matching sessions.","insights.selectSession":"Pick a session on the left to see action spans and suggestions.","insights.detailLoading":"Loading session detail\u2026","insights.recommendations":"Suggestions","insights.recommendationsHint":"Rule-based cross-session rollup, each traceable to a metric.","insights.noRecommendations":"No suggestions.","insights.seenInSessions":"seen in {count} sessions","insights.toolFailures":"Top tool failures","insights.toolFailuresHint":"Failed spans grouped by tool.","insights.noFailures":"No failed spans.","insights.metricSessions":"Sessions","insights.metricAnalyzed":"{count} analyzed","insights.metricSpans":"Spans","insights.metricSafe":"redacted","insights.metricFailed":"Failed spans","insights.metricSlow":"Slow spans","insights.metricRw":"Read/write","insights.metricCompactions":"compactions {count}","insights.spansShort":"span ","insights.failedShort":"fail ","insights.slowShort":"slow ","insights.rwShort":"r/w ","insights.unsupported":"CLI not supported","insights.noTranscript":"No transcript","insights.parseError":"Parse failed","insights.noSpans":"No analyzable spans.","insights.sevBad":"Critical","insights.sevWarn":"Warn","insights.sevInfo":"Info","insights.phase.research":"Research","insights.phase.edit":"Edit","insights.phase.run":"Run","insights.phase.delegate":"Delegate","insights.phase.discuss":"Discuss","insights.trace":"Action spans","insights.ledger":"Per-turn ledger","insights.detailTabs":"Detail views","insights.spanStatus":"Status","insights.spanTool":"Tool","insights.spanPhase":"Phase","insights.spanDuration":"Duration","insights.spanTurn":"Turn","insights.spanSummary":"Summary","insights.ledgerMore":"Show {count} more summaries","insights.ledgerOmitted":"{count} more hidden","insights.ledgerNoContent":"No redacted summary for this turn.","insights.diagShow":"Show evidence","insights.diagActive":"Viewing","insights.evMatched":"{count} matching spans","insights.evMatchedCapped":"{matched} matched \xB7 showing {shown}","insights.evDefault":"{shown} of {total} spans (focused)","insights.evShowAll":"Show all {count}","insights.evBackToEvidence":"Focused view","insights.intent.run_script":"Run script","insights.intent.test":"Test","insights.intent.typecheck":"Typecheck","insights.intent.lint":"Lint","insights.intent.git":"Git","insights.intent.search":"Search","insights.intent.read_file":"Read","insights.intent.edit_file":"Edit","insights.intent.write_file":"Write","insights.intent.delegate":"Delegate","insights.intent.unknown":"Action","insights.result.ok":"OK","insights.result.tool_error":"Tool error","insights.result.test_failed":"Test failed","insights.result.typecheck_failed":"Typecheck failed","insights.result.lint_failed":"Lint failed","insights.result.command_failed":"Command failed","insights.result.timeout":"Timeout","insights.result.no_output":"No output","insights.result.unknown":"Unknown","insights.tag.failure":"Failures","insights.tag.slow":"Slow","insights.tag.retry":"Retries","insights.tag.read_write_imbalance":"Read/write imbalance","insights.tag.diagnostic":"Diagnostic","insights.tag.normal":"Normal","insights.turnHeadline.turn_has_failures":"{failures} failures this turn","insights.turnHeadline.turn_has_slow_spans":"Slow operations this turn","insights.turnHeadline.turn_has_retries":"Retried the same action repeatedly","insights.turnHeadline.turn_read_write_imbalance":"Edit-heavy turn (edits {edits} / reads {reads})","insights.evTimeline":"Full timeline ({count} spans)","insights.evNoFlags":"No spans flagged as failure / slow / retry","insights.turnAllNormal":"All {count} turns look normal \u2014 nothing to review","insights.turnEvidence":"View {count} evidence spans","insights.turnHiddenNormal":"{count} normal turns hidden","insights.mReads":"Read","insights.mEdits":"Edit","insights.mRuns":"Run","insights.mFailures":"Fail","insights.mDur":"Time","insights.turnHeadline.turn_normal":"Normal","insights.rec.fix_repeated_tool_failures":"Repeated command failures need to converge","insights.rec.split_slow_operation":"Slow operations dragged the whole session","insights.rec.add_read_pass_before_edit":"Too little reading before editing","insights.rec.preserve_context_checkpoints":"Context was compacted \u2014 keep checkpoints","insights.impact.impact_failed_spans":"{failedSpans} actions failed (top: {topTool} \xD7{topToolFailures})","insights.impact.impact_slow_spans":"{slowSpansTotal} slow operations slowed progress","insights.impact.impact_low_read_write_ratio":"Edited {writeSpans}, read only {readSpans}","insights.impact.impact_context_compaction":"{compactions} context compactions this session","insights.why.why_tool_failure_concentrated":"Failures concentrate on {topTool} ({topToolFailures}\xD7) \u2014 likely one root cause","insights.why.why_slow_span_dominates":"A few long operations dominate; slowest is {slowestTool}","insights.why.why_edits_outpaced_reads":"Read/write ratio {readWriteRatio}; editing more than reading invites rework","insights.why.why_context_compaction_happened":"Long session was compacted; early decisions/context may be lost","insights.action.inspect_failed_span_details":"Open each failed action\u2019s detail to find the root cause","insights.action.add_preflight_or_timeout":"Add preflight checks or timeouts to frequently failing commands","insights.action.narrow_or_split_slow_operation":"Narrow or split slow operations (e.g. run targeted tests)","insights.action.surface_timeout_or_progress":"Surface timeouts/progress earlier instead of silently hanging","insights.action.read_or_search_before_editing":"Read or search an unfamiliar file before editing it","insights.action.verify_assumptions_before_running":"Verify assumptions before acting to avoid blind edits","insights.action.write_checkpoints_for_long_tasks":"Write decisions and checkpoints to notes for long tasks","insights.struct.shell":"shell command","insights.struct.fileEdit":"file edit","insights.struct.readSearch":"read/search","insights.struct.agentTask":"agent task","insights.struct.toolInput":"tool input","insights.struct.toolResult":"tool result","insights.struct.toolError":"tool error","insights.struct.patchFailed":"patch failed","insights.struct.patchApplied":"patch applied","insights.struct.exit":"exit {code}","insights.spanAll":"All","insights.dDetail":"Detail","insights.dCollapse":"Hide","insights.dPhase":"Phase","insights.dStart":"Start","insights.dDur":"Duration","insights.dIntent":"Intent","insights.dResult":"Result","insights.dIn":"Input","insights.dOut":"Output","insights.dTags":"Tags","insights.dTurnContext":"Turn {turn} context","insights.advice.failure":"\u{1F4A1} Read the error before retrying \u2014 don\u2019t retry blindly","insights.advice.retry":"\u{1F4A1} Same step retried repeatedly \u2014 find the root cause first","insights.advice.read_write_imbalance":"\u{1F4A1} Read the relevant files before editing to avoid rework","insights.advice.slow":"\u{1F4A1} Slow op: run targeted tests or split it up","insights.turnPrompt":"User","insights.turnExpand":"Expand {count} steps","insights.turnCollapse":"Collapse","insights.turnRail":"Session trace","insights.gantt":"Work timeline","insights.ganttCaption":"{span} actions \xB7 {dur} elapsed \xB7 {active} active","insights.ctxCurve":"Context curve","insights.ctxCaption":"Per-turn in+cache peak \xB7 max {peak} \xB7 {turns} turns","insights.ctxTurn":"Turn {n}","insights.railSubagent":"Subagent","insights.railSubagents":"{n} subagents","insights.turnPromptExpand":"Expand","insights.turnPromptCollapse":"Collapse","insights.turnPromptRaw":"Raw","insights.turnPromptRendered":"Rendered","insights.srcMentions":"mentions","insights.senderHuman":"User","insights.senderA2A":"A2A","insights.senderOther":"Other","insights.senderSystem":"System","insights.turnPromptFull":"Full text","insights.modalClose":"Close","insights.promptTruncated":"Long content, truncated","insights.replay":"Replay","insights.replayAgent":"agent ops","insights.replaySearch":"Search conversation\u2026","insights.replayBy":"From","insights.replayState":"State","insights.replayLoadMore":"Load more ({shown}/{total})","insights.replayAllLoaded":"All loaded ({total})","insights.replayEmpty":"No matching messages","insights.replayNoText":"(no text \u2014 see ops)","insights.replayOps":"{count} ops","insights.wsFiles":"File changes \xB7 {n}","insights.wsCmds":"Commands \xB7 {n}","insights.wsReads":"read {n}","insights.wsEdits":"edit {n}","insights.wsFail":"{n} failed","insights.wsNoFiles":"No file changes","insights.wsNoCmds":"No commands","insights.turnSummary":"{total} turns \xB7 {flagged} need attention","insights.dCommand":"Command","insights.dCmdOutput":"Output","insights.ledgerNormal":"By order","insights.ledgerGrouped":"By recommendation","insights.ledgerOther":"Other turns","insights.ledgerGroupCount":"{count} turns","insights.turnsCapped":"Only first {shown}/{total} actions \u2014 timeline may be incomplete","insights.suggestion.high_tool_failure.title":"Tool failures are concentrated","insights.suggestion.high_tool_failure.action":"Check failed spans first, then add preflight checks or timeout control for repeated failing commands.","insights.suggestion.tool_failure_present.title":"Some tool calls failed","insights.suggestion.tool_failure_present.action":"Review failed spans before repeating the workflow.","insights.suggestion.slow_span.title":"A slow span dominates the session","insights.suggestion.slow_span.action":"Split or bound the slow operation, and surface timeout or progress feedback earlier.","insights.suggestion.low_read_write_ratio.title":"Edits outpaced reads","insights.suggestion.low_read_write_ratio.action":"Add a read/search pass before edits when changing unfamiliar files.","insights.suggestion.context_compaction.title":"Context compaction happened","insights.suggestion.context_compaction.action":"For long tasks, preserve decisions and checkpoints in durable notes or smaller subtasks.","insights.suggestion.no_major_friction.title":"No major trace friction detected","insights.suggestion.no_major_friction.action":"Use the span timeline for spot checks or compare against slower sessions.","insights.evidence.failedSpans":"{count} failed spans","insights.evidence.toolFailedTimes":"{tool} failed {count} times","insights.evidence.multipleToolsFailed":"multiple tools failed","insights.evidence.toolRanSeconds":"{tool} ran for {seconds}s","insights.evidence.readWriteRatio":"read/write ratio {ratio}","insights.evidence.compactions":"compactions {count}","insights.evidence.spansAnalyzed":"{count} spans analyzed","connectors.lede":"Let external systems (alerts, CI, tickets\u2026) trigger a bot to speak in a group or run a workflow via one webhook.","connectors.createTitle":"New Webhook","connectors.fName":"Name","connectors.fNamePh":"e.g. Prod alerts","connectors.fBot":"Trigger bot","connectors.fKind":"Trigger type","connectors.kindTurn":"Single turn (bot responds once)","connectors.kindWorkflow":"Workflow","connectors.fWf":"Workflow ID","connectors.fMode":"Deliver to which group","connectors.modeDynamic":"Specified per request (chat passed in)","connectors.modeFixed":"Fixed group","connectors.modeNewGroup":"New group each time","connectors.fFixedChat":"Target group","connectors.fChatManualPh":"Enter chat ID manually: oc_\u2026","connectors.chatManualLink":"Group not listed? Enter ID manually \u2192","connectors.chatListLink":"\u2190 Pick from group list","connectors.fAllow":"Allowed groups","connectors.optional":" (optional)","connectors.allowHint":"Hold Ctrl/\u2318 to multi-select; empty = unrestricted. Only validates the chat passed in the request.","connectors.dynamicHint":'<b>Dynamic mode</b>: the chat ID is passed per request, one of three ways \u2014 query <code>?chatId=<chatId></code> \xB7 header <code>x-botmux-chat-id: <chatId></code> \xB7 body <code>{"chatId":"<chatId>"}</code>.<br>For "one URL triggers directly, no params", choose Fixed group instead.',"connectors.fDedup":"Dedup field","connectors.fDedupPh":"e.g. alert.id (read from event body)","connectors.dedupHint":"Set: events with the same value go to the <b>same group</b>. Empty: each event <b>creates a new group</b>.","connectors.fInstruction":"Instruction","connectors.fInstructionPh":"What the bot should do on the event. e.g. Summarize the severity, @ the oncall, suggest next steps. Empty = hand the raw event to the model.","connectors.fVerify":"Verification","connectors.verifyToken":"Token (simple: secret in the URL, one curl triggers it)","connectors.verifyHmac":"HMAC signature (advanced: more secure, sign the request yourself)","connectors.fSecret":"Secret / token","connectors.fSecretPh":"Leave empty to auto-generate (shown once)","connectors.btnCreate":"Create","connectors.listTitle":"Existing Webhooks","connectors.loading":"Loading\u2026","connectors.noBotGroups":"(This bot has no visible groups; enter an ID manually on the right)","connectors.modeLabelFixed":"Fixed group","connectors.modeLabelNewGroup":"New group each time","connectors.modeLabelDynamic":"Per-request group","connectors.kindLabelWorkflow":"Workflow","connectors.kindLabelTurn":"Single turn","connectors.count":"\xB7 {count}","connectors.empty":"No webhooks yet. Create one with the form above.","connectors.enabled":"Enabled","connectors.disabled":"Disabled","connectors.badgeToken":"Token","connectors.badgeSign":"Signed","connectors.dest":'to "{name}"',"connectors.btnDisable":"Disable","connectors.btnEnable":"Enable","connectors.btnEdit":"Edit","connectors.btnSave":"Save","connectors.btnCancel":"Cancel","connectors.btnDel":"Delete","connectors.webhookUrl":"Webhook URL: ","connectors.copy":"Copy","connectors.copied":"Copied","connectors.tokenHint":"Token mode: append <code>/<token></code> to the URL when calling (the token is shown only on create/rotate).","connectors.dynamicReqHint":'Dynamic mode: the request must carry the target chat \u2014 <code>?chatId=<chatId></code> or header <code>x-botmux-chat-id</code> or body <code>{"chatId":"\u2026"}</code>.',"connectors.instructionPrefix":"Instruction: ","connectors.delConfirm":"Delete this webhook? Its URL stops working immediately.","connectors.errName":"Enter a name","connectors.errBot":"Pick a bot","connectors.errWf":"Enter a workflow ID","connectors.errChat":"Pick (or enter) a target group","connectors.creating":"Creating\u2026","connectors.saving":"Saving\u2026","connectors.usageDynamicLede":"Dynamic mode: the URL already has the token; pass the target chat ID when calling{gn}:","connectors.usageDynamicNote":'The chat can also go in header <code>x-botmux-chat-id</code> or body <code>{"chatId":"\u2026"}</code>. \u26A0\uFE0F The URL is the credential \u2014 keep it secret.',"connectors.usageTokenLede":"This URL already has the token and a fixed target group; just POST to trigger:","connectors.usageTokenNote":"\u26A0\uFE0F The URL is the credential \u2014 keep it private; delete or rotate it in the list below.","connectors.usageHmac":"The external system must HMAC-SHA256-sign <code>timestamp.body</code> and call with <code>x-botmux-timestamp</code> / <code>x-botmux-nonce</code> / <code>x-botmux-signature</code> headers","connectors.usageHmacDynamic":", and also pass the target chat ID as above","connectors.createdPrefix":'Created "{name}"',"connectors.createdDest":'to "{name}"',"connectors.tokenLabel":"Access token","connectors.signLabel":"Signing secret","connectors.secretOnce":" (shown once \u2014 save it): ","connectors.createFailed":"Create failed: {error}","connectors.saveFailed":"Save failed: {error}","connectors.noOnlineBots":"(No online bots)","team.navHome":"My team","team.navManage":"Team management","team.eyebrow":"Team","team.homeTitle":"Team collaboration (cross-deployment)","team.homeLede":"Invite other deployments (botmux instances teammates run) into one team to discover bots across deployments and pull collaborative groups.","team.localDeployTitle":"This deployment","team.myIdentity":"My Lark identity: ","team.unbound":"Not bound","team.bindBtn":"Bind","team.bindHint":" (auto-identifies you via the bot credentials; once bound, pulling a group adds you and attributes the bots to you)","team.myTeams":"My teams","team.searchPh":"Search name / capability / CLI\u2026","team.allCli":"All CLIs","team.hasCap":"Has capability tag","team.hasRole":"Has default role","team.teamsHint":"Tick bots in any team to pull them into a group (each with its owner). To create a team / generate an invite code / join another team, go to Team management.","team.loading":"Loading\u2026","team.roleModalTitle":"Default role","team.roleModalHint":"The bot default persona (applies across groups), read-only here. To edit, go to the Bot Defaults page.","team.close":"Close","team.tagLocal":"This deployment","team.tagRemoteStale":"Remote \xB7 offline?","team.tagRemote":"Remote","team.removeMember":"Remove","team.depTag":"({tag})","team.depCount":"{count}","team.depSelected":", {n} selected","team.capPh":"Capability tag\u2026","team.viewRole":"View","team.hasRoleShort":"Has role","team.noMatch":"No bots match the filters.","team.gnamePh":"Group name (e.g. cross-team triage)","team.pullGroupBtn":"Pull ticked bots into a group","team.pullGroupHint":"Tick bots \u2192 pull into a Lark group (owner included automatically)","team.noTeams":"No teams yet. Go to Team management to generate an invite code for others to join you, or join another team.","team.connected":"Connected","team.connectFail":"Connection failed: {error}","team.iHost":"I host","team.teamMeta":"{deps} deployments \xB7 {bots} bots","team.rosterFail":"Could not fetch this team roster.","team.acrossTeams":" (across {n} teams, deduped)","team.botsWord":"bots","team.groupCreated":"Group created","team.delegatedBy":' (created by "{name}")',"team.openInLark":"Open in Lark","team.invalidBots":"Bots not added: {ids}","team.invalidOwners":"{n} owner(s) could not be added","team.missingIdentity":"You have not bound a Lark identity, so you were not added to the group (bind it in My team)","team.skippedNoOwner":"{n} bot(s) skipped because their owner has no bound identity (not added)","team.errNoLocalBot":"Tick at least one of your own (this deployment) online bots \u2014 the group is created by it and adds you (the initiator).","team.errAllSkipped":"None of the selected bot owners have a bound identity, so the group cannot be pulled (a bot cannot join a group without its owner). Have those deployments bind an identity first.","team.errNoCreator":"No available group creator (the relevant deployments have no online bot, or are unreachable)","team.errDelegationTimeout":"Timed out delegating group creation to the other deployment (it may have succeeded \u2014 check Lark, do not retry)","team.errGroupCreate":"Group creation failed: {error}","team.roleModalTitleName":"Default role \xB7 {name}","team.bound":"Bound","team.myHostedTeam":"My hosted team","team.remoteTeamLabel":"{name} team","team.manageTitle":"Team management","team.manageLede":"Create multiple teams, generate an invite code per team, or join another team. A team = this deployment bots + the other deployments that joined it.","team.hostedTitle":"Teams I host","team.newTeamPh":"New team name","team.createTeamBtn":"Create team","team.joinTitle":"Join another team","team.hubPh":"Hub address, e.g. http://10.0.0.5:7891","team.codePh":"Invite code","team.joinBtn":"Join","team.noTeamsShort":"No teams yet.","team.default":"Default","team.manageMetaDeps":"{count} deployments","team.manageMetaRemote":" (incl. {r} remote)","team.manageMetaBots":"{count} bots","team.genInvite":"Generate invite code","team.delBtn":"Delete","team.generating":"Generating\u2026","team.inviteResultLede":"Send the two items below to someone on another deployment (valid once, within 24h):","team.inviteHub":"Hub address: ","team.inviteCode":"Invite code: ","team.genFail":"Generation failed.","team.delConfirm":'Delete team "{name}"? Deployments that joined it will be removed (their own deployments are unaffected).',"team.errName":"Enter a team name","team.creating":"Creating\u2026","team.created":"Created","team.createFail":"Create failed: {error}","team.errHubCode":"Enter the hub address and invite code.","team.joining":"Joining\u2026","team.joined":'Joined "{name}" \u2014 see it in My team.',"team.joinErrSelf":"This is your own deployment; you cannot join yourself (the invite code is for someone on another deployment).","team.joinErrAlready":"Your deployment already joined this team.","team.joinErrUnreachable":"Cannot reach the hub (check the address/network).","team.joinErrTimeout":"The hub timed out.","team.joinErrGeneric":"Join failed: {error}","team.identifying":"Identifying\u2026","team.bound2":"Bound: {name}","team.multiCandidate":"Multiple candidates found \u2014 click yourself:","team.binding":"Binding\u2026","team.bindFail":"Bind failed: {error}","team.noCandidates":"No identity found: make sure the bot has allowedUsers configured and contacts permission.","team.removeMemberConfirm":'Remove "{name}" from this team? Its bots disappear from this team roster (their own deployment is unaffected).',"team.creatingGroup":"Creating group\u2026","team.defaultGroupName":"Collaboration group","team.errPickBot":"Tick at least one bot first","sessions.closeBulkConfirm":"Close {count} selected sessions?","sessions.empty":"No sessions match the filters.","sessions.viewMode":"Session view","sessions.viewKanban":"Kanban","sessions.viewBoard":"Board","sessions.viewTable":"Table","sessions.selectSession":"Select session","sessions.board.needsYou":"Needs You","sessions.board.needsYouHint":"Repo, TUI, or usage limit waiting","sessions.board.starting":"Starting","sessions.board.startingHint":"CLI is spawning or resuming","sessions.board.working":"Working","sessions.board.workingHint":"Streaming, analyzing, or using tools","sessions.board.idle":"Idle","sessions.board.idleHint":"Ready for the next message","sessions.board.emptyColumn":"No sessions","sessions.board.signalRepo":"Repo needed","sessions.board.signalPrompt":"TUI choice needed","sessions.board.signalLimited":"Usage limited","sessions.board.signalAgent":"Needs human input","sessions.board.waiting":"Waiting","sessions.board.dragHint":"Drag header to reorder columns","sessions.board.moveLeft":"Move column left","sessions.board.moveRight":"Move column right","sessions.kanban.backlog":"Backlog","sessions.kanban.todo":"Todo","sessions.kanban.inProgress":"In Progress","sessions.kanban.inReview":"In Review","sessions.kanban.done":"Done","sessions.kanban.updated":"Updated {time}","sessions.kanban.moreHidden":"{count} more hidden","sessions.create.button":"Create session","sessions.create.title":"Create session","sessions.create.content":"Content","sessions.create.contentPlaceholder":"Describe the task; in Lead-dispatch mode you can assign different work to each agent here","sessions.create.bots":"Bots (added to the new group)","sessions.create.noBots":"No online bots to pick","sessions.create.mode":"Collaboration mode","sessions.create.modeAll":"Work together","sessions.create.modeLead":"Lead dispatch (recommended)","sessions.create.modeHelp":"Work together: every selected bot starts its own session with the same content. Lead dispatch: only the lead starts; it @-mentions the other bots in the chat to bring them in.","sessions.create.lead":"Lead bot","sessions.create.leadHelp":"The content goes to the lead, which decides when to bring up each sub-bot.","sessions.create.leadPickFirst":"Pick bots above first","sessions.create.column":"Initial column","sessions.create.columnInProgress":"In progress now","sessions.create.columnBacklog":"Backlog","sessions.create.columnHelp":"In progress: start immediately after the group is created. Backlog: create the group and add bots but do not start the CLI; drag to \u201CIn Progress\u201D or hit \u201CStart\u201D later to send the content.","sessions.create.advanced":"More options","sessions.create.groupName":"Group name","sessions.create.groupNamePlaceholder":"Defaults to the first line of the content","sessions.create.workingDir":"Working directory","sessions.create.workingDirHelp":"Optional. If set, binds the new group to this directory (all bots work there). Leave blank to pick a repo via the /repo card in the chat (worktree creation supported).","sessions.create.submit":"Create","sessions.create.submitting":"Creating\u2026","sessions.create.cancel":"Cancel","sessions.create.start":"Start","sessions.create.errContent":"Please enter the content","sessions.create.errNoBot":"Pick at least one bot","sessions.create.errLead":"Lead must be one of the selected bots","sessions.create.failed":"Create failed","sessions.create.startFailed":"Start failed","sessions.create.doneTitle":"Created","sessions.create.doneInProgress":"Group created and session(s) started","sessions.create.doneBacklog":"Group created; session(s) queued in Backlog","sessions.create.partialFail":"{n} bot(s) could not be started \u2014 you can @-mention them in the chat to retry","sessions.create.openChat":"Open Feishu chat","sessions.create.close":"Close","sessions.kanban.openTab":"Open in new tab","sessions.kanban.openFeishu":"Open in Feishu","sessions.kanban.terminalLoading":"Opening terminal\u2026","sessions.kanban.rename":"Rename (double-click title works too)","sessions.kanban.renameFail":"Rename failed","sessions.kanban.moveFail":"Move failed","sessions.kanban.groupBy":"Group by","sessions.kanban.groupFlow":"Workflow","sessions.kanban.groupTeam":"Team","sessions.kanban.groupBot":"Bots","sessions.kanban.teamLoading":"Loading teams\u2026","sessions.kanban.noTeam":"No teams","sessions.kanban.teamScope":"{chats} collab chats \xB7 {sessions} sessions","sessions.kanban.remoteHint":"Session from the {name} deployment (snapshot; terminal/history live on their machine)","sessions.kanban.clusterDragHint":"Drag header to move the whole group","sessions.history.title":"History","sessions.history.loading":"Fetching Feishu messages\u2026","sessions.history.fail":"Failed to load history","sessions.history.empty":"No messages","sessions.history.user":"User","sessions.history.owner":"Owner","sessions.history.staleHint":"The dashboard or daemon process may still run an old build \u2014 botmux restart and retry","groups.title":"Groups & Bots","groups.subtitle":"Inspect the chat x bot matrix and manage group creation, oncall, leave, and disband flows.","groups.search":"Search chat name / ID / owner","groups.missingOnly":"Missing bot only","groups.refresh":"Refresh","groups.create":"New Group","groups.chat":"Chat","groups.actions":"Actions","groups.addBots":"Add Bots","groups.saveAsProfile":"Save as Profile","groups.manage":"Manage","groups.empty":"No chats match the filters.","groups.profileStatusFull":"Fully matches {name} ({matched}/{total})","groups.profileStatusFullChat":"Group roles fully match {name} ({matched}/{total})","groups.profileStatusPartial":"Partially matches {name} ({matched}/{total})","groups.profileStatusUnmatched":"No profile match","groups.saveProfileTitle":"Save as Profile","groups.saveProfileIntro":'Save {count} in-chat bot configs from "{name}" as a profile snapshot.',"groups.saveProfileScope":"Save scope","groups.saveProfileScopeHelp":"In-chat bot config snapshot","groups.saveProfileBotCount":"Bots in chat","groups.saveProfileLoadFailed":"Load failed","groups.saveProfileStatus.entry":"Create entry","groups.saveProfileStatus.error":"Load failed","groups.saveProfileMode":"Save mode","groups.saveProfileNew":"New Profile","groups.saveProfileNewHelp":"Create a new snapshot by default; if the id exists, matching bot entries are overwritten.","groups.saveProfileOverwrite":"Overwrite Existing Profile","groups.saveProfileOverwriteHelp":"Pick an existing profile and overwrite entries for the same bots.","groups.saveProfileExistingMeta":"{count} entries","groups.saveProfileIdLabel":"Profile id","groups.saveProfileExistingLabel":"Existing Profile","groups.saveProfileExistingEmpty":"No existing profiles","groups.saveProfileTarget":"Target Profile","groups.saveProfileTargetNew":"Will create or update this profile with the in-chat bot snapshot","groups.saveProfileTargetOverwrite":"Will overwrite entries for these bots in the existing profile","groups.saveProfileEntrySummary":"Will create profile entries for {count} in-chat bots.","groups.saveProfileEntrySummaryWithEmpty":"Will create profile entries for {count} in-chat bots; {emptyCount} currently have no returned role content and will be saved as empty entries.","groups.saveProfileFailedLoadSummary":"{count} bot configs failed to load. Saving is paused to avoid an incomplete snapshot.","groups.saveProfileSubmit":"Save Profile","groups.saveProfileOverwriteSubmit":"Overwrite Save","groups.saveProfileInvalid":"Profile id may contain letters, numbers, dots, underscores, and hyphens only; max 64; cannot be . or ..","groups.saveProfileNoRoles":"This chat has no bot configs to save.","groups.saveProfileSaving":"Saving\u2026","groups.saveProfileDone":"Saved {count} entries into {name}","groups.saveProfileFailed":"Saved only {saved}/{total} entries. Check offline bots or permissions.","groups.createTitle":"Create New Group","groups.createHelp":"Pick bots to invite. The dashboard chooses an online daemon as creator.","groups.name":"Group Name","groups.namePlaceholder":"e.g. AI ChangeLog","groups.bindDir":"Bind Directory","groups.bindDirHelp":"New topics start the CLI here and skip repo selection.","groups.roleProfile":"Profile","groups.roleProfileNone":"None","groups.roleProfileHelp":"After creation, send a profile apply bootstrap command in the new group.","groups.roleProfileBootstrapSent":"Profile: {name}; bootstrap message sent: {messageId}","groups.roleProfileBootstrapDone":"Profile: {name}; bootstrap completed with no peer bootstrap message needed.","groups.roleProfileBootstrapFailed":"Profile: {name}; bootstrap failed: {reason}","groups.botPicker":"Bots","groups.createSubmit":"Create","groups.cancel":"Cancel","groups.successTitle":"Group Created","groups.openGroup":"Open Group","groups.manageTitle":"Manage {name}","groups.owner":"Owner","groups.oncall":"Oncall Mode","groups.oncallHelp":"When enabled, group members can @ the bot; the selected bot's new topics in this group use its bound directory (binding is per-bot \u2014 only the checked bots are affected).","groups.leaveTitle":"Select Bots to Leave","groups.leaveSelected":"Selected Bots Leave","groups.disband":"Disband Group","groups.dangerHint":"Disband only works when an in-chat bot is the owner. Otherwise prefer leaving the chat.","groups.save":"Save","groups.needWorkingDir":"Working directory is required","groups.noBotsOnline":"No bots online. Restart the daemon first.","schedules.title":"Schedules","schedules.subtitle":"View, pause, resume, and run scheduled tasks across daemons.","schedules.search":"Search name / prompt / working dir","schedules.anyKind":"Any kind","schedules.enabledOnly":"Enabled only","schedules.name":"Name","schedules.bot":"Bot","schedules.schedule":"Schedule","schedules.next":"Next","schedules.last":"Last","schedules.repeat":"Repeat","schedules.enabled":"Enabled","schedules.actions":"Actions","schedules.runNow":"Run Now","schedules.pause":"Pause","schedules.resume":"Resume","schedules.delivery":"Delivery","schedules.deliveryOrigin":"Original thread","schedules.deliveryNewTopic":"New topic each run","schedules.deliveryLocal":"Log only","schedules.useNewTopic":"Switch to new-topic","schedules.useOrigin":"Switch to original","schedules.empty":"No schedules.","settings.title":"Global Settings","settings.subtitle":"Manage machine-wide botmux dashboard behavior shared by every bot.","settings.loading":"Loading settings\u2026","settings.loadFailed":"Failed to load settings","settings.readOnlyVisitor":"Read-only access \u2014 changing settings requires an authorized link (run botmux dashboard).","settings.sectionAccess":"Access","settings.publicReadOnly":"Allow tokenless read-only dashboard access","settings.publicReadOnlyHelp":"When enabled, visitors without a token can view the dashboard, sessions, schedules, and SSE. Writes such as close, pause, and approvals still require token auth. Sensitive raw terminal logs always require a token.","settings.remoteAccess":"Remote terminal access","settings.remoteAccessHelp":'When enabled, session web terminals, Feishu card "Open terminal" / "Get writable link" buttons, and webhooks all use central-platform links; when off, local links are used. Off by default.',"settings.sectionCards":"Feishu Cards","settings.openTerminalInFeishu":"Open streaming-card terminals in the Feishu sidebar","settings.openTerminalInFeishuHelp":"Off by default: terminal buttons open the Web Terminal URL directly. When enabled, botmux wraps the URL with Feishu web_url/open so Feishu PC opens it in a sidebar. Terminal write access is still controlled by its token.","settings.sectionRepoPicker":"Repo Picker","settings.repoPickerMode":"Repo picker card mode","settings.repoPickerModeAll":"Repos + worktrees","settings.repoPickerModeRepos":"Main repos only","settings.repoPickerModeHelp":"Default shows repositories and linked worktrees. Main repos only hides linked worktrees from initialization and bare /repo cards; explicit /repo /abs/path/to/worktree still works.","settings.saving":"Saving\u2026","settings.saved":"Saved","settings.saveFailed":"Save failed","settings.sectionMaintenance":"Auto Maintenance","settings.autoUpdate":"Auto update","settings.autoUpdateHelp":"Off by default. At the set time, runs npm install -g botmux@latest to install the latest version (download/install only \u2014 no restart). npm-global installs only.","settings.autoRestart":"Auto restart","settings.autoRestartHelp":"Off by default; requires auto-update. After auto-update installs a newer version, restart to apply it if no session is in progress (busy \u21D2 slips to the next day).","settings.autoUpdateLocalDev":"This is a local-dev install (running from source); auto-update is unavailable.","settings.maintenanceTime":"Time","update.section":"Version & Update","update.loginRequired":"Sign in to check the version, update, or restart.","update.loading":"Checking\u2026","update.checkFailed":"Check failed","update.current":"Current version","update.upToDate":"Up to date","update.newAvailable":"New version {version} available","update.checkUnavailable":"Couldn't fetch the latest version (offline or network-restricted)","update.nodeWarn":"Node {version} is too old; update requires \u2265 {required}. Please upgrade Node first.","update.localDev":'This is a local-dev install (running from source); "Update to latest" is unavailable \u2014 use git pull + build, then restart.',"update.multiInstallWarn":"Multiple botmux installs detected. npm only updates the npm-global one, which may not be the active version:","update.kindNpm":"npm-global","update.kindSource":"source checkout","update.kindUnknown":"unknown","update.btnCheck":"Check for updates","update.btnChangelog":"View what's new","update.btnChangelogHide":"Hide changelog","update.btnUpdate":"Update to latest","update.btnRestart":"Restart botmux","update.changelogLoading":"Loading changelog\u2026","update.changelogEmpty":"No release notes newer than the current version.","update.changelogFailed":"Couldn't load the changelog (offline or network-restricted).","update.changelogRateLimited":"GitHub API rate limit hit (60 req/h per IP unauthenticated, easily tripped on shared networks). Try again later.","update.changelogViewOnGitHub":"View on GitHub Releases","update.navBadgeTitle":"New version {version} available","update.confirmMultiInstall":`Multiple botmux installs detected:
|
|
16
|
+
}`,"catalog.chatId":"\u7FA4\u804A ID","catalog.larkAppId":"\u98DE\u4E66\u5E94\u7528 ID","catalog.chatBindingHint":"\u5FC5\u586B\uFF0C\u7528\u4E8E\u786E\u5B9A humanGate \u5361\u7247\u53D1\u9001\u5230\u54EA\u4E2A\u98DE\u4E66\u7FA4\uFF0C\u4EE5\u53CA\u53D6\u6D88\u8DEF\u7531\u5F52\u5C5E\u3002","catalog.run":"\u8FD0\u884C","catalog.running":"\u542F\u52A8\u4E2D...","catalog.badParamsJson":"\u53C2\u6570\u5FC5\u987B\u662F JSON object\u3002","catalog.writeAccess":"\u9700\u8981\u5199\u6743\u9650\uFF1A\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C `botmux dashboard` \u83B7\u53D6\u4E00\u6B21\u6027 URL\uFF0C\u6253\u5F00\u540E\u5199\u5165 cookie\uFF0C\u518D\u56DE\u6765\u8FD0\u884C\u3002","catalog.runHttp":"run HTTP {status}","catalog.runStarted":"\u8FD0\u884C\u5DF2\u542F\u52A8\uFF1B\u6B63\u5728\u6253\u5F00\u8BE6\u60C5\u9875...","catalog.invalidParams":"\u53C2\u6570\u65E0\u6548","catalog.issue":"{path}: {message}","catalog.noParams":"\u6CA1\u6709\u58F0\u660E\u53C2\u6570\u3002","catalog.required":"\u5FC5\u586B","catalog.optional":"\u53EF\u9009","catalog.default":"\u9ED8\u8BA4\u503C","catalog.description":"\u8BF4\u660E","catalog.path":"\u8DEF\u5F84","catalog.revision":"\u4FEE\u8BA2","catalog.nodeCount":"\u8282\u70B9\u6570"},Ed={"app.name":"botmux","app.subtitle":"Feishu AI CLI Control","time.secondsAgo":"{value}s ago","time.minutesAgo":"{value}m ago","time.hoursAgo":"{value}h ago","nav.overview":"Overview","nav.sessions":"Sessions","nav.sidebarCollapse":"Collapse sidebar","nav.sidebarExpand":"Expand sidebar","nav.groups":"Groups","nav.schedules":"Schedules","nav.settings":"Settings","nav.botDefaults":"Bot Defaults","nav.skills":"Skills","status.live":"Live","status.disconnected":"Disconnected","status.system":"System","status.light":"Light","status.dark":"Dark","status.language":"Language","status.theme":"Theme","theme.base":"Basic","theme.skins":"Skins","skin.cyber":"2077","skin.genshin":"Genshin","skin.fallout":"Fallout","skin.prts":"PRTS","skin.bluearchive":"Blue Archive","skin.zzz":"ZZZ","skin.dragonball":"Dragon Ball","skin.ikun":"ikun","botOnboarding.add":"Add Bot","botOnboarding.title":"Add Bot","botOnboarding.intro":"Pick a CLI and working directory, scan to create a PersonalAgent app \u2014 the dashboard writes it to local bots.json and auto-configures Open Platform permissions.","botOnboarding.cliLabel":"CLI adapter","botOnboarding.dirLabel":"Working directory","botOnboarding.dirPlaceholder":"Default ~ (home); must exist on the daemon host","botOnboarding.modelLabel":"Model (optional)","botOnboarding.modelPlaceholder":"Leave empty for the CLI default model","botOnboarding.modelTtadkPlaceholder":"ttadk gateway model, default {model}, editable anytime","botOnboarding.modelTtadkCocoPlaceholder":"CoCo needs no model","botOnboarding.startScan":"Start scan","botOnboarding.cancel":"Cancel","botOnboarding.starting":"Generating QR code...","botOnboarding.waiting":"Scan with the Feishu app to create the app.","botOnboarding.verifying":"Scan accepted. Verifying credentials...","botOnboarding.configuringPermissions":"Auto-configuring Open Platform permissions\u2026","botOnboarding.platformScanHint":"Scan once more with the Feishu app to sign in to the Open Platform (to auto-import permissions, set the callback, and submit a version).","botOnboarding.platformQrAlt":"Open Platform login QR code","botOnboarding.completed":"Bot added.","botOnboarding.permissionOk":"Auto-imported {count} permissions.","botOnboarding.permissionSkipped":"({count} skipped \u2014 not in the tenant catalog)","botOnboarding.permissionVersion":"Submitted version {version}.","botOnboarding.permissionManual":"Permissions could not be auto-configured. Complete these steps manually:","botOnboarding.metaDir":"Dir","botOnboarding.failed":"Add failed","botOnboarding.openLink":"Open scan link in browser","botOnboarding.close":"Close","botOnboarding.restartHint":"bots.json has been updated. Run pnpm daemon:restart for the new bot to take effect.","botOnboarding.needsOwner":"Could not auto-confirm the scanner identity. Enter an owner manually to finish.","botOnboarding.ownerLabel":"Owner (bot administrator)","botOnboarding.ownerPlaceholder":"Full email / union_id (on_) / open_id (ou_), comma-separated","botOnboarding.ownerHint":"An owner is required so the bot is not left open for anyone to run admin actions. Prefer a company email or union_id (on_).","botOnboarding.ownerSubmit":"Save owner & finish","botOnboarding.ownerEmpty":"Enter at least one owner.","botOnboarding.ownerInvalid":"Owner validation failed. Please check and retry.","botOnboarding.qrAlt":"Feishu bot onboarding QR code","overview.title":"Workbench","overview.subtitle":"Live status of your AI teammates \xB7 synced with Feishu topics","overview.team":"AI Team","overview.teamHint":"Live status of every digital teammate","overview.attention":"Needs You","overview.attentionHint":"Blocked tasks \u2014 one reply gets them moving again","overview.activeSessions":"Active Sessions","overview.activeSessionsHint":"Sessions currently running","overview.today":"Right Now","overview.todayHint":"Active session distribution","overview.viewAll":"View all \u2192","overview.botIdle":"Standing by, ready for new tasks","overview.botOffline":"Offline \u2014 daemon not running","overview.botBusy":"Working \xB7 {count} sessions","overview.botNeedsYou":"Waiting on you","overview.botReady":"Ready","overview.botOff":"Offline","overview.sessionsCount":"{count} sessions","overview.lastActive":"active {time} ago","overview.noAttention":"Nothing waiting on you","overview.teamExpand":"Show all {count} \u25BE","overview.teamCollapse":"Collapse \u25B4","strip.pending":"{count} pending","strip.longest":"waiting {time} \u2014 {bot} {reason}","strip.handle":"Handle now","overview.openSessions":"Active Sessions","overview.workingSessions":"Working","overview.onlineBots":"Online Bots","overview.schedules":"Schedules","overview.groups":"Groups Seen","overview.enabledSchedules":"Enabled","overview.total":"total","overview.active":"active","overview.daemonRegistry":"daemon registry","overview.chatMatrix":"chat matrix","overview.recentSessions":"Recent Sessions","overview.nextSchedules":"Next Runs","overview.noSessions":"No sessions yet.","overview.noSchedules":"No schedules yet.","sessions.title":"Session Control","sessions.subtitle":"Locate Feishu topics, open Web Terminal, close or resume CLI sessions.","sessions.search":"Search working dir / title / IDs","sessions.anyStatus":"Any status","sessions.adoptAny":"adopt: any","sessions.adoptYes":"adopt: yes","sessions.adoptNo":"adopt: no","sessions.activeOnly":"Active only","sessions.closeSelected":"Close selected","sessions.clearSelection":"Clear","sessions.selectedCount":"{count} sessions selected","sessions.idleCleanupOlderThan":"Idle over","sessions.idleCleanupThreshold":"Idle cleanup threshold","sessions.idleCleanupRun":"Clean idle","sessions.idleCleanupCount":"{count} cleanable","sessions.idleCleanupConfirm":"Close {count} sessions idle for more than {threshold}?","sessions.idleCleanupRunning":"Cleaning\u2026","sessions.idleCleanupDone":"Closed {closed}, failed {failed}","sessions.idleCleanupFailed":"Cleanup failed","sessions.lock":"Lock session","sessions.unlock":"Unlock session","sessions.locked":"Locked","sessions.lockSelected":"Lock selected","sessions.unlockSelected":"Unlock selected","sessions.lockFailed":"Failed to update lock state","sessions.bot":"Bot","sessions.cli":"CLI","sessions.chat":"Chat","sessions.openChat":"Open chat","sessions.status":"Status","sessions.tokenIn":"Token In","sessions.tokenOut":"Token Out","sessions.titleCol":"Title","sessions.workingDir":"Working Dir","sessions.created":"Created","sessions.last":"Last","sessions.adopt":"Adopt","sessions.actions":"Actions","sessions.details":"Details","sessions.copy":"Copy","sessions.copied":"Copied","sessions.locate":"Locate Topic","sessions.locating":"Sending...","sessions.cooldown":"Cooldown {seconds}s","sessions.openTerminal":"Terminal","sessions.writeLink":"Write Link","sessions.writeLinkHint":"Get a writable terminal link (carries a write-access token; opens in a new tab)","sessions.writeLinkFail":"Failed to get write link","sessions.close":"Close Session","sessions.restart":"Restart CLI","sessions.restartConfirmIntro":"You are about to restart this CLI.","sessions.restartConfirmStatus":"Current status","sessions.restartConfirmCli":"CLI","sessions.restartConfirmQuestion":"Restart this CLI?","sessions.restartFailed":"Restart failed","sessions.resume":"Resume Session","sessions.dismiss":"Close","sessions.closeConfirm":"Close this session?","sessions.resumeFailed":"Resume failed","sessions.land":"Land","sessions.landLoading":"Loading sandbox diff\u2026","sessions.landUnavailable":"Cannot land","sessions.landEmpty":"No changes in the sandbox clone.","sessions.landApply":"Apply to disk","sessions.landDiscard":"Discard","sessions.landApplied":"Landed","sessions.landFailed":"Land failed","sessions.landDiscarded":"Discarded (sandbox clone not applied).","sessions.insight":"Insight","sessions.insightLoading":"Analyzing\u2026","sessions.insightUnavailable":"Insight unavailable","sessions.insightEmpty":"No analyzable tool spans in this session yet.","sessions.insightMetrics":"spans {total} \xB7 failed {failed} \xB7 slow {slow} \xB7 read/write {rw} \xB7 compactions {compactions}","sessions.insightSuggestions":"Suggestions","sessions.insightSpans":"Action spans","sessions.insightCapped":"showing first {shown}/{total}","sessions.insightAsOf":"as of {asOf}","sessions.insightPartial":"(may exclude the in-flight latest turn)","nav.insights":"Insight","insights.title":"Workflow Insight","insights.subtitle":"Read-only analysis of local Claude Code / Codex sessions \u2014 action trace, failures, friction, with rule-based optimization tips.","insights.refresh":"Refresh","insights.search":"Search session / bot / dir\u2026","insights.filter":"Filter","insights.filterAll":"All","insights.filterReview":"Worth review","insights.filterFailed":"Has failures","insights.filterSlow":"Has slow spans","insights.loading":"Analyzing\u2026","insights.loaded":"Loaded {count} sessions","insights.unavailable":"Load failed","insights.listCount":"showing {shown}/{total}","insights.tabOverview":"Overview","insights.tabSessions":"Sessions","insights.tabDist":"Distribution","insights.tabHot":"Hotspots","insights.projectAll":"All projects","insights.timeAll":"All time","insights.time1d":"Last 1d","insights.time7d":"Last 7d","insights.time30d":"Last 30d","insights.clear":"Clear","insights.emptyAnalyzableHint":"Check \u201CIncl. unanalyzed\u201D to see the remaining sessions.","insights.showAll":"Incl. unanalyzed","insights.distHint":"Metric distribution across the currently filtered sessions \u2014 see the shape and where typical values land.","insights.distSpans":"Spans per session","insights.distFailed":"Failures per session","insights.distSlow":"Slow spans per session","insights.distAgentTime":"Agent working time","insights.distRw":"Read/write ratio","insights.distChurn":"Code churn (lines)","insights.distTrend":"Trend by day (last 4 weeks)","insights.distTrendSub":"sessions / day","insights.distMedian":"median {v}","insights.distEmpty":"No analyzable sessions under the current filter.","insights.disclosure":`Measurement note: durations count tool-execution time only and exclude time spent waiting for a user reply (question / plan approval), so they do not reflect wall-clock; Codex reads files mostly via shell (exec_command), not counted as "read", so its read/write ratio runs low or 0; code churn is parsed from patches and covers only each session's most active files. Cross-tool distributions and ratios are indicative only, not directly comparable.`,"insights.rwNote":"Codex reads mostly via shell, not counted as reads","insights.viewSessions":"View sessions","insights.hotHint":"Cross-session recurrence \u2014 where it pays to converge.","insights.hotToolFailures":"Tool failure hotspots","insights.hotSlowSessions":"Slowest sessions","insights.hotProjects":"Projects","insights.hotFiles":"File recurrence","insights.hotCommands":"Command recurrence","insights.hotErrors":"Error recurrence","insights.hotComingSoon":"File / command recurrence hotspots coming soon (needs cross-session engine aggregation).","insights.hotSessionsCol":"sessions","insights.hotFailsCol":"fails","insights.hotSlowCol":"slow","insights.backToList":"Back to list","insights.sortLabel":"Sort","insights.sortRecent":"Recent","insights.sortReview":"Review","insights.sortSpans":"Spans","insights.sortFails":"Failures","insights.sortSlow":"Slow","insights.sortAgent":"Duration","insights.layoutCard":"Cards","insights.layoutTable":"Table","insights.colTitle":"Session","insights.colProject":"Project","insights.colTime":"Time","insights.paletteOpen":"Jump \u2318K","insights.palettePlaceholder":"Jump to a tab or search sessions\u2026","insights.paletteTabs":"Views","insights.paletteSessions":"Sessions","insights.paletteEmpty":"No matches","insights.tabFlow":"Flow","insights.flowHint":"Where the agent spends its actions and time across activity phases, and each session\u2019s rhythm.","insights.flowPipeline":"Activity-phase pipeline","insights.flowPipeSub":"research \u2192 edit \u2192 run \u2192 delegate \u2192 discuss; top = actions, bottom = time","insights.flowShares":"Action share vs time share","insights.flowActShare":"Action share","insights.flowTimeShare":"Time share","insights.flowRhythm":"Per-session rhythm (by duration)","insights.subagents":"Sub-agents","insights.subagentsHint":"Sub-agents this session delegated to (Task/Agent) \u2014 what each did and how long it ran.","insights.readsShort":"read","insights.editsShort":"edit","insights.durShort":"dur","insights.empty":"No matching sessions.","insights.selectSession":"Pick a session on the left to see action spans and suggestions.","insights.detailLoading":"Loading session detail\u2026","insights.recommendations":"Suggestions","insights.recommendationsHint":"Rule-based cross-session rollup, each traceable to a metric.","insights.noRecommendations":"No suggestions.","insights.seenInSessions":"seen in {count} sessions","insights.toolFailures":"Top tool failures","insights.toolFailuresHint":"Failed spans grouped by tool.","insights.noFailures":"No failed spans.","insights.metricSessions":"Sessions","insights.metricAnalyzed":"{count} analyzed","insights.metricSpans":"Spans","insights.metricSafe":"redacted","insights.metricFailed":"Failed spans","insights.metricSlow":"Slow spans","insights.metricRw":"Read/write","insights.metricCompactions":"compactions {count}","insights.spansShort":"span ","insights.failedShort":"fail ","insights.slowShort":"slow ","insights.rwShort":"r/w ","insights.unsupported":"CLI not supported","insights.noTranscript":"No transcript","insights.parseError":"Parse failed","insights.noSpans":"No analyzable spans.","insights.sevBad":"Critical","insights.sevWarn":"Warn","insights.sevInfo":"Info","insights.phase.research":"Research","insights.phase.edit":"Edit","insights.phase.run":"Run","insights.phase.delegate":"Delegate","insights.phase.discuss":"Discuss","insights.trace":"Action spans","insights.ledger":"Per-turn ledger","insights.detailTabs":"Detail views","insights.spanStatus":"Status","insights.spanTool":"Tool","insights.spanPhase":"Phase","insights.spanDuration":"Duration","insights.spanTurn":"Turn","insights.spanSummary":"Summary","insights.ledgerMore":"Show {count} more summaries","insights.ledgerOmitted":"{count} more hidden","insights.ledgerNoContent":"No redacted summary for this turn.","insights.diagShow":"Show evidence","insights.diagActive":"Viewing","insights.evMatched":"{count} matching spans","insights.evMatchedCapped":"{matched} matched \xB7 showing {shown}","insights.evDefault":"{shown} of {total} spans (focused)","insights.evShowAll":"Show all {count}","insights.evBackToEvidence":"Focused view","insights.intent.run_script":"Run script","insights.intent.test":"Test","insights.intent.typecheck":"Typecheck","insights.intent.lint":"Lint","insights.intent.git":"Git","insights.intent.search":"Search","insights.intent.read_file":"Read","insights.intent.edit_file":"Edit","insights.intent.write_file":"Write","insights.intent.delegate":"Delegate","insights.intent.unknown":"Action","insights.result.ok":"OK","insights.result.tool_error":"Tool error","insights.result.test_failed":"Test failed","insights.result.typecheck_failed":"Typecheck failed","insights.result.lint_failed":"Lint failed","insights.result.command_failed":"Command failed","insights.result.timeout":"Timeout","insights.result.no_output":"No output","insights.result.unknown":"Unknown","insights.tag.failure":"Failures","insights.tag.slow":"Slow","insights.tag.retry":"Retries","insights.tag.read_write_imbalance":"Read/write imbalance","insights.tag.diagnostic":"Diagnostic","insights.tag.normal":"Normal","insights.turnHeadline.turn_has_failures":"{failures} failures this turn","insights.turnHeadline.turn_has_slow_spans":"Slow operations this turn","insights.turnHeadline.turn_has_retries":"Retried the same action repeatedly","insights.turnHeadline.turn_read_write_imbalance":"Edit-heavy turn (edits {edits} / reads {reads})","insights.evTimeline":"Full timeline ({count} spans)","insights.evNoFlags":"No spans flagged as failure / slow / retry","insights.turnAllNormal":"All {count} turns look normal \u2014 nothing to review","insights.turnEvidence":"View {count} evidence spans","insights.turnHiddenNormal":"{count} normal turns hidden","insights.mReads":"Read","insights.mEdits":"Edit","insights.mRuns":"Run","insights.mFailures":"Fail","insights.mDur":"Time","insights.turnHeadline.turn_normal":"Normal","insights.rec.fix_repeated_tool_failures":"Repeated command failures need to converge","insights.rec.split_slow_operation":"Slow operations dragged the whole session","insights.rec.add_read_pass_before_edit":"Too little reading before editing","insights.rec.preserve_context_checkpoints":"Context was compacted \u2014 keep checkpoints","insights.impact.impact_failed_spans":"{failedSpans} actions failed (top: {topTool} \xD7{topToolFailures})","insights.impact.impact_slow_spans":"{slowSpansTotal} slow operations slowed progress","insights.impact.impact_low_read_write_ratio":"Edited {writeSpans}, read only {readSpans}","insights.impact.impact_context_compaction":"{compactions} context compactions this session","insights.why.why_tool_failure_concentrated":"Failures concentrate on {topTool} ({topToolFailures}\xD7) \u2014 likely one root cause","insights.why.why_slow_span_dominates":"A few long operations dominate; slowest is {slowestTool}","insights.why.why_edits_outpaced_reads":"Read/write ratio {readWriteRatio}; editing more than reading invites rework","insights.why.why_context_compaction_happened":"Long session was compacted; early decisions/context may be lost","insights.action.inspect_failed_span_details":"Open each failed action\u2019s detail to find the root cause","insights.action.add_preflight_or_timeout":"Add preflight checks or timeouts to frequently failing commands","insights.action.narrow_or_split_slow_operation":"Narrow or split slow operations (e.g. run targeted tests)","insights.action.surface_timeout_or_progress":"Surface timeouts/progress earlier instead of silently hanging","insights.action.read_or_search_before_editing":"Read or search an unfamiliar file before editing it","insights.action.verify_assumptions_before_running":"Verify assumptions before acting to avoid blind edits","insights.action.write_checkpoints_for_long_tasks":"Write decisions and checkpoints to notes for long tasks","insights.struct.shell":"shell command","insights.struct.fileEdit":"file edit","insights.struct.readSearch":"read/search","insights.struct.agentTask":"agent task","insights.struct.toolInput":"tool input","insights.struct.toolResult":"tool result","insights.struct.toolError":"tool error","insights.struct.patchFailed":"patch failed","insights.struct.patchApplied":"patch applied","insights.struct.exit":"exit {code}","insights.spanAll":"All","insights.dDetail":"Detail","insights.dCollapse":"Hide","insights.dPhase":"Phase","insights.dStart":"Start","insights.dDur":"Duration","insights.dIntent":"Intent","insights.dResult":"Result","insights.dIn":"Input","insights.dOut":"Output","insights.dTags":"Tags","insights.dTurnContext":"Turn {turn} context","insights.advice.failure":"\u{1F4A1} Read the error before retrying \u2014 don\u2019t retry blindly","insights.advice.retry":"\u{1F4A1} Same step retried repeatedly \u2014 find the root cause first","insights.advice.read_write_imbalance":"\u{1F4A1} Read the relevant files before editing to avoid rework","insights.advice.slow":"\u{1F4A1} Slow op: run targeted tests or split it up","insights.turnPrompt":"User","insights.turnExpand":"Expand {count} steps","insights.turnCollapse":"Collapse","insights.turnRail":"Session trace","insights.gantt":"Work timeline","insights.ganttCaption":"{span} actions \xB7 {dur} elapsed \xB7 {active} active","insights.ctxCurve":"Context curve","insights.ctxCaption":"Per-turn in+cache peak \xB7 max {peak} \xB7 {turns} turns","insights.ctxTurn":"Turn {n}","insights.railSubagent":"Subagent","insights.railSubagents":"{n} subagents","insights.turnPromptExpand":"Expand","insights.turnPromptCollapse":"Collapse","insights.turnPromptRaw":"Raw","insights.turnPromptRendered":"Rendered","insights.srcMentions":"mentions","insights.senderHuman":"User","insights.senderA2A":"A2A","insights.senderOther":"Other","insights.senderSystem":"System","insights.turnPromptFull":"Full text","insights.modalClose":"Close","insights.promptTruncated":"Long content, truncated","insights.replay":"Replay","insights.replayAgent":"agent ops","insights.replaySearch":"Search conversation\u2026","insights.replayBy":"From","insights.replayState":"State","insights.replayLoadMore":"Load more ({shown}/{total})","insights.replayAllLoaded":"All loaded ({total})","insights.replayEmpty":"No matching messages","insights.replayNoText":"(no text \u2014 see ops)","insights.replayOps":"{count} ops","insights.wsFiles":"File changes \xB7 {n}","insights.wsCmds":"Commands \xB7 {n}","insights.wsReads":"read {n}","insights.wsEdits":"edit {n}","insights.wsFail":"{n} failed","insights.wsNoFiles":"No file changes","insights.wsNoCmds":"No commands","insights.turnSummary":"{total} turns \xB7 {flagged} need attention","insights.dCommand":"Command","insights.dCmdOutput":"Output","insights.ledgerNormal":"By order","insights.ledgerGrouped":"By recommendation","insights.ledgerOther":"Other turns","insights.ledgerGroupCount":"{count} turns","insights.turnsCapped":"Only first {shown}/{total} actions \u2014 timeline may be incomplete","insights.suggestion.high_tool_failure.title":"Tool failures are concentrated","insights.suggestion.high_tool_failure.action":"Check failed spans first, then add preflight checks or timeout control for repeated failing commands.","insights.suggestion.tool_failure_present.title":"Some tool calls failed","insights.suggestion.tool_failure_present.action":"Review failed spans before repeating the workflow.","insights.suggestion.slow_span.title":"A slow span dominates the session","insights.suggestion.slow_span.action":"Split or bound the slow operation, and surface timeout or progress feedback earlier.","insights.suggestion.low_read_write_ratio.title":"Edits outpaced reads","insights.suggestion.low_read_write_ratio.action":"Add a read/search pass before edits when changing unfamiliar files.","insights.suggestion.context_compaction.title":"Context compaction happened","insights.suggestion.context_compaction.action":"For long tasks, preserve decisions and checkpoints in durable notes or smaller subtasks.","insights.suggestion.no_major_friction.title":"No major trace friction detected","insights.suggestion.no_major_friction.action":"Use the span timeline for spot checks or compare against slower sessions.","insights.evidence.failedSpans":"{count} failed spans","insights.evidence.toolFailedTimes":"{tool} failed {count} times","insights.evidence.multipleToolsFailed":"multiple tools failed","insights.evidence.toolRanSeconds":"{tool} ran for {seconds}s","insights.evidence.readWriteRatio":"read/write ratio {ratio}","insights.evidence.compactions":"compactions {count}","insights.evidence.spansAnalyzed":"{count} spans analyzed","connectors.lede":"Let external systems (alerts, CI, tickets\u2026) trigger a bot to speak in a group or run a workflow via one webhook.","connectors.createTitle":"New Webhook","connectors.fName":"Name","connectors.fNamePh":"e.g. Prod alerts","connectors.fBot":"Trigger bot","connectors.fKind":"Trigger type","connectors.kindTurn":"Single turn (bot responds once)","connectors.kindWorkflow":"Workflow","connectors.fWf":"Workflow ID","connectors.fMode":"Deliver to which group","connectors.modeDynamic":"Specified per request (chat passed in)","connectors.modeFixed":"Fixed group","connectors.modeNewGroup":"New group each time","connectors.fFixedChat":"Target group","connectors.fChatManualPh":"Enter chat ID manually: oc_\u2026","connectors.chatManualLink":"Group not listed? Enter ID manually \u2192","connectors.chatListLink":"\u2190 Pick from group list","connectors.fAllow":"Allowed groups","connectors.optional":" (optional)","connectors.allowHint":"Hold Ctrl/\u2318 to multi-select; empty = unrestricted. Only validates the chat passed in the request.","connectors.dynamicHint":'<b>Dynamic mode</b>: the chat ID is passed per request, one of three ways \u2014 query <code>?chatId=<chatId></code> \xB7 header <code>x-botmux-chat-id: <chatId></code> \xB7 body <code>{"chatId":"<chatId>"}</code>.<br>For "one URL triggers directly, no params", choose Fixed group instead.',"connectors.fDedup":"Dedup field","connectors.fDedupPh":"e.g. alert.id (read from event body)","connectors.dedupHint":"Set: events with the same value go to the <b>same group</b>. Empty: each event <b>creates a new group</b>.","connectors.fInstruction":"Instruction","connectors.fInstructionPh":"What the bot should do on the event. e.g. Summarize the severity, @ the oncall, suggest next steps. Empty = hand the raw event to the model.","connectors.fVerify":"Verification","connectors.verifyToken":"Token (simple: secret in the URL, one curl triggers it)","connectors.verifyHmac":"HMAC signature (advanced: more secure, sign the request yourself)","connectors.fSecret":"Secret / token","connectors.fSecretPh":"Leave empty to auto-generate (shown once)","connectors.btnCreate":"Create","connectors.listTitle":"Existing Webhooks","connectors.loading":"Loading\u2026","connectors.noBotGroups":"(This bot has no visible groups; enter an ID manually on the right)","connectors.modeLabelFixed":"Fixed group","connectors.modeLabelNewGroup":"New group each time","connectors.modeLabelDynamic":"Per-request group","connectors.kindLabelWorkflow":"Workflow","connectors.kindLabelTurn":"Single turn","connectors.count":"\xB7 {count}","connectors.empty":"No webhooks yet. Create one with the form above.","connectors.enabled":"Enabled","connectors.disabled":"Disabled","connectors.badgeToken":"Token","connectors.badgeSign":"Signed","connectors.dest":'to "{name}"',"connectors.btnDisable":"Disable","connectors.btnEnable":"Enable","connectors.btnEdit":"Edit","connectors.btnSave":"Save","connectors.btnCancel":"Cancel","connectors.btnDel":"Delete","connectors.webhookUrl":"Webhook URL: ","connectors.copy":"Copy","connectors.copied":"Copied","connectors.tokenHint":"Token mode: append <code>/<token></code> to the URL when calling (the token is shown only on create/rotate).","connectors.dynamicReqHint":'Dynamic mode: the request must carry the target chat \u2014 <code>?chatId=<chatId></code> or header <code>x-botmux-chat-id</code> or body <code>{"chatId":"\u2026"}</code>.',"connectors.instructionPrefix":"Instruction: ","connectors.delConfirm":"Delete this webhook? Its URL stops working immediately.","connectors.errName":"Enter a name","connectors.errBot":"Pick a bot","connectors.errWf":"Enter a workflow ID","connectors.errChat":"Pick (or enter) a target group","connectors.creating":"Creating\u2026","connectors.saving":"Saving\u2026","connectors.usageDynamicLede":"Dynamic mode: the URL already has the token; pass the target chat ID when calling{gn}:","connectors.usageDynamicNote":'The chat can also go in header <code>x-botmux-chat-id</code> or body <code>{"chatId":"\u2026"}</code>. \u26A0\uFE0F The URL is the credential \u2014 keep it secret.',"connectors.usageTokenLede":"This URL already has the token and a fixed target group; just POST to trigger:","connectors.usageTokenNote":"\u26A0\uFE0F The URL is the credential \u2014 keep it private; delete or rotate it in the list below.","connectors.usageHmac":"The external system must HMAC-SHA256-sign <code>timestamp.body</code> and call with <code>x-botmux-timestamp</code> / <code>x-botmux-nonce</code> / <code>x-botmux-signature</code> headers","connectors.usageHmacDynamic":", and also pass the target chat ID as above","connectors.createdPrefix":'Created "{name}"',"connectors.createdDest":'to "{name}"',"connectors.tokenLabel":"Access token","connectors.signLabel":"Signing secret","connectors.secretOnce":" (shown once \u2014 save it): ","connectors.createFailed":"Create failed: {error}","connectors.saveFailed":"Save failed: {error}","connectors.noOnlineBots":"(No online bots)","team.navHome":"My team","team.navManage":"Team management","team.eyebrow":"Team","team.homeTitle":"Team collaboration (cross-deployment)","team.homeLede":"Invite other deployments (botmux instances teammates run) into one team to discover bots across deployments and pull collaborative groups.","team.localDeployTitle":"This deployment","team.myIdentity":"My Lark identity: ","team.unbound":"Not bound","team.bindBtn":"Bind","team.bindHint":" (auto-identifies you via the bot credentials; once bound, pulling a group adds you and attributes the bots to you)","team.myTeams":"My teams","team.searchPh":"Search name / capability / CLI\u2026","team.allCli":"All CLIs","team.hasCap":"Has capability tag","team.hasRole":"Has default role","team.teamsHint":"Tick bots in any team to pull them into a group (each with its owner). To create a team / generate an invite code / join another team, go to Team management.","team.loading":"Loading\u2026","team.roleModalTitle":"Default role","team.roleModalHint":"The bot default persona (applies across groups), read-only here. To edit, go to the Bot Defaults page.","team.close":"Close","team.tagLocal":"This deployment","team.tagRemoteStale":"Remote \xB7 offline?","team.tagRemote":"Remote","team.removeMember":"Remove","team.depTag":"({tag})","team.depCount":"{count}","team.depSelected":", {n} selected","team.capPh":"Capability tag\u2026","team.viewRole":"View","team.hasRoleShort":"Has role","team.noMatch":"No bots match the filters.","team.gnamePh":"Group name (e.g. cross-team triage)","team.pullGroupBtn":"Pull ticked bots into a group","team.pullGroupHint":"Tick bots \u2192 pull into a Lark group (owner included automatically)","team.noTeams":"No teams yet. Go to Team management to generate an invite code for others to join you, or join another team.","team.connected":"Connected","team.connectFail":"Connection failed: {error}","team.iHost":"I host","team.teamMeta":"{deps} deployments \xB7 {bots} bots","team.rosterFail":"Could not fetch this team roster.","team.acrossTeams":" (across {n} teams, deduped)","team.botsWord":"bots","team.groupCreated":"Group created","team.delegatedBy":' (created by "{name}")',"team.openInLark":"Open in Lark","team.invalidBots":"Bots not added: {ids}","team.invalidOwners":"{n} owner(s) could not be added","team.missingIdentity":"You have not bound a Lark identity, so you were not added to the group (bind it in My team)","team.skippedNoOwner":"{n} bot(s) skipped because their owner has no bound identity (not added)","team.errNoLocalBot":"Tick at least one of your own (this deployment) online bots \u2014 the group is created by it and adds you (the initiator).","team.errAllSkipped":"None of the selected bot owners have a bound identity, so the group cannot be pulled (a bot cannot join a group without its owner). Have those deployments bind an identity first.","team.errNoCreator":"No available group creator (the relevant deployments have no online bot, or are unreachable)","team.errDelegationTimeout":"Timed out delegating group creation to the other deployment (it may have succeeded \u2014 check Lark, do not retry)","team.errGroupCreate":"Group creation failed: {error}","team.roleModalTitleName":"Default role \xB7 {name}","team.bound":"Bound","team.myHostedTeam":"My hosted team","team.remoteTeamLabel":"{name} team","team.manageTitle":"Team management","team.manageLede":"Create multiple teams, generate an invite code per team, or join another team. A team = this deployment bots + the other deployments that joined it.","team.hostedTitle":"Teams I host","team.newTeamPh":"New team name","team.createTeamBtn":"Create team","team.joinTitle":"Join another team","team.hubPh":"Hub address, e.g. http://10.0.0.5:7891","team.codePh":"Invite code","team.joinBtn":"Join","team.noTeamsShort":"No teams yet.","team.default":"Default","team.manageMetaDeps":"{count} deployments","team.manageMetaRemote":" (incl. {r} remote)","team.manageMetaBots":"{count} bots","team.genInvite":"Generate invite code","team.delBtn":"Delete","team.generating":"Generating\u2026","team.inviteResultLede":"Send the two items below to someone on another deployment (valid once, within 24h):","team.inviteHub":"Hub address: ","team.inviteCode":"Invite code: ","team.genFail":"Generation failed.","team.delConfirm":'Delete team "{name}"? Deployments that joined it will be removed (their own deployments are unaffected).',"team.errName":"Enter a team name","team.creating":"Creating\u2026","team.created":"Created","team.createFail":"Create failed: {error}","team.errHubCode":"Enter the hub address and invite code.","team.joining":"Joining\u2026","team.joined":'Joined "{name}" \u2014 see it in My team.',"team.joinErrSelf":"This is your own deployment; you cannot join yourself (the invite code is for someone on another deployment).","team.joinErrAlready":"Your deployment already joined this team.","team.joinErrUnreachable":"Cannot reach the hub (check the address/network).","team.joinErrTimeout":"The hub timed out.","team.joinErrGeneric":"Join failed: {error}","team.identifying":"Identifying\u2026","team.bound2":"Bound: {name}","team.multiCandidate":"Multiple candidates found \u2014 click yourself:","team.binding":"Binding\u2026","team.bindFail":"Bind failed: {error}","team.noCandidates":"No identity found: make sure the bot has allowedUsers configured and contacts permission.","team.removeMemberConfirm":'Remove "{name}" from this team? Its bots disappear from this team roster (their own deployment is unaffected).',"team.creatingGroup":"Creating group\u2026","team.defaultGroupName":"Collaboration group","team.errPickBot":"Tick at least one bot first","sessions.closeBulkConfirm":"Close {count} selected sessions?","sessions.empty":"No sessions match the filters.","sessions.viewMode":"Session view","sessions.viewKanban":"Kanban","sessions.viewBoard":"Board","sessions.viewTable":"Table","sessions.selectSession":"Select session","sessions.board.needsYou":"Needs You","sessions.board.needsYouHint":"Repo, TUI, or usage limit waiting","sessions.board.starting":"Starting","sessions.board.startingHint":"CLI is spawning or resuming","sessions.board.working":"Working","sessions.board.workingHint":"Streaming, analyzing, or using tools","sessions.board.idle":"Idle","sessions.board.idleHint":"Ready for the next message","sessions.board.emptyColumn":"No sessions","sessions.board.signalRepo":"Repo needed","sessions.board.signalPrompt":"TUI choice needed","sessions.board.signalLimited":"Usage limited","sessions.board.signalAgent":"Needs human input","sessions.board.waiting":"Waiting","sessions.board.dragHint":"Drag header to reorder columns","sessions.board.moveLeft":"Move column left","sessions.board.moveRight":"Move column right","sessions.kanban.backlog":"Backlog","sessions.kanban.todo":"Todo","sessions.kanban.inProgress":"In Progress","sessions.kanban.inReview":"In Review","sessions.kanban.done":"Done","sessions.kanban.updated":"Updated {time}","sessions.kanban.moreHidden":"{count} more hidden","sessions.create.button":"Create session","sessions.create.title":"Create session","sessions.create.content":"Content","sessions.create.contentPlaceholder":"Describe the task; in Lead-dispatch mode you can assign different work to each agent here","sessions.create.bots":"Bots (added to the new group)","sessions.create.noBots":"No online bots to pick","sessions.create.mode":"Collaboration mode","sessions.create.modeAll":"Work together","sessions.create.modeLead":"Lead dispatch (recommended)","sessions.create.modeHelp":"Work together: every selected bot starts its own session with the same content. Lead dispatch: only the lead starts; it @-mentions the other bots in the chat to bring them in.","sessions.create.lead":"Lead bot","sessions.create.leadHelp":"The content goes to the lead, which decides when to bring up each sub-bot.","sessions.create.leadPickFirst":"Pick bots above first","sessions.create.column":"Initial column","sessions.create.columnInProgress":"In progress now","sessions.create.columnBacklog":"Backlog","sessions.create.columnHelp":"In progress: start immediately after the group is created. Backlog: create the group and add bots but do not start the CLI; drag to \u201CIn Progress\u201D or hit \u201CStart\u201D later to send the content.","sessions.create.advanced":"More options","sessions.create.groupName":"Group name","sessions.create.groupNamePlaceholder":"Defaults to the first line of the content","sessions.create.workingDir":"Working directory","sessions.create.workingDirHelp":"Optional. If set, binds the new group to this directory (all bots work there). Leave blank to pick a repo via the /repo card in the chat (worktree creation supported).","sessions.create.submit":"Create","sessions.create.submitting":"Creating\u2026","sessions.create.cancel":"Cancel","sessions.create.start":"Start","sessions.create.errContent":"Please enter the content","sessions.create.errNoBot":"Pick at least one bot","sessions.create.errLead":"Lead must be one of the selected bots","sessions.create.failed":"Create failed","sessions.create.startFailed":"Start failed","sessions.create.doneTitle":"Created","sessions.create.doneInProgress":"Group created and session(s) started","sessions.create.doneBacklog":"Group created; session(s) queued in Backlog","sessions.create.partialFail":"{n} bot(s) could not be started \u2014 you can @-mention them in the chat to retry","sessions.create.openChat":"Open Feishu chat","sessions.create.close":"Close","sessions.kanban.openTab":"Open in new tab","sessions.kanban.openFeishu":"Open in Feishu","sessions.kanban.terminalLoading":"Opening terminal\u2026","sessions.kanban.rename":"Rename (double-click title works too)","sessions.kanban.renameFail":"Rename failed","sessions.kanban.moveFail":"Move failed","sessions.kanban.groupBy":"Group by","sessions.kanban.groupFlow":"Workflow","sessions.kanban.groupTeam":"Team","sessions.kanban.groupBot":"Bots","sessions.kanban.teamLoading":"Loading teams\u2026","sessions.kanban.noTeam":"No teams","sessions.kanban.teamScope":"{chats} collab chats \xB7 {sessions} sessions","sessions.kanban.remoteHint":"Session from the {name} deployment (snapshot; terminal/history live on their machine)","sessions.kanban.clusterDragHint":"Drag header to move the whole group","sessions.history.title":"History","sessions.history.loading":"Fetching Feishu messages\u2026","sessions.history.fail":"Failed to load history","sessions.history.empty":"No messages","sessions.history.user":"User","sessions.history.owner":"Owner","sessions.history.staleHint":"The dashboard or daemon process may still run an old build \u2014 botmux restart and retry","groups.title":"Groups & Bots","groups.subtitle":"Inspect the chat x bot matrix and manage group creation, oncall, leave, and disband flows.","groups.search":"Search chat name / ID / owner","groups.missingOnly":"Missing bot only","groups.refresh":"Refresh","groups.create":"New Group","groups.chat":"Chat","groups.actions":"Actions","groups.addBots":"Add Bots","groups.saveAsProfile":"Save as Profile","groups.manage":"Manage","groups.empty":"No chats match the filters.","groups.profileStatusFull":"Fully matches {name} ({matched}/{total})","groups.profileStatusFullChat":"Group roles fully match {name} ({matched}/{total})","groups.profileStatusPartial":"Partially matches {name} ({matched}/{total})","groups.profileStatusUnmatched":"No profile match","groups.saveProfileTitle":"Save as Profile","groups.saveProfileIntro":'Save {count} in-chat bot configs from "{name}" as a profile snapshot.',"groups.saveProfileScope":"Save scope","groups.saveProfileScopeHelp":"In-chat bot config snapshot","groups.saveProfileBotCount":"Bots in chat","groups.saveProfileLoadFailed":"Load failed","groups.saveProfileStatus.entry":"Create entry","groups.saveProfileStatus.error":"Load failed","groups.saveProfileMode":"Save mode","groups.saveProfileNew":"New Profile","groups.saveProfileNewHelp":"Create a new snapshot by default; if the id exists, matching bot entries are overwritten.","groups.saveProfileOverwrite":"Overwrite Existing Profile","groups.saveProfileOverwriteHelp":"Pick an existing profile and overwrite entries for the same bots.","groups.saveProfileExistingMeta":"{count} entries","groups.saveProfileIdLabel":"Profile id","groups.saveProfileExistingLabel":"Existing Profile","groups.saveProfileExistingEmpty":"No existing profiles","groups.saveProfileTarget":"Target Profile","groups.saveProfileTargetNew":"Will create or update this profile with the in-chat bot snapshot","groups.saveProfileTargetOverwrite":"Will overwrite entries for these bots in the existing profile","groups.saveProfileEntrySummary":"Will create profile entries for {count} in-chat bots.","groups.saveProfileEntrySummaryWithEmpty":"Will create profile entries for {count} in-chat bots; {emptyCount} currently have no returned role content and will be saved as empty entries.","groups.saveProfileFailedLoadSummary":"{count} bot configs failed to load. Saving is paused to avoid an incomplete snapshot.","groups.saveProfileSubmit":"Save Profile","groups.saveProfileOverwriteSubmit":"Overwrite Save","groups.saveProfileInvalid":"Profile id may contain letters, numbers, dots, underscores, and hyphens only; max 64; cannot be . or ..","groups.saveProfileNoRoles":"This chat has no bot configs to save.","groups.saveProfileSaving":"Saving\u2026","groups.saveProfileDone":"Saved {count} entries into {name}","groups.saveProfileFailed":"Saved only {saved}/{total} entries. Check offline bots or permissions.","groups.createTitle":"Create New Group","groups.createHelp":"Pick bots to invite. The dashboard chooses an online daemon as creator.","groups.name":"Group Name","groups.namePlaceholder":"e.g. AI ChangeLog","groups.bindDir":"Bind Directory","groups.bindDirHelp":"New topics start the CLI here and skip repo selection.","groups.roleProfile":"Profile","groups.roleProfileNone":"None","groups.roleProfileHelp":"After creation, send a profile apply bootstrap command in the new group.","groups.roleProfileBootstrapSent":"Profile: {name}; bootstrap message sent: {messageId}","groups.roleProfileBootstrapDone":"Profile: {name}; bootstrap completed with no peer bootstrap message needed.","groups.roleProfileBootstrapFailed":"Profile: {name}; bootstrap failed: {reason}","groups.botPicker":"Bots","groups.createSubmit":"Create","groups.cancel":"Cancel","groups.successTitle":"Group Created","groups.openGroup":"Open Group","groups.manageTitle":"Manage {name}","groups.owner":"Owner","groups.oncall":"Oncall Mode","groups.oncallHelp":"When enabled, group members can @ the bot; the selected bot's new topics in this group use its bound directory (binding is per-bot \u2014 only the checked bots are affected).","groups.leaveTitle":"Select Bots to Leave","groups.leaveSelected":"Selected Bots Leave","groups.disband":"Disband Group","groups.dangerHint":"Disband only works when an in-chat bot is the owner. Otherwise prefer leaving the chat.","groups.save":"Save","groups.needWorkingDir":"Working directory is required","groups.noBotsOnline":"No bots online. Restart the daemon first.","schedules.title":"Schedules","schedules.subtitle":"View, pause, resume, and run scheduled tasks across daemons.","schedules.search":"Search name / prompt / working dir","schedules.anyKind":"Any kind","schedules.enabledOnly":"Enabled only","schedules.name":"Name","schedules.bot":"Bot","schedules.schedule":"Schedule","schedules.next":"Next","schedules.last":"Last","schedules.repeat":"Repeat","schedules.enabled":"Enabled","schedules.actions":"Actions","schedules.runNow":"Run Now","schedules.pause":"Pause","schedules.resume":"Resume","schedules.delivery":"Delivery","schedules.deliveryOrigin":"Original thread","schedules.deliveryNewTopic":"New topic each run","schedules.deliveryLocal":"Log only","schedules.useNewTopic":"Switch to new-topic","schedules.useOrigin":"Switch to original","schedules.empty":"No schedules.","settings.title":"Global Settings","settings.subtitle":"Manage machine-wide botmux dashboard behavior shared by every bot.","settings.loading":"Loading settings\u2026","settings.loadFailed":"Failed to load settings","settings.readOnlyVisitor":"Read-only access \u2014 changing settings requires an authorized link (run botmux dashboard).","settings.sectionAccess":"Access","settings.publicReadOnly":"Allow tokenless read-only dashboard access","settings.publicReadOnlyHelp":"When enabled, visitors without a token can view the dashboard, sessions, schedules, and SSE. Writes such as close, pause, and approvals still require token auth. Sensitive raw terminal logs always require a token.","settings.remoteAccess":"Remote terminal access","settings.remoteAccessHelp":'When enabled, session web terminals, Feishu card "Open terminal" / "Get writable link" buttons, and webhooks all use central-platform links; when off, local links are used. Off by default.',"settings.sectionCards":"Feishu Cards","settings.openTerminalInFeishu":"Open streaming-card terminals in the Feishu sidebar","settings.openTerminalInFeishuHelp":"Off by default: terminal buttons open the Web Terminal URL directly. When enabled, botmux wraps the URL with Feishu web_url/open so Feishu PC opens it in a sidebar. Terminal write access is still controlled by its token.","settings.sectionExperimental":"Experimental","settings.chatBotDiscovery":"In-chat bot discovery (Feishu /members/bots)","settings.chatBotDiscoveryHelp":"When enabled, botmux reads the current chat's bot members in real time via Feishu /members/bots so multiple bots can reliably @-mention each other \u2014 it works from the very first message, with no need to accumulate past @ history, making multi-bot collaboration more robust. This is a non-public Feishu endpoint: it is on by default and automatically falls back to legacy discovery (per-bot probing + observed @ history) on failure. Turn it off (forcing the legacy path) only if your tenant/gateway does not support the endpoint, if it returns inaccurate membership that causes wrong or missing @-mentions, or if a Feishu change breaks its behaviour.","settings.sectionRepoPicker":"Repo Picker","settings.repoPickerMode":"Repo picker card mode","settings.repoPickerModeAll":"Repos + worktrees","settings.repoPickerModeRepos":"Main repos only","settings.repoPickerModeHelp":"Default shows repositories and linked worktrees. Main repos only hides linked worktrees from initialization and bare /repo cards; explicit /repo /abs/path/to/worktree still works.","settings.saving":"Saving\u2026","settings.saved":"Saved","settings.saveFailed":"Save failed","settings.sectionMaintenance":"Auto Maintenance","settings.autoUpdate":"Auto update","settings.autoUpdateHelp":"Off by default. At the set time, runs npm install -g botmux@latest to install the latest version (download/install only \u2014 no restart). npm-global installs only.","settings.autoRestart":"Auto restart","settings.autoRestartHelp":"Off by default; requires auto-update. After auto-update installs a newer version, restart to apply it if no session is in progress (busy \u21D2 slips to the next day).","settings.autoUpdateLocalDev":"This is a local-dev install (running from source); auto-update is unavailable.","settings.maintenanceTime":"Time","update.section":"Version & Update","update.loginRequired":"Sign in to check the version, update, or restart.","update.loading":"Checking\u2026","update.checkFailed":"Check failed","update.current":"Current version","update.upToDate":"Up to date","update.newAvailable":"New version {version} available","update.checkUnavailable":"Couldn't fetch the latest version (offline or network-restricted)","update.nodeWarn":"Node {version} is too old; update requires \u2265 {required}. Please upgrade Node first.","update.localDev":'This is a local-dev install (running from source); "Update to latest" is unavailable \u2014 use git pull + build, then restart.',"update.multiInstallWarn":"Multiple botmux installs detected. npm only updates the npm-global one, which may not be the active version:","update.kindNpm":"npm-global","update.kindSource":"source checkout","update.kindUnknown":"unknown","update.btnCheck":"Check for updates","update.btnChangelog":"View what's new","update.btnChangelogHide":"Hide changelog","update.btnUpdate":"Update to latest","update.btnRestart":"Restart botmux","update.changelogLoading":"Loading changelog\u2026","update.changelogEmpty":"No release notes newer than the current version.","update.changelogFailed":"Couldn't load the changelog (offline or network-restricted).","update.changelogRateLimited":"GitHub API rate limit hit (60 req/h per IP unauthenticated, easily tripped on shared networks). Try again later.","update.changelogViewOnGitHub":"View on GitHub Releases","update.navBadgeTitle":"New version {version} available","update.confirmMultiInstall":`Multiple botmux installs detected:
|
|
17
17
|
{paths}
|
|
18
18
|
|
|
19
19
|
npm only updates the npm-global one, which may not be the active version. Continue anyway?`,"update.confirmUpdate":"This will run npm install -g botmux@latest to update to {version}. Continue?","update.confirmUpdateNoVer":"This will run npm install -g botmux@latest to update to the latest version. Continue?","update.nodeTooOldAlert":"Node {version} is too old (requires \u2265 {required}). Please upgrade Node before updating.","update.updating":"Updating (npm install -g botmux@latest)\u2026","update.updatedChanged":"Updated {old} \u2192 {new}.","update.confirmRestart":"A restart is required to apply the new version. Restart now? (Sessions cold-resume; the dashboard briefly disconnects and reconnects.)","update.alreadyLatestRun":"Already on the latest version ({version}); nothing to update.","update.updateFailed":"Update failed: {detail}","update.noRestartHint":"Update installed. Restart later (botmux restart) to apply the new version.","update.confirmPlainRestart":"Restart botmux? Sessions cold-resume; the dashboard briefly disconnects and reconnects.","update.restarting":"Restarting botmux, waiting to reconnect\u2026","update.restartSlow":"Restart is taking a while; please refresh the page manually.","update.restartFailed":"Restart failed: {detail}","skills.title":"Skill Management","skills.subtitle":"Manage CLI-neutral botmux Skill assets and choose priority disclosure per bot.","skills.installed":"Installed Skills","skills.installedHelp":"Skill assets in the local registry that bots can disclose first.","skills.overviewTitle":"Organize Skill assets by bot","skills.overviewBody":"Global Skill delivery settings control session injection; each bot only manages its priority disclosure list.","skills.metricInstalled":"Installed Skills","skills.metricBots":"Configured Bots","skills.metricAttached":"Priority refs","skills.install":"Install Skill","skills.installInfoLabel":"Install location details","skills.installInfo":`Registry: ~/.botmux/skills/registry.json
|
|
@@ -275,7 +275,7 @@ effects={effects}, activities={activities}, waits={waits}, cancels={cancels}`,"w
|
|
|
275
275
|
${r}
|
|
276
276
|
${n?`<p><a href="${l(n)}" target="_blank" rel="noopener">${s("sessions.create.openChat")}</a></p>`:""}
|
|
277
277
|
<div class="actions"><button type="button" id="cs-done" class="primary">${s("sessions.create.close")}</button></div>
|
|
278
|
-
</article>`,e.querySelector("#cs-done").onclick=()=>e.close()}function xl(e){e.innerHTML=wp();let t=e.querySelector("#sessions-table tbody"),n=e.querySelector("#filters"),a=e.querySelector("#drawer"),o=e.querySelector("#select-all"),i=e.querySelector("#bulk-bar"),r=e.querySelector("#bulk-count"),u=e.querySelector("#bulk-lock"),c=e.querySelector("#bulk-unlock"),p=e.querySelector("#bulk-close"),f=e.querySelector("#bulk-clear"),h=e.querySelector("#idle-cleanup-bar"),y=e.querySelector("#idle-cleanup-threshold"),g=e.querySelector("#idle-cleanup-run"),v=e.querySelector("#idle-cleanup-count"),M=e.querySelector("#idle-cleanup-status"),$=e.querySelector("#sessions-table"),L=e.querySelector("#sessions-board"),C=e.querySelector("#sessions-kanban"),P=e.querySelector("#term-modal"),H=e.querySelector("#history-modal"),q=e.querySelector("#kanban-groupby"),I=e.querySelector("#kanban-team"),N=e.querySelector("#kanban-team-stats"),O=e.querySelectorAll(".sessions-view-toggle [data-view]"),A=e.querySelector("#create-session-btn"),R=e.querySelector("#create-session-modal");xp(R,A);let B=new Set,V="lastMessageAt",Z="desc",G=Fr(window.localStorage),j=qr(window.localStorage),z=null,b="",S="",E="",U=!1,ee=null,pe=!1,he=null,ae=new Map,se=zr(window.localStorage),ie=null,me=null,be=[],Me=null,le=!1,ve=!1,$e=(()=>{try{return window.localStorage.getItem(ga)??""}catch{return""}})(),Pe=!1,
|
|
278
|
+
</article>`,e.querySelector("#cs-done").onclick=()=>e.close()}function xl(e){e.innerHTML=wp();let t=e.querySelector("#sessions-table tbody"),n=e.querySelector("#filters"),a=e.querySelector("#drawer"),o=e.querySelector("#select-all"),i=e.querySelector("#bulk-bar"),r=e.querySelector("#bulk-count"),u=e.querySelector("#bulk-lock"),c=e.querySelector("#bulk-unlock"),p=e.querySelector("#bulk-close"),f=e.querySelector("#bulk-clear"),h=e.querySelector("#idle-cleanup-bar"),y=e.querySelector("#idle-cleanup-threshold"),g=e.querySelector("#idle-cleanup-run"),v=e.querySelector("#idle-cleanup-count"),M=e.querySelector("#idle-cleanup-status"),$=e.querySelector("#sessions-table"),L=e.querySelector("#sessions-board"),C=e.querySelector("#sessions-kanban"),P=e.querySelector("#term-modal"),H=e.querySelector("#history-modal"),q=e.querySelector("#kanban-groupby"),I=e.querySelector("#kanban-team"),N=e.querySelector("#kanban-team-stats"),O=e.querySelectorAll(".sessions-view-toggle [data-view]"),A=e.querySelector("#create-session-btn"),R=e.querySelector("#create-session-modal");xp(R,A);let B=new Set,V="lastMessageAt",Z="desc",G=Fr(window.localStorage),j=qr(window.localStorage),z=null,b="",S="",E="",U=!1,ee=null,pe=!1,he=null,ae=new Map,se=zr(window.localStorage),ie=null,me=null,be=[],Me=null,le=!1,ve=!1,$e=(()=>{try{return window.localStorage.getItem(ga)??""}catch{return""}})(),Pe=!1,Ge=24;function it(){return Ge}function He(d){return d===168?"7d":`${d}H`}function Xe(d){let m=new Set;if(!d)return m;for(let k of d.groupChats)m.add(k);if(Me)for(let[k,w]of Me){if(m.has(k))continue;let x=!1;for(let T of d.botIds)if(w.botIds.has(T)){x=!0;break}if(x){for(let T of w.observedNames)if(d.botNames.has(T)){m.add(k);break}}}return m}function Ye(){let d=Bt();if(G==="kanban"&&se==="team"){let m=be.find(w=>w.key===$e)??be[0],k=Xe(m);return d.filter(w=>k.has(String(w.chatId)))}return d}function K(){return ml(Ye(),it())}function Ae(){y.querySelectorAll("button[data-hours]").forEach(d=>{let m=Ca(d.dataset.hours)===Ge;d.classList.toggle("active",m),d.setAttribute("aria-pressed",m?"true":"false")})}async function fe(){if(!(ve||le)){ve=!0;try{let[d,m,k]=await Promise.all([fetch("/api/team/hosted").then(T=>T.json()).catch(()=>null),fetch("/api/team/remote-roster").then(T=>T.json()).catch(()=>null),fetch("/api/groups").then(T=>T.json()).catch(()=>null)]);Array.isArray(k?.chats)&&(Me=new Map(k.chats.map(T=>[String(T.chatId),{botIds:new Set((T.memberBots??[]).filter(F=>F.inChat).map(F=>String(F.larkAppId))),observedNames:new Set((T.observedBotNames??[]).map(F=>String(F)))}])));let w=T=>({ids:new Set(T.map(F=>String(F.larkAppId))),names:new Set(T.map(F=>String(F.name??"")).filter(Boolean))}),x=[];for(let T of d?.teams??[]){let{ids:F,names:W}=w(T.bots??[]);x.push({key:`local:${T.teamId}`,label:T.isDefault?s("team.myHostedTeam"):String(T.name??T.teamId),botIds:F,botNames:W,groupChats:new Set((T.groupChatIds??[]).map(ne=>String(ne)))})}for(let T of m?.memberships??[]){let{ids:F,names:W}=w(T.roster?.bots??[]);x.push({key:`${T.hubUrl}::${T.teamId}`,label:String(T.teamName??T.teamId??T.hubUrl),botIds:F,botNames:W,groupChats:new Set})}be=x}finally{le=!0,ve=!1}be.length&&!be.some(d=>d.key===$e)&&($e=be[0].key),delete I.dataset.loading,I.disabled=be.length===0,I.innerHTML=be.length?be.map(d=>`<option value="${l(d.key)}"${d.key===$e?" selected":""}>${l(d.label)}</option>`).join(""):`<option value="">${l(s("sessions.kanban.noTeam"))}</option>`,E="",ye()}}let re=null,Be="",rt=0,wt=!1,kt=new Map;async function et(d){let m=Be===d.key&&Date.now()-rt<3e4;if(!(wt||m)){wt=!0;try{let w=d.key.startsWith("local:")?`/api/team/board/local/${encodeURIComponent(d.key.slice(6))}`:`/api/team/remote-board?key=${encodeURIComponent(d.key)}`,x=await fetch(w),T=await x.json().catch(()=>({}));if(!x.ok||T?.ok===!1)return;let F=typeof T.deploymentId=="string"?T.deploymentId:null,W=[];kt=new Map;for(let ne of Array.isArray(T.reports)?T.reports:[])if(!(F&&ne.deploymentId===F))for(let de of Array.isArray(ne.sessions)?ne.sessions:[]){let Ne={...de,remoteDeployment:ne.deploymentName||ne.deploymentId};W.push(Ne),kt.set(String(de.sessionId),Ne)}re={board:T.board&&typeof T.board=="object"?T.board:{},remoteRows:W},Be=d.key,rt=Date.now(),E="",ye()}catch{}finally{wt=!1}}}async function xn(d,m,k,w,x){try{let F=d.startsWith("local:")?await fetch(`/api/team/board/local/${encodeURIComponent(d.slice(6))}/move`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:m,column:k,position:w})}):await fetch("/api/team/remote-board-move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:d,sessionId:m,column:k,position:w})}),W=await F.json().catch(()=>({}));(!F.ok||W?.ok===!1)&&(re&&(x?re.board[m]=x:delete re.board[m]),E="",ye(),F.status!==401&&alert(`${s("sessions.kanban.moveFail")}: ${W?.error??F.status}`))}catch(T){re&&(x?re.board[m]=x:delete re.board[m]),E="",ye(),alert(`${s("sessions.kanban.moveFail")}: ${T}`)}}function ot(d,m,k){let w=be.find(T=>T.key===$e)??be[0];if(!w)return;(!re||Be!==w.key)&&(re={board:{},remoteRows:re?.remoteRows??[]},Be=w.key);let x=re.board[d];re.board[d]={column:m,position:k},xn(w.key,d,m,k,x)}function Ze(){return j.map(d=>gl.find(m=>m.id===d)).filter(d=>!!d)}function Vt(d,m){let k=j.indexOf(d),w=k+m;if(k<0||w<0||w>=j.length)return;let x=[...j];x.splice(k,1),x.splice(w,0,d),j=x,ha(window.localStorage,j),ye()}function $t(d,m){if(d===m)return;let k=j.indexOf(d),w=j.indexOf(m);if(k<0||w<0)return;let x=[...j];x.splice(k,1),x.splice(w,0,d),j=x,ha(window.localStorage,j),ye()}function Wn(d){let m=d.status==="closed",k=B.has(d.sessionId)?"checked":"";return`<tr data-id="${l(d.sessionId)}">
|
|
279
279
|
<td><input type="checkbox" class="row-select" ${k} ${m?"disabled":""}></td>
|
|
280
280
|
<td>${l(De(d))}</td>
|
|
281
281
|
<td><span class="badge cli-${yl(d.cliId)}">${l(d.cliId??"unknown")}</span></td>
|
|
@@ -447,7 +447,7 @@ effects={effects}, activities={activities}, waits={waits}, cancels={cancels}`,"w
|
|
|
447
447
|
<div class="actions">
|
|
448
448
|
<button id="land-apply" type="button" class="primary">${s("sessions.landApply")}</button>
|
|
449
449
|
<button id="land-discard" type="button" class="contrast">${s("sessions.landDiscard")}</button>
|
|
450
|
-
</div>`;let $s=ut.querySelector("#land-apply"),to=ut.querySelector("#land-discard");$s.onclick=async()=>{$s.disabled=!0,to.disabled=!0;let qe=await fetch(`/api/sessions/${encodeURIComponent(d.sessionId)}/sandbox-land/apply`,{method:"POST"}),dn=await qe.json().catch(()=>({}));ut.innerHTML=dn.ok?`<p>\u2705 ${s("sessions.landApplied")}: ${dn.files} files (+${dn.insertions}/-${dn.deletions}) \u2192 <code>${l(String(dn.workingDir??""))}</code></p>`:`<p>\u274C ${s("sessions.landFailed")}: ${l(dn.error??String(qe.status))}</p>`},to.onclick=async()=>{await fetch(`/api/sessions/${encodeURIComponent(d.sessionId)}/sandbox-land/discard`,{method:"POST"}),ut.innerHTML=`<p>\u{1F5D1} ${s("sessions.landDiscarded")}</p>`}}catch(xe){ut.innerHTML=`<p>${s("sessions.landUnavailable")}: ${l(String(xe))}</p>`,lt.disabled=!1}});let Yn=a.querySelector("#insight-btn"),ft=a.querySelector("#insight-area");Yn&&ft&&(Yn.onclick=async()=>{Yn.disabled=!0,ft.innerHTML=`<p>${s("sessions.insightLoading")}</p>`;try{let xe=await fetch(`/api/sessions/${encodeURIComponent(d.sessionId)}/insight?detail=spans`),Te=await xe.json().catch(()=>({}));!Te.ok||!Te.report?ft.innerHTML=`<p>${s("sessions.insightUnavailable")}: ${l(String(Te.error??xe.status))}</p>`:ft.innerHTML=Et(Te.report)}catch(xe){ft.innerHTML=`<p>${s("sessions.insightUnavailable")}: ${l(String(xe))}</p>`}Yn.disabled=!1}),a.showModal()}t.addEventListener("click",d=>{let m=d.target;if(m.classList.contains("row-select")){let T=m.closest("tr[data-id]");if(!T)return;m.checked?B.add(T.dataset.id):B.delete(T.dataset.id),Sn(Bt());return}let k=m.closest("td");if(k&&k.querySelector(".row-select"))return;let w=m.closest("tr[data-id]");if(!w)return;let x=ke.sessions.get(w.dataset.id);x&&ks(x)}),L.addEventListener("click",d=>{let m=d.target,k=m.closest("button[data-move-col]");if(k){Vt(k.dataset.moveCol,Number(k.dataset.dir));return}let w=m.closest(".session-card[data-id]");if(!w)return;let x=ke.sessions.get(w.dataset.id);if(!x)return;let T=m.closest("button[data-action]");if(T){let F=T.dataset.action;F==="details"?ks(x):F==="write-link"?kl(x,T):F==="locate"?En(x,T):F==="restart"?Tn(x,T):F==="lock"?cn(x,!x.locked,T):F==="close"&>(x,T).then(W=>{W&&(B.delete(x.sessionId),ye())});return}m.closest("a, button, input, label")||(B.has(x.sessionId)?B.delete(x.sessionId):B.add(x.sessionId),w.classList.toggle("selected",B.has(x.sessionId)),w.setAttribute("aria-pressed",String(B.has(x.sessionId))),Sn(Bt().filter(F=>F.status!=="closed")))}),L.addEventListener("dragstart",d=>{let k=d.target.closest(".session-board-column > header[draggable]")?.closest(".session-board-column");k?.dataset.col&&(z=k.dataset.col,k.classList.add("dragging"),d.dataTransfer&&(d.dataTransfer.effectAllowed="move",d.dataTransfer.setData("text/plain",z)))}),L.addEventListener("dragover",d=>{if(!z)return;d.preventDefault(),d.dataTransfer&&(d.dataTransfer.dropEffect="move");let m=d.target.closest(".session-board-column");L.querySelectorAll(".drag-over").forEach(k=>k.classList.remove("drag-over")),m&&m.dataset.col!==z&&m.classList.add("drag-over")}),L.addEventListener("drop",d=>{if(!z)return;d.preventDefault();let m=d.target.closest(".session-board-column"),k=z;z=null,m?.dataset.col&&$t(k,m.dataset.col)}),L.addEventListener("dragend",()=>{z=null,L.querySelectorAll(".drag-over, .dragging").forEach(d=>d.classList.remove("drag-over","dragging"))}),O.forEach(d=>{d.addEventListener("click",()=>{let m=ma(d.dataset.view)??"board";m!==G&&(G=m,jr(window.localStorage,G),ye())})}),q.querySelectorAll("[data-groupby]").forEach(d=>{d.addEventListener("click",()=>{let m=d.dataset.groupby,k=m==="bot"?"bot":m==="team"?"team":"flow";k!==se&&(se=k,Gr(window.localStorage,k),E="",ye())})}),I.addEventListener("change",()=>{$e=I.value;try{window.localStorage.setItem(ga,$e)}catch{}E="",ye()});function Y(){he!==null&&(clearTimeout(he),he=null)}C.addEventListener("click",d=>{let m=d.target,k=m.closest(".kanban-card[data-id]");if(!k)return;let w=ke.sessions.get(k.dataset.id);if(!w)return;let x=m.closest("button[data-action]");if(x){x.dataset.action==="details"?ks(w):x.dataset.action==="rename"?oe(k,w):x.dataset.action==="history"?te(w):x.dataset.action==="restart"?Tn(w,x):x.dataset.action==="lock"&&cn(w,!w.locked,x);return}m.closest("a, button, input, label")||(Y(),he=setTimeout(()=>{he=null,ge(w)},220))}),C.addEventListener("dblclick",d=>{let m=d.target,k=m.closest(".kanban-card-title"),w=m.closest(".kanban-card[data-id]");if(!k||!w)return;Y();let x=ke.sessions.get(w.dataset.id);x&&oe(w,x)}),C.addEventListener("keydown",d=>{if(d.key!=="Enter"&&d.key!==" ")return;let m=d.target;if(!m.classList?.contains("kanban-card"))return;d.preventDefault();let k=ke.sessions.get(m.dataset.id);k&&ge(k)}),C.addEventListener("dragstart",d=>{if(se==="bot")return;let m=d.target,k=m.closest(".kanban-cluster > header[draggable]");if(k){let x=k.closest(".kanban-cluster"),T=x.closest(".kanban-column")?.dataset.col;if(!x.dataset.chat||!T)return;Y(),ie=x.dataset.chat,me=T,x.classList.add("dragging"),d.dataTransfer&&(d.dataTransfer.effectAllowed="move",d.dataTransfer.setData("text/plain",`cluster:${ie}`));return}let w=m.closest(".kanban-card[data-id]");w&&(Y(),ee=w.dataset.id,w.classList.add("dragging"),d.dataTransfer&&(d.dataTransfer.effectAllowed="move",d.dataTransfer.setData("text/plain",ee)))}),C.addEventListener("dragover",d=>{if(!ee&&!ie)return;d.preventDefault(),d.dataTransfer&&(d.dataTransfer.dropEffect="move");let m=d.target.closest(".kanban-column");C.querySelectorAll(".drag-over").forEach(k=>k.classList.remove("drag-over")),C.querySelectorAll(".drop-before").forEach(k=>k.classList.remove("drop-before")),m&&(m.classList.add("drag-over"),ue(m,d.clientY)?.classList.add("drop-before"))}),C.addEventListener("drop",d=>{let m=ie,k=me,w=ee;if(!w&&!m)return;d.preventDefault(),ee=null,ie=null,me=null,J();let x=d.target.closest(".kanban-column"),T=x?.dataset.col;if(!x||!T)return;let F=ue(x,d.clientY);if(m&&k){let ft=(ae.get(k)??[]).filter(qe=>String(qe.chatId)===m).filter(qe=>!(qe.status==="closed"&&T!=="done"));if(!ft.length)return;let xe=new Set(ft.map(qe=>qe.sessionId)),Te=(ae.get(T)??[]).filter(qe=>!xe.has(qe.sessionId)),Jt=F?Te.findIndex(qe=>qe.sessionId===F.dataset.id):Te.length;Jt<0&&(Jt=Te.length);let eo=Jt>0?Te[Jt-1]:null,$s=Jt<Te.length?Te[Jt]:null,to=Ta(eo?Ln(eo):null,$s?Ln($s):null);ft.forEach((qe,dn)=>{let ca=to+dn*.001;if(se==="team")ot(String(qe.sessionId),T,ca);else{let $d={column:qe.kanbanColumn,position:qe.kanbanPosition};qe.kanbanColumn=T,qe.kanbanPosition=ca,Rt(qe,T,ca,$d)}}),E="",ye();return}let W=ke.sessions.get(w)??kt.get(w);if(!W||W.status==="closed"&&T!=="done")return;let ne=(ae.get(T)??[]).filter(ft=>ft.sessionId!==w),de=F?ne.findIndex(ft=>ft.sessionId===F.dataset.id):ne.length;de<0&&(de=ne.length);let Ne=de>0?ne[de-1]:null,lt=de<ne.length?ne[de]:null,ut=Ta(Ne?Ln(Ne):null,lt?Ln(lt):null);if(se==="team"){ot(String(W.sessionId),T,ut),E="",ye();return}let Yn={column:W.kanbanColumn,position:W.kanbanPosition};W.kanbanColumn=T,W.kanbanPosition=ut,E="",ye(),Rt(W,T,ut,Yn)}),C.addEventListener("dragend",()=>{ee=null,ie=null,me=null,J(),E="",ye()}),P.addEventListener("click",d=>{d.target===P&&P.close()}),P.addEventListener("close",()=>{P.innerHTML=""}),H.addEventListener("click",d=>{d.target===H&&H.close()}),H.addEventListener("close",()=>{H.innerHTML=""}),o.addEventListener("change",()=>{let d=Bt().filter(m=>m.status!=="closed");for(let m of d)o.checked?B.add(m.sessionId):B.delete(m.sessionId);ye()}),f.addEventListener("click",()=>{B.clear(),ye()}),p.addEventListener("click",async()=>{let d=[...B];if(d.length===0||!confirm(s("sessions.closeBulkConfirm",{count:d.length})))return;p.disabled=!0,f.disabled=!0;let m=p.textContent,k=0,w=0,x=[...d];p.textContent=`0/${d.length}`;async function T(){for(;x.length;){let F=x.shift();try{let W=await fetch(`/api/sessions/${encodeURIComponent(F)}/close`,{method:"POST"}),ne=await W.json().catch(()=>({}));(!W.ok||ne?.ok===!1)&&(w+=1)}catch{w+=1}finally{k+=1,p.textContent=`${k}/${d.length}`}}}await Promise.all(Array.from({length:Math.min(6,d.length)},()=>T())),p.textContent=m,p.disabled=!1,f.disabled=!1,B.clear(),ye(),w>0&&alert(`Failed: ${w}/${d.length}`)});async function Q(d){let m=[...B].map(ne=>ke.sessions.get(ne)).filter(ne=>!!ne&&ne.status!=="closed"&&!!ne.locked!==d);if(m.length===0)return;u.disabled=!0,c.disabled=!0;let k=d?u.textContent:c.textContent,w=d?u:c,x=0,T=0,F=[...m];w.textContent=`0/${m.length}`;async function W(){for(;F.length;){let ne=F.shift(),de=!!ne.locked;try{let Ne=await fetch(`/api/sessions/${encodeURIComponent(ne.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:d})}),lt=await Ne.json().catch(()=>({}));!Ne.ok||lt?.ok===!1?(T+=1,ne.locked=de):ne.locked=!!lt.locked}catch{T+=1,ne.locked=de}finally{x+=1,w.textContent=`${x}/${m.length}`}}}await Promise.all(Array.from({length:Math.min(6,m.length)},()=>W())),w.textContent=k,Kt(),ye(),T>0&&alert(`${s("sessions.lockFailed")}: ${T}/${m.length}`)}u.addEventListener("click",()=>{Q(!0)}),c.addEventListener("click",()=>{Q(!1)}),y.addEventListener("click",d=>{if(Pe)return;let m=d.target?.closest("button[data-hours]");if(!m)return;let k=Ca(m.dataset.hours);!k||k===ze||(ze=k,M.textContent="",tt())}),g.addEventListener("click",async()=>{let d=it(),m=K();if(m.length===0)return;let k=He(d);if(confirm(s("sessions.idleCleanupConfirm",{count:m.length,threshold:k}))){Pe=!0,g.disabled=!0,M.textContent=s("sessions.idleCleanupRunning");try{let w=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:d,sessionIds:m.map(T=>T.sessionId)})}),x=await w.json().catch(()=>({}));if(!w.ok){w.status!==401&&alert(`${s("sessions.idleCleanupFailed")}: ${x?.error??w.status}`),M.textContent="";return}for(let T of x?.results??[])T?.ok&&T?.sessionId&&B.delete(String(T.sessionId));M.textContent=s("sessions.idleCleanupDone",{closed:Number(x?.closed??0),failed:Number(x?.failed??0)}),ye()}catch(w){alert(`${s("sessions.idleCleanupFailed")}: ${w}`),M.textContent=""}finally{Pe=!1,tt()}}}),$.querySelectorAll("th[data-sort]").forEach(d=>{d.addEventListener("click",()=>{let m=d.dataset.sort;V===m?Z=Z==="asc"?"desc":"asc":(V=m,Z=m==="spawnedAt"||m==="lastMessageAt"?"desc":"asc"),ye()})}),n.addEventListener("input",ye),ke.on(ye);let X=setInterval(()=>{if(!document.body.contains(C)){clearInterval(X);return}G==="kanban"&&se==="team"&&(E="",ye())},3e4);ye(),bt().then(ye)}function Tp(){return`<section class="page">
|
|
450
|
+
</div>`;let $s=ut.querySelector("#land-apply"),to=ut.querySelector("#land-discard");$s.onclick=async()=>{$s.disabled=!0,to.disabled=!0;let qe=await fetch(`/api/sessions/${encodeURIComponent(d.sessionId)}/sandbox-land/apply`,{method:"POST"}),dn=await qe.json().catch(()=>({}));ut.innerHTML=dn.ok?`<p>\u2705 ${s("sessions.landApplied")}: ${dn.files} files (+${dn.insertions}/-${dn.deletions}) \u2192 <code>${l(String(dn.workingDir??""))}</code></p>`:`<p>\u274C ${s("sessions.landFailed")}: ${l(dn.error??String(qe.status))}</p>`},to.onclick=async()=>{await fetch(`/api/sessions/${encodeURIComponent(d.sessionId)}/sandbox-land/discard`,{method:"POST"}),ut.innerHTML=`<p>\u{1F5D1} ${s("sessions.landDiscarded")}</p>`}}catch(xe){ut.innerHTML=`<p>${s("sessions.landUnavailable")}: ${l(String(xe))}</p>`,lt.disabled=!1}});let Yn=a.querySelector("#insight-btn"),ft=a.querySelector("#insight-area");Yn&&ft&&(Yn.onclick=async()=>{Yn.disabled=!0,ft.innerHTML=`<p>${s("sessions.insightLoading")}</p>`;try{let xe=await fetch(`/api/sessions/${encodeURIComponent(d.sessionId)}/insight?detail=spans`),Te=await xe.json().catch(()=>({}));!Te.ok||!Te.report?ft.innerHTML=`<p>${s("sessions.insightUnavailable")}: ${l(String(Te.error??xe.status))}</p>`:ft.innerHTML=Et(Te.report)}catch(xe){ft.innerHTML=`<p>${s("sessions.insightUnavailable")}: ${l(String(xe))}</p>`}Yn.disabled=!1}),a.showModal()}t.addEventListener("click",d=>{let m=d.target;if(m.classList.contains("row-select")){let T=m.closest("tr[data-id]");if(!T)return;m.checked?B.add(T.dataset.id):B.delete(T.dataset.id),Sn(Bt());return}let k=m.closest("td");if(k&&k.querySelector(".row-select"))return;let w=m.closest("tr[data-id]");if(!w)return;let x=ke.sessions.get(w.dataset.id);x&&ks(x)}),L.addEventListener("click",d=>{let m=d.target,k=m.closest("button[data-move-col]");if(k){Vt(k.dataset.moveCol,Number(k.dataset.dir));return}let w=m.closest(".session-card[data-id]");if(!w)return;let x=ke.sessions.get(w.dataset.id);if(!x)return;let T=m.closest("button[data-action]");if(T){let F=T.dataset.action;F==="details"?ks(x):F==="write-link"?kl(x,T):F==="locate"?En(x,T):F==="restart"?Tn(x,T):F==="lock"?cn(x,!x.locked,T):F==="close"&>(x,T).then(W=>{W&&(B.delete(x.sessionId),ye())});return}m.closest("a, button, input, label")||(B.has(x.sessionId)?B.delete(x.sessionId):B.add(x.sessionId),w.classList.toggle("selected",B.has(x.sessionId)),w.setAttribute("aria-pressed",String(B.has(x.sessionId))),Sn(Bt().filter(F=>F.status!=="closed")))}),L.addEventListener("dragstart",d=>{let k=d.target.closest(".session-board-column > header[draggable]")?.closest(".session-board-column");k?.dataset.col&&(z=k.dataset.col,k.classList.add("dragging"),d.dataTransfer&&(d.dataTransfer.effectAllowed="move",d.dataTransfer.setData("text/plain",z)))}),L.addEventListener("dragover",d=>{if(!z)return;d.preventDefault(),d.dataTransfer&&(d.dataTransfer.dropEffect="move");let m=d.target.closest(".session-board-column");L.querySelectorAll(".drag-over").forEach(k=>k.classList.remove("drag-over")),m&&m.dataset.col!==z&&m.classList.add("drag-over")}),L.addEventListener("drop",d=>{if(!z)return;d.preventDefault();let m=d.target.closest(".session-board-column"),k=z;z=null,m?.dataset.col&&$t(k,m.dataset.col)}),L.addEventListener("dragend",()=>{z=null,L.querySelectorAll(".drag-over, .dragging").forEach(d=>d.classList.remove("drag-over","dragging"))}),O.forEach(d=>{d.addEventListener("click",()=>{let m=ma(d.dataset.view)??"board";m!==G&&(G=m,jr(window.localStorage,G),ye())})}),q.querySelectorAll("[data-groupby]").forEach(d=>{d.addEventListener("click",()=>{let m=d.dataset.groupby,k=m==="bot"?"bot":m==="team"?"team":"flow";k!==se&&(se=k,Gr(window.localStorage,k),E="",ye())})}),I.addEventListener("change",()=>{$e=I.value;try{window.localStorage.setItem(ga,$e)}catch{}E="",ye()});function Y(){he!==null&&(clearTimeout(he),he=null)}C.addEventListener("click",d=>{let m=d.target,k=m.closest(".kanban-card[data-id]");if(!k)return;let w=ke.sessions.get(k.dataset.id);if(!w)return;let x=m.closest("button[data-action]");if(x){x.dataset.action==="details"?ks(w):x.dataset.action==="rename"?oe(k,w):x.dataset.action==="history"?te(w):x.dataset.action==="restart"?Tn(w,x):x.dataset.action==="lock"&&cn(w,!w.locked,x);return}m.closest("a, button, input, label")||(Y(),he=setTimeout(()=>{he=null,ge(w)},220))}),C.addEventListener("dblclick",d=>{let m=d.target,k=m.closest(".kanban-card-title"),w=m.closest(".kanban-card[data-id]");if(!k||!w)return;Y();let x=ke.sessions.get(w.dataset.id);x&&oe(w,x)}),C.addEventListener("keydown",d=>{if(d.key!=="Enter"&&d.key!==" ")return;let m=d.target;if(!m.classList?.contains("kanban-card"))return;d.preventDefault();let k=ke.sessions.get(m.dataset.id);k&&ge(k)}),C.addEventListener("dragstart",d=>{if(se==="bot")return;let m=d.target,k=m.closest(".kanban-cluster > header[draggable]");if(k){let x=k.closest(".kanban-cluster"),T=x.closest(".kanban-column")?.dataset.col;if(!x.dataset.chat||!T)return;Y(),ie=x.dataset.chat,me=T,x.classList.add("dragging"),d.dataTransfer&&(d.dataTransfer.effectAllowed="move",d.dataTransfer.setData("text/plain",`cluster:${ie}`));return}let w=m.closest(".kanban-card[data-id]");w&&(Y(),ee=w.dataset.id,w.classList.add("dragging"),d.dataTransfer&&(d.dataTransfer.effectAllowed="move",d.dataTransfer.setData("text/plain",ee)))}),C.addEventListener("dragover",d=>{if(!ee&&!ie)return;d.preventDefault(),d.dataTransfer&&(d.dataTransfer.dropEffect="move");let m=d.target.closest(".kanban-column");C.querySelectorAll(".drag-over").forEach(k=>k.classList.remove("drag-over")),C.querySelectorAll(".drop-before").forEach(k=>k.classList.remove("drop-before")),m&&(m.classList.add("drag-over"),ue(m,d.clientY)?.classList.add("drop-before"))}),C.addEventListener("drop",d=>{let m=ie,k=me,w=ee;if(!w&&!m)return;d.preventDefault(),ee=null,ie=null,me=null,J();let x=d.target.closest(".kanban-column"),T=x?.dataset.col;if(!x||!T)return;let F=ue(x,d.clientY);if(m&&k){let ft=(ae.get(k)??[]).filter(qe=>String(qe.chatId)===m).filter(qe=>!(qe.status==="closed"&&T!=="done"));if(!ft.length)return;let xe=new Set(ft.map(qe=>qe.sessionId)),Te=(ae.get(T)??[]).filter(qe=>!xe.has(qe.sessionId)),Jt=F?Te.findIndex(qe=>qe.sessionId===F.dataset.id):Te.length;Jt<0&&(Jt=Te.length);let eo=Jt>0?Te[Jt-1]:null,$s=Jt<Te.length?Te[Jt]:null,to=Ta(eo?Ln(eo):null,$s?Ln($s):null);ft.forEach((qe,dn)=>{let ca=to+dn*.001;if(se==="team")ot(String(qe.sessionId),T,ca);else{let $d={column:qe.kanbanColumn,position:qe.kanbanPosition};qe.kanbanColumn=T,qe.kanbanPosition=ca,Rt(qe,T,ca,$d)}}),E="",ye();return}let W=ke.sessions.get(w)??kt.get(w);if(!W||W.status==="closed"&&T!=="done")return;let ne=(ae.get(T)??[]).filter(ft=>ft.sessionId!==w),de=F?ne.findIndex(ft=>ft.sessionId===F.dataset.id):ne.length;de<0&&(de=ne.length);let Ne=de>0?ne[de-1]:null,lt=de<ne.length?ne[de]:null,ut=Ta(Ne?Ln(Ne):null,lt?Ln(lt):null);if(se==="team"){ot(String(W.sessionId),T,ut),E="",ye();return}let Yn={column:W.kanbanColumn,position:W.kanbanPosition};W.kanbanColumn=T,W.kanbanPosition=ut,E="",ye(),Rt(W,T,ut,Yn)}),C.addEventListener("dragend",()=>{ee=null,ie=null,me=null,J(),E="",ye()}),P.addEventListener("click",d=>{d.target===P&&P.close()}),P.addEventListener("close",()=>{P.innerHTML=""}),H.addEventListener("click",d=>{d.target===H&&H.close()}),H.addEventListener("close",()=>{H.innerHTML=""}),o.addEventListener("change",()=>{let d=Bt().filter(m=>m.status!=="closed");for(let m of d)o.checked?B.add(m.sessionId):B.delete(m.sessionId);ye()}),f.addEventListener("click",()=>{B.clear(),ye()}),p.addEventListener("click",async()=>{let d=[...B];if(d.length===0||!confirm(s("sessions.closeBulkConfirm",{count:d.length})))return;p.disabled=!0,f.disabled=!0;let m=p.textContent,k=0,w=0,x=[...d];p.textContent=`0/${d.length}`;async function T(){for(;x.length;){let F=x.shift();try{let W=await fetch(`/api/sessions/${encodeURIComponent(F)}/close`,{method:"POST"}),ne=await W.json().catch(()=>({}));(!W.ok||ne?.ok===!1)&&(w+=1)}catch{w+=1}finally{k+=1,p.textContent=`${k}/${d.length}`}}}await Promise.all(Array.from({length:Math.min(6,d.length)},()=>T())),p.textContent=m,p.disabled=!1,f.disabled=!1,B.clear(),ye(),w>0&&alert(`Failed: ${w}/${d.length}`)});async function Q(d){let m=[...B].map(ne=>ke.sessions.get(ne)).filter(ne=>!!ne&&ne.status!=="closed"&&!!ne.locked!==d);if(m.length===0)return;u.disabled=!0,c.disabled=!0;let k=d?u.textContent:c.textContent,w=d?u:c,x=0,T=0,F=[...m];w.textContent=`0/${m.length}`;async function W(){for(;F.length;){let ne=F.shift(),de=!!ne.locked;try{let Ne=await fetch(`/api/sessions/${encodeURIComponent(ne.sessionId)}/lock`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locked:d})}),lt=await Ne.json().catch(()=>({}));!Ne.ok||lt?.ok===!1?(T+=1,ne.locked=de):ne.locked=!!lt.locked}catch{T+=1,ne.locked=de}finally{x+=1,w.textContent=`${x}/${m.length}`}}}await Promise.all(Array.from({length:Math.min(6,m.length)},()=>W())),w.textContent=k,Kt(),ye(),T>0&&alert(`${s("sessions.lockFailed")}: ${T}/${m.length}`)}u.addEventListener("click",()=>{Q(!0)}),c.addEventListener("click",()=>{Q(!1)}),y.addEventListener("click",d=>{if(Pe)return;let m=d.target?.closest("button[data-hours]");if(!m)return;let k=Ca(m.dataset.hours);!k||k===Ge||(Ge=k,M.textContent="",tt())}),g.addEventListener("click",async()=>{let d=it(),m=K();if(m.length===0)return;let k=He(d);if(confirm(s("sessions.idleCleanupConfirm",{count:m.length,threshold:k}))){Pe=!0,g.disabled=!0,M.textContent=s("sessions.idleCleanupRunning");try{let w=await fetch("/api/sessions/cleanup-idle",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({olderThanHours:d,sessionIds:m.map(T=>T.sessionId)})}),x=await w.json().catch(()=>({}));if(!w.ok){w.status!==401&&alert(`${s("sessions.idleCleanupFailed")}: ${x?.error??w.status}`),M.textContent="";return}for(let T of x?.results??[])T?.ok&&T?.sessionId&&B.delete(String(T.sessionId));M.textContent=s("sessions.idleCleanupDone",{closed:Number(x?.closed??0),failed:Number(x?.failed??0)}),ye()}catch(w){alert(`${s("sessions.idleCleanupFailed")}: ${w}`),M.textContent=""}finally{Pe=!1,tt()}}}),$.querySelectorAll("th[data-sort]").forEach(d=>{d.addEventListener("click",()=>{let m=d.dataset.sort;V===m?Z=Z==="asc"?"desc":"asc":(V=m,Z=m==="spawnedAt"||m==="lastMessageAt"?"desc":"asc"),ye()})}),n.addEventListener("input",ye),ke.on(ye);let X=setInterval(()=>{if(!document.body.contains(C)){clearInterval(X);return}G==="kanban"&&se==="team"&&(E="",ye())},3e4);ye(),bt().then(ye)}function Tp(){return`<section class="page">
|
|
451
451
|
<div class="page-heading">
|
|
452
452
|
<div>
|
|
453
453
|
<p class="eyebrow">${s("nav.schedules")}</p>
|
|
@@ -664,7 +664,7 @@ effects={effects}, activities={activities}, waits={waits}, cancels={cancels}`,"w
|
|
|
664
664
|
<button type="button" id="g-save-profile-cancel">${s("groups.cancel")}</button>
|
|
665
665
|
</div>
|
|
666
666
|
</form>
|
|
667
|
-
</article>`,i.showModal();let b=i.querySelector("#g-save-profile-form"),S=[...i.querySelectorAll("[data-profile-mode-row]")],E=i.querySelector("[data-save-profile-status]"),U=b.querySelector("button[type=submit]"),ee=[...b.querySelectorAll("[data-save-profile-mode]")],pe=[...b.querySelectorAll("[data-profile-id]")],he=b.querySelector("input[name=profileId]"),ae=b.querySelector("[data-save-profile-target]"),se=b.querySelector("[data-save-profile-target-mode]"),ie="new",me=R[0]?.profileId??"";function be(){return ie==="overwrite"?me:he.value.trim()}function Me(){for(let le of S)le.hidden=le.dataset.profileModeRow!==ie;for(let le of ee){let ve=le.dataset.saveProfileMode===ie;le.classList.toggle("active",ve),le.setAttribute("aria-pressed",String(ve))}for(let le of pe){let ve=le.dataset.profileId===me;le.classList.toggle("selected",ve),le.setAttribute("aria-pressed",String(ve))}U.textContent=ie==="overwrite"?s("groups.saveProfileOverwriteSubmit"):s("groups.saveProfileSubmit"),U.disabled=!j||ie==="overwrite"&&!me,ae.textContent=be()||"-",se.textContent=ie==="overwrite"?s("groups.saveProfileTargetOverwrite"):s("groups.saveProfileTargetNew"),E.textContent="",E.className="g-save-profile-status"}ee.forEach(le=>{le.addEventListener("click",()=>{let ve=le.dataset.saveProfileMode==="overwrite"?"overwrite":"new";ve==="overwrite"&&!V||(ie=ve,Me())})}),pe.forEach(le=>{le.addEventListener("click",()=>{me=le.dataset.profileId??"",ie="overwrite",Me()})}),he.addEventListener("input",Me),Me(),i.querySelector("#g-save-profile-cancel").onclick=()=>i.close(),b.onsubmit=async le=>{if(le.preventDefault(),!j)return;let ve=be();if(!Al(ve)){E.textContent=s("groups.saveProfileInvalid"),E.className="g-save-profile-status error";return}U.disabled=!0,U.textContent=s("groups.saveProfileSaving"),E.textContent=s("groups.saveProfileSaving"),E.className="g-save-profile-status";try{let Pe=(await Promise.all(O.map(async
|
|
667
|
+
</article>`,i.showModal();let b=i.querySelector("#g-save-profile-form"),S=[...i.querySelectorAll("[data-profile-mode-row]")],E=i.querySelector("[data-save-profile-status]"),U=b.querySelector("button[type=submit]"),ee=[...b.querySelectorAll("[data-save-profile-mode]")],pe=[...b.querySelectorAll("[data-profile-id]")],he=b.querySelector("input[name=profileId]"),ae=b.querySelector("[data-save-profile-target]"),se=b.querySelector("[data-save-profile-target-mode]"),ie="new",me=R[0]?.profileId??"";function be(){return ie==="overwrite"?me:he.value.trim()}function Me(){for(let le of S)le.hidden=le.dataset.profileModeRow!==ie;for(let le of ee){let ve=le.dataset.saveProfileMode===ie;le.classList.toggle("active",ve),le.setAttribute("aria-pressed",String(ve))}for(let le of pe){let ve=le.dataset.profileId===me;le.classList.toggle("selected",ve),le.setAttribute("aria-pressed",String(ve))}U.textContent=ie==="overwrite"?s("groups.saveProfileOverwriteSubmit"):s("groups.saveProfileSubmit"),U.disabled=!j||ie==="overwrite"&&!me,ae.textContent=be()||"-",se.textContent=ie==="overwrite"?s("groups.saveProfileTargetOverwrite"):s("groups.saveProfileTargetNew"),E.textContent="",E.className="g-save-profile-status"}ee.forEach(le=>{le.addEventListener("click",()=>{let ve=le.dataset.saveProfileMode==="overwrite"?"overwrite":"new";ve==="overwrite"&&!V||(ie=ve,Me())})}),pe.forEach(le=>{le.addEventListener("click",()=>{me=le.dataset.profileId??"",ie="overwrite",Me()})}),he.addEventListener("input",Me),Me(),i.querySelector("#g-save-profile-cancel").onclick=()=>i.close(),b.onsubmit=async le=>{if(le.preventDefault(),!j)return;let ve=be();if(!Al(ve)){E.textContent=s("groups.saveProfileInvalid"),E.className="g-save-profile-status error";return}U.disabled=!0,U.textContent=s("groups.saveProfileSaving"),E.textContent=s("groups.saveProfileSaving"),E.className="g-save-profile-status";try{let Pe=(await Promise.all(O.map(async Ge=>(await fetch(`/api/role-profiles/${encodeURIComponent(ve)}/${encodeURIComponent(Ge.larkAppId)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:Ge.content,allowEmpty:!0})})).ok))).filter(Boolean).length;if(Pe!==O.length){E.textContent=s("groups.saveProfileFailed",{saved:Pe,total:O.length}),E.className="g-save-profile-status error",U.disabled=!1,U.textContent=ie==="overwrite"?s("groups.saveProfileOverwriteSubmit"):s("groups.saveProfileSubmit");return}E.textContent=s("groups.saveProfileDone",{name:ve,count:Pe}),E.className="g-save-profile-status ok",await p(),setTimeout(()=>i.close(),700)}catch($e){E.textContent=String($e),E.className="g-save-profile-status error",U.disabled=!1,U.textContent=ie==="overwrite"?s("groups.saveProfileOverwriteSubmit"):s("groups.saveProfileSubmit")}}}n.addEventListener("click",async I=>{let N=I.target.closest("button.manage-chat");if(!N)return;let A=N.closest("tr[data-chat]").dataset.chat,R=st.chats.find(B=>B.chatId===A);R&&q(R)});function q(I){let N=I.memberBots.filter(A=>A.inChat),O=typeof I.ownerId=="string"?I.ownerId:"";i.innerHTML=`
|
|
668
668
|
<article>
|
|
669
669
|
<header><h3>${s("groups.manageTitle",{name:I.name??I.chatId})}</h3></header>
|
|
670
670
|
<p><b>chatId:</b> <code>${l(I.chatId)}</code></p>
|
|
@@ -714,7 +714,7 @@ effects={effects}, activities={activities}, waits={waits}, cancels={cancels}`,"w
|
|
|
714
714
|
${R.join(`
|
|
715
715
|
`)}
|
|
716
716
|
|
|
717
|
-
\u5EFA\u8BAE\u6539\u7528\u300C\u9000\u51FA\u7FA4\u804A\u300D\u3002`)}}a.addEventListener("input",L)}var
|
|
717
|
+
\u5EFA\u8BAE\u6539\u7528\u300C\u9000\u51FA\u7FA4\u804A\u300D\u3002`)}}a.addEventListener("input",L)}var We={bots:[]},ns=null,Pa=[{id:"claude-code",label:"Claude"},{id:"codex",label:"Codex"},{id:"traex",label:"traex"}],Hl=!1,bo="glm-5.1",Ba=[],es=null;function Ra(e,t){return typeof e?.cliId=="string"&&e.cliId?e.cliId:t}var ts=new Map;function _l(e){let t=null;for(let n of ke.sessions.values())n.larkAppId!==e||!n.cliId||(!t||Number(n.lastMessageAt??0)>Number(t.lastMessageAt??0))&&(t=n);return t?.cliId??""}async function Rl(){if(!Hl){Hl=!0;try{let e=await fetch("/api/cli-options"),t=await e.json().catch(()=>({}));e.ok&&Array.isArray(t?.options)&&(Pa=t.options.filter(n=>n&&typeof n.id=="string"&&typeof n.label=="string"),typeof t.ttadkModelDefault=="string"&&t.ttadkModelDefault.trim()&&(bo=t.ttadkModelDefault.trim()),Array.isArray(t.ttadkModelSuggestions)&&(Ba=t.ttadkModelSuggestions.filter(n=>typeof n=="string")))}catch{}}}function Rp(e,t){let n=typeof e?.agentSelectionKey=="string"&&e.agentSelectionKey?e.agentSelectionKey:"";return n||Ra(e,t)||"claude-code"}function yo(e){return Pa.find(t=>t.id===e)}function Pp(e){return e?.gateway==="ttadk"&&e.acceptsModel!==!1?Ba:[]}function Bp(e,t){let n=Rp(e,t),a=Pa.map(u=>`<option value="${l(u.id)}" ${u.id===n?"selected":""}>${l(u.label)}\uFF08${l(u.id)}\uFF09</option>`).join(""),o=typeof e?.model=="string"?e.model:"",i=Pp(yo(n)),r=yo(n)?.gateway==="ttadk"&&yo(n)?.acceptsModel===!1;return`<section class="bd-section">
|
|
718
718
|
<h3 class="bd-section-title">${s("botDefaults.sectionAgent")}</h3>
|
|
719
719
|
<div class="bd-row">
|
|
720
720
|
<label>
|
|
@@ -754,7 +754,7 @@ ${R.join(`
|
|
|
754
754
|
<aside id="bd-roster" class="bd-roster"></aside>
|
|
755
755
|
<div id="bd-list" class="bd-detail"></div>
|
|
756
756
|
</div>
|
|
757
|
-
</section>`}async function Pl(){try{let e=await fetch("/api/bots"),t=await e.json().catch(()=>({}));if(!e.ok){ns=t?.error?`HTTP ${e.status}: ${t.error}${t.path?` (${t.path})`:""}`:`HTTP ${e.status}`,
|
|
757
|
+
</section>`}async function Pl(){try{let e=await fetch("/api/bots"),t=await e.json().catch(()=>({}));if(!e.ok){ns=t?.error?`HTTP ${e.status}: ${t.error}${t.path?` (${t.path})`:""}`:`HTTP ${e.status}`,We={bots:[]};return}if(!t||!Array.isArray(t.bots)){ns="unexpected response shape (no `bots` array)",We={bots:[]};return}ns=null,We=t}catch(e){ns=e?.message??String(e),We={bots:[]}}}function Bl(e){if(!e)return"\u2014";let t=new Date(e);return Number.isNaN(t.getTime())?"\u2014":t.toLocaleString()}async function Ol(e){e.innerHTML=Op();let t=e.querySelector("#bd-list"),n=e.querySelector("#bd-roster"),a=e.querySelector("#bd-filters"),o=e.querySelector("#bd-refresh");o.onclick=async()=>{o.disabled=!0;try{ts.clear(),await Promise.all([Pl(),Rl()]),i()}finally{o.disabled=!1}},t.addEventListener("click",b=>{let S=b.target.closest(".toggle-tx small, small.bd-help");S&&(b.preventDefault(),S.classList.toggle("open"))}),t.innerHTML=Tt(),await Promise.all([Pl(),Rl()]);function i(){let S=(new FormData(a).get("q")??"").toLowerCase(),E=We.bots.filter(ee=>!S||(ee.botName??"").toLowerCase().includes(S)||(ee.larkAppId??"").toLowerCase().includes(S));if(ns){n.innerHTML="",t.innerHTML=`<p class="hint-warn">\u65E0\u6CD5\u52A0\u8F7D bot \u5217\u8868\uFF1A${l(ns)}<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(E.length===0){n.innerHTML="",t.innerHTML=`<p class="empty">${s("botDefaults.empty")}</p>`;return}(!es||!E.some(ee=>ee.larkAppId===es))&&(es=E[0].larkAppId),n.innerHTML=E.map(r).join(""),n.querySelectorAll(".bd-roster-item").forEach(ee=>{ee.onclick=()=>{es=ee.dataset.appid,i()}});let U=E.find(ee=>ee.larkAppId===es);t.innerHTML=u(U),z()}function r(b){let S=b.botName??b.larkAppId,E=Ra(b,_l(b.larkAppId)),U=b.defaultOncall?.enabled?'<span class="bd-roster-flag">oncall</span>':"";return`<div class="bd-roster-item${b.larkAppId===es?" on":""}" data-appid="${l(b.larkAppId)}" role="button" tabindex="0">
|
|
758
758
|
${Re({name:S,larkAppId:b.larkAppId,size:"sm"})}
|
|
759
759
|
<div class="bd-roster-tx">
|
|
760
760
|
<b>${l(S)}</b>
|
|
@@ -1087,7 +1087,7 @@ ${R.join(`
|
|
|
1087
1087
|
<div class="actions">
|
|
1088
1088
|
<span class="oncall-status" data-auto-start-status></span>
|
|
1089
1089
|
</div>
|
|
1090
|
-
</div>`}function R(b){return t.querySelector(`.bd-card[data-appid="${CSS.escape(b)}"]`)}function B(b,S){let E=b?.querySelector("[data-profile-role-list]");E&&(E.innerHTML=p(S),Z(b,S))}async function V(b,S){let E=ts.get(b);if(E?.loaded||E?.loading){B(S,b);return}E={loaded:!1,loading:!0,items:[]},ts.set(b,E),B(S,b);try{let U=await fetch("/api/role-profiles"),ee=await U.json().catch(()=>({}));if(!U.ok)throw new Error(ee?.error??String(U.status));let pe=Array.isArray(ee.profiles)?ee.profiles:[];E.items=pe.filter(he=>(he.botEntries??[]).some(ae=>ae?.larkAppId===b&&ae?.hasEntry)).map(he=>({profileId:String(he.profileId)})),E.loaded=!0}catch(U){E.error=U?.message??String(U),E.loaded=!0}finally{E.loading=!1,B(R(b),b)}}function Z(b,S){b.querySelectorAll("details.bd-profile-role-entry[data-profile-id]").forEach(E=>{E.addEventListener("toggle",()=>{if(!E.open)return;let U=E.dataset.profileId;U&&G(S,U)})})}async function G(b,S){let U=ts.get(b)?.items.find(ee=>ee.profileId===S);if(!(!U||U.loaded||U.loading)){U.loading=!0,j(b,S);try{let ee=await fetch(`/api/role-profiles/${encodeURIComponent(S)}/${encodeURIComponent(b)}`),pe=await ee.json().catch(()=>({}));if(!ee.ok)throw new Error(pe?.error??String(ee.status));U.content=pe?.hasEntry?String(pe.content??""):"",U.loaded=!0}catch(ee){U.error=ee?.message??String(ee)}finally{U.loading=!1,j(b,S)}}}function j(b,S){let U=ts.get(b)?.items.find(pe=>pe.profileId===S);if(!U)return;let ee=R(b)?.querySelector(`[data-profile-role-body="${CSS.escape(S)}"]`);ee&&(ee.innerHTML=f(U))}function z(){t.querySelectorAll(".bd-card").forEach(b=>{let S=b.dataset.appid;V(S,b);let E=b.querySelector("select[data-input=workingDirMode]"),U=b.querySelector("input[data-input=workingDir]"),ee=b.querySelector("[data-wd-dir-row]"),pe=b.querySelector("button[data-action=save-working-dir]"),he=b.querySelector("[data-status]");if(!E||!U||!pe||!he)return;let ae=b.querySelector("select[data-input=agentCliId]"),se=b.querySelector("input[data-input=agentModel]"),ie=b.querySelector("button[data-action=save-agent]"),me=b.querySelector("[data-agent-status]");function be(){if(!ae||!se)return;let Y=b.querySelector(`#agent-model-suggestions-${CSS.escape(S)}`),Q=yo(ae.value),X=Q?.gateway==="ttadk",d=X&&Q.acceptsModel!==!1;if(X&&!d){Y&&(Y.innerHTML=""),se.value="",se.disabled=!0,se.placeholder=s("botOnboarding.modelTtadkCocoPlaceholder");return}se.disabled=!1,d?(Y&&(Y.innerHTML=Ba.map(m=>`<option value="${l(m)}"></option>`).join("")),se.placeholder=s("botOnboarding.modelTtadkPlaceholder").replace("{model}",bo),se.value.trim()||(se.value=bo)):(Y&&(Y.innerHTML=""),se.placeholder=s("botDefaults.agentModelPlaceholder"),se.value.trim()===bo&&(se.value=""))}ae&&se&&ie&&me&&(ae.addEventListener("change",be),ie.addEventListener("click",async()=>{me.textContent="",me.className="oncall-status",ie.disabled=!0,ae.disabled=!0,se.disabled=!0;try{let Y=await fetch(`/api/bots/${encodeURIComponent(S)}/agent`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({cliId:ae.value,model:se.value})}),Q=await Y.json().catch(()=>({}));if(Y.ok&&Q.ok){me.textContent=`\u2713 ${s("botDefaults.agentSaved")}`,me.classList.add("hint-ok");let X=Ge.bots.find(d=>d.larkAppId===S);X&&(X.cliId=Q.cliId,X.wrapperCli=Q.wrapperCli??null,X.model=Q.model??"",X.agentSelectionKey=Q.selectionKey??ae.value)}else me.textContent=`\u2717 ${Q.error??Y.status}`,me.classList.add("hint-warn-inline")}catch(Y){me.textContent=`\u2717 ${Y?.message??Y}`,me.classList.add("hint-warn-inline")}finally{ie.disabled=!1,ae.disabled=!1,se.disabled=!1,be()}})),E.addEventListener("change",()=>{let Y=E.value==="off";ee&&(ee.hidden=Y),Y||U.focus()}),pe.addEventListener("click",async()=>{he.textContent="",he.className="oncall-status";let Y=E.value,Q=U.value.trim();if(Y!=="off"&&!Q){he.textContent=s("botDefaults.required"),he.classList.add("hint-warn-inline");return}pe.disabled=!0;try{let X=await fetch(`/api/bots/${encodeURIComponent(S)}/working-dir-mode`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({mode:Y,workingDir:Q})}),d=await X.json().catch(()=>({}));if(X.ok&&d.ok){let m=d.resolvedPath?` \u2192 ${d.resolvedPath}`:"";he.textContent=`\u2713 ${s("botDefaults.workingDirSaved")}${m}`,he.classList.add("hint-ok");let k=Ge.bots.find(x=>x.larkAppId===S);k&&(d.defaultOncall&&(k.defaultOncall=d.defaultOncall),k.defaultWorkingDir=d.defaultWorkingDir??null);let w=b.querySelector("[data-oncall-since]");w&&d.defaultOncall?.since!=null&&(w.textContent=`${s("botDefaults.lastEnabled")}: ${Bl(d.defaultOncall.since)}`)}else he.textContent=`\u2717 ${d.error??X.status}`,he.classList.add("hint-warn-inline")}catch(X){he.textContent=`\u2717 ${X?.message??X}`,he.classList.add("hint-warn-inline")}finally{pe.disabled=!1}});let Me=b.querySelector("input[data-input=brandLabel]"),le=b.querySelector("button[data-action=save-brand]"),ve=b.querySelector("button[data-action=reset-brand]"),$e=b.querySelector("[data-brand-status]"),Pe=b.querySelector("[data-brand-state]");async function ze(Y,Q){if($e){$e.textContent="",$e.className="oncall-status",Q.disabled=!0;try{let X=await fetch(`/api/bots/${encodeURIComponent(S)}/brand-label`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({brandLabel:Y})}),d=await X.json().catch(()=>({}));if(X.ok&&d.ok){let m=d.brandLabel??null;$e.textContent="\u2713",$e.classList.add("hint-ok"),Me&&(Me.value=m??""),Pe&&(Pe.textContent=h(m));let k=Ge.bots.find(w=>w.larkAppId===S);k&&(k.brandLabel=m)}else $e.textContent=`\u2717 ${d.error??X.status}`,$e.classList.add("hint-warn-inline")}catch(X){$e.textContent=`\u2717 ${X?.message??X}`,$e.classList.add("hint-warn-inline")}finally{Q.disabled=!1}}}Me&&le&&le.addEventListener("click",()=>ze(Me.value,le)),ve&&ve.addEventListener("click",()=>ze(null,ve));let it=b.querySelector("input[data-action=toggle-disable-streaming]"),He=b.querySelector("input[data-action=toggle-silent-reactions]"),Xe=b.querySelector("input[data-action=toggle-writable-link]"),Ye=b.querySelector("input[data-action=toggle-private-card]"),K=b.querySelector("[data-card-pref-status]"),Ae=b.querySelector("[data-card-pref-moot]");async function fe(Y,Q,X=K){if(X){X.textContent="",X.className="oncall-status",Q.disabled=!0;try{let d=await fetch(`/api/bots/${encodeURIComponent(S)}/card-prefs`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(Y)}),m=await d.json().catch(()=>({}));if(d.ok&&m.ok){X.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,X.classList.add("hint-ok");let k=Ge.bots.find(w=>w.larkAppId===S);k&&(k.disableStreamingCard=m.disableStreamingCard,k.silentTurnReactions=m.silentTurnReactions,k.writableTerminalLinkInCard=m.writableTerminalLinkInCard,k.privateCard=m.privateCard,k.botToBotSameDir=m.botToBotSameDir,k.autoStartOnGroupJoin=m.autoStartOnGroupJoin,k.autoStartOnGroupJoinPrompt=m.autoStartOnGroupJoinPrompt,k.autoStartOnNewTopic=m.autoStartOnNewTopic,k.regularGroupReplyMode=m.regularGroupReplyMode,k.regularGroupMentionMode=m.regularGroupMentionMode,k.docSubscribeDefaultMode=m.docSubscribeDefaultMode)}else X.textContent=`\u2717 ${m.error??d.status}`,X.classList.add("hint-warn-inline")}catch(d){X.textContent=`\u2717 ${d?.message??d}`,X.classList.add("hint-warn-inline")}finally{Q===Xe?Q.disabled=!!it?.checked:Q===He?Q.disabled=!it?.checked:Q.disabled=!1}}}it&&it.addEventListener("change",()=>{let Y=it.checked;Xe&&(Xe.disabled=Y),He&&(He.disabled=!Y),Ae&&(Ae.hidden=!Y),fe({disableStreamingCard:Y},it)}),He&&He.addEventListener("change",()=>{fe({silentTurnReactions:He.checked},He)}),Xe&&Xe.addEventListener("change",()=>{fe({writableTerminalLinkInCard:Xe.checked},Xe)}),Ye&&Ye.addEventListener("change",()=>{fe({privateCard:Ye.checked},Ye)});let re=b.querySelector("input[data-action=toggle-cross-bot-samedir]"),Be=b.querySelector("[data-crossbot-status]");re&&re.addEventListener("change",()=>{fe({botToBotSameDir:re.checked},re,Be)});let rt=b.querySelector("input[data-input=summaryLimit]"),wt=b.querySelector("input[data-input=summarySinceHours]"),kt=b.querySelector("button[data-action=save-summary-trigger]"),et=b.querySelector("[data-summary-trigger-status]");function xn(Y,Q){let X=Y.value.trim();return X===""?Q:/^(0|[1-9]\d*)$/.test(X)?Number(X):null}rt&&wt&&kt&&kt.addEventListener("click",async()=>{if(!et)return;et.textContent="",et.className="oncall-status";let Y=xn(rt,50),Q=xn(wt,24);if(Y==null||Q==null){et.textContent=`\u2717 ${s("botDefaults.summaryNumberInvalid")}`,et.classList.add("hint-warn-inline");return}kt.disabled=!0;try{let X=await fetch(`/api/bots/${encodeURIComponent(S)}/summary-range`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({limit:Y,sinceHours:Q})}),d=await X.json().catch(()=>({}));if(X.ok&&d.ok){et.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,et.classList.add("hint-ok");let m=d.summaryRange??{limit:Y,sinceHours:Q};rt.value=String(Number.isInteger(m.limit)&&m.limit>=0?m.limit:Y),wt.value=String(Number.isInteger(m.sinceHours)&&m.sinceHours>=0?m.sinceHours:Q);let k=Ge.bots.find(w=>w.larkAppId===S);k&&(k.summaryRange=m)}else et.textContent=`\u2717 ${d.error??X.status}`,et.classList.add("hint-warn-inline")}catch(X){et.textContent=`\u2717 ${X?.message??X}`,et.classList.add("hint-warn-inline")}finally{kt.disabled=!1}});let ot=b.querySelector("input[data-action=toggle-sandbox]"),Ze=b.querySelector("[data-sandbox-status]");ot&&ot.addEventListener("change",async()=>{let Y=ot.checked;Ze&&(Ze.textContent="",Ze.className="oncall-status"),ot.disabled=!0;try{let Q=await fetch(`/api/bots/${encodeURIComponent(S)}/sandbox`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({enabled:Y})}),X=await Q.json().catch(()=>({}));if(Q.ok&&X.ok){Ze&&(Ze.textContent=`\u2713 ${s("botDefaults.sandboxSaved")}`,Ze.classList.add("hint-ok"));let d=Ge.bots.find(m=>m.larkAppId===S);d&&(d.sandbox=X.sandbox===!0)}else Ze&&(Ze.textContent=`\u2717 ${X.error??Q.status}`,Ze.classList.add("hint-warn-inline")),ot.checked=!Y}catch(Q){Ze&&(Ze.textContent=`\u2717 ${Q?.message??Q}`,Ze.classList.add("hint-warn-inline")),ot.checked=!Y}finally{ot.disabled=!1}});let Vt=b.querySelector("input[data-action=toggle-auto-join]"),$t=b.querySelector("input[data-action=toggle-auto-topic]"),Wn=b.querySelector("textarea[data-input=autoJoinPrompt]"),At=b.querySelector("button[data-action=save-auto-join-prompt]"),xt=b.querySelector("[data-auto-start-status]");Vt&&Vt.addEventListener("change",()=>{fe({autoStartOnGroupJoin:Vt.checked},Vt,xt)}),$t&&$t.addEventListener("change",()=>{fe({autoStartOnNewTopic:$t.checked},$t,xt)}),Wn&&At&&At.addEventListener("click",()=>{fe({autoStartOnGroupJoinPrompt:Wn.value},At,xt)});let Dt=b.querySelector("select[data-input=p2pMode]"),Ee=b.querySelector("[data-p2p-status]");Dt&&Ee&&Dt.addEventListener("change",async()=>{let Y=Dt.value==="chat"?"chat":"thread";Ee.textContent="",Ee.className="oncall-status",Dt.disabled=!0;try{let Q=await fetch(`/api/bots/${encodeURIComponent(S)}/p2p-mode`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({p2pMode:Y})}),X=await Q.json().catch(()=>({}));if(Q.ok&&X.ok){Ee.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,Ee.classList.add("hint-ok");let d=Ge.bots.find(m=>m.larkAppId===S);d&&(d.p2pMode=X.p2pMode==="chat"?"chat":"thread")}else Ee.textContent=`\u2717 ${X.error??Q.status}`,Ee.classList.add("hint-warn-inline")}catch(Q){Ee.textContent=`\u2717 ${Q?.message??Q}`,Ee.classList.add("hint-warn-inline")}finally{Dt.disabled=!1}});let _e=b.querySelector("select[data-input=regularGroupMode]"),Ht=b.querySelector("[data-regular-group-status]");_e&&_e.addEventListener("change",()=>{fe({regularGroupReplyMode:_e.value},_e,Ht)});let dt=b.querySelector("select[data-input=regularGroupMentionMode]"),Vn=b.querySelector("[data-mention-mode-status]");dt&&dt.addEventListener("change",()=>{fe({regularGroupMentionMode:dt.value},dt,Vn)});let _t=b.querySelector("select[data-input=docSubscribeDefaultMode]"),vs=b.querySelector("[data-doc-subscribe-mode-status]");_t&&_t.addEventListener("change",()=>{fe({docSubscribeDefaultMode:_t.value},_t,vs)});let Rt=b.querySelector("textarea[data-input=teamRole]"),St=b.querySelector("button[data-action=save-role]"),Pt=b.querySelector("button[data-action=delete-role]"),_=b.querySelector("[data-role-status]");if(Rt&&St&&Pt&&_){let X=function(m){let k=t.querySelector(`.bd-card[data-appid="${CSS.escape(S)}"]`);if(!k)return;let w=k.querySelector("textarea[data-input=teamRole]"),x=k.querySelector("button[data-action=save-role]"),T=k.querySelector("button[data-action=delete-role]");w&&(w.value=m,w.disabled=!1),x&&(x.disabled=!1),T&&(T.disabled=!1)};var ks=X;let Y=`/api/team/local-bots/${encodeURIComponent(S)}/role`,Q=Ge.bots.find(m=>m.larkAppId===S);Q&&typeof Q.teamRole!="string"&&!Q.teamRoleLoading&&(Q.teamRoleLoading=!0,(async()=>{try{let m=await fetch(Y),k=await m.json().catch(()=>({}));m.ok&&k.ok?(Q.teamRole=k.role??"",X(Q.teamRole)):(_.textContent=`\u2717 ${s("botDefaults.roleLoadErr")}: ${k.error??m.status}`,_.classList.add("hint-warn-inline"))}catch(m){_.textContent=`\u2717 ${s("botDefaults.roleLoadErr")}: ${m?.message??m}`,_.classList.add("hint-warn-inline")}finally{Q.teamRoleLoading=!1}})());async function d(m,k,w){if(_&&!(!Q||typeof Q.teamRole!="string")){_.textContent="",_.className="oncall-status",St.disabled=!0,Pt.disabled=!0;try{let x=await fetch(Y,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({role:m})}),T=await x.json().catch(()=>({}));x.ok&&T.ok?(Q&&(Q.teamRole=m.trim()),_.textContent=`\u2713 ${w?s("botDefaults.roleDeleted"):s("botDefaults.roleSaved")}`,_.classList.add("hint-ok")):(_.textContent=`\u2717 ${T.error??x.status}`,_.classList.add("hint-warn-inline"))}catch(x){_.textContent=`\u2717 ${x?.message??x}`,_.classList.add("hint-warn-inline")}finally{St.disabled=!1,Pt.disabled=!1}}}St.addEventListener("click",()=>d(Rt.value,St,!1)),Pt.addEventListener("click",()=>{Rt.value="",d("",Pt,!0)})}let te=b.querySelector("input[data-action=toggle-auto-grant-card]"),oe=b.querySelector("input[data-action=toggle-restrict-grant]"),ue=b.querySelector("input[data-input=quotaLimit]"),J=b.querySelector("button[data-action=save-quota]"),ce=b.querySelector("button[data-action=off-quota]"),ge=b.querySelector("[data-grant-status]"),Bt=b.querySelector("[data-quota-state]");async function ln(Y,Q){if(ge){ge.textContent="",ge.className="oncall-status",Q.disabled=!0;try{let X=await fetch(`/api/bots/${encodeURIComponent(S)}/grant-prefs`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(Y)}),d=await X.json().catch(()=>({}));if(X.ok&&d.ok){ge.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,ge.classList.add("hint-ok");let m=typeof d.messageQuotaDefaultLimit=="number"?d.messageQuotaDefaultLimit:null,k=Ge.bots.find(w=>w.larkAppId===S);k&&(k.autoGrantRequestCards=d.autoGrantRequestCards!==!1,k.restrictGrantCommands=d.restrictGrantCommands===!0,k.messageQuotaDefaultLimit=m),Bt&&(Bt.textContent=N(m)),ue&&"messageQuotaDefaultLimit"in Y&&(ue.value=m==null?"":String(m))}else ge.textContent=`\u2717 ${d.error??X.status}`,ge.classList.add("hint-warn-inline")}catch(X){ge.textContent=`\u2717 ${X?.message??X}`,ge.classList.add("hint-warn-inline")}finally{Q.disabled=!1}}}te&&te.addEventListener("change",()=>{ln({autoGrantRequestCards:te.checked},te)}),oe&&oe.addEventListener("change",()=>{ln({restrictGrantCommands:oe.checked},oe)}),ue&&J&&J.addEventListener("click",()=>{let Y=ue.value.trim();if(Y===""){ln({messageQuotaDefaultLimit:null},J);return}if(!/^[1-9]\d*$/.test(Y)){ge&&(ge.textContent=`\u2717 ${s("botDefaults.quotaInvalid")}`,ge.className="oncall-status hint-warn-inline");return}ln({messageQuotaDefaultLimit:Number(Y)},J)}),ue&&ce&&ce.addEventListener("click",()=>{ue.value="",ln({messageQuotaDefaultLimit:null},ce)});let un=b.querySelector("input[data-input=maxLiveWorkers]"),Kn=b.querySelector("button[data-action=save-session-cap]"),Sn=b.querySelector("button[data-action=off-session-cap]"),tt=b.querySelector("[data-session-cap-status]"),Xs=b.querySelector("[data-session-cap-state]");async function ws(Y,Q){if(tt){tt.textContent="",tt.className="oncall-status",Q.disabled=!0;try{let X=await fetch(`/api/bots/${encodeURIComponent(S)}/max-live-workers`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({maxLiveWorkers:Y})}),d=await X.json().catch(()=>({}));if(X.ok&&d.ok){tt.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,tt.classList.add("hint-ok");let m=typeof d.maxLiveWorkers=="number"?d.maxLiveWorkers:null,k=Ge.bots.find(w=>w.larkAppId===S);k&&(k.maxLiveWorkers=m),Xs&&(Xs.textContent=L(m)),un&&(un.value=m==null?"":String(m))}else tt.textContent=`\u2717 ${d.error??X.status}`,tt.classList.add("hint-warn-inline")}catch(X){tt.textContent=`\u2717 ${X?.message??X}`,tt.classList.add("hint-warn-inline")}finally{Q.disabled=!1}}}un&&Kn&&Kn.addEventListener("click",()=>{let Y=un.value.trim();if(Y===""){ws(null,Kn);return}if(!/^[1-9]\d*$/.test(Y)){tt&&(tt.textContent=`\u2717 ${s("botDefaults.maxLiveWorkersInvalid")}`,tt.className="oncall-status hint-warn-inline");return}ws(Number(Y),Kn)}),un&&Sn&&Sn.addEventListener("click",()=>{un.value="",ws(null,Sn)});let ye=b.querySelector("textarea[data-input=startupCommands]"),En=b.querySelector("button[data-action=save-startup-commands]"),gt=b.querySelector("[data-startup-commands-status]");ye&&En&&En.addEventListener("click",async()=>{if(gt){gt.textContent="",gt.className="oncall-status",En.disabled=!0;try{let Y=await fetch(`/api/bots/${encodeURIComponent(S)}/startup-commands`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({startupCommands:ye.value})}),Q=await Y.json().catch(()=>({}));if(Y.ok&&Q.ok){gt.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,gt.classList.add("hint-ok");let X=typeof Q.startupCommands=="string"?Q.startupCommands:"";ye.value=X;let d=Ge.bots.find(m=>m.larkAppId===S);d&&(d.startupCommands=X)}else gt.textContent=`\u2717 ${Q.error??Y.status}`,gt.classList.add("hint-warn-inline")}catch(Y){gt.textContent=`\u2717 ${Y?.message??Y}`,gt.classList.add("hint-warn-inline")}finally{En.disabled=!1}}});let Kt=b.querySelector("input[data-input=launchShell]"),cn=b.querySelector("button[data-action=save-launch-shell]"),pt=b.querySelector("[data-launch-shell-status]");Kt&&cn&&cn.addEventListener("click",async()=>{if(pt){pt.textContent="",pt.className="oncall-status",cn.disabled=!0;try{let Y=await fetch(`/api/bots/${encodeURIComponent(S)}/launch-shell`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({launchShell:Kt.value})}),Q=await Y.json().catch(()=>({}));if(Y.ok&&Q.ok){pt.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,pt.classList.add("hint-ok");let X=typeof Q.launchShell=="string"?Q.launchShell:"";Kt.value=X;let d=Ge.bots.find(m=>m.larkAppId===S);d&&(d.launchShell=X)}else pt.textContent=`\u2717 ${Q.error??Y.status}`,pt.classList.add("hint-warn-inline")}catch(Y){pt.textContent=`\u2717 ${Y?.message??Y}`,pt.classList.add("hint-warn-inline")}finally{cn.disabled=!1}}});let Tn=b.querySelector("textarea[data-input=env]"),Jn=b.querySelector("button[data-action=save-env]"),Et=b.querySelector("[data-env-status]");Tn&&Jn&&Jn.addEventListener("click",async()=>{if(Et){Et.textContent="",Et.className="oncall-status",Jn.disabled=!0;try{let Y=await fetch(`/api/bots/${encodeURIComponent(S)}/env`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({env:Tn.value})}),Q=await Y.json().catch(()=>({}));if(Y.ok&&Q.ok){Et.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,Et.classList.add("hint-ok");let X=typeof Q.env=="string"?Q.env:"";Tn.value=X;let d=Ge.bots.find(m=>m.larkAppId===S);d&&(d.env=X)}else Et.textContent=`\u2717 ${Q.error??Y.status}`,Et.classList.add("hint-warn-inline")}catch(Y){Et.textContent=`\u2717 ${Y?.message??Y}`,Et.classList.add("hint-warn-inline")}finally{Jn.disabled=!1}}})})}i(),bt().then(i),a.addEventListener("input",i)}var Le={skills:[],nativeSkillGroups:[],bots:[],trustProjectSkills:"off",delivery:"auto"},wo=null,Fp=2,In=0,vo=null;function Np(){return`<section class="page">
|
|
1090
|
+
</div>`}function R(b){return t.querySelector(`.bd-card[data-appid="${CSS.escape(b)}"]`)}function B(b,S){let E=b?.querySelector("[data-profile-role-list]");E&&(E.innerHTML=p(S),Z(b,S))}async function V(b,S){let E=ts.get(b);if(E?.loaded||E?.loading){B(S,b);return}E={loaded:!1,loading:!0,items:[]},ts.set(b,E),B(S,b);try{let U=await fetch("/api/role-profiles"),ee=await U.json().catch(()=>({}));if(!U.ok)throw new Error(ee?.error??String(U.status));let pe=Array.isArray(ee.profiles)?ee.profiles:[];E.items=pe.filter(he=>(he.botEntries??[]).some(ae=>ae?.larkAppId===b&&ae?.hasEntry)).map(he=>({profileId:String(he.profileId)})),E.loaded=!0}catch(U){E.error=U?.message??String(U),E.loaded=!0}finally{E.loading=!1,B(R(b),b)}}function Z(b,S){b.querySelectorAll("details.bd-profile-role-entry[data-profile-id]").forEach(E=>{E.addEventListener("toggle",()=>{if(!E.open)return;let U=E.dataset.profileId;U&&G(S,U)})})}async function G(b,S){let U=ts.get(b)?.items.find(ee=>ee.profileId===S);if(!(!U||U.loaded||U.loading)){U.loading=!0,j(b,S);try{let ee=await fetch(`/api/role-profiles/${encodeURIComponent(S)}/${encodeURIComponent(b)}`),pe=await ee.json().catch(()=>({}));if(!ee.ok)throw new Error(pe?.error??String(ee.status));U.content=pe?.hasEntry?String(pe.content??""):"",U.loaded=!0}catch(ee){U.error=ee?.message??String(ee)}finally{U.loading=!1,j(b,S)}}}function j(b,S){let U=ts.get(b)?.items.find(pe=>pe.profileId===S);if(!U)return;let ee=R(b)?.querySelector(`[data-profile-role-body="${CSS.escape(S)}"]`);ee&&(ee.innerHTML=f(U))}function z(){t.querySelectorAll(".bd-card").forEach(b=>{let S=b.dataset.appid;V(S,b);let E=b.querySelector("select[data-input=workingDirMode]"),U=b.querySelector("input[data-input=workingDir]"),ee=b.querySelector("[data-wd-dir-row]"),pe=b.querySelector("button[data-action=save-working-dir]"),he=b.querySelector("[data-status]");if(!E||!U||!pe||!he)return;let ae=b.querySelector("select[data-input=agentCliId]"),se=b.querySelector("input[data-input=agentModel]"),ie=b.querySelector("button[data-action=save-agent]"),me=b.querySelector("[data-agent-status]");function be(){if(!ae||!se)return;let Y=b.querySelector(`#agent-model-suggestions-${CSS.escape(S)}`),Q=yo(ae.value),X=Q?.gateway==="ttadk",d=X&&Q.acceptsModel!==!1;if(X&&!d){Y&&(Y.innerHTML=""),se.value="",se.disabled=!0,se.placeholder=s("botOnboarding.modelTtadkCocoPlaceholder");return}se.disabled=!1,d?(Y&&(Y.innerHTML=Ba.map(m=>`<option value="${l(m)}"></option>`).join("")),se.placeholder=s("botOnboarding.modelTtadkPlaceholder").replace("{model}",bo),se.value.trim()||(se.value=bo)):(Y&&(Y.innerHTML=""),se.placeholder=s("botDefaults.agentModelPlaceholder"),se.value.trim()===bo&&(se.value=""))}ae&&se&&ie&&me&&(ae.addEventListener("change",be),ie.addEventListener("click",async()=>{me.textContent="",me.className="oncall-status",ie.disabled=!0,ae.disabled=!0,se.disabled=!0;try{let Y=await fetch(`/api/bots/${encodeURIComponent(S)}/agent`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({cliId:ae.value,model:se.value})}),Q=await Y.json().catch(()=>({}));if(Y.ok&&Q.ok){me.textContent=`\u2713 ${s("botDefaults.agentSaved")}`,me.classList.add("hint-ok");let X=We.bots.find(d=>d.larkAppId===S);X&&(X.cliId=Q.cliId,X.wrapperCli=Q.wrapperCli??null,X.model=Q.model??"",X.agentSelectionKey=Q.selectionKey??ae.value)}else me.textContent=`\u2717 ${Q.error??Y.status}`,me.classList.add("hint-warn-inline")}catch(Y){me.textContent=`\u2717 ${Y?.message??Y}`,me.classList.add("hint-warn-inline")}finally{ie.disabled=!1,ae.disabled=!1,se.disabled=!1,be()}})),E.addEventListener("change",()=>{let Y=E.value==="off";ee&&(ee.hidden=Y),Y||U.focus()}),pe.addEventListener("click",async()=>{he.textContent="",he.className="oncall-status";let Y=E.value,Q=U.value.trim();if(Y!=="off"&&!Q){he.textContent=s("botDefaults.required"),he.classList.add("hint-warn-inline");return}pe.disabled=!0;try{let X=await fetch(`/api/bots/${encodeURIComponent(S)}/working-dir-mode`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({mode:Y,workingDir:Q})}),d=await X.json().catch(()=>({}));if(X.ok&&d.ok){let m=d.resolvedPath?` \u2192 ${d.resolvedPath}`:"";he.textContent=`\u2713 ${s("botDefaults.workingDirSaved")}${m}`,he.classList.add("hint-ok");let k=We.bots.find(x=>x.larkAppId===S);k&&(d.defaultOncall&&(k.defaultOncall=d.defaultOncall),k.defaultWorkingDir=d.defaultWorkingDir??null);let w=b.querySelector("[data-oncall-since]");w&&d.defaultOncall?.since!=null&&(w.textContent=`${s("botDefaults.lastEnabled")}: ${Bl(d.defaultOncall.since)}`)}else he.textContent=`\u2717 ${d.error??X.status}`,he.classList.add("hint-warn-inline")}catch(X){he.textContent=`\u2717 ${X?.message??X}`,he.classList.add("hint-warn-inline")}finally{pe.disabled=!1}});let Me=b.querySelector("input[data-input=brandLabel]"),le=b.querySelector("button[data-action=save-brand]"),ve=b.querySelector("button[data-action=reset-brand]"),$e=b.querySelector("[data-brand-status]"),Pe=b.querySelector("[data-brand-state]");async function Ge(Y,Q){if($e){$e.textContent="",$e.className="oncall-status",Q.disabled=!0;try{let X=await fetch(`/api/bots/${encodeURIComponent(S)}/brand-label`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({brandLabel:Y})}),d=await X.json().catch(()=>({}));if(X.ok&&d.ok){let m=d.brandLabel??null;$e.textContent="\u2713",$e.classList.add("hint-ok"),Me&&(Me.value=m??""),Pe&&(Pe.textContent=h(m));let k=We.bots.find(w=>w.larkAppId===S);k&&(k.brandLabel=m)}else $e.textContent=`\u2717 ${d.error??X.status}`,$e.classList.add("hint-warn-inline")}catch(X){$e.textContent=`\u2717 ${X?.message??X}`,$e.classList.add("hint-warn-inline")}finally{Q.disabled=!1}}}Me&&le&&le.addEventListener("click",()=>Ge(Me.value,le)),ve&&ve.addEventListener("click",()=>Ge(null,ve));let it=b.querySelector("input[data-action=toggle-disable-streaming]"),He=b.querySelector("input[data-action=toggle-silent-reactions]"),Xe=b.querySelector("input[data-action=toggle-writable-link]"),Ye=b.querySelector("input[data-action=toggle-private-card]"),K=b.querySelector("[data-card-pref-status]"),Ae=b.querySelector("[data-card-pref-moot]");async function fe(Y,Q,X=K){if(X){X.textContent="",X.className="oncall-status",Q.disabled=!0;try{let d=await fetch(`/api/bots/${encodeURIComponent(S)}/card-prefs`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(Y)}),m=await d.json().catch(()=>({}));if(d.ok&&m.ok){X.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,X.classList.add("hint-ok");let k=We.bots.find(w=>w.larkAppId===S);k&&(k.disableStreamingCard=m.disableStreamingCard,k.silentTurnReactions=m.silentTurnReactions,k.writableTerminalLinkInCard=m.writableTerminalLinkInCard,k.privateCard=m.privateCard,k.botToBotSameDir=m.botToBotSameDir,k.autoStartOnGroupJoin=m.autoStartOnGroupJoin,k.autoStartOnGroupJoinPrompt=m.autoStartOnGroupJoinPrompt,k.autoStartOnNewTopic=m.autoStartOnNewTopic,k.regularGroupReplyMode=m.regularGroupReplyMode,k.regularGroupMentionMode=m.regularGroupMentionMode,k.docSubscribeDefaultMode=m.docSubscribeDefaultMode)}else X.textContent=`\u2717 ${m.error??d.status}`,X.classList.add("hint-warn-inline")}catch(d){X.textContent=`\u2717 ${d?.message??d}`,X.classList.add("hint-warn-inline")}finally{Q===Xe?Q.disabled=!!it?.checked:Q===He?Q.disabled=!it?.checked:Q.disabled=!1}}}it&&it.addEventListener("change",()=>{let Y=it.checked;Xe&&(Xe.disabled=Y),He&&(He.disabled=!Y),Ae&&(Ae.hidden=!Y),fe({disableStreamingCard:Y},it)}),He&&He.addEventListener("change",()=>{fe({silentTurnReactions:He.checked},He)}),Xe&&Xe.addEventListener("change",()=>{fe({writableTerminalLinkInCard:Xe.checked},Xe)}),Ye&&Ye.addEventListener("change",()=>{fe({privateCard:Ye.checked},Ye)});let re=b.querySelector("input[data-action=toggle-cross-bot-samedir]"),Be=b.querySelector("[data-crossbot-status]");re&&re.addEventListener("change",()=>{fe({botToBotSameDir:re.checked},re,Be)});let rt=b.querySelector("input[data-input=summaryLimit]"),wt=b.querySelector("input[data-input=summarySinceHours]"),kt=b.querySelector("button[data-action=save-summary-trigger]"),et=b.querySelector("[data-summary-trigger-status]");function xn(Y,Q){let X=Y.value.trim();return X===""?Q:/^(0|[1-9]\d*)$/.test(X)?Number(X):null}rt&&wt&&kt&&kt.addEventListener("click",async()=>{if(!et)return;et.textContent="",et.className="oncall-status";let Y=xn(rt,50),Q=xn(wt,24);if(Y==null||Q==null){et.textContent=`\u2717 ${s("botDefaults.summaryNumberInvalid")}`,et.classList.add("hint-warn-inline");return}kt.disabled=!0;try{let X=await fetch(`/api/bots/${encodeURIComponent(S)}/summary-range`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({limit:Y,sinceHours:Q})}),d=await X.json().catch(()=>({}));if(X.ok&&d.ok){et.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,et.classList.add("hint-ok");let m=d.summaryRange??{limit:Y,sinceHours:Q};rt.value=String(Number.isInteger(m.limit)&&m.limit>=0?m.limit:Y),wt.value=String(Number.isInteger(m.sinceHours)&&m.sinceHours>=0?m.sinceHours:Q);let k=We.bots.find(w=>w.larkAppId===S);k&&(k.summaryRange=m)}else et.textContent=`\u2717 ${d.error??X.status}`,et.classList.add("hint-warn-inline")}catch(X){et.textContent=`\u2717 ${X?.message??X}`,et.classList.add("hint-warn-inline")}finally{kt.disabled=!1}});let ot=b.querySelector("input[data-action=toggle-sandbox]"),Ze=b.querySelector("[data-sandbox-status]");ot&&ot.addEventListener("change",async()=>{let Y=ot.checked;Ze&&(Ze.textContent="",Ze.className="oncall-status"),ot.disabled=!0;try{let Q=await fetch(`/api/bots/${encodeURIComponent(S)}/sandbox`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({enabled:Y})}),X=await Q.json().catch(()=>({}));if(Q.ok&&X.ok){Ze&&(Ze.textContent=`\u2713 ${s("botDefaults.sandboxSaved")}`,Ze.classList.add("hint-ok"));let d=We.bots.find(m=>m.larkAppId===S);d&&(d.sandbox=X.sandbox===!0)}else Ze&&(Ze.textContent=`\u2717 ${X.error??Q.status}`,Ze.classList.add("hint-warn-inline")),ot.checked=!Y}catch(Q){Ze&&(Ze.textContent=`\u2717 ${Q?.message??Q}`,Ze.classList.add("hint-warn-inline")),ot.checked=!Y}finally{ot.disabled=!1}});let Vt=b.querySelector("input[data-action=toggle-auto-join]"),$t=b.querySelector("input[data-action=toggle-auto-topic]"),Wn=b.querySelector("textarea[data-input=autoJoinPrompt]"),At=b.querySelector("button[data-action=save-auto-join-prompt]"),xt=b.querySelector("[data-auto-start-status]");Vt&&Vt.addEventListener("change",()=>{fe({autoStartOnGroupJoin:Vt.checked},Vt,xt)}),$t&&$t.addEventListener("change",()=>{fe({autoStartOnNewTopic:$t.checked},$t,xt)}),Wn&&At&&At.addEventListener("click",()=>{fe({autoStartOnGroupJoinPrompt:Wn.value},At,xt)});let Dt=b.querySelector("select[data-input=p2pMode]"),Ee=b.querySelector("[data-p2p-status]");Dt&&Ee&&Dt.addEventListener("change",async()=>{let Y=Dt.value==="chat"?"chat":"thread";Ee.textContent="",Ee.className="oncall-status",Dt.disabled=!0;try{let Q=await fetch(`/api/bots/${encodeURIComponent(S)}/p2p-mode`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({p2pMode:Y})}),X=await Q.json().catch(()=>({}));if(Q.ok&&X.ok){Ee.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,Ee.classList.add("hint-ok");let d=We.bots.find(m=>m.larkAppId===S);d&&(d.p2pMode=X.p2pMode==="chat"?"chat":"thread")}else Ee.textContent=`\u2717 ${X.error??Q.status}`,Ee.classList.add("hint-warn-inline")}catch(Q){Ee.textContent=`\u2717 ${Q?.message??Q}`,Ee.classList.add("hint-warn-inline")}finally{Dt.disabled=!1}});let _e=b.querySelector("select[data-input=regularGroupMode]"),Ht=b.querySelector("[data-regular-group-status]");_e&&_e.addEventListener("change",()=>{fe({regularGroupReplyMode:_e.value},_e,Ht)});let dt=b.querySelector("select[data-input=regularGroupMentionMode]"),Vn=b.querySelector("[data-mention-mode-status]");dt&&dt.addEventListener("change",()=>{fe({regularGroupMentionMode:dt.value},dt,Vn)});let _t=b.querySelector("select[data-input=docSubscribeDefaultMode]"),vs=b.querySelector("[data-doc-subscribe-mode-status]");_t&&_t.addEventListener("change",()=>{fe({docSubscribeDefaultMode:_t.value},_t,vs)});let Rt=b.querySelector("textarea[data-input=teamRole]"),St=b.querySelector("button[data-action=save-role]"),Pt=b.querySelector("button[data-action=delete-role]"),_=b.querySelector("[data-role-status]");if(Rt&&St&&Pt&&_){let X=function(m){let k=t.querySelector(`.bd-card[data-appid="${CSS.escape(S)}"]`);if(!k)return;let w=k.querySelector("textarea[data-input=teamRole]"),x=k.querySelector("button[data-action=save-role]"),T=k.querySelector("button[data-action=delete-role]");w&&(w.value=m,w.disabled=!1),x&&(x.disabled=!1),T&&(T.disabled=!1)};var ks=X;let Y=`/api/team/local-bots/${encodeURIComponent(S)}/role`,Q=We.bots.find(m=>m.larkAppId===S);Q&&typeof Q.teamRole!="string"&&!Q.teamRoleLoading&&(Q.teamRoleLoading=!0,(async()=>{try{let m=await fetch(Y),k=await m.json().catch(()=>({}));m.ok&&k.ok?(Q.teamRole=k.role??"",X(Q.teamRole)):(_.textContent=`\u2717 ${s("botDefaults.roleLoadErr")}: ${k.error??m.status}`,_.classList.add("hint-warn-inline"))}catch(m){_.textContent=`\u2717 ${s("botDefaults.roleLoadErr")}: ${m?.message??m}`,_.classList.add("hint-warn-inline")}finally{Q.teamRoleLoading=!1}})());async function d(m,k,w){if(_&&!(!Q||typeof Q.teamRole!="string")){_.textContent="",_.className="oncall-status",St.disabled=!0,Pt.disabled=!0;try{let x=await fetch(Y,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({role:m})}),T=await x.json().catch(()=>({}));x.ok&&T.ok?(Q&&(Q.teamRole=m.trim()),_.textContent=`\u2713 ${w?s("botDefaults.roleDeleted"):s("botDefaults.roleSaved")}`,_.classList.add("hint-ok")):(_.textContent=`\u2717 ${T.error??x.status}`,_.classList.add("hint-warn-inline"))}catch(x){_.textContent=`\u2717 ${x?.message??x}`,_.classList.add("hint-warn-inline")}finally{St.disabled=!1,Pt.disabled=!1}}}St.addEventListener("click",()=>d(Rt.value,St,!1)),Pt.addEventListener("click",()=>{Rt.value="",d("",Pt,!0)})}let te=b.querySelector("input[data-action=toggle-auto-grant-card]"),oe=b.querySelector("input[data-action=toggle-restrict-grant]"),ue=b.querySelector("input[data-input=quotaLimit]"),J=b.querySelector("button[data-action=save-quota]"),ce=b.querySelector("button[data-action=off-quota]"),ge=b.querySelector("[data-grant-status]"),Bt=b.querySelector("[data-quota-state]");async function ln(Y,Q){if(ge){ge.textContent="",ge.className="oncall-status",Q.disabled=!0;try{let X=await fetch(`/api/bots/${encodeURIComponent(S)}/grant-prefs`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(Y)}),d=await X.json().catch(()=>({}));if(X.ok&&d.ok){ge.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,ge.classList.add("hint-ok");let m=typeof d.messageQuotaDefaultLimit=="number"?d.messageQuotaDefaultLimit:null,k=We.bots.find(w=>w.larkAppId===S);k&&(k.autoGrantRequestCards=d.autoGrantRequestCards!==!1,k.restrictGrantCommands=d.restrictGrantCommands===!0,k.messageQuotaDefaultLimit=m),Bt&&(Bt.textContent=N(m)),ue&&"messageQuotaDefaultLimit"in Y&&(ue.value=m==null?"":String(m))}else ge.textContent=`\u2717 ${d.error??X.status}`,ge.classList.add("hint-warn-inline")}catch(X){ge.textContent=`\u2717 ${X?.message??X}`,ge.classList.add("hint-warn-inline")}finally{Q.disabled=!1}}}te&&te.addEventListener("change",()=>{ln({autoGrantRequestCards:te.checked},te)}),oe&&oe.addEventListener("change",()=>{ln({restrictGrantCommands:oe.checked},oe)}),ue&&J&&J.addEventListener("click",()=>{let Y=ue.value.trim();if(Y===""){ln({messageQuotaDefaultLimit:null},J);return}if(!/^[1-9]\d*$/.test(Y)){ge&&(ge.textContent=`\u2717 ${s("botDefaults.quotaInvalid")}`,ge.className="oncall-status hint-warn-inline");return}ln({messageQuotaDefaultLimit:Number(Y)},J)}),ue&&ce&&ce.addEventListener("click",()=>{ue.value="",ln({messageQuotaDefaultLimit:null},ce)});let un=b.querySelector("input[data-input=maxLiveWorkers]"),Kn=b.querySelector("button[data-action=save-session-cap]"),Sn=b.querySelector("button[data-action=off-session-cap]"),tt=b.querySelector("[data-session-cap-status]"),Xs=b.querySelector("[data-session-cap-state]");async function ws(Y,Q){if(tt){tt.textContent="",tt.className="oncall-status",Q.disabled=!0;try{let X=await fetch(`/api/bots/${encodeURIComponent(S)}/max-live-workers`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({maxLiveWorkers:Y})}),d=await X.json().catch(()=>({}));if(X.ok&&d.ok){tt.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,tt.classList.add("hint-ok");let m=typeof d.maxLiveWorkers=="number"?d.maxLiveWorkers:null,k=We.bots.find(w=>w.larkAppId===S);k&&(k.maxLiveWorkers=m),Xs&&(Xs.textContent=L(m)),un&&(un.value=m==null?"":String(m))}else tt.textContent=`\u2717 ${d.error??X.status}`,tt.classList.add("hint-warn-inline")}catch(X){tt.textContent=`\u2717 ${X?.message??X}`,tt.classList.add("hint-warn-inline")}finally{Q.disabled=!1}}}un&&Kn&&Kn.addEventListener("click",()=>{let Y=un.value.trim();if(Y===""){ws(null,Kn);return}if(!/^[1-9]\d*$/.test(Y)){tt&&(tt.textContent=`\u2717 ${s("botDefaults.maxLiveWorkersInvalid")}`,tt.className="oncall-status hint-warn-inline");return}ws(Number(Y),Kn)}),un&&Sn&&Sn.addEventListener("click",()=>{un.value="",ws(null,Sn)});let ye=b.querySelector("textarea[data-input=startupCommands]"),En=b.querySelector("button[data-action=save-startup-commands]"),gt=b.querySelector("[data-startup-commands-status]");ye&&En&&En.addEventListener("click",async()=>{if(gt){gt.textContent="",gt.className="oncall-status",En.disabled=!0;try{let Y=await fetch(`/api/bots/${encodeURIComponent(S)}/startup-commands`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({startupCommands:ye.value})}),Q=await Y.json().catch(()=>({}));if(Y.ok&&Q.ok){gt.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,gt.classList.add("hint-ok");let X=typeof Q.startupCommands=="string"?Q.startupCommands:"";ye.value=X;let d=We.bots.find(m=>m.larkAppId===S);d&&(d.startupCommands=X)}else gt.textContent=`\u2717 ${Q.error??Y.status}`,gt.classList.add("hint-warn-inline")}catch(Y){gt.textContent=`\u2717 ${Y?.message??Y}`,gt.classList.add("hint-warn-inline")}finally{En.disabled=!1}}});let Kt=b.querySelector("input[data-input=launchShell]"),cn=b.querySelector("button[data-action=save-launch-shell]"),pt=b.querySelector("[data-launch-shell-status]");Kt&&cn&&cn.addEventListener("click",async()=>{if(pt){pt.textContent="",pt.className="oncall-status",cn.disabled=!0;try{let Y=await fetch(`/api/bots/${encodeURIComponent(S)}/launch-shell`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({launchShell:Kt.value})}),Q=await Y.json().catch(()=>({}));if(Y.ok&&Q.ok){pt.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,pt.classList.add("hint-ok");let X=typeof Q.launchShell=="string"?Q.launchShell:"";Kt.value=X;let d=We.bots.find(m=>m.larkAppId===S);d&&(d.launchShell=X)}else pt.textContent=`\u2717 ${Q.error??Y.status}`,pt.classList.add("hint-warn-inline")}catch(Y){pt.textContent=`\u2717 ${Y?.message??Y}`,pt.classList.add("hint-warn-inline")}finally{cn.disabled=!1}}});let Tn=b.querySelector("textarea[data-input=env]"),Jn=b.querySelector("button[data-action=save-env]"),Et=b.querySelector("[data-env-status]");Tn&&Jn&&Jn.addEventListener("click",async()=>{if(Et){Et.textContent="",Et.className="oncall-status",Jn.disabled=!0;try{let Y=await fetch(`/api/bots/${encodeURIComponent(S)}/env`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({env:Tn.value})}),Q=await Y.json().catch(()=>({}));if(Y.ok&&Q.ok){Et.textContent=`\u2713 ${s("botDefaults.cardPrefSaved")}`,Et.classList.add("hint-ok");let X=typeof Q.env=="string"?Q.env:"";Tn.value=X;let d=We.bots.find(m=>m.larkAppId===S);d&&(d.env=X)}else Et.textContent=`\u2717 ${Q.error??Y.status}`,Et.classList.add("hint-warn-inline")}catch(Y){Et.textContent=`\u2717 ${Y?.message??Y}`,Et.classList.add("hint-warn-inline")}finally{Jn.disabled=!1}}})})}i(),bt().then(i),a.addEventListener("input",i)}var Le={skills:[],nativeSkillGroups:[],bots:[],trustProjectSkills:"off",delivery:"auto"},wo=null,Fp=2,In=0,vo=null;function Np(){return`<section class="page">
|
|
1091
1091
|
<div class="page-heading">
|
|
1092
1092
|
<div>
|
|
1093
1093
|
<p class="eyebrow">${s("nav.skills")}</p>
|
|
@@ -1577,7 +1577,7 @@ ${au("manage")}
|
|
|
1577
1577
|
<p class="ok" style="margin:0 0 6px">${s("connectors.createdPrefix",{name:l(n)})}${i==="fixed"&&r.target.chatId?`<span class="muted" style="font-weight:400;font-size:13px"> \xB7 ${s("connectors.createdDest",{name:l(Xa(r.target.chatId))})}</span>`:""}</p>
|
|
1578
1578
|
<p style="margin:4px 0;font-size:13px"><span class="muted">${s("connectors.webhookUrl")}</span><code style="word-break:break-all">${l(h)}</code></p>
|
|
1579
1579
|
${y?`<p style="margin:4px 0;font-size:13px"><span class="muted">${g?s("connectors.tokenLabel"):s("connectors.signLabel")}${s("connectors.secretOnce")}</span><code>${l(y)}</code></p>`:""}
|
|
1580
|
-
${L}</div>`,["cn-name","cn-wf","cn-chat","cn-dedup","cn-secret","cn-instruction"].forEach(C=>{Ie(C).value=""}),Ie("cn-allow-sel").selectedIndex=-1,Bs()}else{let f=p.body?.error||p.status;t.innerHTML=`<span class="err">${s("connectors.createFailed",{error:l(String(f))})}</span>`}},Bs()}var
|
|
1580
|
+
${L}</div>`,["cn-name","cn-wf","cn-chat","cn-dedup","cn-secret","cn-instruction"].forEach(C=>{Ie(C).value=""}),Ie("cn-allow-sel").selectedIndex=-1,Bs()}else{let f=p.body?.error||p.status;t.innerHTML=`<span class="err">${s("connectors.createFailed",{error:l(String(f))})}</span>`}},Bs()}var Ue=null,Fs=null,rs=!0,pu=!1;function fu(e){return{publicReadOnly:e?.publicReadOnly===!0,openTerminalInFeishu:e?.openTerminalInFeishu===!0,chatBotDiscovery:e?.chatBotDiscovery!==!1,repoPickerMode:e?.repoPickerMode==="repos"?"repos":"all",maintenance:e?.maintenance&&typeof e.maintenance=="object"?e.maintenance:{},localDevInstall:e?.localDevInstall===!0,whiteboard:{enabled:e?.whiteboard?.enabled===!0},remoteAccess:e?.remoteAccess===!0}}function jf(e,t){let n=e?.[t]??{};return{enabled:n.enabled===!0,time:typeof n.time=="string"?n.time:"04:00"}}function Uf(){return`<section class="page">
|
|
1581
1581
|
<div class="page-heading">
|
|
1582
1582
|
<div>
|
|
1583
1583
|
<p class="eyebrow">${s("nav.settings")}</p>
|
|
@@ -1587,7 +1587,7 @@ ${au("manage")}
|
|
|
1587
1587
|
</div>
|
|
1588
1588
|
<div id="settings-body"></div>
|
|
1589
1589
|
<div id="update-body"></div>
|
|
1590
|
-
</section>`}function zf(e){let{enabled:t,time:n}=jf(
|
|
1590
|
+
</section>`}function zf(e){let{enabled:t,time:n}=jf(Ue.maintenance,"autoUpdate"),a=e?"disabled":"";return`<label class="toggle-row">
|
|
1591
1591
|
<input type="checkbox" data-maint="autoUpdate" ${t?"checked":""} ${a}>
|
|
1592
1592
|
<span class="switch" aria-hidden="true"></span>
|
|
1593
1593
|
<span class="toggle-tx"><strong>${s("settings.autoUpdate")}</strong>
|
|
@@ -1598,23 +1598,23 @@ ${au("manage")}
|
|
|
1598
1598
|
<input type="time" data-maint-time="autoUpdate" value="${l(n)}" ${a}>
|
|
1599
1599
|
</label>
|
|
1600
1600
|
</div>`}function Gf(e){return`<label class="toggle-row">
|
|
1601
|
-
<input type="checkbox" data-maint="autoRestart" ${
|
|
1601
|
+
<input type="checkbox" data-maint="autoRestart" ${Ue.maintenance.autoRestart?.enabled===!0?"checked":""} ${e?"disabled":""}>
|
|
1602
1602
|
<span class="switch" aria-hidden="true"></span>
|
|
1603
1603
|
<span class="toggle-tx"><strong>${s("settings.autoRestart")}</strong>
|
|
1604
1604
|
<small>${s("settings.autoRestartHelp")}</small></span>
|
|
1605
|
-
</label>`}function Wf(){if(Fs)return`<p class="hint-warn">${s("settings.loadFailed")}: ${l(Fs)}</p>`;if(!
|
|
1605
|
+
</label>`}function Wf(){if(Fs)return`<p class="hint-warn">${s("settings.loadFailed")}: ${l(Fs)}</p>`;if(!Ue)return`<p class="empty">${s("settings.loading")}</p>`;let e=rs?"":"disabled",t=!rs||Ue.localDevInstall;return`<div class="settings-grid">
|
|
1606
1606
|
<article class="bd-card settings-card">
|
|
1607
1607
|
${rs?"":`<p class="hint-warn">${s("settings.readOnlyVisitor")}</p>`}
|
|
1608
1608
|
<section class="bd-section">
|
|
1609
1609
|
<h3 class="bd-section-title">${s("settings.sectionAccess")}</h3>
|
|
1610
1610
|
<label class="toggle-row">
|
|
1611
|
-
<input type="checkbox" data-setting="publicReadOnly" ${
|
|
1611
|
+
<input type="checkbox" data-setting="publicReadOnly" ${Ue.publicReadOnly?"checked":""} ${e}>
|
|
1612
1612
|
<span class="switch" aria-hidden="true"></span>
|
|
1613
1613
|
<span class="toggle-tx"><strong>${s("settings.publicReadOnly")}</strong>
|
|
1614
1614
|
<small>${s("settings.publicReadOnlyHelp")}</small></span>
|
|
1615
1615
|
</label>
|
|
1616
1616
|
${pu?`<label class="toggle-row">
|
|
1617
|
-
<input type="checkbox" data-setting="remoteAccess" ${
|
|
1617
|
+
<input type="checkbox" data-setting="remoteAccess" ${Ue.remoteAccess?"checked":""} ${e}>
|
|
1618
1618
|
<span class="switch" aria-hidden="true"></span>
|
|
1619
1619
|
<span class="toggle-tx"><strong>${s("settings.remoteAccess")}</strong>
|
|
1620
1620
|
<small>${s("settings.remoteAccessHelp")}</small></span>
|
|
@@ -1623,16 +1623,25 @@ ${au("manage")}
|
|
|
1623
1623
|
<section class="bd-section">
|
|
1624
1624
|
<h3 class="bd-section-title">${s("settings.sectionCards")}</h3>
|
|
1625
1625
|
<label class="toggle-row">
|
|
1626
|
-
<input type="checkbox" data-setting="openTerminalInFeishu" ${
|
|
1626
|
+
<input type="checkbox" data-setting="openTerminalInFeishu" ${Ue.openTerminalInFeishu?"checked":""} ${e}>
|
|
1627
1627
|
<span class="switch" aria-hidden="true"></span>
|
|
1628
1628
|
<span class="toggle-tx"><strong>${s("settings.openTerminalInFeishu")}</strong>
|
|
1629
1629
|
<small>${s("settings.openTerminalInFeishuHelp")}</small></span>
|
|
1630
1630
|
</label>
|
|
1631
1631
|
</section>
|
|
1632
|
+
<section class="bd-section">
|
|
1633
|
+
<h3 class="bd-section-title">${s("settings.sectionExperimental")}</h3>
|
|
1634
|
+
<label class="toggle-row">
|
|
1635
|
+
<input type="checkbox" data-setting="chatBotDiscovery" ${Ue.chatBotDiscovery?"checked":""} ${e}>
|
|
1636
|
+
<span class="switch" aria-hidden="true"></span>
|
|
1637
|
+
<span class="toggle-tx"><strong>${s("settings.chatBotDiscovery")}</strong>
|
|
1638
|
+
<small>${s("settings.chatBotDiscoveryHelp")}</small></span>
|
|
1639
|
+
</label>
|
|
1640
|
+
</section>
|
|
1632
1641
|
<section class="bd-section">
|
|
1633
1642
|
<h3 class="bd-section-title">\u672C\u5730\u767D\u677F</h3>
|
|
1634
1643
|
<label class="toggle-row">
|
|
1635
|
-
<input type="checkbox" data-whiteboard-enabled ${
|
|
1644
|
+
<input type="checkbox" data-whiteboard-enabled ${Ue.whiteboard.enabled?"checked":""} ${e}>
|
|
1636
1645
|
<span class="switch" aria-hidden="true"></span>
|
|
1637
1646
|
<span class="toggle-tx"><strong>\u542F\u7528\u9879\u76EE\u767D\u677F</strong>
|
|
1638
1647
|
<small>\u9ED8\u8BA4\u5173\u95ED\u3002\u5F00\u542F\u53EA\u542F\u7528\u80FD\u529B\uFF0C\u4E0D\u4F1A\u7ACB\u5373\u521B\u5EFA\u767D\u677F\uFF1B\u9996\u6B21\u9700\u8981\u65F6\u624D\u6309\u7FA4+\u9879\u76EE ensure\u3002</small></span>
|
|
@@ -1643,8 +1652,8 @@ ${au("manage")}
|
|
|
1643
1652
|
<label class="form-row">
|
|
1644
1653
|
<span>${s("settings.repoPickerMode")}</span>
|
|
1645
1654
|
<select data-select-setting="repoPickerMode" ${e}>
|
|
1646
|
-
<option value="all" ${
|
|
1647
|
-
<option value="repos" ${
|
|
1655
|
+
<option value="all" ${Ue.repoPickerMode==="all"?"selected":""}>${s("settings.repoPickerModeAll")}</option>
|
|
1656
|
+
<option value="repos" ${Ue.repoPickerMode==="repos"?"selected":""}>${s("settings.repoPickerModeRepos")}</option>
|
|
1648
1657
|
</select>
|
|
1649
1658
|
<small>${s("settings.repoPickerModeHelp")}</small>
|
|
1650
1659
|
</label>
|
|
@@ -1652,8 +1661,8 @@ ${au("manage")}
|
|
|
1652
1661
|
<section class="bd-section">
|
|
1653
1662
|
<h3 class="bd-section-title">${s("settings.sectionMaintenance")}</h3>
|
|
1654
1663
|
${zf(t)}
|
|
1655
|
-
${
|
|
1656
|
-
${Gf(!rs||
|
|
1664
|
+
${Ue.localDevInstall?`<p class="hint-warn">${s("settings.autoUpdateLocalDev")}</p>`:""}
|
|
1665
|
+
${Gf(!rs||Ue.maintenance.autoUpdate?.enabled!==!0)}
|
|
1657
1666
|
</section>
|
|
1658
1667
|
<div class="actions settings-actions">
|
|
1659
1668
|
<span class="oncall-status" data-settings-status></span>
|
|
@@ -1677,7 +1686,7 @@ ${au("manage")}
|
|
|
1677
1686
|
</section>
|
|
1678
1687
|
</article>
|
|
1679
1688
|
</div>`}function Jf(e,t){function n(){e.innerHTML=Kf(t),p()}function a(f,h=""){us={text:f,cls:h}}async function o(){try{let f=await fetch("/api/update/status"),h=await f.json().catch(()=>({}));if(!f.ok){_n=null,ls=h?.error??`HTTP ${f.status}`;return}_n=h,ls=null}catch(f){_n=null,ls=f?.message??String(f)}}async function i(){Zt=null,Os=!0,ni=!1,n();try{let f=await fetch("/api/update/changelog"),h=await f.json().catch(()=>({}));si=typeof h?.releasesUrl=="string"?h.releasesUrl:"",f.ok?(Zt=Array.isArray(h.releases)?h.releases:[],Os=h.ok!==!1,ni=h.rateLimited===!0):(Zt=[],Os=!1)}catch{Zt=[],Os=!1}n()}function r(){let f=Date.now(),h=async()=>{if(Date.now()-f>9e4){mt=!1,a(s("update.restartSlow"),"hint-warn-inline"),n();return}try{if((await fetch("/__health",{cache:"no-store"})).ok){location.reload();return}}catch{}setTimeout(()=>{h()},2e3)};setTimeout(()=>{h()},3e3)}async function u(f){mt=!0,a(s("update.restarting")),n();try{await fetch("/api/update/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(f?{update:f}:{})})}catch(h){mt=!1,a(s("update.restartFailed",{detail:h?.message??h}),"hint-warn-inline"),n();return}r()}async function c(){let f=_n;if(!f)return;if(!f.node.ok){window.alert(s("update.nodeTooOldAlert",{version:f.node.version,required:f.node.required}));return}if(f.installs.multiple){let y=f.installs.entries.map(g=>`\u2022 ${g.binPath} (${mu(g.kind)})`).join(`
|
|
1680
|
-
`);if(!window.confirm(s("update.confirmMultiInstall",{paths:y})))return}let h=f.latest?s("update.confirmUpdate",{version:`v${f.latest}`}):s("update.confirmUpdateNoVer");if(window.confirm(h)){mt=!0,a(s("update.updating")),n();try{let y=await fetch("/api/update/run",{method:"POST"}),g=await y.json().catch(()=>({}));if(!y.ok||g.ok===!1){let v=g?.detail??g?.error??`HTTP ${y.status}`;mt=!1,a(s("update.updateFailed",{detail:v}),"hint-warn-inline"),n();return}g.changed?(mt=!1,a(s("update.updatedChanged",{old:`v${g.oldVersion}`,new:`v${g.newVersion}`}),"hint-ok"),n(),window.confirm(s("update.confirmRestart"))?await u({oldVersion:g.oldVersion,newVersion:g.newVersion}):(a(s("update.noRestartHint"),"hint-ok"),n())):(mt=!1,a(s("update.alreadyLatestRun",{version:`v${g.newVersion}`}),"hint-ok"),await o(),n())}catch(y){mt=!1,a(s("update.updateFailed",{detail:y?.message??y}),"hint-warn-inline"),n()}}}function p(){e.querySelectorAll("button[data-up]").forEach(f=>{f.addEventListener("click",()=>{let h=f.dataset.up;h==="check"?(_n=null,Zt=null,Rn=!1,us=null,ls=null,n(),o().then(n)):h==="changelog"?(Rn=!Rn,Rn&&Zt===null?i():n()):h==="update"?c():h==="restart"&&window.confirm(s("update.confirmPlainRestart"))&&u(null)})})}n(),t&&o().then(n)}async function Yf(){try{let e=await fetch("/api/settings"),t=await e.json().catch(()=>({}));if(!e.ok){
|
|
1689
|
+
`);if(!window.confirm(s("update.confirmMultiInstall",{paths:y})))return}let h=f.latest?s("update.confirmUpdate",{version:`v${f.latest}`}):s("update.confirmUpdateNoVer");if(window.confirm(h)){mt=!0,a(s("update.updating")),n();try{let y=await fetch("/api/update/run",{method:"POST"}),g=await y.json().catch(()=>({}));if(!y.ok||g.ok===!1){let v=g?.detail??g?.error??`HTTP ${y.status}`;mt=!1,a(s("update.updateFailed",{detail:v}),"hint-warn-inline"),n();return}g.changed?(mt=!1,a(s("update.updatedChanged",{old:`v${g.oldVersion}`,new:`v${g.newVersion}`}),"hint-ok"),n(),window.confirm(s("update.confirmRestart"))?await u({oldVersion:g.oldVersion,newVersion:g.newVersion}):(a(s("update.noRestartHint"),"hint-ok"),n())):(mt=!1,a(s("update.alreadyLatestRun",{version:`v${g.newVersion}`}),"hint-ok"),await o(),n())}catch(y){mt=!1,a(s("update.updateFailed",{detail:y?.message??y}),"hint-warn-inline"),n()}}}function p(){e.querySelectorAll("button[data-up]").forEach(f=>{f.addEventListener("click",()=>{let h=f.dataset.up;h==="check"?(_n=null,Zt=null,Rn=!1,us=null,ls=null,n(),o().then(n)):h==="changelog"?(Rn=!Rn,Rn&&Zt===null?i():n()):h==="update"?c():h==="restart"&&window.confirm(s("update.confirmPlainRestart"))&&u(null)})})}n(),t&&o().then(n)}async function Yf(){try{let e=await fetch("/api/settings"),t=await e.json().catch(()=>({}));if(!e.ok){Ue=null,Fs=t?.error??`HTTP ${e.status}`;return}Ue=fu(t.settings),rs=t.authed===!0,pu=t.bound===!0,Fs=null}catch(e){Ue=null,Fs=e?.message??String(e)}}async function hu(e){e.innerHTML=Uf();let t=e.querySelector("#settings-body");function n(){t.innerHTML=Wf(),i()}function a(){return t.querySelector("[data-settings-status]")}async function o(u,c,p){if(!Ue)return;p.disabled=!0;let f=a();f&&(f.textContent=s("settings.saving"),f.className="oncall-status");try{let h=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(u)}),y=await h.json().catch(()=>({}));if(!h.ok||y.ok===!1)throw new Error(y?.error??`HTTP ${h.status}`);Ue=fu(y.settings),f&&(f.textContent=s("settings.saved"),f.classList.add("hint-ok"))}catch(h){c(),f&&(f.textContent=`${s("settings.saveFailed")}: ${h?.message??h}`,f.classList.add("hint-warn-inline"))}finally{p.disabled=!1}}function i(){t.querySelectorAll("input[data-setting]").forEach(c=>{c.addEventListener("change",()=>{let p=c.dataset.setting,f=!c.checked;o({[p]:c.checked},()=>{c.checked=f},c)})}),t.querySelector("input[data-whiteboard-enabled]")?.addEventListener("change",c=>{let p=c.currentTarget,f=!p.checked;o({whiteboard:{enabled:p.checked}},()=>{p.checked=f},p)}),t.querySelectorAll("select[data-select-setting]").forEach(c=>{c.addEventListener("change",()=>{let p=c.dataset.selectSetting,f=Ue?.[p]??"all";o({[p]:c.value},()=>{c.value=f},c)})});let u=(c,p,f)=>{let y=t.querySelector(`input[data-maint="${c}"]`)?.checked??!1,g;if(c==="autoUpdate"){let v=t.querySelector('input[data-maint-time="autoUpdate"]');g={enabled:y,time:v?.value||"04:00"}}else g={enabled:y};o({maintenance:{[c]:g}},f,p).then(()=>n())};t.querySelectorAll("input[data-maint]").forEach(c=>{c.addEventListener("change",()=>{let p=c.dataset.maint,f=!c.checked;u(p,c,()=>{c.checked=f})})}),t.querySelectorAll("input[data-maint-time]").forEach(c=>{c.addEventListener("change",()=>{let p=c.dataset.maintTime,f=c.defaultValue;u(p,c,()=>{c.value=f})})})}n(),await Yf(),n(),mt=!1,us=null,Rn=!1;let r=e.querySelector("#update-body");Jf(r,rs)}function gu(e,t,n){e.setAttribute("data-run-id",t),e.setAttribute("data-node-id",n.id);let a=n.webTerminal;if(a?.status==="live"&&a.webPort&&a.webPort>0){Zf(e,a.webPort);return}if(n.hasPtyLog){Qf(e,t,n.id,a?.status==="closed");return}Xf(e,a?.status==="live"?"\u7EC8\u7AEF\u6B63\u5728\u542F\u52A8\uFF0C\u7A0D\u540E\u5237\u65B0":"\u6682\u65E0\u7EC8\u7AEF\u8BB0\u5F55")}function Zf(e,t){let n=em(t);e.innerHTML=`<div class="v3-terminal-panel">
|
|
1681
1690
|
<div class="v3-terminal-head">
|
|
1682
1691
|
<span class="v3-terminal-dot live"></span>
|
|
1683
1692
|
<span>\u5B9E\u65F6\u7EC8\u7AEF\uFF08\u53EA\u8BFB\uFF09</span>
|
|
@@ -1770,7 +1779,7 @@ ${au("manage")}
|
|
|
1770
1779
|
})();
|
|
1771
1780
|
<\/script>
|
|
1772
1781
|
</body>
|
|
1773
|
-
</html>`}function oi(e){return e.replace(/[&<>"']/g,t=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[t])}function Ao(e){return oi(e).replace(/`/g,"`")}function bu(e,t){let n=t?`?${t}`:"";return`#/legacy-workflow/${encodeURIComponent(e)}${n}`}var ku=2e3;function yu(e){return e==="succeeded"||e==="failed"}var Ns={pending:"\u5F85\u673A",gateWaiting:"\u7B49\u5BA1\u6279",running:"\u8FD0\u884C\u4E2D",done:"\u5B8C\u6210",skipped:"\u5DF2\u8DF3\u8FC7",cancelled:"\u5DF2\u53D6\u6D88",blocked:"\u53D7\u963B",superseded:"\u5DF2\u5237\u65B0",failed:"\u5931\u8D25"},nm={exit:"\u2713 \u901A\u8FC7",continue:"\u21BB \u7EE7\u7EED\u8FD4\u5DE5",exhausted:"\u26D4 \u8F6E\u6570\u8017\u5C3D"};function
|
|
1782
|
+
</html>`}function oi(e){return e.replace(/[&<>"']/g,t=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[t])}function Ao(e){return oi(e).replace(/`/g,"`")}function bu(e,t){let n=t?`?${t}`:"";return`#/legacy-workflow/${encodeURIComponent(e)}${n}`}var ku=2e3;function yu(e){return e==="succeeded"||e==="failed"}var Ns={pending:"\u5F85\u673A",gateWaiting:"\u7B49\u5BA1\u6279",running:"\u8FD0\u884C\u4E2D",done:"\u5B8C\u6210",skipped:"\u5DF2\u8DF3\u8FC7",cancelled:"\u5DF2\u53D6\u6D88",blocked:"\u53D7\u963B",superseded:"\u5DF2\u5237\u65B0",failed:"\u5931\u8D25"},nm={exit:"\u2713 \u901A\u8FC7",continue:"\u21BB \u7EE7\u7EED\u8FD4\u5DE5",exhausted:"\u26D4 \u8F6E\u6570\u8017\u5C3D"};function ze(e){return e.replace(/[&<>"']/g,t=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[t])}function sm(e){let t=e.webTerminal;return`${t?.status??"-"}|${t?.webPort??"-"}|${e.hasPtyLog?"1":"0"}`}function $u(e){let t=location.hash.match(/^#\/workflows\/([^?#]+)/);return t?im(e,decodeURIComponent(t[1])):om(e)}function om(e){e.innerHTML=`
|
|
1774
1783
|
<div class="page-head">
|
|
1775
1784
|
<h1>\u5DE5\u4F5C\u6D41</h1>
|
|
1776
1785
|
<p class="muted">LLM \u7F16\u6392\u7684 workflow \u8FD0\u884C \u2014 DAG \u56FE + \u6BCF\u8282\u70B9\u7EC8\u7AEF</p>
|
|
@@ -1780,13 +1789,13 @@ ${au("manage")}
|
|
|
1780
1789
|
<tbody id="v3-tbody"></tbody>
|
|
1781
1790
|
</table>
|
|
1782
1791
|
<div id="v3-empty" class="muted" hidden style="padding:1rem">\u6682\u65E0\u5DE5\u4F5C\u6D41\u8FD0\u884C\uFF08\u7528 <code>/workflow new</code> \u53D1\u8D77\u4E00\u4E2A\uFF09</div>`;let t=e.querySelector("#v3-tbody"),n=e.querySelector("#v3-empty"),a=null,o=!1;async function i(){if(!(o||document.hidden))try{let u=await fetch("/api/v3/runs"),c=u.ok?await u.json():{runs:[]};if(o)return;let p=c.runs??[];n.hidden=p.length>0,t.innerHTML=p.map(f=>`<tr>
|
|
1783
|
-
<td><a class="v3r-runid" href="#/workflows/${encodeURIComponent(f.runId)}">${
|
|
1784
|
-
<td><span class="v3r-pill rs-${
|
|
1792
|
+
<td><a class="v3r-runid" href="#/workflows/${encodeURIComponent(f.runId)}">${ze(f.runId)}</a></td>
|
|
1793
|
+
<td><span class="v3r-pill rs-${ze(f.runStatus)}">${ze(f.runStatus)}</span></td>
|
|
1785
1794
|
<td>${f.nodeCount}</td>
|
|
1786
1795
|
</tr>`).join("")}catch{}}function r(){o||i().then(()=>{o||(a=window.setTimeout(r,ku))})}return r(),()=>{o=!0,a!==null&&window.clearTimeout(a)}}var qs=168,ri=48,Ho=70,vu=226,wu=30,Do=26,am=8;function ai(e){return e.isLoop?Ho:ri}function im(e,t){e.innerHTML=`
|
|
1787
1796
|
<div class="page-head">
|
|
1788
1797
|
<a href="#/workflows" class="btn-link">\u2190 \u5DE5\u4F5C\u6D41</a>
|
|
1789
|
-
<h1 class="v3r-title">${
|
|
1798
|
+
<h1 class="v3r-title">${ze(t)}</h1>
|
|
1790
1799
|
<span id="v3-runstatus" class="v3r-pill"></span>
|
|
1791
1800
|
</div>
|
|
1792
1801
|
<div class="v3r-wrap">
|
|
@@ -1807,10 +1816,10 @@ ${au("manage")}
|
|
|
1807
1816
|
<div id="v3-node-panel" class="v3r-panel">
|
|
1808
1817
|
<p class="muted">\u70B9\u4E00\u4E2A\u8282\u70B9\u770B\u8BE6\u60C5\u4E0E\u7EC8\u7AEF</p>
|
|
1809
1818
|
</div>
|
|
1810
|
-
</div>`;let n=e.querySelector("#v3-graph"),a=e.querySelector("#v3-node-panel"),o=e.querySelector("#v3-runstatus"),i=null,r=!1,u=!1,c=null,p=null,f=null,h=null,y=null,g=!1;function v(O){c=O,y=null,g=!1,p&&q(p),P()}function M(O){y=O,g=!0,P()}function $(O){if(g&&y){let R=O.find(B=>B.id===y);if(R)return R}let A=O.filter(R=>R.status==="running");return A[A.length-1]??O[O.length-1]??null}function L(O,A,R){let z=new Map,b=se=>{if(z.has(se))return z.get(se);z.set(se,0);let ie=O.find(be=>be.id===se)?.depends.filter(be=>O.some(Me=>Me.id===be))??[],me=ie.length?1+Math.max(...ie.map(b)):0;return z.set(se,me),me},S=new Map,E=new Map,U=0;for(let se of O){let ie=b(se.id),me=S.get(ie)??0;S.set(ie,me+1),U=Math.max(U,me),E.set(se.id,{x:6+ie*138,y:6+me*42})}let ee=12+(z.size?Math.max(...z.values())*138+104:0),pe=12+U*42+30,he=[];for(let se of O){let ie=E.get(se.id);for(let me of se.depends){let be=E.get(me);if(!be)continue;let Me=be.x+104,le=be.y+30/2,ve=ie.x,$e=ie.y+30/2,Pe=(Me+ve)/2,
|
|
1819
|
+
</div>`;let n=e.querySelector("#v3-graph"),a=e.querySelector("#v3-node-panel"),o=e.querySelector("#v3-runstatus"),i=null,r=!1,u=!1,c=null,p=null,f=null,h=null,y=null,g=!1;function v(O){c=O,y=null,g=!1,p&&q(p),P()}function M(O){y=O,g=!0,P()}function $(O){if(g&&y){let R=O.find(B=>B.id===y);if(R)return R}let A=O.filter(R=>R.status==="running");return A[A.length-1]??O[O.length-1]??null}function L(O,A,R){let z=new Map,b=se=>{if(z.has(se))return z.get(se);z.set(se,0);let ie=O.find(be=>be.id===se)?.depends.filter(be=>O.some(Me=>Me.id===be))??[],me=ie.length?1+Math.max(...ie.map(b)):0;return z.set(se,me),me},S=new Map,E=new Map,U=0;for(let se of O){let ie=b(se.id),me=S.get(ie)??0;S.set(ie,me+1),U=Math.max(U,me),E.set(se.id,{x:6+ie*138,y:6+me*42})}let ee=12+(z.size?Math.max(...z.values())*138+104:0),pe=12+U*42+30,he=[];for(let se of O){let ie=E.get(se.id);for(let me of se.depends){let be=E.get(me);if(!be)continue;let Me=be.x+104,le=be.y+30/2,ve=ie.x,$e=ie.y+30/2,Pe=(Me+ve)/2,Ge=A.get(se.id)?.status==="running"?" live":"";he.push(`<path class="v3r-edge${Ge}" d="M${Me},${le} C${Pe},${le} ${Pe},${$e} ${ve},${$e}" marker-end="url(#v3arrow-mini)"/>`)}}let ae=O.map(se=>{let ie=E.get(se.id),me=A.get(se.id),be=me?.status??"pending",Me=me?"":" ghost",le=me&&me.id===R?" sel":"",ve=me?` data-sel="${ze(me.id)}"`:"";return`<g class="v3r-node v3r-mini st-${be}${le}${Me}"${ve}${me?' style="cursor:pointer"':""}>
|
|
1811
1820
|
<rect class="v3r-box" x="${ie.x}" y="${ie.y}" width="104" height="30" rx="8"/>
|
|
1812
1821
|
<circle class="v3r-mini-dot" cx="${ie.x+13}" cy="${ie.y+30/2}" r="3.4"/>
|
|
1813
|
-
<text class="v3r-nid" x="${ie.x+24}" y="${ie.y+30/2+4}">${
|
|
1822
|
+
<text class="v3r-nid" x="${ie.x+24}" y="${ie.y+30/2+4}">${ze(ii(se.id,12))}</text>
|
|
1814
1823
|
</g>`});return`<svg class="v3r-mini-svg" width="${ee}" height="${pe}" viewBox="0 0 ${ee} ${pe}">
|
|
1815
1824
|
<defs><marker id="v3arrow-mini" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
|
|
1816
1825
|
<path d="M0,0 L10,5 L0,10 z" fill="var(--faint, #8b98aa)"/></marker></defs>
|
|
@@ -1826,33 +1835,33 @@ ${au("manage")}
|
|
|
1826
1835
|
<span class="num">\u7B2C <b>${R.iteration}</b>${V!==void 0?` / <b>${V}</b>`:""} \u8F6E</span>
|
|
1827
1836
|
${R.granted>0?`<span class="v3r-granted-tag">\u542B\u4EBA\u5DE5\u8FFD\u52A0 +${R.granted}</span>`:""}
|
|
1828
1837
|
${R.lastDecision==="exit"?'<span class="v3r-verdict vd-exit">\u2713 \u5DF2\u6536\u655B</span>':""}
|
|
1829
|
-
</div>`,S=O.status==="blocked"?`<div class="v3r-cta">\u26A0 \u8F6E\u6570\u8017\u5C3D\uFF0C\u7B49\u4EBA\u8FFD\u52A0 \u2014 \u98DE\u4E66\u5361\u7247\u70B9\u300C\u2795 \u8FFD\u52A0 1 \u8F6E\u300D\uFF0C\u6216 <code>botmux workflow grant ${
|
|
1838
|
+
</div>`,S=O.status==="blocked"?`<div class="v3r-cta">\u26A0 \u8F6E\u6570\u8017\u5C3D\uFF0C\u7B49\u4EBA\u8FFD\u52A0 \u2014 \u98DE\u4E66\u5361\u7247\u70B9\u300C\u2795 \u8FFD\u52A0 1 \u8F6E\u300D\uFF0C\u6216 <code>botmux workflow grant ${ze(t)}</code></div>`:"";return`<div class="v3r-loop-sec">${b}<div class="v3r-rounds">${z}</div>${S}</div>`}function P(){let O=p?.nodes.find(j=>j.id===c)??null;if(!O){a.innerHTML='<p class="muted">\u70B9\u4E00\u4E2A\u8282\u70B9\u770B\u8BE6\u60C5\u4E0E\u7EC8\u7AEF</p>',f=null,h=null;return}f!==O.id&&(a.innerHTML=`
|
|
1830
1839
|
<div id="v3-node-meta"></div>
|
|
1831
1840
|
<div id="v3-inst-strip"></div>
|
|
1832
1841
|
<div id="v3-term-slot" class="v3r-term-slot"></div>`,f=O.id,h=null);let A=O,R=null;if(O.isLoop){let j=(p?.nodes??[]).filter(b=>b.loop?.loopId===O.id),z=$(j);A=z,R=z?.id??null,y=R}let B=`<div class="v3r-panel-head">
|
|
1833
1842
|
${O.isLoop?'<span class="v3r-loop-mark">\u27F3</span>':""}
|
|
1834
|
-
<span class="v3r-nodeid">${
|
|
1843
|
+
<span class="v3r-nodeid">${ze(O.id)}</span>
|
|
1835
1844
|
<span class="v3r-pill st-${O.status}"><i class="dot"></i>${Ns[O.status]}</span>
|
|
1836
|
-
</div>`,V=O.errorClass?`<p class="v3r-err">\u539F\u56E0\uFF1A${
|
|
1845
|
+
</div>`,V=O.errorClass?`<p class="v3r-err">\u539F\u56E0\uFF1A${ze(O.errorClass)}${O.errorCode?` (${ze(O.errorCode)})`:""}${O.status==="blocked"&&!O.isLoop?" \u2014 \u98DE\u4E66\u5361\u7247\u6216 <code>botmux workflow retry</code> \u53EF\u91CD\u8BD5":""}</p>`:"";a.querySelector("#v3-node-meta").innerHTML=`
|
|
1837
1846
|
${B}
|
|
1838
|
-
${O.goal?`<p class="v3r-goal">${
|
|
1839
|
-
${O.depends.length?`<p class="v3r-deps">\u4F9D\u8D56 ${O.depends.map(j=>`<span class="v3r-dep">${
|
|
1847
|
+
${O.goal?`<p class="v3r-goal">${ze(O.goal)}</p>`:""}
|
|
1848
|
+
${O.depends.length?`<p class="v3r-deps">\u4F9D\u8D56 ${O.depends.map(j=>`<span class="v3r-dep">${ze(j)}</span>`).join("")}</p>`:""}
|
|
1840
1849
|
${V}${O.isLoop?C(O,R):""}`,a.querySelector("#v3-inst-strip").innerHTML=O.isLoop&&A?`<div class="v3r-inst-strip">
|
|
1841
1850
|
<span class="lbl">\u5B9E\u4F8B\u7EC8\u7AEF</span>
|
|
1842
|
-
<span class="v3r-nodeid sm">${
|
|
1851
|
+
<span class="v3r-nodeid sm">${ze(A.id)}</span>
|
|
1843
1852
|
<span class="v3r-pill st-${A.status}"><i class="dot"></i>${Ns[A.status]}</span>
|
|
1844
|
-
<span class="muted">\u7B2C ${A.loop.iteration} \u8F6E \xB7 ${
|
|
1845
|
-
</div>`:"";for(let j of a.querySelectorAll("#v3-node-meta [data-sel]"))j.addEventListener("click",z=>{z.stopPropagation(),M(j.getAttribute("data-sel"))});let Z=a.querySelector("#v3-term-slot");if(!A){Z.innerHTML="",h=null;return}let G=`${A.id}|${sm(A)}`;G!==h&&(gu(Z,t,A),h=G)}function H(O,A,R,B){let V=O.loopState,Z=V?.maxIterations,G=V&&Z!==void 0?Z+V.granted:void 0,j=V?`${Ns[O.status]} \xB7 \u7B2C${V.iteration}${G!==void 0?`/${G}`:""}\u8F6E`:`${Ns[O.status]} \xB7 loop`,z="";if(V&&G!==void 0&&G<=am){let b=R+Ho-13;for(let S=1;S<=G;S++){let E=A+14+(S-1)*15,U=S<V.iteration?"v3r-dot done":S===V.iteration?`v3r-dot cur${O.status==="running"?" live":""}`:"v3r-dot todo",ee=Z!==void 0&&S>Z?" grant":"";z+=`<circle class="${U}${ee}" cx="${E}" cy="${b}" r="3.6"/>`}V.lastDecision==="exit"?z+=`<text class="v3r-dots-verdict ok" x="${A+14+G*15+4}" y="${b+4}">\u2713</text>`:V.lastDecision==="exhausted"&&O.status==="blocked"&&(z+=`<text class="v3r-dots-verdict warn" x="${A+14+G*15+4}" y="${b+4}">\u26A0</text>`)}return`<g class="v3r-node v3r-loopnode st-${O.status}${B?" sel":""}" data-node="${
|
|
1853
|
+
<span class="muted">\u7B2C ${A.loop.iteration} \u8F6E \xB7 ${ze(A.loop.bodyNodeId)}${g?"":" \xB7 \u81EA\u52A8\u8DDF\u968F"}</span>
|
|
1854
|
+
</div>`:"";for(let j of a.querySelectorAll("#v3-node-meta [data-sel]"))j.addEventListener("click",z=>{z.stopPropagation(),M(j.getAttribute("data-sel"))});let Z=a.querySelector("#v3-term-slot");if(!A){Z.innerHTML="",h=null;return}let G=`${A.id}|${sm(A)}`;G!==h&&(gu(Z,t,A),h=G)}function H(O,A,R,B){let V=O.loopState,Z=V?.maxIterations,G=V&&Z!==void 0?Z+V.granted:void 0,j=V?`${Ns[O.status]} \xB7 \u7B2C${V.iteration}${G!==void 0?`/${G}`:""}\u8F6E`:`${Ns[O.status]} \xB7 loop`,z="";if(V&&G!==void 0&&G<=am){let b=R+Ho-13;for(let S=1;S<=G;S++){let E=A+14+(S-1)*15,U=S<V.iteration?"v3r-dot done":S===V.iteration?`v3r-dot cur${O.status==="running"?" live":""}`:"v3r-dot todo",ee=Z!==void 0&&S>Z?" grant":"";z+=`<circle class="${U}${ee}" cx="${E}" cy="${b}" r="3.6"/>`}V.lastDecision==="exit"?z+=`<text class="v3r-dots-verdict ok" x="${A+14+G*15+4}" y="${b+4}">\u2713</text>`:V.lastDecision==="exhausted"&&O.status==="blocked"&&(z+=`<text class="v3r-dots-verdict warn" x="${A+14+G*15+4}" y="${b+4}">\u26A0</text>`)}return`<g class="v3r-node v3r-loopnode st-${O.status}${B?" sel":""}" data-node="${ze(O.id)}">
|
|
1846
1855
|
<rect class="v3r-cap" x="${A-4}" y="${R-4}" width="${qs+8}" height="${Ho+8}" rx="14"/>
|
|
1847
1856
|
<rect class="v3r-box" x="${A}" y="${R}" width="${qs}" height="${Ho}" rx="10"/>
|
|
1848
1857
|
<text class="v3r-spin" x="${A+14}" y="${R+21}">\u27F3</text>
|
|
1849
|
-
<text class="v3r-nid" x="${A+30}" y="${R+21}">${
|
|
1850
|
-
<text class="v3r-nstatus" x="${A+14}" y="${R+39}">${
|
|
1858
|
+
<text class="v3r-nid" x="${A+30}" y="${R+21}">${ze(ii(O.id,16))}</text>
|
|
1859
|
+
<text class="v3r-nstatus" x="${A+14}" y="${R+39}">${ze(j)}</text>
|
|
1851
1860
|
${z}
|
|
1852
|
-
</g>`}function q(O){let A=O.nodes.filter(S=>!S.loop),R=rm(A),B=new Map;for(let S of A){let E=R.get(S.id)??0;(B.get(E)??B.set(E,[]).get(E)).push(S)}let V=new Map,Z=0;for(let[S,E]of B){let U=Do;for(let ee of E)V.set(ee.id,{x:Do+S*vu,y:U}),U+=ai(ee)+wu;Z=Math.max(Z,U-wu+Do)}let G=Do*2+(B.size===0?0:Math.max(...B.keys())*vu+qs),j=new Map(A.map(S=>[S.id,S])),z=[];for(let S of A){let E=V.get(S.id);if(E)for(let U of S.depends){let ee=V.get(U),pe=j.get(U);if(!ee||!pe)continue;let he=ee.x+qs,ae=ee.y+ai(pe)/2,se=E.x,ie=E.y+ai(S)/2,me=(he+se)/2,be=S.status==="running"?" live":"";z.push(`<path class="v3r-edge${be}" d="M${he},${ae} C${me},${ae} ${me},${ie} ${se},${ie}" marker-end="url(#v3arrow)"/>`)}}let b=A.map(S=>{let E=V.get(S.id),U=S.id===c;return S.isLoop?H(S,E.x,E.y,U):`<g class="v3r-node st-${S.status}${U?" sel":""}" data-node="${
|
|
1861
|
+
</g>`}function q(O){let A=O.nodes.filter(S=>!S.loop),R=rm(A),B=new Map;for(let S of A){let E=R.get(S.id)??0;(B.get(E)??B.set(E,[]).get(E)).push(S)}let V=new Map,Z=0;for(let[S,E]of B){let U=Do;for(let ee of E)V.set(ee.id,{x:Do+S*vu,y:U}),U+=ai(ee)+wu;Z=Math.max(Z,U-wu+Do)}let G=Do*2+(B.size===0?0:Math.max(...B.keys())*vu+qs),j=new Map(A.map(S=>[S.id,S])),z=[];for(let S of A){let E=V.get(S.id);if(E)for(let U of S.depends){let ee=V.get(U),pe=j.get(U);if(!ee||!pe)continue;let he=ee.x+qs,ae=ee.y+ai(pe)/2,se=E.x,ie=E.y+ai(S)/2,me=(he+se)/2,be=S.status==="running"?" live":"";z.push(`<path class="v3r-edge${be}" d="M${he},${ae} C${me},${ae} ${me},${ie} ${se},${ie}" marker-end="url(#v3arrow)"/>`)}}let b=A.map(S=>{let E=V.get(S.id),U=S.id===c;return S.isLoop?H(S,E.x,E.y,U):`<g class="v3r-node st-${S.status}${U?" sel":""}" data-node="${ze(S.id)}">
|
|
1853
1862
|
<rect class="v3r-box" x="${E.x}" y="${E.y}" width="${qs}" height="${ri}" rx="10"/>
|
|
1854
1863
|
<rect class="v3r-bar" x="${E.x}" y="${E.y+8}" width="3" height="${ri-16}" rx="1.5"/>
|
|
1855
|
-
<text class="v3r-nid" x="${E.x+14}" y="${E.y+20}">${
|
|
1864
|
+
<text class="v3r-nid" x="${E.x+14}" y="${E.y+20}">${ze(ii(S.id,18))}</text>
|
|
1856
1865
|
<text class="v3r-nstatus" x="${E.x+14}" y="${E.y+37}">${Ns[S.status]}</text>
|
|
1857
1866
|
</g>`});n.innerHTML=`<svg width="${G}" height="${Z}" viewBox="0 0 ${G} ${Z}" style="display:block">
|
|
1858
1867
|
<defs><marker id="v3arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
@@ -1942,7 +1951,7 @@ ${au("manage")}
|
|
|
1942
1951
|
</div>
|
|
1943
1952
|
<div id="wf-event-meta" class="muted"></div>
|
|
1944
1953
|
</section>
|
|
1945
|
-
`;let a=e.querySelector("#wf-detail-subtitle"),o=e.querySelector("#wf-detail-refresh"),i=e.querySelector("#wf-detail-error"),r=e.querySelector("#wf-cancel-status"),u=e.querySelector("#wf-summary"),c=e.querySelector("#wf-dangling-panel"),p=e.querySelector("#wf-parallel-view"),f=e.querySelector("#wf-parallel-meta"),h=e.querySelector("#wf-node-tbody"),y=e.querySelector("#wf-io-list"),g=e.querySelector(".wf-timeline-scroll"),v=e.querySelector("#wf-event-tbody"),M=e.querySelector("#wf-event-meta"),$=e.querySelector("#wf-cancel-run"),L=e.querySelector("#wf-load-older"),C=null,P=[],H=new Set,q=null,I=null,N=!1,O=0,A=null,R=!1,B=!1,V=!1,Z=new Set,G=new Map,j=new Map,z=new Map,b=new Set,S=new Map,E=new Set,U=new Map,ee=new Map,pe=0,he=n.focusAttemptId;function ae(K){if(!K){i.hidden=!0,i.textContent="";return}i.hidden=!1,i.textContent=K}function se(K){if(!K){r.hidden=!0,r.textContent="";return}r.hidden=!1,r.textContent=K}async function ie(){let K=await fetch(`/api/workflows/runs/${encodeURIComponent(t)}/snapshot`);if(K.status===404)throw new Error(s("workflow.detail.unknownRun"));if(!K.ok)throw new Error(s("workflow.detail.snapshotHttp",{status:K.status}));C=await K.json()}async function me(K){let Ae=await fetch(`/api/workflows/runs/${encodeURIComponent(t)}/events?${K}`);if(Ae.status===404)throw new Error(s("workflow.detail.unknownRun"));if(!Ae.ok)throw new Error(s("workflow.detail.eventsHttp",{status:Ae.status}));return await Ae.json()}function be(K,Ae){let fe=K.filter(re=>H.has(re.eventId)?!1:(H.add(re.eventId),!0));fe.length!==0&&(P=Ae==="prepend"?[...fe,...P]:[...P,...fe],P.sort((re,Be)=>Us(re.eventId)-Us(Be.eventId)))}async function Me(){await ie();let K=await me(new URLSearchParams({tail:"100"}));P=[],H=new Set,be(K.events,"append"),q=K.oldestSeq,I=K.newestSeq,N=K.hasOlder,O=K.totalCount,He()}async function le(){if(!(R||B||document.hidden)){B=!0;try{if(await ie(),I!==null){let K=await me(new URLSearchParams({afterSeq:String(I),limit:"200"}));be(K.events,"append"),K.newestSeq!==null&&(I=K.newestSeq),q===null&&K.oldestSeq!==null&&(q=K.oldestSeq),O=K.totalCount}else{let K=await me(new URLSearchParams({tail:"1"}));be(K.events,"append"),q=K.oldestSeq,I=K.newestSeq,N=K.hasOlder,O=K.totalCount}ae(null),He()}catch(K){ae(K?.message??String(K))}finally{B=!1}}}async function ve(){if(!(q===null||!N)){L.disabled=!0;try{let K=await me(new URLSearchParams({beforeSeq:String(q),limit:"100"}));be(K.events,"prepend"),K.oldestSeq!==null&&(q=K.oldestSeq),N=K.hasOlder,O=K.totalCount,ae(null),He()}catch(K){ae(K?.message??String(K))}finally{L.disabled=!1}}}async function $e(){if(!C||js.has(C.run.status)||V)return;if(!C.chatBinding?.larkAppId){ae(s("workflow.detail.cancelUnavailable",{runId:t}));return}let K=gm(C),Ae=s("workflow.detail.cancelConfirm",{runId:t,...K});if(window.confirm(Ae)){V=!0,$.disabled=!0;try{let fe=await fetch(`/api/workflows/runs/${encodeURIComponent(t)}/cancel`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({reason:"cancelled via dashboard"})});if(fe.status===401)throw new Error(s("workflow.detail.writeAccessCancel"));let re=await fe.json().catch(()=>({}));if(!fe.ok||!re.ok)throw new Error(re.hint??re.error??s("workflow.detail.cancelHttp",{status:fe.status}));se(re.pending?s("workflow.detail.cancelPending"):null),ae(null),await le()}catch(fe){ae(fe?.message??String(fe))}finally{V=!1,$.disabled=!1,He()}}}async function Pe(K,Ae){if(!E.has(K)){E.add(K),U.delete(K),He();try{let fe=await fetch(`/api/workflows/runs/${encodeURIComponent(t)}/attempts/${encodeURIComponent(Ae)}/${encodeURIComponent(K)}/resume`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})});if(fe.status===401)throw new Error(s("workflow.detail.writeAccessResume"));let re=await fe.json().catch(()=>({}));if(!fe.ok||!re.ok||!re.resumeId||!re.url)throw new Error(re.hint??re.message??re.error??s("workflow.detail.resumeStartFailed",{status:fe.status}));S.set(K,{resumeId:re.resumeId,url:re.url})}catch(fe){let re=fe?.message??String(fe);U.set(K,re)}finally{E.delete(K),He()}}}async function
|
|
1954
|
+
`;let a=e.querySelector("#wf-detail-subtitle"),o=e.querySelector("#wf-detail-refresh"),i=e.querySelector("#wf-detail-error"),r=e.querySelector("#wf-cancel-status"),u=e.querySelector("#wf-summary"),c=e.querySelector("#wf-dangling-panel"),p=e.querySelector("#wf-parallel-view"),f=e.querySelector("#wf-parallel-meta"),h=e.querySelector("#wf-node-tbody"),y=e.querySelector("#wf-io-list"),g=e.querySelector(".wf-timeline-scroll"),v=e.querySelector("#wf-event-tbody"),M=e.querySelector("#wf-event-meta"),$=e.querySelector("#wf-cancel-run"),L=e.querySelector("#wf-load-older"),C=null,P=[],H=new Set,q=null,I=null,N=!1,O=0,A=null,R=!1,B=!1,V=!1,Z=new Set,G=new Map,j=new Map,z=new Map,b=new Set,S=new Map,E=new Set,U=new Map,ee=new Map,pe=0,he=n.focusAttemptId;function ae(K){if(!K){i.hidden=!0,i.textContent="";return}i.hidden=!1,i.textContent=K}function se(K){if(!K){r.hidden=!0,r.textContent="";return}r.hidden=!1,r.textContent=K}async function ie(){let K=await fetch(`/api/workflows/runs/${encodeURIComponent(t)}/snapshot`);if(K.status===404)throw new Error(s("workflow.detail.unknownRun"));if(!K.ok)throw new Error(s("workflow.detail.snapshotHttp",{status:K.status}));C=await K.json()}async function me(K){let Ae=await fetch(`/api/workflows/runs/${encodeURIComponent(t)}/events?${K}`);if(Ae.status===404)throw new Error(s("workflow.detail.unknownRun"));if(!Ae.ok)throw new Error(s("workflow.detail.eventsHttp",{status:Ae.status}));return await Ae.json()}function be(K,Ae){let fe=K.filter(re=>H.has(re.eventId)?!1:(H.add(re.eventId),!0));fe.length!==0&&(P=Ae==="prepend"?[...fe,...P]:[...P,...fe],P.sort((re,Be)=>Us(re.eventId)-Us(Be.eventId)))}async function Me(){await ie();let K=await me(new URLSearchParams({tail:"100"}));P=[],H=new Set,be(K.events,"append"),q=K.oldestSeq,I=K.newestSeq,N=K.hasOlder,O=K.totalCount,He()}async function le(){if(!(R||B||document.hidden)){B=!0;try{if(await ie(),I!==null){let K=await me(new URLSearchParams({afterSeq:String(I),limit:"200"}));be(K.events,"append"),K.newestSeq!==null&&(I=K.newestSeq),q===null&&K.oldestSeq!==null&&(q=K.oldestSeq),O=K.totalCount}else{let K=await me(new URLSearchParams({tail:"1"}));be(K.events,"append"),q=K.oldestSeq,I=K.newestSeq,N=K.hasOlder,O=K.totalCount}ae(null),He()}catch(K){ae(K?.message??String(K))}finally{B=!1}}}async function ve(){if(!(q===null||!N)){L.disabled=!0;try{let K=await me(new URLSearchParams({beforeSeq:String(q),limit:"100"}));be(K.events,"prepend"),K.oldestSeq!==null&&(q=K.oldestSeq),N=K.hasOlder,O=K.totalCount,ae(null),He()}catch(K){ae(K?.message??String(K))}finally{L.disabled=!1}}}async function $e(){if(!C||js.has(C.run.status)||V)return;if(!C.chatBinding?.larkAppId){ae(s("workflow.detail.cancelUnavailable",{runId:t}));return}let K=gm(C),Ae=s("workflow.detail.cancelConfirm",{runId:t,...K});if(window.confirm(Ae)){V=!0,$.disabled=!0;try{let fe=await fetch(`/api/workflows/runs/${encodeURIComponent(t)}/cancel`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({reason:"cancelled via dashboard"})});if(fe.status===401)throw new Error(s("workflow.detail.writeAccessCancel"));let re=await fe.json().catch(()=>({}));if(!fe.ok||!re.ok)throw new Error(re.hint??re.error??s("workflow.detail.cancelHttp",{status:fe.status}));se(re.pending?s("workflow.detail.cancelPending"):null),ae(null),await le()}catch(fe){ae(fe?.message??String(fe))}finally{V=!1,$.disabled=!1,He()}}}async function Pe(K,Ae){if(!E.has(K)){E.add(K),U.delete(K),He();try{let fe=await fetch(`/api/workflows/runs/${encodeURIComponent(t)}/attempts/${encodeURIComponent(Ae)}/${encodeURIComponent(K)}/resume`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})});if(fe.status===401)throw new Error(s("workflow.detail.writeAccessResume"));let re=await fe.json().catch(()=>({}));if(!fe.ok||!re.ok||!re.resumeId||!re.url)throw new Error(re.hint??re.message??re.error??s("workflow.detail.resumeStartFailed",{status:fe.status}));S.set(K,{resumeId:re.resumeId,url:re.url})}catch(fe){let re=fe?.message??String(fe);U.set(K,re)}finally{E.delete(K),He()}}}async function Ge(K,Ae){if(!E.has(K)){E.add(K),U.delete(K),He();try{let fe=await fetch(`/api/workflows/runs/${encodeURIComponent(t)}/attempts/${encodeURIComponent(Ae)}/${encodeURIComponent(K)}/resume/end`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({reason:"ended_by_dashboard"})});if(fe.status===401)throw new Error(s("workflow.detail.writeAccessResume"));let re=await fe.json().catch(()=>({}));if(!fe.ok||!re.ok)if(re.error==="resume_not_running")S.delete(K);else throw new Error(re.hint??re.message??re.error??s("workflow.detail.resumeEndFailed",{status:fe.status}));else S.delete(K)}catch(fe){let re=fe?.message??String(fe);U.set(K,re)}finally{E.delete(K),He()}}}async function it(K,Ae){if(!b.has(K)){b.add(K),z.delete(K),He();try{let fe=j.get(K)?.trim()||void 0,re=await fetch(`/api/workflows/runs/${encodeURIComponent(t)}/${Ae}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({comment:fe})});if(re.status===401)throw new Error(s("workflow.detail.writeAccessApproval"));let Be=await re.json().catch(()=>({}));if(!re.ok||!Be.ok)throw new Error(Be.hint??Be.message??Be.error??s("workflow.detail.actionHttp",{action:Ae,status:re.status}));let rt=Ae==="approve"?s("workflow.detail.approved"):s("workflow.detail.rejected");z.set(K,{kind:"ok",text:Be.alreadyTerminal?s("workflow.detail.alreadyTerminal",{label:rt}):Be.pending?s("workflow.detail.workflowContinue",{label:rt}):s("workflow.detail.workflowRefreshing",{label:rt})}),ae(null),await le()}catch(fe){let re=fe?.message??String(fe);z.set(K,{kind:"error",text:re}),ae(re)}finally{b.delete(K),He()}}}function He(){if(!C)return;pe=g.scrollTop;let K=C.run;js.has(K.status)&&se(null),a.innerHTML=`${D(K.workflowId??"?")} \xB7 ${Qt(K.status)} \xB7 lastSeq ${C.lastSeq}`,o.textContent=s("workflow.detail.refreshed",{time:new Date().toLocaleTimeString()}),$.hidden=js.has(K.status),$.disabled=V||!C.chatBinding?.larkAppId,$.textContent=C.chatBinding?.larkAppId?s("workflow.detail.cancel"):s("workflow.detail.cliCancelOnly"),$.title=C.chatBinding?.larkAppId?s("workflow.detail.cancelTitle"):s("workflow.detail.cliCancelTitle",{runId:t}),mm(u,C),bm(c,C),ym(p,f,C,P),Sm(h,C),Em(y,C,Z,G,{comments:j,statuses:z,resolving:b,onResolve:it},{sessions:S,pending:E,errors:U,onStart:Pe,onEnd:Ge},he,ee)&&(he=void 0),Zm(v,P),g.scrollTop=pe,L.hidden=!N,M.textContent=s("workflow.detail.eventsLoaded",{loaded:P.length,total:O})}function Xe(){if(A!==null&&window.clearTimeout(A),C&&js.has(C.run.status)){A=null;return}A=window.setTimeout(async()=>{await le(),R||Xe()},cm)}function Ye(){document.hidden||le().then(()=>{!R&&A===null&&Xe()})}return L.addEventListener("click",()=>{ve()}),$.addEventListener("click",()=>{$e()}),document.addEventListener("visibilitychange",Ye),Me().then(()=>{ae(null),R||Xe()}).catch(K=>{ae(K?.message??String(K)),a.textContent=s("workflow.detail.loadFailed")}),()=>{R=!0,A!==null&&window.clearTimeout(A),document.removeEventListener("visibilitychange",Ye)}}function mm(e,t){let n=t.run,a=[[s("workflow.summary.workflow"),D(n.workflowId??"?")],[s("workflow.summary.status"),Qt(n.status)],[s("workflow.summary.lastSeq"),String(t.lastSeq)],[s("workflow.summary.updated"),D(new Date(t.updatedAt).toLocaleString())],[s("workflow.summary.revision"),D(Po(n.revisionId))],[s("workflow.summary.initiator"),D(n.initiator??"-")]];n.failedNodeId&&a.push([s("workflow.summary.failedNode"),D(n.failedNodeId)]),n.cancelOriginEventId&&a.push([s("workflow.summary.cancelOrigin"),D(n.cancelOriginEventId)]),t.chatBinding&&(a.push([s("workflow.summary.chat"),`<code>${D(t.chatBinding.chatId)}</code>`]),a.push([s("workflow.summary.app"),`<code>${D(t.chatBinding.larkAppId)}</code>`])),e.innerHTML=a.map(([o,i])=>`<div class="wf-summary-item"><span>${o}</span><strong>${i}</strong></div>`).join("")}function hm(e){if(!e.errorCode)return"";let t=e.errorMessage?` \u2014 ${t0(e.errorMessage,96)}`:"";return`<div class="wf-run-error">
|
|
1946
1955
|
<span class="muted error">${D(e.errorCode)}</span>${D(t)}
|
|
1947
1956
|
</div>`}function gm(e){let t=e.dangling;return{total:new Set([...t.activities,...t.effectAttempted,...t.waits,...t.cancels]).size,effects:t.effectAttempted.length,activities:t.activities.length,waits:t.waits.length,cancels:t.cancels.length}}function bm(e,t){let n=t.dangling,a=[[s("workflow.dangling.activities"),n.activities],[s("workflow.dangling.effects"),n.effectAttempted],[s("workflow.dangling.waits"),n.waits],[s("workflow.dangling.cancels"),n.cancels]],o=new Set(a.flatMap(([,i])=>i)).size;if(e.className=o>0?"wf-panel wf-dangling-panel has":"wf-panel wf-dangling-panel",o===0){e.innerHTML=`<div class="wf-panel-title"><h3>${D(s("workflow.detail.dangling"))}</h3></div><div class="muted">${D(s("workflow.detail.noDangling"))}</div>`;return}e.innerHTML=`<div class="wf-panel-title"><h3>${D(s("workflow.detail.dangling"))}</h3><span class="wf-dangling has">${o}</span></div>
|
|
1948
1957
|
<div class="wf-dangling-grid">
|
|
@@ -2497,13 +2506,13 @@ ${au("manage")}
|
|
|
2497
2506
|
<div id="insight-modal" class="insight-modal" hidden></div>
|
|
2498
2507
|
<div id="insight-palette" class="insight-palette" hidden></div>
|
|
2499
2508
|
<div id="insight-tip" class="ins-tip" role="tooltip" hidden></div>
|
|
2500
|
-
</section>`;let U=e.querySelector("#insight-status"),ee=e.querySelector("#insight-overview"),pe=e.querySelector("#insight-list"),he=e.querySelector("#insight-list-subtitle"),ae=e.querySelector("#insight-detail"),se=e.querySelector("input[name=q]");se.value=r;let ie=e.querySelector("#insight-refresh"),me=[...e.querySelectorAll("[data-filter]")],be=e.querySelector("#insight-cli-filter"),Me=e.querySelector("#insight-flow"),le=e.querySelector("#insight-dist"),ve=e.querySelector("#insight-hot"),$e=e.querySelector("#insight-project"),Pe=e.querySelector("#insight-time"),
|
|
2509
|
+
</section>`;let U=e.querySelector("#insight-status"),ee=e.querySelector("#insight-overview"),pe=e.querySelector("#insight-list"),he=e.querySelector("#insight-list-subtitle"),ae=e.querySelector("#insight-detail"),se=e.querySelector("input[name=q]");se.value=r;let ie=e.querySelector("#insight-refresh"),me=[...e.querySelectorAll("[data-filter]")],be=e.querySelector("#insight-cli-filter"),Me=e.querySelector("#insight-flow"),le=e.querySelector("#insight-dist"),ve=e.querySelector("#insight-hot"),$e=e.querySelector("#insight-project"),Pe=e.querySelector("#insight-time"),Ge=e.querySelector("#insight-noise"),it=e.querySelector("#insight-clear"),He=e.querySelector("#insight-tabbar"),Xe=[...e.querySelectorAll(".insight-panel")],Ye=e.querySelector("#insight-palette"),K=e.querySelector("#insight-palette-open"),Ae=e.querySelector("#insight-list-view"),fe=e.querySelector("#insight-detail-view"),re=e.querySelector("#insight-back"),Be=e.querySelector("#insight-sort");function rt(){let _=u!==null;Ae.hidden=_,fe.hidden=!_}function wt(){let _=Wc.find(oe=>oe.key===V),te=_&&_.days>0?Date.now()-_.days*864e5:void 0;return{project:B||void 0,sinceMs:te,analyzableOnly:!Z}}function kt(){let _={};R!=="overview"&&(_.tab=R),o!=="all"&&(_.filter=o),r.trim()&&(_.q=r.trim()),B&&(_.project=B),V!=="all"&&(_.time=V),i.size&&(_.cli=[...i].join(",")),G!=="recent"&&(_.sort=G),j!=="card"&&(_.layout=j),Z&&(_.noise="1"),u&&(_.sess=u);try{history.replaceState(null,"",nb(_))}catch{}}function et(){let _=S.trim().toLowerCase(),te=sd.map(ue=>({type:"tab",key:ue.key,label:s(ue.label),sub:s("insights.paletteTabs")})).filter(ue=>!_||ue.label.toLowerCase().includes(_)),oe=a.filter(ue=>{let J=ue.session;return!_||`${an(J)} ${De(J)} ${J.cliId??""}`.toLowerCase().includes(_)}).slice(0,20).map(ue=>({type:"session",key:String(ue.session.sessionId),label:an(ue.session),sub:`${De(ue.session)} \xB7 ${ue.session.cliId??"-"}`}));return[...te,...oe]}function xn(_,te){$t(),_==="tab"?(R=te,u=null,Ee()):(R="sessions",At(),Rt(te))}function ot(){let _=Ye.querySelector(".palette-list");if(!_)return;let te=et();E>=te.length&&(E=Math.max(0,te.length-1)),_.innerHTML=te.length?te.map((oe,ue)=>`<button type="button" class="palette-item${ue===E?" on":""}" data-pal-type="${oe.type}" data-pal-key="${l(oe.key)}" data-pal-i="${ue}">
|
|
2501
2510
|
<span class="pal-label">${l(oe.label)}</span><span class="pal-sub">${l(oe.sub)}</span>
|
|
2502
2511
|
</button>`).join(""):`<p class="mut palette-empty">${l(s("insights.paletteEmpty"))}</p>`,_.querySelectorAll(".palette-item").forEach(oe=>oe.addEventListener("click",()=>xn(oe.dataset.palType??"tab",oe.dataset.palKey??""))),_.querySelector(".palette-item.on")?.scrollIntoView({block:"nearest"})}function Ze(){if(!b){Ye.hidden=!0,Ye.innerHTML="",document.body.classList.remove("insight-modal-open");return}Ye.hidden=!1,document.body.classList.add("insight-modal-open"),Ye.innerHTML=`<div class="modal-backdrop" data-pal-close></div>
|
|
2503
2512
|
<div class="palette-panel" role="dialog" aria-modal="true">
|
|
2504
2513
|
<input type="search" class="palette-input" placeholder="${l(s("insights.palettePlaceholder"))}" value="${l(S)}">
|
|
2505
2514
|
<div class="palette-list"></div>
|
|
2506
|
-
</div>`;let _=Ye.querySelector(".palette-input");_&&(_.focus(),_.oninput=()=>{S=_.value,E=0,ot()}),Ye.querySelectorAll("[data-pal-close]").forEach(te=>te.addEventListener("click",$t)),ot()}function Vt(){b=!0,S="",E=0,Ze()}function $t(){b=!1,Ze()}function Wn(){let _=fr(a,o,r,i,{...wt(),project:void 0}),te=mg(_),oe=B;$e.innerHTML=`<option value="">${l(s("insights.projectAll"))}</option>`+te.map(ue=>`<option value="${l(ue.id)}"${ue.id===oe?" selected":""}>${l(ue.id)} (${ue.count})</option>`).join(""),oe&&!te.some(ue=>ue.id===oe)&&(B="",$e.value="")}function At(){for(let _ of Xe)_.hidden=_.dataset.tabpanel!==R;for(let _ of He.querySelectorAll("[data-itab]")){let te=_.dataset.itab===R;_.classList.toggle("on",te),_.setAttribute("aria-selected",String(te))}}function xt(_,te=!1){for(let oe of _.querySelectorAll("[data-session-id]"))oe.onclick=()=>{te&&R!=="sessions"&&(R="sessions",At(),Ee()),Rt(oe.dataset.sessionId??"")}}function Dt(){return xg(fr(a,o,r,i,wt()),G)}function Ee(){if(A)return;let _=fr(a,o,r,new Set,wt()),te=new Set(_.map(yr));for(let J of[...i])te.has(J)||i.delete(J);be.innerHTML=ug(_,i),Wn(),ze.checked=Z,Pe.value=V;let oe=Dt();me.forEach(J=>J.classList.toggle("active",J.dataset.filter===o)),ee.innerHTML=n?dg(cg(oe)):"",he.textContent=s("insights.listCount",{shown:oe.length,total:a.length}),Be.innerHTML=kg(G,j),pe.innerHTML=!oe.length&&!Z?`<div class="insight-empty">${l(s("insights.empty"))}<br><span class="mut">${l(s("insights.emptyAnalyzableHint"))}</span></div>`:j==="table"?Eg(oe,u):Sg(oe,u,!0);let ue=oe.find(J=>J.session.sessionId===u)??a.find(J=>J.session.sessionId===u);(!u||!ue)&&(ae.innerHTML=hr(void 0)),xt(pe),rt(),Me.innerHTML=n?vg(oe):"",xt(Me,!0),le.innerHTML=n?yg(oe):"",ve.innerHTML=n?Vc(oe,z):"",xt(ve,!0),At(),kt()}function _e(){let _=ae.querySelector("#insight-detail-body");if(!_||!f)return;let te=`.insight-tab-panel[data-panel="${h}"] .spantable, .insight-tab-panel[data-panel="${h}"] .turnlist, .insight-tab-panel[data-panel="${h}"] .convothread`,oe=_.querySelector(te)?.scrollTop??0,ue=window.scrollY;_.innerHTML=Xg(f,{activeId:p,tab:h,spanFilter:y,openSpans:g,openTurns:v,ledgerSort:M,openPrompts:L,rawPrompts:C,ledgerSender:$,convo:H}),vs(_);let J=_.querySelector(te);J&&(J.scrollTop=oe),window.scrollY!==ue&&window.scrollTo({top:ue})}async function Ht(_){if(!u||H.loading)return;_&&(H.messages=[],H.nextOffset=0,H.hasMore=!1),H.loading=!0,h==="convo"&&_e();let te=new URLSearchParams({detail:"conversation",offset:String(H.nextOffset),limit:"40"});H.q&&te.set("q",H.q),H.role!=="all"&&te.set("role",H.role),H.tag!=="all"&&te.set("tag",H.tag);let oe=u;try{let J=await(await fetch(`/api/sessions/${encodeURIComponent(oe)}/insight?${te.toString()}`,{cache:"no-store"})).json().catch(()=>({}));if(A||oe!==u)return;let ce=J?.conversation;ce&&(H.messages=_?ce.messages??[]:[...H.messages,...ce.messages??[]],H.total=ce.total??H.messages.length,H.hasMore=!!ce.hasMore,H.nextOffset=ce.nextOffset??H.nextOffset+(ce.messages?.length??0))}catch{}H.loading=!1,h==="convo"&&_e()}function dt(){let _=e.querySelector("#insight-modal");if(_){if(q===null){_.hidden=!0,_.innerHTML="",document.body.classList.remove("insight-modal-open");return}_.hidden=!1,document.body.classList.add("insight-modal-open"),_.innerHTML=N?Bg(q,N,I):`<div class="modal-backdrop" data-modal-close></div><div class="modal-panel"><div class="modal-body"><p class="mut">${l(s("insights.detailLoading"))}</p></div></div>`,_.querySelectorAll("[data-modal-close]").forEach(te=>te.addEventListener("click",Vn)),_.querySelector("[data-modal-raw]")?.addEventListener("click",()=>{I=!I,dt()})}}function Vn(){q=null,I=!1,N=null,dt()}async function _t(_){if(!u)return;q=_,I=!1,N=null;let te=++O,oe=u;dt();try{let J=await(await fetch(`/api/sessions/${encodeURIComponent(oe)}/insight/turn/${_}?offset=0&limit=40000`,{cache:"no-store"})).json().catch(()=>({}));if(te!==O||A)return;N=J?.turn?.prompt??{text:"",truncated:!1}}catch{if(te!==O)return;N={text:s("insights.unavailable"),truncated:!1}}dt()}function vs(_){let te=_.querySelector(".detailtabbar");te?.addEventListener("click",J=>{let ce=J.target.closest("button[data-tab]");ce&&(h=ce.dataset.tab||"spans",te.querySelectorAll("button[data-tab]").forEach(ge=>ge.classList.toggle("on",ge.dataset.tab===h)),_.querySelectorAll(".insight-tab-panel").forEach(ge=>{ge.hidden=ge.dataset.panel!==h}),h==="convo"&&!H.messages.length&&!H.loading&&Ht(!0))});for(let J of _.querySelectorAll(".reclist [data-rec]"))J.addEventListener("click",()=>{let ce=J.dataset.rec||null;p=p===ce?null:ce,_e()});for(let J of _.querySelectorAll(".turnrail [data-rail-turn]"))J.addEventListener("click",()=>{let ce=Number(J.dataset.railTurn),ge=f?.turnTimeline?.find(Bt=>Bt.turnIndex===ce);h="ledger",M="normal",ge&&sa(ge)==="system"&&($="system"),v.add(ce),_e(),ae.querySelector(`.insight-tab-panel[data-panel="ledger"] [data-turn-card="${ce}"]`)?.scrollIntoView({behavior:"smooth",block:"center"})});for(let J of _.querySelectorAll(".gantt [data-gantt-span]"))J.addEventListener("click",()=>{let ce=Number(J.dataset.ganttSpan);h="spans",y="all",g.add(ce),_e(),ae.querySelector(`.insight-tab-panel[data-panel="spans"] .sprow-line[data-span-idx="${ce}"]`)?.closest(".spanrow")?.scrollIntoView({behavior:"smooth",block:"center"})});let oe=e.querySelector("#insight-tip");if(oe)for(let J of _.querySelectorAll(".turnrail, .gtrack, .ctxcurve"))Qg(J,oe);for(let J of _.querySelectorAll(".spanfilter [data-spanfilter]"))J.addEventListener("click",()=>{y=J.dataset.spanfilter||"all",_e()});for(let J of _.querySelectorAll(".sprow-line[data-span-idx]")){let ce=()=>{let ge=Number(J.dataset.spanIdx);g.has(ge)?g.delete(ge):g.add(ge),_e()};J.addEventListener("click",ce),J.addEventListener("keydown",ge=>{(ge.key==="Enter"||ge.key===" ")&&(ge.preventDefault(),ce())})}for(let J of _.querySelectorAll(".turn-expand-btn[data-turn]"))J.addEventListener("click",()=>{let ce=Number(J.dataset.turn);v.has(ce)?v.delete(ce):v.add(ce),_e()});for(let J of _.querySelectorAll(".ledgersort [data-ledgersort]"))J.addEventListener("click",()=>{M=J.dataset.ledgersort==="grouped"?"grouped":"normal",_e()});for(let J of _.querySelectorAll(".ledgersender [data-ledgersender]"))J.addEventListener("click",()=>{$=J.dataset.ledgersender||"all",_e()});for(let J of _.querySelectorAll(".tp-toggle[data-prompt-expand]"))J.addEventListener("click",()=>{let ce=Number(J.dataset.promptExpand);L.has(ce)?L.delete(ce):L.add(ce),_e()});for(let J of _.querySelectorAll(".tp-toggle[data-prompt-raw]"))J.addEventListener("click",()=>{let ce=Number(J.dataset.promptRaw);C.has(ce)?C.delete(ce):C.add(ce),_e()});for(let J of _.querySelectorAll(".tp-toggle[data-prompt-full]"))J.addEventListener("click",()=>{_t(Number(J.dataset.promptFull))});let ue=_.querySelector(".convo-search");ue?.addEventListener("keydown",J=>{if(J.key!=="Enter")return;J.preventDefault();let ce=ue.value.trim();ce!==H.q&&(H.q=ce,Ht(!0))});for(let J of _.querySelectorAll(".convo-rolefilter [data-convo-role]"))J.addEventListener("click",()=>{let ce=J.dataset.convoRole||"all";ce!==H.role&&(H.role=ce,Ht(!0))});for(let J of _.querySelectorAll(".convo-tagfilter [data-convo-tag]"))J.addEventListener("click",()=>{let ce=J.dataset.convoTag||"all";ce!==H.tag&&(H.tag=ce,Ht(!0))});_.querySelector(".convo-loadmore")?.addEventListener("click",()=>{Ht(!1)});for(let J of _.querySelectorAll(".cbub [data-convo-full]"))J.addEventListener("click",()=>{_t(Number(J.dataset.convoFull))});for(let J of _.querySelectorAll(".cop-line[data-convo-op]")){let ce=()=>{let ge=J.dataset.convoOp;H.openOps.has(ge)?H.openOps.delete(ge):H.openOps.add(ge),_e()};J.addEventListener("click",ce),J.addEventListener("keydown",ge=>{(ge.key==="Enter"||ge.key===" ")&&(ge.preventDefault(),ce())})}}async function Rt(_){u=_,rt(),kt(),p=null,h="spans",y="all",g=new Set,v=new Set,M="normal",$="all",L=new Set,C=new Set,H=P(),q=null,I=!1,N=null,dt(),f=null;let te=a.find(ue=>ue.session.sessionId===_);ae.innerHTML=hr(te);for(let ue of pe.querySelectorAll("[data-session-id]"))ue.classList.toggle("on",ue.dataset.sessionId===_);let oe=ae.querySelector("#insight-detail-body");if(oe)try{let ue=await eb(_);!A&&ue&&(f=ue,_e())}catch(ue){A||(oe.innerHTML=`<p class="mut">${l(String(ue))}</p>`)}}async function St(){ie.disabled=!0,U.textContent=s("insights.loading");try{let te=await fetch("/api/insights/summary?limit=200",{cache:"no-store"}),oe=await te.json().catch(()=>({}));!te.ok||oe?.ok===!1||!oe.overview?(n=null,a=[],U.textContent=`${s("insights.unavailable")}: ${String(oe?.error??te.status)}`):(n=oe.overview,a=n.sessions.map(rg),U.textContent=s("insights.loaded",{count:n.meta.analyzedSessions}))}catch(te){n=null,a=[],U.textContent=`${s("insights.unavailable")}: ${String(te)}`}if(A)return;u&&!a.some(te=>te.session.sessionId===u)&&(u=null),Ee(),ie.disabled=!1;let _=c;c=null,_&&!u&&a.some(te=>te.session.sessionId===_)&&Rt(_)}se.oninput=()=>{r=se.value,Ee()},ie.onclick=()=>{St()},He.addEventListener("click",_=>{let te=_.target.closest("[data-itab]");te&&(R=te.dataset.itab||"overview",Ee())}),re.addEventListener("click",()=>{u=null,rt(),Ee()}),Be.addEventListener("click",_=>{let te=_.target.closest("[data-sesslayout]");if(te){j=te.dataset.sesslayout==="table"?"table":"card",Ee();return}let oe=_.target.closest("[data-sesssort]");oe&&(G=oe.dataset.sesssort||"recent",Ee())}),le.addEventListener("click",_=>{let te=_.target.closest("[data-distsort]");te&&(G=te.dataset.distsort||"recent",R="sessions",u=null,Ee())}),ve.addEventListener("click",_=>{let te=_.target,oe=te.closest("[data-hotkey]");if(oe){let J=oe.dataset.hotkey||"";z.has(J)?z.delete(J):z.add(J),ve.innerHTML=Vc(Dt(),z),xt(ve,!0);return}let ue=te.closest("[data-hotproject]");ue&&(B=ue.dataset.hotproject||"",R="sessions",u=null,Ee())}),$e.addEventListener("change",()=>{B=$e.value,Ee()}),Pe.addEventListener("change",()=>{V=Pe.value,Ee()}),ze.addEventListener("change",()=>{Z=ze.checked,Ee()}),it.addEventListener("click",()=>{r="",se.value="",o="all",i.clear(),B="",V="all",Z=!1,Ee()});for(let _ of me)_.onclick=()=>{o=_.dataset.filter||"all",Ee()};be.addEventListener("click",_=>{let te=_.target.closest("[data-clifilter]");if(!te)return;let oe=te.dataset.clifilter||"all";oe==="all"?i.clear():i.has(oe)?i.delete(oe):i.add(oe),Ee()}),K.addEventListener("click",Vt);let Pt=_=>{if((_.key==="k"||_.key==="K")&&(_.metaKey||_.ctrlKey)){_.preventDefault(),b?$t():Vt();return}if(b){if(_.isComposing||_.keyCode===229)return;let te=et();if(_.key==="Escape")_.preventDefault(),$t();else if(_.key==="ArrowDown")_.preventDefault(),E=Math.min(te.length-1,E+1),ot();else if(_.key==="ArrowUp")_.preventDefault(),E=Math.max(0,E-1),ot();else if(_.key==="Enter"){_.preventDefault();let oe=te[E];oe&&xn(oe.type,oe.key)}return}_.key==="Escape"&&q!==null&&Vn()};return document.addEventListener("keydown",Pt),bt().then(()=>{A||Ee()}),St(),()=>{A=!0,document.removeEventListener("keydown",Pt),document.body.classList.remove("insight-modal-open")}}var $n=null,ra=null,la="glm-5.1",cd=[];function Qs(){ra!==null&&(window.clearInterval(ra),ra=null)}function Er(){return $n||($n=document.createElement("dialog"),$n.className="onboarding-dialog",document.body.appendChild($n),$n.addEventListener("close",Qs),$n)}function ib(e){return e.status==="waiting_for_scan"?s("botOnboarding.waiting"):e.status==="verifying"?s("botOnboarding.verifying"):e.status==="configuring_permissions"?e.permissionStatusMsg?`${s("botOnboarding.configuringPermissions")} ${e.permissionStatusMsg}`:s("botOnboarding.configuringPermissions"):e.status==="waiting_for_platform_scan"?s("botOnboarding.platformScanHint"):e.status==="needs_owner"?s("botOnboarding.needsOwner"):e.status==="completed"?s("botOnboarding.completed"):e.status==="failed"?`${s("botOnboarding.failed")}: ${l(e.message??e.error??"unknown")}`:s("botOnboarding.starting")}function rb(e){if(e.status!=="completed"&&e.status!=="needs_owner"||!e.permission)return"";let t=e.permission;if(t.ok){let a=[s("botOnboarding.permissionOk",{count:t.scopeCount??0})];t.skippedScopeCount&&t.skippedScopeCount>0&&a.push(s("botOnboarding.permissionSkipped",{count:t.skippedScopeCount})),t.versionId&&a.push(s("botOnboarding.permissionVersion",{version:l(t.versionId)}));let o=`<p class="hint-ok">\u2705 ${a.join(" ")}</p>`;return t.scopeWarning&&(o+=`<p class="hint-warn">\u26A0\uFE0F ${l(t.scopeWarning)}</p>`),o}let n=(e.remainingSteps??[]).map(a=>`<li><a href="${l(a.url)}" target="_blank" rel="noopener">${l(a.title)}</a></li>`).join("");return`<p class="hint-warn">\u26A0\uFE0F ${s("botOnboarding.permissionManual")}${t.message?`\uFF08${l(t.message)}\uFF09`:""}</p>`+(n?`<ol class="onboarding-steps">${n}</ol>`:"")}function lb(e,t){if(e.status!=="needs_owner")return"";let n=t?`<p class="form-error">${l(t)}</p>`:"";return`<form id="ob-owner-form" class="onboarding-form">
|
|
2515
|
+
</div>`;let _=Ye.querySelector(".palette-input");_&&(_.focus(),_.oninput=()=>{S=_.value,E=0,ot()}),Ye.querySelectorAll("[data-pal-close]").forEach(te=>te.addEventListener("click",$t)),ot()}function Vt(){b=!0,S="",E=0,Ze()}function $t(){b=!1,Ze()}function Wn(){let _=fr(a,o,r,i,{...wt(),project:void 0}),te=mg(_),oe=B;$e.innerHTML=`<option value="">${l(s("insights.projectAll"))}</option>`+te.map(ue=>`<option value="${l(ue.id)}"${ue.id===oe?" selected":""}>${l(ue.id)} (${ue.count})</option>`).join(""),oe&&!te.some(ue=>ue.id===oe)&&(B="",$e.value="")}function At(){for(let _ of Xe)_.hidden=_.dataset.tabpanel!==R;for(let _ of He.querySelectorAll("[data-itab]")){let te=_.dataset.itab===R;_.classList.toggle("on",te),_.setAttribute("aria-selected",String(te))}}function xt(_,te=!1){for(let oe of _.querySelectorAll("[data-session-id]"))oe.onclick=()=>{te&&R!=="sessions"&&(R="sessions",At(),Ee()),Rt(oe.dataset.sessionId??"")}}function Dt(){return xg(fr(a,o,r,i,wt()),G)}function Ee(){if(A)return;let _=fr(a,o,r,new Set,wt()),te=new Set(_.map(yr));for(let J of[...i])te.has(J)||i.delete(J);be.innerHTML=ug(_,i),Wn(),Ge.checked=Z,Pe.value=V;let oe=Dt();me.forEach(J=>J.classList.toggle("active",J.dataset.filter===o)),ee.innerHTML=n?dg(cg(oe)):"",he.textContent=s("insights.listCount",{shown:oe.length,total:a.length}),Be.innerHTML=kg(G,j),pe.innerHTML=!oe.length&&!Z?`<div class="insight-empty">${l(s("insights.empty"))}<br><span class="mut">${l(s("insights.emptyAnalyzableHint"))}</span></div>`:j==="table"?Eg(oe,u):Sg(oe,u,!0);let ue=oe.find(J=>J.session.sessionId===u)??a.find(J=>J.session.sessionId===u);(!u||!ue)&&(ae.innerHTML=hr(void 0)),xt(pe),rt(),Me.innerHTML=n?vg(oe):"",xt(Me,!0),le.innerHTML=n?yg(oe):"",ve.innerHTML=n?Vc(oe,z):"",xt(ve,!0),At(),kt()}function _e(){let _=ae.querySelector("#insight-detail-body");if(!_||!f)return;let te=`.insight-tab-panel[data-panel="${h}"] .spantable, .insight-tab-panel[data-panel="${h}"] .turnlist, .insight-tab-panel[data-panel="${h}"] .convothread`,oe=_.querySelector(te)?.scrollTop??0,ue=window.scrollY;_.innerHTML=Xg(f,{activeId:p,tab:h,spanFilter:y,openSpans:g,openTurns:v,ledgerSort:M,openPrompts:L,rawPrompts:C,ledgerSender:$,convo:H}),vs(_);let J=_.querySelector(te);J&&(J.scrollTop=oe),window.scrollY!==ue&&window.scrollTo({top:ue})}async function Ht(_){if(!u||H.loading)return;_&&(H.messages=[],H.nextOffset=0,H.hasMore=!1),H.loading=!0,h==="convo"&&_e();let te=new URLSearchParams({detail:"conversation",offset:String(H.nextOffset),limit:"40"});H.q&&te.set("q",H.q),H.role!=="all"&&te.set("role",H.role),H.tag!=="all"&&te.set("tag",H.tag);let oe=u;try{let J=await(await fetch(`/api/sessions/${encodeURIComponent(oe)}/insight?${te.toString()}`,{cache:"no-store"})).json().catch(()=>({}));if(A||oe!==u)return;let ce=J?.conversation;ce&&(H.messages=_?ce.messages??[]:[...H.messages,...ce.messages??[]],H.total=ce.total??H.messages.length,H.hasMore=!!ce.hasMore,H.nextOffset=ce.nextOffset??H.nextOffset+(ce.messages?.length??0))}catch{}H.loading=!1,h==="convo"&&_e()}function dt(){let _=e.querySelector("#insight-modal");if(_){if(q===null){_.hidden=!0,_.innerHTML="",document.body.classList.remove("insight-modal-open");return}_.hidden=!1,document.body.classList.add("insight-modal-open"),_.innerHTML=N?Bg(q,N,I):`<div class="modal-backdrop" data-modal-close></div><div class="modal-panel"><div class="modal-body"><p class="mut">${l(s("insights.detailLoading"))}</p></div></div>`,_.querySelectorAll("[data-modal-close]").forEach(te=>te.addEventListener("click",Vn)),_.querySelector("[data-modal-raw]")?.addEventListener("click",()=>{I=!I,dt()})}}function Vn(){q=null,I=!1,N=null,dt()}async function _t(_){if(!u)return;q=_,I=!1,N=null;let te=++O,oe=u;dt();try{let J=await(await fetch(`/api/sessions/${encodeURIComponent(oe)}/insight/turn/${_}?offset=0&limit=40000`,{cache:"no-store"})).json().catch(()=>({}));if(te!==O||A)return;N=J?.turn?.prompt??{text:"",truncated:!1}}catch{if(te!==O)return;N={text:s("insights.unavailable"),truncated:!1}}dt()}function vs(_){let te=_.querySelector(".detailtabbar");te?.addEventListener("click",J=>{let ce=J.target.closest("button[data-tab]");ce&&(h=ce.dataset.tab||"spans",te.querySelectorAll("button[data-tab]").forEach(ge=>ge.classList.toggle("on",ge.dataset.tab===h)),_.querySelectorAll(".insight-tab-panel").forEach(ge=>{ge.hidden=ge.dataset.panel!==h}),h==="convo"&&!H.messages.length&&!H.loading&&Ht(!0))});for(let J of _.querySelectorAll(".reclist [data-rec]"))J.addEventListener("click",()=>{let ce=J.dataset.rec||null;p=p===ce?null:ce,_e()});for(let J of _.querySelectorAll(".turnrail [data-rail-turn]"))J.addEventListener("click",()=>{let ce=Number(J.dataset.railTurn),ge=f?.turnTimeline?.find(Bt=>Bt.turnIndex===ce);h="ledger",M="normal",ge&&sa(ge)==="system"&&($="system"),v.add(ce),_e(),ae.querySelector(`.insight-tab-panel[data-panel="ledger"] [data-turn-card="${ce}"]`)?.scrollIntoView({behavior:"smooth",block:"center"})});for(let J of _.querySelectorAll(".gantt [data-gantt-span]"))J.addEventListener("click",()=>{let ce=Number(J.dataset.ganttSpan);h="spans",y="all",g.add(ce),_e(),ae.querySelector(`.insight-tab-panel[data-panel="spans"] .sprow-line[data-span-idx="${ce}"]`)?.closest(".spanrow")?.scrollIntoView({behavior:"smooth",block:"center"})});let oe=e.querySelector("#insight-tip");if(oe)for(let J of _.querySelectorAll(".turnrail, .gtrack, .ctxcurve"))Qg(J,oe);for(let J of _.querySelectorAll(".spanfilter [data-spanfilter]"))J.addEventListener("click",()=>{y=J.dataset.spanfilter||"all",_e()});for(let J of _.querySelectorAll(".sprow-line[data-span-idx]")){let ce=()=>{let ge=Number(J.dataset.spanIdx);g.has(ge)?g.delete(ge):g.add(ge),_e()};J.addEventListener("click",ce),J.addEventListener("keydown",ge=>{(ge.key==="Enter"||ge.key===" ")&&(ge.preventDefault(),ce())})}for(let J of _.querySelectorAll(".turn-expand-btn[data-turn]"))J.addEventListener("click",()=>{let ce=Number(J.dataset.turn);v.has(ce)?v.delete(ce):v.add(ce),_e()});for(let J of _.querySelectorAll(".ledgersort [data-ledgersort]"))J.addEventListener("click",()=>{M=J.dataset.ledgersort==="grouped"?"grouped":"normal",_e()});for(let J of _.querySelectorAll(".ledgersender [data-ledgersender]"))J.addEventListener("click",()=>{$=J.dataset.ledgersender||"all",_e()});for(let J of _.querySelectorAll(".tp-toggle[data-prompt-expand]"))J.addEventListener("click",()=>{let ce=Number(J.dataset.promptExpand);L.has(ce)?L.delete(ce):L.add(ce),_e()});for(let J of _.querySelectorAll(".tp-toggle[data-prompt-raw]"))J.addEventListener("click",()=>{let ce=Number(J.dataset.promptRaw);C.has(ce)?C.delete(ce):C.add(ce),_e()});for(let J of _.querySelectorAll(".tp-toggle[data-prompt-full]"))J.addEventListener("click",()=>{_t(Number(J.dataset.promptFull))});let ue=_.querySelector(".convo-search");ue?.addEventListener("keydown",J=>{if(J.key!=="Enter")return;J.preventDefault();let ce=ue.value.trim();ce!==H.q&&(H.q=ce,Ht(!0))});for(let J of _.querySelectorAll(".convo-rolefilter [data-convo-role]"))J.addEventListener("click",()=>{let ce=J.dataset.convoRole||"all";ce!==H.role&&(H.role=ce,Ht(!0))});for(let J of _.querySelectorAll(".convo-tagfilter [data-convo-tag]"))J.addEventListener("click",()=>{let ce=J.dataset.convoTag||"all";ce!==H.tag&&(H.tag=ce,Ht(!0))});_.querySelector(".convo-loadmore")?.addEventListener("click",()=>{Ht(!1)});for(let J of _.querySelectorAll(".cbub [data-convo-full]"))J.addEventListener("click",()=>{_t(Number(J.dataset.convoFull))});for(let J of _.querySelectorAll(".cop-line[data-convo-op]")){let ce=()=>{let ge=J.dataset.convoOp;H.openOps.has(ge)?H.openOps.delete(ge):H.openOps.add(ge),_e()};J.addEventListener("click",ce),J.addEventListener("keydown",ge=>{(ge.key==="Enter"||ge.key===" ")&&(ge.preventDefault(),ce())})}}async function Rt(_){u=_,rt(),kt(),p=null,h="spans",y="all",g=new Set,v=new Set,M="normal",$="all",L=new Set,C=new Set,H=P(),q=null,I=!1,N=null,dt(),f=null;let te=a.find(ue=>ue.session.sessionId===_);ae.innerHTML=hr(te);for(let ue of pe.querySelectorAll("[data-session-id]"))ue.classList.toggle("on",ue.dataset.sessionId===_);let oe=ae.querySelector("#insight-detail-body");if(oe)try{let ue=await eb(_);!A&&ue&&(f=ue,_e())}catch(ue){A||(oe.innerHTML=`<p class="mut">${l(String(ue))}</p>`)}}async function St(){ie.disabled=!0,U.textContent=s("insights.loading");try{let te=await fetch("/api/insights/summary?limit=200",{cache:"no-store"}),oe=await te.json().catch(()=>({}));!te.ok||oe?.ok===!1||!oe.overview?(n=null,a=[],U.textContent=`${s("insights.unavailable")}: ${String(oe?.error??te.status)}`):(n=oe.overview,a=n.sessions.map(rg),U.textContent=s("insights.loaded",{count:n.meta.analyzedSessions}))}catch(te){n=null,a=[],U.textContent=`${s("insights.unavailable")}: ${String(te)}`}if(A)return;u&&!a.some(te=>te.session.sessionId===u)&&(u=null),Ee(),ie.disabled=!1;let _=c;c=null,_&&!u&&a.some(te=>te.session.sessionId===_)&&Rt(_)}se.oninput=()=>{r=se.value,Ee()},ie.onclick=()=>{St()},He.addEventListener("click",_=>{let te=_.target.closest("[data-itab]");te&&(R=te.dataset.itab||"overview",Ee())}),re.addEventListener("click",()=>{u=null,rt(),Ee()}),Be.addEventListener("click",_=>{let te=_.target.closest("[data-sesslayout]");if(te){j=te.dataset.sesslayout==="table"?"table":"card",Ee();return}let oe=_.target.closest("[data-sesssort]");oe&&(G=oe.dataset.sesssort||"recent",Ee())}),le.addEventListener("click",_=>{let te=_.target.closest("[data-distsort]");te&&(G=te.dataset.distsort||"recent",R="sessions",u=null,Ee())}),ve.addEventListener("click",_=>{let te=_.target,oe=te.closest("[data-hotkey]");if(oe){let J=oe.dataset.hotkey||"";z.has(J)?z.delete(J):z.add(J),ve.innerHTML=Vc(Dt(),z),xt(ve,!0);return}let ue=te.closest("[data-hotproject]");ue&&(B=ue.dataset.hotproject||"",R="sessions",u=null,Ee())}),$e.addEventListener("change",()=>{B=$e.value,Ee()}),Pe.addEventListener("change",()=>{V=Pe.value,Ee()}),Ge.addEventListener("change",()=>{Z=Ge.checked,Ee()}),it.addEventListener("click",()=>{r="",se.value="",o="all",i.clear(),B="",V="all",Z=!1,Ee()});for(let _ of me)_.onclick=()=>{o=_.dataset.filter||"all",Ee()};be.addEventListener("click",_=>{let te=_.target.closest("[data-clifilter]");if(!te)return;let oe=te.dataset.clifilter||"all";oe==="all"?i.clear():i.has(oe)?i.delete(oe):i.add(oe),Ee()}),K.addEventListener("click",Vt);let Pt=_=>{if((_.key==="k"||_.key==="K")&&(_.metaKey||_.ctrlKey)){_.preventDefault(),b?$t():Vt();return}if(b){if(_.isComposing||_.keyCode===229)return;let te=et();if(_.key==="Escape")_.preventDefault(),$t();else if(_.key==="ArrowDown")_.preventDefault(),E=Math.min(te.length-1,E+1),ot();else if(_.key==="ArrowUp")_.preventDefault(),E=Math.max(0,E-1),ot();else if(_.key==="Enter"){_.preventDefault();let oe=te[E];oe&&xn(oe.type,oe.key)}return}_.key==="Escape"&&q!==null&&Vn()};return document.addEventListener("keydown",Pt),bt().then(()=>{A||Ee()}),St(),()=>{A=!0,document.removeEventListener("keydown",Pt),document.body.classList.remove("insight-modal-open")}}var $n=null,ra=null,la="glm-5.1",cd=[];function Qs(){ra!==null&&(window.clearInterval(ra),ra=null)}function Er(){return $n||($n=document.createElement("dialog"),$n.className="onboarding-dialog",document.body.appendChild($n),$n.addEventListener("close",Qs),$n)}function ib(e){return e.status==="waiting_for_scan"?s("botOnboarding.waiting"):e.status==="verifying"?s("botOnboarding.verifying"):e.status==="configuring_permissions"?e.permissionStatusMsg?`${s("botOnboarding.configuringPermissions")} ${e.permissionStatusMsg}`:s("botOnboarding.configuringPermissions"):e.status==="waiting_for_platform_scan"?s("botOnboarding.platformScanHint"):e.status==="needs_owner"?s("botOnboarding.needsOwner"):e.status==="completed"?s("botOnboarding.completed"):e.status==="failed"?`${s("botOnboarding.failed")}: ${l(e.message??e.error??"unknown")}`:s("botOnboarding.starting")}function rb(e){if(e.status!=="completed"&&e.status!=="needs_owner"||!e.permission)return"";let t=e.permission;if(t.ok){let a=[s("botOnboarding.permissionOk",{count:t.scopeCount??0})];t.skippedScopeCount&&t.skippedScopeCount>0&&a.push(s("botOnboarding.permissionSkipped",{count:t.skippedScopeCount})),t.versionId&&a.push(s("botOnboarding.permissionVersion",{version:l(t.versionId)}));let o=`<p class="hint-ok">\u2705 ${a.join(" ")}</p>`;return t.scopeWarning&&(o+=`<p class="hint-warn">\u26A0\uFE0F ${l(t.scopeWarning)}</p>`),o}let n=(e.remainingSteps??[]).map(a=>`<li><a href="${l(a.url)}" target="_blank" rel="noopener">${l(a.title)}</a></li>`).join("");return`<p class="hint-warn">\u26A0\uFE0F ${s("botOnboarding.permissionManual")}${t.message?`\uFF08${l(t.message)}\uFF09`:""}</p>`+(n?`<ol class="onboarding-steps">${n}</ol>`:"")}function lb(e,t){if(e.status!=="needs_owner")return"";let n=t?`<p class="form-error">${l(t)}</p>`:"";return`<form id="ob-owner-form" class="onboarding-form">
|
|
2507
2516
|
<label class="onboarding-field">
|
|
2508
2517
|
<span>${s("botOnboarding.ownerLabel")}</span>
|
|
2509
2518
|
<input id="ob-owner" type="text" placeholder="${s("botOnboarding.ownerPlaceholder")}" autocomplete="off" spellcheck="false">
|