botmux 3.12.1 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/bot-registry.d.ts +7 -0
  3. package/dist/bot-registry.d.ts.map +1 -1
  4. package/dist/bot-registry.js +46 -13
  5. package/dist/bot-registry.js.map +1 -1
  6. package/dist/core/config-dir.d.ts +167 -0
  7. package/dist/core/config-dir.d.ts.map +1 -0
  8. package/dist/core/config-dir.js +152 -0
  9. package/dist/core/config-dir.js.map +1 -0
  10. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  11. package/dist/core/dashboard-ipc-server.js +48 -0
  12. package/dist/core/dashboard-ipc-server.js.map +1 -1
  13. package/dist/core/per-bot-env.d.ts.map +1 -1
  14. package/dist/core/per-bot-env.js +9 -0
  15. package/dist/core/per-bot-env.js.map +1 -1
  16. package/dist/core/session-discovery.d.ts.map +1 -1
  17. package/dist/core/session-discovery.js +19 -2
  18. package/dist/core/session-discovery.js.map +1 -1
  19. package/dist/core/session-manager.d.ts.map +1 -1
  20. package/dist/core/session-manager.js +44 -3
  21. package/dist/core/session-manager.js.map +1 -1
  22. package/dist/core/trigger-session.d.ts.map +1 -1
  23. package/dist/core/trigger-session.js +499 -63
  24. package/dist/core/trigger-session.js.map +1 -1
  25. package/dist/core/types.d.ts +26 -4
  26. package/dist/core/types.d.ts.map +1 -1
  27. package/dist/core/types.js.map +1 -1
  28. package/dist/core/worker-pool.d.ts +64 -0
  29. package/dist/core/worker-pool.d.ts.map +1 -1
  30. package/dist/core/worker-pool.js +301 -10
  31. package/dist/core/worker-pool.js.map +1 -1
  32. package/dist/daemon.d.ts.map +1 -1
  33. package/dist/daemon.js +13 -6
  34. package/dist/daemon.js.map +1 -1
  35. package/dist/dashboard/auth.d.ts +8 -0
  36. package/dist/dashboard/auth.d.ts.map +1 -1
  37. package/dist/dashboard/auth.js +16 -11
  38. package/dist/dashboard/auth.js.map +1 -1
  39. package/dist/dashboard/web/bot-multi-select.d.ts +33 -0
  40. package/dist/dashboard/web/bot-multi-select.d.ts.map +1 -0
  41. package/dist/dashboard/web/bot-multi-select.js +34 -0
  42. package/dist/dashboard/web/bot-multi-select.js.map +1 -0
  43. package/dist/dashboard/web/groups-page.d.ts +13 -0
  44. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  45. package/dist/dashboard/web/groups-page.js +25 -7
  46. package/dist/dashboard/web/groups-page.js.map +1 -1
  47. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  48. package/dist/dashboard/web/i18n.js +8 -4
  49. package/dist/dashboard/web/i18n.js.map +1 -1
  50. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  51. package/dist/dashboard/web/sessions-page.js +15 -23
  52. package/dist/dashboard/web/sessions-page.js.map +1 -1
  53. package/dist/dashboard/web/sessions.d.ts +13 -0
  54. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  55. package/dist/dashboard/web/sessions.js +25 -0
  56. package/dist/dashboard/web/sessions.js.map +1 -1
  57. package/dist/dashboard-web/app.js +1 -1
  58. package/dist/dashboard-web/chunks/{bot-defaults-page-HL655CNR.js → bot-defaults-page-NQJFJ45Z.js} +1 -1
  59. package/dist/dashboard-web/chunks/{chunk-BFUTTYVK.js → chunk-5QJB24I2.js} +1 -1
  60. package/dist/dashboard-web/chunks/{chunk-ELL53D62.js → chunk-6JTZJRQJ.js} +2 -2
  61. package/dist/dashboard-web/chunks/{chunk-5ZL7NLR5.js → chunk-CU4SUKK3.js} +1 -1
  62. package/dist/dashboard-web/chunks/{chunk-5PAYQ3KT.js → chunk-KEEYQ3WF.js} +1 -1
  63. package/dist/dashboard-web/chunks/chunk-WLIVBPJC.js +1 -0
  64. package/dist/dashboard-web/chunks/{connectors-page-3QQACF23.js → connectors-page-HADHZXXZ.js} +1 -1
  65. package/dist/dashboard-web/chunks/groups-page-5TYF46RS.js +8 -0
  66. package/dist/dashboard-web/chunks/{insights-page-ZZ3JEJ6L.js → insights-page-EVGGJI5L.js} +1 -1
  67. package/dist/dashboard-web/chunks/{monitor-room-ROJ5GZ4N.js → monitor-room-HRGR2ENP.js} +1 -1
  68. package/dist/dashboard-web/chunks/{monitoring-page-IATV7KJF.js → monitoring-page-LBU7TTTW.js} +1 -1
  69. package/dist/dashboard-web/chunks/{office-page-TYO5OIIT.js → office-page-DF6RRBMN.js} +1 -1
  70. package/dist/dashboard-web/chunks/{overview-page-VJUULZF2.js → overview-page-ZB6QH2EX.js} +1 -1
  71. package/dist/dashboard-web/chunks/{roles-page-7RJJKZGK.js → roles-page-ZBZGHIIF.js} +1 -1
  72. package/dist/dashboard-web/chunks/{schedules-page-JTEJ5IXW.js → schedules-page-NQVQC3QY.js} +1 -1
  73. package/dist/dashboard-web/chunks/sessions-page-DXBCDWCS.js +8 -0
  74. package/dist/dashboard-web/chunks/{settings-page-7CTTFBRS.js → settings-page-E7NN4NVQ.js} +1 -1
  75. package/dist/dashboard-web/chunks/{skills-page-57NZECJ3.js → skills-page-2QAVB2SA.js} +1 -1
  76. package/dist/dashboard-web/chunks/{team-federation-page-6YYIMJG3.js → team-federation-page-VGWL53AE.js} +1 -1
  77. package/dist/dashboard-web/chunks/{v3-page-ZGKBSBK3.js → v3-page-AY35LKCX.js} +1 -1
  78. package/dist/dashboard-web/chunks/{whiteboards-page-AACJF6DB.js → whiteboards-page-BNWUU4KG.js} +1 -1
  79. package/dist/dashboard-web/style.css +61 -53
  80. package/dist/features/codex-notifier/internal-turn.d.ts +1 -2
  81. package/dist/features/codex-notifier/internal-turn.d.ts.map +1 -1
  82. package/dist/features/codex-notifier/internal-turn.js +1 -13
  83. package/dist/features/codex-notifier/internal-turn.js.map +1 -1
  84. package/dist/i18n/en.js +2 -2
  85. package/dist/i18n/en.js.map +1 -1
  86. package/dist/i18n/zh.js +2 -2
  87. package/dist/i18n/zh.js.map +1 -1
  88. package/dist/platform/secure-host-file.d.ts +63 -0
  89. package/dist/platform/secure-host-file.d.ts.map +1 -1
  90. package/dist/platform/secure-host-file.js +90 -25
  91. package/dist/platform/secure-host-file.js.map +1 -1
  92. package/dist/services/async-trigger-store.d.ts +24 -4
  93. package/dist/services/async-trigger-store.d.ts.map +1 -1
  94. package/dist/services/async-trigger-store.js +81 -19
  95. package/dist/services/async-trigger-store.js.map +1 -1
  96. package/dist/services/codex-session-meta.d.ts +4 -0
  97. package/dist/services/codex-session-meta.d.ts.map +1 -0
  98. package/dist/services/codex-session-meta.js +15 -0
  99. package/dist/services/codex-session-meta.js.map +1 -0
  100. package/dist/services/idempotency-store.d.ts +18 -3
  101. package/dist/services/idempotency-store.d.ts.map +1 -1
  102. package/dist/services/idempotency-store.js +30 -12
  103. package/dist/services/idempotency-store.js.map +1 -1
  104. package/dist/services/traex-transcript.d.ts +7 -5
  105. package/dist/services/traex-transcript.d.ts.map +1 -1
  106. package/dist/services/traex-transcript.js +139 -33
  107. package/dist/services/traex-transcript.js.map +1 -1
  108. package/dist/services/trigger-types.d.ts +14 -1
  109. package/dist/services/trigger-types.d.ts.map +1 -1
  110. package/dist/services/trigger-types.js +35 -0
  111. package/dist/services/trigger-types.js.map +1 -1
  112. package/dist/types.d.ts +2 -0
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/utils/child-env.d.ts +1 -1
  115. package/dist/utils/child-env.d.ts.map +1 -1
  116. package/dist/utils/child-env.js +18 -0
  117. package/dist/utils/child-env.js.map +1 -1
  118. package/dist/worker.js +35 -2
  119. package/dist/worker.js.map +1 -1
  120. package/package.json +1 -1
  121. package/dist/dashboard-web/chunks/chunk-6ALR252E.js +0 -1
  122. package/dist/dashboard-web/chunks/groups-page-SDZMJ7UV.js +0 -8
  123. package/dist/dashboard-web/chunks/sessions-page-KD7HDT3U.js +0 -8
