dsh-input-traffic 0.7.0 → 0.7.3

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/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["useMemo","useState","useRef","useSyncExternalStore","useId","css","IconQueueOutlineMedium","IconChevronDownOutlineMedium","IconChevronUpOutlineMedium","Tooltip","IconTrashOutlineMedium","IconCheckOutlineMedium","IconCloseOutlineMedium","IconEditOutlineMedium","useSyncExternalStore","css","useSyncExternalStore","createElement"],"sources":["src/client/locales.ts","src/client/freeze-store.ts","src/client/steer-queue-dock.tsx","src/client/session-guard-bridge.ts","src/client/freeze-button.tsx","src/client/family-card.tsx","src/client/hide-enter-row.tsx","src/client/compat.ts","src/client/index.ts"],"sourcesContent":["/** `steer` client dictionaries (zh / en / ja / ko). */\n\n/** Dictionary namespace owned by this plugin. */\nexport const NS = 'steer'\n\n/** Simplified Chinese dictionary (the key-set source of truth). */\nexport const zh = {\n 'family.title': '输入流量',\n 'family.busyEnter': 'busy-Enter 行为(本插件接管)',\n 'family.desc': '普通回车在繁忙时进入排队(queue),不会打断当前回答;打断请用输入区的冻结/转向按钮。该行为由本插件自动接管,无需配置。',\n 'queue.count': '{n} 条排队消息',\n 'queue.edit': '编辑排队消息',\n 'queue.edit.unsupported': '包含非文本内容,暂不支持编辑',\n 'queue.save': '保存排队消息',\n 'queue.cancelEdit': '取消编辑',\n 'queue.remove': '删除排队消息',\n 'queue.removeFailed': '删除失败:这条消息可能已经开始发送。',\n 'queue.editFailed': '编辑失败:这条消息可能已经开始发送。',\n 'queue.editFailed.pulledBack': '编辑失败,内容已退回主输入框,请确认后重新发送。',\n 'steer.inflight': '{n} 条正在插入',\n 'steer.now': '打断并输入',\n 'steer.now.aria': '红色:打断当前动作并立即输入',\n 'steer.now.unsupported': '包含非文本内容,暂不支持打断',\n 'steer.nowFailed': '打断失败,请重试。',\n 'steer.next': '插话发送',\n 'steer.next.aria': '黄色:当前动作结束后插入输入',\n 'steer.nextFailed': '插话发送失败,请重试。',\n 'steer.later': '排队到下一轮',\n 'steer.later.aria': '绿色:排队,上一轮输入的动作都结束后再处理',\n 'steer.revoke': '收回排队',\n 'steer.revoke.aria': '绿色:撤销插入,收回排队(下一轮处理)',\n 'steer.revoke.unsupported': '包含非文本内容,暂不支持收回',\n 'steer.revokeFailed': '收回排队失败,请重试。',\n 'steer.moveUp': '上移',\n 'steer.moveDown': '下移',\n 'steer.reorder.unsupported': '包含非文本内容,暂不支持排序',\n 'steer.reorderFailed': '调整顺序失败,请重试。',\n 'steer.reorderStale': '队列已变化,本次排序已取消,请重试。',\n 'steer.dragReorder': '拖动调整顺序',\n 'steer.pullBack': '打回输入框编辑',\n 'steer.pullBack.unsupported': '包含非文本内容,暂不支持打回编辑',\n 'steer.pullBack.composerBusy': '主输入框已有内容,请先发送或清空后再打回',\n 'steer.pullBackFailed': '打回输入框失败,请重试。',\n 'steer.badge.now': '打断中',\n 'steer.badge.next': '插话中',\n 'steer.badge.later': '排队',\n 'steer.unavailable.running': '仅运行中可规划',\n 'steer.clear': '取消并清空',\n 'steer.clear.confirm': '确认清空?',\n 'steer.clear.cancel': '取消清空',\n 'steer.clear.aria': '取消当前执行并清空全部排队消息',\n 'steer.clearFailed': '取消并清空失败,请重试。',\n 'steer.freeze': '冻结追加',\n 'steer.resume': '恢复追加',\n 'steer.frozen': '已冻结:当前轮次完成后暂停,排队消息将在恢复后继续',\n 'steer.frozenInput': '已冻结:输入已暂停,恢复后继续',\n 'steer.frozenBadge': '已冻结',\n 'steer.freezeFailed': '冻结失败,请重试。',\n 'steer.resumeFailed': '恢复失败,请重试。',\n} satisfies Record<string, string>\n\n/** English dictionary (keys mirror zh). */\nexport const en: Record<keyof typeof zh, string> = {\n 'family.title': 'Input Traffic',\n 'family.busyEnter': 'busy-Enter behavior (managed by this plugin)',\n 'family.desc': 'Plain Enter queues while busy instead of interrupting; use the freeze/steer control in the composer to interrupt. Managed automatically — nothing to configure.',\n 'queue.count': '{n} queued messages',\n 'queue.edit': 'Edit queued message',\n 'queue.edit.unsupported': 'Contains non-text content; editing is unsupported',\n 'queue.save': 'Save queued message',\n 'queue.cancelEdit': 'Cancel edit',\n 'queue.remove': 'Remove queued message',\n 'queue.removeFailed': 'Remove failed: the message may have started sending.',\n 'queue.editFailed': 'Edit failed: the message may have started sending.',\n 'queue.editFailed.pulledBack': 'Edit failed; the content was moved back to the composer, please review and resend.',\n 'steer.inflight': '{n} inserting',\n 'steer.now': 'Interrupt and send',\n 'steer.now.aria': 'Red: interrupt the running action and send now',\n 'steer.now.unsupported': 'Contains non-text content; interrupting is unsupported',\n 'steer.nowFailed': 'Interrupt failed, please retry.',\n 'steer.next': 'Send after action',\n 'steer.next.aria': 'Yellow: insert after the current action finishes',\n 'steer.nextFailed': 'Steering failed, please retry.',\n 'steer.later': 'Queue for next turn',\n 'steer.later.aria': 'Green: queue; processed after all previously steered actions finish',\n 'steer.revoke': 'Pull back to queue',\n 'steer.revoke.aria': 'Green: revoke the insertion and queue for the next turn',\n 'steer.revoke.unsupported': 'Contains non-text content; revoking is unsupported',\n 'steer.revokeFailed': 'Revoke failed, please retry.',\n 'steer.moveUp': 'Move up',\n 'steer.moveDown': 'Move down',\n 'steer.reorder.unsupported': 'Contains non-text content; reordering is unsupported',\n 'steer.reorderFailed': 'Reorder failed, please retry.',\n 'steer.reorderStale': 'The queue changed; this reorder was cancelled, please retry.',\n 'steer.dragReorder': 'Drag to reorder',\n 'steer.pullBack': 'Edit in composer',\n 'steer.pullBack.unsupported': 'Contains non-text content; pulling back is unsupported',\n 'steer.pullBack.composerBusy': 'The composer already has content; send or clear it first',\n 'steer.pullBackFailed': 'Pull back failed, please retry.',\n 'steer.badge.now': 'interrupting',\n 'steer.badge.next': 'steering',\n 'steer.badge.later': 'queued',\n 'steer.unavailable.running': 'Planning requires a running session',\n 'steer.clear': 'Cancel and clear',\n 'steer.clear.confirm': 'Confirm clear?',\n 'steer.clear.cancel': 'Cancel clearing',\n 'steer.clear.aria': 'Cancel the current run and clear all queued messages',\n 'steer.clearFailed': 'Cancel and clear failed, please retry.',\n 'steer.freeze': 'Freeze & append',\n 'steer.resume': 'Resume & append',\n 'steer.frozen': 'Frozen: the current turn finishes, then the queue pauses until resumed',\n 'steer.frozenInput': 'Frozen: input paused, resume to continue',\n 'steer.frozenBadge': 'frozen',\n 'steer.freezeFailed': 'Freeze failed, please retry.',\n 'steer.resumeFailed': 'Resume failed, please retry.',\n}\n\n/** Japanese dictionary (keys mirror zh). */\nexport const ja: Record<keyof typeof zh, string> = {\n 'family.title': '入力トラフィック',\n 'family.busyEnter': 'busy-Enter 動作(本プラグインが管理)',\n 'family.desc': '通常の Enter はビジー時にキューへ入ります(割り込みなし)。割り込みは入力欄の凍結/ステアで。自動管理のため設定不要。',\n 'queue.count': '{n} 件のキューイング済みメッセージ',\n 'queue.edit': 'キューイング済みメッセージを編集',\n 'queue.edit.unsupported': '非テキストコンテンツが含まれており、編集はサポートされていません',\n 'queue.save': 'キューイング済みメッセージを保存',\n 'queue.cancelEdit': '編集をキャンセル',\n 'queue.remove': 'キューイング済みメッセージを削除',\n 'queue.removeFailed': '削除失敗:メッセージの送信が既に開始されている可能性があります。',\n 'queue.editFailed': '編集失敗:メッセージの送信が既に開始されている可能性があります。',\n 'queue.editFailed.pulledBack': '編集失敗。コンテンツはコンポーザに戻されました。確認後再送信してください。',\n 'steer.inflight': '{n} 件挿入中',\n 'steer.now': '中断して送信',\n 'steer.now.aria': '赤:実行中のアクションを中断して即座に送信',\n 'steer.now.unsupported': '非テキストコンテンツが含まれており、中断はサポートされていません',\n 'steer.nowFailed': '中断失敗。再試行してください。',\n 'steer.next': 'アクション後に送信',\n 'steer.next.aria': '黄:現在のアクション完了後に挿入',\n 'steer.nextFailed': 'ステア失敗。再試行してください。',\n 'steer.later': '次のターンまでキューイング',\n 'steer.later.aria': '緑:キューイング。以前のステア済みアクションがすべて完了してから処理',\n 'steer.revoke': 'キューに戻す',\n 'steer.revoke.aria': '緑:挿入を取り消し、次のターンまでキューイング',\n 'steer.revoke.unsupported': '非テキストコンテンツが含まれており、取り消しはサポートされていません',\n 'steer.revokeFailed': '取り消し失敗。再試行してください。',\n 'steer.moveUp': '上へ移動',\n 'steer.moveDown': '下へ移動',\n 'steer.reorder.unsupported': '非テキストコンテンツが含まれており、並べ替えはサポートされていません',\n 'steer.reorderFailed': '並べ替え失敗。再試行してください。',\n 'steer.reorderStale': 'キューが変更されました。本次の並べ替えはキャンセルされました。再試行してください。',\n 'steer.dragReorder': 'ドラッグして並べ替え',\n 'steer.pullBack': 'コンポーザに送り直して編集',\n 'steer.pullBack.unsupported': '非テキストコンテンツが含まれており、送り直しはサポートされていません',\n 'steer.pullBack.composerBusy': 'コンポーザに既にコンテンツがあります。送信またはクリアしてください',\n 'steer.pullBackFailed': '送り直し失敗。再試行してください。',\n 'steer.badge.now': '中断中',\n 'steer.badge.next': 'ステア中',\n 'steer.badge.later': 'キューイング済み',\n 'steer.unavailable.running': '実行中のみプランニング可能',\n 'steer.clear': '取り消して全消去',\n 'steer.clear.confirm': '消去を確認?',\n 'steer.clear.cancel': '消去をキャンセル',\n 'steer.clear.aria': '実行を停止し、すべてのキューイング済みメッセージを消去',\n 'steer.clearFailed': '取り消して全消去失敗。再試行してください。',\n 'steer.freeze': '凍結して追加',\n 'steer.resume': '再開して追加',\n 'steer.frozen': '凍結中:現在のターン完了後一時停止、再開後にキューが継続',\n 'steer.frozenInput': '凍結中:入力一時停止、再開後に継続',\n 'steer.frozenBadge': '凍結済み',\n 'steer.freezeFailed': '凍結失敗。再試行してください。',\n 'steer.resumeFailed': '再開失敗。再試行してください。',\n}\n\n/** Korean dictionary (keys mirror zh). */\nexport const ko: Record<keyof typeof zh, string> = {\n 'family.title': '입력 트래픽',\n 'family.busyEnter': 'busy-Enter 동작(이 플러그인이 관리)',\n 'family.desc': '일반 Enter는 사용 중일 때 큐에 들어가 현재 답변을 끊지 않습니다. 중단이 필요하면 입력 창의 동결/스티어 버튼을 사용하세요. 자동 관리되므로 설정이 없습니다.',\n 'queue.count': '{n}개 대기열 메시지',\n 'queue.edit': '대기열 메시지 편집',\n 'queue.edit.unsupported': '비텍스트 콘텐츠가 포함되어 있어 편집이 지원되지 않습니다',\n 'queue.save': '대기열 메시지 저장',\n 'queue.cancelEdit': '편집 취소',\n 'queue.remove': '대기열 메시지 삭제',\n 'queue.removeFailed': '삭제 실패: 메시지 전송이 이미 시작되었을 수 있습니다.',\n 'queue.editFailed': '편집 실패: 메시지 전송이 이미 시작되었을 수 있습니다.',\n 'queue.editFailed.pulledBack': '편집 실패. 콘텐츠가 컴포저로 돌아갔습니다. 확인 후 다시 전송하세요.',\n 'steer.inflight': '{n}개 삽입 중',\n 'steer.now': '중단 후 전송',\n 'steer.now.aria': '빨간색: 실행 중인 액션을 중단하고 즉시 전송',\n 'steer.now.unsupported': '비텍스트 콘텐츠가 포함되어 있어 중단이 지원되지 않습니다',\n 'steer.nowFailed': '중단 실패. 다시 시도하세요.',\n 'steer.next': '액션 후 전송',\n 'steer.next.aria': '노란색: 현재 액션 완료 후 삽입',\n 'steer.nextFailed': '스티어 실패. 다시 시도하세요.',\n 'steer.later': '다음 턴까지 대기',\n 'steer.later.aria': '초록색: 대기. 이전 스티어된 액션이 모두 완료된 후 처리',\n 'steer.revoke': '대기열로 되돌리기',\n 'steer.revoke.aria': '초록색: 삽입 취소, 다음 턴까지 대기',\n 'steer.revoke.unsupported': '비텍스트 콘텐츠가 포함되어 있어 취소가 지원되지 않습니다',\n 'steer.revokeFailed': '취소 실패. 다시 시도하세요.',\n 'steer.moveUp': '위로 이동',\n 'steer.moveDown': '아래로 이동',\n 'steer.reorder.unsupported': '비텍스트 콘텐츠가 포함되어 있어 재정렬이 지원되지 않습니다',\n 'steer.reorderFailed': '재정렬 실패. 다시 시도하세요.',\n 'steer.reorderStale': '대기열이 변경되었습니다. 이번 재정렬이 취소되었습니다. 다시 시도하세요.',\n 'steer.dragReorder': '드래그로 재정렬',\n 'steer.pullBack': '컴포저로 되돌려 편집',\n 'steer.pullBack.unsupported': '비텍스트 콘텐츠가 포함되어 있어 되돌리기가 지원되지 않습니다',\n 'steer.pullBack.composerBusy': '컴포저에 이미 콘텐츠가 있습니다. 먼저 전송하거나 비우세요',\n 'steer.pullBackFailed': '되돌리기 실패. 다시 시도하세요.',\n 'steer.badge.now': '중단 중',\n 'steer.badge.next': '스티어 중',\n 'steer.badge.later': '대기열',\n 'steer.unavailable.running': '실행 중에만 계획 가능',\n 'steer.clear': '취소 후 전체 지우기',\n 'steer.clear.confirm': '지우기 확인?',\n 'steer.clear.cancel': '지우기 취소',\n 'steer.clear.aria': '현재 실행을 중지하고 모든 대기열 메시지를 지우기',\n 'steer.clearFailed': '취소 후 전체 지우기 실패. 다시 시도하세요.',\n 'steer.freeze': '동결 후 추가',\n 'steer.resume': '재개 후 추가',\n 'steer.frozen': '동결됨: 현재 턴 완료 후 일시정지, 재개 시 대기열 계속',\n 'steer.frozenInput': '동결됨: 입력 일시정지, 재개 시 계속',\n 'steer.frozenBadge': '동결됨',\n 'steer.freezeFailed': '동결 실패. 다시 시도하세요.',\n 'steer.resumeFailed': '재개 실패. 다시 시도하세요.',\n}\n\n/** French dictionary (keys mirror zh). */\nexport const fr: Record<keyof typeof zh, string> = {\n 'family.title': 'Trafic d\\'entr\\u00e9e',\n 'family.busyEnter': 'Comportement busy-Enter (g\\u00e9r\\u00e9 par ce plugin)',\n 'family.desc': 'Entr\\u00e9e simple met en file d\\'attente quand occup\\u00e9 sans interrompre ; utilisez le bouton geler/rediriger du composeur pour interrompre. G\\u00e9r\\u00e9 automatiquement \\u2014 rien \\u00e0 configurer.',\n 'queue.count': '{n} messages en file d\\'attente',\n 'queue.edit': 'Modifier le message en file d\\'attente',\n 'queue.edit.unsupported': 'Contient du contenu non textuel ; modification non prise en charge',\n 'queue.save': 'Enregistrer le message en file d\\'attente',\n 'queue.cancelEdit': 'Annuler la modification',\n 'queue.remove': 'Supprimer le message en file d\\'attente',\n 'queue.removeFailed': '\\u00c9chec de la suppression : le message a peut-\\u00eatre commenc\\u00e9 \\u00e0 \\u00eatre envoy\\u00e9.',\n 'queue.editFailed': '\\u00c9chec de la modification : le message a peut-\\u00eatre commenc\\u00e9 \\u00e0 \\u00eatre envoy\\u00e9.',\n 'queue.editFailed.pulledBack': '\\u00c9chec de la modification ; le contenu a \\u00e9t\\u00e9 renvoy\\u00e9 au composeur, veuillez v\\u00e9rifier et renvoyer.',\n 'steer.inflight': '{n} en cours d\\'insertion',\n 'steer.now': 'Interrompre et envoyer',\n 'steer.now.aria': 'Rouge : interrompre l\\'action en cours et envoyer imm\\u00e9diatement',\n 'steer.now.unsupported': 'Contient du contenu non textuel ; interruption non prise en charge',\n 'steer.nowFailed': '\\u00c9chec de l\\'interruption, veuillez r\\u00e9essayer.',\n 'steer.next': 'Envoyer apr\\u00e8s l\\'action',\n 'steer.next.aria': 'Jaune : ins\\u00e9rer apr\\u00e8s la fin de l\\'action en cours',\n 'steer.nextFailed': '\\u00c9chec de la redirection, veuillez r\\u00e9essayer.',\n 'steer.later': 'Mettre en file pour le prochain tour',\n 'steer.later.aria': 'Vert : mettre en file ; trait\\u00e9 apr\\u00e8s la fin de toutes les actions redirig\\u00e9es',\n 'steer.revoke': 'Rappeler en file d\\'attente',\n 'steer.revoke.aria': 'Vert : annuler l\\'insertion et mettre en file pour le prochain tour',\n 'steer.revoke.unsupported': 'Contient du contenu non textuel ; rappel non pris en charge',\n 'steer.revokeFailed': '\\u00c9chec du rappel, veuillez r\\u00e9essayer.',\n 'steer.moveUp': 'D\\u00e9placer vers le haut',\n 'steer.moveDown': 'D\\u00e9placer vers le bas',\n 'steer.reorder.unsupported': 'Contient du contenu non textuel ; r\\u00e9ordonnancement non pris en charge',\n 'steer.reorderFailed': '\\u00c9chec du r\\u00e9ordonnancement, veuillez r\\u00e9essayer.',\n 'steer.reorderStale': 'La file a chang\\u00e9 ; ce r\\u00e9ordonnancement a \\u00e9t\\u00e9 annul\\u00e9, veuillez r\\u00e9essayer.',\n 'steer.dragReorder': 'Glisser pour r\\u00e9ordonner',\n 'steer.pullBack': 'Renvoyer au composeur pour modification',\n 'steer.pullBack.unsupported': 'Contient du contenu non textuel ; renvoi non pris en charge',\n 'steer.pullBack.composerBusy': 'Le composeur contient d\\u00e9j\\u00e0 du contenu ; envoyez ou effacez d\\'abord',\n 'steer.pullBackFailed': '\\u00c9chec du renvoi au composeur, veuillez r\\u00e9essayer.',\n 'steer.badge.now': 'interruption',\n 'steer.badge.next': 'redirection',\n 'steer.badge.later': 'en file',\n 'steer.unavailable.running': 'Planification possible uniquement en cours d\\'ex\\u00e9cution',\n 'steer.clear': 'Annuler et tout effacer',\n 'steer.clear.confirm': 'Confirmer l\\'effacement ?',\n 'steer.clear.cancel': 'Annuler l\\'effacement',\n 'steer.clear.aria': 'Annuler l\\'ex\\u00e9cution en cours et effacer tous les messages en file d\\'attente',\n 'steer.clearFailed': '\\u00c9chec de l\\'annulation et de l\\'effacement, veuillez r\\u00e9essayer.',\n 'steer.freeze': 'Geler et ajouter',\n 'steer.resume': 'Reprendre et ajouter',\n 'steer.frozen': 'G\\u00e9l\\u00e9 : le tour en cours se termine puis la file est suspendue jusqu\\'\\u00e0 la reprise',\n 'steer.frozenInput': 'G\\u00e9l\\u00e9 : entr\\u00e9e suspendue, reprendre pour continuer',\n 'steer.frozenBadge': 'gel\\u00e9',\n 'steer.freezeFailed': '\\u00c9chec du gel, veuillez r\\u00e9essayer.',\n 'steer.resumeFailed': '\\u00c9chec de la reprise, veuillez r\\u00e9essayer.',\n}\n\n/** German dictionary (keys mirror zh). */\nexport const de: Record<keyof typeof zh, string> = {\n 'family.title': 'Eingabeverkehr',\n 'family.busyEnter': 'Busy-Enter-Verhalten (von diesem Plugin verwaltet)',\n 'family.desc': 'Einfaches Enter reiht bei Besch\\u00e4ftigung ein, statt zu unterbrechen; zum Unterbrechen die Einfrieren/Steuern-Schaltfl\\u00e4che im Composer verwenden. Automatisch verwaltet \\u2014 keine Konfiguration n\\u00f6tig.',\n 'queue.count': '{n} Nachrichten in der Warteschlange',\n 'queue.edit': 'Warteschlangennachricht bearbeiten',\n 'queue.edit.unsupported': 'Enth\\u00e4lt Nicht-Text-Inhalt; Bearbeiten nicht unterst\\u00fctzt',\n 'queue.save': 'Warteschlangennachricht speichern',\n 'queue.cancelEdit': 'Bearbeitung abbrechen',\n 'queue.remove': 'Warteschlangennachricht entfernen',\n 'queue.removeFailed': 'Entfernen fehlgeschlagen: Die Nachricht wurde m\\u00f6glicherweise bereits gesendet.',\n 'queue.editFailed': 'Bearbeiten fehlgeschlagen: Die Nachricht wurde m\\u00f6glicherweise bereits gesendet.',\n 'queue.editFailed.pulledBack': 'Bearbeiten fehlgeschlagen; Inhalt wurde in den Composer zur\\u00fcckverschoben, bitte pr\\u00fcfen und erneut senden.',\n 'steer.inflight': '{n} werden eingef\\u00fcgt',\n 'steer.now': 'Unterbrechen und senden',\n 'steer.now.aria': 'Rot: Laufende Aktion unterbrechen und sofort senden',\n 'steer.now.unsupported': 'Enth\\u00e4lt Nicht-Text-Inhalt; Unterbrechen nicht unterst\\u00fctzt',\n 'steer.nowFailed': 'Unterbrechen fehlgeschlagen, bitte erneut versuchen.',\n 'steer.next': 'Nach Aktion senden',\n 'steer.next.aria': 'Gelb: Nach Abschluss der aktuellen Aktion einf\\u00fcgen',\n 'steer.nextFailed': 'Steuerung fehlgeschlagen, bitte erneut versuchen.',\n 'steer.later': 'F\\u00fcr n\\u00e4chste Runde einreihen',\n 'steer.later.aria': 'Gr\\u00fcn: Einreihen; Verarbeitung nach Abschluss aller zuvor gesteuerten Aktionen',\n 'steer.revoke': 'Zur\\u00fcck in Warteschlange',\n 'steer.revoke.aria': 'Gr\\u00fcn: Einf\\u00fcgung widerrufen und f\\u00fcr n\\u00e4chste Runde einreihen',\n 'steer.revoke.unsupported': 'Enth\\u00e4lt Nicht-Text-Inhalt; Widerrufen nicht unterst\\u00fctzt',\n 'steer.revokeFailed': 'Widerrufen fehlgeschlagen, bitte erneut versuchen.',\n 'steer.moveUp': 'Nach oben',\n 'steer.moveDown': 'Nach unten',\n 'steer.reorder.unsupported': 'Enth\\u00e4lt Nicht-Text-Inhalt; Umsortieren nicht unterst\\u00fctzt',\n 'steer.reorderFailed': 'Umsortieren fehlgeschlagen, bitte erneut versuchen.',\n 'steer.reorderStale': 'Warteschlange ge\\u00e4ndert; Umsortierung abgebrochen, bitte erneut versuchen.',\n 'steer.dragReorder': 'Ziehen zum Umsortieren',\n 'steer.pullBack': 'In Composer zur\\u00fcckholen',\n 'steer.pullBack.unsupported': 'Enth\\u00e4lt Nicht-Text-Inhalt; Zur\\u00fcckholen nicht unterst\\u00fctzt',\n 'steer.pullBack.composerBusy': 'Composer enth\\u00e4lt bereits Inhalt; zuerst senden oder leeren',\n 'steer.pullBackFailed': 'Zur\\u00fcckholen fehlgeschlagen, bitte erneut versuchen.',\n 'steer.badge.now': 'unterbricht',\n 'steer.badge.next': 'steuert',\n 'steer.badge.later': 'eingereiht',\n 'steer.unavailable.running': 'Planung nur w\\u00e4hrend der Ausf\\u00fchrung m\\u00f6glich',\n 'steer.clear': 'Abbrechen und leeren',\n 'steer.clear.confirm': 'Leeren best\\u00e4tigen?',\n 'steer.clear.cancel': 'Leeren abbrechen',\n 'steer.clear.aria': 'Aktuelle Ausf\\u00fchrung abbrechen und alle Warteschlangennachrichten leeren',\n 'steer.clearFailed': 'Abbrechen und Leeren fehlgeschlagen, bitte erneut versuchen.',\n 'steer.freeze': 'Einfrieren & anh\\u00e4ngen',\n 'steer.resume': 'Fortsetzen & anh\\u00e4ngen',\n 'steer.frozen': 'Eingefroren: Aktuelle Runde endet, dann pausiert die Warteschlange bis zur Fortsetzung',\n 'steer.frozenInput': 'Eingefroren: Eingabe pausiert, fortsetzen um weiterzumachen',\n 'steer.frozenBadge': 'eingefroren',\n 'steer.freezeFailed': 'Einfrieren fehlgeschlagen, bitte erneut versuchen.',\n 'steer.resumeFailed': 'Fortsetzen fehlgeschlagen, bitte erneut versuchen.',\n}\n\n/** Italian dictionary (keys mirror zh). */\nexport const it: Record<keyof typeof zh, string> = {\n 'family.title': 'Traffico di input',\n 'family.busyEnter': 'Comportamento busy-Enter (gestito da questo plugin)',\n 'family.desc': 'Invio semplice accoda quando occupato senza interrompere; usa il pulsante congela/devia nel compositore per interrompere. Gestito automaticamente \\u2014 nessuna configurazione necessaria.',\n 'queue.count': '{n} messaggi in coda',\n 'queue.edit': 'Modifica messaggio in coda',\n 'queue.edit.unsupported': 'Contiene contenuto non testuale; modifica non supportata',\n 'queue.save': 'Salva messaggio in coda',\n 'queue.cancelEdit': 'Annulla modifica',\n 'queue.remove': 'Rimuovi messaggio in coda',\n 'queue.removeFailed': 'Rimozione fallita: il messaggio potrebbe aver iniziato l\\'invio.',\n 'queue.editFailed': 'Modifica fallita: il messaggio potrebbe aver iniziato l\\'invio.',\n 'queue.editFailed.pulledBack': 'Modifica fallita; il contenuto \\u00e8 stato riportato nel compositore, verificare e reinviare.',\n 'steer.inflight': '{n} in inserimento',\n 'steer.now': 'Interrompi e invia',\n 'steer.now.aria': 'Rosso: interrompi l\\'azione in corso e invia immediatamente',\n 'steer.now.unsupported': 'Contiene contenuto non testuale; interruzione non supportata',\n 'steer.nowFailed': 'Interruzione fallita, riprovare.',\n 'steer.next': 'Invia dopo l\\'azione',\n 'steer.next.aria': 'Giallo: inserisci al termine dell\\'azione corrente',\n 'steer.nextFailed': 'Deviazione fallita, riprovare.',\n 'steer.later': 'Accoda per il prossimo turno',\n 'steer.later.aria': 'Verde: accoda; elaborato al termine di tutte le azioni deviate precedenti',\n 'steer.revoke': 'Riporta in coda',\n 'steer.revoke.aria': 'Verde: revoca l\\'inserimento e accoda per il prossimo turno',\n 'steer.revoke.unsupported': 'Contiene contenuto non testuale; revoca non supportata',\n 'steer.revokeFailed': 'Revoca fallita, riprovare.',\n 'steer.moveUp': 'Sposta su',\n 'steer.moveDown': 'Sposta gi\\u00f9',\n 'steer.reorder.unsupported': 'Contiene contenuto non testuale; riordino non supportato',\n 'steer.reorderFailed': 'Riordino fallito, riprovare.',\n 'steer.reorderStale': 'La coda \\u00e8 cambiata; riordino annullato, riprovare.',\n 'steer.dragReorder': 'Trascina per riordinare',\n 'steer.pullBack': 'Riporta nel compositore per modifica',\n 'steer.pullBack.unsupported': 'Contiene contenuto non testuale; riporto non supportato',\n 'steer.pullBack.composerBusy': 'Il compositore contiene gi\\u00e0 contenuto; inviare o svuotare prima',\n 'steer.pullBackFailed': 'Riporto nel compositore fallito, riprovare.',\n 'steer.badge.now': 'interruzione',\n 'steer.badge.next': 'deviazione',\n 'steer.badge.later': 'in coda',\n 'steer.unavailable.running': 'Pianificazione disponibile solo durante l\\'esecuzione',\n 'steer.clear': 'Annulla e svuota',\n 'steer.clear.confirm': 'Confermare lo svuotamento?',\n 'steer.clear.cancel': 'Annulla svuotamento',\n 'steer.clear.aria': 'Annulla l\\'esecuzione corrente e svuota tutti i messaggi in coda',\n 'steer.clearFailed': 'Annullamento e svuotamento falliti, riprovare.',\n 'steer.freeze': 'Congela e aggiungi',\n 'steer.resume': 'Riprendi e aggiungi',\n 'steer.frozen': 'Congelato: il turno corrente termina, poi la coda si sospende fino alla ripresa',\n 'steer.frozenInput': 'Congelato: input sospeso, riprendere per continuare',\n 'steer.frozenBadge': 'congelato',\n 'steer.freezeFailed': 'Congelamento fallito, riprovare.',\n 'steer.resumeFailed': 'Ripresa fallita, riprovare.',\n}\n\n/** Russian dictionary (keys mirror zh). */\nexport const ru: Record<keyof typeof zh, string> = {\n 'family.title': '\\u0412\\u0445\\u043e\\u0434\\u044f\\u0449\\u0438\\u0439 \\u043f\\u043e\\u0442\\u043e\\u043a',\n 'family.busyEnter': '\\u041f\\u043e\\u0432\\u0435\\u0434\\u0435\\u043d\\u0438\\u0435 busy-Enter (\\u0443\\u043f\\u0440\\u0430\\u0432\\u043b\\u044f\\u0435\\u0442\\u0441\\u044f \\u044d\\u0442\\u0438\\u043c \\u043f\\u043b\\u0430\\u0433\\u0438\\u043d\\u043e\\u043c)',\n 'family.desc': '\\u041e\\u0431\\u044b\\u0447\\u043d\\u044b\\u0439 Enter \\u0441\\u0442\\u0430\\u0432\\u0438\\u0442 \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c \\u043f\\u0440\\u0438 \\u0437\\u0430\\u043d\\u044f\\u0442\\u043e\\u0441\\u0442\\u0438, \\u043d\\u0435 \\u043f\\u0440\\u0435\\u0440\\u044b\\u0432\\u0430\\u044f; \\u0434\\u043b\\u044f \\u043f\\u0440\\u0435\\u0440\\u044b\\u0432\\u0430\\u043d\\u0438\\u044f \\u0438\\u0441\\u043f\\u043e\\u043b\\u044c\\u0437\\u0443\\u0439\\u0442\\u0435 \\u043a\\u043d\\u043e\\u043f\\u043a\\u0443 \\u0437\\u0430\\u043c\\u043e\\u0440\\u043e\\u0437\\u043a\\u0438/\\u043f\\u0435\\u0440\\u0435\\u043d\\u0430\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u044f \\u0432 \\u043f\\u043e\\u043b\\u0435 \\u0432\\u0432\\u043e\\u0434\\u0430. \\u0423\\u043f\\u0440\\u0430\\u0432\\u043b\\u044f\\u0435\\u0442\\u0441\\u044f \\u0430\\u0432\\u0442\\u043e\\u043c\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438 \\u2014 \\u043d\\u0430\\u0441\\u0442\\u0440\\u043e\\u0439\\u043a\\u0430 \\u043d\\u0435 \\u0442\\u0440\\u0435\\u0431\\u0443\\u0435\\u0442\\u0441\\u044f.',\n 'queue.count': '{n} \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0439 \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'queue.edit': '\\u0420\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435 \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'queue.edit.unsupported': '\\u0421\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043d\\u0435\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0442\\u0435\\u043d\\u0442; \\u0440\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435 \\u043d\\u0435 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f',\n 'queue.save': '\\u0421\\u043e\\u0445\\u0440\\u0430\\u043d\\u0438\\u0442\\u044c \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435 \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'queue.cancelEdit': '\\u041e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u0440\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435',\n 'queue.remove': '\\u0423\\u0434\\u0430\\u043b\\u0438\\u0442\\u044c \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0437 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'queue.removeFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u0443\\u0434\\u0430\\u043b\\u0438\\u0442\\u044c: \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435, \\u0432\\u043e\\u0437\\u043c\\u043e\\u0436\\u043d\\u043e, \\u0443\\u0436\\u0435 \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u043b\\u044f\\u0435\\u0442\\u0441\\u044f.',\n 'queue.editFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043e\\u0442\\u0440\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c: \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435, \\u0432\\u043e\\u0437\\u043c\\u043e\\u0436\\u043d\\u043e, \\u0443\\u0436\\u0435 \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u043b\\u044f\\u0435\\u0442\\u0441\\u044f.',\n 'queue.editFailed.pulledBack': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043e\\u0442\\u0440\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c; \\u0441\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u043c\\u043e\\u0435 \\u0432\\u043e\\u0437\\u0432\\u0440\\u0430\\u0449\\u0435\\u043d\\u043e \\u0432 \\u043f\\u043e\\u043b\\u0435 \\u0432\\u0432\\u043e\\u0434\\u0430, \\u043f\\u0440\\u043e\\u0432\\u0435\\u0440\\u044c\\u0442\\u0435 \\u0438 \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u044c\\u0442\\u0435 \\u0441\\u043d\\u043e\\u0432\\u0430.',\n 'steer.inflight': '{n} \\u0432\\u0441\\u0442\\u0430\\u0432\\u043b\\u044f\\u0435\\u0442\\u0441\\u044f',\n 'steer.now': '\\u041f\\u0440\\u0435\\u0440\\u0432\\u0430\\u0442\\u044c \\u0438 \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u0438\\u0442\\u044c',\n 'steer.now.aria': '\\u041a\\u0440\\u0430\\u0441\\u043d\\u044b\\u0439: \\u043f\\u0440\\u0435\\u0440\\u0432\\u0430\\u0442\\u044c \\u0442\\u0435\\u043a\\u0443\\u0449\\u0435\\u0435 \\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u0435 \\u0438 \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u0438\\u0442\\u044c \\u043d\\u0435\\u043c\\u0435\\u0434\\u043b\\u0435\\u043d\\u043d\\u043e',\n 'steer.now.unsupported': '\\u0421\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043d\\u0435\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0442\\u0435\\u043d\\u0442; \\u043f\\u0440\\u0435\\u0440\\u044b\\u0432\\u0430\\u043d\\u0438\\u0435 \\u043d\\u0435 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f',\n 'steer.nowFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043f\\u0440\\u0435\\u0440\\u0432\\u0430\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.next': '\\u041e\\u0442\\u043f\\u0440\\u0430\\u0432\\u0438\\u0442\\u044c \\u043f\\u043e\\u0441\\u043b\\u0435 \\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u044f',\n 'steer.next.aria': '\\u0416\\u0451\\u043b\\u0442\\u044b\\u0439: \\u0432\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044c \\u043f\\u043e\\u0441\\u043b\\u0435 \\u0437\\u0430\\u0432\\u0435\\u0440\\u0448\\u0435\\u043d\\u0438\\u044f \\u0442\\u0435\\u043a\\u0443\\u0449\\u0435\\u0433\\u043e \\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u044f',\n 'steer.nextFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043f\\u0435\\u0440\\u0435\\u043d\\u0430\\u043f\\u0440\\u0430\\u0432\\u0438\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.later': '\\u0412 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c \\u043d\\u0430 \\u0441\\u043b\\u0435\\u0434\\u0443\\u044e\\u0449\\u0438\\u0439 \\u0445\\u043e\\u0434',\n 'steer.later.aria': '\\u0417\\u0435\\u043b\\u0451\\u043d\\u044b\\u0439: \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c; \\u043e\\u0431\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0430 \\u043f\\u043e\\u0441\\u043b\\u0435 \\u0437\\u0430\\u0432\\u0435\\u0440\\u0448\\u0435\\u043d\\u0438\\u044f \\u0432\\u0441\\u0435\\u0445 \\u043f\\u0440\\u0435\\u0434\\u044b\\u0434\\u0443\\u0449\\u0438\\u0445 \\u043f\\u0435\\u0440\\u0435\\u043d\\u0430\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u043d\\u044b\\u0445 \\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u0439',\n 'steer.revoke': '\\u041e\\u0442\\u043e\\u0437\\u0432\\u0430\\u0442\\u044c \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c',\n 'steer.revoke.aria': '\\u0417\\u0435\\u043b\\u0451\\u043d\\u044b\\u0439: \\u043e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u0432\\u0441\\u0442\\u0430\\u0432\\u043a\\u0443 \\u0438 \\u043f\\u043e\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044c \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c \\u043d\\u0430 \\u0441\\u043b\\u0435\\u0434\\u0443\\u044e\\u0449\\u0438\\u0439 \\u0445\\u043e\\u0434',\n 'steer.revoke.unsupported': '\\u0421\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043d\\u0435\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0442\\u0435\\u043d\\u0442; \\u043e\\u0442\\u0437\\u044b\\u0432 \\u043d\\u0435 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f',\n 'steer.revokeFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043e\\u0442\\u043e\\u0437\\u0432\\u0430\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.moveUp': '\\u0412\\u0432\\u0435\\u0440\\u0445',\n 'steer.moveDown': '\\u0412\\u043d\\u0438\\u0437',\n 'steer.reorder.unsupported': '\\u0421\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043d\\u0435\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0442\\u0435\\u043d\\u0442; \\u043f\\u0435\\u0440\\u0435\\u0441\\u043e\\u0440\\u0442\\u0438\\u0440\\u043e\\u0432\\u043a\\u0430 \\u043d\\u0435 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f',\n 'steer.reorderFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043f\\u0435\\u0440\\u0435\\u0441\\u043e\\u0440\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.reorderStale': '\\u041e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c \\u0438\\u0437\\u043c\\u0435\\u043d\\u0438\\u043b\\u0430\\u0441\\u044c; \\u043f\\u0435\\u0440\\u0435\\u0441\\u043e\\u0440\\u0442\\u0438\\u0440\\u043e\\u0432\\u043a\\u0430 \\u043e\\u0442\\u043c\\u0435\\u043d\\u0435\\u043d\\u0430, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.dragReorder': '\\u041f\\u0435\\u0440\\u0435\\u0442\\u0430\\u0449\\u0438\\u0442\\u0435 \\u0434\\u043b\\u044f \\u043f\\u0435\\u0440\\u0435\\u0441\\u043e\\u0440\\u0442\\u0438\\u0440\\u043e\\u0432\\u043a\\u0438',\n 'steer.pullBack': '\\u0412\\u0435\\u0440\\u043d\\u0443\\u0442\\u044c \\u0432 \\u043f\\u043e\\u043b\\u0435 \\u0432\\u0432\\u043e\\u0434\\u0430',\n 'steer.pullBack.unsupported': '\\u0421\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043d\\u0435\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0442\\u0435\\u043d\\u0442; \\u0432\\u043e\\u0437\\u0432\\u0440\\u0430\\u0442 \\u043d\\u0435 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f',\n 'steer.pullBack.composerBusy': '\\u0412 \\u043f\\u043e\\u043b\\u0435 \\u0432\\u0432\\u043e\\u0434\\u0430 \\u0443\\u0436\\u0435 \\u0435\\u0441\\u0442\\u044c \\u0441\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u043c\\u043e\\u0435; \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u044c\\u0442\\u0435 \\u0438\\u043b\\u0438 \\u043e\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u0435 \\u0441\\u043d\\u0430\\u0447\\u0430\\u043b\\u0430',\n 'steer.pullBackFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u0432\\u0435\\u0440\\u043d\\u0443\\u0442\\u044c \\u0432 \\u043f\\u043e\\u043b\\u0435 \\u0432\\u0432\\u043e\\u0434\\u0430, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.badge.now': '\\u043f\\u0440\\u0435\\u0440\\u044b\\u0432\\u0430\\u043d\\u0438\\u0435',\n 'steer.badge.next': '\\u043f\\u0435\\u0440\\u0435\\u043d\\u0430\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435',\n 'steer.badge.later': '\\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'steer.unavailable.running': '\\u041f\\u043b\\u0430\\u043d\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435 \\u0434\\u043e\\u0441\\u0442\\u0443\\u043f\\u043d\\u043e \\u0442\\u043e\\u043b\\u044c\\u043a\\u043e \\u0432\\u043e \\u0432\\u0440\\u0435\\u043c\\u044f \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f',\n 'steer.clear': '\\u041e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u0438 \\u043e\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044c',\n 'steer.clear.confirm': '\\u041f\\u043e\\u0434\\u0442\\u0432\\u0435\\u0440\\u0434\\u0438\\u0442\\u044c \\u043e\\u0447\\u0438\\u0441\\u0442\\u043a\\u0443?',\n 'steer.clear.cancel': '\\u041e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u043e\\u0447\\u0438\\u0441\\u0442\\u043a\\u0443',\n 'steer.clear.aria': '\\u041e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u0442\\u0435\\u043a\\u0443\\u0449\\u0435\\u0435 \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u0435 \\u0438 \\u043e\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044c \\u0432\\u0441\\u0435 \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u044f \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'steer.clearFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u0438 \\u043e\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.freeze': '\\u0417\\u0430\\u043c\\u043e\\u0440\\u043e\\u0437\\u0438\\u0442\\u044c \\u0438 \\u0434\\u043e\\u0431\\u0430\\u0432\\u0438\\u0442\\u044c',\n 'steer.resume': '\\u0412\\u043e\\u0437\\u043e\\u0431\\u043d\\u043e\\u0432\\u0438\\u0442\\u044c \\u0438 \\u0434\\u043e\\u0431\\u0430\\u0432\\u0438\\u0442\\u044c',\n 'steer.frozen': '\\u0417\\u0430\\u043c\\u043e\\u0440\\u043e\\u0436\\u0435\\u043d\\u043e: \\u0442\\u0435\\u043a\\u0443\\u0449\\u0438\\u0439 \\u0445\\u043e\\u0434 \\u0437\\u0430\\u0432\\u0435\\u0440\\u0448\\u0438\\u0442\\u0441\\u044f, \\u0437\\u0430\\u0442\\u0435\\u043c \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c \\u043f\\u0440\\u0438\\u043e\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u0438\\u0442\\u0441\\u044f \\u0434\\u043e \\u0432\\u043e\\u0437\\u043e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u044f',\n 'steer.frozenInput': '\\u0417\\u0430\\u043c\\u043e\\u0440\\u043e\\u0436\\u0435\\u043d\\u043e: \\u0432\\u0432\\u043e\\u0434 \\u043f\\u0440\\u0438\\u043e\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d, \\u0432\\u043e\\u0437\\u043e\\u0431\\u043d\\u043e\\u0432\\u0438\\u0442\\u0435 \\u0434\\u043b\\u044f \\u043f\\u0440\\u043e\\u0434\\u043e\\u043b\\u0436\\u0435\\u043d\\u0438\\u044f',\n 'steer.frozenBadge': '\\u0437\\u0430\\u043c\\u043e\\u0440\\u043e\\u0436\\u0435\\u043d\\u043e',\n 'steer.freezeFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u0437\\u0430\\u043c\\u043e\\u0440\\u043e\\u0437\\u0438\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.resumeFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u0432\\u043e\\u0437\\u043e\\u0431\\u043d\\u043e\\u0432\\u0438\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n}\n\n/** Spanish dictionary (keys mirror zh). */\nexport const es: Record<keyof typeof zh, string> = {\n 'family.title': 'Tr\\u00e1fico de entrada',\n 'family.busyEnter': 'Comportamiento busy-Enter (gestionado por este plugin)',\n 'family.desc': 'Enter simple pone en cola cuando est\\u00e1 ocupado sin interrumpir; usa el bot\\u00f3n congelar/redirigir del compositor para interrumpir. Gestionado autom\\u00e1ticamente \\u2014 nada que configurar.',\n 'queue.count': '{n} mensajes en cola',\n 'queue.edit': 'Editar mensaje en cola',\n 'queue.edit.unsupported': 'Contiene contenido no textual; edici\\u00f3n no compatible',\n 'queue.save': 'Guardar mensaje en cola',\n 'queue.cancelEdit': 'Cancelar edici\\u00f3n',\n 'queue.remove': 'Eliminar mensaje en cola',\n 'queue.removeFailed': 'Error al eliminar: el mensaje puede haber comenzado a enviarse.',\n 'queue.editFailed': 'Error al editar: el mensaje puede haber comenzado a enviarse.',\n 'queue.editFailed.pulledBack': 'Error al editar; el contenido fue devuelto al compositor, revise y reenv\\u00ede.',\n 'steer.inflight': '{n} insert\\u00e1ndose',\n 'steer.now': 'Interrumpir y enviar',\n 'steer.now.aria': 'Rojo: interrumpir la acci\\u00f3n en curso y enviar inmediatamente',\n 'steer.now.unsupported': 'Contiene contenido no textual; interrupci\\u00f3n no compatible',\n 'steer.nowFailed': 'Error al interrumpir, int\\u00e9ntelo de nuevo.',\n 'steer.next': 'Enviar despu\\u00e9s de la acci\\u00f3n',\n 'steer.next.aria': 'Amarillo: insertar despu\\u00e9s de que termine la acci\\u00f3n actual',\n 'steer.nextFailed': 'Error al redirigir, int\\u00e9ntelo de nuevo.',\n 'steer.later': 'Encolar para el pr\\u00f3ximo turno',\n 'steer.later.aria': 'Verde: encolar; se procesa cuando terminen todas las acciones redirigidas previas',\n 'steer.revoke': 'Devolver a la cola',\n 'steer.revoke.aria': 'Verde: revocar la inserci\\u00f3n y encolar para el pr\\u00f3ximo turno',\n 'steer.revoke.unsupported': 'Contiene contenido no textual; revocaci\\u00f3n no compatible',\n 'steer.revokeFailed': 'Error al revocar, int\\u00e9ntelo de nuevo.',\n 'steer.moveUp': 'Mover arriba',\n 'steer.moveDown': 'Mover abajo',\n 'steer.reorder.unsupported': 'Contiene contenido no textual; reordenaci\\u00f3n no compatible',\n 'steer.reorderFailed': 'Error al reordenar, int\\u00e9ntelo de nuevo.',\n 'steer.reorderStale': 'La cola cambi\\u00f3; reordenaci\\u00f3n cancelada, int\\u00e9ntelo de nuevo.',\n 'steer.dragReorder': 'Arrastrar para reordenar',\n 'steer.pullBack': 'Devolver al compositor para editar',\n 'steer.pullBack.unsupported': 'Contiene contenido no textual; devoluci\\u00f3n no compatible',\n 'steer.pullBack.composerBusy': 'El compositor ya tiene contenido; env\\u00ede o vac\\u00ede primero',\n 'steer.pullBackFailed': 'Error al devolver al compositor, int\\u00e9ntelo de nuevo.',\n 'steer.badge.now': 'interrumpiendo',\n 'steer.badge.next': 'redirigiendo',\n 'steer.badge.later': 'en cola',\n 'steer.unavailable.running': 'Planificaci\\u00f3n solo disponible durante la ejecuci\\u00f3n',\n 'steer.clear': 'Cancelar y vaciar',\n 'steer.clear.confirm': '\\u00bfConfirmar vaciado?',\n 'steer.clear.cancel': 'Cancelar vaciado',\n 'steer.clear.aria': 'Cancelar la ejecuci\\u00f3n actual y vaciar todos los mensajes en cola',\n 'steer.clearFailed': 'Error al cancelar y vaciar, int\\u00e9ntelo de nuevo.',\n 'steer.freeze': 'Congelar y a\\u00f1adir',\n 'steer.resume': 'Reanudar y a\\u00f1adir',\n 'steer.frozen': 'Congelado: el turno actual termina y la cola se pausa hasta la reanudaci\\u00f3n',\n 'steer.frozenInput': 'Congelado: entrada pausada, reanude para continuar',\n 'steer.frozenBadge': 'congelado',\n 'steer.freezeFailed': 'Error al congelar, int\\u00e9ntelo de nuevo.',\n 'steer.resumeFailed': 'Error al reanudar, int\\u00e9ntelo de nuevo.',\n}\n\n/** Combined dictionary map covering all 9 languages. */\nexport const dictionaries: Record<string, Record<string, string>> = { zh, en, ja, ko, fr, de, it, ru, es }\n\n/** Dictionary key union. */\nexport type SteerKey = keyof typeof zh\n","/**\n * Session-scoped freeze store shared by the composer freeze button (the\n * control) and the steering dock (the banner/disabled states).\n *\n * The queue is fully decoupled from freezing: freezing only stops the agent\n * from consuming the queue (the detached entries are preserved here so the\n * driver finds no pending work and stops). While frozen the entries stay\n * fully editable — text, order and the planned insertion tier (now/next/\n * later) can all change; resume re-submits the queue honoring those tiers.\n *\n * State is keyed by session id so freezing one session never leaks into\n * another: each session holds its own `frozen` flag and detached queue, and\n * mutating one session's queue only re-renders that session's consumers\n * (`useSyncExternalStore` bails on unchanged references for the others).\n */\n\n/** Insertion tier planned for one detached queued message. */\nexport type FrozenTier = 'queue' | 'safe_point' | 'force'\n\n/** One detached queued message with its planned insertion tier. */\nexport interface FrozenEntry {\n text: string\n tier: FrozenTier\n}\n\nexport interface FreezeState {\n frozen: boolean\n /** Detached queued messages in FIFO order, each with a planned tier. */\n pending: readonly FrozenEntry[]\n}\n\n/** Session id → per-session freeze state. */\nconst states = new Map<string, FreezeState>()\nconst listeners = new Set<() => void>()\n\n/** Stable empty snapshot: `useSyncExternalStore` needs a reference-stable\n * value for unset sessions so unchanged consumers never re-render. */\nconst EMPTY: FreezeState = { frozen: false, pending: [] }\n\n/** Minimal snapshot store (no runtime dependency, stable identity per mount). */\nexport const freezeStore = {\n /** Snapshot for one session; reference-stable until that session changes. */\n getSnapshot(sessionId: string): FreezeState {\n return states.get(sessionId) ?? EMPTY\n },\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n },\n /** Replace one session's state; unset sessions fall back to EMPTY. */\n set(sessionId: string, next: FreezeState): void {\n if (next.frozen === false && next.pending.length === 0) {\n states.delete(sessionId)\n } else {\n states.set(sessionId, next)\n }\n emit()\n },\n}\n\n/** Reset all sessions (for tests). */\nexport function resetFreezeStore(): void {\n states.clear()\n emit()\n}\n\n/** Append one queued message while frozen (new input lands in the detached queue). */\nexport function pushPending(sessionId: string, text: string, tier: FrozenTier = 'queue'): void {\n const cur = states.get(sessionId) ?? EMPTY\n freezeStore.set(sessionId, { ...cur, pending: [...cur.pending, { text, tier }] })\n}\n\n/** Edit one detached queued message's text in place. */\nexport function updatePendingAt(sessionId: string, index: number, text: string): void {\n const pending = states.get(sessionId)?.pending\n if (pending === undefined) return\n const entry = pending[index]\n if (entry === undefined) return\n const next = [...pending]\n next[index] = { ...entry, text }\n freezeStore.set(sessionId, { frozen: true, pending: next })\n}\n\n/** Change one detached queued message's planned insertion tier. */\nexport function setTierAt(sessionId: string, index: number, tier: FrozenTier): void {\n const pending = states.get(sessionId)?.pending\n if (pending === undefined) return\n const entry = pending[index]\n if (entry === undefined) return\n const next = [...pending]\n next[index] = { ...entry, tier }\n freezeStore.set(sessionId, { frozen: true, pending: next })\n}\n\n/** Remove one detached queued message. */\nexport function removePendingAt(sessionId: string, index: number): void {\n const pending = states.get(sessionId)?.pending\n if (pending === undefined) return\n freezeStore.set(sessionId, { frozen: true, pending: pending.filter((_, i) => i !== index) })\n}\n\n/** Move one detached queued message to a new position (reorder while frozen). */\nexport function movePending(sessionId: string, from: number, to: number): void {\n if (from === to) return\n const pending = states.get(sessionId)?.pending\n if (pending === undefined) return\n const next = [...pending]\n const [moved] = next.splice(from, 1)\n if (moved === undefined) return\n next.splice(to, 0, moved)\n freezeStore.set(sessionId, { frozen: true, pending: next })\n}\n\nfunction emit(): void {\n for (const listener of listeners) listener()\n}\n","/**\n * Three-tier steering queue dock: the shadowing replacement for the official\n * `conversation.input.dock` entry (same cell id `queue`, priority -1, so the\n * lower priority wins and the official QueueDock never renders while this\n * plugin is mounted).\n *\n * Every queued row carries three planning buttons:\n * - green (later, the default state): the row already queues for the next\n * turn —plain Enter keeps feeding rows here; pressing green on a row that\n * was already steered (yellow) revokes the insertion and pulls it back to\n * later (the yellow flow is reversible);\n * - yellow (next): strict-steer the row into the running turn, consumed at\n * the next step boundary (after the current action finishes);\n * - red (now): cancel the running turn, then remove the row and re-send its\n * text as a fresh message —the re-send arms the harness wake latch (the\n * converged driver restarts) and the interrupted input is processed as the\n * next turn's input. A plain steer after cancel would re-insert a message\n * that is already pending in next-turn and the inbox rejects it.\n *\n * The toolbar also exposes a queue-level \"cancel and clear\" that stops the\n * current run and removes every queued row, plus a session-level\n * freeze/resume toggle for the peak-hour scenario: freeze stops the current\n * run while preserving the queue (keepInbox), resume re-arms the driver by\n * re-sending the first queued row so the preserved work continues.\n */\nimport { useEffect, useId, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\n// Type-only: the conversation slot/contract declarations (module augmentation\n// for the SlotMap and the session standard kit). No value import crosses the\n// plugin boundary.\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport {\n IconCheckOutlineMedium, IconChevronDownOutlineMedium, IconChevronUpOutlineMedium, IconCloseOutlineMedium,\n IconEditOutlineMedium, IconQueueOutlineMedium, IconTrashOutlineMedium, Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { freezeStore, setTierAt, updatePendingAt, removePendingAt, movePending } from './freeze-store.ts'\nimport css from './steer-queue-dock.module.css'\n\n/**\n * Suppress the OFFICIAL queue dock entirely: our shadowing entry owns the\n * `queue` cell, so the official dock is only ever mounted as a crash fallback\n * — and its per-row 插话发送 duplicates our yellow tier. Hide the whole\n * container by its css-module class (the `_7yHdaG` hash is baked into the\n * host build and stable across restarts), plus the aria-label match as a\n * second net in case the host rehashes.\n */\nconst HIDE_OFFICIAL_QUEUE_CSS =\n // Class-based only: the official steer button and OUR yellow tier share the\n // same rendered aria-label (插话发送) — an attribute rule would hide our\n // own button too.\n '[class*=\"_7yHdaG_dock\"]{display:none!important}'\nif (typeof document !== 'undefined' && document.querySelector('style[data-plugin-css=\"dsh-input-traffic/hide-official-steer\"]') === null) {\n const tag = document.createElement('style')\n tag.dataset.plugin = 'dsh-input-traffic'\n tag.dataset.pluginCss = 'dsh-input-traffic/hide-official-steer'\n tag.textContent = HIDE_OFFICIAL_QUEUE_CSS\n document.head.appendChild(tag)\n}\n\n/** One mutation accepted by the conversation queue verb. */\nexport type SteerQueueAction =\n | { kind: 'edit'; content: readonly { type: 'text'; text: string }[] }\n | { kind: 'remove' }\n | { kind: 'steer' }\n\n/** Busy marker for a whole-queue rebuild (reorder); locks every row action. */\nconst REORDER_MARK = '__reorder__'\n\n/** localStorage key for the manual collapse state (dsh-queue-plus parity). */\nconst COLLAPSE_KEY = 'dsh-input-traffic:collapsed'\n\n/** Queue operations injected by the session-scoped registration. */\nexport interface SteerQueueDockInjected {\n updateQueue: (itemId: string, action: SteerQueueAction) => Promise<void>\n /** Cancel the current turn while preserving the pending queue. */\n cancel: () => Promise<void>\n /** Re-send one plain-text message as a queued follow-up (the revoke path). */\n send: (text: string) => Promise<void>\n /** Steer one plain-text message into the session's next step (resume's safe_point tier). */\n sendSteer?: (text: string) => Promise<void>\n /** Back-fill the composer draft (the pull-back-to-composer edit path). */\n setDraft: (text: string) => void\n notify: (level: 'info' | 'error', text: string) => void\n /** Owning session id (for the dsh-session-guard bridge RPC). */\n sessionId?: string\n /** Raise/clear the composer block for the owning session (freeze keeps the\n * composer inert so Enter cannot leak into the conversation; absent on the\n * dock entry, only the freeze button injects it). */\n setComposerBlock?: (reason: string | undefined) => void\n}\n\n/** Full props of a dock entry: InputZone owner share + session standard kit + global seat + the locale seat. */\nexport type SteerQueueDockProps = PropsRuntime<'conversation.input.dock'> & SteerQueueDockInjected & PropsLocale<'steer'>\n\n/** The planning tier of one queued row. */\nexport type SteerTier = 'now' | 'next' | 'later'\n\n/**\n * Resolve the action sequence for one planning button press. Pure so the\n * button wiring and its tests share one truth.\n * @param tier - the pressed planning tier.\n * @returns the queue mutation (red re-uses a steer-shaped action for the\n * yellow branch; the red branch performs cancel + remove + resend instead).\n */\nexport function planActionFor(tier: SteerTier): { action: SteerQueueAction; interruptFirst: boolean } {\n if (tier === 'later') return { action: { kind: 'steer' }, interruptFirst: false }\n // Yellow steers only; red cancels the running turn first, then steers.\n return { action: { kind: 'steer' }, interruptFirst: tier === 'now' }\n}\n\n/**\n * Project the tier badge of one inbox row from its placement. Pure so the\n * row rendering and its tests share one truth.\n * @param placement - the inbox projection placement.\n * @returns the tier badge, or null for non-visible context rows.\n */\nexport function badgeFor(placement: 'queued' | 'steering' | 'context'): SteerTier | null {\n if (placement === 'steering') return 'next'\n if (placement === 'queued') return 'later'\n return null\n}\n\n/**\n * Auto-grow one edit textarea to its content. The CSS max-height caps the\n * growth; beyond it the textarea scrolls internally. Height is reset first so\n * shrink (deleting lines) also tracks the content.\n * @param el - the textarea to resize in place.\n */\nexport function resizeEditor(el: HTMLTextAreaElement): void {\n el.style.height = 'auto'\n el.style.height = `${el.scrollHeight}px`\n}\n\n/**\n * Concatenate a queued row's text blocks; null when the row carries anything\n * non-text (attachments) or no content — mirrors the host queue dock's own\n * helper (ui-conversation client.js `textOf`). Wire rows do NOT carry a\n * `.text` field; the text lives in `content` blocks.\n */\nexport function textOf(content: readonly { readonly type: string; readonly text?: string }[] | undefined): string | null {\n if (content === undefined || content.length === 0) return null\n if (!content.every(block => block.type === 'text')) return null\n const joined = content.map(block => block.text ?? '').join('')\n return joined === '' ? null : joined\n}\n\n/**\n * Queue strip with three-tier planning: one item renders directly; multiple\n * items default to a collapsible count header; an empty queue renders nothing.\n */\nexport function SteerQueueDock({ sessionId, useSession, useProjection, input, updateQueue, cancel, send, setDraft, notify, t }: SteerQueueDockProps) {\n // Queue rows live in the session's `inbox` PROJECTION (0.1.7+): `next-turn`\n // is the plain queue (green tier), `next-step` the steered band (yellow).\n // The session store never carried a `queue` field on released hosts.\n const inbox = useProjection('inbox')\n // Wire rows carry no `.text`; derive it from the content blocks, falling\n // back to a declared text for fixture/local rows.\n const queue = useMemo(() => (inbox?.['next-turn'] ?? []).map(row => ({ ...row, text: textOf(row.content) ?? row.text ?? null })), [inbox])\n const steering = useMemo(() => (inbox?.['next-step'] ?? []).map(row => ({ ...row, text: textOf(row.content) ?? row.text ?? null })), [inbox])\n const running = useSession(s => s.running)\n // Parity with the official dock: a continuable subagent context still owns\n // a mutable queue; requiring strict null kept the whole action row hidden\n // whenever a subagent address was attached.\n const queueMutable = useSession(s => s.subagent === null || s.subagent.address.mode === 'continuable')\n const [editing, setEditing] = useState<{ id: string; text: string } | null>(null)\n const [busy, setBusy] = useState<string | null>(null)\n const [clearing, setClearing] = useState(false)\n // Two-step clear confirmation: the first click arms the prompt, the second\n // executes; arming auto-reverts after a few seconds (no native confirm).\n const [confirmClear, setConfirmClear] = useState(false)\n const confirmTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n // Drag-and-drop reorder source index and the current drop-target row.\n const dragIndex = useRef<number | null>(null)\n const [dragOver, setDragOver] = useState<number | null>(null)\n // Collapse state persists across mounts (dsh-queue-plus parity).\n const [collapsed, setCollapsed] = useState(() => {\n try {\n const v = localStorage.getItem(COLLAPSE_KEY)\n return v === null ? true : v === '1'\n } catch {\n return true\n }\n })\n // Session-level freeze lives in the composer-right control; the dock reads\n // the shared store for the banner and inert states. While frozen the\n // detached queue is rendered here (read-only) so the waiting area stays\n // visible — freezing only pauses the running behavior, it must not hide\n // the queued messages.\n const { frozen, pending: frozenPending } = useSyncExternalStore(\n freezeStore.subscribe,\n () => freezeStore.getSnapshot(sessionId ?? ''),\n )\n const sid = sessionId ?? ''\n const listId = useId()\n // The edit textarea; grown to its content on entry and on every input.\n const editorRef = useRef<HTMLTextAreaElement>(null)\n\n useEffect(() => {\n if (queue.length === 0 && !collapsed) setCollapsed(true)\n // Frozen-row edits use a `frozen:` id that never exists in the dsh queue;\n // skip the stale-check for them so the detached queue stays editable.\n if (editing !== null && !editing.id.startsWith('frozen:') && (!queueMutable || !queue.some(row => row.id === editing.id))) setEditing(null)\n }, [collapsed, editing, queue, queueMutable])\n\n // Persist the manual collapse state; clear the confirm timer on unmount.\n useEffect(() => {\n try {\n localStorage.setItem(COLLAPSE_KEY, collapsed ? '1' : '0')\n } catch {\n /* storage unavailable: in-memory only */\n }\n }, [collapsed])\n useEffect(() => () => {\n if (confirmTimer.current !== null) clearTimeout(confirmTimer.current)\n }, [])\n\n // Grow the editor to its full content when a row enters edit mode.\n const editingId = editing?.id\n useEffect(() => {\n if (editingId === undefined) return\n const el = editorRef.current\n if (el !== null) resizeEditor(el)\n }, [editingId])\n\n // The dock stays mounted while the agent runs (the freeze entry must be\n // reachable before any message queues), while any row is pending, and while\n // the session is frozen (the detached queue stays visible).\n if (queue.length === 0 && steering.length === 0 && !running && !frozen) return null\n\n const interactionActive = queueMutable && (editing !== null || busy !== null || clearing)\n const expanded = !collapsed || interactionActive\n const listVisible = queue.length === 1 || expanded\n const planDisabled = !queueMutable || !running || frozen\n const nothingPending = queue.length === 0 && steering.length === 0\n // Reordering rebuilds the queue by re-sending texts; non-text rows cannot\n // be re-sent, so sorting is disabled while any such row is queued.\n const reorderUnsupported = queue.some(row => row.text === null)\n\n const applyAction = async (\n itemId: string,\n action: SteerQueueAction,\n failure: string,\n ): Promise<boolean> => {\n setBusy(itemId)\n try {\n await updateQueue(itemId, action)\n return true\n } catch {\n notify('error', failure)\n return false\n } finally {\n setBusy(current => current === itemId ? null : current)\n }\n }\n\n const saveEdit = async (): Promise<void> => {\n if (editing === null || typeof editing.text !== 'string' || editing.text.trim() === '') return\n const itemId = editing.id\n const text = editing.text\n setBusy(itemId)\n try {\n await updateQueue(itemId, { kind: 'edit', content: [{ type: 'text', text }] })\n setEditing(null)\n } catch {\n // The edit failed (the agent may have claimed the row mid-edit): fall\n // back to the composer so the edited content is never lost. Only when\n // the composer is free — an occupied draft must not be overwritten.\n if (input.draft.trim() === '') {\n setDraft(text)\n setEditing(null)\n notify('error', t('queue.editFailed.pulledBack'))\n } else {\n notify('error', t('queue.editFailed'))\n }\n } finally {\n setBusy(current => current === itemId ? null : current)\n }\n }\n\n const steerRow = async (row: { id: string; text: string | null }, tier: Exclude<SteerTier, 'later'>): Promise<void> => {\n setBusy(row.id)\n try {\n if (tier === 'now') {\n // Interrupt, then re-submit: cancel stops the current run (keepInbox),\n // the row is removed so its identity cannot collide, and re-sending\n // the text arms the harness wake latch (the converged driver restarts\n // and processes it as the next turn's input). A plain steer after\n // cancel would re-insert a message already pending in next-turn and\n // the inbox rejects the duplicate.\n await cancel()\n await updateQueue(row.id, { kind: 'remove' })\n if (row.text !== null) await send(row.text)\n } else {\n await updateQueue(row.id, { kind: 'steer' })\n }\n } catch {\n notify('error', tier === 'now' ? t('steer.nowFailed') : t('steer.nextFailed'))\n } finally {\n setBusy(current => current === row.id ? null : current)\n }\n }\n\n /**\n * Revoke a steered (yellow) or interrupting (red) row back to later: remove\n * the admitted row and re-send its text as a queued follow-up, so it lands\n * in next-turn again (the yellow flow is reversible).\n */\n const revokeToLater = async (row: { id: string; text: string | null }): Promise<void> => {\n if (row.text === null) return\n setBusy(row.id)\n try {\n await updateQueue(row.id, { kind: 'remove' })\n await send(row.text)\n } catch {\n notify('error', t('steer.revokeFailed'))\n } finally {\n setBusy(current => current === row.id ? null : current)\n }\n }\n\n /**\n * Rebuild the queue in a new order: remove every queued row, then re-send\n * the texts sequentially so the agent's next-turn list matches the new\n * order. Concurrency protection (dsh-queue-plus parity): if a remove fails\n * with queue-item-not-found, the agent already claimed that row — the\n * rebuild stops immediately and nothing is re-sent, so the changed queue\n * is never scrambled.\n */\n const rebuildQueue = async (rows: readonly { id: string; text: string | null }[], next: readonly { id: string; text: string | null }[]): Promise<void> => {\n setBusy(REORDER_MARK)\n try {\n for (const row of rows) {\n try {\n await updateQueue(row.id, { kind: 'remove' })\n } catch (error) {\n if (error instanceof Error && error.message.includes('queue-item-not-found')) {\n notify('error', t('steer.reorderStale'))\n return\n }\n throw error\n }\n }\n for (const row of next) {\n if (row.text !== null) await send(row.text)\n }\n } catch {\n notify('error', t('steer.reorderFailed'))\n } finally {\n setBusy(null)\n }\n }\n\n /**\n * Move one queued row up/down in the FIFO order (arrow buttons).\n */\n const reorder = async (rowId: string, delta: -1 | 1): Promise<void> => {\n const rows = queue\n const index = rows.findIndex(row => row.id === rowId)\n const target = index + delta\n if (index < 0 || target < 0 || target >= rows.length) return\n const next = [...rows]\n const swapped = next[index] as typeof next[number]\n next[index] = next[target] as typeof next[number]\n next[target] = swapped\n if (next.some(row => row.text === null)) {\n notify('error', t('steer.reorder.unsupported'))\n return\n }\n await rebuildQueue(rows, next)\n }\n\n /**\n * Move one row to an absolute position (drag-and-drop drop handler).\n */\n const reorderTo = async (fromIndex: number, toIndex: number): Promise<void> => {\n if (fromIndex === toIndex) return\n const rows = queue\n if (rows[fromIndex] === undefined || rows[toIndex] === undefined) return\n const next = [...rows]\n const [moved] = next.splice(fromIndex, 1)\n if (moved === undefined) return\n next.splice(toIndex, 0, moved)\n if (next.some(row => row.text === null)) {\n notify('error', t('steer.reorder.unsupported'))\n return\n }\n await rebuildQueue(rows, next)\n }\n\n /** Arm or execute the two-step clear confirmation. */\n const armClear = (): void => {\n if (confirmClear) {\n if (confirmTimer.current !== null) clearTimeout(confirmTimer.current)\n setConfirmClear(false)\n void clearAll()\n return\n }\n setConfirmClear(true)\n if (confirmTimer.current !== null) clearTimeout(confirmTimer.current)\n confirmTimer.current = setTimeout(() => setConfirmClear(false), 3000)\n }\n\n /** Abort the armed clear confirmation (the explicit cancel button). */\n const cancelClear = (): void => {\n if (confirmTimer.current !== null) clearTimeout(confirmTimer.current)\n setConfirmClear(false)\n }\n\n /** Save an in-place edit of one detached (frozen) queued message. */\n const saveFrozenEdit = async (index: number): Promise<void> => {\n if (editing === null) return\n const text = editing.text.trim()\n if (text === '') {\n setEditing(null)\n return\n }\n updatePendingAt(sid, index, text)\n setEditing(null)\n }\n\n const clearAll = async (): Promise<void> => {\n setClearing(true)\n // Cancel the current run and clear every pending row (queued and\n // steering alike). Removal races the agent claiming rows;\n // item-not-found is a normal convergence and must not surface.\n const pending = [...queue, ...steering]\n try {\n await cancel()\n await Promise.all(pending.map(row =>\n updateQueue(row.id, { kind: 'remove' }).catch(() => undefined),\n ))\n } catch {\n notify('error', t('steer.clearFailed'))\n } finally {\n setClearing(false)\n }\n }\n\n return (\n <div className={css.dock} data-steer-dock=\"\">\n <div className={css.panel}>\n <div className={css.toolbar}>\n <button\n type=\"button\"\n className={css.header}\n aria-controls={listId}\n aria-expanded={expanded}\n disabled={queue.length <= 1 || interactionActive}\n onClick={() => { setCollapsed(value => !value) }}\n >\n <span className={css.lead} aria-hidden><IconQueueOutlineMedium /></span>\n {queue.length > 0 && (\n <span className={css.count}>{t('queue.count', { n: queue.length })}</span>\n )}\n {queue.length > 1 && (\n <span className={css.chevron} aria-hidden>\n {expanded ? <IconChevronDownOutlineMedium /> : <IconChevronUpOutlineMedium />}\n </span>\n )}\n </button>\n <div className={css.toolbarActions}>\n {confirmClear && (\n <button\n type=\"button\"\n className={css.clearCancel}\n aria-label={t('steer.clear.cancel')}\n disabled={clearing || busy !== null || nothingPending}\n onClick={cancelClear}\n >\n <span className={css.clearLabel}>{t('steer.clear.cancel')}</span>\n </button>\n )}\n <Tooltip label={confirmClear ? t('steer.clear.confirm') : t('steer.clear')} side=\"top\" delayMs={500}>\n <button\n type=\"button\"\n className={`${css.clear} ${confirmClear ? css.clearConfirm : ''}`}\n aria-label={confirmClear ? t('steer.clear.confirm') : t('steer.clear')}\n disabled={clearing || busy !== null || nothingPending}\n onClick={armClear}\n >\n <IconTrashOutlineMedium size={14} />\n <span className={css.clearLabel}>{confirmClear ? t('steer.clear.confirm') : t('steer.clear')}</span>\n </button>\n </Tooltip>\n </div>\n </div>\n {frozen && (\n <div className={css.frozenBanner} role=\"status\">\n {t('steer.frozen')}\n </div>\n )}\n {/* While frozen the queue is detached into the shared store: render it\n here so the waiting area never disappears. The detached rows stay\n fully editable (edit / remove / reorder) — freezing only pauses\n the running behavior, it must not lock the queue. */}\n {frozen && frozenPending.length > 0 && (\n <ul className={css.frozenList} data-testid=\"frozen-list\">\n {frozenPending.map((entry, i) => {\n const editingFrozen = editing?.id === `frozen:${i}`\n const text = entry.text\n return (\n <li\n key={i}\n className={`${css.frozenRow} ${dragOver === i && frozen ? css.rowDragOver : ''}`}\n data-tier={entry.tier === 'force' ? 'now' : entry.tier === 'safe_point' ? 'next' : 'later'}\n data-editing={editingFrozen ? '' : undefined}\n draggable={!editingFrozen}\n title={!editingFrozen ? t('steer.dragReorder') : undefined}\n onDragStart={(event) => {\n if (editingFrozen) return\n dragIndex.current = i\n event.dataTransfer.effectAllowed = 'move'\n // Some engines only start HTML5 drag once data is set.\n event.dataTransfer.setData('text/plain', String(i))\n }}\n onDragOver={(event) => {\n if (dragIndex.current === null) return\n event.preventDefault()\n setDragOver(i)\n }}\n onDrop={(event) => {\n event.preventDefault()\n const from = dragIndex.current\n dragIndex.current = null\n setDragOver(null)\n if (from !== null) movePending(sid, from, i)\n }}\n onDragEnd={() => {\n dragIndex.current = null\n setDragOver(null)\n }}\n >\n <span className={css.lead} aria-hidden><IconQueueOutlineMedium /></span>\n <SteerBadge tier={entry.tier === 'force' ? 'now' : entry.tier === 'safe_point' ? 'next' : 'later'} t={t} />\n {editingFrozen\n ? (\n <textarea\n ref={editorRef}\n autoFocus\n className={css.editor}\n aria-label={t('queue.edit')}\n rows={1}\n value={editing?.text ?? text}\n onChange={(event) => { setEditing({ id: `frozen:${i}`, text: event.currentTarget.value }) }}\n onInput={(event) => { resizeEditor(event.currentTarget) }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n setEditing(null)\n return\n }\n if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault()\n void saveFrozenEdit(i)\n }\n }}\n />\n )\n : <span className={css.preview}>{text}</span>}\n <div className={css.actions}>\n {editingFrozen ? (\n <>\n <Tooltip label={t('queue.save')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.save')}\n disabled={editing === null || editing.text.trim() === ''}\n onClick={() => { void saveFrozenEdit(i) }}\n >\n <IconCheckOutlineMedium size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.cancelEdit')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.cancelEdit')}\n onClick={() => { setEditing(null) }}\n >\n <IconCloseOutlineMedium size={14} />\n </button>\n </Tooltip>\n </>\n ) : (\n <>\n <Tooltip label={t('steer.moveUp')} side=\"bottom\" delayMs={500} disabled={i === 0}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('steer.moveUp')}\n disabled={i === 0}\n onClick={() => movePending(sid, i, i - 1)}\n >\n <IconChevronUpOutlineMedium />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.moveDown')} side=\"bottom\" delayMs={500} disabled={i === frozenPending.length - 1}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('steer.moveDown')}\n disabled={i === frozenPending.length - 1}\n onClick={() => movePending(sid, i, i + 1)}\n >\n <IconChevronDownOutlineMedium />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.edit')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.edit')}\n onClick={() => { setEditing({ id: `frozen:${i}`, text }) }}\n >\n <IconEditOutlineMedium size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.remove')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.remove')}\n onClick={() => removePendingAt(sid, i)}\n >\n <IconTrashOutlineMedium size={14} />\n </button>\n </Tooltip>\n {/* Planned insertion tier: freezing pauses consumption,\n it must not lock the tier planning of each row. */}\n <span className={css.plan} role=\"group\" aria-label={t('steer.later.aria')}>\n <Tooltip label={t('steer.now')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierNow}`}\n aria-label={t('steer.now')}\n aria-pressed={entry.tier === 'force' || undefined}\n onClick={() => setTierAt(sid, i, 'force')}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.next')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierNext}`}\n aria-label={t('steer.next')}\n aria-pressed={entry.tier === 'safe_point' || undefined}\n onClick={() => setTierAt(sid, i, 'safe_point')}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.later')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierLater}`}\n aria-label={t('steer.later')}\n aria-pressed={entry.tier === 'queue' || undefined}\n onClick={() => setTierAt(sid, i, 'queue')}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n </span>\n </>\n )}\n </div>\n <span className={css.frozenMark}>{t('steer.frozenBadge')}</span>\n </li>\n )\n })}\n </ul>\n )}\n <ul id={listId} className={css.list} hidden={!listVisible}>\n {listVisible && queue.map((row, index) => (\n <li\n key={row.id}\n className={`${css.row} ${dragOver === index ? css.rowDragOver : ''}`}\n data-tier={badgeFor('queued') ?? undefined}\n data-editing={editing?.id === row.id ? '' : undefined}\n draggable={queueMutable && !reorderUnsupported && busy === null && !frozen}\n title={queueMutable && !reorderUnsupported && busy === null && !frozen ? t('steer.dragReorder') : undefined}\n onDragStart={(event) => {\n dragIndex.current = index\n event.dataTransfer.effectAllowed = 'move'\n // Some engines only start HTML5 drag once data is set.\n event.dataTransfer.setData('text/plain', String(index))\n }}\n onDragOver={(event) => {\n if (dragIndex.current === null) return\n event.preventDefault()\n setDragOver(index)\n }}\n onDrop={(event) => {\n event.preventDefault()\n const from = dragIndex.current\n dragIndex.current = null\n setDragOver(null)\n if (from !== null) void reorderTo(from, index)\n }}\n onDragEnd={() => {\n dragIndex.current = null\n setDragOver(null)\n }}\n >\n {queue.length === 1 && <span className={css.lead} aria-hidden><IconQueueOutlineMedium /></span>}\n <SteerBadge tier={badgeFor('queued')} t={t} />\n {editing?.id === row.id\n ? (\n <textarea\n ref={editorRef}\n autoFocus\n className={css.editor}\n aria-label={t('queue.edit')}\n rows={1}\n value={editing.text}\n onChange={(event) => { setEditing({ id: row.id, text: event.currentTarget.value }) }}\n onInput={(event) => { resizeEditor(event.currentTarget) }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n setEditing(null)\n return\n }\n // Plain Enter saves; Shift+Enter keeps editing (newline).\n if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault()\n void saveEdit()\n }\n }}\n />\n )\n : <span className={css.preview}>{row.text}</span>}\n {queueMutable && <div className={css.actions}>\n {editing?.id === row.id\n ? (\n <>\n <Tooltip label={t('queue.save')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.save')}\n disabled={busy !== null || editing.text.trim() === ''}\n onClick={() => { void saveEdit() }}\n >\n <IconCheckOutlineMedium size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.cancelEdit')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.cancelEdit')}\n disabled={busy !== null}\n onClick={() => { setEditing(null) }}\n >\n <IconCloseOutlineMedium size={14} />\n </button>\n </Tooltip>\n </>\n )\n : (\n <>\n <Tooltip label={t('steer.moveUp')} side=\"bottom\" delayMs={500} disabled={frozen || reorderUnsupported}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('steer.moveUp')}\n title={reorderUnsupported ? t('steer.reorder.unsupported') : undefined}\n disabled={busy !== null || frozen || reorderUnsupported}\n onClick={() => { void reorder(row.id, -1) }}\n >\n <IconChevronUpOutlineMedium />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.moveDown')} side=\"bottom\" delayMs={500} disabled={frozen || reorderUnsupported}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('steer.moveDown')}\n title={reorderUnsupported ? t('steer.reorder.unsupported') : undefined}\n disabled={busy !== null || frozen || reorderUnsupported}\n onClick={() => { void reorder(row.id, 1) }}\n >\n <IconChevronDownOutlineMedium />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.edit')} side=\"bottom\" delayMs={500} disabled={row.text === null}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.edit')}\n title={row.text === null ? t('queue.edit.unsupported') : undefined}\n disabled={busy !== null || row.text === null}\n onClick={() => {\n if (row.text !== null) setEditing({ id: row.id, text: row.text ?? '' })\n }}\n >\n <IconEditOutlineMedium size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.remove')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.remove')}\n disabled={busy !== null}\n onClick={() => {\n void applyAction(row.id, { kind: 'remove' }, t('queue.removeFailed'))\n }}\n >\n <IconTrashOutlineMedium size={14} />\n </button>\n </Tooltip>\n <span className={css.plan} role=\"group\" aria-label={t('steer.later.aria')}>\n <Tooltip label={t('steer.now')} side=\"bottom\" delayMs={500} disabled={planDisabled || row.text === null}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierNow}`}\n aria-label={t('steer.now')}\n title={planDisabled ? t('steer.unavailable.running') : row.text === null ? t('steer.now.unsupported') : undefined}\n disabled={busy !== null || planDisabled || row.text === null}\n onClick={() => { void steerRow(row, 'now') }}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.next')} side=\"bottom\" delayMs={500} disabled={planDisabled}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierNext}`}\n aria-label={t('steer.next')}\n title={planDisabled ? t('steer.unavailable.running') : undefined}\n disabled={busy !== null || planDisabled}\n onClick={() => { void steerRow(row, 'next') }}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.later')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierLater}`}\n aria-label={t('steer.later')}\n aria-pressed\n disabled={busy !== null || clearing}\n onClick={() => {\n // Later is the default queue state; pressing it\n // keeps the row queued (no-op by design).\n }}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n </span>\n </>\n )}\n </div>}\n </li>\n ))}\n </ul>\n {steering.length > 0 && (\n <ul className={css.steeringList} data-steering-list=\"\">\n {steering.map(row => (\n <li key={row.id} className={css.row} data-tier={badgeFor('steering') ?? undefined}>\n <span className={css.lead} aria-hidden><IconQueueOutlineMedium /></span>\n <SteerBadge tier={badgeFor('steering')} t={t} />\n <span className={css.preview}>{row.text}</span>\n <div className={css.actions}>\n <Tooltip label={t('steer.revoke')} side=\"bottom\" delayMs={500} disabled={row.text === null}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierLater}`}\n aria-label={t('steer.revoke')}\n title={row.text === null ? t('steer.revoke.unsupported') : undefined}\n disabled={busy !== null || row.text === null || frozen}\n onClick={() => { void revokeToLater(row) }}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n )\n}\n\n/** Badge label keys per tier. */\nconst BADGE_KEYS: Record<SteerTier, string> = {\n now: 'steer.badge.now',\n next: 'steer.badge.next',\n later: 'steer.badge.later',\n}\n\n/** Badge tint classes per tier (present at bundle time; typed through the css-modules declaration). */\nconst BADGE_CLASSES: Record<SteerTier, string> = {\n now: css.badgeNow as string,\n next: css.badgeNext as string,\n later: css.badgeLater as string,\n}\n\n/** One row's tier badge: colored dot + label; context rows render nothing. */\nfunction SteerBadge({ tier, t }: { tier: SteerTier | null; t: SteerQueueDockProps['t'] }) {\n if (tier === null) return null\n return (\n <span className={`${css.badge} ${BADGE_CLASSES[tier]}`} data-badge={tier}>\n <span className={css.dot} aria-hidden />\n <span className={css.badgeLabel}>{t(BADGE_KEYS[tier])}</span>\n </span>\n )\n}\n","/**\r\n * input-traffic ↔ dsh-session-guard 透传桥(D8 fail-open)。\r\n *\r\n * input-traffic **只做冻结增强**(队列冻结/解冻),服务端会话门(暂停/恢复会话)\r\n * 归 dsh-session-guard 插件。冻结/解冻按钮触发时,尽力调用\r\n * `sessionGuard.stopNextTurn` / `resume`;**插件未装**(路由 404 / 网络失败 /\r\n * 返回错误)→ 静默跳过,**绝不报错**,前端冻结仍正常生效。\r\n *\r\n * 不吸收任何 auto-continue / 重试逻辑(重试归后端 dsh-session-guard,D9)。\r\n */\r\n\r\n/** 尽力调用 sessionGuard.stopNextTurn(停掉 session 下一回合)。失败静默。 */\r\nexport async function sessionGuardStopNextTurn(sessionId: string): Promise<boolean> {\r\n return callGuard(sessionId, 'stopNextTurn')\r\n}\r\n\r\n/** 尽力调用 sessionGuard.resume。失败静默。 */\r\nexport async function sessionGuardResume(sessionId: string): Promise<boolean> {\r\n return callGuard(sessionId, 'resume')\r\n}\r\n\r\nasync function callGuard(sessionId: string, action: string): Promise<boolean> {\r\n try {\r\n const res = await fetch('/session-guard/rpc', {\r\n method: 'POST',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ sessionId, action }),\r\n })\r\n if (!res.ok) return false\r\n const body = await res.json().catch(() => null)\r\n return body?.ok === true\r\n } catch {\r\n // 路由不存在(session-guard 未装)/ 网络失败 → fail-open。\r\n return false\r\n }\r\n}\r\n\r\n// 探测标记:session-guard 客户端据此跳过自带的回退冻结按钮(避免双按钮/占位)。\r\n// 在 bundle 顶层执行;input-traffic 桥存在即置位。\r\ndeclare global {\r\n var __DSH_SESSION_GUARD_BRIDGE__: boolean | undefined\r\n}\r\ntry {\r\n globalThis.__DSH_SESSION_GUARD_BRIDGE__ = true\r\n} catch {\r\n /* 浏览器环境无 window 时忽略 */\r\n}\r\n","/**\r\n * Session freeze/resume control, mounted in the composer's right tool row\r\n * (`conversation.input.right`) so it is reachable before anything queues.\r\n *\r\n * Peak-hour pause semantics: freeze does NOT interrupt the running turn —it\r\n * finishes naturally. The queued messages are detached (removed, preserved in\r\n * the shared store), so the driver finds no pending work and stops after the\r\n * current turn. Resume re-submits the preserved texts, waking the driver and\r\n * continuing the queue.\r\n *\r\n * dsh-session-guard 协作(D8 fail-open):\r\n * - 冻结 = 前端摘队列(本插件)+ composer block(阻止新输入漏进对话) + 尽力调服务端\r\n * sessionGuard.stopNextTurn(停掉 session 下一回合;session-guard 未装时静默跳过)。\r\n * - 解冻 = 清 composer block + **先** await sessionGuard.resume(让被打断回合的自然\r\n * 下一步先发生),**再**重投队列(later 级条目因此排在自然 next turn 之后,不再插队)。\r\n * - 本插件只做冻结增强,不承担重试/暂停决策(归后端,D9)。\r\n */\r\nimport { useSyncExternalStore } from 'react'\r\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\r\nimport { freezeStore } from './freeze-store.ts'\r\nimport type { FrozenTier } from './freeze-store.ts'\r\nimport { textOf, type SteerQueueDockInjected } from './steer-queue-dock.tsx'\r\nimport { sessionGuardResume, sessionGuardStopNextTurn } from './session-guard-bridge.ts'\r\nimport css from './freeze-button.module.css'\r\n\r\n/**\r\n * Full props of the composer-right entry.\r\n *\r\n * The slot carries no `InputZone` owner on this segment (0.1.5 keeps the\r\n * ownerless shape introduced in 0.1.2, `InputBar.tsx:466` renders `{}`); only\r\n * the session standard kit is shared, so the type declares exactly that —\r\n * reading `session`/`input` off this slot is a compile error, not a crash.\r\n */\r\nexport type FreezeButtonProps =\r\n Pick<PropsRuntime<'conversation.input.right'>, 'useProjection' | 'sessionId'>\r\n & SteerQueueDockInjected\r\n & PropsLocale<'steer'>\r\n\r\n/**\r\n * Freeze/resume toggle for the peak-hour scenario.\r\n * @param props - slot props; the session snapshot drives the detach list.\r\n */\r\nexport function FreezeButton({ useProjection, updateQueue, cancel, send, sendSteer, sessionId, setComposerBlock, notify, t }: FreezeButtonProps) {\r\n // The freeze store is keyed by session: read the owning session's snapshot.\r\n const sid = sessionId ?? ''\r\n const { frozen } = useSyncExternalStore(freezeStore.subscribe, () => freezeStore.getSnapshot(sid))\r\n const inbox = useProjection('inbox')\r\n\r\n const freeze = async (): Promise<void> => {\r\n // Detach every pending input row — queued (next-turn) and already-steered\r\n // (next-step) alike — so nothing stays in the live queue while frozen.\r\n // Steered rows keep their next intent as a safe_point plan for resume.\r\n const steeredIds = new Set((inbox?.['next-step'] ?? []).map(row => row.id))\r\n // Store order first (next-turn), then the steered band — matching the\r\n // pre-projection queue ordering the resume path replays. Wire rows carry\r\n // no `.text`; derive it from the content blocks like the dock does.\r\n const rows = [...(inbox?.['next-turn'] ?? []), ...(inbox?.['next-step'] ?? [])].map(row => ({\r\n ...row,\r\n text: textOf(row.content) ?? row.text ?? null,\r\n }))\r\n // Preserve plain-text copies; non-text rows cannot be re-sent and are\r\n // released by the freeze (documented limitation).\r\n const pending: { text: string; tier: FrozenTier }[] = rows.flatMap(row =>\r\n typeof row.text === 'string' && row.text !== '' ? [{ text: row.text, tier: steeredIds.has(row.id) ? 'safe_point' : 'queue' }] : [],\r\n )\r\n // Detach every pending row: the running turn finishes naturally, then the\r\n // driver finds no pending work and stops.\r\n await Promise.all(rows.map(row =>\r\n updateQueue(row.id, { kind: 'remove' }).catch(() => undefined),\r\n ))\r\n freezeStore.set(sid, { frozen: true, pending })\r\n // Raise the composer block: while frozen the composer is inert, so plain\r\n // Enter can never leak a new message into the conversation (busyEnter\r\n // only gates busy sessions; an idle/paused session would send directly).\r\n setComposerBlock?.(t('steer.frozenInput'))\r\n // 服务端:停掉 session 下一回合(fail-open,session-guard 未装则静默)。\r\n if (sessionId !== undefined) void sessionGuardStopNextTurn(sessionId)\r\n }\r\n\r\n const resume = async (): Promise<void> => {\r\n const pending = freezeStore.getSnapshot(sid).pending\r\n freezeStore.set(sid, { frozen: false, pending: [] })\r\n setComposerBlock?.(undefined)\r\n try {\r\n // 先恢复服务端会话:被打断回合的自然下一步(deferredTools 续跑)先发生。\r\n // 之后再重投队列 —— later 级条目经 send 进入 next-turn,排在自然 next turn\r\n // 之后;safe_point/force 仍按各自语义插队。顺序倒置会让 later 抢在自然\r\n // next turn 前被消费(idle 态 send 立即唤醒新回合)。\r\n if (sessionId !== undefined) await sessionGuardResume(sessionId)\r\n // Re-submit the preserved queue in FIFO order honoring each entry's\r\n // planned insertion tier: force (red) interrupts the current run first,\r\n // safe_point (yellow) steers into the next step, queue (green) flows\r\n // through the wake-and-continue chain.\r\n for (const entry of pending) {\r\n if (entry.tier === 'force') await cancel()\r\n if (entry.tier === 'safe_point' && sendSteer !== undefined) await sendSteer(entry.text)\r\n else await send(entry.text)\r\n }\r\n } catch {\r\n notify('error', t('steer.resumeFailed'))\r\n }\r\n }\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={css.freeze}\r\n aria-label={frozen ? t('steer.resume') : t('steer.freeze')}\r\n aria-pressed={frozen || undefined}\r\n title={frozen ? t('steer.frozen') : undefined}\r\n onClick={() => {\r\n if (frozen) void resume()\r\n else void freeze()\r\n }}\r\n >\r\n <span className={css.label}>{frozen ? t('steer.resume') : t('steer.freeze')}</span>\r\n </button>\r\n )\r\n}\r\n","/**\n * 输入流量 —— 「起子插件设置」family tab 的只读状态卡。\n *\n * 本插件是纯 client 接管型:没有自有 Config,busyEnter 在 apply 时钉死为\n * `queue`(写 ui-conversation entry),官方 General 行同时被压掉。因此这张卡\n * **只读**:展示钉死状态与使用说明,不提供任何写入口——提供 busyEnter 切换\n * 会与接管设计(apply 重新钉死)打架。\n *\n * 数据面:`configForms.get('ui-conversation')` 的快照(跨 entry 读,宿主\n * describe 镜像对该 entry 本就服务——官方 Enter 行就是它的编辑器)。\n */\nimport { createElement, useSyncExternalStore, type CSSProperties, type JSX } from 'react'\n\n/** 只读快照面(configForms 原生句柄的结构化子集)。 */\nexport interface FamilyCardScope {\n getSnapshot(): { status: string; value: { busyEnter?: string } | undefined; writable: boolean }\n subscribe(listener: () => void): () => void\n}\n\nexport interface FamilyCardProps {\n scope: FamilyCardScope\n t?: (key: string, params?: Record<string, unknown>) => string\n}\n\nconst row: CSSProperties = { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12, padding: '8px 0', fontSize: 13 }\nconst label: CSSProperties = { color: 'var(--dsw-alias-label-primary, inherit)' }\nconst dim: CSSProperties = { color: 'var(--dsw-alias-label-tertiary, rgba(127,127,127,.8))', fontSize: 12, lineHeight: 1.5 }\n\nexport function InputTrafficFamilyCard({ scope, t }: FamilyCardProps): JSX.Element {\n const snapshot = useSyncExternalStore(\n (listener) => scope.subscribe(listener),\n () => scope.getSnapshot(),\n )\n const pinned = snapshot.value?.busyEnter ?? 'queue'\n const tr = (key: string): string => (t ? t(key) : FALLBACK_ZH[key] ?? key)\n return createElement('div', { style: { display: 'grid', gap: 6 } },\n createElement('div', { style: row },\n createElement('span', { style: label }, tr('family.busyEnter')),\n createElement('span', { style: dim }, `busyEnter = ${pinned}`),\n ),\n createElement('p', { style: { ...dim, margin: 0 } }, tr('family.desc')),\n )\n}\n\n/** 无 locale 服务时的中文兜底(与 zh 字典键一一对应)。 */\nconst FALLBACK_ZH: Record<string, string> = {\n 'family.busyEnter': 'busy-Enter 行为(本插件接管)',\n 'family.desc': '普通回车在繁忙时进入排队(queue),不会打断当前回答;打断请用输入区的冻结/转向按钮。该行为由本插件自动接管,无需配置。',\n}\n","/**\r\n * Busy-Enter row hiding: shadows the official `settings.general.item` entry\r\n * `composer-enter` (same cell id, priority -1) so the lower priority wins and\r\n * the official \"繁忙时 Enter 键行为\" row never renders while this plugin is\r\n * mounted.\r\n *\r\n * The behavior itself is taken over by the plugin: plain Enter stays\r\n * queue-later (green), the planning dock owns yellow/red, and the plugin apply\r\n * pins `ui-conversation.busyEnter` to `queue` so no stale preference can\r\n * leak through the hidden row.\r\n */\r\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\r\n\r\n/** Full props of a settings-row entry (unused: the row renders nothing). */\r\nexport type HideEnterRowProps = PropsRuntime<'settings.general.item'> & PropsLocale<'steer'>\r\n\r\n/** Render nothing: the official busy-Enter row is hidden while mounted. */\r\nexport function HideEnterRow(_props: HideEnterRowProps): null {\r\n return null\r\n}\r\n","/**\n * compat.ts —— 版本敏感代码的**唯一窄腰**(INDEX §C:版本差异代码只许出现在\n * 窄腰文件,能力探测优先,禁止读宿主版本号)。\n *\n * 本插件已核实的两处分叉(findings §1.1 #5 / 迁移执行期补勘):\n * 1. 持久化设置面:0.1.7+ 走 `configForms.get(ns)`;≤0.1.5 走\n * `settingsScope.bind({ namespace })`。0.1.7-rc.1 的 client-ui-settings 包\n * 已不含 `settingsScope` 字样(2026-10-04 node_modules 全文核查)——两服务\n * 按代互斥,双 scoped-inject 天然不会双触发。\n * 2. 草稿回填:≤0.1.5 在 `input.for(actx).actions.setDraft`,0.1.7+ 直挂\n * `.setDraft`(compat/0.1.5:src/client/index.ts vs 本分支同文件)。\n *\n * 缺席服务上的 scoped-inject fiber 永久 PENDING:与 `dsh-family.tab` 在持有者\n * (跨插件族,非宿主本体)缺席时的惰性等待同型,不阻塞插件其余半区——\n * 插件级 inject 清单因此**只含六线通用服务**,防整插件 PENDING 静默失活。\n *\n * All @deepseek-ai/* imports are type-only (client bundle purity).\n */\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\n\n/**\n * Structural minimum of a durable settings document handle — shared by\n * `configForms.get()` (0.1.7+) and `settingsScope.bind()` (≤0.1.5). Declared\n * locally (NOT as ambient augmentation of `@deepseek-ai/dsh-client-ui-settings/client`)\n * so the compile face stays identical against every host line's real types.\n */\nexport interface SettingsDocHandle {\n getSnapshot(): { status: string; value: { busyEnter?: string } | undefined; writable: boolean }\n subscribe(listener: () => void): () => void\n set(field: string, value: unknown): Promise<void>\n}\n\n/** Anything registerSettingsFaces needs beyond the pin itself. */\nexport interface SettingsFacesDeps {\n /** Durable namespace holding the pinned field (`ui-conversation`). */\n namespace: string\n /** Field to pin (busy-Enter takeover). */\n field: string\n /** Value to pin. */\n value: unknown\n /** Called once a settings face resolves; receives the scope handle (the\n * family tab card reads it). Never called on hosts with neither service. */\n onScope: (scope: SettingsDocHandle) => void\n}\n\n/**\n * Pin the busy-Enter field through whichever durable-settings service this\n * host line carries, then hand the resolved scope to `onScope`.\n *\n * Both variants are scoped sub-injects: on a host without the service the\n * fiber waits forever WITHOUT blocking the plugin's other faces (same posture\n * as the family tab's slot-inject when the family holder is absent).\n */\nexport function registerSettingsFaces(ctx: ClientContext, deps: SettingsFacesDeps): void {\n // Modern hosts (0.1.7+): configForms owns cross-entry durable writes.\n ctx.inject(['configForms'], (configForms: unknown) => {\n const scope = (configForms as { get(namespace: string): SettingsDocHandle }).get(deps.namespace)\n void scope.set(deps.field, deps.value)\n deps.onScope(scope)\n })\n // Old hosts (≤0.1.5): namespaced durable scope via bind().\n ctx.inject(['settingsScope'], (settingsScope: unknown) => {\n const scope = (settingsScope as {\n bind(spec: { namespace: string }): SettingsDocHandle\n }).bind({ namespace: deps.namespace })\n void scope.set(deps.field, deps.value)\n deps.onScope(scope)\n })\n}\n\n/**\n * Draft back-fill normalized across host lines: prefers the direct\n * `.setDraft` (0.1.7+), falls back to the `.actions` parking spot (≤0.1.5).\n * Pure shape probing on the conversation row object — no version reads.\n */\nexport function draftWriter(\n conversation: { input: { for(actx: unknown): unknown } },\n actx: unknown,\n): (text: string) => void {\n return (text: string) => {\n const row = conversation.input.for(actx) as {\n setDraft?(text: string): void\n actions?: { setDraft(text: string): void }\n }\n if (typeof row.setDraft === 'function') row.setDraft(text)\n else row.actions?.setDraft(text)\n }\n}\n","/**\n * dsh-input-traffic —browser half.\n *\n * The whole takeover lives here:\n * 1. registers the `steer` dictionaries;\n * 2. pins `ui-conversation.busyEnter` to `queue` (plain Enter = green later)\n * so the hidden official row cannot leak a stale queue/steer preference;\n * 3. shadows the official queue dock (`conversation.input.dock` cell id\n * `queue`, priority -1) with the three-tier planning strip;\n * 4. shadows the official busy-Enter settings row (`settings.general.item`\n * cell id `composer-enter`, priority -1) with a null render.\n *\n * ORDERING (why the dock registers at QUEUE_DOCK_ORDER instead of the\n * official dock's 20): a list slot's DISPLAY position is decided by `order`\n * alone — `ui-renderer/src/client/scoped-slots.tsx` maps the shadowing\n * winners to rows and then sorts them by `order` — while `priority` only\n * decides which entry wins a shared cell id. Keeping the official 20\n * therefore left the strip above any later contributor (dsh-perm-gate's\n * notice registers order 30), which pushed that notice between the queue\n * strip and the composer card. A deliberately high order keeps the strip\n * adjacent to the card; priority stays -1 so the cell takeover still holds.\n * Known `conversation.input.dock` contributors (tarball-verified across every\n * released host 0.1.5-rc.1 → 0.2.0-rc.2; the official registration never\n * changed): official `queue` 20, `todo` 0, `dsh-perm-gate.notice` 30,\n * `dsh-brief-sidebar` shadows the `todo` cell (priority -1),\n * `dsh-tidy-display-entry` 0 (order omitted). No host version ever registered\n * a `goal` entry here — earlier comments citing one were wrong. Adjacent\n * slots (`conversation.composer.dock`, `conversation.input.left`) are\n * separate bands — a third party registering a larger `order` inside THIS\n * slot could still land below us.\n *\n * All @deepseek-ai/* imports are type-only: collaboration happens through\n * cordis services and slot registration only (client bundle purity).\n */\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { NS, dictionaries } from './locales.ts'\nimport { SteerQueueDock } from './steer-queue-dock.tsx'\nimport type { SteerQueueDockInjected } from './steer-queue-dock.tsx'\nimport { FreezeButton } from './freeze-button.tsx'\nimport { InputTrafficFamilyCard } from './family-card.tsx'\nimport { HideEnterRow } from './hide-enter-row.tsx'\nimport { draftWriter, registerSettingsFaces } from './compat.ts'\n\n/** Durable conversation settings namespace owned by ui-conversation. */\nconst CONVERSATION_SETTINGS_NAMESPACE = 'ui-conversation'\n\n/** Busy-Enter field inside that namespace; the plugin pins it to queue. */\nconst BUSY_ENTER_FIELD = 'busyEnter'\n\n/**\n * Display order of the queue strip inside `conversation.input.dock`.\n *\n * List rows render sorted by `order` ascending, so a value above every other\n * contributor keeps the strip as the bottom-most entry of the band — directly\n * on top of the composer card. Known contributors (stable across hosts\n * 0.1.5-rc.1 → 0.2.0-rc.2): `todo` 0, official `queue` 20,\n * `dsh-perm-gate.notice` 30, `dsh-tidy-display-entry` 0. DSH has no \"last\"\n * slot semantics, so this is a convention, not a\n * structural guarantee: a third party registering a larger value could still\n * land below us.\n */\nexport const QUEUE_DOCK_ORDER = 1000\n\n/**\n * Deliver one plain-text message into the session's next step. The exposed\n * conversation `send` verb only queues into the next turn, so resume steers\n * through the session face's steer-mode prompt instead (no harness change).\n * @param ctx - root context (resolves the session face behind the scope).\n * @param actx - agent-scoped context of the owning session.\n * @param text - message text to deliver.\n */\nfunction steerPrompt(actx: ClientContext, text: string): Promise<void> {\n // steer-mode prompt 面在本版(main@0.2.8)契约中未声明;resume 落到 conversation.send\n // (排队到下一轮)交付 safe_point 文本,与 feature 分支语义对齐但取当前可用 API。\n const conversation = actx.get('conversation')\n if (conversation === undefined) return Promise.reject(new Error('steer resume: conversation service unavailable'))\n return conversation.send(text)\n}\n\n/**\n * Services required by the browser half. Only the six-line-universal faces\n * live here — the durable-settings face (`configForms` on 0.1.7+,\n * `settingsScope` on ≤0.1.5) is resolved by scoped sub-injects inside the\n * compat waist, because a plugin-level inject of a per-line service would\n * leave the WHOLE fiber PENDING on the other line (silent total deactivation).\n */\nexport const inject = ['slots', 'locale', 'sessions', 'conversation']\n\n/**\n * Client plugin body: dictionaries, busy-Enter pinning, and the two slot\n * shadowings.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, dictionaries), 'dsh-input-traffic: dictionaries')\n // Family-tab label translator, captured EAGERLY: the family holder evaluates\n // `label()` during its own render; a lazy ctx.locale access inside the thunk\n // is a cross-context accessor call and can throw there (killing the whole\n // tab ledger projection). bind() returns a live binder, locale switches are\n // still followed.\n const tFamily = ctx.locale.bind(NS)\n\n // Take over the busy-Enter behavior: plain Enter stays queue-later while\n // the official row is hidden. Pinning here also repairs a persisted `steer`\n // preference that would otherwise keep working invisibly behind the hidden\n // row. Best-effort: a memory-mode host simply accepts it locally.\n // The durable-settings service is per-line (configForms 0.1.7+ /\n // settingsScope ≤0.1.5) — the compat waist resolves it and the family tab\n // registers against whichever scope resolves.\n registerSettingsFaces(ctx, {\n namespace: CONVERSATION_SETTINGS_NAMESPACE,\n field: BUSY_ENTER_FIELD,\n value: 'queue',\n onScope: (scope) => {\n // 插件族共用设置 tab:只读状态卡(busyEnter 钉死展示 + 使用说明)。\n // 持有者是跨插件族(thinking-levels 一族,非宿主本体),缺席时 slot\n // inject 静默等待,不阻塞客户端半。\n ctx.slots.inject('dsh-family.tab', () => ctx.slots.register({\n name: 'dsh-family.tab',\n id: 'input-traffic',\n order: 50,\n label: () => tFamily('family.title'),\n locale: NS,\n inject: () => ({ scope }),\n }, InputTrafficFamilyCard))\n },\n })\n\n // Shadow the official queue dock with the three-tier planning strip. The\n // high `order` keeps it the bottom-most entry of the band (see the file\n // header); `priority: -1` is what wins the official `queue` cell.\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({\n name: 'conversation.input.dock',\n id: 'queue',\n order: QUEUE_DOCK_ORDER,\n priority: -1,\n locale: NS,\n inject: (sessionId: SessionId): SteerQueueDockInjected => {\n const actx = ctx.sessions.scope(sessionId)\n if (actx === undefined) throw new Error(`steer dock: session \"${sessionId}\" resolved no scope`)\n const conversation = actx.get('conversation')\n if (conversation === undefined) throw new Error('steer dock: conversation service unavailable')\n return {\n updateQueue: (itemId, action) => conversation.updateQueue(itemId as never, action),\n cancel: () => conversation.cancel(),\n send: (text) => conversation.send(text),\n setDraft: draftWriter(conversation, actx),\n notify: (level, text) => { conversation.input.for(actx).notify(level, text) },\n }\n },\n }, SteerQueueDock))\n\n // Composer-right freeze/resume control (reachable before anything queues).\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'steer-freeze',\n order: 30,\n locale: NS,\n inject: (sessionId: SessionId): SteerQueueDockInjected => {\n const actx = ctx.sessions.scope(sessionId)\n if (actx === undefined) throw new Error(`steer freeze: session \"${sessionId}\" resolved no scope`)\n const conversation = actx.get('conversation')\n if (conversation === undefined) throw new Error('steer freeze: conversation service unavailable')\n return {\n updateQueue: (itemId, action) => conversation.updateQueue(itemId as never, action),\n cancel: () => conversation.cancel(),\n send: (text) => conversation.send(text),\n // safe_point 恢复经 conversation.send 排队到下一轮(本版契约无 steer prompt 面)。\n sendSteer: (text) => steerPrompt(actx, text),\n sessionId: String(sessionId),\n setDraft: draftWriter(conversation, actx),\n notify: (level, text) => { conversation.input.for(actx).notify(level, text) },\n // 冻结期间 raise composer block:composer 变 inert(回车/发送按钮全部失效),\n // 输入不会漏进对话;恢复时清除。block 不锁 input.right(恢复按钮仍可点)。\n setComposerBlock: (reason) => {\n conversation.blocks.set(sessionId, reason === undefined ? undefined : { reason })\n },\n }\n },\n }, FreezeButton))\n\n // Hide the official busy-Enter settings row (null render wins the cell).\n ctx.slots.inject('settings.general.item', () => ctx.slots.register({\n name: 'settings.general.item',\n id: 'composer-enter',\n order: 20,\n priority: -1,\n locale: NS,\n }, HideEnterRow))\n}\n"],"mappings":";;;;;;;;;;;;EAGA,MAAa,KAAK;;EA2flB,MAAa,eAAuD;GAAE;IAvfpE,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,cAAc;IACd,0BAA0B;IAC1B,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,sBAAsB;IACtB,oBAAoB;IACpB,+BAA+B;IAC/B,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,4BAA4B;IAC5B,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,6BAA6B;IAC7B,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,8BAA8B;IAC9B,+BAA+B;IAC/B,wBAAwB;IACxB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,6BAA6B;IAC7B,eAAe;IACf,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;GAoc8C;GAAI;IA/bxE,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,cAAc;IACd,0BAA0B;IAC1B,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,sBAAsB;IACtB,oBAAoB;IACpB,+BAA+B;IAC/B,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,4BAA4B;IAC5B,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,6BAA6B;IAC7B,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,8BAA8B;IAC9B,+BAA+B;IAC/B,wBAAwB;IACxB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,6BAA6B;IAC7B,eAAe;IACf,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;GA4YkD;GAAI;IAvY5E,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,cAAc;IACd,0BAA0B;IAC1B,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,sBAAsB;IACtB,oBAAoB;IACpB,+BAA+B;IAC/B,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,4BAA4B;IAC5B,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,6BAA6B;IAC7B,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,8BAA8B;IAC9B,+BAA+B;IAC/B,wBAAwB;IACxB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,6BAA6B;IAC7B,eAAe;IACf,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;GAoVsD;GAAI;IA/UhF,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,cAAc;IACd,0BAA0B;IAC1B,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,sBAAsB;IACtB,oBAAoB;IACpB,+BAA+B;IAC/B,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,4BAA4B;IAC5B,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,6BAA6B;IAC7B,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,8BAA8B;IAC9B,+BAA+B;IAC/B,wBAAwB;IACxB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,6BAA6B;IAC7B,eAAe;IACf,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;GA4R0D;GAAI;IAvRpF,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,cAAc;IACd,0BAA0B;IAC1B,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,sBAAsB;IACtB,oBAAoB;IACpB,+BAA+B;IAC/B,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,4BAA4B;IAC5B,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,6BAA6B;IAC7B,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,8BAA8B;IAC9B,+BAA+B;IAC/B,wBAAwB;IACxB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,6BAA6B;IAC7B,eAAe;IACf,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;GAoO8D;GAAI;IA/NxF,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,cAAc;IACd,0BAA0B;IAC1B,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,sBAAsB;IACtB,oBAAoB;IACpB,+BAA+B;IAC/B,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,4BAA4B;IAC5B,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,6BAA6B;IAC7B,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,8BAA8B;IAC9B,+BAA+B;IAC/B,wBAAwB;IACxB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,6BAA6B;IAC7B,eAAe;IACf,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;GA4KkE;GAAI;IAvK5F,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,cAAc;IACd,0BAA0B;IAC1B,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,sBAAsB;IACtB,oBAAoB;IACpB,+BAA+B;IAC/B,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,4BAA4B;IAC5B,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,6BAA6B;IAC7B,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,8BAA8B;IAC9B,+BAA+B;IAC/B,wBAAwB;IACxB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,6BAA6B;IAC7B,eAAe;IACf,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;GAoHsE;GAAI;IA/GhG,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,cAAc;IACd,0BAA0B;IAC1B,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,sBAAsB;IACtB,oBAAoB;IACpB,+BAA+B;IAC/B,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,4BAA4B;IAC5B,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,6BAA6B;IAC7B,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,8BAA8B;IAC9B,+BAA+B;IAC/B,wBAAwB;IACxB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,6BAA6B;IAC7B,eAAe;IACf,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;GA4D0E;GAAI;IAvDpG,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,cAAc;IACd,0BAA0B;IAC1B,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,sBAAsB;IACtB,oBAAoB;IACpB,+BAA+B;IAC/B,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,4BAA4B;IAC5B,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;IAClB,6BAA6B;IAC7B,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,8BAA8B;IAC9B,+BAA+B;IAC/B,wBAAwB;IACxB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,6BAA6B;IAC7B,eAAe;IACf,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;GAI8E;EAAG;;;;EC9dzG,MAAM,yBAAS,IAAI,IAAyB;EAC5C,MAAM,4BAAY,IAAI,IAAgB;;;EAItC,MAAM,QAAqB;GAAE,QAAQ;GAAO,SAAS,CAAC;EAAE;;EAGxD,MAAa,cAAc;;GAEzB,YAAY,WAAgC;IAC1C,OAAO,OAAO,IAAI,SAAS,KAAK;GAClC;GACA,UAAU,UAAkC;IAC1C,UAAU,IAAI,QAAQ;IACtB,aAAa;KAAE,UAAU,OAAO,QAAQ;IAAE;GAC5C;;GAEA,IAAI,WAAmB,MAAyB;IAC9C,IAAI,KAAK,WAAW,SAAS,KAAK,QAAQ,WAAW,GACnD,OAAO,OAAO,SAAS;SAEvB,OAAO,IAAI,WAAW,IAAI;IAE5B,KAAK;GACP;EACF;;EAeA,SAAgB,gBAAgB,WAAmB,OAAe,MAAoB;GACpF,MAAM,UAAU,OAAO,IAAI,SAAS,CAAC,EAAE;GACvC,IAAI,YAAY,KAAA,GAAW;GAC3B,MAAM,QAAQ,QAAQ;GACtB,IAAI,UAAU,KAAA,GAAW;GACzB,MAAM,OAAO,CAAC,GAAG,OAAO;GACxB,KAAK,SAAS;IAAE,GAAG;IAAO;GAAK;GAC/B,YAAY,IAAI,WAAW;IAAE,QAAQ;IAAM,SAAS;GAAK,CAAC;EAC5D;;EAGA,SAAgB,UAAU,WAAmB,OAAe,MAAwB;GAClF,MAAM,UAAU,OAAO,IAAI,SAAS,CAAC,EAAE;GACvC,IAAI,YAAY,KAAA,GAAW;GAC3B,MAAM,QAAQ,QAAQ;GACtB,IAAI,UAAU,KAAA,GAAW;GACzB,MAAM,OAAO,CAAC,GAAG,OAAO;GACxB,KAAK,SAAS;IAAE,GAAG;IAAO;GAAK;GAC/B,YAAY,IAAI,WAAW;IAAE,QAAQ;IAAM,SAAS;GAAK,CAAC;EAC5D;;EAGA,SAAgB,gBAAgB,WAAmB,OAAqB;GACtE,MAAM,UAAU,OAAO,IAAI,SAAS,CAAC,EAAE;GACvC,IAAI,YAAY,KAAA,GAAW;GAC3B,YAAY,IAAI,WAAW;IAAE,QAAQ;IAAM,SAAS,QAAQ,QAAQ,GAAG,MAAM,MAAM,KAAK;GAAE,CAAC;EAC7F;;EAGA,SAAgB,YAAY,WAAmB,MAAc,IAAkB;GAC7E,IAAI,SAAS,IAAI;GACjB,MAAM,UAAU,OAAO,IAAI,SAAS,CAAC,EAAE;GACvC,IAAI,YAAY,KAAA,GAAW;GAC3B,MAAM,OAAO,CAAC,GAAG,OAAO;GACxB,MAAM,CAAC,SAAS,KAAK,OAAO,MAAM,CAAC;GACnC,IAAI,UAAU,KAAA,GAAW;GACzB,KAAK,OAAO,IAAI,GAAG,KAAK;GACxB,YAAY,IAAI,WAAW;IAAE,QAAQ;IAAM,SAAS;GAAK,CAAC;EAC5D;EAEA,SAAS,OAAa;GACpB,KAAK,MAAM,YAAY,WAAW,SAAS;EAC7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECrEA,MAAM,0BAIJ;EACF,IAAI,OAAO,aAAa,eAAe,SAAS,cAAc,kEAAgE,MAAM,MAAM;GACxI,MAAM,MAAM,SAAS,cAAc,OAAO;GAC1C,IAAI,QAAQ,SAAS;GACrB,IAAI,QAAQ,YAAY;GACxB,IAAI,cAAc;GAClB,SAAS,KAAK,YAAY,GAAG;EAC/B;;EASA,MAAM,eAAe;;EAGrB,MAAM,eAAe;;;;;;;EA+CrB,SAAgB,SAAS,WAAgE;GACvF,IAAI,cAAc,YAAY,OAAO;GACrC,IAAI,cAAc,UAAU,OAAO;GACnC,OAAO;EACT;;;;;;;EAQA,SAAgB,aAAa,IAA+B;GAC1D,GAAG,MAAM,SAAS;GAClB,GAAG,MAAM,SAAS,GAAG,GAAG,aAAa;EACvC;;;;;;;EAQA,SAAgB,OAAO,SAAkG;GACvH,IAAI,YAAY,KAAA,KAAa,QAAQ,WAAW,GAAG,OAAO;GAC1D,IAAI,CAAC,QAAQ,OAAM,UAAS,MAAM,SAAS,MAAM,GAAG,OAAO;GAC3D,MAAM,SAAS,QAAQ,KAAI,UAAS,MAAM,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE;GAC7D,OAAO,WAAW,KAAK,OAAO;EAChC;;;;;EAMA,SAAgB,eAAe,EAAE,WAAW,YAAY,eAAe,OAAO,aAAa,QAAQ,MAAM,UAAU,QAAQ,KAA0B;GAInJ,MAAM,QAAQ,cAAc,OAAO;GAGnC,MAAM,SAAA,GAAQA,MAAAA,QAAAA,QAAe,QAAQ,gBAAgB,CAAC,EAAA,CAAG,KAAI,SAAQ;IAAE,GAAG;IAAK,MAAM,OAAO,IAAI,OAAO,KAAK,IAAI,QAAQ;GAAK,EAAE,GAAG,CAAC,KAAK,CAAC;GACzI,MAAM,YAAA,GAAWA,MAAAA,QAAAA,QAAe,QAAQ,gBAAgB,CAAC,EAAA,CAAG,KAAI,SAAQ;IAAE,GAAG;IAAK,MAAM,OAAO,IAAI,OAAO,KAAK,IAAI,QAAQ;GAAK,EAAE,GAAG,CAAC,KAAK,CAAC;GAC5I,MAAM,UAAU,YAAW,MAAK,EAAE,OAAO;GAIzC,MAAM,eAAe,YAAW,MAAK,EAAE,aAAa,QAAQ,EAAE,SAAS,QAAQ,SAAS,aAAa;GACrG,MAAM,CAAC,SAAS,eAAA,GAAcC,MAAAA,SAAAA,CAA8C,IAAI;GAChF,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAwB,IAAI;GACpD,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,KAAK;GAG9C,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAS,KAAK;GACtD,MAAM,gBAAA,GAAeC,MAAAA,OAAAA,CAA6C,IAAI;GAEtE,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAsB,IAAI;GAC5C,MAAM,CAAC,UAAU,gBAAA,GAAeD,MAAAA,SAAAA,CAAwB,IAAI;GAE5D,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,OAAe;IAC/C,IAAI;KACF,MAAM,IAAI,aAAa,QAAQ,YAAY;KAC3C,OAAO,MAAM,OAAO,OAAO,MAAM;IACnC,QAAQ;KACN,OAAO;IACT;GACF,CAAC;GAMD,MAAM,EAAE,QAAQ,SAAS,mBAAA,GAAkBE,MAAAA,qBAAAA,CACzC,YAAY,iBACN,YAAY,YAAY,aAAa,EAAE,CAC/C;GACA,MAAM,MAAM,aAAa;GACzB,MAAM,UAAA,GAASC,MAAAA,MAAAA,CAAM;GAErB,MAAM,aAAA,GAAYF,MAAAA,OAAAA,CAA4B,IAAI;GAElD,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,MAAM,WAAW,KAAK,CAAC,WAAW,aAAa,IAAI;IAGvD,IAAI,YAAY,QAAQ,CAAC,QAAQ,GAAG,WAAW,SAAS,MAAM,CAAC,gBAAgB,CAAC,MAAM,MAAK,QAAO,IAAI,OAAO,QAAQ,EAAE,IAAI,WAAW,IAAI;GAC5I,GAAG;IAAC;IAAW;IAAS;IAAO;GAAY,CAAC;GAG5C,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI;KACF,aAAa,QAAQ,cAAc,YAAY,MAAM,GAAG;IAC1D,QAAQ,CAER;GACF,GAAG,CAAC,SAAS,CAAC;GACd,CAAA,GAAA,MAAA,UAAA,aAAsB;IACpB,IAAI,aAAa,YAAY,MAAM,aAAa,aAAa,OAAO;GACtE,GAAG,CAAC,CAAC;GAGL,MAAM,YAAY,SAAS;GAC3B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,cAAc,KAAA,GAAW;IAC7B,MAAM,KAAK,UAAU;IACrB,IAAI,OAAO,MAAM,aAAa,EAAE;GAClC,GAAG,CAAC,SAAS,CAAC;GAKd,IAAI,MAAM,WAAW,KAAK,SAAS,WAAW,KAAK,CAAC,WAAW,CAAC,QAAQ,OAAO;GAE/E,MAAM,oBAAoB,iBAAiB,YAAY,QAAQ,SAAS,QAAQ;GAChF,MAAM,WAAW,CAAC,aAAa;GAC/B,MAAM,cAAc,MAAM,WAAW,KAAK;GAC1C,MAAM,eAAe,CAAC,gBAAgB,CAAC,WAAW;GAClD,MAAM,iBAAiB,MAAM,WAAW,KAAK,SAAS,WAAW;GAGjE,MAAM,qBAAqB,MAAM,MAAK,QAAO,IAAI,SAAS,IAAI;GAE9D,MAAM,cAAc,OAClB,QACA,QACA,YACqB;IACrB,QAAQ,MAAM;IACd,IAAI;KACF,MAAM,YAAY,QAAQ,MAAM;KAChC,OAAO;IACT,QAAQ;KACN,OAAO,SAAS,OAAO;KACvB,OAAO;IACT,UAAU;KACR,SAAQ,YAAW,YAAY,SAAS,OAAO,OAAO;IACxD;GACF;GAEA,MAAM,WAAW,YAA2B;IAC1C,IAAI,YAAY,QAAQ,OAAO,QAAQ,SAAS,YAAY,QAAQ,KAAK,KAAK,MAAM,IAAI;IACxF,MAAM,SAAS,QAAQ;IACvB,MAAM,OAAO,QAAQ;IACrB,QAAQ,MAAM;IACd,IAAI;KACF,MAAM,YAAY,QAAQ;MAAE,MAAM;MAAQ,SAAS,CAAC;OAAE,MAAM;OAAQ;MAAK,CAAC;KAAE,CAAC;KAC7E,WAAW,IAAI;IACjB,QAAQ;KAIN,IAAI,MAAM,MAAM,KAAK,MAAM,IAAI;MAC7B,SAAS,IAAI;MACb,WAAW,IAAI;MACf,OAAO,SAAS,EAAE,6BAA6B,CAAC;KAClD,OACE,OAAO,SAAS,EAAE,kBAAkB,CAAC;IAEzC,UAAU;KACR,SAAQ,YAAW,YAAY,SAAS,OAAO,OAAO;IACxD;GACF;GAEA,MAAM,WAAW,OAAO,KAA0C,SAAqD;IACrH,QAAQ,IAAI,EAAE;IACd,IAAI;KACF,IAAI,SAAS,OAAO;MAOlB,MAAM,OAAO;MACb,MAAM,YAAY,IAAI,IAAI,EAAE,MAAM,SAAS,CAAC;MAC5C,IAAI,IAAI,SAAS,MAAM,MAAM,KAAK,IAAI,IAAI;KAC5C,OACE,MAAM,YAAY,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;IAE/C,QAAQ;KACN,OAAO,SAAS,SAAS,QAAQ,EAAE,iBAAiB,IAAI,EAAE,kBAAkB,CAAC;IAC/E,UAAU;KACR,SAAQ,YAAW,YAAY,IAAI,KAAK,OAAO,OAAO;IACxD;GACF;;;;;;GAOA,MAAM,gBAAgB,OAAO,QAA4D;IACvF,IAAI,IAAI,SAAS,MAAM;IACvB,QAAQ,IAAI,EAAE;IACd,IAAI;KACF,MAAM,YAAY,IAAI,IAAI,EAAE,MAAM,SAAS,CAAC;KAC5C,MAAM,KAAK,IAAI,IAAI;IACrB,QAAQ;KACN,OAAO,SAAS,EAAE,oBAAoB,CAAC;IACzC,UAAU;KACR,SAAQ,YAAW,YAAY,IAAI,KAAK,OAAO,OAAO;IACxD;GACF;;;;;;;;;GAUA,MAAM,eAAe,OAAO,MAAsD,SAAwE;IACxJ,QAAQ,YAAY;IACpB,IAAI;KACF,KAAK,MAAM,OAAO,MAChB,IAAI;MACF,MAAM,YAAY,IAAI,IAAI,EAAE,MAAM,SAAS,CAAC;KAC9C,SAAS,OAAO;MACd,IAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,sBAAsB,GAAG;OAC5E,OAAO,SAAS,EAAE,oBAAoB,CAAC;OACvC;MACF;MACA,MAAM;KACR;KAEF,KAAK,MAAM,OAAO,MAChB,IAAI,IAAI,SAAS,MAAM,MAAM,KAAK,IAAI,IAAI;IAE9C,QAAQ;KACN,OAAO,SAAS,EAAE,qBAAqB,CAAC;IAC1C,UAAU;KACR,QAAQ,IAAI;IACd;GACF;;;;GAKA,MAAM,UAAU,OAAO,OAAe,UAAiC;IACrE,MAAM,OAAO;IACb,MAAM,QAAQ,KAAK,WAAU,QAAO,IAAI,OAAO,KAAK;IACpD,MAAM,SAAS,QAAQ;IACvB,IAAI,QAAQ,KAAK,SAAS,KAAK,UAAU,KAAK,QAAQ;IACtD,MAAM,OAAO,CAAC,GAAG,IAAI;IACrB,MAAM,UAAU,KAAK;IACrB,KAAK,SAAS,KAAK;IACnB,KAAK,UAAU;IACf,IAAI,KAAK,MAAK,QAAO,IAAI,SAAS,IAAI,GAAG;KACvC,OAAO,SAAS,EAAE,2BAA2B,CAAC;KAC9C;IACF;IACA,MAAM,aAAa,MAAM,IAAI;GAC/B;;;;GAKA,MAAM,YAAY,OAAO,WAAmB,YAAmC;IAC7E,IAAI,cAAc,SAAS;IAC3B,MAAM,OAAO;IACb,IAAI,KAAK,eAAe,KAAA,KAAa,KAAK,aAAa,KAAA,GAAW;IAClE,MAAM,OAAO,CAAC,GAAG,IAAI;IACrB,MAAM,CAAC,SAAS,KAAK,OAAO,WAAW,CAAC;IACxC,IAAI,UAAU,KAAA,GAAW;IACzB,KAAK,OAAO,SAAS,GAAG,KAAK;IAC7B,IAAI,KAAK,MAAK,QAAO,IAAI,SAAS,IAAI,GAAG;KACvC,OAAO,SAAS,EAAE,2BAA2B,CAAC;KAC9C;IACF;IACA,MAAM,aAAa,MAAM,IAAI;GAC/B;;GAGA,MAAM,iBAAuB;IAC3B,IAAI,cAAc;KAChB,IAAI,aAAa,YAAY,MAAM,aAAa,aAAa,OAAO;KACpE,gBAAgB,KAAK;KACrB,SAAc;KACd;IACF;IACA,gBAAgB,IAAI;IACpB,IAAI,aAAa,YAAY,MAAM,aAAa,aAAa,OAAO;IACpE,aAAa,UAAU,iBAAiB,gBAAgB,KAAK,GAAG,GAAI;GACtE;;GAGA,MAAM,oBAA0B;IAC9B,IAAI,aAAa,YAAY,MAAM,aAAa,aAAa,OAAO;IACpE,gBAAgB,KAAK;GACvB;;GAGA,MAAM,iBAAiB,OAAO,UAAiC;IAC7D,IAAI,YAAY,MAAM;IACtB,MAAM,OAAO,QAAQ,KAAK,KAAK;IAC/B,IAAI,SAAS,IAAI;KACf,WAAW,IAAI;KACf;IACF;IACA,gBAAgB,KAAK,OAAO,IAAI;IAChC,WAAW,IAAI;GACjB;GAEA,MAAM,WAAW,YAA2B;IAC1C,YAAY,IAAI;IAIhB,MAAM,UAAU,CAAC,GAAG,OAAO,GAAG,QAAQ;IACtC,IAAI;KACF,MAAM,OAAO;KACb,MAAM,QAAQ,IAAI,QAAQ,KAAI,QAC5B,YAAY,IAAI,IAAI,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS,CAC/D,CAAC;IACH,QAAQ;KACN,OAAO,SAAS,EAAE,mBAAmB,CAAC;IACxC,UAAU;KACR,YAAY,KAAK;IACnB;GACF;GAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWG,oCAAI;IAAM,mBAAgB;IACxC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,oCAAI;KAApB,UAAA;MACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,oCAAI;OAApB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QACE,MAAK;QACL,WAAWA,oCAAI;QACf,iBAAe;QACf,iBAAe;QACf,UAAU,MAAM,UAAU,KAAK;QAC/B,eAAe;SAAE,cAAa,UAAS,CAAC,KAAK;QAAE;QANjD,UAAA;SAQE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,oCAAI;UAAM,eAAA;UAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,wBAAD,CAAyB,CAAA;SAAO,CAAA;SACtE,MAAM,SAAS,KACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWD,oCAAI;UAAQ,UAAA,EAAE,eAAe,EAAE,GAAG,MAAM,OAAO,CAAC;SAAQ,CAAA;SAE1E,MAAM,SAAS,KACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,oCAAI;UAAS,eAAA;UAC3B,UAAA,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,8BAAD,CAA+B,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,4BAAD,CAA6B,CAAA;SACxE,CAAA;QAEF;OACR,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWH,oCAAI;QAApB,UAAA,CACG,gBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SACE,MAAK;SACL,WAAWA,oCAAI;SACf,cAAY,EAAE,oBAAoB;SAClC,UAAU,YAAY,SAAS,QAAQ;SACvC,SAAS;SAET,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,oCAAI;UAAa,UAAA,EAAE,oBAAoB;SAAQ,CAAA;QAC1D,CAAA,GAEV,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;SAAS,OAAO,eAAe,EAAE,qBAAqB,IAAI,EAAE,aAAa;SAAG,MAAK;SAAM,SAAS;SAC9F,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UACE,MAAK;UACL,WAAW,GAAGJ,oCAAI,MAAM,GAAG,eAAeA,oCAAI,eAAe;UAC7D,cAAY,eAAe,EAAE,qBAAqB,IAAI,EAAE,aAAa;UACrE,UAAU,YAAY,SAAS,QAAQ;UACvC,SAAS;UALX,UAAA,CAOE,iBAAA,GAAA,kBAAA,IAAA,CAACK,sCAAAA,wBAAD,EAAwB,MAAM,GAAK,CAAA,GACnC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWL,oCAAI;WAAa,UAAA,eAAe,EAAE,qBAAqB,IAAI,EAAE,aAAa;UAAQ,CAAA,CAC7F;;QACD,CAAA,CACN;OACF,CAAA,CAAA;;MACJ,UACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,oCAAI;OAAc,MAAK;OACpC,UAAA,EAAE,cAAc;MACd,CAAA;MAMN,UAAU,cAAc,SAAS,KAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,oCAAI;OAAY,eAAY;OACxC,UAAA,cAAc,KAAK,OAAO,MAAM;QAC/B,MAAM,gBAAgB,SAAS,OAAO,UAAU;QAChD,MAAM,OAAO,MAAM;QACnB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;SAEE,WAAW,GAAGA,oCAAI,UAAU,GAAG,aAAa,KAAK,SAASA,oCAAI,cAAc;SAC5E,aAAW,MAAM,SAAS,UAAU,QAAQ,MAAM,SAAS,eAAe,SAAS;SACnF,gBAAc,gBAAgB,KAAK,KAAA;SACnC,WAAW,CAAC;SACZ,OAAO,CAAC,gBAAgB,EAAE,mBAAmB,IAAI,KAAA;SACjD,cAAc,UAAU;UACtB,IAAI,eAAe;UACnB,UAAU,UAAU;UACpB,MAAM,aAAa,gBAAgB;UAEnC,MAAM,aAAa,QAAQ,cAAc,OAAO,CAAC,CAAC;SACpD;SACA,aAAa,UAAU;UACrB,IAAI,UAAU,YAAY,MAAM;UAChC,MAAM,eAAe;UACrB,YAAY,CAAC;SACf;SACA,SAAS,UAAU;UACjB,MAAM,eAAe;UACrB,MAAM,OAAO,UAAU;UACvB,UAAU,UAAU;UACpB,YAAY,IAAI;UAChB,IAAI,SAAS,MAAM,YAAY,KAAK,MAAM,CAAC;SAC7C;SACA,iBAAiB;UACf,UAAU,UAAU;UACpB,YAAY,IAAI;SAClB;SA7BF,UAAA;UA+BE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,oCAAI;WAAM,eAAA;WAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,wBAAD,CAAyB,CAAA;UAAO,CAAA;UACvE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WAAY,MAAM,MAAM,SAAS,UAAU,QAAQ,MAAM,SAAS,eAAe,SAAS;WAAY;UAAI,CAAA;UACzG,gBAEG,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WACE,KAAK;WACL,WAAA;WACA,WAAWD,oCAAI;WACf,cAAY,EAAE,YAAY;WAC1B,MAAM;WACN,OAAO,SAAS,QAAQ;WACxB,WAAW,UAAU;YAAE,WAAW;aAAE,IAAI,UAAU;aAAK,MAAM,MAAM,cAAc;YAAM,CAAC;WAAE;WAC1F,UAAU,UAAU;YAAE,aAAa,MAAM,aAAa;WAAE;WACxD,YAAY,UAAU;YACpB,IAAI,MAAM,QAAQ,UAAU;aAC1B,WAAW,IAAI;aACf;YACF;YACA,IAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,YAAY,CAAC,MAAM,YAAY,aAAa;aAC9E,MAAM,eAAe;aACrB,eAAoB,CAAC;YACvB;WACF;UACD,CAAA,IAED,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,oCAAI;WAAU,UAAA;UAAW,CAAA;UAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;WAAK,WAAWA,oCAAI;WACjB,UAAA,gBACC,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;YAAS,OAAO,EAAE,YAAY;YAAG,MAAK;YAAS,SAAS;YACtD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aACE,MAAK;aACL,WAAWJ,oCAAI;aACf,cAAY,EAAE,YAAY;aAC1B,UAAU,YAAY,QAAQ,QAAQ,KAAK,KAAK,MAAM;aACtD,eAAe;cAAE,eAAoB,CAAC;aAAE;aAExC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,wBAAD,EAAwB,MAAM,GAAK,CAAA;YAC7B,CAAA;WACD,CAAA,GACT,iBAAA,GAAA,kBAAA,IAAA,CAACF,sCAAAA,SAAD;YAAS,OAAO,EAAE,kBAAkB;YAAG,MAAK;YAAS,SAAS;YAC5D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aACE,MAAK;aACL,WAAWJ,oCAAI;aACf,cAAY,EAAE,kBAAkB;aAChC,eAAe;cAAE,WAAW,IAAI;aAAE;aAElC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,wBAAD,EAAwB,MAAM,GAAK,CAAA;YAC7B,CAAA;WACD,CAAA,CACT,EAAA,CAAA,IAEF,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;YACE,iBAAA,GAAA,kBAAA,IAAA,CAACH,sCAAAA,SAAD;aAAS,OAAO,EAAE,cAAc;aAAG,MAAK;aAAS,SAAS;aAAK,UAAU,MAAM;aAC7E,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cACE,MAAK;cACL,WAAWJ,oCAAI;cACf,cAAY,EAAE,cAAc;cAC5B,UAAU,MAAM;cAChB,eAAe,YAAY,KAAK,GAAG,IAAI,CAAC;cAExC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,4BAAD,CAA6B,CAAA;aACvB,CAAA;YACD,CAAA;YACT,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,SAAD;aAAS,OAAO,EAAE,gBAAgB;aAAG,MAAK;aAAS,SAAS;aAAK,UAAU,MAAM,cAAc,SAAS;aACtG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cACE,MAAK;cACL,WAAWJ,oCAAI;cACf,cAAY,EAAE,gBAAgB;cAC9B,UAAU,MAAM,cAAc,SAAS;cACvC,eAAe,YAAY,KAAK,GAAG,IAAI,CAAC;cAExC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,8BAAD,CAA+B,CAAA;aACzB,CAAA;YACD,CAAA;YACT,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,SAAD;aAAS,OAAO,EAAE,YAAY;aAAG,MAAK;aAAS,SAAS;aACtD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cACE,MAAK;cACL,WAAWJ,oCAAI;cACf,cAAY,EAAE,YAAY;cAC1B,eAAe;eAAE,WAAW;gBAAE,IAAI,UAAU;gBAAK;eAAK,CAAC;cAAE;cAEzD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACQ,sCAAAA,uBAAD,EAAuB,MAAM,GAAK,CAAA;aAC5B,CAAA;YACD,CAAA;YACT,iBAAA,GAAA,kBAAA,IAAA,CAACJ,sCAAAA,SAAD;aAAS,OAAO,EAAE,cAAc;aAAG,MAAK;aAAS,SAAS;aACxD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cACE,MAAK;cACL,WAAWJ,oCAAI;cACf,cAAY,EAAE,cAAc;cAC5B,eAAe,gBAAgB,KAAK,CAAC;cAErC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACK,sCAAAA,wBAAD,EAAwB,MAAM,GAAK,CAAA;aAC7B,CAAA;YACD,CAAA;YAGT,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;aAAM,WAAWL,oCAAI;aAAM,MAAK;aAAQ,cAAY,EAAE,kBAAkB;aAAxE,UAAA;cACE,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;eAAS,OAAO,EAAE,WAAW;eAAG,MAAK;eAAS,SAAS;eACrD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;gBACE,MAAK;gBACL,WAAW,GAAGJ,oCAAI,KAAK,GAAGA,oCAAI;gBAC9B,cAAY,EAAE,WAAW;gBACzB,gBAAc,MAAM,SAAS,WAAW,KAAA;gBACxC,eAAe,UAAU,KAAK,GAAG,OAAO;gBAExC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;iBAAM,WAAWA,oCAAI;iBAAK,eAAA;gBAAa,CAAA;eACjC,CAAA;cACD,CAAA;cACT,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;eAAS,OAAO,EAAE,YAAY;eAAG,MAAK;eAAS,SAAS;eACtD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;gBACE,MAAK;gBACL,WAAW,GAAGJ,oCAAI,KAAK,GAAGA,oCAAI;gBAC9B,cAAY,EAAE,YAAY;gBAC1B,gBAAc,MAAM,SAAS,gBAAgB,KAAA;gBAC7C,eAAe,UAAU,KAAK,GAAG,YAAY;gBAE7C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;iBAAM,WAAWA,oCAAI;iBAAK,eAAA;gBAAa,CAAA;eACjC,CAAA;cACD,CAAA;cACT,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;eAAS,OAAO,EAAE,aAAa;eAAG,MAAK;eAAS,SAAS;eACvD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;gBACE,MAAK;gBACL,WAAW,GAAGJ,oCAAI,KAAK,GAAGA,oCAAI;gBAC9B,cAAY,EAAE,aAAa;gBAC3B,gBAAc,MAAM,SAAS,WAAW,KAAA;gBACxC,eAAe,UAAU,KAAK,GAAG,OAAO;gBAExC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;iBAAM,WAAWA,oCAAI;iBAAK,eAAA;gBAAa,CAAA;eACjC,CAAA;cACD,CAAA;aACL;;WACN,EAAA,CAAA;UAED,CAAA;UACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,oCAAI;WAAa,UAAA,EAAE,mBAAmB;UAAQ,CAAA;SAC7D;QAtKG,GAAA,CAsKH;OAER,CAAC;MACC,CAAA;MAEN,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,IAAI;OAAQ,WAAWA,oCAAI;OAAM,QAAQ,CAAC;OAC3C,UAAA,eAAe,MAAM,KAAK,KAAK,UAC9B,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;QAEE,WAAW,GAAGA,oCAAI,IAAI,GAAG,aAAa,QAAQA,oCAAI,cAAc;QAChE,aAAW,SAAS,QAAQ,KAAK,KAAA;QACjC,gBAAc,SAAS,OAAO,IAAI,KAAK,KAAK,KAAA;QAC5C,WAAW,gBAAgB,CAAC,sBAAsB,SAAS,QAAQ,CAAC;QACpE,OAAO,gBAAgB,CAAC,sBAAsB,SAAS,QAAQ,CAAC,SAAS,EAAE,mBAAmB,IAAI,KAAA;QAClG,cAAc,UAAU;SACtB,UAAU,UAAU;SACpB,MAAM,aAAa,gBAAgB;SAEnC,MAAM,aAAa,QAAQ,cAAc,OAAO,KAAK,CAAC;QACxD;QACA,aAAa,UAAU;SACrB,IAAI,UAAU,YAAY,MAAM;SAChC,MAAM,eAAe;SACrB,YAAY,KAAK;QACnB;QACA,SAAS,UAAU;SACjB,MAAM,eAAe;SACrB,MAAM,OAAO,UAAU;SACvB,UAAU,UAAU;SACpB,YAAY,IAAI;SAChB,IAAI,SAAS,MAAM,UAAe,MAAM,KAAK;QAC/C;QACA,iBAAiB;SACf,UAAU,UAAU;SACpB,YAAY,IAAI;QAClB;QA5BF,UAAA;SA8BG,MAAM,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,oCAAI;UAAM,eAAA;UAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,wBAAD,CAAyB,CAAA;SAAO,CAAA;SAC9F,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAY,MAAM,SAAS,QAAQ;UAAM;SAAI,CAAA;SAC5C,SAAS,OAAO,IAAI,KAEjB,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UACE,KAAK;UACL,WAAA;UACA,WAAWD,oCAAI;UACf,cAAY,EAAE,YAAY;UAC1B,MAAM;UACN,OAAO,QAAQ;UACf,WAAW,UAAU;WAAE,WAAW;YAAE,IAAI,IAAI;YAAI,MAAM,MAAM,cAAc;WAAM,CAAC;UAAE;UACnF,UAAU,UAAU;WAAE,aAAa,MAAM,aAAa;UAAE;UACxD,YAAY,UAAU;WACpB,IAAI,MAAM,QAAQ,UAAU;YAC1B,WAAW,IAAI;YACf;WACF;WAEA,IAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,YAAY,CAAC,MAAM,YAAY,aAAa;YAC9E,MAAM,eAAe;YACrB,SAAc;WAChB;UACF;SACD,CAAA,IAED,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,oCAAI;UAAU,UAAA,IAAI;SAAW,CAAA;SACjD,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAWA,oCAAI;UAClC,UAAA,SAAS,OAAO,IAAI,KAEjB,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;WAAS,OAAO,EAAE,YAAY;WAAG,MAAK;WAAS,SAAS;WACtD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YACE,MAAK;YACL,WAAWJ,oCAAI;YACf,cAAY,EAAE,YAAY;YAC1B,UAAU,SAAS,QAAQ,QAAQ,KAAK,KAAK,MAAM;YACnD,eAAe;aAAE,SAAc;YAAE;YAEjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,wBAAD,EAAwB,MAAM,GAAK,CAAA;WAC7B,CAAA;UACD,CAAA,GACT,iBAAA,GAAA,kBAAA,IAAA,CAACF,sCAAAA,SAAD;WAAS,OAAO,EAAE,kBAAkB;WAAG,MAAK;WAAS,SAAS;WAC5D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YACE,MAAK;YACL,WAAWJ,oCAAI;YACf,cAAY,EAAE,kBAAkB;YAChC,UAAU,SAAS;YACnB,eAAe;aAAE,WAAW,IAAI;YAAE;YAElC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,wBAAD,EAAwB,MAAM,GAAK,CAAA;WAC7B,CAAA;UACD,CAAA,CACT,EAAA,CAAA,IAGF,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;WACE,iBAAA,GAAA,kBAAA,IAAA,CAACH,sCAAAA,SAAD;YAAS,OAAO,EAAE,cAAc;YAAG,MAAK;YAAS,SAAS;YAAK,UAAU,UAAU;YACjF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aACE,MAAK;aACL,WAAWJ,oCAAI;aACf,cAAY,EAAE,cAAc;aAC5B,OAAO,qBAAqB,EAAE,2BAA2B,IAAI,KAAA;aAC7D,UAAU,SAAS,QAAQ,UAAU;aACrC,eAAe;cAAE,QAAa,IAAI,IAAI,EAAE;aAAE;aAE1C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,4BAAD,CAA6B,CAAA;YACvB,CAAA;WACD,CAAA;WACT,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,SAAD;YAAS,OAAO,EAAE,gBAAgB;YAAG,MAAK;YAAS,SAAS;YAAK,UAAU,UAAU;YACnF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aACE,MAAK;aACL,WAAWJ,oCAAI;aACf,cAAY,EAAE,gBAAgB;aAC9B,OAAO,qBAAqB,EAAE,2BAA2B,IAAI,KAAA;aAC7D,UAAU,SAAS,QAAQ,UAAU;aACrC,eAAe;cAAE,QAAa,IAAI,IAAI,CAAC;aAAE;aAEzC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,8BAAD,CAA+B,CAAA;YACzB,CAAA;WACD,CAAA;WACT,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,SAAD;YAAS,OAAO,EAAE,YAAY;YAAG,MAAK;YAAS,SAAS;YAAK,UAAU,IAAI,SAAS;YAClF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aACE,MAAK;aACL,WAAWJ,oCAAI;aACf,cAAY,EAAE,YAAY;aAC1B,OAAO,IAAI,SAAS,OAAO,EAAE,wBAAwB,IAAI,KAAA;aACzD,UAAU,SAAS,QAAQ,IAAI,SAAS;aACxC,eAAe;cACb,IAAI,IAAI,SAAS,MAAM,WAAW;eAAE,IAAI,IAAI;eAAI,MAAM,IAAI,QAAQ;cAAG,CAAC;aACxE;aAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACQ,sCAAAA,uBAAD,EAAuB,MAAM,GAAK,CAAA;YAC5B,CAAA;WACD,CAAA;WACT,iBAAA,GAAA,kBAAA,IAAA,CAACJ,sCAAAA,SAAD;YAAS,OAAO,EAAE,cAAc;YAAG,MAAK;YAAS,SAAS;YACxD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aACE,MAAK;aACL,WAAWJ,oCAAI;aACf,cAAY,EAAE,cAAc;aAC5B,UAAU,SAAS;aACnB,eAAe;cACb,YAAiB,IAAI,IAAI,EAAE,MAAM,SAAS,GAAG,EAAE,oBAAoB,CAAC;aACtE;aAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACK,sCAAAA,wBAAD,EAAwB,MAAM,GAAK,CAAA;YAC7B,CAAA;WACD,CAAA;WACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;YAAM,WAAWL,oCAAI;YAAM,MAAK;YAAQ,cAAY,EAAE,kBAAkB;YAAxE,UAAA;aACE,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;cAAS,OAAO,EAAE,WAAW;cAAG,MAAK;cAAS,SAAS;cAAK,UAAU,gBAAgB,IAAI,SAAS;cACjG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;eACE,MAAK;eACL,WAAW,GAAGJ,oCAAI,KAAK,GAAGA,oCAAI;eAC9B,cAAY,EAAE,WAAW;eACzB,OAAO,eAAe,EAAE,2BAA2B,IAAI,IAAI,SAAS,OAAO,EAAE,uBAAuB,IAAI,KAAA;eACxG,UAAU,SAAS,QAAQ,gBAAgB,IAAI,SAAS;eACxD,eAAe;gBAAE,SAAc,KAAK,KAAK;eAAE;eAE3C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;gBAAM,WAAWA,oCAAI;gBAAK,eAAA;eAAa,CAAA;cACjC,CAAA;aACD,CAAA;aACT,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;cAAS,OAAO,EAAE,YAAY;cAAG,MAAK;cAAS,SAAS;cAAK,UAAU;cACrE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;eACE,MAAK;eACL,WAAW,GAAGJ,oCAAI,KAAK,GAAGA,oCAAI;eAC9B,cAAY,EAAE,YAAY;eAC1B,OAAO,eAAe,EAAE,2BAA2B,IAAI,KAAA;eACvD,UAAU,SAAS,QAAQ;eAC3B,eAAe;gBAAE,SAAc,KAAK,MAAM;eAAE;eAE5C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;gBAAM,WAAWA,oCAAI;gBAAK,eAAA;eAAa,CAAA;cACjC,CAAA;aACD,CAAA;aACT,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;cAAS,OAAO,EAAE,aAAa;cAAG,MAAK;cAAS,SAAS;cACvD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;eACE,MAAK;eACL,WAAW,GAAGJ,oCAAI,KAAK,GAAGA,oCAAI;eAC9B,cAAY,EAAE,aAAa;eAC3B,gBAAA;eACA,UAAU,SAAS,QAAQ;eAC3B,eAAe,CAGf;eAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;gBAAM,WAAWA,oCAAI;gBAAK,eAAA;eAAa,CAAA;cACjC,CAAA;aACD,CAAA;YACL;;UACN,EAAA,CAAA;SAEH,CAAA;QACH;OArLG,GAAA,IAAI,EAqLP,CACL;MACC,CAAA;MACH,SAAS,SAAS,KACjB,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,oCAAI;OAAc,sBAAmB;OACjD,UAAA,SAAS,KAAI,QACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;QAAiB,WAAWA,oCAAI;QAAK,aAAW,SAAS,UAAU,KAAK,KAAA;QAAxE,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,oCAAI;UAAM,eAAA;UAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,wBAAD,CAAyB,CAAA;SAAO,CAAA;SACvE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAY,MAAM,SAAS,UAAU;UAAM;SAAI,CAAA;SAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWD,oCAAI;UAAU,UAAA,IAAI;SAAW,CAAA;SAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAWA,oCAAI;UAClB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,SAAD;WAAS,OAAO,EAAE,cAAc;WAAG,MAAK;WAAS,SAAS;WAAK,UAAU,IAAI,SAAS;WACpF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YACE,MAAK;YACL,WAAW,GAAGJ,oCAAI,KAAK,GAAGA,oCAAI;YAC9B,cAAY,EAAE,cAAc;YAC5B,OAAO,IAAI,SAAS,OAAO,EAAE,0BAA0B,IAAI,KAAA;YAC3D,UAAU,SAAS,QAAQ,IAAI,SAAS,QAAQ;YAChD,eAAe;aAAE,cAAmB,GAAG;YAAE;YAEzC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,WAAWA,oCAAI;aAAK,eAAA;YAAa,CAAA;WACjC,CAAA;UACD,CAAA;SACN,CAAA;QACH;OAlBK,GAAA,IAAI,EAkBT,CACL;MACC,CAAA;KAEH;;GACF,CAAA;EAET;;EAGA,MAAM,aAAwC;GAC5C,KAAK;GACL,MAAM;GACN,OAAO;EACT;;EAGA,MAAM,gBAA2C;GAC/C,KAAKA,oCAAI;GACT,MAAMA,oCAAI;GACV,OAAOA,oCAAI;EACb;;EAGA,SAAS,WAAW,EAAE,MAAM,KAA8D;GACxF,IAAI,SAAS,MAAM,OAAO;GAC1B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAW,GAAGA,oCAAI,MAAM,GAAG,cAAc;IAAS,cAAY;IAApE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAWA,oCAAI;KAAK,eAAA;IAAa,CAAA,GACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAWA,oCAAI;KAAa,UAAA,EAAE,WAAW,KAAK;IAAQ,CAAA,CACxD;;EAEV;;;;;;;;;;;;;;ECr4BA,eAAsB,yBAAyB,WAAqC;GAClF,OAAO,UAAU,WAAW,cAAc;EAC5C;;EAGA,eAAsB,mBAAmB,WAAqC;GAC5E,OAAO,UAAU,WAAW,QAAQ;EACtC;EAEA,eAAe,UAAU,WAAmB,QAAkC;GAC5E,IAAI;IACF,MAAM,MAAM,MAAM,MAAM,sBAAsB;KAC5C,QAAQ;KACR,SAAS,EAAE,gBAAgB,mBAAmB;KAC9C,MAAM,KAAK,UAAU;MAAE;MAAW;KAAO,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,OAAO;IAEpB,QAAO,MADY,IAAI,KAAK,CAAC,CAAC,YAAY,IAAI,EAAA,EACjC,OAAO;GACtB,QAAQ;IAEN,OAAO;GACT;EACF;EAOA,IAAI;GACF,WAAW,+BAA+B;EAC5C,QAAQ,CAER;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECHA,SAAgB,aAAa,EAAE,eAAe,aAAa,QAAQ,MAAM,WAAW,WAAW,kBAAkB,QAAQ,KAAwB;GAE/I,MAAM,MAAM,aAAa;GACzB,MAAM,EAAE,YAAA,GAAWS,MAAAA,qBAAAA,CAAqB,YAAY,iBAAiB,YAAY,YAAY,GAAG,CAAC;GACjG,MAAM,QAAQ,cAAc,OAAO;GAEnC,MAAM,SAAS,YAA2B;IAIxC,MAAM,aAAa,IAAI,KAAK,QAAQ,gBAAgB,CAAC,EAAA,CAAG,KAAI,QAAO,IAAI,EAAE,CAAC;IAI1E,MAAM,OAAO,CAAC,GAAI,QAAQ,gBAAgB,CAAC,GAAI,GAAI,QAAQ,gBAAgB,CAAC,CAAE,CAAC,CAAC,KAAI,SAAQ;KAC1F,GAAG;KACH,MAAM,OAAO,IAAI,OAAO,KAAK,IAAI,QAAQ;IAC3C,EAAE;IAGF,MAAM,UAAgD,KAAK,SAAQ,QACjE,OAAO,IAAI,SAAS,YAAY,IAAI,SAAS,KAAK,CAAC;KAAE,MAAM,IAAI;KAAM,MAAM,WAAW,IAAI,IAAI,EAAE,IAAI,eAAe;IAAQ,CAAC,IAAI,CAAC,CACnI;IAGA,MAAM,QAAQ,IAAI,KAAK,KAAI,QACzB,YAAY,IAAI,IAAI,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS,CAC/D,CAAC;IACD,YAAY,IAAI,KAAK;KAAE,QAAQ;KAAM;IAAQ,CAAC;IAI9C,mBAAmB,EAAE,mBAAmB,CAAC;IAEzC,IAAI,cAAc,KAAA,GAAW,yBAA8B,SAAS;GACtE;GAEA,MAAM,SAAS,YAA2B;IACxC,MAAM,UAAU,YAAY,YAAY,GAAG,CAAC,CAAC;IAC7C,YAAY,IAAI,KAAK;KAAE,QAAQ;KAAO,SAAS,CAAC;IAAE,CAAC;IACnD,mBAAmB,KAAA,CAAS;IAC5B,IAAI;KAKF,IAAI,cAAc,KAAA,GAAW,MAAM,mBAAmB,SAAS;KAK/D,KAAK,MAAM,SAAS,SAAS;MAC3B,IAAI,MAAM,SAAS,SAAS,MAAM,OAAO;MACzC,IAAI,MAAM,SAAS,gBAAgB,cAAc,KAAA,GAAW,MAAM,UAAU,MAAM,IAAI;WACjF,MAAM,KAAK,MAAM,IAAI;KAC5B;IACF,QAAQ;KACN,OAAO,SAAS,EAAE,oBAAoB,CAAC;IACzC;GACF;GAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IACE,MAAK;IACL,WAAWC,iCAAI;IACf,cAAY,SAAS,EAAE,cAAc,IAAI,EAAE,cAAc;IACzD,gBAAc,UAAU,KAAA;IACxB,OAAO,SAAS,EAAE,cAAc,IAAI,KAAA;IACpC,eAAe;KACb,IAAI,QAAQ,OAAY;UACnB,OAAY;IACnB;IAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAWA,iCAAI;KAAQ,UAAA,SAAS,EAAE,cAAc,IAAI,EAAE,cAAc;IAAQ,CAAA;GAC5E,CAAA;EAEZ;;;;;;;;;;;;;;EC/FA,MAAM,MAAqB;GAAE,SAAS;GAAQ,YAAY;GAAU,gBAAgB;GAAiB,KAAK;GAAI,SAAS;GAAS,UAAU;EAAG;EAC7I,MAAM,QAAuB,EAAE,OAAO,0CAA0C;EAChF,MAAM,MAAqB;GAAE,OAAO;GAAyD,UAAU;GAAI,YAAY;EAAI;EAE3H,SAAgB,uBAAuB,EAAE,OAAO,KAAmC;GAKjF,MAAM,UAAA,GAJWC,MAAAA,qBAAAA,EACd,aAAa,MAAM,UAAU,QAAQ,SAChC,MAAM,YAAY,CAEJ,CAAC,CAAC,OAAO,aAAa;GAC5C,MAAM,MAAM,QAAyB,IAAI,EAAE,GAAG,IAAI,YAAY,QAAQ;GACtE,QAAA,GAAOC,MAAAA,cAAAA,CAAc,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,KAAK;GAAE,EAAE,IAAA,GAC/DA,MAAAA,cAAAA,CAAc,OAAO,EAAE,OAAO,IAAI,IAAA,GAChCA,MAAAA,cAAAA,CAAc,QAAQ,EAAE,OAAO,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAA,GAC9DA,MAAAA,cAAAA,CAAc,QAAQ,EAAE,OAAO,IAAI,GAAG,eAAe,QAAQ,CAC/D,IAAA,GACAA,MAAAA,cAAAA,CAAc,KAAK,EAAE,OAAO;IAAE,GAAG;IAAK,QAAQ;GAAE,EAAE,GAAG,GAAG,aAAa,CAAC,CACxE;EACF;;EAGA,MAAM,cAAsC;GAC1C,oBAAoB;GACpB,eAAe;EACjB;;;;EC9BA,SAAgB,aAAa,QAAiC;GAC5D,OAAO;EACT;;;;;;;;;;;ECiCA,SAAgB,sBAAsB,KAAoB,MAA+B;GAEvF,IAAI,OAAO,CAAC,aAAa,IAAI,gBAAyB;IACpD,MAAM,QAAS,YAA8D,IAAI,KAAK,SAAS;IAC/F,MAAW,IAAI,KAAK,OAAO,KAAK,KAAK;IACrC,KAAK,QAAQ,KAAK;GACpB,CAAC;GAED,IAAI,OAAO,CAAC,eAAe,IAAI,kBAA2B;IACxD,MAAM,QAAS,cAEZ,KAAK,EAAE,WAAW,KAAK,UAAU,CAAC;IACrC,MAAW,IAAI,KAAK,OAAO,KAAK,KAAK;IACrC,KAAK,QAAQ,KAAK;GACpB,CAAC;EACH;;;;;;EAOA,SAAgB,YACd,cACA,MACwB;GACxB,QAAQ,SAAiB;IACvB,MAAM,MAAM,aAAa,MAAM,IAAI,IAAI;IAIvC,IAAI,OAAO,IAAI,aAAa,YAAY,IAAI,SAAS,IAAI;SACpD,IAAI,SAAS,SAAS,IAAI;GACjC;EACF;;;;ECvCA,MAAM,kCAAkC;;EAGxC,MAAM,mBAAmB;;;;;;;;;;;;;EAczB,MAAa,mBAAmB;;;;;;;;;EAUhC,SAAS,YAAY,MAAqB,MAA6B;GAGrE,MAAM,eAAe,KAAK,IAAI,cAAc;GAC5C,IAAI,iBAAiB,KAAA,GAAW,OAAO,QAAQ,uBAAO,IAAI,MAAM,gDAAgD,CAAC;GACjH,OAAO,aAAa,KAAK,IAAI;EAC/B;;;;;;;;EASA,MAAa,SAAS;GAAC;GAAS;GAAU;GAAY;EAAc;;;;;;EAOpE,SAAgB,MAAM,KAA0B;GAC9C,IAAI,aAAa,IAAI,OAAO,SAAS,IAAI,YAAY,GAAG,iCAAiC;GAMzF,MAAM,UAAU,IAAI,OAAO,KAAK,EAAE;GASlC,sBAAsB,KAAK;IACzB,WAAW;IACX,OAAO;IACP,OAAO;IACP,UAAU,UAAU;KAIlB,IAAI,MAAM,OAAO,wBAAwB,IAAI,MAAM,SAAS;MAC1D,MAAM;MACN,IAAI;MACJ,OAAO;MACP,aAAa,QAAQ,cAAc;MACnC,QAAQ;MACR,eAAe,EAAE,MAAM;KACzB,GAAG,sBAAsB,CAAC;IAC5B;GACF,CAAC;GAKD,IAAI,MAAM,OAAO,iCAAiC,IAAI,MAAM,SAAS;IACnE,MAAM;IACN,IAAI;IACJ,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS,cAAiD;KACxD,MAAM,OAAO,IAAI,SAAS,MAAM,SAAS;KACzC,IAAI,SAAS,KAAA,GAAW,MAAM,IAAI,MAAM,wBAAwB,UAAU,oBAAoB;KAC9F,MAAM,eAAe,KAAK,IAAI,cAAc;KAC5C,IAAI,iBAAiB,KAAA,GAAW,MAAM,IAAI,MAAM,8CAA8C;KAC9F,OAAO;MACL,cAAc,QAAQ,WAAW,aAAa,YAAY,QAAiB,MAAM;MACjF,cAAc,aAAa,OAAO;MAClC,OAAO,SAAS,aAAa,KAAK,IAAI;MACtC,UAAU,YAAY,cAAc,IAAI;MACxC,SAAS,OAAO,SAAS;OAAE,aAAa,MAAM,IAAI,IAAI,CAAC,CAAC,OAAO,OAAO,IAAI;MAAE;KAC9E;IACF;GACF,GAAG,cAAc,CAAC;GAGlB,IAAI,MAAM,OAAO,kCAAkC,IAAI,MAAM,SAAS;IACpE,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,SAAS,cAAiD;KACxD,MAAM,OAAO,IAAI,SAAS,MAAM,SAAS;KACzC,IAAI,SAAS,KAAA,GAAW,MAAM,IAAI,MAAM,0BAA0B,UAAU,oBAAoB;KAChG,MAAM,eAAe,KAAK,IAAI,cAAc;KAC5C,IAAI,iBAAiB,KAAA,GAAW,MAAM,IAAI,MAAM,gDAAgD;KAChG,OAAO;MACL,cAAc,QAAQ,WAAW,aAAa,YAAY,QAAiB,MAAM;MACjF,cAAc,aAAa,OAAO;MAClC,OAAO,SAAS,aAAa,KAAK,IAAI;MAEtC,YAAY,SAAS,YAAY,MAAM,IAAI;MAC3C,WAAW,OAAO,SAAS;MAC3B,UAAU,YAAY,cAAc,IAAI;MACxC,SAAS,OAAO,SAAS;OAAE,aAAa,MAAM,IAAI,IAAI,CAAC,CAAC,OAAO,OAAO,IAAI;MAAE;MAG5E,mBAAmB,WAAW;OAC5B,aAAa,OAAO,IAAI,WAAW,WAAW,KAAA,IAAY,KAAA,IAAY,EAAE,OAAO,CAAC;MAClF;KACF;IACF;GACF,GAAG,YAAY,CAAC;GAGhB,IAAI,MAAM,OAAO,+BAA+B,IAAI,MAAM,SAAS;IACjE,MAAM;IACN,IAAI;IACJ,OAAO;IACP,UAAU;IACV,QAAQ;GACV,GAAG,YAAY,CAAC;EAClB"}
1
+ {"version":3,"file":"client.js","names":["useMemo","useState","useRef","useSyncExternalStore","useId","css","IconQueueOutlineMedium","IconChevronDownOutlineMedium","IconChevronUpOutlineMedium","Tooltip","IconTrashOutlineMedium","IconCheckOutlineMedium","IconCloseOutlineMedium","IconEditOutlineMedium","useSyncExternalStore","css","useSyncExternalStore","createElement"],"sources":["src/client/locales.ts","src/client/freeze-store.ts","src/client/steer-queue-dock.tsx","src/client/session-guard-bridge.ts","src/client/freeze-button.tsx","src/client/family-card.tsx","src/client/hide-enter-row.tsx","src/client/bridge-scope.ts","src/client/compat.ts","src/client/index.ts"],"sourcesContent":["/** `steer` client dictionaries (zh / en / ja / ko). */\n\n/** Dictionary namespace owned by this plugin. */\nexport const NS = 'steer'\n\n/** Simplified Chinese dictionary (the key-set source of truth). */\nexport const zh = {\n 'family.title': '输入流量',\n 'family.busyEnter': 'busy-Enter 行为(本插件接管)',\n 'family.desc': '普通回车在繁忙时进入排队(queue),不会打断当前回答;打断请用输入区的冻结/转向按钮。该行为由本插件自动接管,无需配置。',\n 'queue.count': '{n} 条排队消息',\n 'queue.edit': '编辑排队消息',\n 'queue.edit.unsupported': '包含非文本内容,暂不支持编辑',\n 'queue.save': '保存排队消息',\n 'queue.cancelEdit': '取消编辑',\n 'queue.remove': '删除排队消息',\n 'queue.removeFailed': '删除失败:这条消息可能已经开始发送。',\n 'queue.editFailed': '编辑失败:这条消息可能已经开始发送。',\n 'queue.editFailed.pulledBack': '编辑失败,内容已退回主输入框,请确认后重新发送。',\n 'steer.inflight': '{n} 条正在插入',\n 'steer.now': '打断并输入',\n 'steer.now.aria': '红色:打断当前动作并立即输入',\n 'steer.now.unsupported': '包含非文本内容,暂不支持打断',\n 'steer.nowFailed': '打断失败,请重试。',\n 'steer.next': '插话发送',\n 'steer.next.aria': '黄色:当前动作结束后插入输入',\n 'steer.nextFailed': '插话发送失败,请重试。',\n 'steer.later': '排队到下一轮',\n 'steer.later.aria': '绿色:排队,上一轮输入的动作都结束后再处理',\n 'steer.revoke': '收回排队',\n 'steer.revoke.aria': '绿色:撤销插入,收回排队(下一轮处理)',\n 'steer.revoke.unsupported': '包含非文本内容,暂不支持收回',\n 'steer.revokeFailed': '收回排队失败,请重试。',\n 'steer.moveUp': '上移',\n 'steer.moveDown': '下移',\n 'steer.reorder.unsupported': '包含非文本内容,暂不支持排序',\n 'steer.reorderFailed': '调整顺序失败,请重试。',\n 'steer.reorderStale': '队列已变化,本次排序已取消,请重试。',\n 'steer.dragReorder': '拖动调整顺序',\n 'steer.pullBack': '打回输入框编辑',\n 'steer.pullBack.unsupported': '包含非文本内容,暂不支持打回编辑',\n 'steer.pullBack.composerBusy': '主输入框已有内容,请先发送或清空后再打回',\n 'steer.pullBackFailed': '打回输入框失败,请重试。',\n 'steer.badge.now': '打断中',\n 'steer.badge.next': '插话中',\n 'steer.badge.later': '排队',\n 'steer.unavailable.running': '仅运行中可规划',\n 'steer.clear': '取消并清空',\n 'steer.clear.confirm': '确认清空?',\n 'steer.clear.cancel': '取消清空',\n 'steer.clear.aria': '取消当前执行并清空全部排队消息',\n 'steer.clearFailed': '取消并清空失败,请重试。',\n 'steer.freeze': '冻结追加',\n 'steer.resume': '恢复追加',\n 'steer.frozen': '已冻结:当前轮次完成后暂停,排队消息将在恢复后继续',\n 'steer.frozenInput': '已冻结:输入已暂停,恢复后继续',\n 'steer.frozenBadge': '已冻结',\n 'steer.freezeFailed': '冻结失败,请重试。',\n 'steer.resumeFailed': '恢复失败,请重试。',\n} satisfies Record<string, string>\n\n/** English dictionary (keys mirror zh). */\nexport const en: Record<keyof typeof zh, string> = {\n 'family.title': 'Input Traffic',\n 'family.busyEnter': 'busy-Enter behavior (managed by this plugin)',\n 'family.desc': 'Plain Enter queues while busy instead of interrupting; use the freeze/steer control in the composer to interrupt. Managed automatically — nothing to configure.',\n 'queue.count': '{n} queued messages',\n 'queue.edit': 'Edit queued message',\n 'queue.edit.unsupported': 'Contains non-text content; editing is unsupported',\n 'queue.save': 'Save queued message',\n 'queue.cancelEdit': 'Cancel edit',\n 'queue.remove': 'Remove queued message',\n 'queue.removeFailed': 'Remove failed: the message may have started sending.',\n 'queue.editFailed': 'Edit failed: the message may have started sending.',\n 'queue.editFailed.pulledBack': 'Edit failed; the content was moved back to the composer, please review and resend.',\n 'steer.inflight': '{n} inserting',\n 'steer.now': 'Interrupt and send',\n 'steer.now.aria': 'Red: interrupt the running action and send now',\n 'steer.now.unsupported': 'Contains non-text content; interrupting is unsupported',\n 'steer.nowFailed': 'Interrupt failed, please retry.',\n 'steer.next': 'Send after action',\n 'steer.next.aria': 'Yellow: insert after the current action finishes',\n 'steer.nextFailed': 'Steering failed, please retry.',\n 'steer.later': 'Queue for next turn',\n 'steer.later.aria': 'Green: queue; processed after all previously steered actions finish',\n 'steer.revoke': 'Pull back to queue',\n 'steer.revoke.aria': 'Green: revoke the insertion and queue for the next turn',\n 'steer.revoke.unsupported': 'Contains non-text content; revoking is unsupported',\n 'steer.revokeFailed': 'Revoke failed, please retry.',\n 'steer.moveUp': 'Move up',\n 'steer.moveDown': 'Move down',\n 'steer.reorder.unsupported': 'Contains non-text content; reordering is unsupported',\n 'steer.reorderFailed': 'Reorder failed, please retry.',\n 'steer.reorderStale': 'The queue changed; this reorder was cancelled, please retry.',\n 'steer.dragReorder': 'Drag to reorder',\n 'steer.pullBack': 'Edit in composer',\n 'steer.pullBack.unsupported': 'Contains non-text content; pulling back is unsupported',\n 'steer.pullBack.composerBusy': 'The composer already has content; send or clear it first',\n 'steer.pullBackFailed': 'Pull back failed, please retry.',\n 'steer.badge.now': 'interrupting',\n 'steer.badge.next': 'steering',\n 'steer.badge.later': 'queued',\n 'steer.unavailable.running': 'Planning requires a running session',\n 'steer.clear': 'Cancel and clear',\n 'steer.clear.confirm': 'Confirm clear?',\n 'steer.clear.cancel': 'Cancel clearing',\n 'steer.clear.aria': 'Cancel the current run and clear all queued messages',\n 'steer.clearFailed': 'Cancel and clear failed, please retry.',\n 'steer.freeze': 'Freeze & append',\n 'steer.resume': 'Resume & append',\n 'steer.frozen': 'Frozen: the current turn finishes, then the queue pauses until resumed',\n 'steer.frozenInput': 'Frozen: input paused, resume to continue',\n 'steer.frozenBadge': 'frozen',\n 'steer.freezeFailed': 'Freeze failed, please retry.',\n 'steer.resumeFailed': 'Resume failed, please retry.',\n}\n\n/** Japanese dictionary (keys mirror zh). */\nexport const ja: Record<keyof typeof zh, string> = {\n 'family.title': '入力トラフィック',\n 'family.busyEnter': 'busy-Enter 動作(本プラグインが管理)',\n 'family.desc': '通常の Enter はビジー時にキューへ入ります(割り込みなし)。割り込みは入力欄の凍結/ステアで。自動管理のため設定不要。',\n 'queue.count': '{n} 件のキューイング済みメッセージ',\n 'queue.edit': 'キューイング済みメッセージを編集',\n 'queue.edit.unsupported': '非テキストコンテンツが含まれており、編集はサポートされていません',\n 'queue.save': 'キューイング済みメッセージを保存',\n 'queue.cancelEdit': '編集をキャンセル',\n 'queue.remove': 'キューイング済みメッセージを削除',\n 'queue.removeFailed': '削除失敗:メッセージの送信が既に開始されている可能性があります。',\n 'queue.editFailed': '編集失敗:メッセージの送信が既に開始されている可能性があります。',\n 'queue.editFailed.pulledBack': '編集失敗。コンテンツはコンポーザに戻されました。確認後再送信してください。',\n 'steer.inflight': '{n} 件挿入中',\n 'steer.now': '中断して送信',\n 'steer.now.aria': '赤:実行中のアクションを中断して即座に送信',\n 'steer.now.unsupported': '非テキストコンテンツが含まれており、中断はサポートされていません',\n 'steer.nowFailed': '中断失敗。再試行してください。',\n 'steer.next': 'アクション後に送信',\n 'steer.next.aria': '黄:現在のアクション完了後に挿入',\n 'steer.nextFailed': 'ステア失敗。再試行してください。',\n 'steer.later': '次のターンまでキューイング',\n 'steer.later.aria': '緑:キューイング。以前のステア済みアクションがすべて完了してから処理',\n 'steer.revoke': 'キューに戻す',\n 'steer.revoke.aria': '緑:挿入を取り消し、次のターンまでキューイング',\n 'steer.revoke.unsupported': '非テキストコンテンツが含まれており、取り消しはサポートされていません',\n 'steer.revokeFailed': '取り消し失敗。再試行してください。',\n 'steer.moveUp': '上へ移動',\n 'steer.moveDown': '下へ移動',\n 'steer.reorder.unsupported': '非テキストコンテンツが含まれており、並べ替えはサポートされていません',\n 'steer.reorderFailed': '並べ替え失敗。再試行してください。',\n 'steer.reorderStale': 'キューが変更されました。本次の並べ替えはキャンセルされました。再試行してください。',\n 'steer.dragReorder': 'ドラッグして並べ替え',\n 'steer.pullBack': 'コンポーザに送り直して編集',\n 'steer.pullBack.unsupported': '非テキストコンテンツが含まれており、送り直しはサポートされていません',\n 'steer.pullBack.composerBusy': 'コンポーザに既にコンテンツがあります。送信またはクリアしてください',\n 'steer.pullBackFailed': '送り直し失敗。再試行してください。',\n 'steer.badge.now': '中断中',\n 'steer.badge.next': 'ステア中',\n 'steer.badge.later': 'キューイング済み',\n 'steer.unavailable.running': '実行中のみプランニング可能',\n 'steer.clear': '取り消して全消去',\n 'steer.clear.confirm': '消去を確認?',\n 'steer.clear.cancel': '消去をキャンセル',\n 'steer.clear.aria': '実行を停止し、すべてのキューイング済みメッセージを消去',\n 'steer.clearFailed': '取り消して全消去失敗。再試行してください。',\n 'steer.freeze': '凍結して追加',\n 'steer.resume': '再開して追加',\n 'steer.frozen': '凍結中:現在のターン完了後一時停止、再開後にキューが継続',\n 'steer.frozenInput': '凍結中:入力一時停止、再開後に継続',\n 'steer.frozenBadge': '凍結済み',\n 'steer.freezeFailed': '凍結失敗。再試行してください。',\n 'steer.resumeFailed': '再開失敗。再試行してください。',\n}\n\n/** Korean dictionary (keys mirror zh). */\nexport const ko: Record<keyof typeof zh, string> = {\n 'family.title': '입력 트래픽',\n 'family.busyEnter': 'busy-Enter 동작(이 플러그인이 관리)',\n 'family.desc': '일반 Enter는 사용 중일 때 큐에 들어가 현재 답변을 끊지 않습니다. 중단이 필요하면 입력 창의 동결/스티어 버튼을 사용하세요. 자동 관리되므로 설정이 없습니다.',\n 'queue.count': '{n}개 대기열 메시지',\n 'queue.edit': '대기열 메시지 편집',\n 'queue.edit.unsupported': '비텍스트 콘텐츠가 포함되어 있어 편집이 지원되지 않습니다',\n 'queue.save': '대기열 메시지 저장',\n 'queue.cancelEdit': '편집 취소',\n 'queue.remove': '대기열 메시지 삭제',\n 'queue.removeFailed': '삭제 실패: 메시지 전송이 이미 시작되었을 수 있습니다.',\n 'queue.editFailed': '편집 실패: 메시지 전송이 이미 시작되었을 수 있습니다.',\n 'queue.editFailed.pulledBack': '편집 실패. 콘텐츠가 컴포저로 돌아갔습니다. 확인 후 다시 전송하세요.',\n 'steer.inflight': '{n}개 삽입 중',\n 'steer.now': '중단 후 전송',\n 'steer.now.aria': '빨간색: 실행 중인 액션을 중단하고 즉시 전송',\n 'steer.now.unsupported': '비텍스트 콘텐츠가 포함되어 있어 중단이 지원되지 않습니다',\n 'steer.nowFailed': '중단 실패. 다시 시도하세요.',\n 'steer.next': '액션 후 전송',\n 'steer.next.aria': '노란색: 현재 액션 완료 후 삽입',\n 'steer.nextFailed': '스티어 실패. 다시 시도하세요.',\n 'steer.later': '다음 턴까지 대기',\n 'steer.later.aria': '초록색: 대기. 이전 스티어된 액션이 모두 완료된 후 처리',\n 'steer.revoke': '대기열로 되돌리기',\n 'steer.revoke.aria': '초록색: 삽입 취소, 다음 턴까지 대기',\n 'steer.revoke.unsupported': '비텍스트 콘텐츠가 포함되어 있어 취소가 지원되지 않습니다',\n 'steer.revokeFailed': '취소 실패. 다시 시도하세요.',\n 'steer.moveUp': '위로 이동',\n 'steer.moveDown': '아래로 이동',\n 'steer.reorder.unsupported': '비텍스트 콘텐츠가 포함되어 있어 재정렬이 지원되지 않습니다',\n 'steer.reorderFailed': '재정렬 실패. 다시 시도하세요.',\n 'steer.reorderStale': '대기열이 변경되었습니다. 이번 재정렬이 취소되었습니다. 다시 시도하세요.',\n 'steer.dragReorder': '드래그로 재정렬',\n 'steer.pullBack': '컴포저로 되돌려 편집',\n 'steer.pullBack.unsupported': '비텍스트 콘텐츠가 포함되어 있어 되돌리기가 지원되지 않습니다',\n 'steer.pullBack.composerBusy': '컴포저에 이미 콘텐츠가 있습니다. 먼저 전송하거나 비우세요',\n 'steer.pullBackFailed': '되돌리기 실패. 다시 시도하세요.',\n 'steer.badge.now': '중단 중',\n 'steer.badge.next': '스티어 중',\n 'steer.badge.later': '대기열',\n 'steer.unavailable.running': '실행 중에만 계획 가능',\n 'steer.clear': '취소 후 전체 지우기',\n 'steer.clear.confirm': '지우기 확인?',\n 'steer.clear.cancel': '지우기 취소',\n 'steer.clear.aria': '현재 실행을 중지하고 모든 대기열 메시지를 지우기',\n 'steer.clearFailed': '취소 후 전체 지우기 실패. 다시 시도하세요.',\n 'steer.freeze': '동결 후 추가',\n 'steer.resume': '재개 후 추가',\n 'steer.frozen': '동결됨: 현재 턴 완료 후 일시정지, 재개 시 대기열 계속',\n 'steer.frozenInput': '동결됨: 입력 일시정지, 재개 시 계속',\n 'steer.frozenBadge': '동결됨',\n 'steer.freezeFailed': '동결 실패. 다시 시도하세요.',\n 'steer.resumeFailed': '재개 실패. 다시 시도하세요.',\n}\n\n/** French dictionary (keys mirror zh). */\nexport const fr: Record<keyof typeof zh, string> = {\n 'family.title': 'Trafic d\\'entr\\u00e9e',\n 'family.busyEnter': 'Comportement busy-Enter (g\\u00e9r\\u00e9 par ce plugin)',\n 'family.desc': 'Entr\\u00e9e simple met en file d\\'attente quand occup\\u00e9 sans interrompre ; utilisez le bouton geler/rediriger du composeur pour interrompre. G\\u00e9r\\u00e9 automatiquement \\u2014 rien \\u00e0 configurer.',\n 'queue.count': '{n} messages en file d\\'attente',\n 'queue.edit': 'Modifier le message en file d\\'attente',\n 'queue.edit.unsupported': 'Contient du contenu non textuel ; modification non prise en charge',\n 'queue.save': 'Enregistrer le message en file d\\'attente',\n 'queue.cancelEdit': 'Annuler la modification',\n 'queue.remove': 'Supprimer le message en file d\\'attente',\n 'queue.removeFailed': '\\u00c9chec de la suppression : le message a peut-\\u00eatre commenc\\u00e9 \\u00e0 \\u00eatre envoy\\u00e9.',\n 'queue.editFailed': '\\u00c9chec de la modification : le message a peut-\\u00eatre commenc\\u00e9 \\u00e0 \\u00eatre envoy\\u00e9.',\n 'queue.editFailed.pulledBack': '\\u00c9chec de la modification ; le contenu a \\u00e9t\\u00e9 renvoy\\u00e9 au composeur, veuillez v\\u00e9rifier et renvoyer.',\n 'steer.inflight': '{n} en cours d\\'insertion',\n 'steer.now': 'Interrompre et envoyer',\n 'steer.now.aria': 'Rouge : interrompre l\\'action en cours et envoyer imm\\u00e9diatement',\n 'steer.now.unsupported': 'Contient du contenu non textuel ; interruption non prise en charge',\n 'steer.nowFailed': '\\u00c9chec de l\\'interruption, veuillez r\\u00e9essayer.',\n 'steer.next': 'Envoyer apr\\u00e8s l\\'action',\n 'steer.next.aria': 'Jaune : ins\\u00e9rer apr\\u00e8s la fin de l\\'action en cours',\n 'steer.nextFailed': '\\u00c9chec de la redirection, veuillez r\\u00e9essayer.',\n 'steer.later': 'Mettre en file pour le prochain tour',\n 'steer.later.aria': 'Vert : mettre en file ; trait\\u00e9 apr\\u00e8s la fin de toutes les actions redirig\\u00e9es',\n 'steer.revoke': 'Rappeler en file d\\'attente',\n 'steer.revoke.aria': 'Vert : annuler l\\'insertion et mettre en file pour le prochain tour',\n 'steer.revoke.unsupported': 'Contient du contenu non textuel ; rappel non pris en charge',\n 'steer.revokeFailed': '\\u00c9chec du rappel, veuillez r\\u00e9essayer.',\n 'steer.moveUp': 'D\\u00e9placer vers le haut',\n 'steer.moveDown': 'D\\u00e9placer vers le bas',\n 'steer.reorder.unsupported': 'Contient du contenu non textuel ; r\\u00e9ordonnancement non pris en charge',\n 'steer.reorderFailed': '\\u00c9chec du r\\u00e9ordonnancement, veuillez r\\u00e9essayer.',\n 'steer.reorderStale': 'La file a chang\\u00e9 ; ce r\\u00e9ordonnancement a \\u00e9t\\u00e9 annul\\u00e9, veuillez r\\u00e9essayer.',\n 'steer.dragReorder': 'Glisser pour r\\u00e9ordonner',\n 'steer.pullBack': 'Renvoyer au composeur pour modification',\n 'steer.pullBack.unsupported': 'Contient du contenu non textuel ; renvoi non pris en charge',\n 'steer.pullBack.composerBusy': 'Le composeur contient d\\u00e9j\\u00e0 du contenu ; envoyez ou effacez d\\'abord',\n 'steer.pullBackFailed': '\\u00c9chec du renvoi au composeur, veuillez r\\u00e9essayer.',\n 'steer.badge.now': 'interruption',\n 'steer.badge.next': 'redirection',\n 'steer.badge.later': 'en file',\n 'steer.unavailable.running': 'Planification possible uniquement en cours d\\'ex\\u00e9cution',\n 'steer.clear': 'Annuler et tout effacer',\n 'steer.clear.confirm': 'Confirmer l\\'effacement ?',\n 'steer.clear.cancel': 'Annuler l\\'effacement',\n 'steer.clear.aria': 'Annuler l\\'ex\\u00e9cution en cours et effacer tous les messages en file d\\'attente',\n 'steer.clearFailed': '\\u00c9chec de l\\'annulation et de l\\'effacement, veuillez r\\u00e9essayer.',\n 'steer.freeze': 'Geler et ajouter',\n 'steer.resume': 'Reprendre et ajouter',\n 'steer.frozen': 'G\\u00e9l\\u00e9 : le tour en cours se termine puis la file est suspendue jusqu\\'\\u00e0 la reprise',\n 'steer.frozenInput': 'G\\u00e9l\\u00e9 : entr\\u00e9e suspendue, reprendre pour continuer',\n 'steer.frozenBadge': 'gel\\u00e9',\n 'steer.freezeFailed': '\\u00c9chec du gel, veuillez r\\u00e9essayer.',\n 'steer.resumeFailed': '\\u00c9chec de la reprise, veuillez r\\u00e9essayer.',\n}\n\n/** German dictionary (keys mirror zh). */\nexport const de: Record<keyof typeof zh, string> = {\n 'family.title': 'Eingabeverkehr',\n 'family.busyEnter': 'Busy-Enter-Verhalten (von diesem Plugin verwaltet)',\n 'family.desc': 'Einfaches Enter reiht bei Besch\\u00e4ftigung ein, statt zu unterbrechen; zum Unterbrechen die Einfrieren/Steuern-Schaltfl\\u00e4che im Composer verwenden. Automatisch verwaltet \\u2014 keine Konfiguration n\\u00f6tig.',\n 'queue.count': '{n} Nachrichten in der Warteschlange',\n 'queue.edit': 'Warteschlangennachricht bearbeiten',\n 'queue.edit.unsupported': 'Enth\\u00e4lt Nicht-Text-Inhalt; Bearbeiten nicht unterst\\u00fctzt',\n 'queue.save': 'Warteschlangennachricht speichern',\n 'queue.cancelEdit': 'Bearbeitung abbrechen',\n 'queue.remove': 'Warteschlangennachricht entfernen',\n 'queue.removeFailed': 'Entfernen fehlgeschlagen: Die Nachricht wurde m\\u00f6glicherweise bereits gesendet.',\n 'queue.editFailed': 'Bearbeiten fehlgeschlagen: Die Nachricht wurde m\\u00f6glicherweise bereits gesendet.',\n 'queue.editFailed.pulledBack': 'Bearbeiten fehlgeschlagen; Inhalt wurde in den Composer zur\\u00fcckverschoben, bitte pr\\u00fcfen und erneut senden.',\n 'steer.inflight': '{n} werden eingef\\u00fcgt',\n 'steer.now': 'Unterbrechen und senden',\n 'steer.now.aria': 'Rot: Laufende Aktion unterbrechen und sofort senden',\n 'steer.now.unsupported': 'Enth\\u00e4lt Nicht-Text-Inhalt; Unterbrechen nicht unterst\\u00fctzt',\n 'steer.nowFailed': 'Unterbrechen fehlgeschlagen, bitte erneut versuchen.',\n 'steer.next': 'Nach Aktion senden',\n 'steer.next.aria': 'Gelb: Nach Abschluss der aktuellen Aktion einf\\u00fcgen',\n 'steer.nextFailed': 'Steuerung fehlgeschlagen, bitte erneut versuchen.',\n 'steer.later': 'F\\u00fcr n\\u00e4chste Runde einreihen',\n 'steer.later.aria': 'Gr\\u00fcn: Einreihen; Verarbeitung nach Abschluss aller zuvor gesteuerten Aktionen',\n 'steer.revoke': 'Zur\\u00fcck in Warteschlange',\n 'steer.revoke.aria': 'Gr\\u00fcn: Einf\\u00fcgung widerrufen und f\\u00fcr n\\u00e4chste Runde einreihen',\n 'steer.revoke.unsupported': 'Enth\\u00e4lt Nicht-Text-Inhalt; Widerrufen nicht unterst\\u00fctzt',\n 'steer.revokeFailed': 'Widerrufen fehlgeschlagen, bitte erneut versuchen.',\n 'steer.moveUp': 'Nach oben',\n 'steer.moveDown': 'Nach unten',\n 'steer.reorder.unsupported': 'Enth\\u00e4lt Nicht-Text-Inhalt; Umsortieren nicht unterst\\u00fctzt',\n 'steer.reorderFailed': 'Umsortieren fehlgeschlagen, bitte erneut versuchen.',\n 'steer.reorderStale': 'Warteschlange ge\\u00e4ndert; Umsortierung abgebrochen, bitte erneut versuchen.',\n 'steer.dragReorder': 'Ziehen zum Umsortieren',\n 'steer.pullBack': 'In Composer zur\\u00fcckholen',\n 'steer.pullBack.unsupported': 'Enth\\u00e4lt Nicht-Text-Inhalt; Zur\\u00fcckholen nicht unterst\\u00fctzt',\n 'steer.pullBack.composerBusy': 'Composer enth\\u00e4lt bereits Inhalt; zuerst senden oder leeren',\n 'steer.pullBackFailed': 'Zur\\u00fcckholen fehlgeschlagen, bitte erneut versuchen.',\n 'steer.badge.now': 'unterbricht',\n 'steer.badge.next': 'steuert',\n 'steer.badge.later': 'eingereiht',\n 'steer.unavailable.running': 'Planung nur w\\u00e4hrend der Ausf\\u00fchrung m\\u00f6glich',\n 'steer.clear': 'Abbrechen und leeren',\n 'steer.clear.confirm': 'Leeren best\\u00e4tigen?',\n 'steer.clear.cancel': 'Leeren abbrechen',\n 'steer.clear.aria': 'Aktuelle Ausf\\u00fchrung abbrechen und alle Warteschlangennachrichten leeren',\n 'steer.clearFailed': 'Abbrechen und Leeren fehlgeschlagen, bitte erneut versuchen.',\n 'steer.freeze': 'Einfrieren & anh\\u00e4ngen',\n 'steer.resume': 'Fortsetzen & anh\\u00e4ngen',\n 'steer.frozen': 'Eingefroren: Aktuelle Runde endet, dann pausiert die Warteschlange bis zur Fortsetzung',\n 'steer.frozenInput': 'Eingefroren: Eingabe pausiert, fortsetzen um weiterzumachen',\n 'steer.frozenBadge': 'eingefroren',\n 'steer.freezeFailed': 'Einfrieren fehlgeschlagen, bitte erneut versuchen.',\n 'steer.resumeFailed': 'Fortsetzen fehlgeschlagen, bitte erneut versuchen.',\n}\n\n/** Italian dictionary (keys mirror zh). */\nexport const it: Record<keyof typeof zh, string> = {\n 'family.title': 'Traffico di input',\n 'family.busyEnter': 'Comportamento busy-Enter (gestito da questo plugin)',\n 'family.desc': 'Invio semplice accoda quando occupato senza interrompere; usa il pulsante congela/devia nel compositore per interrompere. Gestito automaticamente \\u2014 nessuna configurazione necessaria.',\n 'queue.count': '{n} messaggi in coda',\n 'queue.edit': 'Modifica messaggio in coda',\n 'queue.edit.unsupported': 'Contiene contenuto non testuale; modifica non supportata',\n 'queue.save': 'Salva messaggio in coda',\n 'queue.cancelEdit': 'Annulla modifica',\n 'queue.remove': 'Rimuovi messaggio in coda',\n 'queue.removeFailed': 'Rimozione fallita: il messaggio potrebbe aver iniziato l\\'invio.',\n 'queue.editFailed': 'Modifica fallita: il messaggio potrebbe aver iniziato l\\'invio.',\n 'queue.editFailed.pulledBack': 'Modifica fallita; il contenuto \\u00e8 stato riportato nel compositore, verificare e reinviare.',\n 'steer.inflight': '{n} in inserimento',\n 'steer.now': 'Interrompi e invia',\n 'steer.now.aria': 'Rosso: interrompi l\\'azione in corso e invia immediatamente',\n 'steer.now.unsupported': 'Contiene contenuto non testuale; interruzione non supportata',\n 'steer.nowFailed': 'Interruzione fallita, riprovare.',\n 'steer.next': 'Invia dopo l\\'azione',\n 'steer.next.aria': 'Giallo: inserisci al termine dell\\'azione corrente',\n 'steer.nextFailed': 'Deviazione fallita, riprovare.',\n 'steer.later': 'Accoda per il prossimo turno',\n 'steer.later.aria': 'Verde: accoda; elaborato al termine di tutte le azioni deviate precedenti',\n 'steer.revoke': 'Riporta in coda',\n 'steer.revoke.aria': 'Verde: revoca l\\'inserimento e accoda per il prossimo turno',\n 'steer.revoke.unsupported': 'Contiene contenuto non testuale; revoca non supportata',\n 'steer.revokeFailed': 'Revoca fallita, riprovare.',\n 'steer.moveUp': 'Sposta su',\n 'steer.moveDown': 'Sposta gi\\u00f9',\n 'steer.reorder.unsupported': 'Contiene contenuto non testuale; riordino non supportato',\n 'steer.reorderFailed': 'Riordino fallito, riprovare.',\n 'steer.reorderStale': 'La coda \\u00e8 cambiata; riordino annullato, riprovare.',\n 'steer.dragReorder': 'Trascina per riordinare',\n 'steer.pullBack': 'Riporta nel compositore per modifica',\n 'steer.pullBack.unsupported': 'Contiene contenuto non testuale; riporto non supportato',\n 'steer.pullBack.composerBusy': 'Il compositore contiene gi\\u00e0 contenuto; inviare o svuotare prima',\n 'steer.pullBackFailed': 'Riporto nel compositore fallito, riprovare.',\n 'steer.badge.now': 'interruzione',\n 'steer.badge.next': 'deviazione',\n 'steer.badge.later': 'in coda',\n 'steer.unavailable.running': 'Pianificazione disponibile solo durante l\\'esecuzione',\n 'steer.clear': 'Annulla e svuota',\n 'steer.clear.confirm': 'Confermare lo svuotamento?',\n 'steer.clear.cancel': 'Annulla svuotamento',\n 'steer.clear.aria': 'Annulla l\\'esecuzione corrente e svuota tutti i messaggi in coda',\n 'steer.clearFailed': 'Annullamento e svuotamento falliti, riprovare.',\n 'steer.freeze': 'Congela e aggiungi',\n 'steer.resume': 'Riprendi e aggiungi',\n 'steer.frozen': 'Congelato: il turno corrente termina, poi la coda si sospende fino alla ripresa',\n 'steer.frozenInput': 'Congelato: input sospeso, riprendere per continuare',\n 'steer.frozenBadge': 'congelato',\n 'steer.freezeFailed': 'Congelamento fallito, riprovare.',\n 'steer.resumeFailed': 'Ripresa fallita, riprovare.',\n}\n\n/** Russian dictionary (keys mirror zh). */\nexport const ru: Record<keyof typeof zh, string> = {\n 'family.title': '\\u0412\\u0445\\u043e\\u0434\\u044f\\u0449\\u0438\\u0439 \\u043f\\u043e\\u0442\\u043e\\u043a',\n 'family.busyEnter': '\\u041f\\u043e\\u0432\\u0435\\u0434\\u0435\\u043d\\u0438\\u0435 busy-Enter (\\u0443\\u043f\\u0440\\u0430\\u0432\\u043b\\u044f\\u0435\\u0442\\u0441\\u044f \\u044d\\u0442\\u0438\\u043c \\u043f\\u043b\\u0430\\u0433\\u0438\\u043d\\u043e\\u043c)',\n 'family.desc': '\\u041e\\u0431\\u044b\\u0447\\u043d\\u044b\\u0439 Enter \\u0441\\u0442\\u0430\\u0432\\u0438\\u0442 \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c \\u043f\\u0440\\u0438 \\u0437\\u0430\\u043d\\u044f\\u0442\\u043e\\u0441\\u0442\\u0438, \\u043d\\u0435 \\u043f\\u0440\\u0435\\u0440\\u044b\\u0432\\u0430\\u044f; \\u0434\\u043b\\u044f \\u043f\\u0440\\u0435\\u0440\\u044b\\u0432\\u0430\\u043d\\u0438\\u044f \\u0438\\u0441\\u043f\\u043e\\u043b\\u044c\\u0437\\u0443\\u0439\\u0442\\u0435 \\u043a\\u043d\\u043e\\u043f\\u043a\\u0443 \\u0437\\u0430\\u043c\\u043e\\u0440\\u043e\\u0437\\u043a\\u0438/\\u043f\\u0435\\u0440\\u0435\\u043d\\u0430\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u044f \\u0432 \\u043f\\u043e\\u043b\\u0435 \\u0432\\u0432\\u043e\\u0434\\u0430. \\u0423\\u043f\\u0440\\u0430\\u0432\\u043b\\u044f\\u0435\\u0442\\u0441\\u044f \\u0430\\u0432\\u0442\\u043e\\u043c\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0438 \\u2014 \\u043d\\u0430\\u0441\\u0442\\u0440\\u043e\\u0439\\u043a\\u0430 \\u043d\\u0435 \\u0442\\u0440\\u0435\\u0431\\u0443\\u0435\\u0442\\u0441\\u044f.',\n 'queue.count': '{n} \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0439 \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'queue.edit': '\\u0420\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435 \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'queue.edit.unsupported': '\\u0421\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043d\\u0435\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0442\\u0435\\u043d\\u0442; \\u0440\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435 \\u043d\\u0435 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f',\n 'queue.save': '\\u0421\\u043e\\u0445\\u0440\\u0430\\u043d\\u0438\\u0442\\u044c \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435 \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'queue.cancelEdit': '\\u041e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u0440\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435',\n 'queue.remove': '\\u0423\\u0434\\u0430\\u043b\\u0438\\u0442\\u044c \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0437 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'queue.removeFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u0443\\u0434\\u0430\\u043b\\u0438\\u0442\\u044c: \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435, \\u0432\\u043e\\u0437\\u043c\\u043e\\u0436\\u043d\\u043e, \\u0443\\u0436\\u0435 \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u043b\\u044f\\u0435\\u0442\\u0441\\u044f.',\n 'queue.editFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043e\\u0442\\u0440\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c: \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u0435, \\u0432\\u043e\\u0437\\u043c\\u043e\\u0436\\u043d\\u043e, \\u0443\\u0436\\u0435 \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u043b\\u044f\\u0435\\u0442\\u0441\\u044f.',\n 'queue.editFailed.pulledBack': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043e\\u0442\\u0440\\u0435\\u0434\\u0430\\u043a\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c; \\u0441\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u043c\\u043e\\u0435 \\u0432\\u043e\\u0437\\u0432\\u0440\\u0430\\u0449\\u0435\\u043d\\u043e \\u0432 \\u043f\\u043e\\u043b\\u0435 \\u0432\\u0432\\u043e\\u0434\\u0430, \\u043f\\u0440\\u043e\\u0432\\u0435\\u0440\\u044c\\u0442\\u0435 \\u0438 \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u044c\\u0442\\u0435 \\u0441\\u043d\\u043e\\u0432\\u0430.',\n 'steer.inflight': '{n} \\u0432\\u0441\\u0442\\u0430\\u0432\\u043b\\u044f\\u0435\\u0442\\u0441\\u044f',\n 'steer.now': '\\u041f\\u0440\\u0435\\u0440\\u0432\\u0430\\u0442\\u044c \\u0438 \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u0438\\u0442\\u044c',\n 'steer.now.aria': '\\u041a\\u0440\\u0430\\u0441\\u043d\\u044b\\u0439: \\u043f\\u0440\\u0435\\u0440\\u0432\\u0430\\u0442\\u044c \\u0442\\u0435\\u043a\\u0443\\u0449\\u0435\\u0435 \\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u0435 \\u0438 \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u0438\\u0442\\u044c \\u043d\\u0435\\u043c\\u0435\\u0434\\u043b\\u0435\\u043d\\u043d\\u043e',\n 'steer.now.unsupported': '\\u0421\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043d\\u0435\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0442\\u0435\\u043d\\u0442; \\u043f\\u0440\\u0435\\u0440\\u044b\\u0432\\u0430\\u043d\\u0438\\u0435 \\u043d\\u0435 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f',\n 'steer.nowFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043f\\u0440\\u0435\\u0440\\u0432\\u0430\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.next': '\\u041e\\u0442\\u043f\\u0440\\u0430\\u0432\\u0438\\u0442\\u044c \\u043f\\u043e\\u0441\\u043b\\u0435 \\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u044f',\n 'steer.next.aria': '\\u0416\\u0451\\u043b\\u0442\\u044b\\u0439: \\u0432\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044c \\u043f\\u043e\\u0441\\u043b\\u0435 \\u0437\\u0430\\u0432\\u0435\\u0440\\u0448\\u0435\\u043d\\u0438\\u044f \\u0442\\u0435\\u043a\\u0443\\u0449\\u0435\\u0433\\u043e \\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u044f',\n 'steer.nextFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043f\\u0435\\u0440\\u0435\\u043d\\u0430\\u043f\\u0440\\u0430\\u0432\\u0438\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.later': '\\u0412 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c \\u043d\\u0430 \\u0441\\u043b\\u0435\\u0434\\u0443\\u044e\\u0449\\u0438\\u0439 \\u0445\\u043e\\u0434',\n 'steer.later.aria': '\\u0417\\u0435\\u043b\\u0451\\u043d\\u044b\\u0439: \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c; \\u043e\\u0431\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0430 \\u043f\\u043e\\u0441\\u043b\\u0435 \\u0437\\u0430\\u0432\\u0435\\u0440\\u0448\\u0435\\u043d\\u0438\\u044f \\u0432\\u0441\\u0435\\u0445 \\u043f\\u0440\\u0435\\u0434\\u044b\\u0434\\u0443\\u0449\\u0438\\u0445 \\u043f\\u0435\\u0440\\u0435\\u043d\\u0430\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u043d\\u044b\\u0445 \\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u0439',\n 'steer.revoke': '\\u041e\\u0442\\u043e\\u0437\\u0432\\u0430\\u0442\\u044c \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c',\n 'steer.revoke.aria': '\\u0417\\u0435\\u043b\\u0451\\u043d\\u044b\\u0439: \\u043e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u0432\\u0441\\u0442\\u0430\\u0432\\u043a\\u0443 \\u0438 \\u043f\\u043e\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044c \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c \\u043d\\u0430 \\u0441\\u043b\\u0435\\u0434\\u0443\\u044e\\u0449\\u0438\\u0439 \\u0445\\u043e\\u0434',\n 'steer.revoke.unsupported': '\\u0421\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043d\\u0435\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0442\\u0435\\u043d\\u0442; \\u043e\\u0442\\u0437\\u044b\\u0432 \\u043d\\u0435 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f',\n 'steer.revokeFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043e\\u0442\\u043e\\u0437\\u0432\\u0430\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.moveUp': '\\u0412\\u0432\\u0435\\u0440\\u0445',\n 'steer.moveDown': '\\u0412\\u043d\\u0438\\u0437',\n 'steer.reorder.unsupported': '\\u0421\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043d\\u0435\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0442\\u0435\\u043d\\u0442; \\u043f\\u0435\\u0440\\u0435\\u0441\\u043e\\u0440\\u0442\\u0438\\u0440\\u043e\\u0432\\u043a\\u0430 \\u043d\\u0435 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f',\n 'steer.reorderFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043f\\u0435\\u0440\\u0435\\u0441\\u043e\\u0440\\u0442\\u0438\\u0440\\u043e\\u0432\\u0430\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.reorderStale': '\\u041e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c \\u0438\\u0437\\u043c\\u0435\\u043d\\u0438\\u043b\\u0430\\u0441\\u044c; \\u043f\\u0435\\u0440\\u0435\\u0441\\u043e\\u0440\\u0442\\u0438\\u0440\\u043e\\u0432\\u043a\\u0430 \\u043e\\u0442\\u043c\\u0435\\u043d\\u0435\\u043d\\u0430, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.dragReorder': '\\u041f\\u0435\\u0440\\u0435\\u0442\\u0430\\u0449\\u0438\\u0442\\u0435 \\u0434\\u043b\\u044f \\u043f\\u0435\\u0440\\u0435\\u0441\\u043e\\u0440\\u0442\\u0438\\u0440\\u043e\\u0432\\u043a\\u0438',\n 'steer.pullBack': '\\u0412\\u0435\\u0440\\u043d\\u0443\\u0442\\u044c \\u0432 \\u043f\\u043e\\u043b\\u0435 \\u0432\\u0432\\u043e\\u0434\\u0430',\n 'steer.pullBack.unsupported': '\\u0421\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043d\\u0435\\u0442\\u0435\\u043a\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0442\\u0435\\u043d\\u0442; \\u0432\\u043e\\u0437\\u0432\\u0440\\u0430\\u0442 \\u043d\\u0435 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f',\n 'steer.pullBack.composerBusy': '\\u0412 \\u043f\\u043e\\u043b\\u0435 \\u0432\\u0432\\u043e\\u0434\\u0430 \\u0443\\u0436\\u0435 \\u0435\\u0441\\u0442\\u044c \\u0441\\u043e\\u0434\\u0435\\u0440\\u0436\\u0438\\u043c\\u043e\\u0435; \\u043e\\u0442\\u043f\\u0440\\u0430\\u0432\\u044c\\u0442\\u0435 \\u0438\\u043b\\u0438 \\u043e\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u0435 \\u0441\\u043d\\u0430\\u0447\\u0430\\u043b\\u0430',\n 'steer.pullBackFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u0432\\u0435\\u0440\\u043d\\u0443\\u0442\\u044c \\u0432 \\u043f\\u043e\\u043b\\u0435 \\u0432\\u0432\\u043e\\u0434\\u0430, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.badge.now': '\\u043f\\u0440\\u0435\\u0440\\u044b\\u0432\\u0430\\u043d\\u0438\\u0435',\n 'steer.badge.next': '\\u043f\\u0435\\u0440\\u0435\\u043d\\u0430\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435',\n 'steer.badge.later': '\\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'steer.unavailable.running': '\\u041f\\u043b\\u0430\\u043d\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435 \\u0434\\u043e\\u0441\\u0442\\u0443\\u043f\\u043d\\u043e \\u0442\\u043e\\u043b\\u044c\\u043a\\u043e \\u0432\\u043e \\u0432\\u0440\\u0435\\u043c\\u044f \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f',\n 'steer.clear': '\\u041e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u0438 \\u043e\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044c',\n 'steer.clear.confirm': '\\u041f\\u043e\\u0434\\u0442\\u0432\\u0435\\u0440\\u0434\\u0438\\u0442\\u044c \\u043e\\u0447\\u0438\\u0441\\u0442\\u043a\\u0443?',\n 'steer.clear.cancel': '\\u041e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u043e\\u0447\\u0438\\u0441\\u0442\\u043a\\u0443',\n 'steer.clear.aria': '\\u041e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u0442\\u0435\\u043a\\u0443\\u0449\\u0435\\u0435 \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u0435 \\u0438 \\u043e\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044c \\u0432\\u0441\\u0435 \\u0441\\u043e\\u043e\\u0431\\u0449\\u0435\\u043d\\u0438\\u044f \\u0432 \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u0438',\n 'steer.clearFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u043e\\u0442\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c \\u0438 \\u043e\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.freeze': '\\u0417\\u0430\\u043c\\u043e\\u0440\\u043e\\u0437\\u0438\\u0442\\u044c \\u0438 \\u0434\\u043e\\u0431\\u0430\\u0432\\u0438\\u0442\\u044c',\n 'steer.resume': '\\u0412\\u043e\\u0437\\u043e\\u0431\\u043d\\u043e\\u0432\\u0438\\u0442\\u044c \\u0438 \\u0434\\u043e\\u0431\\u0430\\u0432\\u0438\\u0442\\u044c',\n 'steer.frozen': '\\u0417\\u0430\\u043c\\u043e\\u0440\\u043e\\u0436\\u0435\\u043d\\u043e: \\u0442\\u0435\\u043a\\u0443\\u0449\\u0438\\u0439 \\u0445\\u043e\\u0434 \\u0437\\u0430\\u0432\\u0435\\u0440\\u0448\\u0438\\u0442\\u0441\\u044f, \\u0437\\u0430\\u0442\\u0435\\u043c \\u043e\\u0447\\u0435\\u0440\\u0435\\u0434\\u044c \\u043f\\u0440\\u0438\\u043e\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u0438\\u0442\\u0441\\u044f \\u0434\\u043e \\u0432\\u043e\\u0437\\u043e\\u0431\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u0438\\u044f',\n 'steer.frozenInput': '\\u0417\\u0430\\u043c\\u043e\\u0440\\u043e\\u0436\\u0435\\u043d\\u043e: \\u0432\\u0432\\u043e\\u0434 \\u043f\\u0440\\u0438\\u043e\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d, \\u0432\\u043e\\u0437\\u043e\\u0431\\u043d\\u043e\\u0432\\u0438\\u0442\\u0435 \\u0434\\u043b\\u044f \\u043f\\u0440\\u043e\\u0434\\u043e\\u043b\\u0436\\u0435\\u043d\\u0438\\u044f',\n 'steer.frozenBadge': '\\u0437\\u0430\\u043c\\u043e\\u0440\\u043e\\u0436\\u0435\\u043d\\u043e',\n 'steer.freezeFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u0437\\u0430\\u043c\\u043e\\u0440\\u043e\\u0437\\u0438\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n 'steer.resumeFailed': '\\u041d\\u0435 \\u0443\\u0434\\u0430\\u043b\\u043e\\u0441\\u044c \\u0432\\u043e\\u0437\\u043e\\u0431\\u043d\\u043e\\u0432\\u0438\\u0442\\u044c, \\u043f\\u043e\\u0432\\u0442\\u043e\\u0440\\u0438\\u0442\\u0435.',\n}\n\n/** Spanish dictionary (keys mirror zh). */\nexport const es: Record<keyof typeof zh, string> = {\n 'family.title': 'Tr\\u00e1fico de entrada',\n 'family.busyEnter': 'Comportamiento busy-Enter (gestionado por este plugin)',\n 'family.desc': 'Enter simple pone en cola cuando est\\u00e1 ocupado sin interrumpir; usa el bot\\u00f3n congelar/redirigir del compositor para interrumpir. Gestionado autom\\u00e1ticamente \\u2014 nada que configurar.',\n 'queue.count': '{n} mensajes en cola',\n 'queue.edit': 'Editar mensaje en cola',\n 'queue.edit.unsupported': 'Contiene contenido no textual; edici\\u00f3n no compatible',\n 'queue.save': 'Guardar mensaje en cola',\n 'queue.cancelEdit': 'Cancelar edici\\u00f3n',\n 'queue.remove': 'Eliminar mensaje en cola',\n 'queue.removeFailed': 'Error al eliminar: el mensaje puede haber comenzado a enviarse.',\n 'queue.editFailed': 'Error al editar: el mensaje puede haber comenzado a enviarse.',\n 'queue.editFailed.pulledBack': 'Error al editar; el contenido fue devuelto al compositor, revise y reenv\\u00ede.',\n 'steer.inflight': '{n} insert\\u00e1ndose',\n 'steer.now': 'Interrumpir y enviar',\n 'steer.now.aria': 'Rojo: interrumpir la acci\\u00f3n en curso y enviar inmediatamente',\n 'steer.now.unsupported': 'Contiene contenido no textual; interrupci\\u00f3n no compatible',\n 'steer.nowFailed': 'Error al interrumpir, int\\u00e9ntelo de nuevo.',\n 'steer.next': 'Enviar despu\\u00e9s de la acci\\u00f3n',\n 'steer.next.aria': 'Amarillo: insertar despu\\u00e9s de que termine la acci\\u00f3n actual',\n 'steer.nextFailed': 'Error al redirigir, int\\u00e9ntelo de nuevo.',\n 'steer.later': 'Encolar para el pr\\u00f3ximo turno',\n 'steer.later.aria': 'Verde: encolar; se procesa cuando terminen todas las acciones redirigidas previas',\n 'steer.revoke': 'Devolver a la cola',\n 'steer.revoke.aria': 'Verde: revocar la inserci\\u00f3n y encolar para el pr\\u00f3ximo turno',\n 'steer.revoke.unsupported': 'Contiene contenido no textual; revocaci\\u00f3n no compatible',\n 'steer.revokeFailed': 'Error al revocar, int\\u00e9ntelo de nuevo.',\n 'steer.moveUp': 'Mover arriba',\n 'steer.moveDown': 'Mover abajo',\n 'steer.reorder.unsupported': 'Contiene contenido no textual; reordenaci\\u00f3n no compatible',\n 'steer.reorderFailed': 'Error al reordenar, int\\u00e9ntelo de nuevo.',\n 'steer.reorderStale': 'La cola cambi\\u00f3; reordenaci\\u00f3n cancelada, int\\u00e9ntelo de nuevo.',\n 'steer.dragReorder': 'Arrastrar para reordenar',\n 'steer.pullBack': 'Devolver al compositor para editar',\n 'steer.pullBack.unsupported': 'Contiene contenido no textual; devoluci\\u00f3n no compatible',\n 'steer.pullBack.composerBusy': 'El compositor ya tiene contenido; env\\u00ede o vac\\u00ede primero',\n 'steer.pullBackFailed': 'Error al devolver al compositor, int\\u00e9ntelo de nuevo.',\n 'steer.badge.now': 'interrumpiendo',\n 'steer.badge.next': 'redirigiendo',\n 'steer.badge.later': 'en cola',\n 'steer.unavailable.running': 'Planificaci\\u00f3n solo disponible durante la ejecuci\\u00f3n',\n 'steer.clear': 'Cancelar y vaciar',\n 'steer.clear.confirm': '\\u00bfConfirmar vaciado?',\n 'steer.clear.cancel': 'Cancelar vaciado',\n 'steer.clear.aria': 'Cancelar la ejecuci\\u00f3n actual y vaciar todos los mensajes en cola',\n 'steer.clearFailed': 'Error al cancelar y vaciar, int\\u00e9ntelo de nuevo.',\n 'steer.freeze': 'Congelar y a\\u00f1adir',\n 'steer.resume': 'Reanudar y a\\u00f1adir',\n 'steer.frozen': 'Congelado: el turno actual termina y la cola se pausa hasta la reanudaci\\u00f3n',\n 'steer.frozenInput': 'Congelado: entrada pausada, reanude para continuar',\n 'steer.frozenBadge': 'congelado',\n 'steer.freezeFailed': 'Error al congelar, int\\u00e9ntelo de nuevo.',\n 'steer.resumeFailed': 'Error al reanudar, int\\u00e9ntelo de nuevo.',\n}\n\n/** Combined dictionary map covering all 9 languages. */\nexport const dictionaries: Record<string, Record<string, string>> = { zh, en, ja, ko, fr, de, it, ru, es }\n\n/** Dictionary key union. */\nexport type SteerKey = keyof typeof zh\n","/**\n * Session-scoped freeze store shared by the composer freeze button (the\n * control) and the steering dock (the banner/disabled states).\n *\n * The queue is fully decoupled from freezing: freezing only stops the agent\n * from consuming the queue (the detached entries are preserved here so the\n * driver finds no pending work and stops). While frozen the entries stay\n * fully editable — text, order and the planned insertion tier (now/next/\n * later) can all change; resume re-submits the queue honoring those tiers.\n *\n * State is keyed by session id so freezing one session never leaks into\n * another: each session holds its own `frozen` flag and detached queue, and\n * mutating one session's queue only re-renders that session's consumers\n * (`useSyncExternalStore` bails on unchanged references for the others).\n */\n\n/** Insertion tier planned for one detached queued message. */\nexport type FrozenTier = 'queue' | 'safe_point' | 'force'\n\n/** One detached queued message with its planned insertion tier. */\nexport interface FrozenEntry {\n text: string\n tier: FrozenTier\n}\n\nexport interface FreezeState {\n frozen: boolean\n /** Detached queued messages in FIFO order, each with a planned tier. */\n pending: readonly FrozenEntry[]\n}\n\n/** Session id → per-session freeze state. */\nconst states = new Map<string, FreezeState>()\nconst listeners = new Set<() => void>()\n\n/** Stable empty snapshot: `useSyncExternalStore` needs a reference-stable\n * value for unset sessions so unchanged consumers never re-render. */\nconst EMPTY: FreezeState = { frozen: false, pending: [] }\n\n/** Minimal snapshot store (no runtime dependency, stable identity per mount). */\nexport const freezeStore = {\n /** Snapshot for one session; reference-stable until that session changes. */\n getSnapshot(sessionId: string): FreezeState {\n return states.get(sessionId) ?? EMPTY\n },\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n },\n /** Replace one session's state; unset sessions fall back to EMPTY. */\n set(sessionId: string, next: FreezeState): void {\n if (next.frozen === false && next.pending.length === 0) {\n states.delete(sessionId)\n } else {\n states.set(sessionId, next)\n }\n emit()\n },\n}\n\n/** Reset all sessions (for tests). */\nexport function resetFreezeStore(): void {\n states.clear()\n emit()\n}\n\n/** Append one queued message while frozen (new input lands in the detached queue). */\nexport function pushPending(sessionId: string, text: string, tier: FrozenTier = 'queue'): void {\n const cur = states.get(sessionId) ?? EMPTY\n freezeStore.set(sessionId, { ...cur, pending: [...cur.pending, { text, tier }] })\n}\n\n/** Edit one detached queued message's text in place. */\nexport function updatePendingAt(sessionId: string, index: number, text: string): void {\n const pending = states.get(sessionId)?.pending\n if (pending === undefined) return\n const entry = pending[index]\n if (entry === undefined) return\n const next = [...pending]\n next[index] = { ...entry, text }\n freezeStore.set(sessionId, { frozen: true, pending: next })\n}\n\n/** Change one detached queued message's planned insertion tier. */\nexport function setTierAt(sessionId: string, index: number, tier: FrozenTier): void {\n const pending = states.get(sessionId)?.pending\n if (pending === undefined) return\n const entry = pending[index]\n if (entry === undefined) return\n const next = [...pending]\n next[index] = { ...entry, tier }\n freezeStore.set(sessionId, { frozen: true, pending: next })\n}\n\n/** Remove one detached queued message. */\nexport function removePendingAt(sessionId: string, index: number): void {\n const pending = states.get(sessionId)?.pending\n if (pending === undefined) return\n freezeStore.set(sessionId, { frozen: true, pending: pending.filter((_, i) => i !== index) })\n}\n\n/** Move one detached queued message to a new position (reorder while frozen). */\nexport function movePending(sessionId: string, from: number, to: number): void {\n if (from === to) return\n const pending = states.get(sessionId)?.pending\n if (pending === undefined) return\n const next = [...pending]\n const [moved] = next.splice(from, 1)\n if (moved === undefined) return\n next.splice(to, 0, moved)\n freezeStore.set(sessionId, { frozen: true, pending: next })\n}\n\nfunction emit(): void {\n for (const listener of listeners) listener()\n}\n","/**\n * Three-tier steering queue dock: the shadowing replacement for the official\n * `conversation.input.dock` entry (same cell id `queue`, priority -1, so the\n * lower priority wins and the official QueueDock never renders while this\n * plugin is mounted).\n *\n * Every queued row carries three planning buttons:\n * - green (later, the default state): the row already queues for the next\n * turn —plain Enter keeps feeding rows here; pressing green on a row that\n * was already steered (yellow) revokes the insertion and pulls it back to\n * later (the yellow flow is reversible);\n * - yellow (next): strict-steer the row into the running turn, consumed at\n * the next step boundary (after the current action finishes);\n * - red (now): cancel the running turn, then remove the row and re-send its\n * text as a fresh message —the re-send arms the harness wake latch (the\n * converged driver restarts) and the interrupted input is processed as the\n * next turn's input. A plain steer after cancel would re-insert a message\n * that is already pending in next-turn and the inbox rejects it.\n *\n * The toolbar also exposes a queue-level \"cancel and clear\" that stops the\n * current run and removes every queued row, plus a session-level\n * freeze/resume toggle for the peak-hour scenario: freeze stops the current\n * run while preserving the queue (keepInbox), resume re-arms the driver by\n * re-sending the first queued row so the preserved work continues.\n */\nimport { useEffect, useId, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\n// Type-only: the conversation slot/contract declarations (module augmentation\n// for the SlotMap and the session standard kit). No value import crosses the\n// plugin boundary.\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport {\n IconCheckOutlineMedium, IconChevronDownOutlineMedium, IconChevronUpOutlineMedium, IconCloseOutlineMedium,\n IconEditOutlineMedium, IconQueueOutlineMedium, IconTrashOutlineMedium, Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { freezeStore, setTierAt, updatePendingAt, removePendingAt, movePending } from './freeze-store.ts'\nimport css from './steer-queue-dock.module.css'\n\n/**\n * Suppress the OFFICIAL queue dock entirely: our shadowing entry owns the\n * `queue` cell, so the official dock is only ever mounted as a crash fallback\n * — and its per-row 插话发送 duplicates our yellow tier. Hide the whole\n * container by its css-module class (the `_7yHdaG` hash is baked into the\n * host build and stable across restarts), plus the aria-label match as a\n * second net in case the host rehashes.\n */\nconst HIDE_OFFICIAL_QUEUE_CSS =\n // Class-based only: the official steer button and OUR yellow tier share the\n // same rendered aria-label (插话发送) — an attribute rule would hide our\n // own button too.\n '[class*=\"_7yHdaG_dock\"]{display:none!important}'\nif (typeof document !== 'undefined' && document.querySelector('style[data-plugin-css=\"dsh-input-traffic/hide-official-steer\"]') === null) {\n const tag = document.createElement('style')\n tag.dataset.plugin = 'dsh-input-traffic'\n tag.dataset.pluginCss = 'dsh-input-traffic/hide-official-steer'\n tag.textContent = HIDE_OFFICIAL_QUEUE_CSS\n document.head.appendChild(tag)\n}\n\n/** One mutation accepted by the conversation queue verb. */\nexport type SteerQueueAction =\n | { kind: 'edit'; content: readonly { type: 'text'; text: string }[] }\n | { kind: 'remove' }\n | { kind: 'steer' }\n\n/** Busy marker for a whole-queue rebuild (reorder); locks every row action. */\nconst REORDER_MARK = '__reorder__'\n\n/** localStorage key for the manual collapse state (dsh-queue-plus parity). */\nconst COLLAPSE_KEY = 'dsh-input-traffic:collapsed'\n\n/** Queue operations injected by the session-scoped registration. */\nexport interface SteerQueueDockInjected {\n updateQueue: (itemId: string, action: SteerQueueAction) => Promise<void>\n /** Cancel the current turn while preserving the pending queue. */\n cancel: () => Promise<void>\n /** Re-send one plain-text message as a queued follow-up (the revoke path). */\n send: (text: string) => Promise<void>\n /** Steer one plain-text message into the session's next step (resume's safe_point tier). */\n sendSteer?: (text: string) => Promise<void>\n /** Back-fill the composer draft (the pull-back-to-composer edit path). */\n setDraft: (text: string) => void\n notify: (level: 'info' | 'error', text: string) => void\n /** Owning session id (for the dsh-session-guard bridge RPC). */\n sessionId?: string\n /** Raise/clear the composer block for the owning session (freeze keeps the\n * composer inert so Enter cannot leak into the conversation; absent on the\n * dock entry, only the freeze button injects it). */\n setComposerBlock?: (reason: string | undefined) => void\n}\n\n/** Full props of a dock entry: InputZone owner share + session standard kit + global seat + the locale seat. */\nexport type SteerQueueDockProps = PropsRuntime<'conversation.input.dock'> & SteerQueueDockInjected & PropsLocale<'steer'>\n\n/** The planning tier of one queued row. */\nexport type SteerTier = 'now' | 'next' | 'later'\n\n/**\n * Resolve the action sequence for one planning button press. Pure so the\n * button wiring and its tests share one truth.\n * @param tier - the pressed planning tier.\n * @returns the queue mutation (red re-uses a steer-shaped action for the\n * yellow branch; the red branch performs cancel + remove + resend instead).\n */\nexport function planActionFor(tier: SteerTier): { action: SteerQueueAction; interruptFirst: boolean } {\n if (tier === 'later') return { action: { kind: 'steer' }, interruptFirst: false }\n // Yellow steers only; red cancels the running turn first, then steers.\n return { action: { kind: 'steer' }, interruptFirst: tier === 'now' }\n}\n\n/**\n * Project the tier badge of one inbox row from its placement. Pure so the\n * row rendering and its tests share one truth.\n * @param placement - the inbox projection placement.\n * @returns the tier badge, or null for non-visible context rows.\n */\nexport function badgeFor(placement: 'queued' | 'steering' | 'context'): SteerTier | null {\n if (placement === 'steering') return 'next'\n if (placement === 'queued') return 'later'\n return null\n}\n\n/**\n * Auto-grow one edit textarea to its content. The CSS max-height caps the\n * growth; beyond it the textarea scrolls internally. Height is reset first so\n * shrink (deleting lines) also tracks the content.\n * @param el - the textarea to resize in place.\n */\nexport function resizeEditor(el: HTMLTextAreaElement): void {\n el.style.height = 'auto'\n el.style.height = `${el.scrollHeight}px`\n}\n\n/**\n * Concatenate a queued row's text blocks; null when the row carries anything\n * non-text (attachments) or no content — mirrors the host queue dock's own\n * helper (ui-conversation client.js `textOf`). Wire rows do NOT carry a\n * `.text` field; the text lives in `content` blocks.\n */\nexport function textOf(content: readonly { readonly type: string; readonly text?: string }[] | undefined): string | null {\n if (content === undefined || content.length === 0) return null\n if (!content.every(block => block.type === 'text')) return null\n const joined = content.map(block => block.text ?? '').join('')\n return joined === '' ? null : joined\n}\n\n/**\n * Queue strip with three-tier planning: one item renders directly; multiple\n * items default to a collapsible count header; an empty queue renders nothing.\n */\nexport function SteerQueueDock({ sessionId, useSession, useProjection, input, updateQueue, cancel, send, setDraft, notify, t }: SteerQueueDockProps) {\n // Queue rows live in the session's `inbox` PROJECTION (0.1.7+): `next-turn`\n // is the plain queue (green tier), `next-step` the steered band (yellow).\n // The session store never carried a `queue` field on released hosts.\n const inbox = useProjection('inbox')\n // Wire rows carry no `.text`; derive it from the content blocks, falling\n // back to a declared text for fixture/local rows.\n const queue = useMemo(() => (inbox?.['next-turn'] ?? []).map(row => ({ ...row, text: textOf(row.content) ?? row.text ?? null })), [inbox])\n const steering = useMemo(() => (inbox?.['next-step'] ?? []).map(row => ({ ...row, text: textOf(row.content) ?? row.text ?? null })), [inbox])\n const running = useSession(s => s.running)\n // Parity with the official dock: a continuable subagent context still owns\n // a mutable queue; requiring strict null kept the whole action row hidden\n // whenever a subagent address was attached.\n const queueMutable = useSession(s => s.subagent === null || s.subagent.address.mode === 'continuable')\n const [editing, setEditing] = useState<{ id: string; text: string } | null>(null)\n const [busy, setBusy] = useState<string | null>(null)\n const [clearing, setClearing] = useState(false)\n // Two-step clear confirmation: the first click arms the prompt, the second\n // executes; arming auto-reverts after a few seconds (no native confirm).\n const [confirmClear, setConfirmClear] = useState(false)\n const confirmTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n // Drag-and-drop reorder source index and the current drop-target row.\n const dragIndex = useRef<number | null>(null)\n const [dragOver, setDragOver] = useState<number | null>(null)\n // Collapse state persists across mounts (dsh-queue-plus parity).\n const [collapsed, setCollapsed] = useState(() => {\n try {\n const v = localStorage.getItem(COLLAPSE_KEY)\n return v === null ? true : v === '1'\n } catch {\n return true\n }\n })\n // Session-level freeze lives in the composer-right control; the dock reads\n // the shared store for the banner and inert states. While frozen the\n // detached queue is rendered here (read-only) so the waiting area stays\n // visible — freezing only pauses the running behavior, it must not hide\n // the queued messages.\n const { frozen, pending: frozenPending } = useSyncExternalStore(\n freezeStore.subscribe,\n () => freezeStore.getSnapshot(sessionId ?? ''),\n )\n const sid = sessionId ?? ''\n const listId = useId()\n // The edit textarea; grown to its content on entry and on every input.\n const editorRef = useRef<HTMLTextAreaElement>(null)\n\n useEffect(() => {\n if (queue.length === 0 && !collapsed) setCollapsed(true)\n // Frozen-row edits use a `frozen:` id that never exists in the dsh queue;\n // skip the stale-check for them so the detached queue stays editable.\n if (editing !== null && !editing.id.startsWith('frozen:') && (!queueMutable || !queue.some(row => row.id === editing.id))) setEditing(null)\n }, [collapsed, editing, queue, queueMutable])\n\n // Persist the manual collapse state; clear the confirm timer on unmount.\n useEffect(() => {\n try {\n localStorage.setItem(COLLAPSE_KEY, collapsed ? '1' : '0')\n } catch {\n /* storage unavailable: in-memory only */\n }\n }, [collapsed])\n useEffect(() => () => {\n if (confirmTimer.current !== null) clearTimeout(confirmTimer.current)\n }, [])\n\n // Grow the editor to its full content when a row enters edit mode.\n const editingId = editing?.id\n useEffect(() => {\n if (editingId === undefined) return\n const el = editorRef.current\n if (el !== null) resizeEditor(el)\n }, [editingId])\n\n // The dock stays mounted while the agent runs (the freeze entry must be\n // reachable before any message queues), while any row is pending, and while\n // the session is frozen (the detached queue stays visible).\n if (queue.length === 0 && steering.length === 0 && !running && !frozen) return null\n\n const interactionActive = queueMutable && (editing !== null || busy !== null || clearing)\n const expanded = !collapsed || interactionActive\n const listVisible = queue.length === 1 || expanded\n const planDisabled = !queueMutable || !running || frozen\n const nothingPending = queue.length === 0 && steering.length === 0\n // Reordering rebuilds the queue by re-sending texts; non-text rows cannot\n // be re-sent, so sorting is disabled while any such row is queued.\n const reorderUnsupported = queue.some(row => row.text === null)\n\n const applyAction = async (\n itemId: string,\n action: SteerQueueAction,\n failure: string,\n ): Promise<boolean> => {\n setBusy(itemId)\n try {\n await updateQueue(itemId, action)\n return true\n } catch {\n notify('error', failure)\n return false\n } finally {\n setBusy(current => current === itemId ? null : current)\n }\n }\n\n const saveEdit = async (): Promise<void> => {\n if (editing === null || typeof editing.text !== 'string' || editing.text.trim() === '') return\n const itemId = editing.id\n const text = editing.text\n setBusy(itemId)\n try {\n await updateQueue(itemId, { kind: 'edit', content: [{ type: 'text', text }] })\n setEditing(null)\n } catch {\n // The edit failed (the agent may have claimed the row mid-edit): fall\n // back to the composer so the edited content is never lost. Only when\n // the composer is free — an occupied draft must not be overwritten.\n if (input.draft.trim() === '') {\n setDraft(text)\n setEditing(null)\n notify('error', t('queue.editFailed.pulledBack'))\n } else {\n notify('error', t('queue.editFailed'))\n }\n } finally {\n setBusy(current => current === itemId ? null : current)\n }\n }\n\n const steerRow = async (row: { id: string; text: string | null }, tier: Exclude<SteerTier, 'later'>): Promise<void> => {\n setBusy(row.id)\n try {\n if (tier === 'now') {\n // Interrupt, then re-submit: cancel stops the current run (keepInbox),\n // the row is removed so its identity cannot collide, and re-sending\n // the text arms the harness wake latch (the converged driver restarts\n // and processes it as the next turn's input). A plain steer after\n // cancel would re-insert a message already pending in next-turn and\n // the inbox rejects the duplicate.\n await cancel()\n await updateQueue(row.id, { kind: 'remove' })\n if (row.text !== null) await send(row.text)\n } else {\n await updateQueue(row.id, { kind: 'steer' })\n }\n } catch {\n notify('error', tier === 'now' ? t('steer.nowFailed') : t('steer.nextFailed'))\n } finally {\n setBusy(current => current === row.id ? null : current)\n }\n }\n\n /**\n * Revoke a steered (yellow) or interrupting (red) row back to later: remove\n * the admitted row and re-send its text as a queued follow-up, so it lands\n * in next-turn again (the yellow flow is reversible).\n */\n const revokeToLater = async (row: { id: string; text: string | null }): Promise<void> => {\n if (row.text === null) return\n setBusy(row.id)\n try {\n await updateQueue(row.id, { kind: 'remove' })\n await send(row.text)\n } catch {\n notify('error', t('steer.revokeFailed'))\n } finally {\n setBusy(current => current === row.id ? null : current)\n }\n }\n\n /**\n * Rebuild the queue in a new order: remove every queued row, then re-send\n * the texts sequentially so the agent's next-turn list matches the new\n * order. Concurrency protection (dsh-queue-plus parity): if a remove fails\n * with queue-item-not-found, the agent already claimed that row — the\n * rebuild stops immediately and nothing is re-sent, so the changed queue\n * is never scrambled.\n */\n const rebuildQueue = async (rows: readonly { id: string; text: string | null }[], next: readonly { id: string; text: string | null }[]): Promise<void> => {\n setBusy(REORDER_MARK)\n try {\n for (const row of rows) {\n try {\n await updateQueue(row.id, { kind: 'remove' })\n } catch (error) {\n if (error instanceof Error && error.message.includes('queue-item-not-found')) {\n notify('error', t('steer.reorderStale'))\n return\n }\n throw error\n }\n }\n for (const row of next) {\n if (row.text !== null) await send(row.text)\n }\n } catch {\n notify('error', t('steer.reorderFailed'))\n } finally {\n setBusy(null)\n }\n }\n\n /**\n * Move one queued row up/down in the FIFO order (arrow buttons).\n */\n const reorder = async (rowId: string, delta: -1 | 1): Promise<void> => {\n const rows = queue\n const index = rows.findIndex(row => row.id === rowId)\n const target = index + delta\n if (index < 0 || target < 0 || target >= rows.length) return\n const next = [...rows]\n const swapped = next[index] as typeof next[number]\n next[index] = next[target] as typeof next[number]\n next[target] = swapped\n if (next.some(row => row.text === null)) {\n notify('error', t('steer.reorder.unsupported'))\n return\n }\n await rebuildQueue(rows, next)\n }\n\n /**\n * Move one row to an absolute position (drag-and-drop drop handler).\n */\n const reorderTo = async (fromIndex: number, toIndex: number): Promise<void> => {\n if (fromIndex === toIndex) return\n const rows = queue\n if (rows[fromIndex] === undefined || rows[toIndex] === undefined) return\n const next = [...rows]\n const [moved] = next.splice(fromIndex, 1)\n if (moved === undefined) return\n next.splice(toIndex, 0, moved)\n if (next.some(row => row.text === null)) {\n notify('error', t('steer.reorder.unsupported'))\n return\n }\n await rebuildQueue(rows, next)\n }\n\n /** Arm or execute the two-step clear confirmation. */\n const armClear = (): void => {\n if (confirmClear) {\n if (confirmTimer.current !== null) clearTimeout(confirmTimer.current)\n setConfirmClear(false)\n void clearAll()\n return\n }\n setConfirmClear(true)\n if (confirmTimer.current !== null) clearTimeout(confirmTimer.current)\n confirmTimer.current = setTimeout(() => setConfirmClear(false), 3000)\n }\n\n /** Abort the armed clear confirmation (the explicit cancel button). */\n const cancelClear = (): void => {\n if (confirmTimer.current !== null) clearTimeout(confirmTimer.current)\n setConfirmClear(false)\n }\n\n /** Save an in-place edit of one detached (frozen) queued message. */\n const saveFrozenEdit = async (index: number): Promise<void> => {\n if (editing === null) return\n const text = editing.text.trim()\n if (text === '') {\n setEditing(null)\n return\n }\n updatePendingAt(sid, index, text)\n setEditing(null)\n }\n\n const clearAll = async (): Promise<void> => {\n setClearing(true)\n // Cancel the current run and clear every pending row (queued and\n // steering alike). Removal races the agent claiming rows;\n // item-not-found is a normal convergence and must not surface.\n const pending = [...queue, ...steering]\n try {\n await cancel()\n await Promise.all(pending.map(row =>\n updateQueue(row.id, { kind: 'remove' }).catch(() => undefined),\n ))\n } catch {\n notify('error', t('steer.clearFailed'))\n } finally {\n setClearing(false)\n }\n }\n\n return (\n <div className={css.dock} data-steer-dock=\"\">\n <div className={css.panel}>\n <div className={css.toolbar}>\n <button\n type=\"button\"\n className={css.header}\n aria-controls={listId}\n aria-expanded={expanded}\n disabled={queue.length <= 1 || interactionActive}\n onClick={() => { setCollapsed(value => !value) }}\n >\n <span className={css.lead} aria-hidden><IconQueueOutlineMedium /></span>\n {queue.length > 0 && (\n <span className={css.count}>{t('queue.count', { n: queue.length })}</span>\n )}\n {queue.length > 1 && (\n <span className={css.chevron} aria-hidden>\n {expanded ? <IconChevronDownOutlineMedium /> : <IconChevronUpOutlineMedium />}\n </span>\n )}\n </button>\n <div className={css.toolbarActions}>\n {confirmClear && (\n <button\n type=\"button\"\n className={css.clearCancel}\n aria-label={t('steer.clear.cancel')}\n disabled={clearing || busy !== null || nothingPending}\n onClick={cancelClear}\n >\n <span className={css.clearLabel}>{t('steer.clear.cancel')}</span>\n </button>\n )}\n <Tooltip label={confirmClear ? t('steer.clear.confirm') : t('steer.clear')} side=\"top\" delayMs={500}>\n <button\n type=\"button\"\n className={`${css.clear} ${confirmClear ? css.clearConfirm : ''}`}\n aria-label={confirmClear ? t('steer.clear.confirm') : t('steer.clear')}\n disabled={clearing || busy !== null || nothingPending}\n onClick={armClear}\n >\n <IconTrashOutlineMedium size={14} />\n <span className={css.clearLabel}>{confirmClear ? t('steer.clear.confirm') : t('steer.clear')}</span>\n </button>\n </Tooltip>\n </div>\n </div>\n {frozen && (\n <div className={css.frozenBanner} role=\"status\">\n {t('steer.frozen')}\n </div>\n )}\n {/* While frozen the queue is detached into the shared store: render it\n here so the waiting area never disappears. The detached rows stay\n fully editable (edit / remove / reorder) — freezing only pauses\n the running behavior, it must not lock the queue. */}\n {frozen && frozenPending.length > 0 && (\n <ul className={css.frozenList} data-testid=\"frozen-list\">\n {frozenPending.map((entry, i) => {\n const editingFrozen = editing?.id === `frozen:${i}`\n const text = entry.text\n return (\n <li\n key={i}\n className={`${css.frozenRow} ${dragOver === i && frozen ? css.rowDragOver : ''}`}\n data-tier={entry.tier === 'force' ? 'now' : entry.tier === 'safe_point' ? 'next' : 'later'}\n data-editing={editingFrozen ? '' : undefined}\n draggable={!editingFrozen}\n title={!editingFrozen ? t('steer.dragReorder') : undefined}\n onDragStart={(event) => {\n if (editingFrozen) return\n dragIndex.current = i\n event.dataTransfer.effectAllowed = 'move'\n // Some engines only start HTML5 drag once data is set.\n event.dataTransfer.setData('text/plain', String(i))\n }}\n onDragOver={(event) => {\n if (dragIndex.current === null) return\n event.preventDefault()\n setDragOver(i)\n }}\n onDrop={(event) => {\n event.preventDefault()\n const from = dragIndex.current\n dragIndex.current = null\n setDragOver(null)\n if (from !== null) movePending(sid, from, i)\n }}\n onDragEnd={() => {\n dragIndex.current = null\n setDragOver(null)\n }}\n >\n <span className={css.lead} aria-hidden><IconQueueOutlineMedium /></span>\n <SteerBadge tier={entry.tier === 'force' ? 'now' : entry.tier === 'safe_point' ? 'next' : 'later'} t={t} />\n {editingFrozen\n ? (\n <textarea\n ref={editorRef}\n autoFocus\n className={css.editor}\n aria-label={t('queue.edit')}\n rows={1}\n value={editing?.text ?? text}\n onChange={(event) => { setEditing({ id: `frozen:${i}`, text: event.currentTarget.value }) }}\n onInput={(event) => { resizeEditor(event.currentTarget) }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n setEditing(null)\n return\n }\n if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault()\n void saveFrozenEdit(i)\n }\n }}\n />\n )\n : <span className={css.preview}>{text}</span>}\n <div className={css.actions}>\n {editingFrozen ? (\n <>\n <Tooltip label={t('queue.save')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.save')}\n disabled={editing === null || editing.text.trim() === ''}\n onClick={() => { void saveFrozenEdit(i) }}\n >\n <IconCheckOutlineMedium size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.cancelEdit')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.cancelEdit')}\n onClick={() => { setEditing(null) }}\n >\n <IconCloseOutlineMedium size={14} />\n </button>\n </Tooltip>\n </>\n ) : (\n <>\n <Tooltip label={t('steer.moveUp')} side=\"bottom\" delayMs={500} disabled={i === 0}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('steer.moveUp')}\n disabled={i === 0}\n onClick={() => movePending(sid, i, i - 1)}\n >\n <IconChevronUpOutlineMedium />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.moveDown')} side=\"bottom\" delayMs={500} disabled={i === frozenPending.length - 1}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('steer.moveDown')}\n disabled={i === frozenPending.length - 1}\n onClick={() => movePending(sid, i, i + 1)}\n >\n <IconChevronDownOutlineMedium />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.edit')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.edit')}\n onClick={() => { setEditing({ id: `frozen:${i}`, text }) }}\n >\n <IconEditOutlineMedium size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.remove')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.remove')}\n onClick={() => removePendingAt(sid, i)}\n >\n <IconTrashOutlineMedium size={14} />\n </button>\n </Tooltip>\n {/* Planned insertion tier: freezing pauses consumption,\n it must not lock the tier planning of each row. */}\n <span className={css.plan} role=\"group\" aria-label={t('steer.later.aria')}>\n <Tooltip label={t('steer.now')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierNow}`}\n aria-label={t('steer.now')}\n aria-pressed={entry.tier === 'force' || undefined}\n onClick={() => setTierAt(sid, i, 'force')}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.next')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierNext}`}\n aria-label={t('steer.next')}\n aria-pressed={entry.tier === 'safe_point' || undefined}\n onClick={() => setTierAt(sid, i, 'safe_point')}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.later')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierLater}`}\n aria-label={t('steer.later')}\n aria-pressed={entry.tier === 'queue' || undefined}\n onClick={() => setTierAt(sid, i, 'queue')}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n </span>\n </>\n )}\n </div>\n <span className={css.frozenMark}>{t('steer.frozenBadge')}</span>\n </li>\n )\n })}\n </ul>\n )}\n <ul id={listId} className={css.list} hidden={!listVisible}>\n {listVisible && queue.map((row, index) => (\n <li\n key={row.id}\n className={`${css.row} ${dragOver === index ? css.rowDragOver : ''}`}\n data-tier={badgeFor('queued') ?? undefined}\n data-editing={editing?.id === row.id ? '' : undefined}\n draggable={queueMutable && !reorderUnsupported && busy === null && !frozen}\n title={queueMutable && !reorderUnsupported && busy === null && !frozen ? t('steer.dragReorder') : undefined}\n onDragStart={(event) => {\n dragIndex.current = index\n event.dataTransfer.effectAllowed = 'move'\n // Some engines only start HTML5 drag once data is set.\n event.dataTransfer.setData('text/plain', String(index))\n }}\n onDragOver={(event) => {\n if (dragIndex.current === null) return\n event.preventDefault()\n setDragOver(index)\n }}\n onDrop={(event) => {\n event.preventDefault()\n const from = dragIndex.current\n dragIndex.current = null\n setDragOver(null)\n if (from !== null) void reorderTo(from, index)\n }}\n onDragEnd={() => {\n dragIndex.current = null\n setDragOver(null)\n }}\n >\n {queue.length === 1 && <span className={css.lead} aria-hidden><IconQueueOutlineMedium /></span>}\n <SteerBadge tier={badgeFor('queued')} t={t} />\n {editing?.id === row.id\n ? (\n <textarea\n ref={editorRef}\n autoFocus\n className={css.editor}\n aria-label={t('queue.edit')}\n rows={1}\n value={editing.text}\n onChange={(event) => { setEditing({ id: row.id, text: event.currentTarget.value }) }}\n onInput={(event) => { resizeEditor(event.currentTarget) }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n setEditing(null)\n return\n }\n // Plain Enter saves; Shift+Enter keeps editing (newline).\n if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault()\n void saveEdit()\n }\n }}\n />\n )\n : <span className={css.preview}>{row.text}</span>}\n {queueMutable && <div className={css.actions}>\n {editing?.id === row.id\n ? (\n <>\n <Tooltip label={t('queue.save')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.save')}\n disabled={busy !== null || editing.text.trim() === ''}\n onClick={() => { void saveEdit() }}\n >\n <IconCheckOutlineMedium size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.cancelEdit')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.cancelEdit')}\n disabled={busy !== null}\n onClick={() => { setEditing(null) }}\n >\n <IconCloseOutlineMedium size={14} />\n </button>\n </Tooltip>\n </>\n )\n : (\n <>\n <Tooltip label={t('steer.moveUp')} side=\"bottom\" delayMs={500} disabled={frozen || reorderUnsupported}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('steer.moveUp')}\n title={reorderUnsupported ? t('steer.reorder.unsupported') : undefined}\n disabled={busy !== null || frozen || reorderUnsupported}\n onClick={() => { void reorder(row.id, -1) }}\n >\n <IconChevronUpOutlineMedium />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.moveDown')} side=\"bottom\" delayMs={500} disabled={frozen || reorderUnsupported}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('steer.moveDown')}\n title={reorderUnsupported ? t('steer.reorder.unsupported') : undefined}\n disabled={busy !== null || frozen || reorderUnsupported}\n onClick={() => { void reorder(row.id, 1) }}\n >\n <IconChevronDownOutlineMedium />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.edit')} side=\"bottom\" delayMs={500} disabled={row.text === null}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.edit')}\n title={row.text === null ? t('queue.edit.unsupported') : undefined}\n disabled={busy !== null || row.text === null}\n onClick={() => {\n if (row.text !== null) setEditing({ id: row.id, text: row.text ?? '' })\n }}\n >\n <IconEditOutlineMedium size={14} />\n </button>\n </Tooltip>\n <Tooltip label={t('queue.remove')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.action}\n aria-label={t('queue.remove')}\n disabled={busy !== null}\n onClick={() => {\n void applyAction(row.id, { kind: 'remove' }, t('queue.removeFailed'))\n }}\n >\n <IconTrashOutlineMedium size={14} />\n </button>\n </Tooltip>\n <span className={css.plan} role=\"group\" aria-label={t('steer.later.aria')}>\n <Tooltip label={t('steer.now')} side=\"bottom\" delayMs={500} disabled={planDisabled || row.text === null}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierNow}`}\n aria-label={t('steer.now')}\n title={planDisabled ? t('steer.unavailable.running') : row.text === null ? t('steer.now.unsupported') : undefined}\n disabled={busy !== null || planDisabled || row.text === null}\n onClick={() => { void steerRow(row, 'now') }}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.next')} side=\"bottom\" delayMs={500} disabled={planDisabled}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierNext}`}\n aria-label={t('steer.next')}\n title={planDisabled ? t('steer.unavailable.running') : undefined}\n disabled={busy !== null || planDisabled}\n onClick={() => { void steerRow(row, 'next') }}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n <Tooltip label={t('steer.later')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierLater}`}\n aria-label={t('steer.later')}\n aria-pressed\n disabled={busy !== null || clearing}\n onClick={() => {\n // Later is the default queue state; pressing it\n // keeps the row queued (no-op by design).\n }}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n </span>\n </>\n )}\n </div>}\n </li>\n ))}\n </ul>\n {steering.length > 0 && (\n <ul className={css.steeringList} data-steering-list=\"\">\n {steering.map(row => (\n <li key={row.id} className={css.row} data-tier={badgeFor('steering') ?? undefined}>\n <span className={css.lead} aria-hidden><IconQueueOutlineMedium /></span>\n <SteerBadge tier={badgeFor('steering')} t={t} />\n <span className={css.preview}>{row.text}</span>\n <div className={css.actions}>\n <Tooltip label={t('steer.revoke')} side=\"bottom\" delayMs={500} disabled={row.text === null}>\n <button\n type=\"button\"\n className={`${css.tier} ${css.tierLater}`}\n aria-label={t('steer.revoke')}\n title={row.text === null ? t('steer.revoke.unsupported') : undefined}\n disabled={busy !== null || row.text === null || frozen}\n onClick={() => { void revokeToLater(row) }}\n >\n <span className={css.dot} aria-hidden />\n </button>\n </Tooltip>\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n )\n}\n\n/** Badge label keys per tier. */\nconst BADGE_KEYS: Record<SteerTier, string> = {\n now: 'steer.badge.now',\n next: 'steer.badge.next',\n later: 'steer.badge.later',\n}\n\n/** Badge tint classes per tier (present at bundle time; typed through the css-modules declaration). */\nconst BADGE_CLASSES: Record<SteerTier, string> = {\n now: css.badgeNow as string,\n next: css.badgeNext as string,\n later: css.badgeLater as string,\n}\n\n/** One row's tier badge: colored dot + label; context rows render nothing. */\nfunction SteerBadge({ tier, t }: { tier: SteerTier | null; t: SteerQueueDockProps['t'] }) {\n if (tier === null) return null\n return (\n <span className={`${css.badge} ${BADGE_CLASSES[tier]}`} data-badge={tier}>\n <span className={css.dot} aria-hidden />\n <span className={css.badgeLabel}>{t(BADGE_KEYS[tier])}</span>\n </span>\n )\n}\n","/**\r\n * input-traffic ↔ dsh-session-guard 透传桥(D8 fail-open)。\r\n *\r\n * input-traffic **只做冻结增强**(队列冻结/解冻),服务端会话门(暂停/恢复会话)\r\n * 归 dsh-session-guard 插件。冻结/解冻按钮触发时,尽力调用\r\n * `sessionGuard.stopNextTurn` / `resume`;**插件未装**(路由 404 / 网络失败 /\r\n * 返回错误)→ 静默跳过,**绝不报错**,前端冻结仍正常生效。\r\n *\r\n * 不吸收任何 auto-continue / 重试逻辑(重试归后端 dsh-session-guard,D9)。\r\n */\r\n\r\n/** 尽力调用 sessionGuard.stopNextTurn(停掉 session 下一回合)。失败静默。 */\r\nexport async function sessionGuardStopNextTurn(sessionId: string): Promise<boolean> {\r\n return callGuard(sessionId, 'stopNextTurn')\r\n}\r\n\r\n/** 尽力调用 sessionGuard.resume。失败静默。 */\r\nexport async function sessionGuardResume(sessionId: string): Promise<boolean> {\r\n return callGuard(sessionId, 'resume')\r\n}\r\n\r\nasync function callGuard(sessionId: string, action: string): Promise<boolean> {\r\n try {\r\n const res = await fetch('/session-guard/rpc', {\r\n method: 'POST',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ sessionId, action }),\r\n })\r\n if (!res.ok) return false\r\n const body = await res.json().catch(() => null)\r\n return body?.ok === true\r\n } catch {\r\n // 路由不存在(session-guard 未装)/ 网络失败 → fail-open。\r\n return false\r\n }\r\n}\r\n\r\n// 探测标记:session-guard 客户端据此跳过自带的回退冻结按钮(避免双按钮/占位)。\r\n// 在 bundle 顶层执行;input-traffic 桥存在即置位。\r\ndeclare global {\r\n var __DSH_SESSION_GUARD_BRIDGE__: boolean | undefined\r\n}\r\ntry {\r\n globalThis.__DSH_SESSION_GUARD_BRIDGE__ = true\r\n} catch {\r\n /* 浏览器环境无 window 时忽略 */\r\n}\r\n","/**\r\n * Session freeze/resume control, mounted in the composer's right tool row\r\n * (`conversation.input.right`) so it is reachable before anything queues.\r\n *\r\n * Peak-hour pause semantics: freeze does NOT interrupt the running turn —it\r\n * finishes naturally. The queued messages are detached (removed, preserved in\r\n * the shared store), so the driver finds no pending work and stops after the\r\n * current turn. Resume re-submits the preserved texts, waking the driver and\r\n * continuing the queue.\r\n *\r\n * dsh-session-guard 协作(D8 fail-open):\r\n * - 冻结 = 前端摘队列(本插件)+ composer block(阻止新输入漏进对话) + 尽力调服务端\r\n * sessionGuard.stopNextTurn(停掉 session 下一回合;session-guard 未装时静默跳过)。\r\n * - 解冻 = 清 composer block + **先** await sessionGuard.resume(让被打断回合的自然\r\n * 下一步先发生),**再**重投队列(later 级条目因此排在自然 next turn 之后,不再插队)。\r\n * - 本插件只做冻结增强,不承担重试/暂停决策(归后端,D9)。\r\n */\r\nimport { useSyncExternalStore } from 'react'\r\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\r\nimport { freezeStore } from './freeze-store.ts'\r\nimport type { FrozenTier } from './freeze-store.ts'\r\nimport { textOf, type SteerQueueDockInjected } from './steer-queue-dock.tsx'\r\nimport { sessionGuardResume, sessionGuardStopNextTurn } from './session-guard-bridge.ts'\r\nimport css from './freeze-button.module.css'\r\n\r\n/**\r\n * Full props of the composer-right entry.\r\n *\r\n * The slot carries no `InputZone` owner on this segment (0.1.5 keeps the\r\n * ownerless shape introduced in 0.1.2, `InputBar.tsx:466` renders `{}`); only\r\n * the session standard kit is shared, so the type declares exactly that —\r\n * reading `session`/`input` off this slot is a compile error, not a crash.\r\n */\r\nexport type FreezeButtonProps =\r\n Pick<PropsRuntime<'conversation.input.right'>, 'useProjection' | 'sessionId'>\r\n & SteerQueueDockInjected\r\n & PropsLocale<'steer'>\r\n\r\n/**\r\n * Freeze/resume toggle for the peak-hour scenario.\r\n * @param props - slot props; the session snapshot drives the detach list.\r\n */\r\nexport function FreezeButton({ useProjection, updateQueue, cancel, send, sendSteer, sessionId, setComposerBlock, notify, t }: FreezeButtonProps) {\r\n // The freeze store is keyed by session: read the owning session's snapshot.\r\n const sid = sessionId ?? ''\r\n const { frozen } = useSyncExternalStore(freezeStore.subscribe, () => freezeStore.getSnapshot(sid))\r\n const inbox = useProjection('inbox')\r\n\r\n const freeze = async (): Promise<void> => {\r\n // Detach every pending input row — queued (next-turn) and already-steered\r\n // (next-step) alike — so nothing stays in the live queue while frozen.\r\n // Steered rows keep their next intent as a safe_point plan for resume.\r\n const steeredIds = new Set((inbox?.['next-step'] ?? []).map(row => row.id))\r\n // Store order first (next-turn), then the steered band — matching the\r\n // pre-projection queue ordering the resume path replays. Wire rows carry\r\n // no `.text`; derive it from the content blocks like the dock does.\r\n const rows = [...(inbox?.['next-turn'] ?? []), ...(inbox?.['next-step'] ?? [])].map(row => ({\r\n ...row,\r\n text: textOf(row.content) ?? row.text ?? null,\r\n }))\r\n // Preserve plain-text copies; non-text rows cannot be re-sent and are\r\n // released by the freeze (documented limitation).\r\n const pending: { text: string; tier: FrozenTier }[] = rows.flatMap(row =>\r\n typeof row.text === 'string' && row.text !== '' ? [{ text: row.text, tier: steeredIds.has(row.id) ? 'safe_point' : 'queue' }] : [],\r\n )\r\n // Detach every pending row: the running turn finishes naturally, then the\r\n // driver finds no pending work and stops.\r\n await Promise.all(rows.map(row =>\r\n updateQueue(row.id, { kind: 'remove' }).catch(() => undefined),\r\n ))\r\n freezeStore.set(sid, { frozen: true, pending })\r\n // Raise the composer block: while frozen the composer is inert, so plain\r\n // Enter can never leak a new message into the conversation (busyEnter\r\n // only gates busy sessions; an idle/paused session would send directly).\r\n setComposerBlock?.(t('steer.frozenInput'))\r\n // 服务端:停掉 session 下一回合(fail-open,session-guard 未装则静默)。\r\n if (sessionId !== undefined) void sessionGuardStopNextTurn(sessionId)\r\n }\r\n\r\n const resume = async (): Promise<void> => {\r\n const pending = freezeStore.getSnapshot(sid).pending\r\n freezeStore.set(sid, { frozen: false, pending: [] })\r\n setComposerBlock?.(undefined)\r\n try {\r\n // 先恢复服务端会话:被打断回合的自然下一步(deferredTools 续跑)先发生。\r\n // 之后再重投队列 —— later 级条目经 send 进入 next-turn,排在自然 next turn\r\n // 之后;safe_point/force 仍按各自语义插队。顺序倒置会让 later 抢在自然\r\n // next turn 前被消费(idle 态 send 立即唤醒新回合)。\r\n if (sessionId !== undefined) await sessionGuardResume(sessionId)\r\n // Re-submit the preserved queue in FIFO order honoring each entry's\r\n // planned insertion tier: force (red) interrupts the current run first,\r\n // safe_point (yellow) steers into the next step, queue (green) flows\r\n // through the wake-and-continue chain.\r\n for (const entry of pending) {\r\n if (entry.tier === 'force') await cancel()\r\n if (entry.tier === 'safe_point' && sendSteer !== undefined) await sendSteer(entry.text)\r\n else await send(entry.text)\r\n }\r\n } catch {\r\n notify('error', t('steer.resumeFailed'))\r\n }\r\n }\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={css.freeze}\r\n aria-label={frozen ? t('steer.resume') : t('steer.freeze')}\r\n aria-pressed={frozen || undefined}\r\n title={frozen ? t('steer.frozen') : undefined}\r\n onClick={() => {\r\n if (frozen) void resume()\r\n else void freeze()\r\n }}\r\n >\r\n <span className={css.label}>{frozen ? t('steer.resume') : t('steer.freeze')}</span>\r\n </button>\r\n )\r\n}\r\n","/**\n * 输入流量 —— 「起子插件设置」family tab 的只读状态卡。\n *\n * 本插件是纯 client 接管型:没有自有 Config,busyEnter 在 apply 时钉死为\n * `queue`(写 ui-conversation entry),官方 General 行同时被压掉。因此这张卡\n * **只读**:展示钉死状态与使用说明,不提供任何写入口——提供 busyEnter 切换\n * 会与接管设计(apply 重新钉死)打架。\n *\n * 数据面:`configForms.get('ui-conversation')` 的快照(跨 entry 读,宿主\n * describe 镜像对该 entry 本就服务——官方 Enter 行就是它的编辑器)。\n */\nimport { createElement, useSyncExternalStore, type CSSProperties, type JSX } from 'react'\n\n/** 只读快照面(configForms 原生句柄的结构化子集)。 */\nexport interface FamilyCardScope {\n getSnapshot(): { status: string; value: { busyEnter?: string } | undefined; writable: boolean }\n subscribe(listener: () => void): () => void\n}\n\nexport interface FamilyCardProps {\n /** 活引用:≤0.1.5 settingsScope 永不 resolve 时保持 undefined(降级渲染)。 */\n scope?: FamilyCardScope\n t?: (key: string, params?: Record<string, unknown>) => string\n}\n\nconst row: CSSProperties = { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12, padding: '8px 0', fontSize: 13 }\nconst label: CSSProperties = { color: 'var(--dsw-alias-label-primary, inherit)' }\nconst dim: CSSProperties = { color: 'var(--dsw-alias-label-tertiary, rgba(127,127,127,.8))', fontSize: 12, lineHeight: 1.5 }\n\n/** 无 scope 时的降级快照(模块级常量:useSyncExternalStore 要求稳定引用)。 */\nconst DEGRADED_SNAPSHOT = { status: 'unavailable', value: undefined, writable: false }\n\nexport function InputTrafficFamilyCard({ scope, t }: FamilyCardProps): JSX.Element {\n // hooks 无条件调用(rules-of-hooks):无 scope 时订阅为 no-op、快照取模块级\n // 降级常量;scope 缺席与否在挂载期内是稳定的(双轨后 scope 恒有,本分支只\n // 是防御位),不会触发 hook 序翻转。\n const snapshot = useSyncExternalStore(\n (listener) => scope?.subscribe(listener) ?? (() => {}),\n () => scope?.getSnapshot() ?? DEGRADED_SNAPSHOT,\n )\n const tr = (key: string): string => (t ? t(key) : FALLBACK_ZH[key] ?? key)\n // scope 缺席(防御位,双轨后常态不可达)的降级态:卡仍在账本里\n // (导航/接管节可见),数据缺席呈现不可用说明而不是崩/空白。\n if (!scope) {\n return createElement('div', { style: { display: 'grid', gap: 6 } },\n createElement('p', { style: { ...dim, margin: 0 } }, `${tr('family.desc')}(当前宿主设置服务不可用 — 只读)`),\n )\n }\n const pinned = snapshot.value?.busyEnter ?? 'queue'\n return createElement('div', { style: { display: 'grid', gap: 6 } },\n createElement('div', { style: row },\n createElement('span', { style: label }, tr('family.busyEnter')),\n createElement('span', { style: dim }, `busyEnter = ${pinned}`),\n ),\n createElement('p', { style: { ...dim, margin: 0 } }, tr('family.desc')),\n )\n}\n\n/** 无 locale 服务时的中文兜底(与 zh 字典键一一对应)。 */\nconst FALLBACK_ZH: Record<string, string> = {\n 'family.busyEnter': 'busy-Enter 行为(本插件接管)',\n 'family.desc': '普通回车在繁忙时进入排队(queue),不会打断当前回答;打断请用输入区的冻结/转向按钮。该行为由本插件自动接管,无需配置。',\n}\n","/**\r\n * Busy-Enter row hiding: shadows the official `settings.general.item` entry\r\n * `composer-enter` (same cell id, priority -1) so the lower priority wins and\r\n * the official \"繁忙时 Enter 键行为\" row never renders while this plugin is\r\n * mounted.\r\n *\r\n * The behavior itself is taken over by the plugin: plain Enter stays\r\n * queue-later (green), the planning dock owns yellow/red, and the plugin apply\r\n * pins `ui-conversation.busyEnter` to `queue` so no stale preference can\r\n * leak through the hidden row.\r\n */\r\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\r\n\r\n/** Full props of a settings-row entry (unused: the row renders nothing). */\r\nexport type HideEnterRowProps = PropsRuntime<'settings.general.item'> & PropsLocale<'steer'>\r\n\r\n/** Render nothing: the official busy-Enter row is hidden while mounted. */\r\nexport function HideEnterRow(_props: HideEnterRowProps): null {\r\n return null\r\n}\r\n","/**\n * BridgeDocHandle — T20-b port from dsh-perm-gate (bridge-scope.ts, the\n * client half of the settings bridge).\n *\n * Shape-compatible with the native durable-settings handle (configForms.get /\n * settingsScope.bind subset): getSnapshot/subscribe/set. Reads POST\n * /api/<ns>/settings/describe, writes POST …/mutate (ops forwarded to the\n * host settings service); a successful write re-describes and refreshes the\n * snapshot (optimistic refresh, no local second copy of state — the service\n * stays authoritative). The initial describe fetch starts at construction;\n * the snapshot is `pending` until it lands, and the family card renders its\n * pinned default meanwhile.\n *\n * The route derivation must stay character-identical to the server side\n * (src/bridge.ts bridgeRoutesFor); the client tsconfig only includes\n * src/client, so this half holds its own copy and the parity test pins both.\n */\nimport type { SettingsDocHandle } from './compat.js'\n\n/** Must match src/bridge.ts bridgeRoutesFor character for character. */\nfunction bridgeRoutesFor(ns: string): { describe: string; mutate: string } {\n return { describe: `/api/${ns}/settings/describe`, mutate: `/api/${ns}/settings/mutate` }\n}\n\n/** The native handle's snapshot shape — the bridge payload cast at the boundary. */\ntype DocSnapshot = ReturnType<SettingsDocHandle['getSnapshot']>\n\ninterface Snapshot { status: string; value: unknown; writable: boolean }\ninterface Descriptor { value?: unknown; revision?: number }\ninterface BridgeBody { ok?: boolean; code?: string; message?: string; value?: { descriptor?: Descriptor; writable?: boolean } }\n\nexport class BridgeDocHandle implements SettingsDocHandle {\n private snapshot: Snapshot = { status: 'pending', value: undefined, writable: true }\n private listeners = new Set<() => void>()\n private revision: number | undefined\n private inflight: Promise<void> | undefined\n private readonly routes: { describe: string; mutate: string }\n\n constructor(ns: string) {\n this.routes = bridgeRoutesFor(ns)\n void this.refresh()\n }\n\n /** The bridge transport is shape-agnostic; the ns payload narrows at this boundary. */\n getSnapshot(): DocSnapshot {\n return this.snapshot as DocSnapshot\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener)\n return () => { this.listeners.delete(listener) }\n }\n\n async set(field: string, value: unknown): Promise<void> {\n await this.mutate([{ op: 'set', path: [field], value }])\n }\n\n private notify(): void {\n for (const l of [...this.listeners]) l()\n }\n\n private async request(path: string, body?: unknown): Promise<BridgeBody> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body ?? {}),\n })\n if (!response.ok) throw new Error(`bridge ${path} HTTP ${response.status}`)\n return await response.json() as BridgeBody\n }\n\n private async refresh(): Promise<void> {\n if (this.inflight !== undefined) return this.inflight\n this.inflight = (async () => {\n try {\n const body = await this.request(this.routes.describe)\n if (body.ok && body.value?.descriptor !== undefined) {\n const d = body.value.descriptor\n this.revision = typeof d.revision === 'number' ? d.revision : undefined\n this.snapshot = { status: 'ready', value: d.value, writable: body.value.writable !== false }\n } else {\n this.snapshot = { status: 'error', value: undefined, writable: false }\n }\n } catch {\n this.snapshot = { status: 'error', value: undefined, writable: false }\n } finally {\n this.inflight = undefined\n }\n this.notify()\n })()\n return this.inflight\n }\n\n private async mutate(ops: Array<{ op: string; path: string[]; value?: unknown }>): Promise<void> {\n const body = await this.request(this.routes.mutate, { ops, expectedRevision: this.revision })\n if (body.ok && body.value?.descriptor !== undefined) {\n const d = body.value.descriptor\n this.revision = typeof d.revision === 'number' ? d.revision : undefined\n this.snapshot = { status: 'ready', value: d.value, writable: this.snapshot.writable }\n } else if (body.code === 'settings-conflict') {\n await this.refresh() // optimistic concurrency lost: pull the authoritative value so the next write carries a fresh revision\n } else {\n throw new Error(`bridge mutate failed: ${body.code ?? 'unknown'} ${body.message ?? ''}`)\n }\n this.notify()\n }\n}\n","/**\n * compat.ts —— 版本敏感代码的**唯一窄腰**(INDEX §C:版本差异代码只许出现在\n * 窄腰文件,能力探测优先,禁止读宿主版本号)。\n *\n * 本插件已核实的两处分叉(findings §1.1 #5 / 迁移执行期补勘):\n * 1. 持久化设置面:0.1.7+ 走 `configForms.get(ns)`;≤0.1.5 走\n * `settingsScope.bind({ namespace })`。0.1.7-rc.1 的 client-ui-settings 包\n * 已不含 `settingsScope` 字样(2026-10-04 node_modules 全文核查)——两服务\n * 按代互斥,双 scoped-inject 天然不会双触发。\n * 2. 草稿回填:≤0.1.5 在 `input.for(actx).actions.setDraft`,0.1.7+ 直挂\n * `.setDraft`(compat/0.1.5:src/client/index.ts vs 本分支同文件)。\n *\n * 缺席服务上的 scoped-inject fiber 永久 PENDING:与 `dsh-family.tab` 在持有者\n * (跨插件族,非宿主本体)缺席时的惰性等待同型,不阻塞插件其余半区——\n * 插件级 inject 清单因此**只含六线通用服务**,防整插件 PENDING 静默失活。\n *\n * All @deepseek-ai/* imports are type-only (client bundle purity).\n */\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\n\n/**\n * Structural minimum of a durable settings document handle — shared by\n * `configForms.get()` (0.1.7+) and `settingsScope.bind()` (≤0.1.5). Declared\n * locally (NOT as ambient augmentation of `@deepseek-ai/dsh-client-ui-settings/client`)\n * so the compile face stays identical against every host line's real types.\n */\nexport interface SettingsDocHandle {\n getSnapshot(): { status: string; value: { busyEnter?: string } | undefined; writable: boolean }\n subscribe(listener: () => void): () => void\n set(field: string, value: unknown): Promise<void>\n}\n\n/** Anything registerSettingsFaces needs beyond the pin itself. */\nexport interface SettingsFacesDeps {\n /** Durable namespace holding the pinned field (`ui-conversation`). */\n namespace: string\n /** Field to pin (busy-Enter takeover). */\n field: string\n /** Value to pin. */\n value: unknown\n /** Called once a settings face resolves; receives the scope handle (the\n * family tab card reads it). Never called on hosts with neither service. */\n onScope: (scope: SettingsDocHandle) => void\n}\n\n/**\n * Pin the busy-Enter field through whichever durable-settings service this\n * host line carries, then hand the resolved scope to `onScope`.\n *\n * Both variants are scoped sub-injects: on a host without the service the\n * fiber waits forever WITHOUT blocking the plugin's other faces (same posture\n * as the family tab's slot-inject when the family holder is absent).\n */\nexport function registerSettingsFaces(ctx: ClientContext, deps: SettingsFacesDeps): void {\n // cordis inject 回调收到的是 (ctx, config)——服务要按名从 scope 对象上读\n // (thinking-levels 腰的同款形态;0.7.1 曾把参数当裸服务 .get/.bind 调用,\n // 每一代宿主上都是 TypeError,纤维暗死 → onScope 永不回调 → 卡永远降级)。\n const scopeInject = (ctx as unknown as {\n inject: (deps: string[], cb: (scope: Record<string, unknown>) => void) => void\n }).inject\n // Modern hosts (0.1.7+): configForms owns cross-entry durable writes.\n scopeInject(['configForms'], (scope) => {\n const forms = scope.configForms as { get(namespace: string): SettingsDocHandle } | undefined\n if (forms === undefined) return\n const handle = forms.get(deps.namespace)\n void handle.set(deps.field, deps.value)\n deps.onScope(handle)\n })\n // Old hosts (≤0.1.5): namespaced durable scope via bind().\n scopeInject(['settingsScope'], (scope) => {\n const settingsScope = scope.settingsScope as\n | { bind(spec: { namespace: string }): SettingsDocHandle }\n | undefined\n if (settingsScope === undefined) return\n const handle = settingsScope.bind({ namespace: deps.namespace })\n void handle.set(deps.field, deps.value)\n deps.onScope(handle)\n })\n}\n\n/**\n * Draft back-fill normalized across host lines: prefers the direct\n * `.setDraft` (0.1.7+), falls back to the `.actions` parking spot (≤0.1.5).\n * Pure shape probing on the conversation row object — no version reads.\n */\nexport function draftWriter(\n conversation: { input: { for(actx: unknown): unknown } },\n actx: unknown,\n): (text: string) => void {\n return (text: string) => {\n const row = conversation.input.for(actx) as {\n setDraft?(text: string): void\n actions?: { setDraft(text: string): void }\n }\n if (typeof row.setDraft === 'function') row.setDraft(text)\n else row.actions?.setDraft(text)\n }\n}\n","/**\n * dsh-input-traffic —browser half.\n *\n * The whole takeover lives here:\n * 1. registers the `steer` dictionaries;\n * 2. pins `ui-conversation.busyEnter` to `queue` (plain Enter = green later)\n * so the hidden official row cannot leak a stale queue/steer preference;\n * 3. shadows the official queue dock (`conversation.input.dock` cell id\n * `queue`, priority -1) with the three-tier planning strip;\n * 4. shadows the official busy-Enter settings row (`settings.general.item`\n * cell id `composer-enter`, priority -1) with a null render.\n *\n * ORDERING (why the dock registers at QUEUE_DOCK_ORDER instead of the\n * official dock's 20): a list slot's DISPLAY position is decided by `order`\n * alone — `ui-renderer/src/client/scoped-slots.tsx` maps the shadowing\n * winners to rows and then sorts them by `order` — while `priority` only\n * decides which entry wins a shared cell id. Keeping the official 20\n * therefore left the strip above any later contributor (dsh-perm-gate's\n * notice registers order 30), which pushed that notice between the queue\n * strip and the composer card. A deliberately high order keeps the strip\n * adjacent to the card; priority stays -1 so the cell takeover still holds.\n * Known `conversation.input.dock` contributors (tarball-verified across every\n * released host 0.1.5-rc.1 → 0.2.0-rc.2; the official registration never\n * changed): official `queue` 20, `todo` 0, `dsh-perm-gate.notice` 30,\n * `dsh-brief-sidebar` shadows the `todo` cell (priority -1),\n * `dsh-tidy-display-entry` 0 (order omitted). No host version ever registered\n * a `goal` entry here — earlier comments citing one were wrong. Adjacent\n * slots (`conversation.composer.dock`, `conversation.input.left`) are\n * separate bands — a third party registering a larger `order` inside THIS\n * slot could still land below us.\n *\n * All @deepseek-ai/* imports are type-only: collaboration happens through\n * cordis services and slot registration only (client bundle purity).\n */\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { NS, dictionaries } from './locales.ts'\nimport { SteerQueueDock } from './steer-queue-dock.tsx'\nimport type { SteerQueueDockInjected } from './steer-queue-dock.tsx'\nimport { FreezeButton } from './freeze-button.tsx'\nimport { InputTrafficFamilyCard } from './family-card.tsx'\nimport { HideEnterRow } from './hide-enter-row.tsx'\nimport { BridgeDocHandle } from './bridge-scope.ts'\nimport { draftWriter, registerSettingsFaces, type SettingsDocHandle } from './compat.ts'\n\n/** Durable conversation settings namespace owned by ui-conversation. */\nconst CONVERSATION_SETTINGS_NAMESPACE = 'ui-conversation'\n\n/** Busy-Enter field inside that namespace; the plugin pins it to queue. */\nconst BUSY_ENTER_FIELD = 'busyEnter'\n\n/**\n * Display order of the queue strip inside `conversation.input.dock`.\n *\n * List rows render sorted by `order` ascending, so a value above every other\n * contributor keeps the strip as the bottom-most entry of the band — directly\n * on top of the composer card. Known contributors (stable across hosts\n * 0.1.5-rc.1 → 0.2.0-rc.2): `todo` 0, official `queue` 20,\n * `dsh-perm-gate.notice` 30, `dsh-tidy-display-entry` 0. DSH has no \"last\"\n * slot semantics, so this is a convention, not a\n * structural guarantee: a third party registering a larger value could still\n * land below us.\n */\nexport const QUEUE_DOCK_ORDER = 1000\n\n/**\n * Deliver one plain-text message into the session's next step. The exposed\n * conversation `send` verb only queues into the next turn, so resume steers\n * through the session face's steer-mode prompt instead (no harness change).\n * @param ctx - root context (resolves the session face behind the scope).\n * @param actx - agent-scoped context of the owning session.\n * @param text - message text to deliver.\n */\nfunction steerPrompt(actx: ClientContext, text: string): Promise<void> {\n // steer-mode prompt 面在本版(main@0.2.8)契约中未声明;resume 落到 conversation.send\n // (排队到下一轮)交付 safe_point 文本,与 feature 分支语义对齐但取当前可用 API。\n const conversation = actx.get('conversation')\n if (conversation === undefined) return Promise.reject(new Error('steer resume: conversation service unavailable'))\n return conversation.send(text)\n}\n\n/**\n * Services required by the browser half. Only the six-line-universal faces\n * live here — the durable-settings face (`configForms` on 0.1.7+,\n * `settingsScope` on ≤0.1.5) is resolved by scoped sub-injects inside the\n * compat waist, because a plugin-level inject of a per-line service would\n * leave the WHOLE fiber PENDING on the other line (silent total deactivation).\n */\nexport const inject = ['slots', 'locale', 'sessions', 'conversation']\n\n/**\n * Client plugin body: dictionaries, busy-Enter pinning, and the two slot\n * shadowings.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, dictionaries), 'dsh-input-traffic: dictionaries')\n // Family-tab label translator, captured EAGERLY: the family holder evaluates\n // `label()` during its own render; a lazy ctx.locale access inside the thunk\n // is a cross-context accessor call and can throw there (killing the whole\n // tab ledger projection). bind() returns a live binder, locale switches are\n // still followed.\n const tFamily = ctx.locale.bind(NS)\n\n // Take over the busy-Enter behavior: plain Enter stays queue-later while\n // the official row is hidden. Pinning here also repairs a persisted `steer`\n // preference that would otherwise keep working invisibly behind the hidden\n // row. Best-effort: a memory-mode host simply accepts it locally.\n // The durable-settings service is per-line (configForms 0.1.7+ /\n // settingsScope ≤0.1.5) — the compat waist resolves it and the family tab\n // registers against whichever scope resolves.\n // 2026-10-07 修复(0.1.5 家族节空白根因,perm-gate ea18a6a 同款):≤0.1.5 上\n // settingsScope 子注入永不 resolve → onScope 永不回调 → 原先关在回调里的\n // family.tab 注册从未执行 → 接管/托管节账本为空 → 节内容空白。注册是金贵的:\n // 提到 apply 顶层无条件执行,scope 改活引用(回调解到就填,卡 inject 现读),\n // 未解析时卡自身呈现不可用态而不是整卡缺席。\n const familyScopeRef: { scope?: SettingsDocHandle } = {}\n // T20-b 桥轨(perm-gate T13b 双轨同架构):≤0.1.5 上 settingsScope 子注入\n // 永不 resolve(A2 死路),原生句柄缺席时卡片数据与 busyEnter 钉值走自家\n // webServer 桥(node 半区挂 describe/mutate 路由对;0.1.0 宿主 settings\n // 服务实测全款具备该面)。原生句柄优先——configForms 臂解到就改走原生,\n // 桥只在原生缺席时供数;桥 pending 期间快照 value 为 undefined,卡按钉死\n // 默认值渲染,首拉落地后订阅通知刷新。\n const bridgeScope = new BridgeDocHandle(CONVERSATION_SETTINGS_NAMESPACE)\n let nativeScopeResolved = false\n let bridgePinned = false\n bridgeScope.subscribe(() => {\n if (bridgePinned || nativeScopeResolved) return\n if (bridgeScope.getSnapshot().status !== 'ready') return\n // Pin through the bridge once, only when the native arm never resolved\n // (≤0.1.5): same semantics as the configForms arm's startup pin. Worst\n // race (both arms ready simultaneously) writes the same value twice —\n // idempotent, and the host serializes writers.\n bridgePinned = true\n void bridgeScope.set(BUSY_ENTER_FIELD, 'queue').catch((e: unknown) => {\n console.warn('[dsh-input-traffic] bridge busyEnter pin failed:', e)\n })\n })\n ctx.slots.inject('dsh-family.tab', () => ctx.slots.register({\n name: 'dsh-family.tab',\n id: 'input-traffic',\n order: 50,\n label: () => tFamily('family.title'),\n locale: NS,\n inject: () => ({ scope: familyScopeRef.scope ?? bridgeScope }),\n }, InputTrafficFamilyCard))\n registerSettingsFaces(ctx, {\n namespace: CONVERSATION_SETTINGS_NAMESPACE,\n field: BUSY_ENTER_FIELD,\n value: 'queue',\n onScope: (scope) => {\n familyScopeRef.scope = scope\n nativeScopeResolved = true\n },\n })\n\n // Shadow the official queue dock with the three-tier planning strip. The\n // high `order` keeps it the bottom-most entry of the band (see the file\n // header); `priority: -1` is what wins the official `queue` cell.\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({\n name: 'conversation.input.dock',\n id: 'queue',\n order: QUEUE_DOCK_ORDER,\n priority: -1,\n locale: NS,\n inject: (sessionId: SessionId): SteerQueueDockInjected => {\n const actx = ctx.sessions.scope(sessionId)\n if (actx === undefined) throw new Error(`steer dock: session \"${sessionId}\" resolved no scope`)\n const conversation = actx.get('conversation')\n if (conversation === undefined) throw new Error('steer dock: conversation service unavailable')\n return {\n updateQueue: (itemId, action) => conversation.updateQueue(itemId as never, action),\n cancel: () => conversation.cancel(),\n send: (text) => conversation.send(text),\n setDraft: draftWriter(conversation, actx),\n notify: (level, text) => { conversation.input.for(actx).notify(level, text) },\n }\n },\n }, SteerQueueDock))\n\n // Composer-right freeze/resume control (reachable before anything queues).\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'steer-freeze',\n order: 30,\n locale: NS,\n inject: (sessionId: SessionId): SteerQueueDockInjected => {\n const actx = ctx.sessions.scope(sessionId)\n if (actx === undefined) throw new Error(`steer freeze: session \"${sessionId}\" resolved no scope`)\n const conversation = actx.get('conversation')\n if (conversation === undefined) throw new Error('steer freeze: conversation service unavailable')\n return {\n updateQueue: (itemId, action) => conversation.updateQueue(itemId as never, action),\n cancel: () => conversation.cancel(),\n send: (text) => conversation.send(text),\n // safe_point 恢复经 conversation.send 排队到下一轮(本版契约无 steer prompt 面)。\n sendSteer: (text) => steerPrompt(actx, text),\n sessionId: String(sessionId),\n setDraft: draftWriter(conversation, actx),\n notify: (level, text) => { conversation.input.for(actx).notify(level, text) },\n // 冻结期间 raise composer block:composer 变 inert(回车/发送按钮全部失效),\n // 输入不会漏进对话;恢复时清除。block 不锁 input.right(恢复按钮仍可点)。\n setComposerBlock: (reason) => {\n conversation.blocks.set(sessionId, reason === undefined ? undefined : { reason })\n },\n }\n },\n }, FreezeButton))\n\n // Hide the official busy-Enter settings row (null render wins the cell).\n ctx.slots.inject('settings.general.item', () => ctx.slots.register({\n name: 'settings.general.item',\n id: 'composer-enter',\n order: 20,\n priority: -1,\n locale: NS,\n }, HideEnterRow))\n}\n"],"mappings":"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"}