@@ -6,9 +6,10 @@ import { mountReactPage } from './react-mount.js';
6
6
  import { useStoreSelector, useT } from './react-hooks.js';
7
7
  import { copyText } from './clipboard.js';
8
8
  import { FeedGroupPicker } from './feed-group-picker.js';
9
+ import { BotMultiSelect } from './bot-multi-select.js';
9
10
  import { KANBAN_TEAM_STORAGE_KEY, normalizeSessionsViewMode, readStoredBoardOrder, readStoredCreateKeepOpen, readStoredHiddenTableColumns, readStoredKanbanGroupBy, readStoredSessionsShowUnknownChats, readStoredSessionsViewMode, writeStoredBoardOrder, writeStoredCreateKeepOpen, writeStoredHiddenTableColumns, writeStoredKanbanGroupBy, writeStoredSessionsShowUnknownChats, writeStoredSessionsViewMode, } from './preferences.js';
10
11
  import { OPEN_CREATE_SESSION_EVENT, consumePendingCreateSession } from './create-session-entry.js';
11
- import { BOARD_COLUMNS, CLI_FILTER_OPTIONS, ICON, SESSION_STATUS_OPTIONS, canRestartSession, cssToken, deriveSessionBoardColumn, fetchPickerBots, formatTokenCount, groupSessionsByTopic, historySenderKey, isUnknownChatSession, lockActionLabel, openWriteLink, copySpawnCommand, repoBasename, restartConfirmMessage, sessionLocationText, sessionLocationTitle, sessionExchangePreview, sessionRuntimeCounts, sessionSearchText, sessionTopicKey, sessionStatusText, shouldOpenWritableTerminal, previewOverlayReducer, previewOverlayInitialState, terminalHref, tokenCount, } from './sessions.js';
12
+ import { BOARD_COLUMNS, CLI_FILTER_OPTIONS, ICON, SESSION_STATUS_OPTIONS, canRestartSession, cssToken, deriveSessionBoardColumn, fetchPickerBots, formatTokenCount, groupSessionsByTopic, historySenderKey, isUnknownChatSession, lockActionLabel, openWriteLink, copySpawnCommand, repoBasename, restartConfirmMessage, sessionLocationText, preferChatFilterLabel, sessionLocationTitle, sessionExchangePreview, sessionRuntimeCounts, sessionSearchText, sessionTopicKey, sessionStatusText, shouldOpenWritableTerminal, previewOverlayReducer, previewOverlayInitialState, terminalHref, tokenCount, } from './sessions.js';
12
13
  import { previewMarkdownHtml } from './preview-markdown.js';
13
14
  import { addMonitorRoomSessionIds, monitorRoomUrl } from './monitor-room-store.js';
14
15
  import { dashboardShellAllowsWebTerminal } from './client-shell.js';
@@ -972,7 +973,6 @@ function CreateSessionDialog(props) {
972
973
  const [bindWorkingDir, setBindWorkingDir] = useState('');
973
974
  const [advancedOpen, setAdvancedOpen] = useState(false);
974
975
  const [submitting, setSubmitting] = useState(false);
975
- const [botQuery, setBotQuery] = useState('');
976
976
  const [keepOpen, setKeepOpen] = useState(() => readStoredCreateKeepOpen(windowStorage()));
977
977
  const [keptSuccess, setKeptSuccess] = useState(null);
978
978
  const [feedGroups, setFeedGroups] = useState([]);
@@ -1001,7 +1001,6 @@ function CreateSessionDialog(props) {
1001
1001
  setBindWorkingDir('');
1002
1002
  setAdvancedOpen(false);
1003
1003
  setSubmitting(false);
1004
- setBotQuery('');
1005
1004
  setKeptSuccess(null);
1006
1005
  setFeedGroupId('');
1007
1006
  setNewFeedGroupName('');
@@ -1110,10 +1109,6 @@ function CreateSessionDialog(props) {
1110
1109
  const checkedIds = [...selectedBots];
1111
1110
  const leadOptions = checkedIds;
1112
1111
  const nameOf = (id) => bots.find(bot => bot.larkAppId === id)?.botName ?? id;
1113
- const botQueryNorm = botQuery.trim().toLowerCase();
1114
- const visibleBots = botQueryNorm
1115
- ? bots.filter(bot => bot.botName.toLowerCase().includes(botQueryNorm) || bot.larkAppId.toLowerCase().includes(botQueryNorm))
1116
- : bots;
1117
1112
  const mentionBots = mentionTrigger
1118
1113
  ? filterMentionBots(bots, mentionTrigger.query).slice(0, 8)
1119
1114
  : [];
@@ -1295,19 +1290,18 @@ function CreateSessionDialog(props) {
1295
1290
  marker: reconciled.markers[index],
1296
1291
  })));
1297
1292
  nextImageOrdinalRef.current = remaining.length + 1;
1298
- }, children: _jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", children: _jsx("path", { d: "M7 7l10 10M17 7 7 17" }) }) })] }, image.id))) })) : null] }), _jsxs("fieldset", { className: "cs-bots", children: [_jsx("legend", { children: t('sessions.create.bots') }), bots.length ? (_jsxs(_Fragment, { children: [_jsx("input", { className: "cs-bot-search", type: "search", name: "botSearch", placeholder: t('sessions.create.botSearchPlaceholder'), "aria-label": t('sessions.create.botSearchPlaceholder'), value: botQuery, onChange: event => setBotQuery(event.currentTarget.value) }), visibleBots.length ? (_jsx("div", { className: "cs-bot-list", children: visibleBots.map(bot => (_jsxs("label", { className: "cs-bot", children: [_jsx("input", { type: "checkbox", name: "bot", value: bot.larkAppId, checked: selectedBots.has(bot.larkAppId), onChange: event => {
1299
- const checked = event.currentTarget.checked;
1300
- setSelectedBots(prev => {
1301
- const next = new Set(prev);
1302
- if (checked)
1303
- next.add(bot.larkAppId);
1304
- else
1305
- next.delete(bot.larkAppId);
1306
- if (!next.has(lead))
1307
- setLead(next.values().next().value ?? '');
1308
- return next;
1309
- });
1310
- } }), " ", _jsx("span", { children: bot.botName })] }, bot.larkAppId))) })) : _jsx("p", { className: "cs-empty", children: t('sessions.create.noBotMatch') }), checkedIds.length ? _jsx("small", { children: t('sessions.create.selectedCount', { n: String(checkedIds.length) }) }) : null] })) : _jsx("p", { className: "cs-empty", children: t('sessions.create.noBots') })] }), _jsxs("fieldset", { className: "cs-mode", children: [_jsx("legend", { children: t('sessions.create.mode') }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "mode", value: "lead", checked: mode === 'lead', onChange: () => setMode('lead') }), " ", t('sessions.create.modeLead')] }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "mode", value: "all", checked: mode === 'all', onChange: () => setMode('all') }), " ", t('sessions.create.modeAll')] }), _jsx("small", { children: t('sessions.create.modeHelp') })] }), feedGroupAuthUrl ? (_jsx("div", { className: "feed-group-auth-overlay", children: _jsxs("section", { className: "feed-group-auth-card", role: "dialog", "aria-modal": "true", "aria-labelledby": "session-feed-group-auth-title", children: [_jsx("h3", { id: "session-feed-group-auth-title", children: "\u6388\u6743\u98DE\u4E66\u6807\u7B7E" }), _jsxs("p", { children: ["\u70B9\u51FB\u4E0B\u9762\u7684\u6309\u94AE\uFF0C\u5728\u98DE\u4E66\u9875\u9762\u786E\u8BA4\u6388\u6743\u3002\u5982\u679C BotMux \u4E0E\u6D4F\u89C8\u5668\u5728\u540C\u4E00\u53F0\u7535\u8111\uFF0C\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u5B8C\u6210\u6388\u6743\u3002\u5982\u679C BotMux \u8FD0\u884C\u5728\u8FDC\u7A0B\u865A\u62DF\u673A\u4E0A\uFF0C\u6D4F\u89C8\u5668\u4F1A\u56E0\u65E0\u6CD5\u8BBF\u95EE\u672C\u673A\u5730\u5740 ", _jsx("code", { children: "127.0.0.1:9768" }), " \u800C\u663E\u793A\u201C\u65E0\u6CD5\u8BBF\u95EE\u201D\uFF1B\u6B64\u65F6\u8BF7\u590D\u5236\u5730\u5740\u680F\u4E2D\u7684\u5B8C\u6574\u94FE\u63A5\u5E76\u7C98\u8D34\u5230\u4E0B\u65B9\u3002"] }), _jsx("button", { type: "button", className: "primary feed-group-auth-open", onClick: () => window.open(feedGroupAuthUrl, '_blank', 'noopener'), children: "\u8DF3\u8F6C\u98DE\u4E66\u6388\u6743" }), _jsxs("label", { children: [_jsx("span", { children: "\u8BF7\u628A\u70B9\u51FB\u6388\u6743\u540E\u7684\u5B8C\u6574\u94FE\u63A5\u7C98\u8D34\u5728\u8FD9\u91CC" }), _jsx("input", { type: "url", value: feedGroupCallbackUrl, placeholder: "http://127.0.0.1:9768/callback?code=\u2026&state=\u2026", onChange: event => setFeedGroupCallbackUrl(event.currentTarget.value) })] }), _jsxs("div", { className: "actions", children: [_jsx("button", { type: "button", onClick: () => { setFeedGroupAuthUrl(''); setFeedGroupCallbackUrl(''); }, children: "\u53D6\u6D88" }), _jsx("button", { type: "button", className: "primary", disabled: !feedGroupCallbackUrl.trim() || feedGroupAuthSubmitting, onClick: () => void completeFeedGroupLogin(feedGroupCallbackUrl), children: feedGroupAuthSubmitting ? '正在完成授权…' : '完成授权' })] })] }) })) : null, _jsxs("fieldset", { className: "cs-lead-row", hidden: mode !== 'lead', children: [_jsx("legend", { children: t('sessions.create.lead') }), _jsx("select", { name: "lead", disabled: leadOptions.length === 0, value: leadOptions.includes(lead) ? lead : '', onChange: event => setLead(event.currentTarget.value), children: leadOptions.length ? leadOptions.map(id => _jsx("option", { value: id, children: nameOf(id) }, id)) : (_jsx("option", { value: "", disabled: true, children: t('sessions.create.leadPickFirst') })) }), _jsx("small", { children: t('sessions.create.leadHelp') })] }), _jsxs("fieldset", { className: "cs-column", children: [_jsx("legend", { children: t('sessions.create.column') }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "column", value: "in_progress", checked: column === 'in_progress', onChange: () => setColumn('in_progress') }), " ", t('sessions.create.columnInProgress')] }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "column", value: "backlog", checked: column === 'backlog', onChange: () => setColumn('backlog') }), " ", t('sessions.create.columnBacklog')] }), _jsx("small", { children: t('sessions.create.columnHelp') })] }), _jsxs("fieldset", { className: `cs-advanced${advancedOpen ? ' open' : ''}`, children: [_jsx("legend", { children: _jsx("button", { type: "button", id: "cs-advanced-title", className: "cs-advanced-title", "aria-expanded": advancedOpen, "aria-controls": "cs-advanced-fields", onClick: () => setAdvancedOpen(open => !open), children: t('sessions.create.optionalConfig') }) }), advancedOpen ? (_jsxs("div", { id: "cs-advanced-fields", className: "cs-advanced-fields", children: [_jsxs("label", { className: "cs-advanced-field", children: [_jsx("span", { children: t('sessions.create.groupName') }), _jsx("input", { className: "cs-pill-input", type: "text", name: "name", maxLength: 60, placeholder: t('sessions.create.groupNamePlaceholder'), value: name, onChange: event => setName(event.currentTarget.value) })] }), _jsxs("fieldset", { className: "cs-feed-group", children: [_jsx("legend", { children: "\u98DE\u4E66\u6807\u7B7E\uFF08\u53EF\u9009\uFF09" }), _jsx(FeedGroupPicker, { groups: feedGroups, selectedId: feedGroupId, newName: newFeedGroupName, disabled: feedGroupLoading || !!feedGroupError, onChange: (selectedId, newName) => { setFeedGroupId(selectedId); setNewFeedGroupName(newName); } }), _jsx("small", { children: "\u5C55\u5F00\u540E\u53EF\u5728\u7B2C\u4E00\u884C\u8F93\u5165\u65B0\u6807\u7B7E\u540D\u79F0\uFF0C\u6216\u9009\u62E9\u4E0B\u65B9\u5DF2\u6709\u6807\u7B7E\u3002" }), feedGroupLoading ? _jsx("small", { children: "\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u6807\u7B7E\u2026" }) : null, feedGroupError ? (_jsxs("div", { className: "cs-warn", children: [_jsx("small", { children: feedGroupError }), ' ', _jsx("button", { type: "button", disabled: feedGroupAuthSubmitting, onClick: () => void openFeedGroupLogin(), children: feedGroupAuthSubmitting ? '正在完成授权…' : '立即授权' }), _jsx("small", { children: " \u6388\u6743\u540E\u4F1A\u5F39\u7A97\u63D0\u793A\u4F60\u7C98\u8D34\u56DE\u8C03\u5730\u5740\u3002" })] })) : null] }), _jsxs("label", { className: "cs-advanced-field", children: [_jsx("span", { children: t('sessions.create.workingDir') }), _jsx("input", { className: "cs-pill-input", type: "text", name: "bindWorkingDir", placeholder: "e.g. ~/projects/foo", value: bindWorkingDir, onChange: event => setBindWorkingDir(event.currentTarget.value) }), _jsx("small", { children: t('sessions.create.workingDirHelp') })] })] })) : null] }), keptSuccess ? (_jsxs("p", { className: "cs-keep-success", role: "status", children: [_jsxs("span", { children: [keptSuccess.column === 'backlog' ? t('sessions.create.doneBacklog') : t('sessions.create.doneInProgress'), Array.isArray(keptSuccess.failed) && keptSuccess.failed.length > 0
1293
+ }, children: _jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", children: _jsx("path", { d: "M7 7l10 10M17 7 7 17" }) }) })] }, image.id))) })) : null] }), _jsxs("fieldset", { className: "cs-bots", children: [_jsx("legend", { children: t('sessions.create.bots') }), _jsx(BotMultiSelect, { bots: bots, selected: selectedBots, onToggle: (id, checked) => {
1294
+ setSelectedBots(prev => {
1295
+ const next = new Set(prev);
1296
+ if (checked)
1297
+ next.add(id);
1298
+ else
1299
+ next.delete(id);
1300
+ if (!next.has(lead))
1301
+ setLead(next.values().next().value ?? '');
1302
+ return next;
1303
+ });
1304
+ }, searchPlaceholder: t('botPicker.searchPlaceholder'), noMatchLabel: t('botPicker.noMatch'), emptyLabel: t('sessions.create.noBots'), selectedCountLabel: n => t('botPicker.selectedCount', { n: String(n) }) })] }), _jsxs("fieldset", { className: "cs-mode", children: [_jsx("legend", { children: t('sessions.create.mode') }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "mode", value: "lead", checked: mode === 'lead', onChange: () => setMode('lead') }), " ", t('sessions.create.modeLead')] }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "mode", value: "all", checked: mode === 'all', onChange: () => setMode('all') }), " ", t('sessions.create.modeAll')] }), _jsx("small", { children: t('sessions.create.modeHelp') })] }), feedGroupAuthUrl ? (_jsx("div", { className: "feed-group-auth-overlay", children: _jsxs("section", { className: "feed-group-auth-card", role: "dialog", "aria-modal": "true", "aria-labelledby": "session-feed-group-auth-title", children: [_jsx("h3", { id: "session-feed-group-auth-title", children: "\u6388\u6743\u98DE\u4E66\u6807\u7B7E" }), _jsxs("p", { children: ["\u70B9\u51FB\u4E0B\u9762\u7684\u6309\u94AE\uFF0C\u5728\u98DE\u4E66\u9875\u9762\u786E\u8BA4\u6388\u6743\u3002\u5982\u679C BotMux \u4E0E\u6D4F\u89C8\u5668\u5728\u540C\u4E00\u53F0\u7535\u8111\uFF0C\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u5B8C\u6210\u6388\u6743\u3002\u5982\u679C BotMux \u8FD0\u884C\u5728\u8FDC\u7A0B\u865A\u62DF\u673A\u4E0A\uFF0C\u6D4F\u89C8\u5668\u4F1A\u56E0\u65E0\u6CD5\u8BBF\u95EE\u672C\u673A\u5730\u5740 ", _jsx("code", { children: "127.0.0.1:9768" }), " \u800C\u663E\u793A\u201C\u65E0\u6CD5\u8BBF\u95EE\u201D\uFF1B\u6B64\u65F6\u8BF7\u590D\u5236\u5730\u5740\u680F\u4E2D\u7684\u5B8C\u6574\u94FE\u63A5\u5E76\u7C98\u8D34\u5230\u4E0B\u65B9\u3002"] }), _jsx("button", { type: "button", className: "primary feed-group-auth-open", onClick: () => window.open(feedGroupAuthUrl, '_blank', 'noopener'), children: "\u8DF3\u8F6C\u98DE\u4E66\u6388\u6743" }), _jsxs("label", { children: [_jsx("span", { children: "\u8BF7\u628A\u70B9\u51FB\u6388\u6743\u540E\u7684\u5B8C\u6574\u94FE\u63A5\u7C98\u8D34\u5728\u8FD9\u91CC" }), _jsx("input", { type: "url", value: feedGroupCallbackUrl, placeholder: "http://127.0.0.1:9768/callback?code=\u2026&state=\u2026", onChange: event => setFeedGroupCallbackUrl(event.currentTarget.value) })] }), _jsxs("div", { className: "actions", children: [_jsx("button", { type: "button", onClick: () => { setFeedGroupAuthUrl(''); setFeedGroupCallbackUrl(''); }, children: "\u53D6\u6D88" }), _jsx("button", { type: "button", className: "primary", disabled: !feedGroupCallbackUrl.trim() || feedGroupAuthSubmitting, onClick: () => void completeFeedGroupLogin(feedGroupCallbackUrl), children: feedGroupAuthSubmitting ? '正在完成授权…' : '完成授权' })] })] }) })) : null, _jsxs("fieldset", { className: "cs-lead-row", hidden: mode !== 'lead', children: [_jsx("legend", { children: t('sessions.create.lead') }), _jsx("select", { name: "lead", disabled: leadOptions.length === 0, value: leadOptions.includes(lead) ? lead : '', onChange: event => setLead(event.currentTarget.value), children: leadOptions.length ? leadOptions.map(id => _jsx("option", { value: id, children: nameOf(id) }, id)) : (_jsx("option", { value: "", disabled: true, children: t('sessions.create.leadPickFirst') })) }), _jsx("small", { children: t('sessions.create.leadHelp') })] }), _jsxs("fieldset", { className: "cs-column", children: [_jsx("legend", { children: t('sessions.create.column') }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "column", value: "in_progress", checked: column === 'in_progress', onChange: () => setColumn('in_progress') }), " ", t('sessions.create.columnInProgress')] }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "column", value: "backlog", checked: column === 'backlog', onChange: () => setColumn('backlog') }), " ", t('sessions.create.columnBacklog')] }), _jsx("small", { children: t('sessions.create.columnHelp') })] }), _jsxs("fieldset", { className: `cs-advanced${advancedOpen ? ' open' : ''}`, children: [_jsx("legend", { children: _jsx("button", { type: "button", id: "cs-advanced-title", className: "cs-advanced-title", "aria-expanded": advancedOpen, "aria-controls": "cs-advanced-fields", onClick: () => setAdvancedOpen(open => !open), children: t('sessions.create.optionalConfig') }) }), advancedOpen ? (_jsxs("div", { id: "cs-advanced-fields", className: "cs-advanced-fields", children: [_jsxs("label", { className: "cs-advanced-field", children: [_jsx("span", { children: t('sessions.create.groupName') }), _jsx("input", { className: "cs-pill-input", type: "text", name: "name", maxLength: 60, placeholder: t('sessions.create.groupNamePlaceholder'), value: name, onChange: event => setName(event.currentTarget.value) })] }), _jsxs("fieldset", { className: "cs-feed-group", children: [_jsx("legend", { children: "\u98DE\u4E66\u6807\u7B7E\uFF08\u53EF\u9009\uFF09" }), _jsx(FeedGroupPicker, { groups: feedGroups, selectedId: feedGroupId, newName: newFeedGroupName, disabled: feedGroupLoading || !!feedGroupError, onChange: (selectedId, newName) => { setFeedGroupId(selectedId); setNewFeedGroupName(newName); } }), _jsx("small", { children: "\u5C55\u5F00\u540E\u53EF\u5728\u7B2C\u4E00\u884C\u8F93\u5165\u65B0\u6807\u7B7E\u540D\u79F0\uFF0C\u6216\u9009\u62E9\u4E0B\u65B9\u5DF2\u6709\u6807\u7B7E\u3002" }), feedGroupLoading ? _jsx("small", { children: "\u6B63\u5728\u8BFB\u53D6\u98DE\u4E66\u6807\u7B7E\u2026" }) : null, feedGroupError ? (_jsxs("div", { className: "cs-warn", children: [_jsx("small", { children: feedGroupError }), ' ', _jsx("button", { type: "button", disabled: feedGroupAuthSubmitting, onClick: () => void openFeedGroupLogin(), children: feedGroupAuthSubmitting ? '正在完成授权…' : '立即授权' }), _jsx("small", { children: " \u6388\u6743\u540E\u4F1A\u5F39\u7A97\u63D0\u793A\u4F60\u7C98\u8D34\u56DE\u8C03\u5730\u5740\u3002" })] })) : null] }), _jsxs("label", { className: "cs-advanced-field", children: [_jsx("span", { children: t('sessions.create.workingDir') }), _jsx("input", { className: "cs-pill-input", type: "text", name: "bindWorkingDir", placeholder: "e.g. ~/projects/foo", value: bindWorkingDir, onChange: event => setBindWorkingDir(event.currentTarget.value) }), _jsx("small", { children: t('sessions.create.workingDirHelp') })] })] })) : null] }), keptSuccess ? (_jsxs("p", { className: "cs-keep-success", role: "status", children: [_jsxs("span", { children: [keptSuccess.column === 'backlog' ? t('sessions.create.doneBacklog') : t('sessions.create.doneInProgress'), Array.isArray(keptSuccess.failed) && keptSuccess.failed.length > 0
1311
1305
  ? ` · ${t('sessions.create.partialFail', { n: String(keptSuccess.failed.length) })}`
1312
1306
  : ''] }), typeof keptSuccess.shareLink === 'string' && keptSuccess.shareLink
1313
1307
  ? _jsx("a", { href: keptSuccess.shareLink, target: "_blank", rel: "noopener", children: t('sessions.create.openChat') })
@@ -1398,9 +1392,7 @@ function SessionsPage() {
1398
1392
  if (!filters.showUnknownChats && isUnknownChatSession(row))
1399
1393
  continue;
1400
1394
  const label = sessionLocationText(row);
1401
- const existing = options.get(chatId);
1402
- if (!existing || label < existing)
1403
- options.set(chatId, label);
1395
+ options.set(chatId, preferChatFilterLabel(options.get(chatId), label, chatId));
1404
1396
  }
1405
1397
  return [...options.entries()]
1406
1398
  .sort((a, b) => a[1].localeCompare(b[1]))